diff options
author | BlueWeabo <ilia.iliev2005@gmail.com> | 2023-02-08 07:07:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-07 21:07:27 -0800 |
commit | 2556dfb92a7c7c73a72caa7d72129cef47b017ea (patch) | |
tree | fd1a90d04e5b64ca5eb6a7434bdd5e0f6c04e952 /src/main/java | |
parent | 6ea8fe534145b64866e4da79816b25262174d16f (diff) | |
download | GT5-Unofficial-2556dfb92a7c7c73a72caa7d72129cef47b017ea.tar.gz GT5-Unofficial-2556dfb92a7c7c73a72caa7d72129cef47b017ea.tar.bz2 GT5-Unofficial-2556dfb92a7c7c73a72caa7d72129cef47b017ea.zip |
Mte inventory block (#1692)
MTE Inventory Upgrade
* inventories saved to nbt in controller
* bump up ModularUI to fix labels
* inventory renaming
* fix inventories not syncing
* more nbt saving and loading
* unregister inventory on block break
* example of a block being made from the same class
* clear UpgradeCasing list every structure check
* fix inventory halving to 0
* sync inventory name for upgrade block
* switch to its own method of sending client data
---------
Co-authored-by: Jason Mitchell <mitchej+github@gmail.com>
Diffstat (limited to 'src/main/java')
15 files changed, 487 insertions, 63 deletions
diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java index ef921a0339..688ffad28e 100644 --- a/src/main/java/gregtech/api/enums/GT_Values.java +++ b/src/main/java/gregtech/api/enums/GT_Values.java @@ -218,6 +218,7 @@ public class GT_Values { COVERS = "gt.covers", // String CUSTOM_NAME = "name", // String DISPAY = "gt.display", // String + TIER = "gt.tier", // Number FACING = "gt.facing", // Byte LOCK_UPGRADE = "gt.locked", // Boolean MATERIAL = "gt.material", // String containing the Material Name. @@ -248,6 +249,11 @@ public class GT_Values { TARGET_Z = "gt.target.z", // Number LOCKED_INVENTORY = "gt.locked.inventory", // String LOCKED_INVENTORY_INDEX = "gt.locked.inventory.index", // Number + UPGRADE_INVENTORY_SIZE = "gt.invsize.upg", // String + UPGRADE_INVENTORY_UUID = "gt.invuuid.upg", // String + 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 empty_ = ""; } diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java index 00f06d2deb..84cbdfb529 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java @@ -9,6 +9,7 @@ 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.util.GT_Util; public class MultiTileEntityClassContainer { @@ -110,11 +111,40 @@ public class MultiTileEntityClassContainer { return this; } + public MultiTileEntityClassContainer inputInventorySize(int aSize) { + mParameters.setInteger(NBT.INV_INPUT_SIZE, aSize); + return this; + } + + public MultiTileEntityClassContainer outputInventorySize(int aSize) { + mParameters.setInteger(NBT.INV_OUTPUT_SIZE, aSize); + return this; + } + public MultiTileEntityClassContainer tankCapacity(Long aCapacity) { mParameters.setLong(NBT.TANK_CAPACITY, aCapacity); return this; } + public MultiTileEntityClassContainer tier(int aTier) { + verifyDescendentOf(AdvancedCasing.class); + + mParameters.setInteger(NBT.TIER, aTier); + return this; + } + + public MultiTileEntityClassContainer upgradeInventorySize(int aSize) { + verifyDescendentOf(AdvancedCasing.class); + + mParameters.setInteger(NBT.UPGRADE_INVENTORY_SIZE, aSize); + return this; + } + + @SuppressWarnings("unused") + public MultiTileEntityClassContainer setNBT(String key, Object val) { + return setNBT(new Tuple(key, val)); + } + public MultiTileEntityClassContainer setNBT(Tuple... aTags) { /* * Merge in arbitrary NBT tuples of (key, value). Useful for anything for which a custom method has not yet been @@ -123,4 +153,12 @@ public class MultiTileEntityClassContainer { mParameters = GT_Util.fuseNBT(mParameters, GT_Util.makeNBT(aTags)); return this; } + + private void verifyDescendentOf(Class<?> cls) { + // Check if cls is extended by mClass + if (!cls.isAssignableFrom(mClass)) { + throw new IllegalArgumentException( + "Expected a descendent of " + cls.getName() + " got " + mClass.getName() + " instead."); + } + } } diff --git a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java index 1e7a5cb236..06ae77afe1 100644 --- a/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java +++ b/src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java @@ -59,6 +59,7 @@ 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; @@ -1009,6 +1010,11 @@ public abstract class BaseMultiTileEntity extends CoverableTileEntity final ChunkCoordinates aTarget = mtePart.getTargetPos(); packet.setTargetPos(aTarget.posX, (short) aTarget.posY, aTarget.posZ); } + packet.setInventoryIndex(mtePart.getLockedInventoryIndex()); + } + if (this instanceof InventoryUpgrade) { + String tName = ((InventoryUpgrade) this).getInventoryName(); + packet.setInventoryName(tName); } return packet; diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java index c299868b1d..22409563d9 100644 --- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java +++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java @@ -23,4 +23,10 @@ public interface IMultiBlockController void registerCoveredPartOnSide(final int aSide, IMultiBlockPart part); void unregisterCoveredPartOnSide(final int aSide, IMultiBlockPart part); + + void registerInventory(String aName, String aID, int aInventorySize, int aType); + + void unregisterInventory(String aName, String aID, int aType); + + void changeInventoryName(String aName, String aID, int aType); } diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java index 281e1c7745..e095b739b7 100644 --- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java +++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java @@ -53,4 +53,6 @@ public interface IMultiBlockInventory { IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart); List<String> getInventoryNames(MultiBlockPart aPart); + + List<String> getInventoryIDs(MultiBlockPart aPart); } diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java index 78d6573ebd..dcee4ad9d9 100644 --- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java +++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java @@ -8,5 +8,9 @@ public interface IMultiBlockPart extends IMultiTileEntity { void setTargetPos(ChunkCoordinates aTargetPos); + void setLockedInventoryIndex(int aIndex); + + int getLockedInventoryIndex(); + boolean tickCoverAtSide(byte aSide, long aTickTimer); } diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java index b3605d579b..3739854893 100644 --- a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java +++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java @@ -29,6 +29,8 @@ import gregtech.api.util.GT_Utility; public class MultiTileBasicMachine extends BaseTickableMultiTileEntity { + protected static final IItemHandlerModifiable EMPTY_INVENTORY = new ItemStackHandler(0); + private static final String TEXTURE_LOCATION = "multitileentity/machines/"; public IIconContainer[] mTexturesInactive = emptyIconContainerArray; public IIconContainer[] mTexturesActive = emptyIconContainerArray; @@ -39,8 +41,8 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity { protected FluidTankGT[] mTanksInput = GT_Values.emptyFluidTankGT, mTanksOutput = GT_Values.emptyFluidTankGT; protected FluidStack[] mOutputFluids = GT_Values.emptyFluidStack; - protected final IItemHandlerModifiable mInputInventory = new ItemStackHandler(17); - protected final IItemHandlerModifiable mOutputInventory = new ItemStackHandler(15); + protected IItemHandlerModifiable mInputInventory = EMPTY_INVENTORY; + protected IItemHandlerModifiable mOutputInventory = EMPTY_INVENTORY; protected boolean mOutputInventoryChanged = false; @Override @@ -99,8 +101,10 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity { if (aNBT.hasKey(NBT.ACTIVE)) mActive = aNBT.getBoolean(NBT.ACTIVE); /* Inventories */ - loadInventory(aNBT, NBT.INV_INPUT_SIZE, NBT.INV_INPUT_LIST); - loadInventory(aNBT, NBT.INV_OUTPUT_SIZE, NBT.INV_OUTPUT_LIST); + mInputInventory = new ItemStackHandler(Math.max(aNBT.getInteger(NBT.INV_INPUT_SIZE), 0)); + mOutputInventory = new ItemStackHandler(Math.max(aNBT.getInteger(NBT.INV_OUTPUT_SIZE), 0)); + loadInventory(aNBT, mInputInventory, NBT.INV_INPUT_LIST); + loadInventory(aNBT, mOutputInventory, NBT.INV_OUTPUT_LIST); /* Tanks */ long tCapacity = 1000; @@ -120,15 +124,12 @@ public class MultiTileBasicMachine extends BaseTickableMultiTileEntity { mOutputFluids[i] = FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag(NBT.FLUID_OUT + "." + i)); } - protected void loadInventory(NBTTagCompound aNBT, String sizeTag, String invListTag) { - final IItemHandlerModifiable inv = mInputInventory; - if (inv != null) { - final NBTTagList tList = aNBT.getTagList(invListTag, 10); - for (int i = 0; i < tList.tagCount(); i++) { - final NBTTagCompound tNBT = tList.getCompoundTagAt(i); - final int tSlot = tNBT.getShort("s"); - if (tSlot >= 0 && tSlot < inv.getSlots()) inv.setStackInSlot(tSlot, GT_Utility.loadItem(tNBT)); - } + protected void loadInventory(NBTTagCompound aNBT, IItemHandlerModifiable inv, String invListTag) { + final NBTTagList tList = aNBT.getTagList(invListTag, 10); + for (int i = 0; i < tList.tagCount(); i++) { + final NBTTagCompound tNBT = tList.getCompoundTagAt(i); + final int tSlot = tNBT.getShort("s"); + if (tSlot >= 0 && tSlot < inv.getSlots()) inv.setStackInSlot(tSlot, GT_Utility.loadItem(tNBT)); } } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java index 5c6576a392..579d0b1759 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java @@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHashMap; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; @@ -43,6 +44,7 @@ import com.gtnewhorizon.structurelib.util.Vec3Impl; import com.gtnewhorizons.modularui.api.ModularUITextures; import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; +import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; import com.gtnewhorizons.modularui.api.forge.ListItemHandler; import com.gtnewhorizons.modularui.api.screen.*; import com.gtnewhorizons.modularui.api.widget.Widget; @@ -72,6 +74,8 @@ import gregtech.api.multitileentity.interfaces.IMultiBlockPart; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_AddToolTips; import gregtech.api.multitileentity.machine.MultiTileBasicMachine; +import gregtech.api.multitileentity.multiblock.casing.AdvancedCasing; +import gregtech.api.multitileentity.multiblock.casing.InventoryUpgrade; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_Utility; @@ -81,13 +85,15 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex IMultiBlockFluidHandler, IMultiBlockInventory, IMTE_AddToolTips { private static final Map<Integer, GT_Multiblock_Tooltip_Builder> tooltip = new ConcurrentHashMap<>(); - + private final List<AdvancedCasing> mUpgradeCasings = new ArrayList<AdvancedCasing>(); protected BuildState buildState = new BuildState(); + protected Map<String, String> multiBlockInputInventoryNames = new LinkedHashMap<>(); + protected Map<String, String> multiBlockOutputInventoryNames = new LinkedHashMap<>(); protected Map<String, IItemHandlerModifiable> multiBlockInputInventory = new LinkedHashMap<>(); protected Map<String, IItemHandlerModifiable> multiBlockOutputInventory = new LinkedHashMap<>(); - private int mMaxProgresstime = 0, mProgresstime = 0; + private int mMaxProgressTime = 0, mProgressTime = 0; private boolean mStructureOkay = false, mStructureChanged = false; private boolean mWorks = true, mWorkUpdate = false, mWasShutdown = false, mActive = false; private ExtendedFacing mExtendedFacing = ExtendedFacing.DEFAULT; @@ -124,6 +130,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex * IStructureDefinition is expected to be evaluated against current instance only, and should not be used against * other instances, even for those of the same class. */ + @Override public abstract IStructureDefinition<T> getStructureDefinition(); /** @@ -145,6 +152,35 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex aNBT.setBoolean(NBT.STRUCTURE_OK, mStructureOkay); aNBT.setByte(NBT.ROTATION, (byte) mExtendedFacing.getRotation().getIndex()); aNBT.setByte(NBT.FLIP, (byte) mExtendedFacing.getFlip().getIndex()); + + saveUpgradeInventoriesToNBT(aNBT); + } + + private void saveUpgradeInventoriesToNBT(NBTTagCompound aNBT) { + final NBTTagList tListInputInvs = new NBTTagList(); + multiBlockInputInventory.forEach((tID, tInv) -> { + if (tID.equals("controller")) {} else { + final NBTTagCompound tTag = new NBTTagCompound(); + tTag.setString(NBT.UPGRADE_INVENTORY_UUID, tID); + tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockInputInventoryNames.get(tID)); + tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, tInv.getSlots()); + writeInventory(tTag, tInv, NBT.INV_INPUT_LIST); + tListInputInvs.appendTag(tTag); + } + }); + final NBTTagList tListOutputInvs = new NBTTagList(); + multiBlockOutputInventory.forEach((tID, tInv) -> { + if (tID.equals("controller")) {} else { + final NBTTagCompound tTag = new NBTTagCompound(); + tTag.setString(NBT.UPGRADE_INVENTORY_UUID, tID); + tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockOutputInventoryNames.get(tID)); + tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, tInv.getSlots()); + writeInventory(tTag, tInv, NBT.INV_OUTPUT_LIST); + tListOutputInvs.appendTag(tTag); + } + }); + aNBT.setTag(NBT.UPGRADE_INVENTORIES_INPUT, tListInputInvs); + aNBT.setTag(NBT.UPGRADE_INVENTORIES_OUTPUT, tListOutputInvs); } @Override @@ -152,8 +188,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex super.readMultiTileNBT(aNBT); // Multiblock inventories are a collection of inventories. The first inventory is the default internal - // inventory, - // and the others are added by inventory extending blocks. + // inventory, and the others are added by inventory extending blocks. if (mInputInventory != null) multiBlockInputInventory.put("controller", mInputInventory); if (mOutputInventory != null) multiBlockOutputInventory.put("controller", mOutputInventory); @@ -162,6 +197,33 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex ForgeDirection.getOrientation(getFrontFacing()), Rotation.byIndex(aNBT.getByte(NBT.ROTATION)), Flip.byIndex(aNBT.getByte(NBT.FLIP))); + + loadUpgradeInventoriesFromNBT(aNBT); + } + + private void loadUpgradeInventoriesFromNBT(NBTTagCompound aNBT) { + final NBTTagList tListInput = aNBT.getTagList(NBT.UPGRADE_INVENTORIES_INPUT, 10); + for (int i = 0; i < tListInput.tagCount(); i++) { + final NBTTagCompound tNBT = tListInput.getCompoundTagAt(i); + String invUUID = tNBT.getString(NBT.UPGRADE_INVENTORY_UUID); + String invName = tNBT.getString(NBT.UPGRADE_INVENTORY_NAME); + int tInvSize = tNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE); + IItemHandlerModifiable tInv = new ItemStackHandler(tInvSize); + loadInventory(tNBT, tInv, NBT.INV_INPUT_LIST); + multiBlockInputInventory.put(invUUID, tInv); + multiBlockInputInventoryNames.put(invUUID, invName); + } + final NBTTagList tListOutput = aNBT.getTagList(NBT.UPGRADE_INVENTORIES_OUTPUT, 10); + for (int i = 0; i < tListOutput.tagCount(); i++) { + final NBTTagCompound tNBT = tListOutput.getCompoundTagAt(i); + String invUUID = tNBT.getString(NBT.UPGRADE_INVENTORY_UUID); + String invName = tNBT.getString(NBT.UPGRADE_INVENTORY_NAME); + int tInvSize = tNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE); + IItemHandlerModifiable tInv = new ItemStackHandler(tInvSize); + loadInventory(tNBT, tInv, NBT.INV_OUTPUT_LIST); + multiBlockOutputInventory.put(invUUID, tInv); + multiBlockOutputInventoryNames.put(invUUID, invName); + } } @Override @@ -332,8 +394,11 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex @Override public void onFirstTick(boolean aIsServerSide) { super.onFirstTick(aIsServerSide); - if (aIsServerSide) checkStructure(true); - else StructureLibAPI.queryAlignment(this); + if (aIsServerSide) { + checkStructure(true); + } else { + StructureLibAPI.queryAlignment(this); + } } private boolean tickCovers() { @@ -366,12 +431,17 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex public void onPostTick(long aTick, boolean aIsServerSide) { if (aIsServerSide) { if (aTick % 600 == 5) { + clearSpecialLists(); // Recheck the structure every 30 seconds or so if (!checkStructure(false)) checkStructure(true); } } } + protected void clearSpecialLists() { + mUpgradeCasings.clear(); + } + @Override public final boolean isFacingValid(byte aFacing) { return canSetToDirectionAny(ForgeDirection.getOrientation(aFacing)); @@ -405,12 +475,12 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex // IMachineProgress @Override public int getProgress() { - return mProgresstime; + return mProgressTime; } @Override public int getMaxProgress() { - return mMaxProgresstime; + return mMaxProgressTime; } @Override @@ -551,6 +621,10 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex if (tTarget != null && tTarget != MultiBlockController.this) return false; part.setTarget(MultiBlockController.this, aModes); + + if (part instanceof AdvancedCasing) { + mUpgradeCasings.add((AdvancedCasing) part); + } return true; } @@ -587,6 +661,8 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex if (world.setBlock(x, y, z, tContainer.mBlock, 15 - tContainer.mBlockMetaData, 2)) { tContainer.setMultiTile(world, x, y, z); ((MultiBlockPart) te).setTarget(MultiBlockController.this, aModes); + + registerSpecialCasings((MultiBlockPart) te); } return false; @@ -598,6 +674,12 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex }; } + protected void registerSpecialCasings(MultiBlockPart aPart) { + if (aPart instanceof AdvancedCasing) { + mUpgradeCasings.add((AdvancedCasing) aPart); + } + } + /** * Fluid - MultiBlock related Fluid Tank behaviour. */ @@ -777,10 +859,44 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex /** * Item - MultiBlock related Item behaviour. */ - protected boolean registerInventory(String invName, IItemHandlerModifiable inventory) { - if (multiBlockInputInventory.containsKey(invName)) return false; - multiBlockInputInventory.put(invName, inventory); - return true; + @Override + public void registerInventory(String aName, String aID, int aInventorySize, int aType) { + if (aType == InventoryUpgrade.INPUT || aType == InventoryUpgrade.BOTH) { + if (multiBlockInputInventory.containsKey(aID)) return; + multiBlockInputInventory.put(aID, new ItemStackHandler(aInventorySize)); + multiBlockInputInventoryNames.put(aID, aName); + } + if (aType == InventoryUpgrade.OUTPUT || aType == InventoryUpgrade.BOTH) { + if (multiBlockOutputInventory.containsKey(aID)) return; + multiBlockOutputInventory.put(aID, new ItemStackHandler(aInventorySize)); + multiBlockOutputInventoryNames.put(aID, aName); + } + } + + @Override + public void unregisterInventory(String aName, String aID, int aType) { + if ((aType == InventoryUpgrade.INPUT || aType == InventoryUpgrade.BOTH) + && multiBlockInputInventory.containsKey(aID)) { + multiBlockInputInventory.remove(aID, multiBlockInputInventory.get(aID)); + multiBlockInputInventoryNames.remove(aID, aName); + } + if ((aType == InventoryUpgrade.OUTPUT || aType == InventoryUpgrade.BOTH) + && multiBlockOutputInventory.containsKey(aID)) { + multiBlockOutputInventory.remove(aID, multiBlockOutputInventory.get(aID)); + multiBlockOutputInventoryNames.remove(aID, aName); + } + } + + @Override + public void changeInventoryName(String aName, String aID, int aType) { + if ((aType == InventoryUpgrade.INPUT || aType == InventoryUpgrade.BOTH) + && multiBlockInputInventoryNames.containsKey(aID)) { + multiBlockInputInventoryNames.put(aID, aName); + } + if ((aType == InventoryUpgrade.OUTPUT || aType == InventoryUpgrade.BOTH) + && multiBlockOutputInventoryNames.containsKey(aID)) { + multiBlockOutputInventoryNames.put(aID, aName); + } } @Override @@ -798,6 +914,12 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex @Override public IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart) { + if (isServerSide()) { + for (AdvancedCasing tPart : mUpgradeCasings) { + if (!(tPart instanceof InventoryUpgrade)) continue; + tPart.issueClientUpdate(); + } + } final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart); if (multiBlockInventory == null) return null; @@ -826,6 +948,12 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex return null; } + protected Map<String, String> getMultiBlockInventoryNames(MultiBlockPart aPart) { + if (aPart.modeSelected(MultiBlockPart.ITEM_IN)) return multiBlockInputInventoryNames; + else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) return multiBlockOutputInventoryNames; + return null; + } + protected Pair<IItemHandlerModifiable, Integer> getInventory(MultiBlockPart aPart, int aSlot) { final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart); if (multiBlockInventory == null) return null; @@ -965,11 +1093,20 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex public List<String> getInventoryNames(MultiBlockPart aPart) { final List<String> inventoryNames = new ArrayList<>(); inventoryNames.add("all"); - inventoryNames.addAll(getMultiBlockInventory(aPart).keySet()); + inventoryNames.add("controller"); + inventoryNames.addAll(getMultiBlockInventoryNames(aPart).values()); return inventoryNames; } @Override + public List<String> getInventoryIDs(MultiBlockPart aPart) { + final List<String> tInventoryIDs = new ArrayList<>(); + tInventoryIDs.add("all"); + tInventoryIDs.addAll(getMultiBlockInventory(aPart).keySet()); + return tInventoryIDs; + } + + @Override public String getInventoryName(MultiBlockPart aPart) { final StringBuilder str = new StringBuilder(); str.append(getInventoryName()); @@ -977,6 +1114,7 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex str.append(" Input"); } else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) { str.append(" Output"); + String a; } else { str.append(" Unknown"); } @@ -1059,6 +1197,12 @@ public abstract class MultiBlockController<T extends MultiBlockController<T>> ex @Override public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { + if (isServerSide()) { + for (AdvancedCasing tPart : mUpgradeCasings) { + if (!(tPart instanceof InventoryUpgrade)) continue; + tPart.issueClientUpdate(); + } + } builder.widget( new TabContainer() .setButtonSize( diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java index 43522dcf02..1c6c5a0e07 100644 --- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java +++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java @@ -60,7 +60,7 @@ import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_Utility; import gregtech.common.covers.CoverInfo; -public class MultiBlockPart extends BaseNontickableMultiTileEntity +public abstract class MultiBlockPart extends BaseNontickableMultiTileEntity implements IMultiBlockPart, IMTE_BreakBlock, IMTE_HasModes { public static final int NOTHING = 0, ENERGY_IN = B[0], ENERGY_OUT = B[1], FLUID_IN = B[2], FLUID_OUT = B[3], @@ -87,6 +87,14 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity } public String getLockedInventory() { + issueClientUpdate(); + IMultiBlockController controller = getTarget(false); + if (!getNameOfInventoryFromIndex(controller, mLockedInventoryIndex).equals(mLockedInventory)) { + mLockedInventory = getNameOfInventoryFromIndex(controller, mLockedInventoryIndex); + if (mLockedInventory.equals("all")) { + mLockedInventory = ""; + } + } return mLockedInventory.equals("") ? null : mLockedInventory; } @@ -211,8 +219,20 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity } @Override + public void setLockedInventoryIndex(int aIndex) { + mLockedInventoryIndex = aIndex; + } + + @Override + public int getLockedInventoryIndex() { + return mLockedInventoryIndex; + } + + @Override public void setTargetPos(ChunkCoordinates aTargetPos) { mTargetPos = aTargetPos; + IMultiBlockController mTarget = getTarget(false); + setTarget(mTarget, mAllowedModes); } @Override @@ -754,25 +774,28 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity } builder.widget(scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 18)); DropDownWidget dropDown = new DropDownWidget(); + dropDown.addDropDownItemsSimple( + controller.getInventoryNames(this), + (buttonWidget, index, label, setSelected) -> { + buttonWidget.setOnClick((clickData, widget) -> { + if (getNameOfInventoryFromIndex(controller, index).equals("all")) { + mLockedInventory = GT_Values.E; + mLockedInventoryIndex = 0; + } else { + mLockedInventory = getNameOfInventoryFromIndex(controller, index); + mLockedInventoryIndex = index; + } + setSelected.run(); + }); + }, + true); builder.widget( - dropDown.addDropDownItemsSimple( - controller.getInventoryNames(this), - (buttonWidget, index, label, setSelected) -> buttonWidget.setOnClick((clickData, widget) -> { - if (getNameOfInventoryFromIndex(controller, index).equals("all")) { - mLockedInventory = GT_Values.E; - mLockedInventoryIndex = 0; - } else { - mLockedInventory = getNameOfInventoryFromIndex(controller, index); - mLockedInventoryIndex = index; - } - setSelected.run(); - }), - true).setSelected(mLockedInventoryIndex).setExpandedMaxHeight(60) + dropDown.setSelected(mLockedInventoryIndex).setExpandedMaxHeight(60) .setDirection(DropDownWidget.Direction.DOWN).setPos(53, 5).setSize(70, 11)); } protected String getNameOfInventoryFromIndex(final IMultiBlockController controller, int index) { - final List<String> invNames = controller.getInventoryNames(this); + final List<String> invNames = controller.getInventoryIDs(this); if (index > invNames.size()) { return invNames.get(0); } diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java new file mode 100644 index 0000000000..704cf9eb45 --- /dev/null +++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java @@ -0,0 +1,36 @@ +package gregtech.api.multitileentity.multiblock.casing; + +import net.minecraft.nbt.NBTTagCompound; + +import gregtech.api.enums.GT_Values; +import gregtech.api.multitileentity.interfaces.IMultiBlockController; +import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; + +public abstract class AdvancedCasing extends MultiBlockPart { + + protected int mTier = 0; + + @Override + public int getPartTier() { + return mTier; + } + + @Override + public void setTarget(IMultiBlockController aTarget, int aAllowedModes) { + super.setTarget(aTarget, aAllowedModes); + if (mTarget != null) customWork(mTarget); + } + + @Override + public void readMultiTileNBT(NBTTagCompound aNBT) { + super.readMultiTileNBT(aNBT); + mTier = aNBT.getInteger(GT_Values.NBT.TIER); + } + + @Override + public void writeMultiTileNBT(NBTTagCompound aNBT) { + super.writeMultiTileNBT(aNBT); + } + + protected abstract void customWork(IMultiBlockController aTarget); +} diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java new file mode 100644 index 0000000000..84f1442a88 --- /dev/null +++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java @@ -0,0 +1,7 @@ +package gregtech.api.multitileentity.multiblock.casing; + +import gregtech.api.multitileentity.multiblock.base.MultiBlockPart; + +public class BasicCasing extends MultiBlockPart { + /* Nothing */ +} diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java new file mode 100644 index 0000000000..a0043bdf39 --- /dev/null +++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java @@ -0,0 +1,94 @@ +package gregtech.api.multitileentity.multiblock.casing; + +import java.util.UUID; + +import net.minecraft.nbt.NBTTagCompound; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder; +import com.gtnewhorizons.modularui.api.screen.UIBuildContext; +import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; + +import gregtech.api.enums.GT_Values.NBT; +import gregtech.api.multitileentity.interfaces.IMultiBlockController; + +public class InventoryUpgrade extends AdvancedCasing { + + public UUID mInventoryID; + public static final int INPUT = 0; + public static final int OUTPUT = 1; + public static final int BOTH = 2; + private String mInventoryName = "inventory"; + private int mInventorySize; + private int mType = BOTH; + + public String getInventoryName() { + return mInventoryName; + } + + public void setInventoryName(String aInventoryName) { + mInventoryName = aInventoryName; + } + + @Override + protected void customWork(IMultiBlockController aTarget) { + int tInvSize = mInventorySize; + if (mType == BOTH) { + tInvSize /= 2; + } + aTarget.registerInventory(mInventoryName, mInventoryID.toString(), tInvSize, mType); + } + + @Override + public String getTileEntityName() { + return "gt.multitileentity.multiblock.inventory"; + } + + @Override + public void readMultiTileNBT(NBTTagCompound aNBT) { + super.readMultiTileNBT(aNBT); + if (aNBT.hasKey(NBT.UPGRADE_INVENTORY_UUID)) { + mInventoryID = UUID.fromString(aNBT.getString(NBT.UPGRADE_INVENTORY_UUID)); + } else { + mInventoryID = UUID.randomUUID(); + } + mInventorySize = aNBT.getInteger(NBT.UPGRADE_INVENTORY_SIZE); + mInventoryName = aNBT.getString(NBT.UPGRADE_INVENTORY_NAME); + + } + + @Override + public void writeMultiTileNBT(NBTTagCompound aNBT) { + super.writeMultiTileNBT(aNBT); + aNBT.setString(NBT.UPGRADE_INVENTORY_UUID, mInventoryID.toString()); + aNBT.setString(NBT.UPGRADE_INVENTORY_NAME, mInventoryName); + } + + @Override + protected void onBaseTEDestroyed() { + super.onBaseTEDestroyed(); + unregisterInventories(); + } + + private void unregisterInventories() { + final IMultiBlockController controller = getTarget(false); + if (controller != null) { + controller.unregisterInventory(mInventoryName, mInventoryID.toString(), mType); + } + } + + @Override + public boolean hasGui(byte aSide) { + return true; + } + + @Override + public void addUIWidgets(Builder builder, UIBuildContext buildContext) { + builder.widget(new TextFieldWidget().setGetter(() -> mInventoryName).setSetter((val) -> { + mInventoryName = val; + final IMultiBlockController controller = getTarget(false); + if (controller != null) { + controller.changeInventoryName(mInventoryName, mInventoryID.toString(), mType); + } + }).setSize(100, 25).setPos(50, 30)); + } +} diff --git a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java index 9f83cc4eda..ffcc9d2a26 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java +++ b/src/main/java/gregtech/api/net/GT_Packet_MultiTileEntity.java @@ -14,11 +14,13 @@ import gregtech.api.metatileentity.GregTechTileClientEvents; import gregtech.api.multitileentity.MultiTileEntityBlock; import gregtech.api.multitileentity.interfaces.IMultiBlockPart; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; +import gregtech.api.multitileentity.multiblock.casing.InventoryUpgrade; import io.netty.buffer.ByteBuf; public class GT_Packet_MultiTileEntity extends GT_Packet_New { - public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3]; + public static final int COVERS = B[0], REDSTONE = B[1], MODES = B[2], CONTROLLER = B[3], INVENTORY_INDEX = B[4], + INVENTORY_NAME = B[5]; private int features = 0; @@ -27,6 +29,9 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New { private short mY, mID, mRID; private byte mCommonData, mTexturePage, mUpdate, mRedstone, mColor; private ChunkCoordinates mTargetPos = null; + private int mLockedInventoryIndex; + private String mInventoryName; + private int mInventoryLength; // MultiBlockPart private byte mMode; @@ -79,6 +84,17 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New { mTargetPos = new ChunkCoordinates(aX, aY, aZ); } + public void setInventoryIndex(int aInventoryIndex) { + features |= INVENTORY_INDEX; + mLockedInventoryIndex = aInventoryIndex; + + } + + public void setInventoryName(String aInventoryName) { + features |= INVENTORY_NAME; + mInventoryName = aInventoryName; + } + @Override public void encode(ByteBuf aOut) { // Features @@ -113,6 +129,21 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New { aOut.writeShort(mTargetPos.posY); aOut.writeInt(mTargetPos.posZ); } + if ((features & INVENTORY_INDEX) == INVENTORY_INDEX) { + aOut.writeInt(mLockedInventoryIndex); + } + if ((features & INVENTORY_NAME) == INVENTORY_NAME) { + if (mInventoryName != null && mInventoryName.length() > 0) { + mInventoryLength = mInventoryName.length(); + aOut.writeInt(mInventoryLength); + for (char tChar : mInventoryName.toCharArray()) { + aOut.writeChar(tChar); + } + } else { + mInventoryLength = 0; + aOut.writeInt(mInventoryLength); + } + } if (false) { aOut.writeByte(mTexturePage); @@ -155,6 +186,21 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New { if ((packetFeatures & CONTROLLER) == CONTROLLER) { packet.setTargetPos(aData.readInt(), aData.readShort(), aData.readInt()); } + if ((packetFeatures & INVENTORY_INDEX) == INVENTORY_INDEX) { + packet.setInventoryIndex(aData.readInt()); + } + if ((packetFeatures & INVENTORY_NAME) == INVENTORY_NAME) { + int tLength = aData.readInt(); + String tName = ""; + if (tLength > 0) { + for (int i = 0; i < tLength; i++) { + tName += aData.readChar(); + } + } else { + tName = null; + } + packet.setInventoryName(tName); + } return packet; } @@ -189,6 +235,17 @@ public class GT_Packet_MultiTileEntity extends GT_Packet_New { final IMultiBlockPart mtePart = (IMultiBlockPart) mte; mtePart.setTargetPos(mTargetPos); } + + if ((features & INVENTORY_INDEX) == INVENTORY_INDEX && mte instanceof IMultiBlockPart) { + final IMultiBlockPart mtePart = (IMultiBlockPart) mte; + mtePart.setLockedInventoryIndex(mLockedInventoryIndex); + } + + if ((features & INVENTORY_NAME) == INVENTORY_NAME && mte instanceof InventoryUpgrade) { + final InventoryUpgrade invUpg = (InventoryUpgrade) mte; + invUpg.setInventoryName(mInventoryName); + } + } } catch (Exception e) { GT_Mod.GT_FML_LOGGER.error( diff --git a/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java b/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java index 757b3ea72d..fa0a6298f6 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java +++ b/src/main/java/gregtech/common/tileentities/machines/multiblock/MultiBlock_Macerator.java @@ -44,7 +44,7 @@ public class MultiBlock_Macerator extends MultiBlock_Stackable<MultiBlock_Macera transpose(new String[][] { { " BBB ", " B---B ", "DC---CD", " B---B ", " BBB " }, })) .addShape( STACKABLE_BOTTOM, - transpose(new String[][] { { " A~A ", "AAAAA", "AAAAA", "AAAAA", " AAA " }, })) + transpose(new String[][] { { " A~F ", "AAAAA", "AAAAA", "AAAAA", " AAA " }, })) .addElement('A', ofChain(addMultiTileCasing(getCasingRegistryID(), getCasingMeta(), ENERGY_IN))) .addElement( 'B', @@ -54,7 +54,13 @@ public class MultiBlock_Macerator extends MultiBlock_Stackable<MultiBlock_Macera getCasingMeta(), FLUID_IN | ITEM_IN | FLUID_OUT | ITEM_OUT))) .addElement('C', addMultiTileCasing(getCasingRegistryID(), getCasingMeta(), NOTHING)) - .addElement('D', addMultiTileCasing(getCasingRegistryID(), getCasingMeta(), NOTHING)).build(); + .addElement('D', addMultiTileCasing(getCasingRegistryID(), getCasingMeta(), NOTHING)) + .addElement( + 'F', + ofChain( + addMultiTileCasing(getCasingRegistryID(), 20001, NOTHING), + addMultiTileCasing(getCasingRegistryID(), 20002, NOTHING))) + .build(); } return STRUCTURE_DEFINITION; } diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java index 003d9b0310..f9266833bc 100644 --- a/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java +++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MultiTileEntities.java @@ -12,7 +12,7 @@ public class GT_Loader_MultiTileEntities implements Runnable { @Override public void run() { - GT_FML_LOGGER.info("GT_Mod: Regisering MultiTileEntities"); + GT_FML_LOGGER.info("GT_Mod: Registering MultiTileEntities"); final MultiTileEntityRegistry aRegistry = new MultiTileEntityRegistry("gt.multitileentity"); final MultiTileEntityBlock aMachine = MultiTileEntityBlock.getOrCreate( "GregTech", @@ -27,23 +27,17 @@ public class GT_Loader_MultiTileEntities implements Runnable { true); // Disable for now - // aRegistry - // .create(1000, MultiBlock_Macerator.class) - // .name("Large Macerator") - // .category("Multiblock Controller") - // .setBlock(aMachine) - // .material(Materials.Iron) - // .texture("metalwall") - // .tankCapacity(128000L) - // .register(); - // - // aRegistry - // .create(18000, MultiBlockPart.class) - // .name("Test Casing") - // .category("Multiblock Casing") - // .setBlock(aMachine) - // .material(Materials.Cobalt) - // .texture("metalwall") - // .register(); + // aRegistry.create(1000, MultiBlock_Macerator.class).name("Large Macerator").category("Multiblock Controller") + // .setBlock(aMachine).material(Materials.Iron).texture("metalwall").tankCapacity(128000L) + // .inputInventorySize(16).outputInventorySize(16).register(); + // aRegistry.create(18000, BasicCasing.class).name("Test Casing").category("Multiblock + // Casing").setBlock(aMachine) + // .material(Materials.Cobalt).texture("metalwall").register(); + // aRegistry.create(20001, InventoryUpgrade.class).name("Inventory Upgrade LV") + // .category("MultiBlock Special Casing").setBlock(aMachine).material(Materials.SpaceTime) + // .texture("metalwall").upgradeInventorySize(16).tier(1).register(); + // aRegistry.create(20002, InventoryUpgrade.class).name("Inventory Upgrade MV") + // .category("MultiBlock Upgrade Casing").setBlock(aMachine).material(Materials.Neutronium) + // .texture("metalwall").upgradeInventorySize(24).tier(2).register(); } } |