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/gregtech/api/multitileentity | |
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/gregtech/api/multitileentity')
11 files changed, 402 insertions, 41 deletions
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)); + } +} |