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/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/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/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/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 84a2b92f994..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,44 +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.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 { +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) { @@ -55,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 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 { @@ -103,16 +68,4 @@ public void modifyDrops(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; - } }