From 655cc902d3df19a1ac2bfaa38cc928ed629d0171 Mon Sep 17 00:00:00 2001 From: BlueWeabo Date: Sat, 1 Apr 2023 17:06:06 +0300 Subject: Implement Power Logic, Pollution Logic and Processing Logic for MuTEs and many other things (#1823) * update bs 2 * fuel consumption and energy implementation. clean up * don't register XD * some clean up * coke oven work * semi-working coke oven somehow i broke the activating of the multiblock * power logic * PowerLogic * clean up, saving loading nbt * small cleanup and pollution * pollution working :P * Energy mostly working, wallsharing * processing logic * fix npe and deregister * review requests * missed one * remove extra 0 --- src/main/java/gregtech/api/enums/GT_Values.java | 19 +- src/main/java/gregtech/api/enums/TickTime.java | 10 + .../interfaces/tileentity/IEnergyConnected.java | 74 +- .../java/gregtech/api/logic/PollutionLogic.java | 17 + src/main/java/gregtech/api/logic/PowerLogic.java | 130 ++ .../java/gregtech/api/logic/ProcessingLogic.java | 97 ++ .../api/logic/interfaces/PollutionLogicHost.java | 8 + .../api/logic/interfaces/PowerLogicHost.java | 16 + .../api/logic/interfaces/ProcessingLogicHost.java | 8 + .../MultiTileEntityClassContainer.java | 38 +- .../multitileentity/MultiTileEntityRegistry.java | 5 +- .../multitileentity/base/BaseMultiTileEntity.java | 1414 -------------------- .../base/BaseNontickableMultiTileEntity.java | 58 - .../base/BaseTickableMultiTileEntity.java | 121 -- .../api/multitileentity/base/MultiTileEntity.java | 1392 +++++++++++++++++++ .../base/NonTickableMultiTileEntity.java | 58 + .../base/TickableMultiTileEntity.java | 113 ++ .../multitileentity/enums/GT_MultiTileCasing.java | 19 + .../multitileentity/enums/GT_MultiTileMachine.java | 19 + .../interfaces/IMultiBlockController.java | 7 +- .../interfaces/IMultiTileMachine.java | 10 + .../machine/MultiTileBasicMachine.java | 751 +++++++++-- .../multiblock/base/MultiBlockController.java | 1008 ++++++++------ .../multiblock/base/MultiBlockPart.java | 202 +-- .../multiblock/base/MultiBlockPowerController.java | 44 + .../multiblock/base/MultiBlock_Stackable.java | 7 +- .../multiblock/base/WallShareablePart.java | 107 ++ .../multiblock/casing/AdvancedCasing.java | 36 - .../multiblock/casing/FunctionalCasing.java | 27 + .../multiblock/casing/InventoryUpgrade.java | 94 -- .../multiblock/casing/UpgradeCasing.java | 31 + .../api/net/GT_Packet_MultiTileEntity.java | 54 +- 32 files changed, 3530 insertions(+), 2464 deletions(-) create mode 100644 src/main/java/gregtech/api/enums/TickTime.java create mode 100644 src/main/java/gregtech/api/logic/PollutionLogic.java create mode 100644 src/main/java/gregtech/api/logic/PowerLogic.java create mode 100644 src/main/java/gregtech/api/logic/ProcessingLogic.java create mode 100644 src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java create mode 100644 src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java create mode 100644 src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java delete mode 100644 src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java delete mode 100644 src/main/java/gregtech/api/multitileentity/base/BaseNontickableMultiTileEntity.java delete mode 100644 src/main/java/gregtech/api/multitileentity/base/BaseTickableMultiTileEntity.java create mode 100644 src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java create mode 100644 src/main/java/gregtech/api/multitileentity/base/NonTickableMultiTileEntity.java create mode 100644 src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java create mode 100644 src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java create mode 100644 src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileMachine.java create mode 100644 src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileMachine.java create mode 100644 src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPowerController.java create mode 100644 src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java delete mode 100644 src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java create mode 100644 src/main/java/gregtech/api/multitileentity/multiblock/casing/FunctionalCasing.java delete mode 100644 src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java create mode 100644 src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java (limited to 'src/main/java/gregtech/api') diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java index 14cca69f05..d06e70b0b5 100644 --- a/src/main/java/gregtech/api/enums/GT_Values.java +++ b/src/main/java/gregtech/api/enums/GT_Values.java @@ -232,7 +232,7 @@ public class GT_Values { // Machines ACTIVE = "gt.active", // Boolean FLUID_OUT = "gt.fluidout", // Output Fluid - ITEM_OUT = "gt,itemout", // Output Item + ITEM_OUT = "gt.itemout", // Output Item PARALLEL = "gt.parallel", // Number TANK_CAPACITY = "gt.tankcap", // Number TANK_IN = "gt.tank.in.", // FluidStack @@ -242,6 +242,14 @@ public class GT_Values { INV_OUTPUT_SIZE = "gt.invsize.out", // Number INV_INPUT_LIST = "gt.invlist.in", // NBT List INV_OUTPUT_LIST = "gt.invlist.out", // NBT List + VOLTAGE = "gt.voltage", // Number + AMPERAGE = "gt.amperage", // Number + STORED_ENERGY = "gt.stored.energy", // Number + MAXIMUM_ENERGY = "gt.maximum.energy", // Number + EUT_CONSUMPTION = "gt.eut.consumption", // Number + BURN_TIME_LEFT = "gt.burn.time.left", // Number + TOTAL_BURN_TIME = "gt.total.burn.time", // Number + ALLOWED_WORK = "gt.allowed.work", // Boolean // MultiBlock STRUCTURE_OK = "gt.structure.ok", ROTATION = "gt.eRotation", FLIP = "gt.eFlip", TARGET = "gt.target", // Boolean @@ -255,6 +263,15 @@ public class GT_Values { UPGRADE_INVENTORY_NAME = "gt.invname.upg", // String UPGRADE_INVENTORIES_INPUT = "gt.invlist.upg.in", // NBT List UPGRADE_INVENTORIES_OUTPUT = "gt.invlist.upg.out", // NBT List + SEPARATE_INPUTS = "gt.separate.inputs", // Boolean + + // Logic + POWER_LOGIC = "gt.power.logic", // NBT Tag + POWER_LOGIC_STORED_ENERGY = "gt.power.logic.stored.energy", // Number + POWER_LOGIC_ENERGY_CAPACITY = "gt.power.logic.energy.capacity", // Number + POWER_LOGIC_VOLTAGE = "gt.power.logic.voltage", // Number + POWER_LOGIC_AMPERAGE = "gt.power.logic.voltage", // Number + POWER_LOGIC_TYPE = "gt.power.logic.type", // Number empty_ = ""; } diff --git a/src/main/java/gregtech/api/enums/TickTime.java b/src/main/java/gregtech/api/enums/TickTime.java new file mode 100644 index 0000000000..28c68e172f --- /dev/null +++ b/src/main/java/gregtech/api/enums/TickTime.java @@ -0,0 +1,10 @@ +package gregtech.api.enums; + +public class TickTime { + + public static final int TICK = 1; + public static final int SECOND = TICK * 20; + public static final int MINUTE = SECOND * 60; + public static final int HOUR = MINUTE * 60; + public static final int DAY = HOUR * 24; +} diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java index 4fcfc861bb..92d2482014 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IEnergyConnected.java @@ -5,6 +5,8 @@ import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyReceiver; import gregtech.api.GregTech_API; +import gregtech.api.logic.PowerLogic; +import gregtech.api.logic.interfaces.PowerLogicHost; import gregtech.api.util.GT_Utility; import ic2.api.energy.tile.IEnergySink; @@ -58,37 +60,49 @@ public interface IEnergyConnected extends IColoredTileEntity { */ public static long emitEnergyToNetwork(long aVoltage, long aAmperage, IEnergyConnected aEmitter) { long rUsedAmperes = 0; - if (aEmitter instanceof IHasWorldObjectAndCoords) { - IHasWorldObjectAndCoords emitterTile = (IHasWorldObjectAndCoords) aEmitter; - for (byte i = 0, j = 0; i < 6 && aAmperage > rUsedAmperes; i++) { - if (aEmitter.outputsEnergyTo(i)) { - j = GT_Utility.getOppositeSide(i); - final TileEntity tTileEntity = emitterTile.getTileEntityAtSide(i); - if (tTileEntity instanceof IEnergyConnected) { - if (aEmitter.getColorization() >= 0) { - final byte tColor = ((IEnergyConnected) tTileEntity).getColorization(); - if (tColor >= 0 && tColor != aEmitter.getColorization()) continue; - } - rUsedAmperes += ((IEnergyConnected) tTileEntity) - .injectEnergyUnits(j, aVoltage, aAmperage - rUsedAmperes); + if (!(aEmitter instanceof IHasWorldObjectAndCoords)) { + return 0; + } + + IHasWorldObjectAndCoords emitterTile = (IHasWorldObjectAndCoords) aEmitter; + for (byte i = 0, j = 0; i < 6 && aAmperage > rUsedAmperes; i++) { + if (!aEmitter.outputsEnergyTo(i)) { + continue; + } - } else if (tTileEntity instanceof IEnergySink) { - if (((IEnergySink) tTileEntity) - .acceptsEnergyFrom((TileEntity) aEmitter, ForgeDirection.getOrientation(j))) { - while (aAmperage > rUsedAmperes && ((IEnergySink) tTileEntity).getDemandedEnergy() > 0 - && ((IEnergySink) tTileEntity) - .injectEnergy(ForgeDirection.getOrientation(j), aVoltage, aVoltage) - < aVoltage) - rUsedAmperes++; - } - } else if (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver) { - final ForgeDirection tDirection = ForgeDirection.getOrientation(i).getOpposite(); - final int rfOut = GT_Utility.safeInt(aVoltage * GregTech_API.mEUtoRF / 100); - if (((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, true) == rfOut) { - ((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, false); - rUsedAmperes++; - } - } + j = GT_Utility.getOppositeSide(i); + final TileEntity tTileEntity = emitterTile.getTileEntityAtSide(i); + if (tTileEntity instanceof PowerLogicHost) { + PowerLogicHost host = (PowerLogicHost) tTileEntity; + + PowerLogic logic = host.getPowerLogic(j); + if (logic == null || logic.isEnergyReceiver()) { + continue; + } + + rUsedAmperes += logic.injectEnergy(aVoltage, aAmperage - rUsedAmperes); + } else if (tTileEntity instanceof IEnergyConnected) { + if (aEmitter.getColorization() >= 0) { + final byte tColor = ((IEnergyConnected) tTileEntity).getColorization(); + if (tColor >= 0 && tColor != aEmitter.getColorization()) continue; + } + rUsedAmperes += ((IEnergyConnected) tTileEntity) + .injectEnergyUnits(j, aVoltage, aAmperage - rUsedAmperes); + + } else if (tTileEntity instanceof IEnergySink) { + if (((IEnergySink) tTileEntity) + .acceptsEnergyFrom((TileEntity) aEmitter, ForgeDirection.getOrientation(j))) { + while (aAmperage > rUsedAmperes && ((IEnergySink) tTileEntity).getDemandedEnergy() > 0 + && ((IEnergySink) tTileEntity) + .injectEnergy(ForgeDirection.getOrientation(j), aVoltage, aVoltage) < aVoltage) + rUsedAmperes++; + } + } else if (GregTech_API.mOutputRF && tTileEntity instanceof IEnergyReceiver) { + final ForgeDirection tDirection = ForgeDirection.getOrientation(i).getOpposite(); + final int rfOut = GT_Utility.safeInt(aVoltage * GregTech_API.mEUtoRF / 100); + if (((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, true) == rfOut) { + ((IEnergyReceiver) tTileEntity).receiveEnergy(tDirection, rfOut, false); + rUsedAmperes++; } } } diff --git a/src/main/java/gregtech/api/logic/PollutionLogic.java b/src/main/java/gregtech/api/logic/PollutionLogic.java new file mode 100644 index 0000000000..8e1172e105 --- /dev/null +++ b/src/main/java/gregtech/api/logic/PollutionLogic.java @@ -0,0 +1,17 @@ +package gregtech.api.logic; + +public class PollutionLogic { + + private int pollutionAmount; + + public PollutionLogic() {} + + public PollutionLogic setPollutionAmount(int pollutionAmount) { + this.pollutionAmount = pollutionAmount; + return this; + } + + public int getPollutionAmount() { + return pollutionAmount; + } +} diff --git a/src/main/java/gregtech/api/logic/PowerLogic.java b/src/main/java/gregtech/api/logic/PowerLogic.java new file mode 100644 index 0000000000..8044a2f979 --- /dev/null +++ b/src/main/java/gregtech/api/logic/PowerLogic.java @@ -0,0 +1,130 @@ +package gregtech.api.logic; + +import net.minecraft.nbt.NBTTagCompound; + +import gregtech.api.enums.GT_Values.NBT; + +public class PowerLogic { + + public static int NONE = 0; + public static int RECEIVER = 1; + public static int EMITTER = 2; + public static int BOTH = RECEIVER | EMITTER; + private long storedEnergy = 0; + private long energyCapacity = 0; + private long voltage = 0; + private long amperage = 0; + private int type = 0; + + public PowerLogic() {} + + public PowerLogic setMaxVoltage(long voltage) { + this.voltage = voltage; + return this; + } + + public PowerLogic setEnergyCapacity(long energyCapacity) { + this.energyCapacity = energyCapacity; + return this; + } + + public PowerLogic setAmperage(long amperage) { + this.amperage = amperage; + return this; + } + + public PowerLogic setType(int type) { + this.type = type; + return this; + } + + public boolean addEnergyUnsafe(long totalEUAdded) { + if (storedEnergy + totalEUAdded >= energyCapacity) { + return false; + } + + storedEnergy += totalEUAdded; + return true; + } + + public boolean addEnergy(long voltage, long amperage) { + if (voltage > this.voltage) { + return false; + } + + return addEnergyUnsafe(voltage * amperage); + } + + public boolean addEnergy(long voltage) { + return addEnergy(voltage, 1); + } + + public long injectEnergy(long voltage, long availableAmperage) { + long usedAmperes = 0; + while (addEnergy(voltage, 1) && usedAmperes < amperage) { + usedAmperes++; + } + + return usedAmperes; + } + + public boolean removeEnergyUnsafe(long totalEURemoved) { + if (storedEnergy - totalEURemoved < 0) { + return false; + } + + storedEnergy -= totalEURemoved; + return true; + } + + public boolean removeEnergy(long voltage, long amperage) { + if (voltage > this.voltage) { + return false; + } + + return removeEnergyUnsafe(voltage * amperage); + } + + public boolean removeEnergy(long voltage) { + return removeEnergy(voltage, 1); + } + + public long getCapacity() { + return energyCapacity; + } + + public long getVoltage() { + return voltage; + } + + public long getStoredEnergy() { + return storedEnergy; + } + + public boolean isEnergyReceiver() { + return (type & RECEIVER) > 0; + } + + public boolean isEnergyEmitter() { + return (type & EMITTER) > 0; + } + + public void writeToNBT(NBTTagCompound nbt) { + NBTTagCompound powerLogic = new NBTTagCompound(); + powerLogic.setLong(NBT.POWER_LOGIC_ENERGY_CAPACITY, energyCapacity); + powerLogic.setLong(NBT.POWER_LOGIC_STORED_ENERGY, storedEnergy); + powerLogic.setLong(NBT.POWER_LOGIC_AMPERAGE, amperage); + powerLogic.setLong(NBT.POWER_LOGIC_VOLTAGE, voltage); + powerLogic.setInteger(NBT.POWER_LOGIC_TYPE, type); + nbt.setTag(NBT.POWER_LOGIC, powerLogic); + } + + public void loadFromNBT(NBTTagCompound nbt) { + NBTTagCompound powerLogic = nbt.getCompoundTag(NBT.POWER_LOGIC); + energyCapacity = powerLogic.getLong(NBT.POWER_LOGIC_ENERGY_CAPACITY); + storedEnergy = powerLogic.getLong(NBT.POWER_LOGIC_STORED_ENERGY); + amperage = powerLogic.getLong(NBT.POWER_LOGIC_AMPERAGE); + voltage = powerLogic.getLong(NBT.POWER_LOGIC_VOLTAGE); + type = powerLogic.getInteger(NBT.POWER_LOGIC_TYPE); + } +} diff --git a/src/main/java/gregtech/api/logic/ProcessingLogic.java b/src/main/java/gregtech/api/logic/ProcessingLogic.java new file mode 100644 index 0000000000..fa0d285401 --- /dev/null +++ b/src/main/java/gregtech/api/logic/ProcessingLogic.java @@ -0,0 +1,97 @@ +package gregtech.api.logic; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import gregtech.api.util.GT_Recipe.GT_Recipe_Map; + +public abstract class ProcessingLogic { + + protected GT_Recipe_Map recipeMap; + protected ItemStack[] inputItems; + protected ItemStack[] outputItems; + protected ItemStack[] currentOutputItems; + protected FluidStack[] inputFluids; + protected FluidStack[] outputFluids; + protected FluidStack[] currentOutputFluids; + protected long eut; + protected long duration; + + public ProcessingLogic() {} + + public ProcessingLogic setInputItems(ItemStack... itemInputs) { + this.inputItems = itemInputs; + return this; + } + + public ProcessingLogic setInputFluids(FluidStack... fluidInputs) { + this.inputFluids = fluidInputs; + return this; + } + + public ProcessingLogic setOutputItems(ItemStack... itemOutputs) { + this.outputItems = itemOutputs; + return this; + } + + public ProcessingLogic setOutputFluids(FluidStack... fluidOutputs) { + this.outputFluids = fluidOutputs; + return this; + } + + public ProcessingLogic setCurrentOutputItems(ItemStack... currentOutputItems) { + this.currentOutputItems = currentOutputItems; + return this; + } + + public ProcessingLogic setCurrentOutputFluids(FluidStack... currentOutputFluids) { + this.currentOutputFluids = currentOutputFluids; + return this; + } + + public ProcessingLogic setRecipeMap(GT_Recipe_Map recipeMap) { + this.recipeMap = recipeMap; + return this; + } + + public ProcessingLogic setDuration(long duration) { + this.duration = duration; + return this; + } + + public ProcessingLogic setEut(long eut) { + this.eut = eut; + return this; + } + + /** + * Clears everything stored in the Processing Logic other than the Recipe map used + */ + public ProcessingLogic clear() { + this.inputItems = null; + this.inputFluids = null; + this.outputItems = null; + this.outputFluids = null; + this.eut = 0; + this.duration = 0; + return this; + } + + public abstract boolean process(); + + public ItemStack[] getOutputItems() { + return outputItems; + } + + public FluidStack[] getOutputFluids() { + return outputFluids; + } + + public long getDuration() { + return duration; + } + + public long getEut() { + return eut; + } +} diff --git a/src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java new file mode 100644 index 0000000000..657efbb74d --- /dev/null +++ b/src/main/java/gregtech/api/logic/interfaces/PollutionLogicHost.java @@ -0,0 +1,8 @@ +package gregtech.api.logic.interfaces; + +import gregtech.api.logic.PollutionLogic; + +public interface PollutionLogicHost { + + PollutionLogic getPollutionLogic(); +} diff --git a/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java new file mode 100644 index 0000000000..8e504674aa --- /dev/null +++ b/src/main/java/gregtech/api/logic/interfaces/PowerLogicHost.java @@ -0,0 +1,16 @@ +package gregtech.api.logic.interfaces; + +import gregtech.api.logic.PowerLogic; + +public interface PowerLogicHost { + + PowerLogic getPowerLogic(byte side); + + default boolean isEnergyReceiver() { + return false; + } + + default boolean isEnergyEmitter() { + return false; + } +} diff --git a/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java b/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java new file mode 100644 index 0000000000..55418208b0 --- /dev/null +++ b/src/main/java/gregtech/api/logic/interfaces/ProcessingLogicHost.java @@ -0,0 +1,8 @@ +package gregtech.api.logic.interfaces; + +import gregtech.api.logic.ProcessingLogic; + +public interface ProcessingLogicHost { + + ProcessingLogic getProcessingLogic(); +} diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java index 84cbdfb529..195fed3100 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java @@ -8,9 +8,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Tuple; import gregtech.api.enums.Materials; -import gregtech.api.multitileentity.base.BaseMultiTileEntity; -import gregtech.api.multitileentity.multiblock.casing.AdvancedCasing; +import gregtech.api.multitileentity.base.MultiTileEntity; +import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing; +import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; import gregtech.api.util.GT_Util; +import gregtech.common.tileentities.casings.upgrade.InventoryUpgrade; public class MultiTileEntityClassContainer { @@ -19,9 +21,9 @@ public class MultiTileEntityClassContainer { private String mCategoryName; public final short mID; - public Class mClass; + public Class mClass; public MultiTileEntityBlock mBlock; - public BaseMultiTileEntity mCanonicalTileEntity; + public MultiTileEntity mCanonicalTileEntity; public NBTTagCompound mParameters; // These have defaults @@ -30,7 +32,7 @@ public class MultiTileEntityClassContainer { public boolean mHidden = false; public MultiTileEntityClassContainer(MultiTileEntityRegistry aRegistry, int aID, - Class aClass) { + Class aClass) { /* Start the Builder */ mRegistry = new WeakReference<>(aRegistry); mID = (short) aID; @@ -127,14 +129,13 @@ public class MultiTileEntityClassContainer { } public MultiTileEntityClassContainer tier(int aTier) { - verifyDescendentOf(AdvancedCasing.class); - + verifyDescendentOfMultiple(true, UpgradeCasing.class, FunctionalCasing.class); mParameters.setInteger(NBT.TIER, aTier); return this; } public MultiTileEntityClassContainer upgradeInventorySize(int aSize) { - verifyDescendentOf(AdvancedCasing.class); + verifyDescendentOf(InventoryUpgrade.class); mParameters.setInteger(NBT.UPGRADE_INVENTORY_SIZE, aSize); return this; @@ -161,4 +162,25 @@ public class MultiTileEntityClassContainer { "Expected a descendent of " + cls.getName() + " got " + mClass.getName() + " instead."); } } + + private void verifyDescendentOfMultiple(boolean onlyOne, Class... classes) { + boolean atLeastOne = false; + String classNames = ""; + for (Class cls : classes) { + classNames += cls.getName() + " "; + if (!onlyOne) { + verifyDescendentOf(cls); + atLeastOne = true; + } else { + if (cls.isAssignableFrom(mClass)) { + atLeastOne = true; + } + } + } + + if (!atLeastOne) { + throw new IllegalArgumentException( + "Expected a descendent of any of these " + classNames + " got " + mClass.getName() + " instead."); + } + } } diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java index 589f7ef8a6..9fc35963b3 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java @@ -25,7 +25,7 @@ import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap; import cpw.mods.fml.common.registry.GameRegistry; import gregtech.api.GregTech_API; import gregtech.api.enums.GT_Values; -import gregtech.api.multitileentity.base.BaseMultiTileEntity; +import gregtech.api.multitileentity.base.MultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_Util; @@ -75,6 +75,7 @@ public class MultiTileEntityRegistry { "The MultiTileEntity Registry must be initialised during Preload Phase and not before"); mNameInternal = aNameInternal; mBlock = aBlock; + GT_FML_LOGGER.info(aNameInternal + " " + Block.getIdFromBlock(aBlock) + "This is the answer"); mBlock.mMultiTileEntityRegistry = this; REGISTRIES.put(new ItemStack(Item.getItemFromBlock(aBlock), 1, GT_Values.W), this); NAMED_REGISTRIES.put(mNameInternal, this); @@ -96,7 +97,7 @@ public class MultiTileEntityRegistry { return NAMED_REGISTRIES.get(aRegistryName); } - public MultiTileEntityClassContainer create(int aID, Class aClass) { + public MultiTileEntityClassContainer create(int aID, Class aClass) { return new MultiTileEntityClassContainer(this, aID, aClass); } diff --git a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java deleted file mode 100644 index 06ae77afe1..0000000000 --- a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java +++ /dev/null @@ -1,1414 +0,0 @@ -package gregtech.api.multitileentity.base; - -import static gregtech.GT_Mod.GT_FML_LOGGER; -import static gregtech.api.enums.GT_Values.NBT; -import static gregtech.api.enums.GT_Values.OPOS; -import static gregtech.api.enums.GT_Values.SIDE_WEST; -import static gregtech.api.enums.GT_Values.VALID_SIDES; -import static gregtech.api.enums.GT_Values.emptyIconContainerArray; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.Packet; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.Explosion; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidTank; - -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import gregtech.api.GregTech_API; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.Materials; -import gregtech.api.enums.SoundResource; -import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_UIInfos; -import gregtech.api.interfaces.IIconContainer; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.IGregtechWailaProvider; -import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords; -import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.api.metatileentity.GregTechTileClientEvents; -import gregtech.api.multitileentity.MultiTileEntityBlockInternal; -import gregtech.api.multitileentity.MultiTileEntityClassContainer; -import gregtech.api.multitileentity.MultiTileEntityRegistry; -import gregtech.api.multitileentity.interfaces.IMultiBlockPart; -import gregtech.api.multitileentity.interfaces.IMultiTileEntity; -import gregtech.api.multitileentity.multiblock.casing.InventoryUpgrade; -import gregtech.api.net.GT_Packet_MultiTileEntity; -import gregtech.api.net.GT_Packet_New; -import gregtech.api.objects.GT_ItemStack; -import gregtech.api.objects.XSTR; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; -import gregtech.api.util.GT_Util; -import gregtech.api.util.GT_Utility; -import gregtech.common.render.GT_MultiTexture; -import gregtech.common.render.IRenderedBlock; - -public abstract class BaseMultiTileEntity extends CoverableTileEntity - implements IMultiTileEntity, IHasWorldObjectAndCoords, IRenderedBlock, IGregtechWailaProvider { - - public IIconContainer[] mTextures = emptyIconContainerArray; - // public IIconContainer[] mTexturesFront = emptyIconContainerArray; - - // Makes a Bounding Box without having to constantly specify the Offset Coordinates. - protected static final float[] PX_BOX = { 0, 0, 0, 1, 1, 1 }; - - public Materials mMaterial = Materials._NULL; - protected final boolean mIsTicking; // If this TileEntity is ticking at all - - // This Variable checks if this TileEntity should refresh when the Block is being set. That way you - // can turn this check off any time you need it. - protected boolean mShouldRefresh = true; - - protected boolean mDoesBlockUpdate = false; // This Variable is for a buffered Block Update. - protected boolean mForceFullSelectionBoxes = false; // This Variable is for forcing the Selection Box to be full. - protected boolean mNeedsUpdate = false; - protected boolean mInventoryChanged = false; - protected boolean mIsPainted = false; - protected byte mFacing = SIDE_WEST; // Default to WEST, so it renders facing Left in the inventory - protected byte mColor; - protected int mRGBa = GT_Values.UNCOLORED; - private short mMTEID = GT_Values.W, mMTERegistry = GT_Values.W; - private String mCustomName = null; - private String mOwnerName = ""; - private UUID mOwnerUuid = GT_Utility.defaultUuid; - private boolean mLockUpgrade = false; - - public BaseMultiTileEntity(boolean mIsTicking) { - this.mIsTicking = mIsTicking; - } - - @Override - public short getMultiTileEntityID() { - return mMTEID; - } - - @Override - public short getMultiTileEntityRegistryID() { - return mMTERegistry; - } - - @Override - public void onRegistrationFirst(MultiTileEntityRegistry aRegistry, short aID) { - GameRegistry.registerTileEntity(getClass(), getTileEntityName()); - } - - @Override - public void initFromNBT(NBTTagCompound aNBT, short aMTEID, short aMTERegistry) { - // Set ID and Registry ID. - mMTEID = aMTEID; - mMTERegistry = aMTERegistry; - // Read the Default Parameters from NBT. - if (aNBT != null) readFromNBT(aNBT); - } - - @Override - public void loadTextureNBT(NBTTagCompound aNBT) { - // Loading the registry - final String textureName = aNBT.getString(NBT.TEXTURE); - mTextures = new IIconContainer[] { - new Textures.BlockIcons.CustomIcon("multitileentity/base/" + textureName + "/bottom"), - new Textures.BlockIcons.CustomIcon("multitileentity/base/" + textureName + "/top"), - new Textures.BlockIcons.CustomIcon("multitileentity/base/" + textureName + "/side"), }; - } - - @Override - public void copyTextures() { - // Loading an instance - final TileEntity tCanonicalTileEntity = MultiTileEntityRegistry - .getCanonicalTileEntity(getMultiTileEntityRegistryID(), getMultiTileEntityID()); - if (tCanonicalTileEntity instanceof BaseMultiTileEntity) - mTextures = ((BaseMultiTileEntity) tCanonicalTileEntity).mTextures; - } - - @Override - public void readFromNBT(NBTTagCompound aNBT) { - // Check if this is a World/Chunk Loading Process calling readFromNBT. - if (mMTEID == GT_Values.W || mMTERegistry == GT_Values.W) { - // Yes it is, so read the ID Tags first. - mMTEID = aNBT.getShort(NBT.MTE_ID); - mMTERegistry = aNBT.getShort(NBT.MTE_REG); - // And add additional Default Parameters, in case the Mod updated with new ones. - final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mMTERegistry); - if (tRegistry != null) { - final MultiTileEntityClassContainer tClass = tRegistry.getClassContainer(mMTEID); - if (tClass != null) { - // Add the Default Parameters. Useful for things that differ between different tiers/types of the - // same machine - aNBT = GT_Util.fuseNBT(aNBT, tClass.mParameters); - } - } - } - // read the Coords if it has them. - if (aNBT.hasKey("x")) xCoord = aNBT.getInteger("x"); - if (aNBT.hasKey("y")) yCoord = aNBT.getInteger("y"); - if (aNBT.hasKey("z")) zCoord = aNBT.getInteger("z"); - // read the custom Name. - if (aNBT.hasKey(NBT.DISPAY)) mCustomName = aNBT.getCompoundTag(NBT.DISPAY).getString(NBT.CUSTOM_NAME); - - // And now everything else. - try { - if (aNBT.hasKey(NBT.MATERIAL)) mMaterial = Materials.get(aNBT.getString(NBT.MATERIAL)); - if (aNBT.hasKey(NBT.COLOR)) mRGBa = aNBT.getInteger(NBT.COLOR); - - mOwnerName = aNBT.getString(NBT.OWNER); - try { - mOwnerUuid = UUID.fromString(aNBT.getString(NBT.OWNER_UUID)); - } catch (IllegalArgumentException e) { - mOwnerUuid = null; - } - if (aNBT.hasKey(NBT.LOCK_UPGRADE)) mLockUpgrade = aNBT.getBoolean(NBT.LOCK_UPGRADE); - if (aNBT.hasKey(NBT.FACING)) mFacing = aNBT.getByte(NBT.FACING); - - readCoverNBT(aNBT); - readMultiTileNBT(aNBT); - - if (GregTech_API.sBlockIcons == null && aNBT.hasKey(NBT.TEXTURE)) { - loadTextureNBT(aNBT); - } else { - copyTextures(); - } - - if (mSidedRedstone.length != 6) mSidedRedstone = new byte[] { 15, 15, 15, 15, 15, 15 }; - - updateCoverBehavior(); - - } catch (Throwable e) { - GT_FML_LOGGER.error("readFromNBT", e); - } - } - - public void readMultiTileNBT(NBTTagCompound aNBT) { - /* Do Nothing */ - } - - @Override - public final void writeToNBT(NBTTagCompound aNBT) { - super.writeToNBT(aNBT); - // write the IDs - aNBT.setShort(NBT.MTE_ID, mMTEID); - aNBT.setShort(NBT.MTE_REG, mMTERegistry); - // write the Custom Name - if (GT_Utility.isStringValid(mCustomName)) { - final NBTTagCompound displayNBT; - if (aNBT.hasKey(NBT.DISPAY)) { - displayNBT = aNBT.getCompoundTag(NBT.DISPAY); - } else { - displayNBT = new NBTTagCompound(); - aNBT.setTag(NBT.DISPAY, displayNBT); - } - displayNBT.setString(NBT.CUSTOM_NAME, mCustomName); - } - - // write the rest - try { - aNBT.setString(NBT.OWNER, mOwnerName); - aNBT.setString(NBT.OWNER_UUID, mOwnerUuid == null ? "" : mOwnerUuid.toString()); - aNBT.setBoolean(NBT.LOCK_UPGRADE, mLockUpgrade); - aNBT.setByte(NBT.FACING, mFacing); - - writeCoverNBT(aNBT, false); - writeMultiTileNBT(aNBT); - } catch (Throwable e) { - GT_FML_LOGGER.error("writeToNBT", e); - } - } - - public void writeMultiTileNBT(NBTTagCompound aNBT) { - /* Do Nothing */ - } - - @Override - public NBTTagCompound writeItemNBT(NBTTagCompound aNBT) { - writeCoverNBT(aNBT, true); - - return aNBT; - } - - @Override - public boolean useModularUI() { - return false; - } - - @Override - public long getTimer() { - return 0; - } - - @Override - public int getRandomNumber(int aRange) { - return XSTR.XSTR_INSTANCE.nextInt(aRange); - } - - @Override - public TileEntity getTileEntity(int aX, int aY, int aZ) { - if (worldObj == null - || (ignoreUnloadedChunks && crossedChunkBorder(aX, aZ) && !worldObj.blockExists(aX, aY, aZ))) - return null; - return GT_Util.getTileEntity(worldObj, aX, aY, aZ, true); - } - - @Override - public boolean canUpdate() { - return mIsTicking && mShouldRefresh; - } - - @Override - public boolean shouldRefresh(Block aOldBlock, Block aNewBlock, int aOldMeta, int aNewMeta, World aWorld, int aX, - int aY, int aZ) { - return mShouldRefresh || aOldBlock != aNewBlock; - } - - @Override - public void updateEntity() { - super.updateEntity(); - if (mDoesBlockUpdate) doBlockUpdate(); - } - - public void doBlockUpdate() { - final Block tBlock = getBlock(getCoords()); - worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, tBlock); - if (this instanceof IMTE_IsProvidingStrongPower) for (byte tSide : GT_Values.ALL_VALID_SIDES) { - if (getBlockAtSide(tSide).isNormalCube( - worldObj, - xCoord + GT_Values.OFFX[tSide], - yCoord + GT_Values.OFFY[tSide], - zCoord + GT_Values.OFFZ[tSide])) { - worldObj.notifyBlocksOfNeighborChange( - xCoord + GT_Values.OFFX[tSide], - yCoord + GT_Values.OFFY[tSide], - zCoord + GT_Values.OFFZ[tSide], - tBlock, - OPOS[tSide]); - } - } - mDoesBlockUpdate = false; - } - - @Override - public boolean shouldSideBeRendered(byte aSide) { - final TileEntity tTileEntity = getTileEntityAtSideAndDistance(aSide, 1); - // TODO: check to an interface - // if (getBlockAtSide(aSide) == Blocks.glass) return false; - return tTileEntity instanceof IMultiTileEntity ? !((IMultiTileEntity) tTileEntity).isSurfaceOpaque(OPOS[aSide]) - : !getBlockAtSide(aSide).isOpaqueCube(); - } - - @Override - public boolean isSurfaceOpaque(byte aSide) { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public final IRenderedBlock passRenderingToObject(ItemStack aStack) { - return this; - } - - @Override - @SideOnly(Side.CLIENT) - public final IRenderedBlock passRenderingToObject(IBlockAccess aWorld, int aX, int aY, int aZ) { - return this; - } - - @Override - public int getRenderPasses(Block aBlock) { - return 1; - } - - @Override - public boolean usesRenderPass(int aRenderPass) { - return true; - } - - @Override - public boolean setBlockBounds(Block aBlock, int aRenderPass) { - return false; - } - - @Override - public boolean renderItem(Block aBlock, RenderBlocks aRenderer) { - return false; - } - - @Override - public boolean renderBlock(Block aBlock, RenderBlocks aRenderer, IBlockAccess aWorld, int aX, int aY, int aZ) { - return false; - } - - @Override - public ITexture[] getTexture(Block aBlock, byte aSide) { - return getTexture(aBlock, aSide, 1, VALID_SIDES); - } - - @Override - public final ITexture[] getTexture(Block aBlock, byte aSide, int aRenderPass, boolean[] aShouldSideBeRendered) { - if (!aShouldSideBeRendered[aSide]) return null; - - final ITexture coverTexture = getCoverTexture(aSide); - final ITexture[] textureUncovered = getTexture(aBlock, aSide, true, aRenderPass); - - if (coverTexture != null) { - return new ITexture[] { GT_MultiTexture.get(textureUncovered), coverTexture }; - } else { - return textureUncovered; - } - } - - @Override - public ITexture[] getTexture(Block aBlock, byte aSide, boolean isActive, int aRenderPass) { - // Top, bottom or side - aSide = (byte) Math.min(aSide, 2); - return new ITexture[] { TextureFactory.of(mTextures[aSide], GT_Util.getRGBaArray(mRGBa)) }; - } - - @Override - public void setCustomName(String aName) { - mCustomName = aName; - } - - @Override - public String getCustomName() { - return GT_Utility.isStringValid(mCustomName) ? mCustomName : null; - } - - @Override - public byte getColorization() { - // TODO - return 0; - } - - @Override - public boolean unpaint() { - return false; - } - - @Override - public byte setColorization(byte aColor) { - // TODO - return 0; - } - - @Override - public boolean isPainted() { - return false; - } - - @Override - public boolean paint(int aRGB) { - return false; - } - - @Override - public boolean isFacingValid(byte aFacing) { - return false; - } - - @Override - public byte getFrontFacing() { - return mFacing; - } - - /** - * Sets the main facing to {aSide} and update as appropriately - * - * @return Whether the facing was changed - */ - @Override - public boolean setMainFacing(byte aSide) { - if (!isValidFacing(aSide)) return false; - mFacing = aSide; - - issueClientUpdate(); - issueBlockUpdate(); - onFacingChange(); - checkDropCover(); - doEnetUpdate(); - - if (shouldTriggerBlockUpdate()) { - // If we're triggering a block update this will call onMachineBlockUpdate() - GregTech_API.causeMachineUpdate(worldObj, xCoord, yCoord, zCoord); - } else { - // If we're not trigger a cascading one, call the update here. - onMachineBlockUpdate(); - } - return true; - } - - @Override - public int getPaint() { - return this.mRGBa; - } - - @Override - public byte getBackFacing() { - return GT_Utility.getOppositeSide(mFacing); - } - - @Override - public boolean isValidFacing(byte aSide) { - return aSide >= 0 && aSide <= 6 && getValidFacings()[aSide]; - } - - @Override - public boolean[] getValidFacings() { - return VALID_SIDES; - } - - @Override - public void issueCoverUpdate(byte aSide) { - super.issueCoverUpdate(aSide); - issueClientUpdate(); - } - - public AxisAlignedBB box(double[] aBox) { - return AxisAlignedBB.getBoundingBox( - xCoord + aBox[0], - yCoord + aBox[1], - zCoord + aBox[2], - xCoord + aBox[3], - yCoord + aBox[4], - zCoord + aBox[5]); - } - - public boolean box(AxisAlignedBB aAABB, List aList, double aMinX, double aMinY, double aMinZ, - double aMaxX, double aMaxY, double aMaxZ) { - final AxisAlignedBB tBox = box(aMinX, aMinY, aMinZ, aMaxX, aMaxY, aMaxZ); - return tBox.intersectsWith(aAABB) && aList.add(tBox); - } - - @Override - public void onFacingChange() { - /* Do nothing */ - } - - public AxisAlignedBB box(double aMinX, double aMinY, double aMinZ, double aMaxX, double aMaxY, double aMaxZ) { - return AxisAlignedBB.getBoundingBox( - xCoord + aMinX, - yCoord + aMinY, - zCoord + aMinZ, - xCoord + aMaxX, - yCoord + aMaxY, - zCoord + aMaxZ); - } - - @Override - public boolean shouldTriggerBlockUpdate() { - return false; - } - - public boolean box(AxisAlignedBB aAABB, List aList, double[] aBox) { - final AxisAlignedBB tBox = box(aBox[0], aBox[1], aBox[2], aBox[3], aBox[4], aBox[5]); - return tBox.intersectsWith(aAABB) && aList.add(tBox); - } - - @Override - public void onMachineBlockUpdate() { - /* Do nothing */ - } - - public boolean box(AxisAlignedBB aAABB, List aList, float[] aBox) { - final AxisAlignedBB tBox = box(aBox[0], aBox[1], aBox[2], aBox[3], aBox[4], aBox[5]); - return tBox.intersectsWith(aAABB) && aList.add(tBox); - } - - public boolean box(AxisAlignedBB aAABB, List aList) { - final AxisAlignedBB tBox = box(PX_BOX); - return tBox.intersectsWith(aAABB) && aList.add(tBox); - } - - public AxisAlignedBB box(float[] aBox) { - return AxisAlignedBB.getBoundingBox( - xCoord + aBox[0], - yCoord + aBox[1], - zCoord + aBox[2], - xCoord + aBox[3], - yCoord + aBox[4], - zCoord + aBox[5]); - } - - public boolean box(Block aBlock) { - aBlock.setBlockBounds(0, 0, 0, 1, 1, 1); - return true; - } - - /** - * Causes a general Texture update. - *

- * Only used Client Side to mark Blocks dirty. - */ - @Override - public void issueTextureUpdate() { - if (!mIsTicking) { - markBlockForUpdate(); - } else { - mNeedsUpdate = true; - } - } - - public boolean box(Block aBlock, double[] aBox) { - aBlock.setBlockBounds( - (float) aBox[0], - (float) aBox[1], - (float) aBox[2], - (float) aBox[3], - (float) aBox[4], - (float) aBox[5]); - return true; - } - - protected void markBlockForUpdate() { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - // worldObj.func_147479_m(xCoord, yCoord, zCoord); - mNeedsUpdate = false; - } - - public boolean box(Block aBlock, float[] aBox) { - aBlock.setBlockBounds(aBox[0], aBox[1], aBox[2], aBox[3], aBox[4], aBox[5]); - return true; - } - - @Override - public void onTileEntityPlaced() { - /* empty */ - } - - public boolean box(Block aBlock, double aMinX, double aMinY, double aMinZ, double aMaxX, double aMaxY, - double aMaxZ) { - aBlock.setBlockBounds((float) aMinX, (float) aMinY, (float) aMinZ, (float) aMaxX, (float) aMaxY, (float) aMaxZ); - return true; - } - - @Override - public void setShouldRefresh(boolean aShouldRefresh) { - mShouldRefresh = aShouldRefresh; - } - - /** - * shouldJoinIc2Enet - defaults to false, override to change - */ - @Override - public boolean shouldJoinIc2Enet() { - return false; - } - - @Override - public final void addCollisionBoxesToList(AxisAlignedBB aAABB, List aList, Entity aEntity) { - box(getCollisionBoundingBoxFromPool(), aAABB, aList); - } - - /** - * Simple Function to prevent Block Updates from happening multiple times within the same Tick. - */ - @Override - public final void issueBlockUpdate() { - if (mIsTicking) mDoesBlockUpdate = true; - else doBlockUpdate(); - } - - @Override - public boolean isStillValid() { - return !isInvalid(); - } - - @Override - public boolean allowCoverOnSide(byte aSide, GT_ItemStack aCoverID) { - return true; - } - - public AxisAlignedBB box() { - return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 1, zCoord + 1); - } - - public boolean box(AxisAlignedBB aBox, AxisAlignedBB aAABB, List aList) { - return aBox != null && aBox.intersectsWith(aAABB) && aList.add(aBox); - } - - public float[] shrunkBox() { - return PX_BOX; - } - - @Override - public void setBlockBoundsBasedOnState(Block aBlock) { - box(aBlock); - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool() { - return box(); - } - - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool() { - if (mForceFullSelectionBoxes) return box(); - return box(shrunkBox()); - } - - @Override - public ItemStack getPickBlock(MovingObjectPosition aTarget) { - final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(mMTERegistry); - return tRegistry == null ? null : tRegistry.getItem(mMTEID, writeItemNBT(new NBTTagCompound())); - } - - @Override - public void onBlockAdded() {} - - @Override - public String getOwnerName() { - if (GT_Utility.isStringInvalid(mOwnerName)) return "Player"; - return mOwnerName; - } - - @Override - public String setOwnerName(String aName) { - if (GT_Utility.isStringInvalid(aName)) return mOwnerName = "Player"; - return mOwnerName = aName; - } - - @Override - public UUID getOwnerUuid() { - return mOwnerUuid; - } - - @Override - public void setOwnerUuid(UUID uuid) { - mOwnerUuid = uuid; - } - - @Override - public boolean onPlaced(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, byte aSide, - float aHitX, float aHitY, float aHitZ) { - mFacing = getSideForPlayerPlacing(aPlayer, mFacing, getValidFacings()); - onFacingChange(); - return true; - } - - @Override - public boolean allowInteraction(Entity aEntity) { - return true; - } - - public boolean allowRightclick(Entity aEntity) { - return allowInteraction(aEntity); - } - - @Override - public boolean onBlockActivated(EntityPlayer aPlayer, byte aSide, float aX, float aY, float aZ) { - try { - return allowRightclick(aPlayer) && onRightClick(aPlayer, aSide, aX, aY, aZ); - } catch (Throwable e) { - GT_FML_LOGGER.error("onBlockActivated Failed", e); - e.printStackTrace(GT_Log.err); - return true; - } - } - - @Override - public boolean onRightClick(EntityPlayer aPlayer, byte aSide, float aX, float aY, float aZ) { - if (isClientSide()) { - // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron - if (aPlayer.isSneaking()) { - final byte tSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) - : aSide; - return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI()); - } else if (getCoverBehaviorAtSideNew(aSide).onCoverRightclickClient(aSide, this, aPlayer, aX, aY, aZ)) { - return true; - } - - if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false; - } - if (isServerSide()) { - if (!privateAccess() || aPlayer.getDisplayName().equalsIgnoreCase(getOwnerName())) { - final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); - final byte wrenchSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); - - if (tCurrentItem != null) { - if (getColorization() >= 0 - && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { - // TODO (Colorization) - } - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) - return onWrenchRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sScrewdriverList)) - return onScrewdriverRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sHardHammerList)) - return onHammerRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSoftHammerList)) - return onMalletRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sSolderingToolList)) - return onSolderingRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWireCutterList)) - return onWireCutterRightClick(aPlayer, tCurrentItem, wrenchSide, aX, aY, aZ); - - final byte coverSide = getCoverIDAtSide(aSide) == 0 ? wrenchSide : aSide; - - if (getCoverIDAtSide(coverSide) == 0) { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { - if (GregTech_API.getCoverBehaviorNew(tCurrentItem) - .isCoverPlaceable(coverSide, tCurrentItem, this) - && allowCoverOnSide(coverSide, new GT_ItemStack(tCurrentItem))) { - setCoverItemAtSide(coverSide, tCurrentItem); - if (!aPlayer.capabilities.isCreativeMode) tCurrentItem.stackSize--; - GT_Utility.sendSoundToPlayers( - worldObj, - SoundResource.IC2_TOOLS_WRENCH, - 1.0F, - -1, - xCoord, - yCoord, - zCoord); - issueClientUpdate(); - } - sendCoverDataIfNeeded(); - return true; - } - } else { - if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCrowbarList)) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { - GT_Utility.sendSoundToPlayers( - worldObj, - SoundResource.RANDOM_BREAK, - 1.0F, - -1, - xCoord, - yCoord, - zCoord); - dropCover(coverSide, aSide, false); - } - sendCoverDataIfNeeded(); - return true; - } - } - } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config if possible. - aSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) - : aSide; - return getCoverIDAtSide(aSide) > 0 && getCoverBehaviorAtSideNew(aSide).onCoverShiftRightClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer); - } - - if (getCoverBehaviorAtSideNew(aSide).onCoverRightClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer, - aX, - aY, - aZ)) - return true; - - if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false; - - return openModularUi(aPlayer, aSide); - } - } - return false; - } - - public boolean hasGui(byte aSide) { - return false; - } - - boolean openModularUi(EntityPlayer aPlayer, byte aSide) { - if (!hasGui(aSide) || !isServerSide()) { - System.out.println("No GUI or Not Serverside"); - return false; - } - - GT_UIInfos.openGTTileEntityUI(this, aPlayer); - System.out.println("Trying to open a UI"); - return true; - } - - public boolean onWrenchRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, byte wrenchSide, float aX, float aY, - float aZ) { - if (setMainFacing(wrenchSide)) { - GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer); - GT_Utility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord); - } - return true; - } - - public boolean onScrewdriverRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, byte wrenchSide, float aX, - float aY, float aZ) { - if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { - setCoverDataAtSide( - wrenchSide, - getCoverBehaviorAtSideNew(wrenchSide).onCoverScrewdriverClick( - wrenchSide, - getCoverIDAtSide(wrenchSide), - getComplexCoverDataAtSide(wrenchSide), - this, - aPlayer, - aX, - aY, - aZ)); - // TODO: Update connections! - GT_Utility.sendSoundToPlayers(worldObj, SoundResource.IC2_TOOLS_WRENCH, 1.0F, -1, xCoord, yCoord, zCoord); - } - return true; - } - - public boolean onHammerRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, byte wrenchSide, float aX, float aY, - float aZ) { - - return true; - } - - public boolean onMalletRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, byte wrenchSide, float aX, float aY, - float aZ) { - - return true; - } - - public boolean onSolderingRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, byte wrenchSide, float aX, - float aY, float aZ) { - - return true; - } - - public boolean onWireCutterRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, byte wrenchSide, float aX, - float aY, float aZ) { - - return true; - } - - @Override - public float getExplosionResistance(Entity aExploder, double aExplosionX, double aExplosionY, double aExplosionZ) { - return getExplosionResistance(); - } - - @Override - public float getExplosionResistance() { - return 10.0F; - } - - @Override - public void onExploded(Explosion aExplosion) {} - - @Override - public boolean isSideSolid(byte aSide) { - return true; - } - - @Override - public ArrayList getDrops(int aFortune, boolean aSilkTouch) { - final ArrayList rList = new ArrayList<>(); - final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID()); - if (tRegistry != null) rList.add(tRegistry.getItem(getMultiTileEntityID(), writeItemNBT(new NBTTagCompound()))); - - onBaseTEDestroyed(); - return rList; - } - - @Override - public boolean getSubItems(MultiTileEntityBlockInternal aBlock, Item aItem, CreativeTabs aTab, - List aList, short aID) { - return true; - } - - @Override - public boolean recolourBlock(byte aSide, byte aColor) { - // if (aColor > 15 || aColor < -1) aColor = -1; - // if(paint((byte) (aColor + 1))) { - //// updateClientData(); - //// causeBlockUpdate(); - // return true; - // } - // if (unpaint()) {updateClientData(); causeBlockUpdate(); return T;} - // mColor = (byte) (aColor + 1); - //// if (canAccessData()) mMetaTileEntity.onColorChangeServer(aColor); - return false; - } - - @Override - public boolean playerOwnsThis(EntityPlayer aPlayer, boolean aCheckPrecicely) { - if (aCheckPrecicely || privateAccess() || (mOwnerName.length() == 0)) - if ((mOwnerName.length() == 0) && isServerSide()) { - setOwnerName(aPlayer.getDisplayName()); - setOwnerUuid(aPlayer.getUniqueID()); - } else return !privateAccess() || aPlayer.getDisplayName().equals("Player") - || mOwnerName.equals("Player") - || mOwnerName.equals(aPlayer.getDisplayName()); - return true; - } - - @Override - public boolean privateAccess() { - return mLockUpgrade; - } - - /** - * @return a Packet containing all Data which has to be synchronised to the Client - Override as needed - */ - public GT_Packet_New getClientDataPacket() { - - final GT_Packet_MultiTileEntity packet = new GT_Packet_MultiTileEntity( - 0, - xCoord, - (short) yCoord, - zCoord, - getMultiTileEntityRegistryID(), - getMultiTileEntityID(), - (byte) ((mFacing & 7) | (mRedstone ? 16 : 0)), - mColor); - - packet.setCoverData( - getCoverInfoAtSide((byte) 0).getCoverID(), - getCoverInfoAtSide((byte) 1).getCoverID(), - getCoverInfoAtSide((byte) 2).getCoverID(), - getCoverInfoAtSide((byte) 3).getCoverID(), - getCoverInfoAtSide((byte) 4).getCoverID(), - getCoverInfoAtSide((byte) 5).getCoverID()); - - packet.setRedstoneData( - (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) | ((mSidedRedstone[1] > 0) ? 2 : 0) - | ((mSidedRedstone[2] > 0) ? 4 : 0) - | ((mSidedRedstone[3] > 0) ? 8 : 0) - | ((mSidedRedstone[4] > 0) ? 16 : 0) - | ((mSidedRedstone[5] > 0) ? 32 : 0))); - - if (this instanceof IMTE_HasModes) { - final IMTE_HasModes mteModes = (IMTE_HasModes) this; - packet.setModes(mteModes.getMode(