aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity')
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java38
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/BaseMultiTileEntity.java6
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java6
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockInventory.java2
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java4
-rw-r--r--src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java27
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockController.java170
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java53
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/AdvancedCasing.java36
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/BasicCasing.java7
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/InventoryUpgrade.java94
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));
+ }
+}