diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 1bacdd97fa4..35c816d2bc4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -4,13 +4,10 @@ import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.api.item.MetaMachineItem; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; -import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; @@ -56,7 +53,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; @@ -223,12 +219,11 @@ public BlockState rotate(BlockState pState, Rotation pRotation) { @Override public List getDrops(BlockState state, LootParams.Builder builder) { - BlockEntity tileEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); var drops = super.getDrops(state, builder); - if (tileEntity instanceof MetaMachine machine) { - if (machine instanceof IMachineModifyDrops machineModifyDrops) { - machineModifyDrops.onDrops(drops); - } + + BlockEntity be = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (be instanceof MetaMachine machine) { + machine.modifyDrops(drops); if (machine instanceof IDropSaveMachine dropSaveMachine && dropSaveMachine.saveBreak()) { for (ItemStack drop : drops) { if (drop.getItem() instanceof MetaMachineItem item && item.getBlock() == this) { @@ -248,7 +243,7 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState if (!pState.is(pNewState.getBlock())) { // new block MetaMachine machine = MetaMachine.getMachine(pLevel, pPos); if (machine != null) { - machine.onRemoved(); + machine.onMachineDestroyed(); } pLevel.updateNeighbourForOutputSignal(pPos, this); @@ -278,18 +273,8 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player machine.setOwnerUUID(sPlayer.getUUID()); } - Set types = ToolHelper.getToolTypes(itemStack); - if (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown()) { - var result = machine.onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); - if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { - ToolHelper.playToolSound(result.getFirst(), serverPlayer); - - if (!serverPlayer.isCreative()) { - ToolHelper.damageItem(itemStack, serverPlayer, 1); - } - } - if (result.getSecond() != InteractionResult.PASS) return result.getSecond(); - } + InteractionResult machineInteractResult = machine.onUse(state, world, pos, player, hand, hit); + if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; if (itemStack.is(GTItems.PORTABLE_SCANNER.get())) { return itemStack.getItem().use(world, player, hand).getResult(); @@ -299,17 +284,6 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } - for (var trait : machine.getTraitHolder().getAllTraits()) { - if (trait instanceof IInteractionTrait interactionTrait) { - InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); - if (result != InteractionResult.PASS) return result; - } - } - - if (machine instanceof IInteractedMachine interactedMachine) { - var result = interactedMachine.onUse(state, world, pos, player, hand, hit); - if (result != InteractionResult.PASS) return result; - } if (shouldOpenUi && machine instanceof IUIMachine uiMachine && MachineOwner.canOpenOwnerMachine(player, machine)) { return uiMachine.tryToOpenUI(player, hand, hit); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComponentHatch.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComponentHatch.java deleted file mode 100644 index dd2cbadfd94..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComponentHatch.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; - -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -public interface IHPCAComponentHatch { - - BooleanProperty HPCA_PART_DAMAGED_PROPERTY = GTMachineModelProperties.IS_HPCA_PART_DAMAGED; - - /** - * How much EU/t this component needs for the multi to just be idle. - * Used in 2 ways: - * - "Non-computational" units like HPCA Bridge, Active Cooler - * - "Computational base cost" for units like HPCA Computation, High Computation - */ - int getUpkeepEUt(); - - /** - * How much EU/t this component can use, if it is being utilized fully. - * Used to scale cost for "computational" units. Power draw is a range - * created by actual computation used vs maximum potential computation. - */ - default int getMaxEUt() { - return getUpkeepEUt(); - } - - /** - * If this component can be damaged by HPCA overheat. - */ - boolean canBeDamaged(); - - /** - * If this component is currently damaged by HPCA overheat. - */ - default boolean isDamaged() { - return false; - } - - /** - * Set this component as damaged (or undamaged). - */ - default void setDamaged(boolean damaged) {} - - /** - * If this component allows for bridging HPCAs to Network Switches. - */ - boolean isBridge(); - - /** - * The icon for this component in the HPCA's UI. Should be a 13x13 px sprite. - */ - ResourceTexture getComponentIcon(); - - /** - * Sets the component to be active for the sake of model overlays. - */ - void setActive(boolean active); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComputationProvider.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComputationProvider.java deleted file mode 100644 index 615dde99b6c..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCAComputationProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -public interface IHPCAComputationProvider extends IHPCAComponentHatch { - - /** - * How much CWU/t this component can make, if it is being utilized fully. - */ - int getCWUPerTick(); - - /** - * How much coolant/t this component needs when running at max CWU/t. - */ - int getCoolingPerTick(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCACoolantProvider.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCACoolantProvider.java deleted file mode 100644 index d9afb8b48a3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IHPCACoolantProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -public interface IHPCACoolantProvider extends IHPCAComponentHatch { - - /** - * How much this part cools down the HPCA per tick. - */ - int getCoolingAmount(); - - /** - * Whether this HPCA Coolant Provider is active (requires coolant) or passive (free). - */ - boolean isActiveCooler(); - - /** - * How much coolant to use while HPCA is running. - * Actual amount used will depend on how much of this cooler is actually being utilized - * by Computation providers. - * - * @return The amount of coolant to use per tick, in mB/t - */ - default int getMaxCoolantPerTick() { - return 0; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java index 0b08daa6aa0..df87274cbf8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java @@ -1,18 +1,8 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; -public interface IMiner extends IRecipeLogicMachine, IMachineLife { - - @Override - MinerLogic getRecipeLogic(); - - @Override - default void onMachineRemoved() { - getRecipeLogic().onRemove(); - } +public interface IMiner extends IRecipeLogicMachine { boolean drainInput(boolean simulate); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java index 01b6204239c..d811ff8d622 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java @@ -5,8 +5,6 @@ import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.item.MetaMachineItem; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -74,22 +72,6 @@ public class MachineDefinition implements Supplier { @Getter @Setter private boolean alwaysTryModifyRecipe; - @NotNull - @Getter - @Setter - private BiPredicate beforeWorking = (machine, recipe) -> true; - @NotNull - @Getter - @Setter - private Predicate onWorking = (machine) -> true; - @NotNull - @Getter - @Setter - private Consumer onWaiting = (machine) -> {}; - @NotNull - @Getter - @Setter - private Consumer afterWorking = (machine) -> {}; @Getter @Setter private boolean regressWhenWaiting = true; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 48cd480efab..8ea297b9967 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -17,6 +17,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -51,7 +52,6 @@ import com.lowdragmc.lowdraglib.utils.DummyWorld; import net.minecraft.ChatFormatting; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.resources.model.BakedModel; @@ -100,10 +100,6 @@ import java.util.function.Consumer; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, IFancyTooltip, IPaintable, IMachineFeature, ICopyable { @@ -157,26 +153,6 @@ public MetaMachine(BlockEntityCreationInfo info) { // ***** Machine Lifecycle ******// ////////////////////////////////////// - public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { - if (player instanceof ServerPlayer sPlayer) { - ownerUUID = sPlayer.getUUID(); - } - - if (this instanceof IDropSaveMachine dropSaveMachine) { - CompoundTag tag = stack.getTag(); - if (tag != null) { - dropSaveMachine.loadFromItem(tag); - } - } - } - - public void onRemoved() { - for (Direction direction : GTUtil.DIRECTIONS) { - getCoverContainer().removeCover(direction, null); - } - if (this instanceof IMachineLife l) l.onMachineRemoved(); - } - @Override public void load(CompoundTag tag) { TagCompatibilityFixer.fixMachineAutoOutputTag(tag); @@ -196,14 +172,6 @@ public void onLoad() { } } - public void setRenderState(MachineRenderState renderState) { - this.renderState = renderState; - if (level != null && !level.isClientSide) { - syncDataHolder.markClientSyncFieldDirty("renderState"); - } - scheduleRenderUpdate(); - } - @Override public final void setRemoved() { super.setRemoved(); @@ -220,6 +188,27 @@ public void onUnload() { serverTicks.clear(); } + public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { + if (player instanceof ServerPlayer sPlayer) { + ownerUUID = sPlayer.getUUID(); + } + + if (this instanceof IDropSaveMachine dropSaveMachine) { + CompoundTag tag = stack.getTag(); + if (tag != null) { + dropSaveMachine.loadFromItem(tag); + } + } + } + + public void onMachineDestroyed() { + for (Direction direction : GTUtil.DIRECTIONS) { + getCoverContainer().removeCover(direction, null); + } + } + + public void modifyDrops(List drops) {} + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -288,7 +277,7 @@ private void executeTick() { ////////////////////////////////////// /** - * Called when a player clicks this meta tile entity with a tool + * Called when a player clicks this machine with a tool * * @return SUCCESS / CONSUME (will damage tool) / FAIL if something happened, so tools will get damaged and * animations will be played @@ -402,6 +391,36 @@ protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand return InteractionResult.PASS; } + /** + * Called when a machine is clicked. + */ + public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + ItemStack itemStack = player.getItemInHand(hand); + + Set types = ToolHelper.getToolTypes(itemStack); + if (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown()) { + var result = onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); + if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { + ToolHelper.playToolSound(result.getFirst(), serverPlayer); + + if (!serverPlayer.isCreative()) { + ToolHelper.damageItem(itemStack, serverPlayer, 1); + } + } + if (result.getSecond() != InteractionResult.PASS) return result.getSecond(); + } + + for (var trait : getTraitHolder().getAllTraits()) { + if (trait instanceof IInteractionTrait interactionTrait) { + InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); + if (result != InteractionResult.PASS) return result; + } + } + + return InteractionResult.PASS; + } + ////////////////////////////////////// // ********** MISC ***********// ////////////////////////////////////// @@ -440,6 +459,14 @@ public boolean triggerEvent(int id, int para) { return false; } + public void setRenderState(MachineRenderState renderState) { + this.renderState = renderState; + if (level != null && !level.isClientSide) { + syncDataHolder.markClientSyncFieldDirty("renderState"); + } + scheduleRenderUpdate(); + } + public void setPaintingColor(int color) { if (color == this.paintingColor) return; @@ -455,16 +482,6 @@ public void setPaintingColor(int color) { public void onPaintingColorChanged(int color) {} - public void clearInventory(IItemHandlerModifiable inventory) { - for (int i = 0; i < inventory.getSlots(); i++) { - ItemStack stackInSlot = inventory.getStackInSlot(i); - if (!stackInSlot.isEmpty()) { - inventory.setStackInSlot(i, ItemStack.EMPTY); - Block.popResource(getLevel(), getBlockPos(), stackInSlot); - } - } - } - @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java index 3118841420b..1e23a3f118b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -23,7 +23,6 @@ import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Tables; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -33,10 +32,6 @@ import java.util.LinkedHashMap; import java.util.function.BiFunction; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SimpleGeneratorMachine extends WorkableTieredMachine implements IFancyUIMachine, IEnvironmentalHazardEmitter { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index ef966694592..e2e3a655937 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -40,7 +40,6 @@ import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Tables; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -48,13 +47,9 @@ import java.util.*; import java.util.function.*; -import javax.annotation.ParametersAreNonnullByDefault; - /** * All simple single machines are implemented here. */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SimpleTieredMachine extends WorkableTieredMachine implements IFancyUIMachine, IHasCircuitSlot { @@ -133,11 +128,11 @@ protected void chargeBattery() { // ********** MISC ***********// ////////////////////////////////////// @Override - public void onMachineRemoved() { - super.onMachineRemoved(); - clearInventory(chargerInventory); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index a2f6f081a82..ba824ca3fd4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -4,37 +4,36 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.ExplodableMachineTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.util.Mth; -import java.util.function.Function; +import lombok.Getter; -import javax.annotation.ParametersAreNonnullByDefault; +import java.util.function.Function; -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class TieredEnergyMachine extends TieredMachine implements ITieredMachine, IExplosionMachine { +public class TieredEnergyMachine extends TieredMachine implements ITieredMachine { @SaveField @SyncToClient public final NotifiableEnergyContainer energyContainer; - protected TickableSubscription explosionSub; + @Getter + protected final ExplodableMachineTrait explodableMachineTrait; public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, Function energyContainerSupplier) { super(info, tier); energyContainer = energyContainerSupplier.apply(this); + explodableMachineTrait = new ExplodableMachineTrait(this, tier, tier * 10, + () -> energyContainer.getEnergyStored() > 0); } public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { @@ -48,6 +47,8 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { energyContainer = NotifiableEnergyContainer.receiverContainer(this, tierVoltage * 64L, tierVoltage, getMaxInputOutputAmperage()); } + explodableMachineTrait = new ExplodableMachineTrait(this, tier, tier * 10, + () -> energyContainer.getEnergyStored() > 0); } ////////////////////////////////////// @@ -57,29 +58,11 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { @Override public void onLoad() { super.onLoad(); - if (!isRemote() && ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion && - shouldWeatherOrTerrainExplosion()) { - explosionSub = subscribeServerTick(this::checkExplosion); - checkExplosion(); - } } @Override public void onUnload() { super.onUnload(); - if (explosionSub != null) { - explosionSub.unsubscribe(); - explosionSub = null; - } - } - - ////////////////////////////////////// - // ******** Explosion ********// - ////////////////////////////////////// - protected void checkExplosion() { - if (energyContainer.getEnergyStored() > 0) { - checkWeatherOrTerrainExplosion(tier, tier * 10); - } } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index ac5eb261ff0..ed3e732e423 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ISubscription; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import lombok.Setter; @@ -22,12 +21,8 @@ import java.util.*; import java.util.function.Function; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public abstract class WorkableTieredMachine extends TieredEnergyMachine implements IRecipeLogicMachine, - IMachineLife, IMufflableMachine, IOverclockMachine { + IMufflableMachine, IOverclockMachine { @Getter @SaveField @@ -144,9 +139,10 @@ public void onUnload() { ////////////////////////////////////// @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } public void setMuffled(boolean muffled) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java deleted file mode 100644 index 44f35b1e1c3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IExplosionMachine.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTUtil; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; - -/** - * A machine which may cause explosion. e.g. whether, water around - */ -public interface IExplosionMachine extends IMachineFeature { - - /** - * should be called per tick. - * - * @param explosionPower explosion level - * @param additionalFireChance fire chance - */ - default void checkWeatherOrTerrainExplosion(float explosionPower, double additionalFireChance) { - if (!shouldWeatherOrTerrainExplosion()) return; - var machine = self(); - var level = machine.getLevel(); - var pos = machine.getBlockPos(); - if (GTValues.RNG.nextInt(1000) == 0) { - for (Direction side : GTUtil.DIRECTIONS) { - var fluidState = level.getBlockState(pos.relative(side)).getFluidState(); - if (!fluidState.isEmpty()) { - doExplosion(explosionPower); - return; - } - } - } - if (GTValues.RNG.nextInt(1000) == 0) { - if (level.isRainingAt(pos) || level.isRainingAt(pos.east()) || level.isRainingAt(pos.west()) || - level.isRainingAt(pos.north()) || level.isRainingAt(pos.south())) { - if (level.isThundering() && GTValues.RNG.nextInt(3) == 0) { - doExplosion(explosionPower); - } else if (GTValues.RNG.nextInt(10) == 0) { - doExplosion(explosionPower); - } else setOnFire(additionalFireChance); - } - } - } - - default void doExplosion(float explosionPower) { - doExplosion(self().getBlockPos(), explosionPower); - } - - default void doExplosion(BlockPos pos, float explosionPower) { - var machine = self(); - var level = machine.getLevel(); - level.removeBlock(pos, false); - level.explode(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - explosionPower, ConfigHolder.INSTANCE.machines.doesExplosionDamagesTerrain ? - Level.ExplosionInteraction.BLOCK : Level.ExplosionInteraction.NONE); - } - - default void setOnFire(double additionalFireChance) { - var machine = self(); - var level = machine.getLevel(); - var pos = machine.getBlockPos(); - boolean isFirstFireSpawned = false; - for (Direction side : GTUtil.DIRECTIONS) { - if (level.isEmptyBlock(pos.relative(side))) { - if (!isFirstFireSpawned) { - level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); - if (!level.isEmptyBlock(pos.relative(side))) { - isFirstFireSpawned = true; - } - } else if (additionalFireChance >= GTValues.RNG.nextDouble() * 100) { - level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); - } - } - } - } - - default boolean shouldWeatherOrTerrainExplosion() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IInteractedMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IInteractedMachine.java deleted file mode 100644 index ca28205513d..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IInteractedMachine.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; - -/** - * A machine which hooks right click events. - */ -public interface IInteractedMachine extends IMachineFeature { - - /** - * Basically a hook from block - * {@link net.minecraft.world.level.block.state.BlockBehaviour#use(BlockState, Level, BlockPos, Player, InteractionHand, BlockHitResult)} - *
- * Right-Click - */ - default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - return InteractionResult.PASS; - } - - /** - * Left-Click - * - * @return cancel (true) / keep (false) further processing - */ - default boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, Direction direction) { - return false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java deleted file mode 100644 index b41e7044297..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import org.jetbrains.annotations.Nullable; - -public interface IMachineLife extends IMachineFeature { - - /** - * Called when machine removed. {@link MetaMachineBlock#onRemove(BlockState, Level, BlockPos, BlockState, boolean)} - * Only if block has changed will it be called. Ignore State changes. - */ - default void onMachineRemoved() {} - - /** - * Called when machine placed by (if exist) an entity with item. - * it won't be called when machine added by {@link Level#setBlock(BlockPos, BlockState, int, int)} - */ - default void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java deleted file mode 100644 index e7b57207514..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.world.item.ItemStack; - -import java.util.List; - -public interface IMachineModifyDrops extends IMachineFeature { - - /** - * Modify or append drops. - * - * @param drops existing drops. - */ - void onDrops(List drops); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java index dc42605e28d..d72cd7c1d2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java @@ -77,29 +77,25 @@ default boolean isRecipeLogicAvailable() { * Called in {@link RecipeLogic#setupRecipe(GTRecipe)} ()} */ default boolean beforeWorking(@Nullable GTRecipe recipe) { - return self().getDefinition().getBeforeWorking().test(this, recipe); + return true; } /** * Called per tick in {@link RecipeLogic#handleRecipeWorking()} */ default boolean onWorking() { - return self().getDefinition().getOnWorking().test(this); + return true; } /** * Called per tick in {@link RecipeLogic#handleRecipeWorking()} */ - default void onWaiting() { - self().getDefinition().getOnWaiting().accept(this); - } + default void onWaiting() {} /** * Called in {@link RecipeLogic#onRecipeFinish()} before outputs are produced */ - default void afterWorking() { - self().getDefinition().getAfterWorking().accept(this); - } + default void afterWorking() {} /** * Whether progress decrease when machine is waiting for pertick ingredients. (e.g. lack of EU) @@ -112,7 +108,7 @@ default boolean regressWhenWaiting() { * Always try {@link IRecipeLogicMachine#fullModifyRecipe(GTRecipe)} before setting up recipe. * * @return true - will map {@link RecipeLogic#lastOriginRecipe} to the latest recipe for next round when finishing. - * false - keep using the {@link RecipeLogic#lastRecipe}, which is already modified. + * false - keep using the {@link RecipeLogic# lastRecipe}, which is already modified. */ default boolean alwaysTryModifyRecipe() { // make it *always* do overclock and parallel so that the machine doesn't get stuck running a lower-tier recipe diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java index b4a54df35f6..26ed8ad1216 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java @@ -1,24 +1,16 @@ package com.gregtechceu.gtceu.api.machine.feature.multiblock; import com.gregtechceu.gtceu.api.capability.IParallelHatch; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.MultiblockState; -import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,7 +20,7 @@ import java.util.Optional; import java.util.concurrent.locks.Lock; -public interface IMultiController extends IMachineFeature, IInteractedMachine { +public interface IMultiController extends IMachineFeature { BooleanProperty IS_FORMED_PROPERTY = GTMachineModelProperties.IS_FORMED; @@ -196,22 +188,6 @@ default Comparator getPartSorter() { return self().getDefinition().getPartSorter().apply(self()); } - /** - * Show the preview of structure. - */ - @Override - default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit) { - if (!self().isFormed() && player.isShiftKeyDown() && player.getItemInHand(hand).isEmpty()) { - if (world.isClientSide()) { - MultiblockInWorldPreviewRenderer.showPreview(pos, self(), - ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); - } - return InteractionResult.SUCCESS; - } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); - } - default boolean allowCircuitSlots() { return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 6d001cc2ebc..e65beab1a0b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -17,12 +17,19 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; +import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -265,4 +272,17 @@ public void setFrontFacing(Direction facing) { checkPattern(); } } + + @Override + public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + if (!isFormed() && player.isShiftKeyDown() && player.getItemInHand(hand).isEmpty()) { + if (world.isClientSide()) { + MultiblockInWorldPreviewRenderer.showPreview(pos, this, + ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); + } + return InteractionResult.SUCCESS; + } + return super.onUse(state, world, pos, player, hand, hit); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index 6aa0e01e806..42a5a224244 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -86,9 +86,10 @@ public void onLoad() { } @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index 1b8195b229c..7182caea78a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -9,8 +9,6 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; @@ -24,6 +22,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; @@ -67,8 +66,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamBoilerMachine extends SteamWorkableMachine - implements IUIMachine, IExplosionMachine, IDataInfoProvider, - IInteractedMachine { + implements IUIMachine, IDataInfoProvider { @SaveField public final NotifiableFluidTank waterTank; @@ -196,7 +194,7 @@ protected void updateCurrentTemperature() { FluidAction.EXECUTE); } if (this.hasNoWater && hasDrainedWater) { - doExplosion(2.0f); + GTUtil.doExplosion(getLevel(), getBlockPos(), 2.0f); } else this.hasNoWater = !hasDrainedWater; if (filledSteam == 0 && hasDrainedWater && getLevel() instanceof ServerLevel serverLevel) { final float x = getBlockPos().getX() + 0.5F; @@ -304,7 +302,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index aad87a197c9..8434c9c9fc3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.trait.*; @@ -42,7 +41,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamWorkableMachine extends SteamMachine - implements IRecipeLogicMachine, IMufflableMachine, IMachineLife { + implements IRecipeLogicMachine, IMufflableMachine { @Getter protected final CleanroomReceiverTrait cleanroomReceiver; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ExplodableMachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ExplodableMachineTrait.java new file mode 100644 index 00000000000..781f695db79 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ExplodableMachineTrait.java @@ -0,0 +1,116 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.core.Direction; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public class ExplodableMachineTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>( + ExplodableMachineTrait.class); + + private @Nullable TickableSubscription explosionSub = null; + + private boolean shouldExplodeInWeatherAndWater; + @Getter + @Setter + private float explosionPower, fireChance; + @Setter + private Supplier explosionPredicate; + + public ExplodableMachineTrait(MetaMachine machine, float explosionPower, float fireChance, + Supplier explosionPredicate) { + super(machine); + shouldExplodeInWeatherAndWater = true; + this.explosionPredicate = explosionPredicate; + this.explosionPower = explosionPower; + this.fireChance = fireChance; + } + + public ExplodableMachineTrait(MetaMachine machine, float explosionPower, float fireChance) { + this(machine, explosionPower, fireChance, () -> true); + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public boolean shouldExplodeInWeatherAndWater() { + return shouldExplodeInWeatherAndWater; + } + + public void setShouldExplodeInWeatherAndWater(boolean value) { + shouldExplodeInWeatherAndWater = value; + updateSubscription(); + } + + @Override + public void onMachineLoad() { + super.onMachineLoad(); + if (!isRemote()) updateSubscription(); + } + + @Override + public void onMachineUnload() { + super.onMachineUnload(); + } + + private void updateSubscription() { + if (!isRemote() && shouldExplodeInWeatherAndWater && + ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion) { + explosionSub = subscribeServerTick(explosionSub, this::checkExplosion); + } else { + if (explosionSub != null) explosionSub.unsubscribe(); + explosionSub = null; + } + } + + private void checkExplosion() { + if (!shouldExplodeInWeatherAndWater || !explosionPredicate.get()) return; + var level = machine.getLevel(); + var pos = getBlockPos(); + if (GTValues.RNG.nextInt(1000) == 0) { + for (Direction side : GTUtil.DIRECTIONS) { + var fluidState = level.getBlockState(pos.relative(side)).getFluidState(); + if (!fluidState.isEmpty()) { + doExplosion(); + return; + } + } + } + if (GTValues.RNG.nextInt(1000) == 0) { + if (level.isRainingAt(pos) || level.isRainingAt(pos.east()) || level.isRainingAt(pos.west()) || + level.isRainingAt(pos.north()) || level.isRainingAt(pos.south())) { + if (level.isThundering() && GTValues.RNG.nextInt(3) == 0) { + doExplosion(); + } else if (GTValues.RNG.nextInt(10) == 0) { + doExplosion(); + } else setOnFire(); + } + } + } + + public void doExplosion() { + GTUtil.doExplosion(getLevel(), getBlockPos(), explosionPower); + } + + public void doExplosion(float power) { + GTUtil.doExplosion(getLevel(), getBlockPos(), power); + } + + public void setOnFire() { + GTUtil.setOnFire(getLevel(), getBlockPos(), fireChance); + } + +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 36b65137e0c..8d30620113e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -45,10 +46,26 @@ public MachineTrait(MetaMachine machine) { public abstract MachineTraitType getTraitType(); + public @Nullable TickableSubscription subscribeServerTick(@Nullable TickableSubscription last, Runnable runnable) { + return machine.subscribeServerTick(last, runnable); + } + + public void unsubscribe(TickableSubscription current) { + machine.unsubscribe(current); + } + + public BlockPos getBlockPos() { + return machine.getBlockPos(); + } + public Level getLevel() { return machine.getLevel(); } + public boolean isRemote() { + return machine.isRemote(); + } + public final boolean hasCapability(@Nullable Direction side) { return capabilityValidator.test(side); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java index 7cfc5cd711f..1f12ceaeec1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; public final class MachineTraitHolder { @@ -48,6 +49,10 @@ public void attachTrait(MachineTrait trait) { return type.castTrait(traitList.get(0)); } + public Optional getTraitOptional(MachineTraitType type) { + return Optional.ofNullable(getTrait(type)); + } + /** * Get all traits with the specified type. */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index ecafbf2c766..c1cfbe1cbac 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; @@ -271,8 +270,9 @@ public long acceptEnergyFromNetwork(Direction side, long voltage, long amperage) if (amps >= getInputAmperage()) return 0; long canAccept = getEnergyCapacity() - getEnergyStored(); if (voltage > 0L && (side == null || inputsEnergy(side))) { - if (voltage > getInputVoltage() && machine instanceof IExplosionMachine explosionMachine) { - explosionMachine.doExplosion(GTUtil.getExplosionPower(voltage)); + if (voltage > getInputVoltage()) { + machine.getTraitHolder().getTraitOptional(ExplodableMachineTrait.TYPE) + .ifPresent(t -> t.doExplosion(GTUtil.getExplosionPower(voltage))); return Math.min(amperage, getInputAmperage() - amps); } if (canAccept >= voltage) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 95a4cd0f853..3beb250f39e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -328,6 +328,10 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) { return storage.isItemValid(slot, stack); } + public void dropInventoryInWorld() { + storage.dropInventoryInWorld(getLevel(), getMachine().getBlockPos()); + } + public static class KJSCallWrapper { public static ItemStack applyIngredientAction(CustomItemStackHandler storage, int index, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComponentTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComponentTrait.java new file mode 100644 index 00000000000..ab51f75af7f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComponentTrait.java @@ -0,0 +1,64 @@ +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; + +import lombok.Getter; +import lombok.experimental.Accessors; + +@Accessors(fluent = true) +@Getter +public class HPCAComponentTrait extends MachineTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>(HPCAComponentTrait.class); + + @Getter + private final int upkeepEUt, maxEUt; + @Getter + private final boolean canBeDamaged, allowBridging; + @SaveField + @SyncToClient + @RerenderOnChanged + @Getter + private boolean isDamaged; + + public HPCAComponentTrait(MetaMachine machine, int upkeepEUt, int maxEUt, boolean canBeDamaged, + boolean allowBridging) { + super(machine); + this.upkeepEUt = upkeepEUt; + this.maxEUt = maxEUt; + this.canBeDamaged = canBeDamaged; + this.isDamaged = false; + this.allowBridging = allowBridging; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public void setDamaged(boolean damaged) { + if (!canBeDamaged) return; + if (isDamaged != damaged) { + isDamaged = damaged; + syncDataHolder.markClientSyncFieldDirty("damaged"); + MachineRenderState state = getRenderState(); + if (state.hasProperty(GTMachineModelProperties.IS_HPCA_PART_DAMAGED)) { + setRenderState(state.setValue(GTMachineModelProperties.IS_HPCA_PART_DAMAGED, damaged)); + } + } + } + + public void setActive(boolean active) { + MachineRenderState state = getRenderState(); + if (state.hasProperty(GTMachineModelProperties.IS_ACTIVE)) { + setRenderState(state.setValue(GTMachineModelProperties.IS_ACTIVE, active)); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComputationProviderTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComputationProviderTrait.java new file mode 100644 index 00000000000..633d7b50c70 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCAComputationProviderTrait.java @@ -0,0 +1,28 @@ +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import lombok.Setter; + +public class HPCAComputationProviderTrait extends HPCAComponentTrait { + + @Setter + private int CWUPerTick, coolingPerTick; + + public HPCAComputationProviderTrait(MetaMachine machine, int upkeepEUt, int maxEUt, boolean canBeDamaged, + boolean allowBridging, int CWUPerTick, int coolingPerTick) { + super(machine, upkeepEUt, maxEUt, canBeDamaged, allowBridging); + this.CWUPerTick = CWUPerTick; + this.coolingPerTick = coolingPerTick; + } + + public int getCoolingPerTick() { + if (isDamaged()) return 0; + return coolingPerTick; + } + + public int getCWUPerTick() { + if (isDamaged()) return 0; + return CWUPerTick; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCACoolantProviderTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCACoolantProviderTrait.java new file mode 100644 index 00000000000..fffca43945b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/HPCACoolantProviderTrait.java @@ -0,0 +1,21 @@ +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import lombok.Getter; + +@Getter +public class HPCACoolantProviderTrait extends HPCAComponentTrait { + + private final int coolingAmount, maxCoolantPerTick; + private final boolean isActiveCooler; + + public HPCACoolantProviderTrait(MetaMachine machine, int upkeepEUt, int maxEUt, boolean canBeDamaged, + boolean allowBridging, int coolingAmount, int maxCoolantPerTick, + boolean isActiveCooler) { + super(machine, upkeepEUt, maxEUt, canBeDamaged, allowBridging); + this.coolingAmount = coolingAmount; + this.maxCoolantPerTick = maxCoolantPerTick; + this.isActiveCooler = isActiveCooler; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/package-info.java new file mode 100644 index 00000000000..dcda1cedd5f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/hpca/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine.trait.hpca; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index e4c212484d6..120400e2281 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -261,26 +261,6 @@ public TYPE alwaysTryModifyRecipe(boolean alwaysTryModifyRecipe) { return getThis(); } - public TYPE beforeWorking(BiPredicate beforeWorking) { - this.beforeWorking = beforeWorking; - return getThis(); - } - - public TYPE onWorking(Predicate onWorking) { - this.onWorking = onWorking; - return getThis(); - } - - public TYPE onWaiting(Consumer onWaiting) { - this.onWaiting = onWaiting; - return getThis(); - } - - public TYPE afterWorking(Consumer afterWorking) { - this.afterWorking = afterWorking; - return getThis(); - } - public TYPE regressWhenWaiting(boolean regressWhenWaiting) { this.regressWhenWaiting = regressWhenWaiting; return getThis(); @@ -686,10 +666,6 @@ public DEFINITION register() { }); definition.setRecipeModifier(recipeModifier); definition.setAlwaysTryModifyRecipe(alwaysTryModifyRecipe); - definition.setBeforeWorking(this.beforeWorking); - definition.setOnWorking(this.onWorking); - definition.setOnWaiting(this.onWaiting); - definition.setAfterWorking(this.afterWorking); definition.setRegressWhenWaiting(this.regressWhenWaiting); definition.setAllowCoverOnFront(this.allowCoverOnFront); diff --git a/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java index 0b429b995f5..812a4c8c804 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java @@ -1,8 +1,11 @@ package com.gregtechceu.gtceu.api.transfer.item; +import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.items.ItemStackHandler; @@ -52,4 +55,11 @@ public void clear() { stacks.clear(); onContentsChanged.run(); } + + public void dropInventoryInWorld(Level world, BlockPos pos) { + for (ItemStack stack : stacks) { + Block.popResource(world, pos, stack); + } + clear(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index dfdf9ae80ef..ea51bf75b0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -248,8 +248,13 @@ public class GTMachines { ELECTRIC_TIERS); public static final MachineDefinition[] GAS_COLLECTOR = registerSimpleMachines("gas_collector", GTRecipeTypes.GAS_COLLECTOR_RECIPES, largeTankSizeFunction, true); + public static final MachineDefinition[] ROCK_CRUSHER = registerTieredMachines("rock_crusher", - RockCrusherMachine::new, (tier, builder) -> builder + (info, tier) -> { + var machine = new SimpleTieredMachine(info, tier, defaultTankSizeFunction); + machine.getExplodableMachineTrait().setShouldExplodeInWeatherAndWater(false); + return machine; + }, (tier, builder) -> builder .langValue("%s Rock Crusher %s".formatted(VLVH[tier], VLVT[tier])) .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(GTCEu.id("rock_crusher"), GTRecipeTypes.ROCK_BREAKER_RECIPES)) @@ -262,6 +267,7 @@ public class GTMachines { .tooltips(explosion()) .register(), ELECTRIC_TIERS); + public static final MachineDefinition[] AIR_SCRUBBER = registerTieredMachines("air_scrubber", AirScrubberMachine::new, (tier, builder) -> builder .langValue("%s Air Scrubber %s".formatted(VLVH[tier], VLVT[tier])) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java index 026bc2e7ce6..579b251e1df 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -40,7 +39,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BatteryBufferMachine extends TieredEnergyMachine - implements IControllable, IFancyUIMachine, IMachineLife, IMonitorComponent { + implements IControllable, IFancyUIMachine, IMonitorComponent { public static final long AMPS_PER_BATTERY = 2L; @@ -191,8 +190,9 @@ private List getAllBatteries() { } @Override - public void onMachineRemoved() { - clearInventory(batteryInventory); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + batteryInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override @@ -289,7 +289,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - machine.doExplosion(GTUtil.getExplosionPower(voltage)); + GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage)); return usedAmps; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index 5ae4bb47a6e..218a98e57f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -13,7 +13,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -49,7 +48,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IControllable { + implements IFancyUIMachine, IControllable { @SaveField protected final NotifiableItemStackHandler cache; @@ -82,8 +81,8 @@ public BlockBreakerMachine(BlockEntityCreationInfo info, int tier) { this.chargerInventory = createChargerItemHandler(); this.energyPerTick = GTValues.V[tier - 1]; this.efficiencyMultiplier = 1.0f - getEfficiencyMultiplier(tier); - this.autoOutput = AutoOutputTrait.ofItems(this, cache); + explodableMachineTrait.setShouldExplodeInWeatherAndWater(false); } public static float getEfficiencyMultiplier(int tier) { @@ -138,9 +137,10 @@ public void onUnload() { } @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); - clearInventory(cache.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + cache.dropInventoryInWorld(); } @Override @@ -264,11 +264,6 @@ protected void chargeBattery() { updateBatterySubscription(); } - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 3a3fe593102..d7d8dd37ead 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -40,7 +39,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ChargerMachine extends TieredEnergyMachine implements IControllable, IFancyUIMachine, IMachineLife { +public class ChargerMachine extends TieredEnergyMachine implements IControllable, IFancyUIMachine { public static final long AMPS_PER_ITEM = 4L; @@ -111,8 +110,9 @@ public int tintColor(int index) { } @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } ////////////////////////////////////// @@ -221,7 +221,7 @@ public long acceptEnergyFromNetwork(@Nullable Direction side, long voltage, long if (side == null || inputsEnergy(side)) { if (voltage > getInputVoltage()) { - machine.doExplosion(GTUtil.getExplosionPower(voltage)); + GTUtil.doExplosion(getLevel(), getBlockPos(), GTUtil.getExplosionPower(voltage)); return usedAmps; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index a4cdfc0dd1f..70fbbb866ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -14,7 +14,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -58,7 +57,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FisherMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IWorkable { @SaveField protected final NotifiableItemStackHandler cache; @@ -123,6 +122,7 @@ public FisherMachine(BlockEntityCreationInfo info, int tier) { GTCapabilityHelper.getForgeEnergyItem(item) != null)); autoOutput = AutoOutputTrait.ofItems(this, cache); + explodableMachineTrait.setShouldExplodeInWeatherAndWater(false); } public void setWorkingEnabled(boolean enabled) { @@ -162,15 +162,11 @@ public void onUnload() { } @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - - @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); - clearInventory(baitHandler.storage); - clearInventory(cache.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + baitHandler.dropInventoryInWorld(); + cache.dropInventoryInWorld(); } public static int calcMaxProgress(int tier) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 22821876b65..e68670e1d57 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -15,7 +15,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -56,7 +55,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemCollectorMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IWorkable { @Getter private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; @@ -113,6 +112,7 @@ public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { this.output = createOutputItemHandler(); this.chargerInventory = createChargerItemHandler(); this.filterInventory = createFilterItemHandler(); + explodableMachineTrait.setShouldExplodeInWeatherAndWater(false); this.autoOutput = AutoOutputTrait.ofItems(this, output); maxRange = (int) Math.pow(2, tier + 2); range = maxRange; @@ -168,14 +168,10 @@ public void onUnload() { } @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - - @Override - public void onMachineRemoved() { - clearInventory(chargerInventory); - clearInventory(output.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + output.dropInventoryInWorld(); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index a5276ee2fe9..cf51fc76834 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -57,7 +57,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MinerMachine extends WorkableTieredMachine - implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider { + implements IControllable, IFancyUIMachine, IDataInfoProvider, IMiner { @Getter @SaveField @@ -95,11 +95,11 @@ protected CustomItemStackHandler createChargerItemHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { // Remove the miner pipes below this miner getRecipeLogic().onRemove(); - clearInventory(exportItems.storage); - clearInventory(chargerInventory); + exportItems.dropInventoryInWorld(); + chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index 6a8668edc29..f3bd4c437c9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; @@ -54,7 +53,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PumpMachine extends TieredEnergyMachine implements IUIMachine, IMachineLife { +public class PumpMachine extends TieredEnergyMachine implements IUIMachine { public static final int BASE_PUMP_RADIUS = 16; public static final int EXTRA_PUMP_RADIUS = 4; @@ -75,6 +74,7 @@ public PumpMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.cache = new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT); + explodableMachineTrait.setShouldExplodeInWeatherAndWater(false); this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } @@ -88,11 +88,6 @@ public void onLoad() { subscribeServerTick(this::update); } - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } - ////////////////////////////////////// // ********* Logic **********// ////////////////////////////////////// @@ -378,7 +373,8 @@ private boolean canAdvancePumpHead() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (getLevel() instanceof ServerLevel serverLevel) { var pos = getBlockPos().relative(Direction.DOWN); while (serverLevel.getBlockState(pos).is(GTBlocks.MINER_PIPE.get())) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java deleted file mode 100644 index e18da73b220..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.electric; - -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; -import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; - -public class RockCrusherMachine extends SimpleTieredMachine { - - public RockCrusherMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier, GTMachineUtils.defaultTankSizeFunction); - } - - @Override - public boolean shouldWeatherOrTerrainExplosion() { - return false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java index 0eb894dac70..870944d293f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -21,6 +20,7 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; @@ -44,7 +44,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ActiveTransformerMachine extends WorkableElectricMultiblockMachine - implements IControllable, IExplosionMachine, IFancyUIMachine, IDisplayUIMachine { + implements IControllable, IFancyUIMachine, IDisplayUIMachine { private IEnergyContainer powerOutput; private IEnergyContainer powerInput; @@ -150,7 +150,7 @@ private List getPrioritySortedParts() { public void onStructureInvalid() { if ((isWorkingEnabled() && recipeLogic.getStatus() == RecipeLogic.Status.WORKING) && !ConfigHolder.INSTANCE.machines.harmlessActiveTransformers) { - doExplosion(6f + getTier()); + GTUtil.doExplosion(getLevel(), getBlockPos(), 6f + getTier()); } super.onStructureInvalid(); this.powerOutput = new EnergyContainerList(new ArrayList<>()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index 13708588fbb..4c18fd64f73 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; @@ -61,7 +60,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CentralMonitorMachine extends WorkableElectricMultiblockMachine - implements IMonitorComponent, IDataInfoProvider, IMachineLife { + implements IMonitorComponent, IDataInfoProvider { @SaveField @SyncToClient @@ -477,8 +476,8 @@ public Widget createUIWidget() { while (itg.hasNext()) { MonitorGroup group = itg.next(); if (group.isEmpty()) { - clearInventory(group.getItemStackHandler()); - clearInventory(group.getPlaceholderSlotsHandler()); + group.getItemStackHandler().dropInventoryInWorld(getLevel(), getBlockPos()); + group.getPlaceholderSlotsHandler().dropInventoryInWorld(getLevel(), getBlockPos()); itg.remove(); } } @@ -665,10 +664,11 @@ public IGuiTexture getComponentIcon() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); for (MonitorGroup group : monitorGroups) { - clearInventory(group.getItemStackHandler()); - clearInventory(group.getPlaceholderSlotsHandler()); + group.getItemStackHandler().dropInventoryInWorld(getLevel(), getBlockPos());; + group.getPlaceholderSlotsHandler().dropInventoryInWorld(getLevel(), getBlockPos()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index c1ae2a8a6c2..46006d60b70 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -421,8 +421,7 @@ protected TraceabilityPredicate innerPredicate() { if (isMachineBanned(machine)) { return false; } - CleanroomReceiverTrait receiverTrait = machine.getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - if (receiverTrait != null) receivers.add(receiverTrait); + machine.getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE).ifPresent(receivers::add); } return true; }, null) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java index 32d0561fcba..7718f9ab4a0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java @@ -9,12 +9,16 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.util.TimedProgressSupplier; import com.gregtechceu.gtceu.api.gui.widget.ExtendedProgressWidget; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComputationProviderTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCACoolantProviderTrait; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; @@ -22,6 +26,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; +import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCAComponentPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -44,7 +49,6 @@ import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -100,14 +104,14 @@ public void onStructureFormed() { super.onStructureFormed(); List energyContainers = new ArrayList<>(); List coolantContainers = new ArrayList<>(); - List componentHatches = new ArrayList<>(); + List componentTraits = new ArrayList<>(); Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); - if (part instanceof IHPCAComponentHatch componentHatch) { - componentHatches.add(componentHatch); - } + + componentTraits.addAll(part.self().getTraitHolder().getTraits(HPCAComponentTrait.TYPE)); + if (part instanceof IMaintenanceMachine maintenanceMachine) { this.maintenance = maintenanceMachine; } @@ -128,7 +132,7 @@ public void onStructureFormed() { } this.energyContainer = new EnergyContainerList(energyContainers); this.coolantHandler = new FluidHandlerList(coolantContainers); - this.hpcaHandler.onStructureForm(componentHatches); + this.hpcaHandler.onStructureForm(componentTraits); if (getLevel() instanceof ServerLevel serverLevel) { serverLevel.getServer().tell(new TickTask(0, this::updateTickSubscription)); @@ -214,9 +218,7 @@ public void tick() { private void updateActive(boolean active) { for (var part : getParts()) { - if (part instanceof IHPCAComponentHatch hpcaPart) { - hpcaPart.setActive(active); - } + part.self().getTraitHolder().getTraitOptional(HPCAComponentTrait.TYPE).ifPresent(t -> t.setActive(active)); } } @@ -385,9 +387,9 @@ public static class HPCAGridHandler implements ISyncManaged { private final HPCAMachine controller; // structure info - private final List components = new ObjectArrayList<>(); - private final Set coolantProviders = new ObjectOpenHashSet<>(); - private final Set computationProviders = new ObjectOpenHashSet<>(); + private final List components = new ObjectArrayList<>(); + private final Set coolantProviders = new ObjectOpenHashSet<>(); + private final Set computationProviders = new ObjectOpenHashSet<>(); private int numBridges; // transaction info @@ -406,17 +408,17 @@ public HPCAGridHandler(@Nullable HPCAMachine controller) { this.controller = controller; } - public void onStructureForm(Collection components) { + public void onStructureForm(Collection components) { reset(); for (var component : components) { this.components.add(component); - if (component instanceof IHPCACoolantProvider coolantProvider) { + if (component instanceof HPCACoolantProviderTrait coolantProvider) { this.coolantProviders.add(coolantProvider); } - if (component instanceof IHPCAComputationProvider computationProvider) { + if (component instanceof HPCAComputationProviderTrait computationProvider) { this.computationProviders.add(computationProvider); } - if (component.isBridge()) { + if (component.allowBridging()) { this.numBridges++; } } @@ -536,7 +538,7 @@ public void attemptDamageHPCA() { // 1% chance each tick to damage a component if running too hot if (GTValues.RNG.nextInt(200) == 0) { // randomize which component is actually damaged - List candidates = new ArrayList<>(); + List candidates = new ArrayList<>(); for (var component : components) { if (component.canBeDamaged()) { candidates.add(component); @@ -588,7 +590,7 @@ public long getCurrentEUt() { public long getUpkeepEUt() { long upkeepEUt = 0; for (var component : components) { - upkeepEUt += component.getUpkeepEUt(); + upkeepEUt += component.upkeepEUt(); } return upkeepEUt; } @@ -597,7 +599,7 @@ public long getUpkeepEUt() { public long getMaxEUt() { long maximumEUt = 0; for (var component : components) { - maximumEUt += component.getMaxEUt(); + maximumEUt += component.maxEUt(); } return maximumEUt; } @@ -704,7 +706,7 @@ public void addWarnings(List textList) { } public void addErrors(List textList) { - if (components.stream().anyMatch(IHPCAComponentHatch::isDamaged)) { + if (components.stream().anyMatch(HPCAComponentTrait::isDamaged)) { textList.add( Component.translatable("gtceu.multiblock.hpca.error_damaged").withStyle(ChatFormatting.RED)); } @@ -714,7 +716,9 @@ public ResourceTexture getComponentTexture(int index) { if (components.size() <= index) { return GuiTextures.BLANK_TRANSPARENT; } - return components.get(index).getComponentIcon(); + if (components.get(index).getMachine() instanceof HPCAComponentPartMachine componentPartMachine) + return componentPartMachine.getComponentIcon(); + return GuiTextures.BLANK_TRANSPARENT; } public void tryGatherClientComponents(Level world, BlockPos pos, Direction frontFacing, @@ -729,9 +733,11 @@ public void tryGatherClientComponents(Level world, BlockPos pos, Direction front for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { BlockPos tempPos = testPos.relative(frontFacing, j).relative(relativeUp.getOpposite(), i); - BlockEntity be = world.getBlockEntity(tempPos); - if (be instanceof IHPCAComponentHatch hatch) { - components.add(hatch); + MetaMachine be = MetaMachine.getMachine(world, tempPos); + if (be == null) continue; + var trait = be.getTraitHolder().getTrait(HPCAComponentTrait.TYPE); + if (trait != null) { + components.add(trait); } // if here without a hatch, something went wrong, better to skip than add a null into the mix. } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java index 82c4311212a..232ba69450f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/CleaningMaintenanceHatchPartMachine.java @@ -36,15 +36,15 @@ public CleaningMaintenanceHatchPartMachine(BlockEntityCreationInfo info, Cleanro @Override public void addedToController(IMultiController controller) { super.addedToController(controller); - CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - if (receiverTrait != null) receiverTrait.setCleanroomProvider(cleanroomProvider); + controller.self().getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE) + .ifPresent(t -> t.setCleanroomProvider(cleanroomProvider)); } @Override public void removedFromController(IMultiController controller) { super.removedFromController(controller); - CleanroomReceiverTrait receiverTrait = controller.self().getTraitHolder().getTrait(CleanroomReceiverTrait.TYPE); - if (receiverTrait != null) receiverTrait.removeCleanroom(); + controller.self().getTraitHolder().getTraitOptional(CleanroomReceiverTrait.TYPE) + .ifPresent(CleanroomReceiverTrait::removeCleanroom); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 9ba2dd0c71e..3f872739600 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -48,7 +47,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class DataAccessHatchMachine extends TieredPartMachine - implements IMachineLife, IDataAccessHatch, IDataInfoProvider, IMonitorComponent { + implements IDataAccessHatch, IDataInfoProvider, IMonitorComponent { private final Set recipes; @Getter @@ -117,8 +116,9 @@ protected int getInventorySize() { } @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); } private void rebuildData(boolean isDataBank) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java index 760589bb07b..4e86ab5d222 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java @@ -3,12 +3,10 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.ExplodableMachineTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; @@ -21,11 +19,10 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class EnergyHatchPartMachine extends TieredIOPartMachine implements IExplosionMachine { +public class EnergyHatchPartMachine extends TieredIOPartMachine { @SaveField public final NotifiableEnergyContainer energyContainer; - protected TickableSubscription explosionSub; @Getter protected int amperage; @@ -33,6 +30,7 @@ public EnergyHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, int super(info, tier, io); this.amperage = amperage; this.energyContainer = createEnergyContainer(); + new ExplodableMachineTrait(this, tier, tier * 10, () -> energyContainer.getEnergyStored() > 0); } ////////////////////////////////////// @@ -63,29 +61,6 @@ public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult @Override public void onLoad() { super.onLoad(); - if (!isRemote() && ConfigHolder.INSTANCE.machines.shouldWeatherOrTerrainExplosion && - shouldWeatherOrTerrainExplosion()) { - explosionSub = subscribeServerTick(this::checkExplosion); - checkExplosion(); - } - } - - @Override - public void onUnload() { - super.onUnload(); - if (explosionSub != null) { - explosionSub.unsubscribe(); - explosionSub = null; - } - } - - ////////////////////////////////////// - // ******** Explosion ********// - ////////////////////////////////////// - protected void checkExplosion() { - if (energyContainer.getEnergyStored() > 0) { - checkWeatherOrTerrainExplosion(tier, tier * 10); - } } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java index 496ed12bf64..9b46334f208 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; @@ -53,7 +52,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class FluidHatchPartMachine extends TieredIOPartMachine implements IMachineLife, IHasCircuitSlot, IPaintable { +public class FluidHatchPartMachine extends TieredIOPartMachine implements IHasCircuitSlot, IPaintable { public static final int INITIAL_TANK_CAPACITY_1X = 8 * FluidType.BUCKET_VOLUME; public static final int INITIAL_TANK_CAPACITY_4X = 2 * FluidType.BUCKET_VOLUME; @@ -102,9 +101,10 @@ public static int getTankCapacity(int initialCapacity, int tier) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } @@ -136,7 +136,7 @@ public void onPaintingColorChanged(int color) { public void addedToController(IMultiController controller) { if (!controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } else { circuitInventory.setStackInSlot(0, ItemStack.EMPTY); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index e6306d10891..894766ef490 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; @@ -49,7 +48,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemBusPartMachine extends TieredIOPartMachine - implements IDistinctPart, IMachineLife, IHasCircuitSlot, IPaintable { + implements IDistinctPart, IHasCircuitSlot, IPaintable { @Getter @SaveField @@ -104,11 +103,12 @@ protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { } @Override - public void onMachineRemoved() { - clearInventory(getInventory().storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + getInventory().dropInventoryInWorld(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } } @@ -148,7 +148,7 @@ public void setDistinct(boolean distinct) { public void addedToController(IMultiController controller) { if (hasCircuitSlot && !controller.allowCircuitSlots()) { if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - clearInventory(circuitInventory.storage); + circuitInventory.dropInventoryInWorld(); } else { circuitInventory.setStackInSlot(0, ItemStack.EMPTY); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java index 61200cbbe0d..9bef4765b0a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java @@ -8,8 +8,6 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -56,7 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MaintenanceHatchPartMachine extends TieredPartMachine - implements IMachineLife, IMaintenanceMachine, IInteractedMachine { + implements IMaintenanceMachine { private static final float MAX_DURATION_MULTIPLIER = 1.1f; private static final float MIN_DURATION_MULTIPLIER = 0.9f; @@ -99,8 +97,9 @@ protected NotifiableItemStackHandler createInventory() { } @Override - public void onMachineRemoved() { - clearInventory(itemStackHandler); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + itemStackHandler.dropInventoryInWorld(); } @Override @@ -330,7 +329,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java index f9c3b37191a..a4da0e03b08 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.item.component.IDataItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -32,7 +31,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder, IMachineLife { +public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder { // purposefully not exposed to automation or capabilities @SaveField @@ -87,8 +86,9 @@ private ItemStack getHeldItem(int slot, boolean remove) { } @Override - public void onMachineRemoved() { - clearInventory(this.heldItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + heldItems.storage.dropInventoryInWorld(getLevel(), getBlockPos()); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java index 0002d4648e9..2ea029a97c9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -7,8 +7,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; @@ -44,7 +42,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class RotorHolderPartMachine extends TieredPartMachine - implements IMachineLife, IRotorHolderMachine, IInteractedMachine { + implements IRotorHolderMachine { @SaveField public final NotifiableItemStackHandler inventory; @@ -74,8 +72,9 @@ public RotorHolderPartMachine(BlockEntityCreationInfo info, int tier) { ////////////////////////////////////// @Override - public void onMachineRemoved() { - clearInventory(inventory.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + inventory.dropInventoryInWorld(); } @Override @@ -217,8 +216,11 @@ public void setRotorStack(ItemStack rotorStack) { inventory.onContentsChanged(); } + @Override public InteractionResult onUse(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + var superResult = super.onUse(state, level, pos, player, hand, hit); + if (superResult != InteractionResult.PASS) return superResult; if (!isRemote() && getRotorSpeed() > 0 && !player.isCreative()) { TurbineRotorBehaviour behaviour = TurbineRotorBehaviour.getBehaviour(getRotorStack()); if (behaviour != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java index 43dae5f810f..39b92b49c7e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -15,7 +16,7 @@ public class HPCABridgePartMachine extends HPCAComponentPartMachine { public HPCABridgePartMachine(BlockEntityCreationInfo info) { - super(info); + super(info, (m) -> new HPCAComponentTrait(m, GTValues.VA[GTValues.IV], GTValues.VA[GTValues.IV], false, true)); } @Override @@ -23,23 +24,8 @@ public boolean isAdvanced() { return true; } - @Override - public boolean doesAllowBridging() { - return true; - } - @Override public ResourceTexture getComponentIcon() { return GuiTextures.HPCA_ICON_BRIDGE_COMPONENT; } - - @Override - public int getUpkeepEUt() { - return GTValues.VA[GTValues.IV]; - } - - @Override - public boolean canBeDamaged() { - return false; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java index 8506fb1d581..2a8a773c546 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java @@ -1,45 +1,41 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; -import com.gregtechceu.gtceu.api.machine.feature.IMachineModifyDrops; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.BlockHitResult; +import lombok.Getter; + import java.util.List; +import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public abstract class HPCAComponentPartMachine extends MultiblockPartMachine - implements IHPCAComponentHatch, IMachineModifyDrops { +public abstract class HPCAComponentPartMachine extends MultiblockPartMachine { - @SaveField - @SyncToClient - @RerenderOnChanged - private boolean damaged; + @Getter + protected final HPCAComponentTrait hpcaComponentTrait; - public HPCAComponentPartMachine(BlockEntityCreationInfo info) { + public HPCAComponentPartMachine(BlockEntityCreationInfo info, + Function hpcaTraitSupplier) { super(info); + this.hpcaComponentTrait = hpcaTraitSupplier.apply(this); } public abstract boolean isAdvanced(); - public boolean doesAllowBridging() { - return false; - } + public abstract ResourceTexture getComponentIcon(); @Override public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { @@ -56,44 +52,12 @@ public boolean canShared() { return false; } - // Handle damaged state - - @Override - public final boolean isBridge() { - return doesAllowBridging() && !(canBeDamaged() && isDamaged()); - } - - @Override - public boolean isDamaged() { - return canBeDamaged() && damaged; - } - - @Override - public void setDamaged(boolean damaged) { - if (!canBeDamaged()) return; - if (this.damaged != damaged) { - this.damaged = damaged; - syncDataHolder.markClientSyncFieldDirty("damaged"); - MachineRenderState state = getRenderState(); - if (state.hasProperty(GTMachineModelProperties.IS_HPCA_PART_DAMAGED)) { - setRenderState(state.setValue(GTMachineModelProperties.IS_HPCA_PART_DAMAGED, damaged)); - } - } - } - - public void setActive(boolean active) { - MachineRenderState state = getRenderState(); - if (state.hasProperty(GTMachineModelProperties.IS_ACTIVE)) { - setRenderState(state.setValue(GTMachineModelProperties.IS_ACTIVE, active)); - } - } - @Override - public void onDrops(List drops) { + public void modifyDrops(List drops) { for (int i = 0; i < drops.size(); ++i) { ItemStack drop = drops.get(i); if (drop.getItem() == this.getDefinition().getItem()) { - if (canBeDamaged() && isDamaged()) { + if (hpcaComponentTrait.isDamaged()) { if (isAdvanced()) { drops.set(i, GTBlocks.ADVANCED_COMPUTER_CASING.asStack()); } else { @@ -104,16 +68,4 @@ public void onDrops(List drops) { } } } - - /* - * // TODO add some way to show a custom display name for machines - * - * @Override - * public String getMetaName() { - * if (canBeDamaged() && isDamaged()) { - * return super.getMetaName() + ".damaged"; - * } - * return super.getMetaName(); - * } - */ } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java index 4a055b25c01..ffaf98023c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java @@ -2,8 +2,9 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IHPCAComputationProvider; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComputationProviderTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -15,49 +16,31 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class HPCAComputationPartMachine extends HPCAComponentPartMachine implements IHPCAComputationProvider { +public class HPCAComputationPartMachine extends HPCAComponentPartMachine { @Getter private final boolean advanced; public HPCAComputationPartMachine(BlockEntityCreationInfo info, boolean advanced) { - super(info); + super(info, (m) -> createHPCATrait(m, advanced)); this.advanced = advanced; } + public static HPCAComponentTrait createHPCATrait(HPCAComponentPartMachine machine, boolean isAdvanced) { + int upkeepEUt = GTValues.VA[isAdvanced ? GTValues.IV : GTValues.EV]; + int maxEUt = GTValues.VA[isAdvanced ? GTValues.ZPM : GTValues.LuV]; + int cooling = isAdvanced ? 4 : 2; + int cwu = isAdvanced ? 16 : 4; + return new HPCAComputationProviderTrait(machine, upkeepEUt, maxEUt, true, false, cwu, cooling); + } + @Override public ResourceTexture getComponentIcon() { - if (isDamaged()) { + if (hpcaComponentTrait.isDamaged()) { return advanced ? GuiTextures.HPCA_ICON_DAMAGED_ADVANCED_COMPUTATION_COMPONENT : GuiTextures.HPCA_ICON_DAMAGED_COMPUTATION_COMPONENT; } return advanced ? GuiTextures.HPCA_ICON_ADVANCED_COMPUTATION_COMPONENT : GuiTextures.HPCA_ICON_COMPUTATION_COMPONENT; } - - @Override - public int getUpkeepEUt() { - return GTValues.VA[advanced ? GTValues.IV : GTValues.EV]; - } - - @Override - public int getMaxEUt() { - return GTValues.VA[advanced ? GTValues.ZPM : GTValues.LuV]; - } - - @Override - public int getCWUPerTick() { - if (isDamaged()) return 0; - return advanced ? 16 : 4; - } - - @Override - public int getCoolingPerTick() { - return advanced ? 4 : 2; - } - - @Override - public boolean canBeDamaged() { - return true; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java index 18db66576b8..bed1051e82a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java @@ -2,8 +2,9 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.IHPCACoolantProvider; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCACoolantProviderTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -15,43 +16,26 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class HPCACoolerPartMachine extends HPCAComponentPartMachine implements IHPCACoolantProvider { +public class HPCACoolerPartMachine extends HPCAComponentPartMachine { @Getter private final boolean advanced; public HPCACoolerPartMachine(BlockEntityCreationInfo info, boolean advanced) { - super(info); + super(info, (machine) -> createHPCATrait(machine, advanced)); this.advanced = advanced; } - @Override - public ResourceTexture getComponentIcon() { - return advanced ? GuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GuiTextures.HPCA_ICON_HEAT_SINK_COMPONENT; - } - - @Override - public int getUpkeepEUt() { - return advanced ? GTValues.VA[GTValues.IV] : 0; - } - - @Override - public boolean canBeDamaged() { - return false; + public static HPCAComponentTrait createHPCATrait(HPCAComponentPartMachine machine, boolean isAdvanced) { + int upkeepEU = isAdvanced ? GTValues.VA[GTValues.IV] : 0; + int coolingAmount = isAdvanced ? 2 : 1; + int maxCoolant = isAdvanced ? 8 : 0; + return new HPCACoolantProviderTrait(machine, upkeepEU, upkeepEU, false, false, coolingAmount, maxCoolant, + isAdvanced); } @Override - public int getCoolingAmount() { - return advanced ? 2 : 1; - } - - @Override - public boolean isActiveCooler() { - return advanced; - } - - @Override - public int getMaxCoolantPerTick() { - return advanced ? 8 : 0; + public ResourceTexture getComponentIcon() { + return advanced ? GuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GuiTextures.HPCA_ICON_HEAT_SINK_COMPONENT; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java index 6c5ad385770..e919369ef5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.trait.hpca.HPCAComponentTrait; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -14,7 +15,7 @@ public class HPCAEmptyPartMachine extends HPCAComponentPartMachine { public HPCAEmptyPartMachine(BlockEntityCreationInfo info) { - super(info); + super(info, (machine) -> new HPCAComponentTrait(machine, 0, 0, false, false)); } @Override @@ -26,14 +27,4 @@ public boolean isAdvanced() { public ResourceTexture getComponentIcon() { return GuiTextures.HPCA_ICON_EMPTY_COMPONENT; } - - @Override - public int getUpkeepEUt() { - return 0; - } - - @Override - public boolean canBeDamaged() { - return false; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java index 786c5601cf4..cd451b26b1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/monitor/AdvancedMonitorPartMachine.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -19,8 +18,11 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + @MethodsReturnNonnullByDefault -public class AdvancedMonitorPartMachine extends MonitorPartMachine implements IInteractedMachine { +@ParametersAreNonnullByDefault +public class AdvancedMonitorPartMachine extends MonitorPartMachine { @Getter @SaveField @@ -44,8 +46,7 @@ public AdvancedMonitorPartMachine(BlockEntityCreationInfo info) { @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - if (hit.getDirection() != getFrontFacing()) - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + if (hit.getDirection() != getFrontFacing()) return super.onUse(state, world, pos, player, hand, hit); clicked = true; clickPosX = hit.getLocation() .get(RelativeDirection.RIGHT.getRelative(getFrontFacing(), getUpwardsFacing(), false).getAxis()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java index c1daf9ad56e..e5be2e0fa99 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java @@ -18,6 +18,7 @@ import com.lowdragmc.lowdraglib.utils.BlockInfo; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; @@ -46,8 +47,12 @@ import java.util.*; +import javax.annotation.ParametersAreNonnullByDefault; + import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class CharcoalPileIgniterMachine extends WorkableMultiblockMachine implements IWorkable { private static final int MIN_RADIUS = 1; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java index f27bdc427fc..69e17bf6007 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -19,7 +18,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class PrimitiveWorkableMachine extends WorkableMultiblockMachine - implements IMachineLife, IEnvironmentalHazardEmitter { + implements IEnvironmentalHazardEmitter { @SaveField public final NotifiableItemStackHandler importItems; @@ -61,9 +60,10 @@ protected NotifiableFluidTank createExportFluidHandler() { } @Override - public void onMachineRemoved() { - clearInventory(importItems.storage); - clearInventory(exportItems.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + importItems.dropInventoryInWorld(); + exportItems.dropInventoryInWorld(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java index dd5c477e765..9181db7dbe6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; @@ -20,6 +19,7 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.util.ClickData; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; @@ -45,7 +45,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class LargeBoilerMachine extends WorkableMultiblockMachine implements IExplosionMachine, IDisplayUIMachine { +public class LargeBoilerMachine extends WorkableMultiblockMachine implements IDisplayUIMachine { public static final int TICKS_PER_STEAM_GENERATION = 5; @@ -155,15 +155,15 @@ protected void updateCurrentTemperature() { // check explosion if (drained < maxDrain) { - doExplosion(2f); + GTUtil.doExplosion(getLevel(), getBlockPos(), 2f); var center = getBlockPos().below().relative(getFrontFacing().getOpposite()); if (GTValues.RNG.nextInt(100) > 80) { - doExplosion(center, 2f); + GTUtil.doExplosion(getLevel(), center, 2f); } for (Direction x : Direction.Plane.HORIZONTAL) { for (Direction y : Direction.Plane.HORIZONTAL) { if (GTValues.RNG.nextInt(100) > 80) { - doExplosion(center.relative(x).relative(y), 2f); + GTUtil.doExplosion(getLevel(), center.relative(x).relative(y), 2f); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java index 77ce4bf4d2d..78ee8dc9936 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java @@ -97,13 +97,9 @@ protected void randomDisplayTick(RandomSource random, float x, float y, float z) public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (!isRemote()) { - if (super.onUse(state, world, pos, player, hand, hit) == InteractionResult.SUCCESS) { - return InteractionResult.SUCCESS; - } if (FluidUtil.interactWithFluidHandler(player, hand, fuelTank)) { return InteractionResult.SUCCESS; } - return InteractionResult.PASS; } return super.onUse(state, world, pos, player, hand, hit); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java index a4d45488261..664a0cb5a73 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java @@ -47,8 +47,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SteamMinerMachine extends SteamWorkableMachine implements IMiner, IControllable, IExhaustVentMachine, - IUIMachine, IMachineLife, IDataInfoProvider { +public class SteamMinerMachine extends SteamWorkableMachine implements IControllable, IExhaustVentMachine, + IUIMachine, IDataInfoProvider, IMiner { @Getter @SaveField @@ -89,9 +89,10 @@ protected NotifiableItemStackHandler createExportItemHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); getRecipeLogic().onRemove(); - clearInventory(exportItems.storage); + exportItems.dropInventoryInWorld(); } @Override @@ -211,6 +212,7 @@ void addDisplayText2(List textList) { textList.add(Component.translatable("gtceu.machine.miner.minez", this.getRecipeLogic().getMineZ())); } + @Override public boolean drainInput(boolean simulate) { long resultSteam = steamTank.getFluidInTank(0).getAmount() - energyPerTick; if (!this.isVentingBlocked() && resultSteam >= 0L && resultSteam <= steamTank.getTankCapacity(0)) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java index 667b50e615f..65601e402c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -36,7 +35,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SteamSolidBoilerMachine extends SteamBoilerMachine implements IMachineLife { +public class SteamSolidBoilerMachine extends SteamBoilerMachine { public static final Object2BooleanMap FUEL_CACHE = new Object2BooleanOpenHashMap<>(); @@ -138,8 +137,9 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public void onMachineRemoved() { - clearInventory(fuelHandler.storage); - clearInventory(ashHandler.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + fuelHandler.dropInventoryInWorld(); + ashHandler.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 9fa3d889e57..31fee41b765 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -27,7 +26,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class BufferMachine extends TieredMachine implements IMachineLife, IFancyUIMachine { +public class BufferMachine extends TieredMachine implements IFancyUIMachine { public static final int TANK_SIZE = 64000; @@ -106,7 +105,8 @@ public Widget createUIWidget() { //////////////////////////////// @Override - public void onMachineRemoved() { - clearInventory(inventory.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + inventory.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index 6b4bf1104a8..c7a40d45e9c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -38,8 +38,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CrateMachine extends MetaMachine implements IUIMachine, IMachineLife, - IDropSaveMachine, IInteractedMachine { +public class CrateMachine extends MetaMachine implements IUIMachine, + IDropSaveMachine { public static final BooleanProperty TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; @@ -103,7 +103,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.sidedSuccess(world.isClientSide); } } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } @Override @@ -135,7 +135,8 @@ public boolean saveBreak() { } @Override - public void onMachineRemoved() { - if (!isTaped) clearInventory(inventory.storage); + public void onMachineDestroyed() { + super.onMachineDestroyed(); + if (!isTaped) inventory.dropInventoryInWorld(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index 8a491110788..ec436be4bfa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -102,7 +102,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return updateStored(heldItem); } } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java index de4aa043e68..d7e5cd1972a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java @@ -131,7 +131,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play .orElse(InteractionResult.PASS); } } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index 243d8aa7e4d..83398fdd0be 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -35,7 +34,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class DrumMachine extends MetaMachine implements IDropSaveMachine, IInteractedMachine { +public class DrumMachine extends MetaMachine implements IDropSaveMachine { @Getter private final int maxStoredFluids; @@ -132,7 +131,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return world.isClientSide ? InteractionResult.SUCCESS : InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 4a0279a337f..d711ccafa20 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; @@ -57,7 +56,7 @@ import java.util.function.Predicate; @NotNullByDefault -public class QuantumChestMachine extends TieredMachine implements IInteractedMachine, IControllable, +public class QuantumChestMachine extends TieredMachine implements IControllable, IDropSaveMachine, IFancyUIMachine { /** @@ -188,6 +187,13 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play var remaining = cache.insertItem(0, held, false); player.setItemInHand(InteractionHand.MAIN_HAND, remaining); return InteractionResult.SUCCESS; + } else if (held.isEmpty()) { + var drained = cache.extractItem(0, player.isShiftKeyDown() ? stored.getMaxStackSize() : 1, false); + if (!drained.isEmpty()) { + if (!player.addItem(drained)) { + Block.popResourceFromFace(world, getBlockPos(), getFrontFacing(), drained); + } + } } else if (isDoubleHit(player.getUUID())) { for (var stack : player.getInventory().items) { if (!stack.isEmpty() && cache.canInsert(stack)) { @@ -198,29 +204,13 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play INTERACTION_LOGGER.put(player.getUUID(), System.currentTimeMillis()); return InteractionResult.SUCCESS; } - return InteractionResult.PASS; + return super.onUse(state, world, pos, player, hand, hit); } private static boolean isDoubleHit(UUID uuid) { return (System.currentTimeMillis() - INTERACTION_LOGGER.getLong(uuid)) < 300; } - @Override - public boolean onLeftClick(Player player, Level world, InteractionHand hand, BlockPos pos, Direction direction) { - if (direction == getFrontFacing() && !isRemote()) { - if (GTToolType.WRENCH.matchTags.stream().anyMatch(player.getItemInHand(hand)::is)) return false; - if (!stored.isEmpty()) { // pull - var drained = cache.extractItem(0, player.isShiftKeyDown() ? stored.getMaxStackSize() : 1, false); - if (!drained.isEmpty()) { - if (!player.addItem(drained)) { - Block.popResourceFromFace(world, getBlockPos(), getFrontFacing(), drained); - } - } - } - } - return IInteractedMachine.super.onLeftClick(player, world, hand, pos, direction); - } - public boolean isLocked() { return !lockedItem.getStackInSlot(0).isEmpty(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index 3f267084a31..dfaa3c775fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.machine.*; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; @@ -52,7 +51,7 @@ import java.util.function.Predicate; @NotNullByDefault -public class QuantumTankMachine extends TieredMachine implements IInteractedMachine, IControllable, +public class QuantumTankMachine extends TieredMachine implements IControllable, IDropSaveMachine, IFancyUIMachine { public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); @@ -160,7 +159,7 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return InteractionResult.SUCCESS; } } - return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); + return super.onUse(state, world, pos, player, hand, hit); } public boolean isLocked() { diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index e8245e61ab5..66737e82ce5 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.BlockAttributes; -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; import com.gregtechceu.gtceu.api.capability.IMedicalConditionTracker; @@ -20,7 +19,6 @@ import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; import com.gregtechceu.gtceu.api.registry.GTRegistries; @@ -87,7 +85,6 @@ import net.minecraftforge.event.*; import net.minecraftforge.event.entity.living.*; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.ChunkWatchEvent; import net.minecraftforge.event.level.LevelEvent; @@ -222,18 +219,6 @@ public static void onMobEffectEvent(MobEffectEvent.Applicable event) { } } - @SubscribeEvent - public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { - var blockState = event.getLevel().getBlockState(event.getPos()); - if (blockState.hasBlockEntity() && blockState.getBlock() instanceof MetaMachineBlock block && - MetaMachine.getMachine(event.getLevel(), event.getPos()) instanceof IInteractedMachine machine) { - if (machine.onLeftClick(event.getEntity(), event.getLevel(), event.getHand(), event.getPos(), - event.getFace())) { - event.setCanceled(true); - } - } - } - @SubscribeEvent public static void onBreakEvent(BlockEvent.BreakEvent event) { var machine = MetaMachine.getMachine(event.getLevel(), event.getPos()); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java index c2a08654ab1..fb72184cb79 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEItemConfigWidget; @@ -33,7 +32,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputBusPartMachine extends MEBusPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + implements IDataStickInteractable, IHasCircuitSlot { protected final static int CONFIG_SIZE = 16; @@ -48,7 +47,7 @@ public MEInputBusPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { flushInventory(); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java index 747b6e45d3a..1de078d911c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEFluidConfigWidget; @@ -34,7 +33,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputHatchPartMachine extends MEHatchPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + implements IDataStickInteractable, IHasCircuitSlot { protected ExportOnlyAEFluidList aeFluidHandler; @@ -47,7 +46,8 @@ public MEInputHatchPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); flushInventory(); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java index 50632bf3161..8c7a45b516b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java @@ -3,8 +3,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -33,7 +31,7 @@ */ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputBusPartMachine extends MEBusPartMachine implements IMachineLife, IInteractedMachine { +public class MEOutputBusPartMachine extends MEBusPartMachine { @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation @@ -53,7 +51,7 @@ protected NotifiableItemStackHandler createInventory() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java index 28bb3c72746..268dbdf0831 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; @@ -32,7 +31,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputHatchPartMachine extends MEHatchPartMachine implements IMachineLife { +public class MEOutputHatchPartMachine extends MEHatchPartMachine { @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation @@ -52,7 +51,8 @@ protected NotifiableFluidTank createTank(int initialCapacity, int slots) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index 46c6131fd6d..f26981ac996 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -415,9 +415,9 @@ public PatternContainerGroup getTerminalGroup() { } @Override - public void onMachineRemoved() { - clearInventory(patternInventory); - clearInventory(shareInventory); + public void onMachineDestroyed() { + patternInventory.dropInventoryInWorld(getLevel(), getBlockPos()); + shareInventory.dropInventoryInWorld(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index ebbc916d1fb..aefb82537cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -32,8 +31,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine - implements IMachineLife, IDataStickInteractable { +public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine implements IDataStickInteractable { @Getter private final ProxySlotRecipeHandler proxySlotRecipeHandler; @@ -96,7 +94,8 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var buf = getBuffer(); if (buf != null) { buf.removeProxy(this); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 3b42d4f2b80..81cf922611e 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -650,4 +650,27 @@ public static T getLast(List list) { public static ArrayList list(T obj) { return new ArrayList<>(List.of(obj)); } + + public static void doExplosion(Level level, BlockPos pos, float explosionPower) { + level.removeBlock(pos, false); + level.explode(null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + explosionPower, ConfigHolder.INSTANCE.machines.doesExplosionDamagesTerrain ? + Level.ExplosionInteraction.BLOCK : Level.ExplosionInteraction.NONE); + } + + public static void setOnFire(Level level, BlockPos pos, double additionalFireChance) { + boolean isFirstFireSpawned = false; + for (Direction side : DIRECTIONS) { + if (level.isEmptyBlock(pos.relative(side))) { + if (!isFirstFireSpawned) { + level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); + if (!level.isEmptyBlock(pos.relative(side))) { + isFirstFireSpawned = true; + } + } else if (additionalFireChance >= GTValues.RNG.nextDouble() * 100) { + level.setBlock(pos.relative(side), Blocks.FIRE.defaultBlockState(), 11); + } + } + } + } }