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/MultiTileEntityBlock.java70
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java18
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java168
-rw-r--r--src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java12
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java182
-rw-r--r--src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java81
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java23
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java71
-rw-r--r--src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java13
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java45
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java11
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java19
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java10
-rw-r--r--src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java12
-rw-r--r--src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java821
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java198
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java2013
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java688
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/PowerController.java92
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java43
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java77
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java32
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java10
23 files changed, 1580 insertions, 3129 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
index a30d523b55..5ea1069193 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java
@@ -189,8 +189,8 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
@Override
public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aX, int aY, int aZ, int aLogLevel) {
final TileEntity aTileEntity = aPlayer.worldObj.getTileEntity(aX, aY, aZ);
- if (aTileEntity instanceof IDebugableTileEntity) {
- return ((IDebugableTileEntity) aTileEntity).getDebugInfo(aPlayer, aLogLevel);
+ if (aTileEntity instanceof IDebugableTileEntity mte) {
+ return mte.getDebugInfo(aPlayer, aLogLevel);
}
return new ArrayList<>();
}
@@ -291,7 +291,7 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
if (!LOCK) {
LOCK = true;
- if (aTileEntity instanceof BaseTileEntity) ((BaseTileEntity) aTileEntity).onAdjacentBlockChange(aX, aY, aZ);
+ if (aTileEntity instanceof BaseTileEntity bte) bte.onAdjacentBlockChange(aX, aY, aZ);
LOCK = false;
}
if (aTileEntity instanceof IMTE_OnNeighborBlockChange change) change.onNeighborBlockChange(aWorld, aBlock);
@@ -368,21 +368,25 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
final int aFortune = EnchantmentHelper.getFortuneModifier(aPlayer);
float aChance = 1.0F;
final TileEntity aTileEntity = getTileEntity(aWorld, aX, aY, aZ, true);
- if (aTileEntity instanceof IMultiTileEntity) {
- final ArrayList<ItemStack> tList = ((IMultiTileEntity) aTileEntity).getDrops(aFortune, aSilkTouch);
- aChance = ForgeEventFactory
- .fireBlockHarvesting(tList, aWorld, this, aX, aY, aZ, aMeta, aFortune, aChance, aSilkTouch, aPlayer);
- for (final ItemStack tStack : tList)
- if (XSTR.XSTR_INSTANCE.nextFloat() <= aChance) dropBlockAsItem(aWorld, aX, aY, aZ, tStack);
+
+ if (!(aTileEntity instanceof IMultiTileEntity mte)) {
+ return;
}
+
+ final ArrayList<ItemStack> tList = mte.getDrops(aFortune, aSilkTouch);
+ aChance = ForgeEventFactory
+ .fireBlockHarvesting(tList, aWorld, this, aX, aY, aZ, aMeta, aFortune, aChance, aSilkTouch, aPlayer);
+ for (final ItemStack tStack : tList)
+ if (XSTR.XSTR_INSTANCE.nextFloat() <= aChance) dropBlockAsItem(aWorld, aX, aY, aZ, tStack);
+
}
@Override
public final boolean shouldSideBeRendered(IBlockAccess aWorld, int aX, int aY, int aZ, int ordinalSide) {
final TileEntity aTileEntity = aWorld
.getTileEntity(aX - OFFX[ordinalSide], aY - OFFY[ordinalSide], aZ - OFFZ[ordinalSide]);
- return aTileEntity instanceof IMultiTileEntity
- ? ((IMultiTileEntity) aTileEntity).shouldSideBeRendered(ForgeDirection.getOrientation(ordinalSide))
+ return aTileEntity instanceof IMultiTileEntity mte
+ ? mte.shouldSideBeRendered(ForgeDirection.getOrientation(ordinalSide))
: super.shouldSideBeRendered(aWorld, aX, aY, aZ, ordinalSide);
}
@@ -473,12 +477,17 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
@Override
public final int getComparatorInputOverride(World aWorld, int aX, int aY, int aZ, int ordinalSide) {
final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- return aTileEntity instanceof IMTE_GetComparatorInputOverride override
- ? override.getComparatorInputOverride(ForgeDirection.getOrientation(ordinalSide))
- : aTileEntity instanceof IMTE_IsProvidingWeakPower power ? power.isProvidingWeakPower(
+ if (aTileEntity instanceof IMTE_GetComparatorInputOverride override) {
+ return override.getComparatorInputOverride(ForgeDirection.getOrientation(ordinalSide));
+ }
+
+ if (aTileEntity instanceof IMTE_IsProvidingWeakPower power) {
+ return power.isProvidingWeakPower(
ForgeDirection.getOrientation(ordinalSide)
- .getOpposite())
- : super.getComparatorInputOverride(aWorld, aX, aY, aZ, ordinalSide);
+ .getOpposite());
+ }
+
+ return super.getComparatorInputOverride(aWorld, aX, aY, aZ, ordinalSide);
}
@Override
@@ -523,7 +532,7 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
public final ArrayList<ItemStack> getDrops(World aWorld, int aX, int aY, int aZ, int aUnusableMetaData,
int aFortune) {
final TileEntity aTileEntity = getTileEntity(aWorld, aX, aY, aZ, true);
- if (aTileEntity instanceof IMultiTileEntity) return ((IMultiTileEntity) aTileEntity).getDrops(aFortune, false);
+ if (aTileEntity instanceof IMultiTileEntity mte) return mte.getDrops(aFortune, false);
return new ArrayList<>();
}
@@ -536,8 +545,8 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
public final float getExplosionResistance(Entity aExploder, World aWorld, int aX, int aY, int aZ,
double aExplosionX, double aExplosionY, double aExplosionZ) {
final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- return aTileEntity instanceof IMultiTileEntity
- ? ((IMultiTileEntity) aTileEntity).getExplosionResistance(aExploder, aExplosionX, aExplosionY, aExplosionZ)
+ return aTileEntity instanceof IMultiTileEntity mte
+ ? mte.getExplosionResistance(aExploder, aExplosionX, aExplosionY, aExplosionZ)
: 1.0F;
}
@@ -546,14 +555,14 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
if (aWorld.isRemote) return;
final TileEntity aTileEntity = getTileEntity(aWorld, aX, aY, aZ, true);
if (aTileEntity != null) LAST_BROKEN_TILEENTITY.set(aTileEntity);
- if (aTileEntity instanceof IMultiTileEntity) {
+ if (aTileEntity instanceof IMultiTileEntity mte) {
GT_Log.exp.printf(
"Explosion at : %d | %d | %d DIMID: %s due to near explosion!%n",
aX,
aY,
aZ,
aWorld.provider.dimensionId);
- ((IMultiTileEntity) aTileEntity).onExploded(aExplosion);
+ mte.onExploded(aExplosion);
} else aWorld.setBlockToAir(aX, aY, aZ);
}
@@ -587,13 +596,13 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
public final ItemStack getPickBlock(MovingObjectPosition aTarget, World aWorld, int aX, int aY, int aZ,
EntityPlayer aPlayer) {
final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- return aTileEntity instanceof IMultiTileEntity ? ((IMultiTileEntity) aTileEntity).getPickBlock(aTarget) : null;
+ return aTileEntity instanceof IMultiTileEntity mte ? mte.getPickBlock(aTarget) : null;
}
@Override
public final ItemStack getPickBlock(MovingObjectPosition aTarget, World aWorld, int aX, int aY, int aZ) {
final TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- return aTileEntity instanceof IMultiTileEntity ? ((IMultiTileEntity) aTileEntity).getPickBlock(aTarget) : null;
+ return aTileEntity instanceof IMultiTileEntity mte ? mte.getPickBlock(aTarget) : null;
}
public final IMultiTileEntity receiveMultiTileEntityData(IBlockAccess aWorld, int aX, short aY, int aZ, short aRID,
@@ -601,9 +610,8 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
if (!(aWorld instanceof World)) return null;
TileEntity aTileEntity = aWorld.getTileEntity(aX, aY, aZ);
- if (!(aTileEntity instanceof IMultiTileEntity)
- || ((IMultiTileEntity) aTileEntity).getMultiTileEntityRegistryID() != aRID
- || ((IMultiTileEntity) aTileEntity).getMultiTileEntityID() != aID) {
+ if (!(aTileEntity instanceof IMultiTileEntity mte) || mte.getMultiTileEntityRegistryID() != aRID
+ || mte.getMultiTileEntityID() != aID) {
final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(aRID);
if (tRegistry == null) return null;
@@ -612,7 +620,7 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
setTileEntity((World) aWorld, aX, aY, aZ, aTileEntity, false);
}
- return ((IMultiTileEntity) aTileEntity);
+ return (IMultiTileEntity) aTileEntity;
}
public void receiveCoverData(IMultiTileEntity mte, int aCover0, int aCover1, int aCover2, int aCover3, int aCover4,
@@ -629,14 +637,6 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil
mte.issueBlockUpdate();
}
}
- //
- // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_COMMON_DATA, aTextureData);
- //
- // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aUpdateData & 0x7F);
- // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_CUSTOM_DATA, aTexturePage | 0x80);
- //
- // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_COLOR, aColorData);
- // te.receiveClientEvent(GregTechTileClientEvents.CHANGE_REDSTONE_OUTPUT, aRedstoneData);
@Override
public final TileEntity createTileEntity(World aWorld, int aMeta) {
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
index 3eae75f934..4ce4c3c886 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
@@ -13,6 +13,7 @@ import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing;
import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
import gregtech.api.util.GT_Util;
import gregtech.common.tileentities.casings.upgrade.Inventory;
+import gregtech.common.tileentities.casings.upgrade.Tank;
public class MultiTileEntityClassContainer {
@@ -144,6 +145,23 @@ public class MultiTileEntityClassContainer {
return this;
}
+ public MultiTileEntityClassContainer upgradeTankCount(int count) {
+ verifyDescendentOf(Tank.class);
+
+ mParameters.setInteger(NBT.UPGRADE_TANK_COUNT, count);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer upgradeTankCapacity(Long aCapacity) {
+ mParameters.setLong(NBT.UPGRADE_TANK_CAPACITY, aCapacity);
+ return this;
+ }
+
+ public MultiTileEntityClassContainer upgradeAmperage(long amperage) {
+ mParameters.setLong(NBT.UPGRADE_AMPERAGE, amperage);
+ return this;
+ }
+
@SuppressWarnings("unused")
public MultiTileEntityClassContainer setNBT(String key, Object val) {
return setNBT(new Tuple(key, val));
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java
index 07a9124df4..cc10485f84 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItemInternal.java
@@ -51,14 +51,14 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
@SuppressWarnings("unchecked")
public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer == null) {
aList.add("INVALID ITEM!");
return;
}
- if (tTileEntityContainer.mTileEntity instanceof IMTE_AddToolTips) {
+ if (tTileEntityContainer.mTileEntity instanceof IMTE_AddToolTips mte) {
try {
- ((IMTE_AddToolTips) tTileEntityContainer.mTileEntity).addToolTips(aList, aStack, aF3_H);
+ mte.addToolTips(aList, aStack, aF3_H);
} catch (Throwable e) {
GT_FML_LOGGER.error("addInformation", e);
}
@@ -73,11 +73,9 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
@SuppressWarnings("unchecked")
public void getSubItems(Item aItem, CreativeTabs aTab, List<ItemStack> aList) {
for (MultiTileEntityClassContainer tClass : mBlock.mMultiTileEntityRegistry.mRegistrations) {
- if (!tClass.mHidden) {
- if (((IMultiTileEntity) tClass.mCanonicalTileEntity)
- .getSubItems(mBlock, aItem, aTab, aList, tClass.mID)) {
- aList.add(mBlock.mMultiTileEntityRegistry.getItem(tClass.mID));
- }
+ if (!tClass.mHidden && ((IMultiTileEntity) tClass.mCanonicalTileEntity)
+ .getSubItems(mBlock, aItem, aTab, aList, tClass.mID)) {
+ aList.add(mBlock.mMultiTileEntityRegistry.getItem(tClass.mID));
}
}
}
@@ -85,10 +83,15 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
@Override
public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
int ordinalSide, float aHitX, float aHitY, float aHitZ) {
+
if (aY < 0 || aY > aWorld.getHeight()) return false;
+
+ if (aPlayer == null) return false;
+
try {
ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
final Block tClickedBlock = aWorld.getBlock(aX, aY, aZ);
+
if (tClickedBlock instanceof BlockSnow && (aWorld.getBlockMetadata(aX, aY, aZ) & 7) < 1) {
ordinalSide = SIDE_TOP;
side = ForgeDirection.UP;
@@ -102,79 +105,86 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
final Block tReplacedBlock = aWorld.getBlock(aX, aY, aZ);
if (!tReplacedBlock.isReplaceable(aWorld, aX, aY, aZ)
- || !mBlock.canReplace(aWorld, aX, aY, aZ, ordinalSide, aStack)) return false;
- if (aStack.stackSize == 0 || (aPlayer != null && !aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack)))
+ || !mBlock.canReplace(aWorld, aX, aY, aZ, ordinalSide, aStack)) {
return false;
+ }
+
+ if (aStack.stackSize == 0 || (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack))) {
+ return false;
+ }
final MultiTileEntityContainer aMTEContainer = mBlock.mMultiTileEntityRegistry
.getNewTileEntityContainer(aWorld, aX, aY, aZ, aStack);
- if (aMTEContainer != null
- && (aPlayer == null || aPlayer.isSneaking()
- || !(aMTEContainer.mTileEntity instanceof IMTE_OnlyPlaceableWhenSneaking mteSNeaking)
- || !mteSNeaking.onlyPlaceableWhenSneaking())
- && (aWorld.checkNoEntityCollision(AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1))
- || (aMTEContainer.mTileEntity instanceof IMTE_IgnoreEntityCollisionWhenPlacing mteIgnoreCollision
- && mteIgnoreCollision.ignoreEntityCollisionWhenPlacing(
- aStack,
- aPlayer,
- aWorld,
- aX,
- aY,
- aZ,
- side,
- aHitX,
- aHitY,
- aHitZ)))
- && (!(aMTEContainer.mTileEntity instanceof IMTE_CanPlace mteCanPlace)
- || mteCanPlace.canPlace(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ))
- && aWorld.setBlock(aX, aY, aZ, aMTEContainer.mBlock, 15 - aMTEContainer.mBlockMetaData, 2)) {
- aMTEContainer.setMultiTile(aWorld, aX, aY, aZ);
-
- try {
- if (((IMultiTileEntity) aMTEContainer.mTileEntity)
- .onPlaced(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ)) {
- aWorld.playSoundEffect(
- aX + 0.5,
- aY + 0.5,
- aZ + 0.5,
- aMTEContainer.mBlock.stepSound.func_150496_b(),
- (aMTEContainer.mBlock.stepSound.getVolume() + 1) / 2,
- aMTEContainer.mBlock.stepSound.getPitch() * 0.8F);
- }
- } catch (Throwable e) {
- GT_FML_LOGGER.error("onPlaced", e);
- }
- try {
- if (aMTEContainer.mTileEntity instanceof IMTE_HasMultiBlockMachineRelevantData mteData
- && (mteData.hasMultiBlockMachineRelevantData())) {
- GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
- }
- } catch (Throwable e) {
- GT_FML_LOGGER.error("causeMachineUpdate", e);
- }
- try {
- if (!aWorld.isRemote) {
- aWorld.notifyBlockChange(aX, aY, aZ, tReplacedBlock);
- aWorld.func_147453_f /* updateNeighborsAboutBlockChange */(aX, aY, aZ, aMTEContainer.mBlock);
- }
- } catch (Throwable e) {
- GT_FML_LOGGER.error("notifyBlockChange", e);
+ if (aMTEContainer == null) return false;
+
+ if (!aPlayer.isSneaking() && aMTEContainer.mTileEntity instanceof IMTE_OnlyPlaceableWhenSneaking mteSNeaking
+ && mteSNeaking.onlyPlaceableWhenSneaking()) {
+ return false;
+ }
+
+ if ((!(aMTEContainer.mTileEntity instanceof IMTE_IgnoreEntityCollisionWhenPlacing mteIgnoreCollision)
+ || !mteIgnoreCollision
+ .ignoreEntityCollisionWhenPlacing(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ))
+ && !aWorld.checkNoEntityCollision(AxisAlignedBB.getBoundingBox(aX, aY, aZ, aX + 1, aY + 1, aZ + 1))) {
+ return false;
+ }
+
+ if (aMTEContainer.mTileEntity instanceof IMTE_CanPlace mteCanPlace
+ && !mteCanPlace.canPlace(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ)) {
+ return false;
+ }
+
+ if (!aWorld.setBlock(aX, aY, aZ, aMTEContainer.mBlock, 15 - aMTEContainer.mBlockMetaData, 2)) {
+ return false;
+ }
+
+ aMTEContainer.setMultiTile(aWorld, aX, aY, aZ);
+
+ try {
+ if (((IMultiTileEntity) aMTEContainer.mTileEntity)
+ .onPlaced(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ)) {
+ aWorld.playSoundEffect(
+ aX + 0.5,
+ aY + 0.5,
+ aZ + 0.5,
+ aMTEContainer.mBlock.stepSound.func_150496_b(),
+ (aMTEContainer.mBlock.stepSound.getVolume() + 1) / 2,
+ aMTEContainer.mBlock.stepSound.getPitch() * 0.8F);
}
- try {
- ((IMultiTileEntity) aMTEContainer.mTileEntity).onTileEntityPlaced();
- } catch (Throwable e) {
- GT_FML_LOGGER.error("onTileEntityPlaced", e);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("onPlaced", e);
+ }
+ try {
+ if (aMTEContainer.mTileEntity instanceof IMTE_HasMultiBlockMachineRelevantData mteData
+ && (mteData.hasMultiBlockMachineRelevantData())) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
}
- try {
- aWorld.func_147451_t /* updateAllLightTypes */(aX, aY, aZ);
- } catch (Throwable e) {
- GT_FML_LOGGER.error("updateAllLightTypes", e);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("causeMachineUpdate", e);
+ }
+ try {
+ if (!aWorld.isRemote) {
+ aWorld.notifyBlockChange(aX, aY, aZ, tReplacedBlock);
+ aWorld.func_147453_f /* updateNeighborsAboutBlockChange */(aX, aY, aZ, aMTEContainer.mBlock);
}
-
- aStack.stackSize--;
- return true;
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("notifyBlockChange", e);
+ }
+ try {
+ ((IMultiTileEntity) aMTEContainer.mTileEntity).onTileEntityPlaced();
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("onTileEntityPlaced", e);
}
+ try {
+ aWorld.func_147451_t /* updateAllLightTypes */(aX, aY, aZ);
+ } catch (Throwable e) {
+ GT_FML_LOGGER.error("updateAllLightTypes", e);
+ }
+
+ aStack.stackSize--;
+ return true;
+
} catch (Throwable e) {
GT_FML_LOGGER.error("onItemUse", e);
}
@@ -186,7 +196,7 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
final MultiTileEntityClassContainer tContainer = mBlock.mMultiTileEntityRegistry.getClassContainer(aStack);
if (tContainer == null) return;
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer != null && tTileEntityContainer.mTileEntity instanceof IItemUpdatable itemUpdatable) {
itemUpdatable.updateItemStack(aStack);
}
@@ -197,7 +207,7 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
final MultiTileEntityClassContainer tContainer = mBlock.mMultiTileEntityRegistry.getClassContainer(aStack);
if (tContainer == null) return;
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer != null && tTileEntityContainer.mTileEntity instanceof IItemUpdatable itemUpdatable) {
itemUpdatable.updateItemStack(aStack, aWorld, aX, aY, aZ);
}
@@ -208,7 +218,7 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
final MultiTileEntityClassContainer tContainer = mBlock.mMultiTileEntityRegistry.getClassContainer(aStack);
if (tContainer == null) return 1;
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer != null
&& tTileEntityContainer.mTileEntity instanceof IMTE_GetMaxStackSize maxStackSize) {
return maxStackSize.getMaxStackSize(aStack, tContainer.mStackSize);
@@ -224,7 +234,7 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
@Override
public FluidStack getFluid(ItemStack aStack) {
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer != null
&& tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
final FluidStack rFluid = fluidContainerItem.getFluid(aStack);
@@ -237,7 +247,7 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
@Override
public int getCapacity(ItemStack aStack) {
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer != null
&& tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
final int rCapacity = fluidContainerItem.getCapacity(aStack);
@@ -250,7 +260,7 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
@Override
public int fill(ItemStack aStack, FluidStack aFluid, boolean aDoFill) {
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer != null
&& tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
final int tFilled = fluidContainerItem.fill(aStack, aFluid, aDoFill);
@@ -263,7 +273,7 @@ public class MultiTileEntityItemInternal extends ItemBlock implements IFluidCont
@Override
public FluidStack drain(ItemStack aStack, int aMaxDrain, boolean aDoDrain) {
final MultiTileEntityContainer tTileEntityContainer = mBlock.mMultiTileEntityRegistry
- .getNewTileEntityContainer(aStack);
+ .getCachedTileEntityContainer(aStack);
if (tTileEntityContainer != null
&& tTileEntityContainer.mTileEntity instanceof IFluidContainerItem fluidContainerItem) {
final FluidStack rFluid = fluidContainerItem.drain(aStack, aMaxDrain, aDoDrain);
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
index 45117773fe..a5e30fb76c 100644
--- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
+++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java
@@ -38,6 +38,7 @@ public class MultiTileEntityRegistry {
// TODO: NBT sensitive or not? Starting with not for now
private static final ItemStackMap<MultiTileEntityRegistry> REGISTRIES = new ItemStackMap<>(false);
private static final HashSet<Class<?>> sRegisteredTileEntities = new HashSet<>();
+ private final HashMap<Integer, MultiTileEntityContainer> cachedTileEntityContainers = new HashMap<>();
public HashMap<Short, CreativeTab> mCreativeTabs = new HashMap<>();
public Map<Short, MultiTileEntityClassContainer> mRegistry = new HashMap<>();
@@ -80,7 +81,7 @@ public class MultiTileEntityRegistry {
mBlock = aBlock;
GT_FML_LOGGER.info(aNameInternal + " " + Block.getIdFromBlock(aBlock) + "This is the answer");
mBlock.mMultiTileEntityRegistry = this;
- REGISTRIES.put(new ItemStack(Item.getItemFromBlock(aBlock), 1, GT_Values.W), this);
+ REGISTRIES.put(new ItemStack(Item.getItemById(Block.getIdFromBlock(aBlock)), 1, GT_Values.W), this);
NAMED_REGISTRIES.put(mNameInternal, this);
}
@@ -267,6 +268,15 @@ public class MultiTileEntityRegistry {
return tContainer == null ? null : tContainer.mTileEntity;
}
+ public MultiTileEntityContainer getCachedTileEntityContainer(ItemStack stack) {
+ MultiTileEntityContainer container = cachedTileEntityContainers.get(Items.feather.getDamage(stack));
+ if (container == null) {
+ container = getNewTileEntityContainer(stack);
+ cachedTileEntityContainers.put(Items.feather.getDamage(stack), container);
+ }
+ return container;
+ }
+
public MultiTileEntityContainer getNewTileEntityContainer(ItemStack aStack) {
return getNewTileEntityContainer(null, 0, 0, 0, Items.feather.getDamage(aStack), aStack.getTagCompound());
}
diff --git a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
index 4b2a5aca67..3d98663e6d 100644
--- a/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/MultiTileEntity.java
@@ -8,6 +8,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import javax.annotation.Nonnull;
+
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.creativetab.CreativeTabs;
@@ -16,6 +18,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
@@ -28,9 +31,6 @@ import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.FluidTankInfo;
-import net.minecraftforge.fluids.IFluidTank;
import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
@@ -90,6 +90,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity
protected boolean needsUpdate = false;
protected boolean hasInventoryChanged = false;
protected boolean isPainted = false;
+ @Nonnull
protected ForgeDirection facing = ForgeDirection.WEST; // Default to WEST, so it renders facing Left in the
// inventory
protected byte color;
@@ -203,12 +204,6 @@ public abstract class MultiTileEntity extends CoverableTileEntity
}
@Override
- public ITexture[] getTexture(Block ignoredBlock, ForgeDirection ignoredSide) {
- // We are not going to be using this
- return null;
- }
-
- @Override
public void readFromNBT(NBTTagCompound nbt) {
// Check if it is a World/Chunk-Loading Process calling readFromNBT
if (mteID == GT_Values.W || mteRegistry == GT_Values.W) {
@@ -231,7 +226,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity
if (nbt.hasKey("y")) yCoord = nbt.getInteger("y");
if (nbt.hasKey("z")) zCoord = nbt.getInteger("z");
// read the custom Name.
- if (nbt.hasKey(NBT.DISPAY)) customName = nbt.getCompoundTag(NBT.DISPAY)
+ if (nbt.hasKey(NBT.DISPLAY)) customName = nbt.getCompoundTag(NBT.DISPLAY)
.getString(NBT.CUSTOM_NAME);
// And now everything else.
@@ -249,6 +244,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity
if (nbt.hasKey(NBT.FACING)) facing = ForgeDirection.getOrientation(nbt.getInteger(NBT.FACING));
readCoverNBT(nbt);
+ readTasksNBT(nbt);
readMultiTileNBT(nbt);
if (NetworkUtils.isDedicatedClient()) {
@@ -272,6 +268,8 @@ public abstract class MultiTileEntity extends CoverableTileEntity
/* Do Nothing */
}
+ protected void readTasksNBT(NBTTagCompound nbt) {}
+
@Override
public final void writeToNBT(NBTTagCompound aNBT) {
super.writeToNBT(aNBT);
@@ -281,11 +279,11 @@ public abstract class MultiTileEntity extends CoverableTileEntity
// write the Custom Name
if (GT_Utility.isStringValid(customName)) {
final NBTTagCompound displayNBT;
- if (aNBT.hasKey(NBT.DISPAY)) {
- displayNBT = aNBT.getCompoundTag(NBT.DISPAY);
+ if (aNBT.hasKey(NBT.DISPLAY)) {
+ displayNBT = aNBT.getCompoundTag(NBT.DISPLAY);
} else {
displayNBT = new NBTTagCompound();
- aNBT.setTag(NBT.DISPAY, displayNBT);
+ aNBT.setTag(NBT.DISPLAY, displayNBT);
}
displayNBT.setString(NBT.CUSTOM_NAME, customName);
}
@@ -298,6 +296,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity
aNBT.setInteger(NBT.FACING, facing.ordinal());
writeCoverNBT(aNBT, false);
+ writeTasksNBT(aNBT);
writeMultiTileNBT(aNBT);
} catch (Throwable e) {
GT_FML_LOGGER.error("writeToNBT", e);
@@ -308,10 +307,13 @@ public abstract class MultiTileEntity extends CoverableTileEntity
/* Do Nothing */
}
+ protected void writeTasksNBT(NBTTagCompound aNBT) {}
+
@Override
public NBTTagCompound writeItemNBT(NBTTagCompound aNBT) {
writeCoverNBT(aNBT, true);
if (shouldSaveNBTToItemStack()) {
+ writeTasksNBT(aNBT);
writeMultiTileNBT(aNBT);
}
return aNBT;
@@ -711,6 +713,8 @@ public abstract class MultiTileEntity extends CoverableTileEntity
public boolean onPlaced(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ,
ForgeDirection side, float aHitX, float aHitY, float aHitZ) {
facing = getSideForPlayerPlacing(aPlayer, facing, getValidFacings());
+ setOwnerUuid(aPlayer.getUniqueID());
+ setOwnerName(aPlayer.getDisplayName());
onFacingChange();
return true;
}
@@ -749,8 +753,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity
}
if (!getCoverInfoAtSide(side).isGUIClickable()) return false;
- }
- if (isServerSide()) {
+ } else { // server side
if (!privateAccess() || aPlayer.getDisplayName()
.equalsIgnoreCase(getOwnerName())) {
final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem();
@@ -836,6 +839,11 @@ public abstract class MultiTileEntity extends CoverableTileEntity
if (!getCoverInfoAtSide(side).isGUIClickable()) return false;
+ if (aPlayer.getHeldItem() != null && aPlayer.getHeldItem()
+ .getItem() instanceof ItemBlock) {
+ return false;
+ }
+
return openModularUi(aPlayer, side);
}
}
@@ -1060,7 +1068,7 @@ public abstract class MultiTileEntity extends CoverableTileEntity
}
@Override
- public boolean receiveClientEvent(int aEventID, int aValue) {
+ public boolean receiveClientData(int aEventID, int aValue) {
super.receiveClientEvent(aEventID, aValue);
if (isClientSide()) {
issueTextureUpdate();
@@ -1127,11 +1135,6 @@ public abstract class MultiTileEntity extends CoverableTileEntity
}
@Override
- public boolean hasCustomInventoryName() {
- return false;
- }
-
- @Override
public ArrayList<String> getDebugInfo(EntityPlayer aPlayer, int aLogLevel) {
final ArrayList<String> tList = new ArrayList<>();
if (aLogLevel > 2) {
@@ -1155,82 +1158,6 @@ public abstract class MultiTileEntity extends CoverableTileEntity
}
/**
- * Fluid - A Default implementation of the Fluid Tank behaviour, so that every TileEntity can use this to simplify
- * its Code.
- */
- protected IFluidTank getFluidTankFillable(ForgeDirection side, FluidStack aFluidToFill) {
- return null;
- }
-
- protected IFluidTank getFluidTankDrainable(ForgeDirection side, FluidStack aFluidToDrain) {
- return null;
- }
-
- protected IFluidTank[] getFluidTanks(ForgeDirection side) {
- return GT_Values.emptyFluidTank;
- }
-
- public boolean isLiquidInput(ForgeDirection side) {
- return true;
- }
-
- public boolean isLiquidOutput(ForgeDirection side) {
- return true;
- }
-
- @Override
- public int fill(ForgeDirection aDirection, FluidStack aFluid, boolean aDoFill) {
- if (aFluid == null || aFluid.amount <= 0) return 0;
- final IFluidTank tTank = getFluidTankFillable(aDirection, aFluid);
- return (tTank == null) ? 0 : tTank.fill(aFluid, aDoFill);
- }
-
- @Override
- public FluidStack drain(ForgeDirection aDirection, FluidStack aFluid, boolean aDoDrain) {
- if (aFluid == null || aFluid.amount <= 0) return null;
- final IFluidTank tTank = getFluidTankDrainable(aDirection, aFluid);
- if (tTank == null || tTank.getFluid() == null
- || tTank.getFluidAmount() == 0
- || !tTank.getFluid()
- .isFluidEqual(aFluid))
- return null;
- return tTank.drain(aFluid.amount, aDoDrain);
- }
-
- @Override
- public FluidStack drain(ForgeDirection aDirection, int aAmountToDrain, boolean aDoDrain) {
- if (aAmountToDrain <= 0) return null;
- final IFluidTank tTank = getFluidTankDrainable(aDirection, null);
- if (tTank == null || tTank.getFluid() == null || tTank.getFluidAmount() == 0) return null;
- return tTank.drain(aAmountToDrain, aDoDrain);
- }
-
- @Override
- public boolean canFill(ForgeDirection aDirection, Fluid aFluid) {
- if (aFluid == null) return false;
- final IFluidTank tTank = getFluidTankFillable(aDirection, new FluidStack(aFluid, 0));
- return tTank != null && (tTank.getFluid() == null || tTank.getFluid()
- .getFluid() == aFluid);
- }
-
- @Override
- public boolean canDrain(ForgeDirection aDirection, Fluid aFluid) {
- if (aFluid == null) return false;
- final IFluidTank tTank = getFluidTankDrainable(aDirection, new FluidStack(aFluid, 0));
- return tTank != null && (tTank.getFluid() != null && tTank.getFluid()
- .getFluid() == aFluid);
- }
-
- @Override
- public FluidTankInfo[] getTankInfo(ForgeDirection aDirection) {
- final IFluidTank[] tTanks = getFluidTanks(aDirection);
- if (tTanks == null || tTanks.length <= 0) return GT_Values.emptyFluidTankInfo;
- final FluidTankInfo[] rInfo = new FluidTankInfo[tTanks.length];
- for (int i = 0; i < tTanks.length; i++) rInfo[i] = new FluidTankInfo(tTanks[i]);
- return rInfo;
- }
-
- /**
* Energy - Do nothing by Default
*/
@Override
@@ -1321,17 +1248,6 @@ public abstract class MultiTileEntity extends CoverableTileEntity
/**
* Inventory - Do nothing by default
*/
- @Override
- public void openInventory() {
- System.out.println("Open Inventory");
- /* Do nothing */
- }
-
- @Override
- public void closeInventory() {
- System.out.println("Close Inventory");
- /* Do nothing */
- }
@Override
public boolean hasInventoryBeenModified() {
@@ -1354,56 +1270,6 @@ public abstract class MultiTileEntity extends CoverableTileEntity
}
@Override
- public int[] getAccessibleSlotsFromSide(int ordinalSide) {
- return GT_Values.emptyIntArray;
- }
-
- @Override
- public boolean canInsertItem(int aSlot, ItemStack aStack, int ordinalSide) {
- return false;
- }
-
- @Override
- public boolean canExtractItem(int aSlot, ItemStack aStack, int ordinalSide) {
- return false;
- }
-
- @Override
- public int getSizeInventory() {
- return 0;
- }
-
- @Override
- public ItemStack getStackInSlot(int aSlot) {
- return null;
- }
-
- @Override
- public ItemStack decrStackSize(int aSlot, int aDecrement) {
- return null;
- }
-
- @Override
- public ItemStack getStackInSlotOnClosing(int aSlot) {
- return null;
- }
-
- @Override
- public void setInventorySlotContents(int aSlot, ItemStack aStack) {
- /* Do nothing */
- }
-
- @Override
- public int getInventoryStackLimit() {
- return 0;
- }
-
- @Override
- public boolean isItemValidForSlot(int aSlot, ItemStack aStack) {
- return false;
- }
-
- @Override
public void markInventoryBeenModified() {
hasInventoryChanged = true;
}
diff --git a/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java
index d61f32813f..9dcfce6d43 100644
--- a/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/base/TickableMultiTileEntity.java
@@ -2,16 +2,26 @@ package gregtech.api.multitileentity.base;
import static gregtech.GT_Mod.GT_FML_LOGGER;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
+import gregtech.api.enums.GT_Values;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_OnNeighborBlockChange;
+import gregtech.api.task.TaskHost;
+import gregtech.api.task.TickableTask;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_Util;
-public abstract class TickableMultiTileEntity extends MultiTileEntity implements IMTE_OnNeighborBlockChange {
+public abstract class TickableMultiTileEntity extends MultiTileEntity implements TaskHost, IMTE_OnNeighborBlockChange {
/** Variable for seeing if the Tick Function is called right now. */
public boolean isRunningTick = false;
@@ -22,11 +32,26 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements
/** Variable for updating Data to the Client */
private boolean sendClientData = false;
+ private final Map<String, TickableTask<?>> tasks = new HashMap<>();
+
public TickableMultiTileEntity() {
super(true);
}
@Override
+ public final void registerTask(@Nonnull TickableTask<?> task) {
+ if (tasks.containsKey(task.getName())) {
+ throw new IllegalStateException(String.format("Task with name %s is already registered", task.getName()));
+ }
+ tasks.put(task.getName(), task);
+ }
+
+ @Nullable
+ public TickableTask<?> getTask(@Nonnull String name) {
+ return tasks.get(name);
+ }
+
+ @Override
public final void updateEntity() {
isRunningTick = true;
final boolean isServerSide = isServerSide();
@@ -46,6 +71,9 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements
needsUpdate = false;
}
onTick(timer, isServerSide);
+ for (TickableTask<?> task : tasks.values()) {
+ task.update(timer, isServerSide);
+ }
if (isServerSide && timer > 2 && sendClientData) {
sendClientData(null);
}
@@ -73,7 +101,9 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements
}
}
- /** The very first Tick happening to this TileEntity */
+ /**
+ * The very first Tick happening to this TileEntity.
+ */
public void onFirstTick(boolean isServerSide) {
if (isServerSide) {
checkDropCover();
@@ -82,19 +112,48 @@ public abstract class TickableMultiTileEntity extends MultiTileEntity implements
}
}
- /** The first part of the Tick. */
- public void onPreTick(long aTick, boolean isServerSide) {}
+ /**
+ * The first part of the Tick, before block update.
+ */
+ public void onPreTick(long tick, boolean isServerSide) {}
- /** The regular Tick. */
- public void onTick(long tick, boolean isServerSide) {
+ /**
+ * The regular Tick. After block update, before sending data to client.
+ */
+ public void onTick(long tick, boolean isServerSide) {}
- }
+ /**
+ * The absolute last part of the Tick, after sending data to client.
+ */
+ public void onPostTick(long tick, boolean isServerSide) {}
- /** The absolute last part of the Tick. */
- public void onPostTick(long aTick, boolean isServerSide) {}
+ /**
+ * Gets called when there is an Exception/Error happening during one of the Tick methods.
+ */
+ public void onTickFailed(long tick, boolean isServerSide) {}
- /** Gets called when there is an Exception happening during one of the Tick Functions. */
- public void onTickFailed(long aTimer, boolean isServerSide) {}
+ @Override
+ protected final void readTasksNBT(NBTTagCompound nbt) {
+ if (nbt.hasKey(GT_Values.NBT.TASKS)) {
+ NBTTagCompound tasksTag = nbt.getCompoundTag(GT_Values.NBT.TASKS);
+ for (TickableTask<?> task : tasks.values()) {
+ if (tasksTag.hasKey(task.getName())) {
+ task.readFromNBT(tasksTag.getCompoundTag(task.getName()));
+ }
+ }
+ }
+ }
+
+ @Override
+ protected final void writeTasksNBT(NBTTagCompound aNBT) {
+ NBTTagCompound tasksTag = new NBTTagCompound();
+ for (TickableTask<?> task : tasks.values()) {
+ NBTTagCompound tag = new NBTTagCompound();
+ task.writeToNBT(tag);
+ tasksTag.setTag(task.getName(), tag);
+ }
+ aNBT.setTag(GT_Values.NBT.TASKS, tasksTag);
+ }
@Override
public void onNeighborBlockChange(World aWorld, Block aBlock) {
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java
index baa235ccf1..73bd55738a 100644
--- a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileCasing.java
@@ -1,20 +1,43 @@
package gregtech.api.multitileentity.enums;
+import static gregtech.api.util.GT_StructureUtilityMuTE.createMuTEStructureCasing;
+import static gregtech.loaders.preload.GT_Loader_MultiTileEntities.CASING_REGISTRY_NAME;
+
import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_StructureUtilityMuTE;
public enum GT_MultiTileCasing {
CokeOven(0),
Chemical(1),
+ Distillation(2),
+ Macerator(18000),
+ LaserEngraver(4),
+ Mirror(5),
+ BlackLaserEngraverCasing(6),
+ LaserEngraverUpgrade1(7),
+ LaserEngraverUpgrade2(8),
+ LaserEngraverUpgrade3(9),
+ LaserEngraverUpgrade4(10),
NONE(GT_Values.W);
private final int meta;
+ private final GT_StructureUtilityMuTE.MuTEStructureCasing casing;
GT_MultiTileCasing(int meta) {
this.meta = meta;
+ casing = createMuTEStructureCasing(CASING_REGISTRY_NAME, meta);
}
public int getId() {
return meta;
}
+
+ public short getRegistryId() {
+ return (short) casing.getRegistryId();
+ }
+
+ public GT_StructureUtilityMuTE.MuTEStructureCasing getCasing() {
+ return casing;
+ }
}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java
new file mode 100644
index 0000000000..296bae546d
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/GT_MultiTileUpgradeCasing.java
@@ -0,0 +1,71 @@
+package gregtech.api.multitileentity.enums;
+
+import gregtech.api.enums.GT_Values;
+
+public enum GT_MultiTileUpgradeCasing {
+
+ ULV_Inventory(0),
+ LV_Inventory(1),
+ MV_Inventory(2),
+ HV_Inventory(3),
+ EV_Inventory(4),
+ IV_Inventory(5),
+ LuV_Inventory(6),
+ ZPM_Inventory(7),
+ UV_Inventory(8),
+ UHV_Inventory(9),
+ UEV_Inventory(10),
+ UIV_Inventory(11),
+ UXV_Inventory(12),
+ UMV_Inventory(13),
+ MAX_Inventory(14),
+ ULV_Tank(15),
+ LV_Tank(16),
+ MV_Tank(17),
+ HV_Tank(18),
+ EV_Tank(19),
+ IV_Tank(20),
+ LuV_Tank(21),
+ ZPM_Tank(22),
+ UV_Tank(23),
+ UHV_Tank(24),
+ UEV_Tank(25),
+ UIV_Tank(26),
+ UXV_Tank(27),
+ UMV_Tank(28),
+ MAX_Tank(29),
+ Amp_4(30),
+ Amp_16(31),
+ Amp_64(32),
+ Amp_256(33),
+ Amp_1_024(34),
+ Amp_4_096(35),
+ Amp_16_384(36),
+ Amp_65_536(37),
+ Amp_262_144(38),
+ Amp_1_048_576(39),
+ Laser(40),
+ Wireless(41),
+ Cleanroom(42),
+ Heater_Prototype(100),
+ Heater_IndustrialGrade(101),
+ Heater_NextGen(102),
+ Heater_Omnipotent(103),
+ Heater_OmegaType(104),
+ Insulator_Prototype(105),
+ Insulator_IndustrialGrade(106),
+ Insulator_NextGen(107),
+ Insulator_Omnipotent(108),
+ Insulator_OmegaType(109),
+ NONE(GT_Values.W);
+
+ private final int meta;
+
+ GT_MultiTileUpgradeCasing(int meta) {
+ this.meta = meta;
+ }
+
+ public int getId() {
+ return meta;
+ }
+}
diff --git a/src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java b/src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java
new file mode 100644
index 0000000000..2733da33cf
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/enums/MultiTileCasingPurpose.java
@@ -0,0 +1,13 @@
+package gregtech.api.multitileentity.enums;
+
+/**
+ * Purposes with which a casing can registered itself in the MuTE controller to be ticked.
+ * Can be used for example to auto output recipe outputs from output casings.
+ *
+ * @author minecraft7771
+ */
+public enum MultiTileCasingPurpose {
+ ItemOutput,
+ FluidOutput,
+ EnergyOutput,
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
index 8535c50790..58af918c50 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockController.java
@@ -1,16 +1,24 @@
package gregtech.api.multitileentity.interfaces;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import net.minecraft.util.ChunkCoordinates;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidStack;
-import com.gtnewhorizons.modularui.api.screen.ModularWindow;
-import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import gregtech.api.enums.InventoryType;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.interfaces.FluidInventoryLogicHost;
+import gregtech.api.logic.interfaces.ItemInventoryLogicHost;
+import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
-import gregtech.api.logic.PowerLogic;
-
-public interface IMultiBlockController extends IMultiTileEntity, IMultiBlockFluidHandler, IMultiBlockInventory {
+public interface IMultiBlockController
+ extends IMultiTileEntity, FluidInventoryLogicHost, ItemInventoryLogicHost, UpgradableMuTE, PowerLogicHost, GUIHost {
boolean checkStructure(boolean aForceReset);
@@ -20,25 +28,24 @@ public interface IMultiBlockController extends IMultiTileEntity, IMultiBlockFlui
@Override
ChunkCoordinates getCoords();
- FluidStack getDrainableFluid(ForgeDirection side);
-
- FluidStack getDrainableFluid(ForgeDirection side, Fluid fluid);
+ void registerCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
- boolean isLiquidInput(ForgeDirection side);
+ void unregisterCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
- boolean isLiquidOutput(ForgeDirection side);
+ void registerCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part);
- void registerCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
+ void unregisterCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part);
- void unregisterCoveredPartOnSide(final ForgeDirection side, IMultiBlockPart part);
+ UUID registerItemInventory(int slots, int tier, @Nonnull InventoryType type, boolean isUpgradeInventory);
- void registerInventory(String aName, String aID, int aInventorySize, int aType);
+ ItemInventoryLogic unregisterItemInventory(@Nonnull UUID id, @Nonnull InventoryType type);
- void unregisterInventory(String aName, String aID, int aType);
+ void changeItemInventoryDisplayName(@Nonnull UUID id, @Nullable String displayName, @Nonnull InventoryType type);
- void changeInventoryName(String aName, String aID, int aType);
+ UUID registerFluidInventory(int tanks, long capacity, int tier, @Nonnull InventoryType type,
+ boolean isUpgradeInventory);
- PowerLogic getPowerLogic(IMultiBlockPart part, ForgeDirection side);
+ FluidInventoryLogic unregisterFluidInventory(@Nonnull UUID id, @Nonnull InventoryType type);
- ModularWindow createWindowGUI(UIBuildContext buildContext);
+ void changeFluidInventoryDisplayName(@Nonnull UUID id, @Nullable String displayName, @Nonnull InventoryType type);
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
index 017954f554..59d838fdeb 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiBlockPart.java
@@ -1,9 +1,14 @@
package gregtech.api.multitileentity.interfaces;
+import java.util.UUID;
+
import net.minecraft.util.ChunkCoordinates;
import net.minecraftforge.common.util.ForgeDirection;
-public interface IMultiBlockPart extends IMultiTileEntity {
+import gregtech.api.logic.interfaces.FluidInventoryLogicHost;
+import gregtech.api.logic.interfaces.ItemInventoryLogicHost;
+
+public interface IMultiBlockPart extends IMultiTileEntity, ItemInventoryLogicHost, FluidInventoryLogicHost {
ChunkCoordinates getTargetPos();
@@ -13,5 +18,9 @@ public interface IMultiBlockPart extends IMultiTileEntity {
int getLockedInventoryIndex();
+ UUID getLockedInventory();
+
boolean tickCoverAtSide(ForgeDirection side, long aTickTimer);
+
+ boolean shouldTick(long tickTimer);
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
index 7925ebd5b9..91803690fc 100644
--- a/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/IMultiTileEntity.java
@@ -17,18 +17,11 @@ import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.IFluidHandler;
import cpw.mods.fml.common.Optional;
import gregtech.api.enums.Mods;
-import gregtech.api.interfaces.tileentity.IBasicEnergyContainer;
-import gregtech.api.interfaces.tileentity.IColoredTileEntity;
import gregtech.api.interfaces.tileentity.ICoverable;
import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
-import gregtech.api.interfaces.tileentity.IEnergyConnected;
-import gregtech.api.interfaces.tileentity.IHasInventory;
-import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
-import gregtech.api.interfaces.tileentity.ITexturedTileEntity;
import gregtech.api.interfaces.tileentity.ITurnable;
import gregtech.api.multitileentity.MultiTileEntityBlockInternal;
import gregtech.api.multitileentity.MultiTileEntityItemInternal;
@@ -37,9 +30,7 @@ import gregtech.api.multitileentity.MultiTileEntityRegistry;
/*
* Heavily inspired by GT6
*/
-public interface IMultiTileEntity
- extends IHasWorldObjectAndCoords, ICoverable, ITurnable, IHasInventory, IEnergyConnected, IBasicEnergyContainer,
- IFluidHandler, ITexturedTileEntity, IDebugableTileEntity, IColoredTileEntity {
+public interface IMultiTileEntity extends ICoverable, ITurnable, IDebugableTileEntity {
/**
* Those two IDs HAVE to be saved inside the NBT of the TileEntity itself. They get set by the Registry itself, when
@@ -88,7 +79,7 @@ public interface IMultiTileEntity
void sendClientData(EntityPlayerMP aPlayer);
- boolean receiveClientEvent(int aEventID, int aValue);
+ boolean receiveClientData(int aEventID, int aValue);
void setShouldRefresh(boolean aShouldRefresh);
@@ -291,12 +282,12 @@ public interface IMultiTileEntity
interface IMTE_HasModes extends IMultiTileEntity {
- byte getMode();
+ int getMode();
- void setMode(byte aMode);
+ void setMode(int mode);
int getAllowedModes();
- void setAllowedModes(int aAllowedModes);
+ void setAllowedModes(int allowedModes);
}
}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java
new file mode 100644
index 0000000000..3b4c3cb6f3
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableModularMuTE.java
@@ -0,0 +1,10 @@
+package gregtech.api.multitileentity.interfaces;
+
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public interface UpgradableModularMuTE extends UpgradableMuTE {
+
+ void increaseMucCount(UpgradeCasings casingType, int tier);
+
+ void resetMucCount();
+}
diff --git a/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java
new file mode 100644
index 0000000000..c18852c95e
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/interfaces/UpgradableMuTE.java
@@ -0,0 +1,12 @@
+package gregtech.api.multitileentity.interfaces;
+
+public interface UpgradableMuTE {
+
+ void setCleanroom(boolean isCleanroom);
+
+ void setWirelessSupport(boolean canUse);
+
+ void setLaserSupport(boolean canUse);
+
+ void setMaxAmperage(long amperage);
+}
diff --git a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
index 0b6d4f587d..19c052b96a 100644
--- a/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
+++ b/src/main/java/gregtech/api/multitileentity/machine/MultiTileBasicMachine.java
@@ -1,18 +1,19 @@
package gregtech.api.multitileentity.machine;
-import static com.google.common.primitives.Ints.saturatedCast;
-import static gregtech.api.enums.GT_Values.B;
-import static gregtech.api.enums.GT_Values.VN;
+import static gregtech.api.enums.GT_Values.*;
+import static gregtech.api.enums.TickTime.MINUTE;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
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.tileentity.TileEntityFurnace;
import net.minecraft.util.EnumChatFormatting;
@@ -20,26 +21,32 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.IFluidTank;
+
+import org.jetbrains.annotations.ApiStatus.OverrideOnly;
import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.InventoryType;
import gregtech.api.enums.Mods;
import gregtech.api.enums.SoundResource;
import gregtech.api.enums.Textures;
import gregtech.api.enums.Textures.BlockIcons.CustomIcon;
import gregtech.api.enums.TickTime;
-import gregtech.api.fluid.FluidTankGT;
+import gregtech.api.enums.VoidingMode;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.gui.GUIProvider;
import gregtech.api.interfaces.ITexture;
-import gregtech.api.logic.PollutionLogic;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.logic.NullPowerLogic;
import gregtech.api.logic.PowerLogic;
-import gregtech.api.logic.ProcessingLogic;
-import gregtech.api.logic.interfaces.PollutionLogicHost;
import gregtech.api.logic.interfaces.PowerLogicHost;
import gregtech.api.logic.interfaces.ProcessingLogicHost;
import gregtech.api.metatileentity.GregTechTileClientEvents;
@@ -47,13 +54,14 @@ import gregtech.api.multitileentity.MultiTileEntityRegistry;
import gregtech.api.multitileentity.base.TickableMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileMachine;
import gregtech.api.net.GT_Packet_MultiTileEntity;
-import gregtech.api.recipe.check.CheckRecipeResult;
import gregtech.api.render.TextureFactory;
+import gregtech.api.task.tasks.ProcessingTask;
import gregtech.api.util.GT_Utility;
import gregtech.client.GT_SoundLoop;
-import gregtech.common.GT_Pollution;
+import gregtech.common.gui.MachineGUIProvider;
-public abstract class MultiTileBasicMachine extends TickableMultiTileEntity implements IMultiTileMachine {
+public abstract class MultiTileBasicMachine<P extends MuTEProcessingLogic<P>> extends TickableMultiTileEntity
+ implements IMultiTileMachine, ProcessingLogicHost<P>, PowerLogicHost, GUIHost {
protected static final int ACTIVE = B[0];
protected static final int TICKS_BETWEEN_RECIPE_CHECKS = 5 * TickTime.SECOND;
@@ -70,22 +78,10 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
protected int maxParallel = 1;
protected boolean active = false;
- protected long storedEnergy = 0;
- protected long voltage = 0;
- protected long amperage = 2;
- protected long eut = 0;
protected int tier = 0;
- protected long maxProgressTime = 0;
- protected long progressTime = 0;
protected long burnTime = 0;
protected long totalBurnTime = 0;
- protected FluidTankGT[] inputTanks = GT_Values.emptyFluidTankGT;
- protected FluidTankGT[] outputTanks = GT_Values.emptyFluidTankGT;
- protected FluidStack[] fluidsToOutput = GT_Values.emptyFluidStack;
- protected ItemStack[] itemsToOutput = GT_Values.emptyItemStackArray;
- protected IItemHandlerModifiable inputInventory = EMPTY_INVENTORY;
- protected IItemHandlerModifiable outputInventory = EMPTY_INVENTORY;
protected boolean outputInventoryChanged = false;
protected boolean powerShutDown = false;
protected boolean wasEnabled = false;
@@ -93,13 +89,30 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
protected boolean isElectric = true;
protected boolean isSteam = false;
protected boolean acceptsFuel = false;
- protected boolean isWireless = false;
+
protected byte soundEvent = 0;
protected int soundEventValue = 0;
+ protected ItemInventoryLogic itemInput;
+ protected ItemInventoryLogic itemOutput;
+ protected FluidInventoryLogic fluidInput;
+ protected FluidInventoryLogic fluidOutput;
+
+ protected P processingLogic;
+ @Nonnull
+ protected VoidingMode voidingMode = VoidingMode.VOID_NONE;
+ protected boolean processingUpdate = false;
+ @Nonnull
+ protected PowerLogic power = createPowerLogic();
+ @Nonnull
+ protected GUIProvider<?> guiProvider = createGUIProvider();
@SideOnly(Side.CLIENT)
protected GT_SoundLoop activitySoundLoop;
+ public MultiTileBasicMachine() {
+ new ProcessingTask<>(this);
+ }
+
@Override
public String getTileEntityName() {
return "gt.multitileentity.machine.basic";
@@ -116,80 +129,34 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
nbt.setBoolean(NBT.ACTIVE, active);
}
- if (inputInventory != null && inputInventory.getSlots() > 0) {
- writeInventory(nbt, inputInventory, NBT.INV_INPUT_LIST);
- }
-
- if (outputInventory != null && outputInventory.getSlots() > 0) {
- writeInventory(nbt, outputInventory, NBT.INV_OUTPUT_LIST);
- }
+ saveItemLogic(nbt);
+ saveFluidLogic(nbt);
- for (int i = 0; i < inputTanks.length; i++) {
- inputTanks[i].writeToNBT(nbt, NBT.TANK_IN + i);
- }
-
- for (int i = 0; i < outputTanks.length; i++) {
- outputTanks[i].writeToNBT(nbt, NBT.TANK_OUT + i);
- }
-
- if (fluidsToOutput != null && fluidsToOutput.length > 0) {
- writeFluids(nbt, fluidsToOutput, NBT.FLUID_OUT);
- }
-
- if (itemsToOutput != null) {
- saveItemsToOutput(nbt);
+ if (processingLogic != null) {
+ NBTTagCompound processingLogicNBT = processingLogic.saveToNBT();
+ nbt.setTag("processingLogic", processingLogicNBT);
}
nbt.setInteger(NBT.TIER, tier);
- nbt.setLong(NBT.EUT_CONSUMPTION, eut);
nbt.setLong(NBT.BURN_TIME_LEFT, burnTime);
nbt.setLong(NBT.TOTAL_BURN_TIME, totalBurnTime);
nbt.setBoolean(NBT.ALLOWED_WORK, canWork);
nbt.setBoolean(NBT.ACTIVE, active);
+ power.saveToNBT(nbt);
}
- protected void writeFluids(NBTTagCompound nbt, FluidStack[] fluids, String fluidListTag) {
- if (fluids != null && fluids.length > 0) {
- final NBTTagList tList = new NBTTagList();
- for (final FluidStack tFluid : fluids) {
- if (tFluid != null) {
- final NBTTagCompound tag = new NBTTagCompound();
- tFluid.writeToNBT(tag);
- tList.appendTag(tag);
- }
- }
- nbt.setTag(fluidListTag, tList);
- }
- }
-
- protected void writeInventory(NBTTagCompound nbt, IItemHandlerModifiable inv, String invListTag) {
- if (inv != null && inv.getSlots() > 0) {
- final NBTTagList tList = new NBTTagList();
- for (int slot = 0; slot < inv.getSlots(); slot++) {
- final ItemStack tStack = inv.getStackInSlot(slot);
- if (tStack != null) {
- final NBTTagCompound tag = new NBTTagCompound();
- tag.setByte("s", (byte) slot);
- tStack.writeToNBT(tag);
- tList.appendTag(tag);
- }
- }
- nbt.setTag(invListTag, tList);
- }
+ protected void saveItemLogic(NBTTagCompound nbt) {
+ NBTTagCompound nbtListInput = itemInput.saveToNBT();
+ nbt.setTag(NBT.INV_INPUT_LIST, nbtListInput);
+ NBTTagCompound nbtListOutput = itemOutput.saveToNBT();
+ nbt.setTag(NBT.INV_OUTPUT_LIST, nbtListOutput);
}
- protected void saveItemsToOutput(NBTTagCompound aNBT) {
- final NBTTagList nbtList = new NBTTagList();
- for (int slot = 0; slot < itemsToOutput.length; slot++) {
- final ItemStack itemStack = itemsToOutput[slot];
- if (itemStack != null) {
- final NBTTagCompound tag = new NBTTagCompound();
- tag.setByte("s", (byte) slot);
- itemStack.writeToNBT(tag);
- nbtList.appendTag(tag);
- }
- }
- aNBT.setTag(NBT.ITEM_OUT, nbtList);
+ protected void saveFluidLogic(NBTTagCompound nbt) {
+ NBTTagCompound fluidInputNBT = fluidInput.saveToNBT();
+ nbt.setTag(NBT.TANK_IN, fluidInputNBT);
+ NBTTagCompound fluidOutputNBT = fluidOutput.saveToNBT();
+ nbt.setTag(NBT.TANK_OUT, fluidOutputNBT);
}
@Override
@@ -203,63 +170,48 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
active = nbt.getBoolean(NBT.ACTIVE);
}
- /* Inventories */
- inputInventory = new ItemStackHandler(Math.max(nbt.getInteger(NBT.INV_INPUT_SIZE), 0));
- outputInventory = new ItemStackHandler(Math.max(nbt.getInteger(NBT.INV_OUTPUT_SIZE), 0));
- loadInventory(nbt, inputInventory, NBT.INV_INPUT_LIST);
- loadInventory(nbt, outputInventory, NBT.INV_OUTPUT_LIST);
-
- /* Tanks */
- long capacity = 1000;
- if (nbt.hasKey(NBT.TANK_CAPACITY)) {
- capacity = saturatedCast(nbt.getLong(NBT.TANK_CAPACITY));
- }
-
- inputTanks = new FluidTankGT[getFluidInputCount()];
- outputTanks = new FluidTankGT[getFluidOutputCount()];
- fluidsToOutput = new FluidStack[getFluidOutputCount()];
-
- // TODO: See if we need the adjustable map here `.setCapacity(mRecipes, mParallel * 2L)` in place of the
- // `setCapacityMultiplier`
- for (int i = 0; i < inputTanks.length; i++) {
- inputTanks[i] = new FluidTankGT(capacity).setCapacityMultiplier(maxParallel * 2L)
- .readFromNBT(nbt, NBT.TANK_IN + i);
- }
- for (int i = 0; i < outputTanks.length; i++) {
- outputTanks[i] = new FluidTankGT(capacity).setCapacityMultiplier(maxParallel * 2L)
- .readFromNBT(nbt, NBT.TANK_OUT + i);
- }
+ loadItemLogic(nbt);
+ loadFluidLogic(nbt);
- for (int i = 0; i < fluidsToOutput.length; i++) {
- fluidsToOutput[i] = FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag(NBT.FLUID_OUT + "." + i));
+ if (nbt.hasKey("processingLogic")) {
+ P processingLogic = getProcessingLogic();
+ processingLogic.loadFromNBT(Objects.requireNonNull(nbt.getCompoundTag("processingLogic")));
}
- loadItemsToOutput(nbt);
-
tier = nbt.getInteger(NBT.TIER);
- eut = nbt.getLong(NBT.EUT_CONSUMPTION);
burnTime = nbt.getLong(NBT.BURN_TIME_LEFT);
totalBurnTime = nbt.getLong(NBT.TOTAL_BURN_TIME);
canWork = nbt.getBoolean(NBT.ALLOWED_WORK);
active = nbt.getBoolean(NBT.ACTIVE);
+ power.loadFromNBT(nbt);
}
- 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));
+ protected void loadItemLogic(NBTTagCompound nbt) {
+ itemInput = new ItemInventoryLogic(nbt.getInteger(NBT.INV_OUTPUT_SIZE), tier);
+ itemOutput = new ItemInventoryLogic(nbt.getInteger(NBT.INV_OUTPUT_SIZE), tier);
+ if (nbt.hasKey(NBT.INV_INPUT_LIST)) {
+ itemInput.loadFromNBT(nbt.getCompoundTag(NBT.INV_INPUT_LIST));
+ }
+ if (nbt.hasKey(NBT.INV_OUTPUT_LIST)) {
+ itemOutput.loadFromNBT(nbt.getCompoundTag(NBT.INV_OUTPUT_LIST));
}
}
- protected void loadItemsToOutput(NBTTagCompound aNBT) {
- final NBTTagList tList = aNBT.getTagList(NBT.ITEM_OUT, 10);
- itemsToOutput = new ItemStack[tList.tagCount()];
- for (int i = 0; i < tList.tagCount(); i++) {
- final NBTTagCompound tNBT = tList.getCompoundTagAt(i);
- final int tSlot = tNBT.getByte("s");
- if (tSlot >= 0 && tSlot < itemsToOutput.length) itemsToOutput[tSlot] = GT_Utility.loadItem(tNBT);
+ protected void loadFluidLogic(NBTTagCompound nbt) {
+ fluidInput = new FluidInventoryLogic(16, 10000, tier);
+ fluidOutput = new FluidInventoryLogic(16, 10000, tier);
+ fluidInput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_IN));
+ fluidOutput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_OUT));
+ }
+
+ public boolean checkTexture(String modID, String resourcePath) {
+ try {
+ Minecraft.getMinecraft()
+ .getResourceManager()
+ .getResource(new ResourceLocation(modID, resourcePath));
+ return true;
+ } catch (IOException ignored) {
+ return false;
}
}
@@ -268,17 +220,10 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
super.loadTextures(folder);
for (StatusTextures textureName : StatusTextures.TEXTURES) {
ITexture texture = null;
- try {
- Minecraft.getMinecraft()
- .getResourceManager()
- .getResource(
- new ResourceLocation(
- Mods.GregTech.ID,
- "textures/blocks/multitileentity/" + folder + "/" + textureName.getName() + ".png"));
- } catch (IOException ignored) {
+ String texturePath = "textures/blocks/multitileentity/" + folder + "/" + textureName.getName() + ".png";
+ if (!checkTexture(Mods.GregTech.ID, texturePath)) {
texture = TextureFactory.of(Textures.BlockIcons.VOID);
- }
- if (texture == null) {
+ } else {
if (textureName.hasGlow()) {
texture = TextureFactory.builder()
.addIcon(new CustomIcon("multitileentity/" + folder + "/" + textureName.getName()))
@@ -357,79 +302,6 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
@Override
public void setLightValue(byte aLightValue) {}
- @Override
- public String getInventoryName() {
- final String name = getCustomName();
- if (name != null) return name;
- final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID());
- return tRegistry == null ? getClass().getName() : tRegistry.getLocal(getMultiTileEntityID());
- }
-
- @Override
- public boolean isUseableByPlayer(EntityPlayer aPlayer) {
- return playerOwnsThis(aPlayer, false) && mTickTimer > 40
- && getTileEntityOffset(0, 0, 0) == this
- && aPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64
- && allowInteraction(aPlayer);
- }
-
- @Override
- public boolean isLiquidInput(ForgeDirection side) {
- return side != facing;
- }
-
- @Override
- public boolean isLiquidOutput(ForgeDirection side) {
- return side != facing;
- }
-
- @Override
- protected IFluidTank[] getFluidTanks(ForgeDirection side) {
- final boolean fluidInput = isLiquidInput(side);
- final boolean fluidOutput = isLiquidOutput(side);
-
- if (fluidInput && fluidOutput) {
- final IFluidTank[] rTanks = new IFluidTank[inputTanks.length + outputTanks.length];
- System.arraycopy(inputTanks, 0, rTanks, 0, inputTanks.length);
- System.arraycopy(outputTanks, 0, rTanks, inputTanks.length, outputTanks.length);
- return rTanks;
- } else if (fluidInput) {
- return inputTanks;
- } else if (fluidOutput) {
- return outputTanks;
- }
- return GT_Values.emptyFluidTank;
- }
-
- @Override
- public IFluidTank getFluidTankFillable(ForgeDirection side, FluidStack aFluidToFill) {
- return getFluidTankFillable(facing, side, aFluidToFill);
- }
-
- public IFluidTank getFluidTankFillable(ForgeDirection sideSource, ForgeDirection sideDestination,
- FluidStack fluidToFill) {
- if (sideSource.compareTo(sideDestination) != 0) return null;
- for (FluidTankGT tankGT : inputTanks) if (tankGT.contains(fluidToFill)) return tankGT;
- // if (!mRecipes.containsInput(aFluidToFill, this, slot(mRecipes.mInputItemsCount +
- // mRecipes.mOutputItemsCount))) return null;
- for (FluidTankGT fluidTankGT : inputTanks) if (fluidTankGT.isEmpty()) return fluidTankGT;
- return null;
- }
-
- @Override
- protected IFluidTank getFluidTankDrainable(ForgeDirection side, FluidStack aFluidToDrain) {
- return getFluidTankDrainable(facing, side, aFluidToDrain);
- }
-
- protected IFluidTank getFluidTankDrainable(ForgeDirection sideSource, ForgeDirection sideDestination,
- FluidStack fluidToDrain) {
- if (sideSource.compareTo(sideDestination) != 0) return null;
- for (FluidTankGT fluidTankGT : outputTanks)
- if (fluidToDrain == null ? fluidTankGT.has() : fluidTankGT.contains(fluidToDrain)) return fluidTankGT;
-
- return null;
- }
-
/*
* Inventory
*/
@@ -453,16 +325,6 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
hasInventoryChanged = true;
}
- @Override
- public boolean isItemValidForSlot(int aSlot, ItemStack aStack) {
- return true;
- }
-
- @Override
- public int getInventoryStackLimit() {
- return 64;
- }
-
// #region Machine
@Override
@@ -480,28 +342,26 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
* @param tick The current tick of the machine
*/
protected void runMachine(long tick) {
- if (acceptsFuel() && isActive()) {
- if (!consumeFuel()) {
- stopMachine(true);
- return;
- }
+ if (acceptsFuel() && isActive() && !consumeFuel()) {
+ stopMachine(true);
+ return;
}
if (hasThingsToDo()) {
markDirty();
runningTick(tick);
- } else {
- if (tick % TICKS_BETWEEN_RECIPE_CHECKS == 0 || hasWorkJustBeenEnabled() || hasInventoryBeenModified()) {
- if (isAllowedToWork()) {
- wasEnabled = false;
- if (checkRecipe()) {
- setActive(true);
- setSound(GregTechTileClientEvents.START_SOUND_LOOP, PROCESS_START_SOUND_INDEX);
- updateSlots();
- markDirty();
- issueClientUpdate();
- }
- }
+ return;
+ }
+
+ if (tick % TICKS_BETWEEN_RECIPE_CHECKS == 0 || hasWorkJustBeenEnabled()
+ || hasInventoryBeenModified() && isAllowedToWork()) {
+ wasEnabled = false;
+ if (checkRecipe()) {
+ setActive(true);
+ setSound(GregTechTileClientEvents.START_SOUND_LOOP, PROCESS_START_SOUND_INDEX);
+ updateSlots();
+ markDirty();
+ issueClientUpdate();
}
}
}
@@ -512,81 +372,25 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
* @param tick The current tick of the machine
*/
protected void runningTick(long tick) {
- if (this instanceof PowerLogicHost) {
- consumeEnergy();
- }
-
- if (maxProgressTime > 0 && ++progressTime >= maxProgressTime) {
- progressTime = 0;
- maxProgressTime = 0;
- outputItems();
- outputFluids();
- if (isAllowedToWork()) {
- if (!checkRecipe()) {
- setActive(false);
- issueClientUpdate();
- }
- }
- updateSlots();
- }
-
- if (this instanceof PollutionLogicHost && tick % POLLUTION_TICK == 0) {
- doPollution();
- }
- emitEnergy();
+ consumeEnergy();
}
/**
* Runs only on server side
*/
protected boolean checkRecipe() {
- if (!(this instanceof ProcessingLogicHost)) {
- return false;
- }
- ProcessingLogic logic = ((ProcessingLogicHost) this).getProcessingLogic();
- logic.clear();
- CheckRecipeResult result = logic.setInputItems(getInputItems())
- .setInputFluids(getInputFluids())
- .setCurrentOutputItems(
- outputInventory.getStacks()
- .toArray(new ItemStack[0]))
- .process();
- setDuration(logic.getDuration());
- setEut(logic.getCalculatedEut());
- setItemOutputs(logic.getOutputItems());
- setFluidOutputs(logic.getOutputFluids());
- return result.wasSuccessful();
- }
-
- /**
- * Runs only on server side
- */
- protected void doPollution() {
- PollutionLogic logic = ((PollutionLogicHost) this).getPollutionLogic();
-
- if (logic == null) {
- return;
- }
-
- GT_Pollution.addPollution(getWorld(), getXCoord() >> 4, getZCoord() >> 4, logic.getPollutionAmount());
+ return false;
}
/**
* Runs only on server side
*/
- protected void emitEnergy() {}
-
- /**
- * Runs only on server side
- */
protected void consumeEnergy() {
- PowerLogic logic = ((PowerLogicHost) this).getPowerLogic(ForgeDirection.UNKNOWN);
+ PowerLogic logic = getPowerLogic();
- if (logic == null) {
- return;
- }
+ P processing = getProcessingLogic();
- if (!logic.removeEnergyUnsafe(eut)) {
+ if (!logic.removeEnergyUnsafe(processing.getCalculatedEut())) {
stopMachine(true);
}
}
@@ -603,9 +407,8 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
}
public void startSoundLoop(byte aIndex, double aX, double aY, double aZ) {
- if (aIndex == PROCESS_START_SOUND_INDEX) {
- if (getProcessStartSound() != null)
- GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
+ if (aIndex == PROCESS_START_SOUND_INDEX && getProcessStartSound() != null) {
+ GT_Utility.doSoundAtClient(getProcessStartSound(), getTimeBetweenProcessSounds(), 1.0F, aX, aY, aZ);
}
}
@@ -619,18 +422,18 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
@SideOnly(Side.CLIENT)
protected void doActivitySound(ResourceLocation activitySound) {
- if (isActive() && activitySound != null) {
- if (activitySoundLoop == null) {
- activitySoundLoop = new GT_SoundLoop(activitySound, this, false, true);
- Minecraft.getMinecraft()
- .getSoundHandler()
- .playSound(activitySoundLoop);
- }
- } else {
- if (activitySoundLoop != null) {
- activitySoundLoop = null;
- }
+ if (isActive() && activitySound != null && activitySoundLoop == null) {
+ activitySoundLoop = new GT_SoundLoop(activitySound, this, false, true);
+ Minecraft.getMinecraft()
+ .getSoundHandler()
+ .playSound(activitySoundLoop);
+ return;
}
+
+ if (activitySoundLoop != null) {
+ activitySoundLoop = null;
+ }
+
}
@SideOnly(Side.CLIENT)
@@ -639,105 +442,69 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
}
protected ItemStack[] getInputItems() {
- return inputInventory.getStacks()
- .toArray(new ItemStack[0]);
+ return itemInput.getStoredItems();
}
protected FluidStack[] getInputFluids() {
- return Arrays.stream(inputTanks)
- .map(FluidTankGT::get)
- .toArray(FluidStack[]::new);
- }
-
- protected void outputItems() {
- outputItems(itemsToOutput);
- itemsToOutput = null;
- }
-
- protected void outputItems(ItemStack... itemsToOutput) {
- outputItems(outputInventory, itemsToOutput);
+ return fluidInput.getStoredFluids();
}
- protected void outputItems(IItemHandlerModifiable inventory, ItemStack... itemsToOutput) {
- if (itemsToOutput == null || inventory == null) {
- return;
- }
- for (ItemStack item : itemsToOutput) {
- int index = 0;
- while (item != null && item.stackSize > 0 && index < inventory.getSlots()) {
- item = inventory.insertItem(index++, item.copy(), false);
- }
- }
- }
-
- protected void outputFluids() {
- outputFluids(fluidsToOutput);
- fluidsToOutput = null;
- }
-
- protected void outputFluids(FluidStack... fluidsToOutput) {
- outputFluids(outputTanks, fluidsToOutput);
- }
-
- protected void outputFluids(FluidTankGT[] tankArray, FluidStack... fluidsToOutput) {
- if (fluidsToOutput == null) {
- return;
- }
- for (FluidStack fluid : fluidsToOutput) {
- tryToFillTanks(fluid, tankArray);
- }
- }
-
- protected void tryToFillTanks(FluidStack fluid, FluidTankGT... tanks) {
- for (FluidTankGT tank : tanks) {
- if (tank.canFillAll(fluid)) {
- fluid.amount -= tank.add(fluid.amount, fluid);
- }
- }
- }
-
- public long getProgress() {
- return progressTime;
+ @Override
+ public int getProgress() {
+ P processing = getProcessingLogic();
+ return processing.getProgress();
}
- public long getMaxProgress() {
- return maxProgressTime;
+ @Override
+ public int getMaxProgress() {
+ P processing = getProcessingLogic();
+ return processing.getDuration();
}
- public boolean increaseProgress(int aProgressAmountInTicks) {
- progressTime += aProgressAmountInTicks;
+ @Override
+ public boolean increaseProgress(int progressAmount) {
+ P processing = getProcessingLogic();
+ processing.increaseProgress(progressAmount);
return true;
}
+ @Override
public boolean hasThingsToDo() {
return getMaxProgress() > 0;
}
+ @Override
public boolean hasWorkJustBeenEnabled() {
return wasEnabled;
}
+ @Override
public void enableWorking() {
wasEnabled = true;
canWork = true;
}
+ @Override
public void disableWorking() {
canWork = false;
}
+ @Override
public boolean wasShutdown() {
return powerShutDown;
}
+ @Override
public boolean isAllowedToWork() {
return canWork;
}
+ @Override
public boolean isActive() {
return active;
}
+ @Override
public void setActive(boolean active) {
this.active = active;
}
@@ -766,37 +533,18 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
this.acceptsFuel = acceptsFuel;
}
- protected boolean isWireless() {
- return isWireless;
- }
-
- protected void setWireless(boolean isWireless) {
- this.isWireless = isWireless;
- }
-
- protected boolean drainEut(long eut) {
- return decreaseStoredEnergyUnits(eut, false);
- }
-
- protected boolean generateEut(long eut) {
- return increaseStoredEnergyUnits(eut, true);
- }
-
- protected boolean isGenerator() {
- return false;
- }
-
protected boolean consumeFuel() {
+ if (isElectric() || isSteam()) return false;
if (isActive() && burnTime <= 0) {
- for (int i = 0; i < inputInventory.getSlots(); i++) {
- if (inputInventory.getStackInSlot(i) != null) {
- int checkBurnTime = TileEntityFurnace.getItemBurnTime(inputInventory.getStackInSlot(i)) / 10;
- if (checkBurnTime <= 0) continue;
- inputInventory.getStackInSlot(i).stackSize--;
- burnTime = checkBurnTime;
- totalBurnTime = checkBurnTime;
- break;
- }
+ for (int i = 0; i < itemInput.getSlots(); i++) {
+ ItemStack item = itemInput.getItemInSlot(i);
+ if (item == null) continue;
+ int checkBurnTime = TileEntityFurnace.getItemBurnTime(item) / 10;
+ if (checkBurnTime <= 0) continue;
+ item.stackSize--;
+ burnTime = checkBurnTime;
+ totalBurnTime = checkBurnTime;
+ break;
}
updateSlots();
}
@@ -806,8 +554,7 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
totalBurnTime = 0;
return false;
}
-
- return true;
+ return false;
}
@Override
@@ -826,38 +573,36 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
list.add("Fuel: " + EnumChatFormatting.GOLD + burnTime + "/" + totalBurnTime);
}
- if (this instanceof PowerLogicHost powerLogicHost) {
- PowerLogic logic = powerLogicHost.getPowerLogic(facing);
- if (isElectric) {
- list.add(
- StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
- + EnumChatFormatting.GREEN
- + GT_Utility.formatNumbers(logic.getStoredEnergy())
- + EnumChatFormatting.RESET
- + " EU / "
- + EnumChatFormatting.YELLOW
- + GT_Utility.formatNumbers(logic.getCapacity())
- + EnumChatFormatting.RESET
- + " EU");
- list.add(
- StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
- + EnumChatFormatting.RED
- + GT_Utility.formatNumbers(eut)
- + EnumChatFormatting.RESET
- + " EU/t");
- list.add(
- StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
- + EnumChatFormatting.YELLOW
- + GT_Utility.formatNumbers(logic.getVoltage())
- + EnumChatFormatting.RESET
- // TODO: Put ampere getter here, once that's variable
- + " EU/t(*2A) "
- + StatCollector.translateToLocal("GT5U.machines.tier")
- + ": "
- + EnumChatFormatting.YELLOW
- + VN[GT_Utility.getTier(logic.getVoltage())]
- + EnumChatFormatting.RESET);
- }
+ PowerLogic logic = getPowerLogic();
+ if (isElectric) {
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.energy") + ": "
+ + EnumChatFormatting.GREEN
+ + GT_Utility.formatNumbers(logic.getStoredEnergy())
+ + EnumChatFormatting.RESET
+ + " EU / "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(logic.getCapacity())
+ + EnumChatFormatting.RESET
+ + " EU");
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.usage") + ": "
+ + EnumChatFormatting.RED
+ + GT_Utility.formatNumbers(getProcessingLogic().getCalculatedEut())
+ + EnumChatFormatting.RESET
+ + " EU/t");
+ list.add(
+ StatCollector.translateToLocal("GT5U.multiblock.mei") + ": "
+ + EnumChatFormatting.YELLOW
+ + GT_Utility.formatNumbers(logic.getVoltage())
+ + EnumChatFormatting.RESET
+ // TODO: Put ampere getter here, once that's variable
+ + " EU/t(*2A) "
+ + StatCollector.translateToLocal("GT5U.machines.tier")
+ + ": "
+ + EnumChatFormatting.YELLOW
+ + VN[GT_Utility.getTier(logic.getVoltage())]
+ + EnumChatFormatting.RESET);
}
addProgressStringToScanner(player, logLevel, list);
@@ -873,6 +618,9 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
}
protected void addProgressStringToScanner(EntityPlayer player, int logLevel, ArrayList<String> list) {
+ P processing = getProcessingLogic();
+ int progressTime = processing.getProgress();
+ int maxProgressTime = processing.getDuration();
list.add(
StatCollector.translateToLocal("GT5U.multiblock.Progress") + ": "
+ EnumChatFormatting.GREEN
@@ -886,7 +634,6 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
}
protected void stopMachine(boolean powerShutDown) {
- progressTime = 0;
setActive(false);
disableWorking();
if (powerShutDown) {
@@ -896,50 +643,10 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
}
protected void updateSlots() {
- for (int i = 0; i < inputInventory.getSlots(); i++) {
- ItemStack item = inputInventory.getStackInSlot(i);
- if (item != null && item.stackSize <= 0) {
- inputInventory.setStackInSlot(i, null);
- }
- }
-
- for (FluidTankGT inputTank : inputTanks) {
- if (inputTank == null) {
- continue;
- }
-
- if (inputTank.get() != null && inputTank.get().amount <= 0) {
- inputTank.setEmpty();
- continue;
- }
-
- FluidStack afterRecipe = inputTank.get();
- FluidStack beforeRecipe = inputTank.get(Integer.MAX_VALUE);
- if (afterRecipe == null || beforeRecipe == null) {
- continue;
- }
- int difference = beforeRecipe.amount - afterRecipe.amount;
- inputTank.remove(difference);
- }
- }
-
- /**
- * Must always be a positive. If the multi generates Eu/t isGenerator() should be overridden to true
- */
- protected void setEut(long eut) {
- if (eut < 0) {
- eut = -eut;
- }
-
- this.eut = eut;
- }
-
- protected void setDuration(long duration) {
- if (duration < 0) {
- duration = -duration;
- }
-
- maxProgressTime = duration;
+ itemInput.update(false);
+ itemOutput.update(false);
+ fluidInput.update();
+ fluidOutput.update();
}
@Override
@@ -956,53 +663,149 @@ public abstract class MultiTileBasicMachine extends TickableMultiTileEntity impl
setActive((booleans & ACTIVE) == ACTIVE);
}
- protected boolean hasItemInput() {
+ public boolean hasItemInput() {
return true;
}
- protected boolean hasItemOutput() {
+ public boolean hasItemOutput() {
return true;
}
- protected boolean hasFluidInput() {
+ public boolean hasFluidInput() {
return true;
}
- protected boolean hasFluidOutput() {
+ public boolean hasFluidOutput() {
return true;
}
- protected void setItemOutputs(ItemStack... outputs) {
- itemsToOutput = outputs;
- }
-
- protected void setFluidOutputs(FluidStack... outputs) {
- fluidsToOutput = outputs;
- }
-
@Override
public void setSound(byte soundEvent, int soundEventValue) {
this.soundEvent = soundEvent;
this.soundEventValue = soundEventValue;
- if (isClientSide()) {
- switch (soundEventValue) {
- case PROCESS_START_SOUND_INDEX -> {
- if (getProcessStartSound() != null) GT_Utility.doSoundAtClient(
- getProcessStartSound(),
- getTimeBetweenProcessSounds(),
- 1.0F,
- getXCoord(),
- getYCoord(),
- getZCoord());
- }
- case INTERRUPT_SOUND_INDEX -> GT_Utility.doSoundAtClient(
- SoundResource.IC2_MACHINES_INTERRUPT_ONE,
- 100,
+ if (isServerSide()) {
+ return;
+ }
+
+ switch (soundEventValue) {
+ case PROCESS_START_SOUND_INDEX -> {
+ if (getProcessStartSound() != null) GT_Utility.doSoundAtClient(
+ getProcessStartSound(),
+ getTimeBetweenProcessSounds(),
1.0F,
getXCoord(),
getYCoord(),
getZCoord());
}
+ case INTERRUPT_SOUND_INDEX -> GT_Utility.doSoundAtClient(
+ SoundResource.IC2_MACHINES_INTERRUPT_ONE,
+ 100,
+ 1.0F,
+ getXCoord(),
+ getYCoord(),
+ getZCoord());
}
+
+ }
+
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> itemInput;
+ case Output -> itemOutput;
+ default -> null;
+ };
+ }
+
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> fluidInput;
+ case Output -> fluidOutput;
+ default -> null;
+ };
}
+
+ @Override
+ @Nonnull
+ public P getProcessingLogic() {
+ if (processingLogic == null) {
+ processingLogic = createProcessingLogic().setMachineHost(this);
+ }
+ return Objects.requireNonNull(processingLogic);
+ }
+
+ @OverrideOnly
+ @Nonnull
+ protected abstract P createProcessingLogic();
+
+ @Override
+ public boolean isInputSeparated() {
+ return false;
+ }
+
+ @Nonnull
+ @Override
+ public VoidingMode getVoidMode() {
+ return voidingMode;
+ }
+
+ @Override
+ public boolean needsUpdate() {
+ return processingUpdate;
+ }
+
+ @Override
+ public void setProcessingUpdate(boolean update) {
+ processingUpdate = update;
+ }
+
+ @Override
+ @Nonnull
+ public PowerLogic getPowerLogic(@Nonnull ForgeDirection side) {
+ if (side == facing) return new NullPowerLogic();
+ return power;
+ }
+
+ @Override
+ @Nonnull
+ public ForgeDirection getPowerOutputSide() {
+ return Objects.requireNonNull(facing.getOpposite());
+ }
+
+ protected void updatePowerLogic() {
+ power.setEnergyCapacity(GT_Values.V[tier] * power.getMaxAmperage() * 2 * MINUTE);
+ power.setMaxVoltage(GT_Values.V[tier]);
+ power.setMaxAmperage(1);
+ }
+
+ @Nonnull
+ protected PowerLogic createPowerLogic() {
+ return new PowerLogic().setMaxAmperage(1)
+ .setType(PowerLogic.RECEIVER);
+ }
+
+ @Nonnull
+ protected GUIProvider<?> createGUIProvider() {
+ return new MachineGUIProvider<>(this);
+ }
+
+ @Nonnull
+ public GUIProvider<?> getGUI(@Nonnull UIBuildContext uiContext) {
+ return guiProvider;
+ }
+
+ @Override
+ public ItemStack getAsItem() {
+ return MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID())
+ .getItem(getMultiTileEntityID());
+ }
+
+ @Override
+ public String getMachineName() {
+ return StatCollector.translateToLocal(getAsItem().getUnlocalizedName());
+ }
+
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
index 808c16a200..cdcb77d6e5 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/ComplexParallelController.java
@@ -2,7 +2,8 @@ package gregtech.api.multitileentity.multiblock.base;
import java.util.ArrayList;
import java.util.List;
-import java.util.stream.LongStream;
+
+import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
@@ -12,206 +13,58 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
-import net.minecraftforge.fluids.FluidStack;
-import gregtech.api.enums.GT_Values;
import gregtech.api.logic.ComplexParallelProcessingLogic;
-import gregtech.api.logic.interfaces.PollutionLogicHost;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.GT_Waila;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
-public abstract class ComplexParallelController<T extends ComplexParallelController<T>> extends PowerController<T> {
+public abstract class ComplexParallelController<C extends ComplexParallelController<C, P>, P extends ComplexParallelProcessingLogic<P>>
+ extends Controller<C, P> {
- protected ComplexParallelProcessingLogic processingLogic;
protected int maxComplexParallels = 0;
protected int currentComplexParallels = 0;
- protected long[] maxProgressTimes = new long[0];
- protected long[] progressTimes = new long[0];
public ComplexParallelController() {
isSimpleMachine = false;
}
- protected void setMaxComplexParallels(int parallel) {
- if (parallel != maxComplexParallels) {
- if (maxComplexParallels != 0) {
- stopMachine(false);
- }
- maxProgressTimes = new long[parallel];
- progressTimes = new long[parallel];
+ protected void setMaxComplexParallels(int parallel, boolean stopMachine) {
+ if (parallel != maxComplexParallels && maxComplexParallels != 0 && stopMachine) {
+ stopMachine(false);
}
maxComplexParallels = parallel;
- }
-
- @Override
- protected void runMachine(long tick) {
- if (acceptsFuel() && isActive()) {
- if (!consumeFuel()) {
- stopMachine(true);
- return;
- }
- }
-
- if (hasThingsToDo()) {
- markDirty();
- runningTick(tick);
- }
- if ((tick % TICKS_BETWEEN_RECIPE_CHECKS == 0 || hasWorkJustBeenEnabled() || hasInventoryBeenModified())
- && maxComplexParallels != currentComplexParallels) {
- if (isAllowedToWork() && maxComplexParallels > currentComplexParallels) {
- wasEnabled = false;
- boolean started = false;
- for (int i = 0; i < maxComplexParallels; i++) {
- if (maxProgressTimes[i] <= 0 && checkRecipe(i)) {
- currentComplexParallels++;
- started = true;
- }
- }
- if (started) {
- setActive(true);
- updateSlots();
- markDirty();
- issueClientUpdate();
- }
- }
- }
- }
-
- @Override
- protected void runningTick(long tick) {
- consumeEnergy();
- boolean allStopped = true;
- for (int i = 0; i < maxComplexParallels; i++) {
- if (maxProgressTimes[i] > 0 && ++progressTimes[i] >= maxProgressTimes[i]) {
- progressTimes[i] = 0;
- maxProgressTimes[i] = 0;
- outputItems(i);
- outputFluids(i);
- if (isAllowedToWork()) {
- if (checkRecipe(i)) {
- allStopped = false;
- } else {
- currentComplexParallels--;
- }
- }
- updateSlots();
- } else if (maxProgressTimes[i] > 0) {
- allStopped = false;
- }
- }
- if (allStopped) {
- setActive(false);
- issueClientUpdate();
- }
-
- if (this instanceof PollutionLogicHost && tick % POLLUTION_TICK == 0) {
- doPollution();
- }
- emitEnergy();
- }
-
- protected boolean checkRecipe(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic == null || index < 0 || index >= maxComplexParallels) {
- return false;
- }
- processingLogic.clear(index);
- boolean result = processingLogic.setInputItems(index, getInputItems(index))
- .setInputFluids(index, getInputFluids(index))
- .setTileEntity(this)
- .setVoidProtection(index, isVoidProtectionEnabledForItem(index), isVoidProtectionEnabledForFluid(index))
- .setEut(index, getEutForComplexParallel(index))
- .setPerfectOverclock(hasPerfectOverclock())
- .process(index);
- setDuration(index, processingLogic.getDuration(index));
- setEut(processingLogic.getTotalEU());
- return result;
- }
-
- protected void outputItems(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic != null && index >= 0 && index < maxComplexParallels) {
- outputItems(processingLogic.getOutputItems(index));
- }
- }
-
- protected void outputFluids(int index) {
- ComplexParallelProcessingLogic processingLogic = getComplexProcessingLogic();
- if (processingLogic != null && index >= 0 && index < maxComplexParallels) {
- outputFluids(processingLogic.getOutputFluids(index));
- }
- }
-
- protected ComplexParallelProcessingLogic getComplexProcessingLogic() {
- return processingLogic;
- }
-
- @Override
- public boolean hasThingsToDo() {
- return LongStream.of(maxProgressTimes)
- .sum() > 0;
+ setProcessingUpdate(true);
}
@Override
protected void stopMachine(boolean powerShutDown) {
super.stopMachine(powerShutDown);
- for (int i = 0; i < maxComplexParallels; i++) {
- maxProgressTimes[i] = 0;
- }
- }
-
- protected void setDuration(int index, long duration) {
- if (duration < 0) {
- duration = -duration;
- }
- if (index >= 0 && index < maxComplexParallels) {
- maxProgressTimes[index] = duration;
- }
- }
-
- protected ItemStack[] getInputItems(int index) {
- return getInputItems();
- }
-
- protected FluidStack[] getInputFluids(int index) {
- return getInputFluids();
- }
-
- protected boolean isVoidProtectionEnabledForItem(int index) {
- return protectsExcessItem();
- }
-
- protected boolean isVoidProtectionEnabledForFluid(int index) {
- return protectsExcessFluid();
}
protected boolean hasPerfectOverclock() {
return false;
}
- protected long getEutForComplexParallel(int index) {
- // As default behavior we'll give the parallel all remaining EU we have
- return GT_Values.V[tier] - eut;
- }
-
@Override
protected void addProgressStringToScanner(EntityPlayer player, int logLevel, ArrayList<String> list) {
+ P processing = getProcessingLogic();
for (int i = 0; i < maxComplexParallels; i++) {
list.add(
StatCollector.translateToLocal("GT5U.multiblock.Progress") + " "
+ (i + 1)
+ ": "
+ EnumChatFormatting.GREEN
- + GT_Utility.formatNumbers(progressTimes[i] > 20 ? progressTimes[i] / 20 : progressTimes[i])
+ + GT_Utility.formatNumbers(
+ processing.getProgress(i) > 20 ? processing.getProgress(i) / 20 : processing.getProgress(i))
+ EnumChatFormatting.RESET
- + (progressTimes[i] > 20 ? " s / " : " ticks / ")
+ + (processing.getProgress(i) > 20 ? " s / " : " ticks / ")
+ EnumChatFormatting.YELLOW
- + GT_Utility
- .formatNumbers(maxProgressTimes[i] > 20 ? maxProgressTimes[i] / 20 : maxProgressTimes[i])
+ + GT_Utility.formatNumbers(
+ processing.getDuration(i) > 20 ? processing.getDuration(i) / 20 : processing.getDuration(i))
+ EnumChatFormatting.RESET
- + (maxProgressTimes[i] > 20 ? " s" : " ticks"));
+ + (processing.getDuration(i) > 20 ? " s" : " ticks"));
}
}
@@ -219,10 +72,11 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
int z) {
super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ P processing = getProcessingLogic();
tag.setInteger("maxComplexParallels", maxComplexParallels);
for (int i = 0; i < maxComplexParallels; i++) {
- tag.setLong("maxProgress" + i, maxProgressTimes[i]);
- tag.setLong("progress" + i, progressTimes[i]);
+ tag.setInteger("maxProgress" + i, processing.getDuration(i));
+ tag.setInteger("progress" + i, processing.getProgress(i));
}
}
@@ -233,8 +87,8 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
final NBTTagCompound tag = accessor.getNBTData();
maxComplexParallels = tag.getInteger("maxComplexParallels");
for (int i = 0; i < maxComplexParallels; i++) {
- long maxProgress = tag.getLong("maxProgress" + i);
- long progress = tag.getLong("progress" + i);
+ long maxProgress = tag.getInteger("maxProgress" + i);
+ long progress = tag.getInteger("progress" + i);
currentTip.add(
"Process " + (i + 1)
+ ": "
@@ -242,4 +96,16 @@ public abstract class ComplexParallelController<T extends ComplexParallelControl
.getMachineProgressString(maxProgress > 0 && maxProgress >= progress, maxProgress, progress));
}
}
+
+ @Override
+ public void setProcessingLogicPower(@Nonnull P processingLogic) {
+ processingLogic.setAmperageOC(true);
+ processingLogic.setAvailableAmperage(getPowerLogic().getMaxAmperage() / maxComplexParallels);
+ processingLogic.setAvailableVoltage(getPowerLogic().getVoltage() / maxComplexParallels);
+ }
+
+ @Override
+ public void updateProcessingLogic(@Nonnull P processingLogic) {
+ processingLogic.setMaxComplexParallel(maxComplexParallels);
+ }
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
index 606d957fd6..8ac908be12 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/Controller.java
@@ -1,261 +1,109 @@
package gregtech.api.multitileentity.multiblock.base;
-import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain;
-import static gregtech.GT_Mod.GT_FML_LOGGER;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.EV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.HV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.IV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.LuV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MAX_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.MV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UEV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UHV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UIV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UMV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.UXV_Sensor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Conveyor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Emitter;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_FieldGenerator;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Motor;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Piston;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Pump;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_RobotArm;
-import static gregtech.api.multitileentity.enums.GT_MultiTileComponentCasing.ZPM_Sensor;
-import static gregtech.loaders.preload.GT_Loader_MultiTileEntities.COMPONENT_CASING_REGISTRY_NAME;
-import static mcp.mobius.waila.api.SpecialChars.GREEN;
-import static mcp.mobius.waila.api.SpecialChars.RED;
-import static mcp.mobius.waila.api.SpecialChars.RESET;
+import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+import static gregtech.common.misc.WirelessNetworkManager.strongCheckOrAddUser;
+import static mcp.mobius.waila.api.SpecialChars.*;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
-import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
-import net.minecraft.block.Block;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.inventory.IInventory;
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.util.StatCollector;
import net.minecraft.world.World;
-import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.FluidTankInfo;
-import net.minecraftforge.fluids.IFluidTank;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.input.Keyboard;
import com.gtnewhorizon.structurelib.StructureLibAPI;
import com.gtnewhorizon.structurelib.alignment.IAlignment;
import com.gtnewhorizon.structurelib.alignment.IAlignmentLimits;
-import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
-import com.gtnewhorizon.structurelib.structure.IStructureElement;
-import com.gtnewhorizon.structurelib.structure.IStructureElementChain;
import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment;
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.IItemHandler;
-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.math.Pos2d;
import com.gtnewhorizons.modularui.api.screen.ModularWindow;
-import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
-import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
-import com.gtnewhorizons.modularui.api.widget.Widget;
-import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
-import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
-import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
-import com.gtnewhorizons.modularui.common.widget.Scrollable;
-import com.gtnewhorizons.modularui.common.widget.SlotWidget;
-import com.gtnewhorizons.modularui.common.widget.TabButton;
-import com.gtnewhorizons.modularui.common.widget.TabContainer;
import cpw.mods.fml.common.network.NetworkRegistry;
-import gnu.trove.list.TIntList;
-import gnu.trove.list.array.TIntArrayList;
-import gregtech.api.enums.GT_Values;
import gregtech.api.enums.GT_Values.NBT;
-import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.TextureSet;
+import gregtech.api.enums.InventoryType;
import gregtech.api.enums.VoidingMode;
-import gregtech.api.fluid.FluidTankGT;
-import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.IDescribable;
import gregtech.api.interfaces.fluid.IFluidStore;
-import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
+import gregtech.api.logic.ControllerFluidLogic;
+import gregtech.api.logic.ControllerItemLogic;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.MuTEProcessingLogic;
import gregtech.api.logic.PowerLogic;
-import gregtech.api.logic.ProcessingLogic;
-import gregtech.api.logic.interfaces.PowerLogicHost;
-import gregtech.api.logic.interfaces.ProcessingLogicHost;
-import gregtech.api.multitileentity.MultiTileEntityContainer;
-import gregtech.api.multitileentity.MultiTileEntityRegistry;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
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.FunctionalCasing;
import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing;
+import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.objects.GT_ItemStack;
-import gregtech.api.recipe.RecipeMap;
-import gregtech.api.recipe.check.CheckRecipeResult;
-import gregtech.api.recipe.check.CheckRecipeResultRegistry;
import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.GT_Waila;
-import gregtech.common.tileentities.casings.upgrade.Inventory;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
/**
* Multi Tile Entities - or MuTEs - don't have dedicated hatches, but their casings can become hatches.
*/
-public abstract class Controller<T extends Controller<T>> extends MultiTileBasicMachine
- implements IAlignment, IConstructable, IMultiBlockController, IDescribable, IMTE_AddToolTips,
- ISurvivalConstructable, ControllerWithOptionalFeatures {
+public abstract class Controller<C extends Controller<C, P>, P extends MuTEProcessingLogic<P>>
+ extends MultiTileBasicMachine<P>
+ implements IAlignment, IMultiBlockController, IDescribable, IMTE_AddToolTips, ISurvivalConstructable {
public static final String ALL_INVENTORIES_NAME = "all";
+ protected static final int AUTO_OUTPUT_FREQUENCY_TICK = 20;
private static final Map<Integer, GT_Multiblock_Tooltip_Builder> tooltip = new ConcurrentHashMap<>();
private final List<UpgradeCasing> upgradeCasings = new ArrayList<>();
private final List<FunctionalCasing> functionalCasings = new ArrayList<>();
protected BuildState buildState = new BuildState();
- protected Map<String, String> multiBlockInputInventoryNames = new LinkedHashMap<>();
- protected Map<String, String> multiBlockOutputInventoryNames = new LinkedHashMap<>();
- protected Map<String, String> multiBlockInputInventoryToTankLink = new LinkedHashMap<>();
- protected Map<String, IItemHandlerModifiable> multiBlockInputInventory = new LinkedHashMap<>();
- protected Map<String, IItemHandlerModifiable> multiBlockOutputInventory = new LinkedHashMap<>();
-
- protected Map<String, String> multiBlockInputTankNames = new LinkedHashMap<>();
- protected Map<String, String> multiBlockOutputTankNames = new LinkedHashMap<>();
- protected Map<String, FluidTankGT[]> multiBlockInputTank = new LinkedHashMap<>();
- protected Map<String, FluidTankGT[]> multiBlockOutputTank = new LinkedHashMap<>();
-
private boolean structureOkay = false, structureChanged = false;
private ExtendedFacing extendedFacing = ExtendedFacing.DEFAULT;
private IAlignmentLimits limits = getInitialAlignmentLimits();
- private String inventoryName;
- private String tankName;
protected boolean separateInputs = getDefaultInputSeparationMode();
protected VoidingMode voidingMode = getDefaultVoidingMode();
protected boolean batchMode = getDefaultBatchMode();
protected boolean recipeLock = getDefaultRecipeLockingMode();
+ protected boolean shouldSort = false;
/** If this is set to true, the machine will get default WAILA behavior */
protected boolean isSimpleMachine = true;
+ protected boolean isCleanroom = false;
+ protected ControllerItemLogic controllerItemInput = new ControllerItemLogic();
+ protected ControllerItemLogic controllerItemOutput = new ControllerItemLogic();
+ protected ControllerFluidLogic controllerFluidInput = new ControllerFluidLogic();
+ protected ControllerFluidLogic controllerFluidOutput = new ControllerFluidLogic();
+
// A list of sides
// Each side has a list of parts that have a cover that need to be ticked
protected List<LinkedList<WeakReference<IMultiBlockPart>>> registeredCoveredParts = Arrays.asList(
@@ -266,6 +114,15 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
new LinkedList<>(),
new LinkedList<>());
+ // A list for each purpose that a casing can register to, to be ticked
+ protected List<LinkedList<WeakReference<IMultiBlockPart>>> registeredTickableParts = new ArrayList<>();
+
+ public Controller() {
+ for (int i = 0; i < MultiTileCasingPurpose.values().length; i++) {
+ registeredTickableParts.add(new LinkedList<>());
+ }
+ }
+
/** Registry ID of the required casing */
public abstract short getCasingRegistryID();
@@ -288,7 +145,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
* other instances, even for those of the same class.
*/
@Override
- public abstract IStructureDefinition<T> getStructureDefinition();
+ public abstract IStructureDefinition<C> getStructureDefinition();
/**
* Checks the Machine.
@@ -296,16 +153,20 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
* NOTE: If using `buildState` be sure to `startBuilding()` and either `endBuilding()` or `failBuilding()`
*/
public boolean checkMachine() {
+ calculateTier();
+ updatePowerLogic();
+ return tier > 0;
+ }
+
+ protected void calculateTier() {
double sum = 0;
if (functionalCasings == null || functionalCasings.size() == 0) {
- return false;
+ return;
}
for (FunctionalCasing casing : functionalCasings) {
sum += casing.getPartTier() * casing.getPartModifier();
}
- tier = (int) Math.floor(sum / functionalCasings.size());
- // Maximum Energy stores will have a cap of 2 minute work time of current voltage
- return tier > 0;
+ tier = (int) Math.min(Math.floor(sum / functionalCasings.size()), 14);
}
@Override
@@ -322,77 +183,26 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
(byte) extendedFacing.getFlip()
.getIndex());
- saveUpgradeInventoriesToNBT(nbt);
- saveUpgradeTanksToNBT(nbt);
-
nbt.setString(NBT.VOIDING_MODE, voidingMode.name);
nbt.setBoolean(NBT.SEPARATE_INPUTS, separateInputs);
nbt.setBoolean(NBT.RECIPE_LOCK, recipeLock);
nbt.setBoolean(NBT.BATCH_MODE, batchMode);
}
- private void saveUpgradeInventoriesToNBT(NBTTagCompound nbt) {
- final NBTTagList inputInvList = new NBTTagList();
- multiBlockInputInventory.forEach((id, inv) -> {
- if (!id.equals("controller")) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_INVENTORY_UUID, id);
- tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockInputInventoryNames.get(id));
- tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, inv.getSlots());
- writeInventory(tTag, inv, NBT.INV_INPUT_LIST);
- inputInvList.appendTag(tTag);
- }
- });
- final NBTTagList outputInvList = new NBTTagList();
- multiBlockOutputInventory.forEach((id, inv) -> {
- if (!id.equals("controller")) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_INVENTORY_UUID, id);
- tTag.setString(NBT.UPGRADE_INVENTORY_NAME, multiBlockOutputInventoryNames.get(id));
- tTag.setInteger(NBT.UPGRADE_INVENTORY_SIZE, inv.getSlots());
- writeInventory(tTag, inv, NBT.INV_OUTPUT_LIST);
- outputInvList.appendTag(tTag);
- }
- });
- nbt.setTag(NBT.UPGRADE_INVENTORIES_INPUT, inputInvList);
- nbt.setTag(NBT.UPGRADE_INVENTORIES_OUTPUT, outputInvList);
- }
-
- private void saveUpgradeTanksToNBT(NBTTagCompound nbt) {
- final NBTTagList inputTankList = new NBTTagList();
- multiBlockInputTank.forEach((id, tanks) -> {
- if (!id.equals("controller") && tanks != null && tanks.length > 0) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_TANK_UUID, id);
- tTag.setString(NBT.UPGRADE_TANK_NAME, multiBlockInputTankNames.get(id));
- // We assume all tanks in the tank-array are equally sized
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY, tanks[0].capacity());
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY_MULTIPLIER, tanks[0].getCapacityMultiplier());
- tTag.setInteger(NBT.UPGRADE_TANKS_COUNT, tanks.length);
- for (int i = 0; i < tanks.length; i++) {
- tanks[i].writeToNBT(tTag, NBT.UPGRADE_TANKS_PREFIX + i);
- }
- inputTankList.appendTag(tTag);
- }
- });
- final NBTTagList outputTankList = new NBTTagList();
- multiBlockOutputTank.forEach((id, tanks) -> {
- if (!id.equals("controller") && tanks != null && tanks.length > 0) {
- final NBTTagCompound tTag = new NBTTagCompound();
- tTag.setString(NBT.UPGRADE_TANK_UUID, id);
- tTag.setString(NBT.UPGRADE_TANK_NAME, multiBlockInputTankNames.get(id));
- // We assume all tanks in the tank-array are equally sized
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY, tanks[0].capacity());
- tTag.setLong(NBT.UPGRADE_TANK_CAPACITY_MULTIPLIER, tanks[0].getCapacityMultiplier());
- tTag.setInteger(NBT.UPGRADE_TANKS_COUNT, tanks.length);
- for (int i = 0; i < tanks.length; i++) {
- tanks[i].writeToNBT(tTag, NBT.UPGRADE_TANKS_PREFIX + i);
- }
- outputTankList.appendTag(tTag);
- }
- });
- nbt.setTag(NBT.UPGRADE_TANKS_INPUT, inputTankList);
- nbt.setTag(NBT.UPGRADE_TANKS_OUTPUT, outputTankList);
+ @Override
+ protected void saveItemLogic(NBTTagCompound nbt) {
+ NBTTagCompound itemInputNBT = controllerItemInput.saveToNBT();
+ nbt.setTag(NBT.INV_INPUT_LIST, itemInputNBT);
+ NBTTagCompound itemOutputNBT = controllerItemOutput.saveToNBT();
+ nbt.setTag(NBT.INV_OUTPUT_LIST, itemOutputNBT);
+ }
+
+ @Override
+ protected void saveFluidLogic(NBTTagCompound nbt) {
+ NBTTagCompound fluidInputNBT = controllerFluidInput.saveToNBT();
+ nbt.setTag(NBT.TANK_IN, fluidInputNBT);
+ NBTTagCompound fluidOutputNBT = controllerFluidOutput.saveToNBT();
+ nbt.setTag(NBT.TANK_OUT, fluidOutputNBT);
}
@Override
@@ -401,83 +211,37 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
// Multiblock inventories are a collection of inventories. The first inventory is the default internal
// inventory, and the others are added by inventory extending blocks.
- if (inputInventory != null) registerInventory("controller", "controller", inputInventory, Inventory.INPUT);
- if (outputInventory != null) registerInventory("controller", "controller", outputInventory, Inventory.OUTPUT);
-
- if (inputTanks != null) registerFluidInventory("controller", "controller", inputTanks, Inventory.INPUT);
- if (outputTanks != null) registerFluidInventory("controller", "controller", outputTanks, Inventory.OUTPUT);
structureOkay = nbt.getBoolean(NBT.STRUCTURE_OK);
extendedFacing = ExtendedFacing
.of(getFrontFacing(), Rotation.byIndex(nbt.getByte(NBT.ROTATION)), Flip.byIndex(nbt.getByte(NBT.FLIP)));
- loadUpgradeInventoriesFromNBT(nbt);
- loadUpgradeTanksFromNBT(nbt);
-
voidingMode = VoidingMode.fromName(nbt.getString(NBT.VOIDING_MODE));
separateInputs = nbt.getBoolean(NBT.SEPARATE_INPUTS);
recipeLock = nbt.getBoolean(NBT.RECIPE_LOCK);
batchMode = nbt.getBoolean(NBT.BATCH_MODE);
}
- private void loadUpgradeInventoriesFromNBT(NBTTagCompound nbt) {
- final NBTTagList listInputInventories = nbt
- .getTagList(NBT.UPGRADE_INVENTORIES_INPUT, Constants.NBT.TAG_COMPOUND);
- for (int i = 0; i < listInputInventories.tagCount(); i++) {
- final NBTTagCompound nbtInv = listInputInventories.getCompoundTagAt(i);
- final String invUUID = nbtInv.getString(NBT.UPGRADE_INVENTORY_UUID);
- final String invName = nbtInv.getString(NBT.UPGRADE_INVENTORY_NAME);
- final int invSize = nbtInv.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
- final IItemHandlerModifiable inv = new ItemStackHandler(invSize);
- loadInventory(nbtInv, inv, NBT.INV_INPUT_LIST);
- registerInventory(invName, invUUID, invSize, Inventory.INPUT);
- }
-
- final NBTTagList listOutputInventories = nbt
- .getTagList(NBT.UPGRADE_INVENTORIES_OUTPUT, Constants.NBT.TAG_COMPOUND);
- for (int i = 0; i < listOutputInventories.tagCount(); i++) {
- final NBTTagCompound nbtInv = listOutputInventories.getCompoundTagAt(i);
- final String invUUID = nbtInv.getString(NBT.UPGRADE_INVENTORY_UUID);
- final String invName = nbtInv.getString(NBT.UPGRADE_INVENTORY_NAME);
- final int invSize = nbtInv.getInteger(NBT.UPGRADE_INVENTORY_SIZE);
- IItemHandlerModifiable inv = new ItemStackHandler(invSize);
- loadInventory(nbtInv, inv, NBT.INV_OUTPUT_LIST);
- registerInventory(invName, invUUID, invSize, Inventory.OUTPUT);
+ @Override
+ protected void loadItemLogic(NBTTagCompound nbt) {
+ if (!nbt.hasKey(NBT.INV_INPUT_LIST) && !nbt.hasKey(NBT.INV_OUTPUT_LIST)) {
+ controllerItemInput.addInventory(new ItemInventoryLogic(16));
+ controllerItemOutput.addInventory(new ItemInventoryLogic(16));
+ return;
}
+ controllerItemInput.loadFromNBT(nbt.getCompoundTag(NBT.INV_INPUT_LIST));
+ controllerItemOutput.loadFromNBT(nbt.getCompoundTag(NBT.INV_OUTPUT_LIST));
}
- private void loadUpgradeTanksFromNBT(NBTTagCompound nbt) {
- final NBTTagList listInputTanks = nbt.getTagList(NBT.UPGRADE_TANKS_INPUT, Constants.NBT.TAG_COMPOUND);
- for (int i = 0; i < listInputTanks.tagCount(); i++) {
- final NBTTagCompound nbtTank = listInputTanks.getCompoundTagAt(i);
- String tankUUID = nbtTank.getString(NBT.UPGRADE_TANK_UUID);
- String tankName = nbtTank.getString(NBT.UPGRADE_TANK_NAME);
- long capacity = nbtTank.getLong(NBT.UPGRADE_TANK_CAPACITY);
- long capacityMultiplier = nbtTank.getLong(NBT.UPGRADE_TANK_CAPACITY_MULTIPLIER);
- int count = nbtTank.getInteger(NBT.UPGRADE_TANKS_COUNT);
- FluidTankGT[] tanks = new FluidTankGT[count];
- for (int j = 0; j < count; j++) {
- tanks[j] = new FluidTankGT(capacity).setCapacityMultiplier(capacityMultiplier)
- .readFromNBT(nbtTank, NBT.UPGRADE_TANKS_PREFIX + j);
- }
- registerFluidInventory(tankName, tankUUID, count, capacity, capacityMultiplier, Inventory.INPUT);
- }
-
- final NBTTagList listOutputTanks = nbt.getTagList(NBT.UPGRADE_TANKS_OUTPUT, Constants.NBT.TAG_COMPOUND);
- for (int i = 0; i < listOutputTanks.tagCount(); i++) {
- final NBTTagCompound nbtTank = listOutputTanks.getCompoundTagAt(i);
- String tankUUID = nbtTank.getString(NBT.UPGRADE_TANK_UUID);
- String tankName = nbtTank.getString(NBT.UPGRADE_TANK_NAME);
- long capacity = nbtTank.getLong(NBT.UPGRADE_TANK_CAPACITY);
- long capacityMultiplier = nbtTank.getLong(NBT.UPGRADE_TANK_CAPACITY_MULTIPLIER);
- int count = nbtTank.getInteger(NBT.UPGRADE_TANKS_COUNT);
- FluidTankGT[] tanks = new FluidTankGT[count];
- for (int j = 0; j < count; j++) {
- tanks[j] = new FluidTankGT(capacity).setCapacityMultiplier(capacityMultiplier)
- .readFromNBT(nbtTank, NBT.UPGRADE_TANKS_PREFIX + j);
- }
- registerFluidInventory(tankName, tankUUID, count, capacity, capacityMultiplier, Inventory.OUTPUT);
+ @Override
+ protected void loadFluidLogic(NBTTagCompound nbt) {
+ if (!nbt.hasKey(NBT.TANK_IN) && !nbt.hasKey(NBT.TANK_OUT)) {
+ controllerFluidInput.addInventory(new FluidInventoryLogic(16, 32000));
+ controllerFluidOutput.addInventory(new FluidInventoryLogic(16, 32000));
+ return;
}
+ controllerFluidInput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_IN));
+ controllerFluidOutput.loadFromNBT(nbt.getCompoundTag(NBT.TANK_OUT));
}
@Override
@@ -489,9 +253,9 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
public String[] getDescription() {
if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) {
return getTooltip().getStructureInformation();
- } else {
- return getTooltip().getInformation();
}
+
+ return getTooltip().getInformation();
}
@Override
@@ -519,6 +283,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
// Only trigger an update if forced (from onPostTick, generally), or if the structure has changed
if ((structureChanged || aForceReset)) {
+ clearSpecialLists();
structureOkay = checkMachine();
}
structureChanged = false;
@@ -531,8 +296,6 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
public final boolean checkPiece(String piece, Vec3Impl offset) {
- functionalCasings.clear();
- upgradeCasings.clear();
return checkPiece(piece, offset.get0(), offset.get1(), offset.get2());
}
@@ -617,8 +380,8 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@SuppressWarnings("unchecked")
- private IStructureDefinition<Controller<T>> getCastedStructureDefinition() {
- return (IStructureDefinition<Controller<T>>) getStructureDefinition();
+ private IStructureDefinition<Controller<C, P>> getCastedStructureDefinition() {
+ return (IStructureDefinition<Controller<C, P>>) getStructureDefinition();
}
@Override
@@ -628,24 +391,27 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
@Override
public void setExtendedFacing(ExtendedFacing newExtendedFacing) {
- if (extendedFacing != newExtendedFacing) {
- onStructureChange();
- if (structureOkay) stopMachine(false);
- extendedFacing = newExtendedFacing;
- structureOkay = false;
- if (isServerSide()) {
- StructureLibAPI.sendAlignment(
- this,
- new NetworkRegistry.TargetPoint(
- getWorld().provider.dimensionId,
- getXCoord(),
- getYCoord(),
- getZCoord(),
- 512));
- } else {
- issueTextureUpdate();
- }
+ if (extendedFacing == newExtendedFacing) {
+ return;
+ }
+
+ onStructureChange();
+ if (structureOkay) stopMachine(false);
+ extendedFacing = newExtendedFacing;
+ structureOkay = false;
+ if (isServerSide()) {
+ StructureLibAPI.sendAlignment(
+ this,
+ new NetworkRegistry.TargetPoint(
+ getWorld().provider.dimensionId,
+ getXCoord(),
+ getYCoord(),
+ getZCoord(),
+ 512));
+ } else {
+ issueTextureUpdate();
}
+
}
@Override
@@ -686,6 +452,31 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
+ public void registerCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part) {
+ final LinkedList<WeakReference<IMultiBlockPart>> tickableParts = registeredTickableParts.get(purpose.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> it = tickableParts.iterator();
+ while (it.hasNext()) {
+ final IMultiBlockPart next = (it.next()).get();
+ if (next == null) {
+ it.remove();
+ } else if (next == part) {
+ return;
+ }
+ }
+ tickableParts.add(new WeakReference<>(part));
+ }
+
+ @Override
+ public void unregisterCaseWithPurpose(MultiTileCasingPurpose purpose, IMultiBlockPart part) {
+ final LinkedList<WeakReference<IMultiBlockPart>> tickableParts = registeredTickableParts.get(purpose.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> it = tickableParts.iterator();
+ while (it.hasNext()) {
+ final IMultiBlockPart next = (it.next()).get();
+ if (next == null || next == part) it.remove();
+ }
+ }
+
+ @Override
public void onFirstTick(boolean isServerSide) {
super.onFirstTick(isServerSide);
if (isServerSide) {
@@ -715,7 +506,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
- public void onTick(long timer, boolean isServerSide) {
+ public void onTick(long tick, boolean isServerSide) {
if (!tickCovers()) {
return;
}
@@ -723,24 +514,94 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
@Override
public void onPostTick(long tick, boolean isServerSide) {
- if (isServerSide) {
- if (tick % 600 == 5) {
- clearSpecialLists();
- // Recheck the structure every 30 seconds or so
- if (!checkStructure(false)) checkStructure(true);
+ if (!isServerSide) { // client side
+ doActivitySound(getActivitySoundLoop());
+ return;
+ }
+
+ // server side
+ if (tick % 600 == 5) {
+ // Recheck the structure every 30 seconds or so
+ if (!checkStructure(false)) checkStructure(true);
+ }
+ if (checkStructure(false)) {
+ runMachine(tick);
+ pushItemOutputs(tick);
+ pushFluidOutputs(tick);
+
+ } else {
+ stopMachine(false);
+ }
+
+ }
+
+ protected void pushItemOutputs(long tick) {
+ if (tick % AUTO_OUTPUT_FREQUENCY_TICK != 0) return;
+ final LinkedList<WeakReference<IMultiBlockPart>> registeredItemOutputs = registeredTickableParts
+ .get(MultiTileCasingPurpose.ItemOutput.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> itemOutputIterator = registeredItemOutputs.iterator();
+ while (itemOutputIterator.hasNext()) {
+ final IMultiBlockPart part = (itemOutputIterator.next()).get();
+ if (part == null) {
+ itemOutputIterator.remove();
+ continue;
}
- if (checkStructure(false)) {
- runMachine(tick);
- } else {
- stopMachine(false);
+ if (!part.shouldTick(mTickTimer)) {
+ itemOutputIterator.remove();
+ continue;
+ }
+
+ final IInventory facingInventory = part.getIInventoryAtSide(part.getFrontFacing());
+ if (facingInventory == null) {
+ continue;
+ }
+
+ moveMultipleItemStacks(
+ part,
+ facingInventory,
+ part.getFrontFacing(),
+ part.getBackFacing(),
+ null,
+ false,
+ (byte) 64,
+ (byte) 1,
+ (byte) 64,
+ (byte) 1,
+ part.getSizeInventory());
+ for (int i = 0; i < part.getSizeInventory(); i++) {
+ if (part.getStackInSlot(i) != null && part.getStackInSlot(i).stackSize <= 0) {
+ part.setInventorySlotContents(i, null);
+ }
+ }
+
+ }
+ }
+
+ protected void pushFluidOutputs(long tick) {
+ if (tick % AUTO_OUTPUT_FREQUENCY_TICK != 0) return;
+ final LinkedList<WeakReference<IMultiBlockPart>> registeredFluidOutputs = registeredTickableParts
+ .get(MultiTileCasingPurpose.FluidOutput.ordinal());
+ final Iterator<WeakReference<IMultiBlockPart>> fluidOutputIterator = registeredFluidOutputs.iterator();
+ while (fluidOutputIterator.hasNext()) {
+ final IMultiBlockPart part = (fluidOutputIterator.next()).get();
+ if (part == null) {
+ fluidOutputIterator.remove();
+ continue;
+ }
+ if (!part.shouldTick(mTickTimer)) {
+ fluidOutputIterator.remove();
}
- } else {
- doActivitySound(getActivitySoundLoop());
}
}
+ @Override
+ public void setCleanroom(boolean cleanroom) {
+ isCleanroom = cleanroom;
+ }
+
protected void clearSpecialLists() {
upgradeCasings.clear();
+ functionalCasings.clear();
}
@Override
@@ -773,47 +634,6 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
this.limits = mLimits;
}
- // IMachineProgress
- @Override
- public long getProgress() {
- return progressTime;
- }
-
- @Override
- public long getMaxProgress() {
- return maxProgressTime;
- }
-
- @Override
- public boolean increaseProgress(int aProgressAmountInTicks) {
- return increaseProgressGetOverflow(aProgressAmountInTicks) != aProgressAmountInTicks;
- }
-
- @Override
- public FluidStack getDrainableFluid(ForgeDirection side) {
- return getDrainableFluid(side, null);
- }
-
- @Override
- public FluidStack getDrainableFluid(ForgeDirection side, Fluid fluidToDrain) {
- final IFluidTank tank = getFluidTankDrainable(
- side,
- fluidToDrain == null ? null : new FluidStack(fluidToDrain, 0));
- return tank == null ? null : tank.getFluid();
- }
-
- /**
- * Increases the Progress, returns the overflown Progress.
- */
- public int increaseProgressGetOverflow(int aProgress) {
- return 0;
- }
-
- @Override
- public boolean hasThingsToDo() {
- return getMaxProgress() > 0;
- }
-
public boolean isSeparateInputs() {
return separateInputs;
}
@@ -822,8 +642,6 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
separateInputs = aSeparateInputs;
}
- // End IMachineProgress
-
protected IAlignmentLimits getInitialAlignmentLimits() {
return (d, r, f) -> !f.isVerticallyFliped();
}
@@ -877,226 +695,7 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
}
- public <S> IStructureElement<S> addMultiTileCasing(String registryName, int meta, int modes) {
- MultiTileEntityRegistry registry = MultiTileEntityRegistry.getRegistry(registryName);
- int registryID = Block.getIdFromBlock(registry.mBlock);
- return addMultiTileCasing(registryID, meta, modes);
- }
-
- public <S> IStructureElement<S> addMultiTileCasing(int registryID, int meta, int modes) {
- return new IStructureElement<S>() {
-
- private final short[] DEFAULT = new short[] { 255, 255, 255, 0 };
- private IIcon[] mIcons = null;
-
- @Override
- public boolean check(S t, World world, int x, int y, int z) {
- final TileEntity tileEntity = world.getTileEntity(x, y, z);
- if (!(tileEntity instanceof MultiBlockPart part)) return false;
-
- if (registryID != part.getMultiTileEntityRegistryID() || meta != part.getMultiTileEntityID())
- return false;
-
- final IMultiBlockController tTarget = part.getTarget(false);
- if (tTarget != null && tTarget != t) return false;
-
- part.setTarget((IMultiBlockController) t, modes);
-
- ((Controller<?>) t).registerSpecialCasings(part);
- return true;
- }
-
- @Override
- public boolean spawnHint(S t, World world, int x, int y, int z, ItemStack trigger) {
- if (mIcons == null) {
- mIcons = new IIcon[6];
- Arrays.fill(mIcons, TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex].getIcon());
- // Arrays.fill(mIcons, getTexture(aCasing);
- // for (byte i : ALL_VALID_SIDES) {
- // mIcons[i] = aCasing.getIcon(i, aMeta);
- // }
- }
- final short[] RGBA = DEFAULT;
- StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, RGBA);
- // StructureLibAPI.hintParticle(world, x, y, z, aCasing, aMeta);
- return true;
- }
-
- @Override
- public boolean placeBlock(S t, World world, int x, int y, int z, ItemStack trigger) {
- final MultiTileEntityRegistry tRegistry = MultiTileEntityRegistry.getRegistry(registryID);
- final MultiTileEntityContainer tContainer = tRegistry
- .getNewTileEntityContainer(world, x, y, z, meta, null);
- if (tContainer == null) {
- GT_FML_LOGGER.error("NULL CONTAINER");
- return false;
- }
- final IMultiTileEntity te = ((IMultiTileEntity) tContainer.mTileEntity);
- if (!(te instanceof MultiBlockPart)) {
- GT_FML_LOGGER.error("Not a multiblock part");
- return false;
- }
- if (world.setBlock(x, y, z, tContainer.mBlock, 15 - tContainer.mBlockMetaData, 2)) {
- tContainer.setMultiTile(world, x, y, z);
- ((MultiBlockPart) te).setTarget(Controller.this, modes);
-
- ((Controller<?>) t).registerSpecialCasings((MultiBlockPart) te);
- }
-
- return false;
- }
-
- public IIcon getTexture(OrePrefixes aBlock) {
- return TextureSet.SET_NONE.mTextures[OrePrefixes.block.mTextureIndex].getIcon();
- }
- };
- }
-
- protected <S> IStructureElementChain<S> addMotorCasings(int modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_Motor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_Motor.getId(), modes));
- }
-
- protected <S> IStructureElementChain<S> addPumpCasings(int modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_Pump.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_Pump.getId(), modes));
- }
-
- protected <S> IStructureElementChain<S> addPistonCasings(int modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_Piston.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_Piston.getId(), modes));
- }
-
- protected <S> IStructureElementChain<S> addConveyorCasings(int modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_Conveyor.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_Conveyor.getId(), modes));
- }
-
- protected <S> IStructureElementChain<S> addRobotArmCasings(int modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_RobotArm.getId(), modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_RobotArm.getId(), modes));
- }
-
- protected <S> IStructureElementChain<S> addSensorCasings(int Modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_Sensor.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_Sensor.getId(), Modes));
- }
-
- protected <S> IStructureElementChain<S> addEmitterCasings(int Modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_Emitter.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_Emitter.getId(), Modes));
- }
-
- protected <S> IStructureElementChain<S> addFieldGeneratorCasings(int Modes) {
- return ofChain(
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, HV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, EV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, IV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, LuV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, ZPM_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UHV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UEV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UIV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UMV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, UXV_FieldGenerator.getId(), Modes),
- addMultiTileCasing(COMPONENT_CASING_REGISTRY_NAME, MAX_FieldGenerator.getId(), Modes));
- }
-
- protected void registerSpecialCasings(MultiBlockPart part) {
+ public void registerSpecialCasings(MultiBlockPart part) {
if (part instanceof UpgradeCasing) {
upgradeCasings.add((UpgradeCasing) part);
}
@@ -1105,728 +704,177 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
}
- /**
- * Fluid - MultiBlock related Fluid Tank behaviour.
- */
- public void registerFluidInventory(String name, String id, int numberOfSlots, long capacity,
- long capacityMultiplier, int type) {
- if (name == null || name.equals("")
- || id == null
- || id.equals("")
- || numberOfSlots < 0
- || capacity < 0
- || capacityMultiplier < 0) {
- return;
- }
- FluidTankGT[] tanks = new FluidTankGT[numberOfSlots];
- for (int i = 0; i < numberOfSlots; i++) {
- tanks[i] = new FluidTankGT(capacity).setCapacityMultiplier(capacityMultiplier);
- }
- registerFluidInventory(name, id, tanks, type);
- }
-
- public void registerFluidInventory(String name, String id, FluidTankGT[] fluidInventory, int type) {
- if (name == null || name.equals("")
- || id == null
- || id.equals("")
- || fluidInventory == null
- || fluidInventory.length == 0) {
- return;
- }
- if (type == Inventory.INPUT || type == Inventory.BOTH) {
- if (multiBlockInputTank.containsKey(id)) return;
- multiBlockInputTank.put(id, fluidInventory);
- multiBlockInputTankNames.put(id, name);
- }
- if (type == Inventory.OUTPUT || type == Inventory.BOTH) {
- if (multiBlockOutputTank.containsKey(id)) return;
- multiBlockOutputTank.put(id, fluidInventory);
- multiBlockOutputTankNames.put(id, name);
- }
- }
-
- public void unregisterFluidInventory(String aName, String aID, int aType) {
- if ((aType == Inventory.INPUT || aType == Inventory.BOTH) && multiBlockInputTank.containsKey(aID)) {
- multiBlockInputTank.remove(aID, multiBlockInputTank.get(aID));
- multiBlockInputTankNames.remove(aID, aName);
- }
- if ((aType == Inventory.OUTPUT || aType == Inventory.BOTH) && multiBlockOutputTank.containsKey(aID)) {
- multiBlockOutputTank.remove(aID, multiBlockOutputTank.get(aID));
- multiBlockOutputTankNames.remove(aID, aName);
- }
- }
-
- protected FluidTankGT[] getTanksForInput() {
- List<FluidTankGT> tanks = new ArrayList<>();
- for (FluidTankGT[] inputTanks : multiBlockInputTank.values()) {
- tanks.addAll(Arrays.asList(inputTanks));
- }
- return tanks.toArray(new FluidTankGT[0]);
- }
-
- protected FluidTankGT[] getTanksForOutput() {
- List<FluidTankGT> tanks = new ArrayList<>();
- for (FluidTankGT[] outputTanks : multiBlockOutputTank.values()) {
- tanks.addAll(Arrays.asList(outputTanks));
- }
- return tanks.toArray(new FluidTankGT[0]);
- }
-
- protected IFluidTank getFluidTankFillable(MultiBlockPart aPart, ForgeDirection side, FluidStack aFluidToFill) {
- return getFluidTankFillable(side, aFluidToFill);
- }
-
- protected IFluidTank getFluidTankDrainable(MultiBlockPart aPart, ForgeDirection side, FluidStack aFluidToDrain) {
- return getFluidTankDrainable(side, aFluidToDrain);
- }
-
- protected IFluidTank[] getFluidTanks(MultiBlockPart aPart, ForgeDirection side) {
- return getFluidTanks(side);
- }
-
- @Override
- public int fill(MultiBlockPart aPart, ForgeDirection aDirection, FluidStack aFluid, boolean aDoFill) {
- if (aFluid == null || aFluid.amount <= 0) return 0;
- final IFluidTank tTank = getFluidTankFillable(aPart, aDirection, aFluid);
- if (tTank == null) return 0;
- final int rFilledAmount = tTank.fill(aFluid, aDoFill);
- if (rFilledAmount > 0 && aDoFill) hasInventoryChanged = true;
- return rFilledAmount;
- }
-
- @Override
- public FluidStack drain(MultiBlockPart aPart, ForgeDirection aDirection, FluidStack aFluid, boolean aDoDrain) {
- if (aFluid == null || aFluid.amount <= 0) return null;
- final IFluidTank tTank = getFluidTankDrainable(aPart, aDirection, aFluid);
- if (tTank == null || tTank.getFluid() == null
- || tTank.getFluidAmount() == 0
- || !tTank.getFluid()
- .isFluidEqual(aFluid))
- return null;
- final FluidStack rDrained = tTank.drain(aFluid.amount, aDoDrain);
- if (rDrained != null && aDoDrain) markInventoryBeenModified();
- return rDrained;
- }
-
- @Override
- public FluidStack drain(MultiBlockPart aPart, ForgeDirection aDirection, int aAmountToDrain, boolean aDoDrain) {
- if (aAmountToDrain <= 0) return null;
- final IFluidTank tTank = getFluidTankDrainable(aPart, aDirection, null);
- if (tTank == null || tTank.getFluid() == null || tTank.getFluidAmount() == 0) return null;
- final FluidStack rDrained = tTank.drain(aAmountToDrain, aDoDrain);
- if (rDrained != null && aDoDrain) markInventoryBeenModified();
- return rDrained;
- }
-
- @Override
- public boolean canFill(MultiBlockPart aPart, ForgeDirection aDirection, Fluid aFluid) {
- if (aFluid == null) return false;
- final IFluidTank tTank = getFluidTankFillable(aPart, aDirection, new FluidStack(aFluid, 0));
- return tTank != null && (tTank.getFluid() == null || tTank.getFluid()
- .getFluid() == aFluid);
- }
-
- @Override
- public boolean canDrain(MultiBlockPart aPart, ForgeDirection aDirection, Fluid aFluid) {
- if (aFluid == null) return false;
- final IFluidTank tTank = getFluidTankDrainable(aPart, aDirection, new FluidStack(aFluid, 0));
- return tTank != null && (tTank.getFluid() != null && tTank.getFluid()
- .getFluid() == aFluid);
- }
-
- @Override
- public FluidTankInfo[] getTankInfo(MultiBlockPart aPart, ForgeDirection aDirection) {
- final IFluidTank[] tTanks = getFluidTanks(aPart, aDirection);
- if (tTanks == null || tTanks.length <= 0) return GT_Values.emptyFluidTankInfo;
- final FluidTankInfo[] rInfo = new FluidTankInfo[tTanks.length];
- for (int i = 0; i < tTanks.length; i++) rInfo[i] = new FluidTankInfo(tTanks[i]);
- return rInfo;
- }
-
- @Override
- public IFluidTank[] getFluidTanksForGUI(MultiBlockPart aPart) {
- final String lockedInventory = aPart.getLockedInventory();
- if (lockedInventory == null) {
- if (aPart.modeSelected(MultiBlockPart.FLUID_IN)) return getTanksForInput();
- else if (aPart.modeSelected(MultiBlockPart.FLUID_OUT)) return getTanksForOutput();
- } else {
- final Map<String, FluidTankGT[]> tankMap = getMultiBlockTankArray(aPart);
- if (tankMap == null) return GT_Values.emptyFluidTank;
- final FluidTankGT[] tanks = tankMap.get(lockedInventory);
- return tanks != null ? tanks : GT_Values.emptyFluidTank;
- }
- return GT_Values.emptyFluidTank;
- }
-
- // #region Energy
- @Override
- public PowerLogic getPowerLogic(IMultiBlockPart part, ForgeDirection side) {
- if (!(this instanceof PowerLogicHost powerLogicHost)) {
- return null;
- }
-
- if (part.getFrontFacing() != side) {
- return null;
- }
-
- return powerLogicHost.getPowerLogic(side);
- }
- // #endregion Energy
-
- /**
- * Item - MultiBlock related Item behaviour.
- */
- @Override
- public void registerInventory(String aName, String aID, int aInventorySize, int aType) {
- registerInventory(aName, aID, new ItemStackHandler(aInventorySize), aType);
- }
-
- public void registerInventory(String name, String id, IItemHandlerModifiable inventory, int type) {
- if (name == null || name.equals("") || id == null || id.equals("") || inventory == null) {
- return;
- }
- if (type == Inventory.INPUT || type == Inventory.BOTH) {
- if (multiBlockInputInventory.containsKey(id)) return;
- multiBlockInputInventory.put(id, inventory);
- multiBlockInputInventoryNames.put(id, name);
- }
- if (type == Inventory.OUTPUT || type == Inventory.BOTH) {
- if (multiBlockOutputInventory.containsKey(id)) return;
- multiBlockOutputInventory.put(id, inventory);
- multiBlockOutputInventoryNames.put(id, name);
- }
- }
-
- @Override
- public void unregisterInventory(String aName, String aID, int aType) {
- if ((aType == Inventory.INPUT || aType == Inventory.BOTH) && multiBlockInputInventory.containsKey(aID)) {
- multiBlockInputInventory.remove(aID, multiBlockInputInventory.get(aID));
- multiBlockInputInventoryNames.remove(aID, aName);
- }
- if ((aType == Inventory.OUTPUT || aType == Inventory.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 == Inventory.INPUT || aType == Inventory.BOTH) && multiBlockInputInventoryNames.containsKey(aID)) {
- multiBlockInputInventoryNames.put(aID, aName);
- }
- if ((aType == Inventory.OUTPUT || aType == Inventory.BOTH) && multiBlockOutputInventoryNames.containsKey(aID)) {
- multiBlockOutputInventoryNames.put(aID, aName);
- }
- }
-
- @Override
- public boolean hasInventoryBeenModified(MultiBlockPart aPart) {
- if (aPart.modeSelected(MultiBlockPart.ITEM_IN)) return hasInventoryBeenModified();
- else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) return hasOutputInventoryBeenModified();
-
- return false;
- }
+ // #region Fluid - MultiBlock related Fluid Tank behaviour.
@Override
- public boolean isValidSlot(MultiBlockPart aPart, int aIndex) {
- return false;
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> controllerFluidInput.getAllInventoryLogics();
+ case Output -> controllerFluidOutput.getAllInventoryLogics();
+ default -> null;
+ };
}
- @Override
- public void enableWorking() {
- super.enableWorking();
- if (!structureOkay) {
- checkStructure(true);
- }
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull InventoryType type, @Nullable UUID id) {
+ return switch (type) {
+ case Input -> controllerFluidInput.getInventoryLogic(id);
+ case Output -> controllerFluidOutput.getInventoryLogic(id);
+ default -> null;
+ };
}
@Override
- public IItemHandlerModifiable getInventoryForGUI(MultiBlockPart aPart) {
- if (isServerSide()) {
- for (UpgradeCasing tPart : upgradeCasings) {
- if (!(tPart instanceof Inventory)) continue;
- tPart.issueClientUpdate();
+ @Nonnull
+ public UUID registerFluidInventory(int tanks, long capacity, int tier, @Nonnull InventoryType type,
+ boolean isUpgradeInventory) {
+ return switch (type) {
+ case Input -> controllerFluidInput
+ .addInventory(new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ case Output -> controllerFluidOutput
+ .addInventory(new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ case Both -> {
+ UUID id = controllerFluidInput
+ .addInventory(new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ controllerFluidOutput
+ .addInventory(id, new FluidInventoryLogic(tanks, capacity, tier, isUpgradeInventory));
+ yield id;
}
- }
- final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart);
- if (multiBlockInventory == null) return null;
-
- final String lockedInventory = aPart.getLockedInventory();
- if (lockedInventory == null) {
- return new ListItemHandler(multiBlockInventory.values());
- } else {
- final IItemHandlerModifiable inv = multiBlockInventory.get(lockedInventory);
- return inv;
- }
- }
-
- @Override
- public boolean addStackToSlot(MultiBlockPart aPart, int aIndex, ItemStack aStack) {
- return false;
+ };
}
@Override
- public boolean addStackToSlot(MultiBlockPart aPart, int aIndex, ItemStack aStack, int aAmount) {
- return false;
- }
-
- protected Map<String, FluidTankGT[]> getMultiBlockTankArray(MultiBlockPart aPart) {
- if (aPart.modeSelected(MultiBlockPart.FLUID_IN)) return multiBlockInputTank;
- else if (aPart.modeSelected(MultiBlockPart.FLUID_OUT)) return multiBlockOutputTank;
- return null;
- }
-
- protected Map<String, String> getMultiBlockTankArrayNames(MultiBlockPart aPart) {
- if (aPart.modeSelected(MultiBlockPart.FLUID_IN)) return multiBlockInputTankNames;
- else if (aPart.modeSelected(MultiBlockPart.FLUID_OUT)) return multiBlockOutputTankNames;
- return null;
- }
-
- protected Map<String, IItemHandlerModifiable> getMultiBlockInventory(MultiBlockPart aPart) {
- if (aPart.modeSelected(MultiBlockPart.ITEM_IN)) return multiBlockInputInventory;
- else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) return multiBlockOutputInventory;
- 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;
-
- final String invName = aPart.getLockedInventory();
- if (invName != null && !invName.isEmpty()) return new ImmutablePair<>(multiBlockInventory.get(invName), aSlot);
-
- int start = 0;
- for (IItemHandlerModifiable inv : multiBlockInventory.values()) {
- if (aSlot >= start && aSlot < start + inv.getSlots()) {
- return new ImmutablePair<>(inv, aSlot - start);
+ @Nonnull
+ public FluidInventoryLogic unregisterFluidInventory(@Nonnull UUID id, @Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerFluidInput.removeInventory(id);
+ case Output -> controllerFluidOutput.removeInventory(id);
+ case Both -> {
+ FluidInventoryLogic input = controllerFluidInput.removeInventory(id);
+ FluidInventoryLogic output = controllerFluidOutput.removeInventory(id);
+ yield new FluidInventoryLogic(
+ Arrays.asList(input, output)
+ .stream()
+ .map(inv -> inv.getInventory())
+ .collect(Collectors.toList()));
}
- start += inv.getSlots();
- }
- return null;
+ };
}
@Override
- public int[] getAccessibleSlotsFromSide(MultiBlockPart aPart, ForgeDirection side) {
- final TIntList tList = new TIntArrayList();
- final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart);
- if (multiBlockInventory == null) return tList.toArray();
-
- final String lockedInventory = aPart.getLockedInventory();
- // Item in --> input inv
- // Item out --> output inv
-
- int start = 0;
- if (lockedInventory == null) {
- for (IItemHandlerModifiable inv : multiBlockInventory.values()) {
- for (int i = start; i < inv.getSlots() + start; i++) tList.add(i);
- start += inv.getSlots();
- }
- } else {
- final IItemHandlerModifiable inv = multiBlockInventory.get(lockedInventory);
- final int len = inv != null ? inv.getSlots() : 0;
- for (int i = 0; i < len; i++) tList.add(i);
+ public void changeFluidInventoryDisplayName(@Nullable UUID id, @Nullable String displayName,
+ @Nonnull InventoryType type) {
+ switch (type) {
+ case Input:
+ controllerFluidInput.setInventoryDisplayName(id, displayName);
+ break;
+ case Output:
+ controllerFluidOutput.setInventoryDisplayName(id, displayName);
+ break;
+ case Both:
+ controllerFluidInput.setInventoryDisplayName(id, displayName);
+ controllerFluidOutput.setInventoryDisplayName(id, displayName);
+ break;
}
- return tList.toArray();
}
- @Override
- public boolean canInsertItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, ForgeDirection side) {
- final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot);
- if (tInv == null) return false;
-
- final int tSlot = tInv.getRight();
- final IItemHandlerModifiable inv = tInv.getLeft();
-
- return inv.getStackInSlot(tSlot) == null || GT_Utility.areStacksEqual(aStack, inv.getStackInSlot(tSlot)); // &&
- // allowPutStack(getBaseMetaTileEntity(),
- // aIndex,
- // (byte)
- // aSide,
- // aStack)
- }
+ // #endregion Fluid
- @Override
- public boolean canExtractItem(MultiBlockPart aPart, int aSlot, ItemStack aStack, ForgeDirection side) {
- final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot);
- if (tInv == null) return false;
-
- final int tSlot = tInv.getRight();
- final IItemHandlerModifiable inv = tInv.getLeft();
-
- return inv.getStackInSlot(tSlot) != null; // && allowPullStack(getBaseMetaTileEntity(), aIndex, (byte) aSide,
- // aStack);
- }
+ // #region Item - MultiBlock related Item behaviour.
@Override
- public int getSizeInventory(MultiBlockPart aPart) {
- final Map<String, IItemHandlerModifiable> multiBlockInventory = getMultiBlockInventory(aPart);
- if (multiBlockInventory == null) return 0;
-
- final String lockedInventory = aPart.getLockedInventory();
- if (lockedInventory == null) {
- int len = 0;
- for (IItemHandlerModifiable inv : multiBlockInventory.values()) len += inv.getSlots();
- return len;
- } else {
- final IItemHandlerModifiable inv = multiBlockInventory.get(lockedInventory);
- return inv != null ? inv.getSlots() : 0;
- }
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side == facing) return null;
+ return switch (type) {
+ case Input -> controllerItemInput.getAllInventoryLogics();
+ case Output -> controllerItemOutput.getAllInventoryLogics();
+ default -> null;
+ };
}
@Override
- public ItemStack getStackInSlot(MultiBlockPart aPart, int aSlot) {
- final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot);
- if (tInv == null) return null;
-
- final int tSlot = tInv.getRight();
- final IItemHandlerModifiable inv = tInv.getLeft();
- if (inv == null) return null;
-
- return inv.getStackInSlot(tSlot);
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull InventoryType type, @Nullable UUID id) {
+ return switch (type) {
+ case Input -> controllerItemInput.getInventoryLogic(id);
+ case Output -> controllerItemOutput.getInventoryLogic(id);
+ default -> null;
+ };
}
@Override
- public ItemStack decrStackSize(MultiBlockPart aPart, int aSlot, int aDecrement) {
- final ItemStack tStack = getStackInSlot(aPart, aSlot);
- ItemStack rStack = GT_Utility.copyOrNull(tStack);
- if (tStack != null) {
- if (tStack.stackSize <= aDecrement) {
- setInventorySlotContents(aPart, aSlot, null);
- } else {
- rStack = tStack.splitStack(aDecrement);
- if (tStack.stackSize == 0) setInventorySlotContents(aPart, aSlot, null);
+ @Nonnull
+ public UUID registerItemInventory(int slots, int tier, @Nonnull InventoryType type, boolean isUpgradeInventory) {
+ return switch (type) {
+ case Input -> controllerItemInput.addInventory(new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ case Output -> controllerItemOutput.addInventory(new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ case Both -> {
+ UUID id = controllerItemInput.addInventory(new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ controllerItemOutput.addInventory(id, new ItemInventoryLogic(slots, tier, isUpgradeInventory));
+ yield id;
}
- }
- return rStack;
- }
-
- @Override
- public ItemStack getStackInSlotOnClosing(MultiBlockPart aPart, int aSlot) {
- final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot);
- if (tInv == null) return null;
-
- final IItemHandlerModifiable inv = tInv.getLeft();
- final int tSlot = tInv.getRight();
-
- final ItemStack rStack = inv.getStackInSlot(tSlot);
- inv.setStackInSlot(tSlot, null);
- return rStack;
- }
-
- @Override
- public void setInventorySlotContents(MultiBlockPart aPart, int aSlot, ItemStack aStack) {
- final Pair<IItemHandlerModifiable, Integer> tInv = getInventory(aPart, aSlot);
- if (tInv == null) return;
-
- final IItemHandlerModifiable inv = tInv.getLeft();
- final int tSlot = tInv.getRight();
- inv.setStackInSlot(tSlot, aStack);
- }
-
- @Override
- public List<String> getInventoryNames(MultiBlockPart aPart) {
- final List<String> inventoryNames = new ArrayList<>();
- inventoryNames.add(ALL_INVENTORIES_NAME);
- inventoryNames.addAll(getMultiBlockInventoryNames(aPart).values());
- return inventoryNames;
- }
-
- @Override
- public List<String> getInventoryIDs(MultiBlockPart aPart) {
- final List<String> tInventoryIDs = new ArrayList<>();
- tInventoryIDs.add(ALL_INVENTORIES_NAME);
- tInventoryIDs.addAll(getMultiBlockInventory(aPart).keySet());
- return tInventoryIDs;
- }
-
- @Override
- public String getInventoryName(MultiBlockPart aPart) {
- final StringBuilder str = new StringBuilder();
- str.append(getInventoryName());
- if (aPart.modeSelected(MultiBlockPart.ITEM_IN)) {
- str.append(" Input");
- } else if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) {
- str.append(" Output");
- String a;
- } else {
- str.append(" Unknown");
- }
- final String lockedInventory = aPart.getLockedInventory();
- if (lockedInventory != null && !lockedInventory.equals("")) {
- str.append(" [Locked: ")
- .append(lockedInventory)
- .append("]");
- }
-
- return str.toString();
- }
-
- @Override
- public List<String> getTankArrayNames(MultiBlockPart aPart) {
- final List<String> inventoryNames = new ArrayList<>();
- inventoryNames.add(ALL_INVENTORIES_NAME);
- inventoryNames.addAll(getMultiBlockTankArrayNames(aPart).values());
- return inventoryNames;
- }
-
- @Override
- public List<String> getTankArrayIDs(MultiBlockPart aPart) {
- final List<String> inventoryIDs = new ArrayList<>();
- inventoryIDs.add(ALL_INVENTORIES_NAME);
- inventoryIDs.addAll(getMultiBlockTankArray(aPart).keySet());
- return inventoryIDs;
- }
-
- @Override
- public boolean hasCustomInventoryName(MultiBlockPart aPart) {
- return hasCustomInventoryName();
- }
-
- @Override
- public int getInventoryStackLimit(MultiBlockPart aPart) {
- return getInventoryStackLimit();
- }
-
- @Override
- public void markDirty(MultiBlockPart aPart) {
- markDirty();
- if (aPart.modeSelected(MultiBlockPart.ITEM_OUT)) markOutputInventoryBeenModified();
- else markInventoryBeenModified();
- }
-
- @Override
- public boolean isUseableByPlayer(MultiBlockPart aPart, EntityPlayer aPlayer) {
- return isUseableByPlayer(aPlayer);
- }
-
- @Override
- public void openInventory(MultiBlockPart aPart) {
- // TODO: MultiInventory - consider the part's inventory
- openInventory();
- }
-
- @Override
- public void closeInventory(MultiBlockPart aPart) {
- // TODO: MultiInventory - consider the part's inventory
- closeInventory();
- }
-
- @Override
- public boolean isItemValidForSlot(MultiBlockPart aPart, int aSlot, ItemStack aStack) {
- return isItemValidForSlot(aSlot, aStack);
- }
-
- /*
- * Helper Methods For Recipe checking
- */
-
- @Override
- protected ItemStack[] getInputItems() {
- return getInventoriesForInput().getStacks()
- .toArray(new ItemStack[0]);
- }
-
- protected ItemStack[] getOutputItems() {
- return getInventoriesForOutput().getStacks()
- .toArray(new ItemStack[0]);
- }
-
- protected Iterable<Pair<ItemStack[], String>> getItemInputsForEachInventory() {
- return multiBlockInputInventory.entrySet()
- .stream()
- .map(
- (entry) -> Pair.of(
- entry.getValue()
- .getStacks()
- .toArray(new ItemStack[0]),
- entry.getKey()))
- .collect(Collectors.toList());
- }
-
- protected ItemStack[] getItemInputsForInventory(String id) {
- IItemHandlerModifiable inventory = multiBlockInputInventory.get(id);
- if (inventory != null) {
- return inventory.getStacks()
- .toArray(new ItemStack[0]);
- }
- return null;
+ };
}
@Override
- protected FluidStack[] getInputFluids() {
- List<FluidStack> fluidStacks = new ArrayList<>();
- for (FluidTankGT[] inputTanks : multiBlockInputTank.values()) {
- for (FluidTankGT inputTank : inputTanks) {
- FluidStack fluidStack = inputTank.get();
- if (fluidStack != null) {
- fluidStacks.add(fluidStack);
- }
+ public ItemInventoryLogic unregisterItemInventory(@Nonnull UUID id, @Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerItemInput.removeInventory(id);
+ case Output -> controllerItemOutput.removeInventory(id);
+ case Both -> {
+ ItemInventoryLogic input = controllerItemInput.removeInventory(id);
+ ItemInventoryLogic output = controllerItemOutput.removeInventory(id);
+ yield new ItemInventoryLogic(
+ Arrays.asList(input, output)
+ .stream()
+ .map(inv -> inv.getInventory())
+ .collect(Collectors.toList()));
}
- }
- return fluidStacks.toArray(new FluidStack[0]);
- }
-
- protected FluidStack[] getOutputFluids() {
- List<FluidStack> fluidStacks = new ArrayList<>();
- for (FluidTankGT[] inputTanks : multiBlockInputTank.values()) {
- for (FluidTankGT inputTank : inputTanks) {
- FluidStack fluidStack = inputTank.getFluid();
- if (fluidStack != null) {
- fluidStacks.add(fluidStack);
- }
- }
- }
- return fluidStacks.toArray(new FluidStack[0]);
- }
-
- protected Iterable<Pair<FluidStack[], String>> getFluidInputsForEachTankArray() {
- return multiBlockInputTank.entrySet()
- .stream()
- .map((entry) -> Pair.of(FluidTankGT.getFluidsFromTanks(entry.getValue()), entry.getKey()))
- .collect(Collectors.toList());
- }
-
- protected FluidStack[] getFluidInputsForTankArray(String id) {
- return FluidTankGT.getFluidsFromTanks(multiBlockInputTank.get(id));
- }
-
- protected void setItemOutputs(String inventory, ItemStack... itemOutputs) {
- itemsToOutput = itemOutputs;
- inventoryName = inventory;
- }
-
- @Override
- protected void setItemOutputs(ItemStack... outputs) {
- super.setItemOutputs(outputs);
- inventoryName = null;
+ };
}
@Override
- protected void outputItems() {
- if (itemsToOutput == null) {
- return;
- }
-
- IItemHandlerModifiable inv;
- if (inventoryName != null) {
- inv = multiBlockOutputInventory.getOrDefault(inventoryName, getInventoriesForOutput());
- } else {
- inv = getInventoriesForOutput();
+ public void changeItemInventoryDisplayName(@Nullable UUID id, @Nullable String displayName,
+ @Nonnull InventoryType type) {
+ switch (type) {
+ case Input:
+ controllerItemInput.setInventoryDisplayName(id, displayName);
+ break;
+ case Output:
+ controllerItemOutput.setInventoryDisplayName(id, displayName);
+ break;
+ case Both:
+ controllerItemInput.setInventoryDisplayName(id, displayName);
+ controllerItemOutput.setInventoryDisplayName(id, displayName);
+ break;
}
- for (ItemStack item : itemsToOutput) {
- int index = 0;
- while (item != null && item.stackSize > 0 && index < inv.getSlots()) {
- item = inv.insertItem(index++, item.copy(), false);
- }
- }
- itemsToOutput = null;
}
- protected void setFluidOutputs(String tank, FluidStack... fluidOuputs) {
- fluidsToOutput = fluidOuputs;
- tankName = tank;
- }
+ // #endregion Item
- @Override
- protected void setFluidOutputs(FluidStack... outputs) {
- super.setFluidOutputs(outputs);
- tankName = null;
- }
+ // #region Energy
+ @Nonnull
@Override
- protected void outputFluids() {
- if (fluidsToOutput == null) {
- return;
- }
-
- List<FluidTankGT> tanks = Arrays.asList(outputTanks);
- for (FluidStack fluid : fluidsToOutput) {
- int index = 0;
- while (fluid != null && fluid.amount > 0 && index < tanks.size()) {
- int filled = tanks.get(index++)
- .fill(fluid, true);
- fluid.amount -= filled;
- }
- }
+ public PowerLogic getPowerLogic() {
+ return getPowerLogic(ForgeDirection.UNKNOWN);
}
- @Override
- protected void updateSlots() {
- IItemHandlerModifiable inv = getInventoriesForInput();
- for (int i = 0; i < inv.getSlots(); i++) {
- if (inv.getStackInSlot(i) != null && inv.getStackInSlot(i).stackSize <= 0) {
- inv.setStackInSlot(i, null);
- }
- }
-
- for (FluidTankGT inputTank : getTanksForInput()) {
- if (inputTank == null) {
- continue;
- }
-
- if (inputTank.get() != null && inputTank.get().amount <= 0) {
- inputTank.setEmpty();
- continue;
- }
-
- FluidStack afterRecipe = inputTank.get();
- FluidStack beforeRecipe = inputTank.get(Integer.MAX_VALUE);
- if (afterRecipe == null || beforeRecipe == null) {
- continue;
- }
- int difference = beforeRecipe.amount - afterRecipe.amount;
- inputTank.remove(difference);
- }
- }
+ // #endregion Energy
@Override
- protected boolean checkRecipe() {
- if (!(this instanceof ProcessingLogicHost)) {
- return false;
- }
- ProcessingLogic logic = ((ProcessingLogicHost) this).getProcessingLogic();
- logic.clear();
- CheckRecipeResult result = CheckRecipeResultRegistry.NO_RECIPE;
- if (isSeparateInputs()) {
- // TODO: Add separation with fluids
- for (Pair<ItemStack[], String> inventory : getItemInputsForEachInventory()) {
- IItemHandlerModifiable outputInventory = multiBlockOutputInventory
- .getOrDefault(inventory.getLeft(), null);
- result = logic.setInputItems(inventory.getLeft())
- .setCurrentOutputItems(getOutputItems())
- .process();
- if (result.wasSuccessful()) {
- inventoryName = inventory.getRight();
- break;
- }
- logic.clear();
- }
- } else {
- result = logic.setInputItems(getInputItems())
- .setCurrentOutputItems(getOutputItems())
- .setInputFluids(getInputFluids())
- .setCurrentOutputFluids(getOutputFluids())
- .process();
- }
- setDuration(logic.getDuration());
- setEut(logic.getCalculatedEut());
- setItemOutputs(logic.getOutputItems());
- setFluidOutputs(logic.getOutputFluids());
- return result.wasSuccessful();
- }
-
- public IItemHandlerModifiable getOutputInventory() {
- return outputInventory;
- }
-
- public FluidTankGT[] getOutputTanks() {
- return outputTanks;
+ protected void updateSlots() {
+ controllerItemInput.getAllInventoryLogics()
+ .update(shouldSort);
+ controllerItemOutput.getAllInventoryLogics()
+ .update(shouldSort);
+ controllerFluidInput.getAllInventoryLogics()
+ .update();
+ controllerFluidOutput.getAllInventoryLogics()
+ .update();
}
/*
@@ -1838,24 +886,6 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
- public ModularWindow createWindow(UIBuildContext buildContext) {
- System.out.println("MultiBlockController::createWindow");
- if (!useModularUI()) return null;
-
- buildContext.setValidator(getValidator());
- final ModularWindow.Builder builder = ModularWindow.builder(getGUIWidth(), getGUIHeight());
- builder.setBackground(getGUITextureSet().getMainBackground());
- builder.setGuiTint(getGUIColorization());
- if (doesBindPlayerInventory()) {
- bindPlayerInventoryUI(builder, buildContext);
- }
- addUIWidgets(builder, buildContext);
- addTitleToUI(builder);
- addCoverTabs(builder, buildContext);
- return builder.build();
- }
-
- @Override
public boolean hasGui(ForgeDirection side) {
return true;
}
@@ -1866,222 +896,6 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
- public int getGUIHeight() {
- return 192;
- }
-
- protected Widget getGregTechLogo() {
- return new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
- .setSize(17, 17);
- }
-
- @Override
- public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- if (isServerSide()) {
- for (UpgradeCasing tPart : upgradeCasings) {
- if (!(tPart instanceof Inventory)) continue;
- tPart.issueClientUpdate();
- }
- }
- int page = 0;
- TabContainer tabs = new TabContainer().setButtonSize(20, 24);
- tabs.addTabButton(
- new TabButton(page++)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0, 1f, 0.5f),
- new ItemDrawable(getStackForm(1)).withFixedSize(16, 16)
- .withOffset(2, 4))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_START.getSubArea(0, 0.5f, 1f, 1f),
- new ItemDrawable(getStackForm(1)).withFixedSize(16, 16)
- .withOffset(2, 4))
- .addTooltip(getLocalName())
- .setPos(20 * (page - 1), -20))
- .addPage(createMainPage(builder).setSize(getGUIWidth(), getGUIHeight()));
- if (hasItemInput()) {
- tabs.addTabButton(
- new TabButton(page++)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
- GT_UITextures.PICTURE_ITEM_IN.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
- GT_UITextures.PICTURE_ITEM_IN.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setPos(20 * (page - 1), -20))
- .addPage(
- new MultiChildWidget().addChild(getItemInventoryInputGUI())
- .addChild(getGregTechLogo().setPos(147, 86))
- .setSize(getGUIWidth(), getGUIHeight()));
- }
-
- if (hasItemOutput()) {
- tabs.addTabButton(
- new TabButton(page++)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
- GT_UITextures.PICTURE_ITEM_OUT.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
- GT_UITextures.PICTURE_ITEM_OUT.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setPos(20 * (page - 1), -20))
- .addPage(
- new MultiChildWidget().addChild(getItemInventoryOutputGUI())
- .addChild(getGregTechLogo().setPos(147, 86))
- .setSize(getGUIWidth(), getGUIHeight()));
- }
-
- if (hasFluidInput()) {
- tabs.addTabButton(
- new TabButton(page++)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
- GT_UITextures.PICTURE_FLUID_IN.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
- GT_UITextures.PICTURE_FLUID_IN.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setPos(20 * (page - 1), -20))
- .addPage(
- new MultiChildWidget().addChild(getFluidInventoryInputGUI())
- .addChild(getGregTechLogo().setPos(147, 86))
- .setSize(getGUIWidth(), getGUIHeight()));
- }
-
- if (hasFluidOutput()) {
- tabs.addTabButton(
- new TabButton(page++)
- .setBackground(
- false,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0, 1f, 0.5f),
- GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setBackground(
- true,
- ModularUITextures.VANILLA_TAB_TOP_MIDDLE.getSubArea(0, 0.5f, 1f, 1f),
- GT_UITextures.PICTURE_FLUID_OUT.withFixedSize(16, 16)
- .withOffset(2, 4))
- .setPos(20 * (page - 1), -20))
- .addPage(
- new MultiChildWidget().addChild(getFluidInventoryOutputGUI())
- .addChild(getGregTechLogo().setPos(147, 86))
- .setSize(getGUIWidth(), getGUIHeight()));
- }
- builder.widget(tabs);
- }
-
- protected MultiChildWidget createMainPage(IWidgetBuilder<?> builder) {
- MultiChildWidget page = new MultiChildWidget();
- page.addChild(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
- .setPos(7, 4)
- .setSize(160, 75))
- .addChild(createButtons(builder));
- return page;
- }
-
- protected MultiChildWidget createButtons(IWidgetBuilder<?> builder) {
- MultiChildWidget buttons = new MultiChildWidget();
- buttons.setSize(16, 167)
- .setPos(7, 86);
- buttons.addChild(createPowerSwitchButton(builder))
- .addChild(createVoidExcessButton(builder))
- .addChild(createInputSeparationButton(builder))
- .addChild(createBatchModeButton(builder))
- .addChild(createLockToSingleRecipeButton(builder));
-
- return buttons;
- }
-
- protected Widget getItemInventoryInputGUI() {
- final IItemHandlerModifiable inv = getInventoriesForInput();
- final Scrollable scrollable = new Scrollable().setVerticalScroll();
- for (int rows = 0; rows * 4 < Math.min(inv.getSlots(), 128); rows++) {
- final int columnsToMake = Math.min(Math.min(inv.getSlots(), 128) - rows * 4, 4);
- for (int column = 0; column < columnsToMake; column++) {
- scrollable.widget(
- new SlotWidget(inv, rows * 4 + column).setPos(column * 18, rows * 18)
- .setSize(18, 18));
- }
- }
- return scrollable.setSize(18 * 4 + 4, 18 * 5)
- .setPos(52, 7);
- }
-
- protected Widget getItemInventoryOutputGUI() {
- final IItemHandlerModifiable inv = getInventoriesForOutput();
- final Scrollable scrollable = new Scrollable().setVerticalScroll();
- for (int rows = 0; rows * 4 < Math.min(inv.getSlots(), 128); rows++) {
- final int columnsToMake = Math.min(Math.min(inv.getSlots(), 128) - rows * 4, 4);
- for (int column = 0; column < columnsToMake; column++) {
- scrollable.widget(
- new SlotWidget(inv, rows * 4 + column).setPos(column * 18, rows * 18)
- .setSize(18, 18));
- }
- }
- return scrollable.setSize(18 * 4 + 4, 18 * 5)
- .setPos(52, 7);
- }
-
- protected IItemHandlerModifiable getInventoriesForInput() {
- return new ListItemHandler(multiBlockInputInventory.values());
- }
-
- protected IItemHandlerModifiable getInventoriesForOutput() {
- return new ListItemHandler(multiBlockOutputInventory.values());
- }
-
- protected Widget getFluidInventoryInputGUI() {
- final IFluidTank[] tanks = getTanksForInput();
- final Scrollable scrollable = new Scrollable().setVerticalScroll();
- for (int rows = 0; rows * 4 < tanks.length; rows++) {
- final int columnsToMake = Math.min(tanks.length - rows * 4, 4);
- for (int column = 0; column < columnsToMake; column++) {
- final FluidSlotWidget fluidSlot = new FluidSlotWidget(tanks[rows * 4 + column]);
- scrollable.widget(
- fluidSlot.setPos(column * 18, rows * 18)
- .setSize(18, 18));
- }
- }
- return scrollable.setSize(18 * 4 + 4, 18 * 5)
- .setPos(52, 7);
- }
-
- protected Widget getFluidInventoryOutputGUI() {
- final IFluidTank[] tanks = getTanksForOutput();
- final Scrollable scrollable = new Scrollable().setVerticalScroll();
- for (int rows = 0; rows * 4 < tanks.length; rows++) {
- final int columnsToMake = Math.min(tanks.length - rows * 4, 4);
- for (int column = 0; column < columnsToMake; column++) {
- final FluidSlotWidget fluidSlot = new FluidSlotWidget(tanks[rows * 4 + column]);
- fluidSlot.setInteraction(true, false);
- scrollable.widget(
- fluidSlot.setPos(column * 18, rows * 18)
- .setSize(18, 18));
- }
- }
- return scrollable.setSize(18 * 4 + 4, 18 * 5)
- .setPos(52, 7);
- }
-
- @Override
- public Pos2d getPowerSwitchButtonPos() {
- return new Pos2d(144, 0);
- }
-
- @Override
public boolean supportsVoidProtection() {
return true;
}
@@ -2097,23 +911,6 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
- public List<ItemStack> getItemOutputSlots(ItemStack[] toOutput) {
- List<ItemStack> ret = new ArrayList<>();
- IItemHandler inv = getOutputInventory();
- if (inv != null && inv.getSlots() > 0) {
- for (int i = 0; i < inv.getSlots(); i++) {
- ret.add(inv.getStackInSlot(i));
- }
- }
- return ret;
- }
-
- @Override
- public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
- return Arrays.asList(getOutputTanks());
- }
-
- @Override
public boolean canDumpItemToME() {
return false;
}
@@ -2124,31 +921,21 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
- public Pos2d getVoidingModeButtonPos() {
- return new Pos2d(54, 0);
- }
-
- @Override
public boolean supportsInputSeparation() {
return true;
}
@Override
- public boolean isInputSeparationEnabled() {
+ public boolean isInputSeparated() {
return separateInputs;
}
@Override
- public void setInputSeparation(boolean enabled) {
+ public void setInputSeparation(Boolean enabled) {
this.separateInputs = enabled;
}
@Override
- public Pos2d getInputSeparationButtonPos() {
- return new Pos2d(36, 0);
- }
-
- @Override
public boolean supportsBatchMode() {
return true;
}
@@ -2159,16 +946,11 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
- public void setBatchMode(boolean mode) {
+ public void setBatchMode(Boolean mode) {
this.batchMode = mode;
}
@Override
- public Pos2d getBatchModeButtonPos() {
- return new Pos2d(18, 0);
- }
-
- @Override
public boolean supportsSingleRecipeLocking() {
return false;
}
@@ -2179,32 +961,23 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
@Override
- public void setRecipeLocking(boolean enabled) {
+ public void setRecipeLocking(Boolean enabled) {
this.recipeLock = enabled;
}
@Override
- public RecipeMap<?> getRecipeMap() {
- return null;
- }
-
- @Override
- public Pos2d getRecipeLockingButtonPos() {
- return new Pos2d(0, 0);
- }
-
- @Override
- public ModularWindow createWindowGUI(UIBuildContext buildContext) {
- return createWindow(buildContext);
- }
-
- @Override
public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
int z) {
super.getWailaNBTData(player, tile, tag, world, x, y, z);
- tag.setLong("progress", progressTime);
- tag.setLong("maxProgress", maxProgressTime);
+ P processing = getProcessingLogic();
+ tag.setInteger("progress", processing.getProgress());
+ tag.setInteger("maxProgress", processing.getDuration());
tag.setBoolean("structureOkay", structureOkay);
+ tag.setBoolean("isActive", isActive());
+ if (isActive()) {
+ tag.setLong("energyUsage", getProcessingLogic().getCalculatedEut());
+ tag.setLong("energyTier", tier);
+ }
}
@Override
@@ -2219,8 +992,92 @@ public abstract class Controller<T extends Controller<T>> extends MultiTileBasic
}
if (isSimpleMachine) {
boolean isActive = tag.getBoolean("isActive");
- currentTip
- .add(GT_Waila.getMachineProgressString(isActive, tag.getLong("maxProgress"), tag.getLong("progress")));
+ currentTip.add(
+ GT_Waila.getMachineProgressString(isActive, tag.getInteger("maxProgress"), tag.getInteger("progress")));
+ }
+ boolean isActive = tag.getBoolean("isActive");
+ if (isActive) {
+ long energyTier = tag.getLong("energyTier");
+ long actualEnergyUsage = tag.getLong("energyUsage");
+ if (actualEnergyUsage > 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.use_with_amperage",
+ GT_Utility.formatNumbers(actualEnergyUsage),
+ GT_Utility.getAmperageForTier(actualEnergyUsage, (byte) energyTier),
+ GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
+ } else if (actualEnergyUsage < 0) {
+ currentTip.add(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.waila.energy.produce_with_amperage",
+ GT_Utility.formatNumbers(-actualEnergyUsage),
+ GT_Utility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier),
+ GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
+ }
}
}
+
+ @Override
+ public GT_Packet_MultiTileEntity getClientDataPacket() {
+ final GT_Packet_MultiTileEntity packet = super.getClientDataPacket();
+
+ return packet;
+
+ }
+
+ @Override
+ public void enableWorking() {
+ super.enableWorking();
+ if (!structureOkay) {
+ checkStructure(true);
+ }
+ }
+
+ @Override
+ public List<ItemStack> getItemOutputSlots(ItemStack[] toOutput) {
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ public List<? extends IFluidStore> getFluidOutputSlots(FluidStack[] toOutput) {
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ @Nonnull
+ public Set<Entry<UUID, FluidInventoryLogic>> getAllFluidInventoryLogics(@Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerFluidInput.getAllInventoryLogicsAsEntrySet();
+ case Output -> controllerFluidOutput.getAllInventoryLogicsAsEntrySet();
+ default -> super.getAllFluidInventoryLogics(type);
+ };
+ }
+
+ @Override
+ @Nonnull
+ public Set<Entry<UUID, ItemInventoryLogic>> getAllItemInventoryLogics(@Nonnull InventoryType type) {
+ return switch (type) {
+ case Input -> controllerItemInput.getAllInventoryLogicsAsEntrySet();
+ case Output -> controllerItemOutput.getAllInventoryLogicsAsEntrySet();
+ default -> super.getAllItemInventoryLogics(type);
+ };
+ }
+
+ @Override
+ public void setWirelessSupport(boolean canUse) {
+ if (canUse) {
+ strongCheckOrAddUser(getOwnerUuid(), getOwnerName());
+ }
+ power.setCanUseWireless(canUse, getOwnerUuid());
+ }
+
+ @Override
+ public void setLaserSupport(boolean canUse) {
+ power.setCanUseLaser(canUse);
+ }
+
+ @Override
+ public void setMaxAmperage(long amperage) {
+ power.setMaxAmperage(amperage);
+ }
}
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 db9053b0d7..223edc0761 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
@@ -2,7 +2,6 @@ package gregtech.api.multitileentity.multiblock.base;
import static com.google.common.math.LongMath.log2;
import static gregtech.api.enums.GT_Values.B;
-import static gregtech.api.enums.GT_Values.NBT;
import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN;
import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN;
import static gregtech.api.enums.Textures.BlockIcons.ITEM_IN_SIGN;
@@ -11,13 +10,17 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_IN_MULTI;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ENERGY_OUT_MULTI;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
-import static org.apache.commons.lang3.ObjectUtils.firstNonNull;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
@@ -25,44 +28,42 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
-import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.FluidTankInfo;
-import net.minecraftforge.fluids.IFluidTank;
-import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
-import com.gtnewhorizons.modularui.api.screen.ModularWindow;
import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
-import com.gtnewhorizons.modularui.common.widget.DropDownWidget;
-import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
-import com.gtnewhorizons.modularui.common.widget.Scrollable;
-import com.gtnewhorizons.modularui.common.widget.SlotGroup;
-import com.gtnewhorizons.modularui.common.widget.SlotWidget;
-import com.gtnewhorizons.modularui.common.widget.TextWidget;
-
-import gregtech.api.enums.GT_Values;
+
+import gregtech.api.enums.GT_Values.NBT;
+import gregtech.api.enums.InventoryType;
import gregtech.api.fluid.FluidTankGT;
-import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.GUIHost;
+import gregtech.api.gui.GUIProvider;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.logic.FluidInventoryLogic;
+import gregtech.api.logic.ItemInventoryLogic;
+import gregtech.api.logic.NullPowerLogic;
import gregtech.api.logic.PowerLogic;
import gregtech.api.logic.interfaces.PowerLogicHost;
+import gregtech.api.multitileentity.MultiTileEntityRegistry;
import gregtech.api.multitileentity.base.NonTickableMultiTileEntity;
+import gregtech.api.multitileentity.enums.MultiTileCasingPurpose;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
-import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_BreakBlock;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasModes;
import gregtech.api.net.GT_Packet_MultiTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Utility;
import gregtech.common.covers.CoverInfo;
+import gregtech.common.gui.PartGUIProvider;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
public abstract class MultiBlockPart extends NonTickableMultiTileEntity
- implements IMultiBlockPart, IMTE_BreakBlock, IMTE_HasModes, PowerLogicHost {
+ implements IMultiBlockPart, IMTE_HasModes, PowerLogicHost, IMultiTileEntity.IMTE_AddToolTips, GUIHost {
public static final int NOTHING = 0, ENERGY_IN = B[0], ENERGY_OUT = B[1], FLUID_IN = B[2], FLUID_OUT = B[3],
ITEM_IN = B[4], ITEM_OUT = B[5];
@@ -70,16 +71,20 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
protected final List<Integer> BASIC_MODES = new ArrayList<>(
Arrays.asList(NOTHING, ENERGY_IN, ENERGY_OUT, FLUID_IN, FLUID_OUT, ITEM_IN, ITEM_OUT));
- protected ChunkCoordinates mTargetPos = null;
- protected IMultiBlockController target = null;
+ protected Set<MultiTileCasingPurpose> registeredPurposes = new HashSet<>();
- protected int mAllowedModes = NOTHING; // BITMASK - Modes allowed for this part
- protected byte mMode = 0; // Mode selected for this part
+ protected ChunkCoordinates targetPosition = null;
- protected String mLockedInventory = GT_Values.E;
+ protected int allowedModes = NOTHING; // BITMASK - Modes allowed for this part
+ protected int mode = 0; // Mode selected for this part
+
+ protected UUID lockedInventory;
protected int mLockedInventoryIndex = 0;
protected FluidTankGT configurationTank = new FluidTankGT();
+ @Nonnull
+ protected final GUIProvider<?> guiProvider = createGUIProvider();
+
/**
* What Part Tier is this part? All Basic Casings are Tier 1, and will allow: Energy, Item, Fluid input/output. Some
* of the more advanced modes can be set to require a higher tier part.
@@ -88,33 +93,40 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
return 1;
}
- public String getLockedInventory() {
- // TODO: Can this cause side-effects? Removed for now because it causes huge network traffic when using covers
- // issueClientUpdate();
- IMultiBlockController controller = getTarget(false);
- if (modeSelected(ITEM_IN) || modeSelected(ITEM_OUT)) {
- if (!getNameOfInventoryFromIndex(controller, mLockedInventoryIndex).equals(mLockedInventory)) {
- mLockedInventory = getNameOfInventoryFromIndex(controller, mLockedInventoryIndex);
- if (mLockedInventory.equals(Controller.ALL_INVENTORIES_NAME)) {
- mLockedInventory = "";
- }
- }
- } else {
- if (!getNameOfTankArrayFromIndex(controller, mLockedInventoryIndex).equals(mLockedInventory)) {
- mLockedInventory = getNameOfTankArrayFromIndex(controller, mLockedInventoryIndex);
- if (mLockedInventory.equals(Controller.ALL_INVENTORIES_NAME)) {
- mLockedInventory = "";
- }
+ @Override
+ public UUID getLockedInventory() {
+ return lockedInventory;
+ }
+
+ public void setTarget(IMultiBlockController newTarget, int aAllowedModes) {
+ IMultiBlockController currentTarget = getTarget(false);
+ if (currentTarget != null && currentTarget != newTarget) {
+ for (MultiTileCasingPurpose purpose : registeredPurposes) {
+ unregisterPurpose(purpose);
}
}
- return mLockedInventory.equals("") ? null : mLockedInventory;
+ targetPosition = (newTarget == null ? null : newTarget.getCoords());
+ allowedModes = aAllowedModes;
+ if (newTarget != null) {
+ registerCovers(newTarget);
+ registerPurposes();
+ }
}
- public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
- target = aTarget;
- mTargetPos = (target == null ? null : target.getCoords());
- mAllowedModes = aAllowedModes;
- if (target != null) registerCovers(target);
+ protected void registerPurpose(MultiTileCasingPurpose purpose) {
+ IMultiBlockController target = getTarget(false);
+ if (target != null) {
+ target.registerCaseWithPurpose(purpose, this);
+ registeredPurposes.add(purpose);
+ }
+ }
+
+ protected void unregisterPurpose(MultiTileCasingPurpose purpose) {
+ IMultiBlockController target = getTarget(false);
+ if (target != null) {
+ target.unregisterCaseWithPurpose(purpose, this);
+ }
+ registeredPurposes.remove(purpose);
}
@Override
@@ -125,14 +137,14 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
} else {
tList.add("No Controller");
}
- tList.add("Casing Mode: " + getModeName(mMode));
+ tList.add("Casing Mode: " + getModeName(mode));
}
@Override
public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
super.getWailaBody(itemStack, currentTip, accessor, config);
- currentTip.add(String.format("Mode: %s", getModeName(mMode)));
+ currentTip.add(String.format("Mode: %s", getModeName(mode)));
if (modeSelected(FLUID_OUT)) {
if (configurationTank != null && configurationTank.get() != null) {
currentTip.add(
@@ -147,19 +159,22 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
}
public IMultiBlockController getTarget(boolean aCheckValidity) {
- if (mTargetPos == null) return null;
- if (target == null || target.isDead()) {
- if (worldObj.blockExists(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ)) {
- final TileEntity te = worldObj.getTileEntity(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ);
- if (te instanceof IMultiBlockController) {
- target = (IMultiBlockController) te;
- // Register our covers with the controller
- registerCovers(target);
- } else {
- mTargetPos = null;
- }
- }
+ if (targetPosition == null) {
+ return null;
+ }
+
+ if (!worldObj.blockExists(targetPosition.posX, targetPosition.posY, targetPosition.posZ)) {
+ return null;
+ }
+ final TileEntity te = worldObj.getTileEntity(targetPosition.posX, targetPosition.posY, targetPosition.posZ);
+ IMultiBlockController target = null;
+ if (te instanceof IMultiBlockController targetFound) {
+ target = targetFound;
+ } else {
+ targetPosition = null;
+ return null;
}
+
if (aCheckValidity) {
return target != null && target.checkStructure(false) ? target : null;
}
@@ -175,17 +190,26 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
}
}
+ protected void registerPurposes() {
+ for (MultiTileCasingPurpose purpose : registeredPurposes) {
+ registerPurpose(purpose);
+ }
+ }
+
@Override
public void setCoverItemAtSide(ForgeDirection side, ItemStack aCover) {
super.setCoverItemAtSide(side, aCover);
// TODO: Filter on tickable covers
final IMultiBlockController tTarget = getTarget(true);
- if (tTarget != null) {
- final CoverInfo coverInfo = getCoverInfoAtSide(side);
- if (coverInfo.isValid() && coverInfo.getTickRate() > 0) {
- tTarget.registerCoveredPartOnSide(side, this);
- }
+ if (tTarget == null) {
+ return;
}
+
+ final CoverInfo coverInfo = getCoverInfoAtSide(side);
+ if (coverInfo.isValid() && coverInfo.getTickRate() > 0) {
+ tTarget.registerCoveredPartOnSide(side, this);
+ }
+
}
public void unregisterCovers(IMultiBlockController controller) {
@@ -208,16 +232,16 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
@Override
public void readMultiTileNBT(NBTTagCompound aNBT) {
- if (aNBT.hasKey(NBT.ALLOWED_MODES)) mAllowedModes = aNBT.getInteger(NBT.ALLOWED_MODES);
- if (aNBT.hasKey(NBT.MODE)) mMode = aNBT.getByte(NBT.MODE);
+ if (aNBT.hasKey(NBT.ALLOWED_MODES)) allowedModes = aNBT.getInteger(NBT.ALLOWED_MODES);
+ if (aNBT.hasKey(NBT.MODE)) setMode(aNBT.getByte(NBT.MODE));
if (aNBT.hasKey(NBT.TARGET)) {
- mTargetPos = new ChunkCoordinates(
+ targetPosition = new ChunkCoordinates(
aNBT.getInteger(NBT.TARGET_X),
aNBT.getShort(NBT.TARGET_Y),
aNBT.getInteger(NBT.TARGET_Z));
}
if (aNBT.hasKey(NBT.LOCKED_INVENTORY)) {
- mLockedInventory = aNBT.getString(NBT.LOCKED_INVENTORY);
+ lockedInventory = UUID.fromString(aNBT.getString(NBT.LOCKED_INVENTORY));
}
if (aNBT.hasKey(NBT.LOCKED_INVENTORY_INDEX)) {
mLockedInventoryIndex = aNBT.getInteger(NBT.LOCKED_INVENTORY_INDEX);
@@ -225,20 +249,26 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
if (aNBT.hasKey(NBT.LOCKED_FLUID)) {
configurationTank.readFromNBT(aNBT, NBT.LOCKED_FLUID);
}
+ if (modeSelected(ITEM_OUT)) {
+ registeredPurposes.add(MultiTileCasingPurpose.ItemOutput);
+ }
+ if (modeSelected(FLUID_OUT)) {
+ registeredPurposes.add(MultiTileCasingPurpose.FluidOutput);
+ }
}
@Override
public void writeMultiTileNBT(NBTTagCompound aNBT) {
- if (mAllowedModes != NOTHING) aNBT.setInteger(NBT.ALLOWED_MODES, mAllowedModes);
- if (mMode != 0) aNBT.setInteger(NBT.MODE, mMode);
- if (mTargetPos != null) {
+ if (allowedModes != NOTHING) aNBT.setInteger(NBT.ALLOWED_MODES, allowedModes);
+ if (mode != 0) aNBT.setInteger(NBT.MODE, mode);
+ if (targetPosition != null) {
aNBT.setBoolean(NBT.TARGET, true);
- aNBT.setInteger(NBT.TARGET_X, mTargetPos.posX);
- aNBT.setShort(NBT.TARGET_Y, (short) mTargetPos.posY);
- aNBT.setInteger(NBT.TARGET_Z, mTargetPos.posZ);
+ aNBT.setInteger(NBT.TARGET_X, targetPosition.posX);
+ aNBT.setShort(NBT.TARGET_Y, (short) targetPosition.posY);
+ aNBT.setInteger(NBT.TARGET_Z, targetPosition.posZ);
}
- if (mLockedInventory != null) {
- aNBT.setString(NBT.LOCKED_INVENTORY, mLockedInventory);
+ if (lockedInventory != null) {
+ aNBT.setString(NBT.LOCKED_INVENTORY, lockedInventory.toString());
}
if (mLockedInventoryIndex != 0) {
aNBT.setInteger(NBT.LOCKED_INVENTORY_INDEX, mLockedInventoryIndex);
@@ -270,34 +300,47 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
@Override
public void setTargetPos(ChunkCoordinates aTargetPos) {
- mTargetPos = aTargetPos;
- IMultiBlockController mTarget = getTarget(false);
- setTarget(mTarget, mAllowedModes);
+ targetPosition = aTargetPos;
+ IMultiBlockController target = getTarget(false);
+ setTarget(target, allowedModes);
}
@Override
public ChunkCoordinates getTargetPos() {
- return mTargetPos;
+ return targetPosition;
}
@Override
- public void setMode(byte aMode) {
- mMode = aMode;
+ public void setMode(int mode) {
+ if (this.mode == mode) return;
+ if (modeSelected(FLUID_OUT)) {
+ unregisterPurpose(MultiTileCasingPurpose.FluidOutput);
+ }
+ if (modeSelected(ITEM_OUT)) {
+ unregisterPurpose(MultiTileCasingPurpose.ItemOutput);
+ }
+ this.mode = mode;
+ if (modeSelected(FLUID_OUT)) {
+ registerPurpose(MultiTileCasingPurpose.FluidOutput);
+ }
+ if (modeSelected(ITEM_OUT)) {
+ registerPurpose(MultiTileCasingPurpose.ItemOutput);
+ }
}
@Override
- public byte getMode() {
- return mMode;
+ public int getMode() {
+ return mode;
}
@Override
public int getAllowedModes() {
- return mAllowedModes;
+ return allowedModes;
}
@Override
public void setAllowedModes(int aAllowedModes) {
- mAllowedModes = aAllowedModes;
+ allowedModes = aAllowedModes;
}
/**
@@ -305,7 +348,7 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
*/
public boolean hasMode(int aMode) {
// This is not sent to the client
- return (mAllowedModes & aMode) != 0;
+ return (allowedModes & aMode) != 0;
}
/**
@@ -313,7 +356,7 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
*/
public boolean modeSelected(int... aModes) {
for (int aMode : aModes) {
- if (hasMode(aMode) && mMode == getModeOrdinal(aMode)) return true;
+ if (hasMode(aMode) && mode == getModeOrdinal(aMode)) return true;
}
return false;
}
@@ -344,39 +387,39 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
@Override
public ITexture getTexture(ForgeDirection side) {
ITexture texture = super.getTexture(side);
- if (mMode != 0 && side == facing) {
- if (mMode == getModeOrdinal(ITEM_IN)) {
+ if (mode != 0 && side == facing) {
+ if (mode == getModeOrdinal(ITEM_IN)) {
return TextureFactory.of(
texture,
TextureFactory.of(OVERLAY_PIPE_IN),
TextureFactory.of(ITEM_IN_SIGN),
getCoverTexture(side));
}
- if (mMode == getModeOrdinal(ITEM_OUT)) {
+ if (mode == getModeOrdinal(ITEM_OUT)) {
return TextureFactory.of(
texture,
TextureFactory.of(OVERLAY_PIPE_OUT),
TextureFactory.of(ITEM_OUT_SIGN),
getCoverTexture(side));
}
- if (mMode == getModeOrdinal(FLUID_IN)) {
+ if (mode == getModeOrdinal(FLUID_IN)) {
return TextureFactory.of(
texture,
TextureFactory.of(OVERLAY_PIPE_IN),
TextureFactory.of(FLUID_IN_SIGN),
getCoverTexture(side));
}
- if (mMode == getModeOrdinal(FLUID_OUT)) {
+ if (mode == getModeOrdinal(FLUID_OUT)) {
return TextureFactory.of(
texture,
TextureFactory.of(OVERLAY_PIPE_OUT),
TextureFactory.of(FLUID_OUT_SIGN),
getCoverTexture(side));
}
- if (mMode == getModeOrdinal(ENERGY_IN)) {
+ if (mode == getModeOrdinal(ENERGY_IN)) {
return TextureFactory.of(texture, TextureFactory.of(OVERLAY_ENERGY_IN_MULTI), getCoverTexture(side));
}
- if (mMode == getModeOrdinal(ENERGY_OUT)) {
+ if (mode == getModeOrdinal(ENERGY_OUT)) {
return TextureFactory.of(texture, TextureFactory.of(OVERLAY_ENERGY_OUT_MULTI), getCoverTexture(side));
}
}
@@ -384,11 +427,6 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
return TextureFactory.of(texture, getCoverTexture(side));
}
- @Override
- public boolean isUseableByPlayer(EntityPlayer entityPlayer) {
- return false;
- }
-
protected String getModeName(int aMode) {
if (aMode == NOTHING) return "Nothing";
if (aMode == getModeOrdinal(ITEM_IN)) return "Item Input";
@@ -407,11 +445,11 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
}
protected byte getNextAllowedMode(List<Integer> allowedModes) {
- if (mAllowedModes == NOTHING) return NOTHING;
+ if (this.allowedModes == NOTHING) return NOTHING;
final int numModes = allowedModes.size();
for (byte i = 1; i <= numModes; i++) {
- final byte curMode = (byte) ((mMode + i) % numModes);
+ final byte curMode = (byte) ((mode + i) % numModes);
if (curMode == NOTHING || hasMode(1 << (curMode - 1))) return curMode;
}
// Nothing valid found
@@ -420,16 +458,16 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
@Override
public boolean onMalletRightClick(EntityPlayer aPlayer, ItemStack tCurrentItem, ForgeDirection wrenchSide, float aX,
- float aY, float aZ, ItemStack aTool) {
- if (mAllowedModes == NOTHING) return true;
- if (mMode == NOTHING) {
+ float aY, float aZ) {
+ if (allowedModes == NOTHING) return true;
+ if (mode == NOTHING) {
facing = wrenchSide;
}
- mMode = getNextAllowedMode(BASIC_MODES);
+ setMode(getNextAllowedMode(BASIC_MODES));
if (aPlayer.isSneaking()) {
facing = wrenchSide;
}
- GT_Utility.sendChatToPlayer(aPlayer, "Mode set to `" + getModeName(mMode) + "' (" + mMode + ")");
+ GT_Utility.sendChatToPlayer(aPlayer, "Mode set to `" + getModeName(mode) + "' (" + mode + ")");
sendClientData((EntityPlayerMP) aPlayer);
return true;
}
@@ -447,109 +485,50 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
return "gt.multitileentity.multiblock.part";
}
+ @Override
+ public boolean shouldTick(long tickTimer) {
+ return modeSelected(ITEM_OUT, FLUID_OUT);
+ }
+
/**
* TODO: Make sure the energy/item/fluid hatch is facing that way! or has that mode enabled on that side Check
* SIDE_UNKNOWN for or coverbehavior
*/
- /**
- * Fluid - Depending on the part type - proxy it to the multiblock controller, if we have one
- */
+ // #region Fluid - Depending on the part type - proxy it to the multiblock controller, if we have one
@Override
- public int fill(ForgeDirection aDirection, FluidStack aFluidStack, boolean aDoFill) {
- if (!modeSelected(FLUID_IN)) return 0;
+ @Nullable
+ public FluidInventoryLogic getFluidLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType type) {
+ if (side != facing && side != ForgeDirection.UNKNOWN) return null;
- if (aFluidStack == null || isWrongFluid(aFluidStack.getFluid())) return 0;
- if (aDirection != ForgeDirection.UNKNOWN
- && (facing.compareTo(aDirection) != 0 || !coverLetsFluidIn(aDirection, aFluidStack.getFluid()))) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller == null ? 0 : controller.fill(this, aDirection, aFluidStack, aDoFill);
- }
+ if (!modeSelected(FLUID_IN, FLUID_OUT)) return null;
- @Override
- public FluidStack drain(ForgeDirection aDirection, FluidStack aFluidStack, boolean aDoDrain) {
- if (!modeSelected(FLUID_OUT)) return null;
- if (aFluidStack == null || isWrongFluid(aFluidStack.getFluid())) return null;
- if (aDirection != ForgeDirection.UNKNOWN
- && (facing.compareTo(aDirection) != 0 || !coverLetsFluidOut(aDirection, aFluidStack.getFluid())))
- return null;
- final IMultiBlockController controller = getTarget(true);
- return controller == null ? null : controller.drain(this, aDirection, aFluidStack, aDoDrain);
- }
-
- @Override
- public FluidStack drain(ForgeDirection aDirection, int aAmountToDrain, boolean aDoDrain) {
- if (!modeSelected(FLUID_OUT)) return null;
- final IMultiBlockController controller = getTarget(true);
+ IMultiBlockController controller = getTarget(false);
if (controller == null) return null;
- FluidStack aFluidStack = null;
- if (getLockedFluid() != null) {
- aFluidStack = controller.getDrainableFluid(aDirection, getLockedFluid());
- } else {
- aFluidStack = controller.getDrainableFluid(aDirection);
- }
- if (aFluidStack == null || isWrongFluid(aFluidStack.getFluid())) return null;
- if (aDirection != ForgeDirection.UNKNOWN
- && (facing.compareTo(aDirection) != 0 || !coverLetsFluidOut(aDirection, aFluidStack.getFluid())))
- return null;
- return controller.drain(this, aDirection, aFluidStack, aDoDrain);
- }
-
- @Override
- public boolean canFill(ForgeDirection aDirection, Fluid aFluid) {
- if (!modeSelected(FLUID_IN)) return false;
-
- if (aDirection != ForgeDirection.UNKNOWN
- && (facing.compareTo(aDirection) != 0 || !coverLetsFluidIn(aDirection, aFluid))) return false;
- if (isWrongFluid(aFluid)) return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && controller.canFill(this, aDirection, aFluid);
+ return controller
+ .getFluidLogic(modeSelected(FLUID_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory);
}
- @Override
- public boolean canDrain(ForgeDirection aDirection, Fluid aFluid) {
- if (!modeSelected(FLUID_OUT)) return false;
- if (aDirection != ForgeDirection.UNKNOWN
- && (facing.compareTo(aDirection) != 0 || !coverLetsFluidOut(aDirection, aFluid))) return false;
- if (isWrongFluid(aFluid)) return false;
- final IMultiBlockController controller = getTarget(true);
- return controller != null && controller.canDrain(this, aDirection, aFluid);
- }
-
- @Override
- public FluidTankInfo[] getTankInfo(ForgeDirection aDirection) {
- if (!modeSelected(FLUID_IN, FLUID_OUT)
- || (aDirection != ForgeDirection.UNKNOWN && facing.compareTo(aDirection) != 0))
- return GT_Values.emptyFluidTankInfo;
- final IMultiBlockController controller = getTarget(true);
- if (controller == null) return GT_Values.emptyFluidTankInfo;
-
- final CoverInfo coverInfo = getCoverInfoAtSide(aDirection);
-
- if ((controller.isLiquidInput(aDirection) && coverInfo.letsFluidIn(null, controller))
- || (controller.isLiquidOutput(aDirection) && coverInfo.letsFluidOut(null, controller)))
- return controller.getTankInfo(this, aDirection);
-
- return GT_Values.emptyFluidTankInfo;
- }
+ // #endregion Fluid
// #region Energy - Depending on the part type - proxy to the multiblock controller, if we have one
@Override
- public PowerLogic getPowerLogic(ForgeDirection side) {
- if (facing == side) {
- return null;
+ @Nonnull
+ public PowerLogic getPowerLogic(@Nonnull ForgeDirection side) {
+ if (side != facing && side != ForgeDirection.UNKNOWN) {
+ return new NullPowerLogic();
}
if (!modeSelected(ENERGY_IN, ENERGY_OUT)) {
- return null;
+ return new NullPowerLogic();
}
final IMultiBlockController controller = getTarget(true);
if (controller == null) {
- return null;
+ return new NullPowerLogic();
}
- return controller.getPowerLogic(this, side);
+ return controller.getPowerLogic();
}
@Override
@@ -562,119 +541,32 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
return modeSelected(ENERGY_OUT);
}
- // #endregion
-
- /**
- * Inventory - Depending on the part type - proxy to the multiblock controller, if we have one
- */
- @Override
- public boolean hasInventoryBeenModified() {
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && controller.hasInventoryBeenModified(this));
- }
-
- @Override
- public boolean isValidSlot(int aIndex) {
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && controller.isValidSlot(this, aIndex));
- }
-
- @Override
- public boolean addStackToSlot(int aIndex, ItemStack aStack) {
- if (!modeSelected(ITEM_IN, ITEM_OUT)) return false;
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && controller.addStackToSlot(this, aIndex, aStack));
- }
-
- @Override
- public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) {
- if (!modeSelected(ITEM_IN, ITEM_OUT)) return false;
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && controller.addStackToSlot(this, aIndex, aStack, aAmount));
- }
+ // #endregion Energy
- @Override
- public int[] getAccessibleSlotsFromSide(int ordinalSide) {
- final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
- if (!modeSelected(ITEM_IN, ITEM_OUT) || (facing != ForgeDirection.UNKNOWN && facing.compareTo(side) != 0))
- return GT_Values.emptyIntArray;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getAccessibleSlotsFromSide(this, side) : GT_Values.emptyIntArray;
- }
+ // #region Item - Depending on the part type - proxy to the multiblock controller, if we have one
@Override
- public boolean canInsertItem(int aSlot, ItemStack aStack, int ordinalSide) {
- final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
- if (!modeSelected(ITEM_IN, ITEM_OUT)
- || (facing != ForgeDirection.UNKNOWN && (facing.compareTo(side) != 0 || !coverLetsItemsIn(side, aSlot))))
- return false;
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && controller.canInsertItem(this, aSlot, aStack, side));
- }
+ @Nullable
+ public ItemInventoryLogic getItemLogic(@Nonnull ForgeDirection side, @Nonnull InventoryType unused) {
+ if (side != facing && side != ForgeDirection.UNKNOWN) return null;
- @Override
- public boolean canExtractItem(int aSlot, ItemStack aStack, int ordinalSide) {
- final ForgeDirection side = ForgeDirection.getOrientation(ordinalSide);
- if (!modeSelected(ITEM_IN, ITEM_OUT)
- || (facing != ForgeDirection.UNKNOWN && (facing.compareTo(side) != 0 || !coverLetsItemsOut(side, aSlot))))
- return false;
- final IMultiBlockController controller = getTarget(true);
- return (controller != null && controller.canExtractItem(this, aSlot, aStack, side));
- }
-
- @Override
- public int getSizeInventory() {
- if (!modeSelected(ITEM_IN, ITEM_OUT)) return 0;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getSizeInventory(this) : 0;
- }
-
- @Override
- public ItemStack getStackInSlot(int aSlot) {
if (!modeSelected(ITEM_IN, ITEM_OUT)) return null;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getStackInSlot(this, aSlot) : null;
- }
-
- @Override
- public ItemStack decrStackSize(int aSlot, int aDecrement) {
- if (!modeSelected(ITEM_IN, ITEM_OUT)) return null;
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.decrStackSize(this, aSlot, aDecrement) : null;
- }
- @Override
- public ItemStack getStackInSlotOnClosing(int aSlot) {
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getStackInSlotOnClosing(this, aSlot) : null;
- }
-
- @Override
- public void setInventorySlotContents(int aSlot, ItemStack aStack) {
- final IMultiBlockController controller = getTarget(true);
- if (controller != null) controller.setInventorySlotContents(this, aSlot, aStack);
- }
-
- @Override
- public String getInventoryName() {
- final IMultiBlockController controller = getTarget(true);
- if (controller != null) return controller.getInventoryName(this);
- return firstNonNull(getCustomName(), getTileEntityName());
- }
+ final IMultiBlockController controller = getTarget(false);
+ if (controller == null) return null;
- @Override
- public int getInventoryStackLimit() {
- final IMultiBlockController controller = getTarget(true);
- return controller != null ? controller.getInventoryStackLimit(this) : 0;
+ return controller
+ .getItemLogic(modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory);
}
@Override
- public boolean isItemValidForSlot(int aSlot, ItemStack aStack) {
- final IMultiBlockController controller = getTarget(true);
- return controller != null && controller.isItemValidForSlot(this, aSlot, aStack);
+ @Nullable
+ public InventoryType getItemInventoryType() {
+ if (!modeSelected(ITEM_IN, ITEM_OUT)) return InventoryType.Both;
+ return modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output;
}
- // End Inventory
+ // #endregion Item
// === Modular UI ===
@Override
@@ -700,62 +592,6 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
return getTarget(true) != null;
}
- protected void addItemInventory(Builder builder, UIBuildContext buildContext) {
- final IMultiBlockController controller = getTarget(false);
- if (controller == null) {
- return;
- }
- final IItemHandlerModifiable inv = controller.getInventoryForGUI(this);
- final Scrollable scrollable = new Scrollable().setVerticalScroll();
- for (int rows = 0; rows * 4 < Math.min(inv.getSlots(), 128); rows++) {
- int columnsToMake = Math.min(Math.min(inv.getSlots(), 128) - rows * 4, 4);
- for (int column = 0; column < columnsToMake; column++) {
- scrollable.widget(
- new SlotWidget(inv, rows * 4 + column).setPos(column * 18, rows * 18)
- .setSize(18, 18));
- }
- }
- 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(Controller.ALL_INVENTORIES_NAME)) {
- mLockedInventory = GT_Values.E;
- mLockedInventoryIndex = 0;
- } else {
- mLockedInventory = getNameOfInventoryFromIndex(controller, index);
- mLockedInventoryIndex = index;
- }
- setSelected.run();
- }),
- true);
- builder.widget(
- 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.getInventoryIDs(this);
- if (index > invNames.size()) {
- return invNames.get(0);
- }
- return invNames.get(index);
- }
-
- protected String getNameOfTankArrayFromIndex(final IMultiBlockController controller, int index) {
- final List<String> tankNames = controller.getTankArrayIDs(this);
- if (index > tankNames.size()) {
- return tankNames.get(0);
- }
- return tankNames.get(index);
- }
-
protected boolean isWrongFluid(Fluid fluid) {
if (fluid == null) {
return true;
@@ -776,98 +612,34 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
return null;
}
- protected void addFluidInventory(Builder builder, UIBuildContext buildContext) {
- final IMultiBlockController controller = getTarget(false);
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ IMultiBlockController controller = getTarget(false);
if (controller == null) {
return;
}
- builder.widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
- .setPos(7, 4)
- .setSize(85, 95));
- if (modeSelected(FLUID_OUT)) {
+ if ((modeSelected(ITEM_IN, ITEM_OUT))) {
builder.widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
- .setPos(getGUIWidth() - 77, 4)
- .setSize(70, 40))
- .widget(
- new TextWidget("Locked Fluid").setDefaultColor(COLOR_TEXT_WHITE.get())
- .setPos(getGUIWidth() - 72, 8));
- }
- final IFluidTank[] tanks = controller.getFluidTanksForGUI(this);
- final Scrollable scrollable = new Scrollable().setVerticalScroll();
- for (int rows = 0; rows * 4 < tanks.length; rows++) {
- int columnsToMake = Math.min(tanks.length - rows * 4, 4);
- for (int column = 0; column < columnsToMake; column++) {
- FluidSlotWidget fluidSlot = new FluidSlotWidget(tanks[rows * 4 + column]);
- if (modeSelected(FLUID_OUT)) {
- fluidSlot.setInteraction(true, false);
- }
- scrollable.widget(
- fluidSlot.setPos(column * 18, rows * 18)
- .setSize(18, 18));
- }
+ controller
+ .getItemLogic(modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory)
+ .getGuiPart()
+ .setSize(18 * 4 + 4, 18 * 5)
+ .setPos(52, 7));
}
- builder.widget(
- scrollable.setSize(18 * 4 + 4, 18 * 4)
- .setPos(12, 21));
- DropDownWidget dropDown = new DropDownWidget();
- dropDown.addDropDownItemsSimple(
- controller.getTankArrayNames(this),
- (buttonWidget, index, label, setSelected) -> buttonWidget.setOnClick((clickData, widget) -> {
- if (getNameOfTankArrayFromIndex(controller, index).equals(Controller.ALL_INVENTORIES_NAME)) {
- mLockedInventory = GT_Values.E;
- mLockedInventoryIndex = 0;
- } else {
- mLockedInventory = getNameOfTankArrayFromIndex(controller, index);
- mLockedInventoryIndex = index;
- }
- setSelected.run();
- }),
- true);
- builder.widget(
- dropDown.setSelected(mLockedInventoryIndex)
- .setExpandedMaxHeight(60)
- .setDirection(DropDownWidget.Direction.DOWN)
- .setPos(13, 8)
- .setSize(70, 11));
- }
- @Override
- public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
- if (modeSelected(ITEM_IN, ITEM_OUT)) {
- addItemInventory(builder, buildContext);
- return;
- }
- if (modeSelected(FLUID_IN, FLUID_OUT)) {
- addFluidInventory(builder, buildContext);
- if (modeSelected(FLUID_OUT)) {
- builder.widget(
- SlotGroup.ofFluidTanks(Collections.singletonList(configurationTank), 1)
- .startFromSlot(0)
- .endAtSlot(0)
- .phantom(true)
- .build()
- .setPos(getGUIWidth() - 72, 20));
- }
- return;
+ if ((modeSelected(FLUID_IN, FLUID_OUT))) {
+ builder.widget(
+ controller
+ .getFluidLogic(modeSelected(FLUID_IN) ? InventoryType.Input : InventoryType.Output, lockedInventory)
+ .getGuiPart()
+ .setSize(18 * 4 + 4, 18 * 5)
+ .setPos(52, 7));
}
}
- @Override
- public ModularWindow createWindow(UIBuildContext buildContext) {
- if (isServerSide()) {
- issueClientUpdate();
- }
- System.out.println("MultiBlockPart::createWindow");
- if (modeSelected(NOTHING, ENERGY_IN, ENERGY_OUT) || mMode == NOTHING) {
- IMultiBlockController controller = getTarget(false);
- if (controller == null) {
- return super.createWindow(buildContext);
- }
- return controller.createWindowGUI(buildContext);
- }
- return super.createWindow(buildContext);
+ protected boolean canOpenControllerGui() {
+ return true;
}
@Override
@@ -891,4 +663,62 @@ public abstract class MultiBlockPart extends NonTickableMultiTileEntity
super.addGregTechLogo(builder);
}
}
+
+ @Override
+ public void addToolTips(List<String> list, ItemStack stack, boolean f3_h) {
+ list.add("A MultiTileEntity Casing");
+ }
+
+ public String getInventoryName() {
+ IMultiBlockController controller = getTarget(false);
+ if (controller == null) return "";
+ if (modeSelected(ITEM_IN, ITEM_OUT)) {
+ InventoryType type = modeSelected(ITEM_IN) ? InventoryType.Input : InventoryType.Output;
+ ItemInventoryLogic itemLogic = controller.getItemLogic(type, lockedInventory);
+ return itemLogic.getDisplayName();
+ }
+ if (modeSelected(FLUID_IN, FLUID_OUT)) {
+ InventoryType type = modeSelected(FLUID_IN) ? InventoryType.Input : InventoryType.Output;
+ FluidInventoryLogic fluidLogic = controller.getFluidLogic(type, lockedInventory);
+ return fluidLogic.getDisplayName();
+ }
+ return "";
+ }
+
+ @Override
+ @Nonnull
+ public ForgeDirection getPowerOutputSide() {
+ if (!modeSelected(ENERGY_OUT)) return ForgeDirection.UNKNOWN;
+ return facing;
+ }
+
+ @Nonnull
+ protected GUIProvider<?> createGUIProvider() {
+ return new PartGUIProvider<>(this);
+ }
+
+ @Override
+ @Nonnull
+ public GUIProvider<?> getGUI(@Nonnull UIBuildContext uiContext) {
+ IMultiBlockController controller = getTarget(false);
+ if (controller == null) return guiProvider;
+ if (!modeSelected(NOTHING, ENERGY_IN, ENERGY_OUT)) return guiProvider;
+ if (!canOpenControllerGui()) return guiProvider;
+ if (uiContext.getPlayer()
+ .isSneaking()) return guiProvider;
+ GUIProvider<?> controllerGUI = controller.getGUI(uiContext);
+ return controllerGUI;
+ }
+
+ @Override
+ public ItemStack getAsItem() {
+ return MultiTileEntityRegistry.getRegistry(getMultiTileEntityRegistryID())
+ .getItem(getMultiTileEntityID());
+ }
+
+ @Override
+ public String getMachineName() {
+ return StatCollector.translateToLocal(getAsItem().getUnlocalizedName());
+ }
+
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/PowerController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/PowerController.java
deleted file mode 100644
index 532f171717..0000000000
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/PowerController.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package gregtech.api.multitileentity.multiblock.base;
-
-import java.util.List;
-
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.StatCollector;
-import net.minecraft.world.World;
-import net.minecraftforge.common.util.ForgeDirection;
-
-import gregtech.api.enums.GT_Values;
-import gregtech.api.logic.PowerLogic;
-import gregtech.api.logic.interfaces.PowerLogicHost;
-import gregtech.api.util.GT_Utility;
-import mcp.mobius.waila.api.IWailaConfigHandler;
-import mcp.mobius.waila.api.IWailaDataAccessor;
-
-public abstract class PowerController<T extends PowerController<T>> extends Controller<T> implements PowerLogicHost {
-
- public PowerController() {
- super();
- power = new PowerLogic().setType(PowerLogic.RECEIVER);
- }
-
- protected PowerLogic power;
-
- @Override
- public void writeMultiTileNBT(NBTTagCompound nbt) {
- super.writeMultiTileNBT(nbt);
- power.writeToNBT(nbt);
- }
-
- @Override
- public void readMultiTileNBT(NBTTagCompound nbt) {
- super.readMultiTileNBT(nbt);
- power.loadFromNBT(nbt);
- }
-
- @Override
- public PowerLogic getPowerLogic(ForgeDirection side) {
- return power;
- }
-
- @Override
- public boolean checkMachine() {
- boolean result = super.checkMachine();
- power.setEnergyCapacity(GT_Values.V[tier] * 2 * 60 * 20);
- power.setAmperage(2);
- power.setMaxVoltage(GT_Values.V[tier]);
- return result;
- }
-
- @Override
- public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
- int z) {
- super.getWailaNBTData(player, tile, tag, world, x, y, z);
- tag.setBoolean("isActive", isActive());
- if (isActive()) {
- tag.setLong("energyUsage", eut);
- tag.setLong("energyTier", tier);
- }
- }
-
- @Override
- public void getWailaBody(ItemStack itemStack, List<String> currentTip, IWailaDataAccessor accessor,
- IWailaConfigHandler config) {
- super.getWailaBody(itemStack, currentTip, accessor, config);
- final NBTTagCompound tag = accessor.getNBTData();
- boolean isActive = tag.getBoolean("isActive");
- if (isActive) {
- long energyTier = tag.getLong("energyTier");
- long actualEnergyUsage = tag.getLong("energyUsage");
- if (actualEnergyUsage > 0) {
- currentTip.add(
- StatCollector.translateToLocalFormatted(
- "GT5U.waila.energy.use_with_amperage",
- GT_Utility.formatNumbers(actualEnergyUsage),
- GT_Utility.getAmperageForTier(actualEnergyUsage, (byte) energyTier),
- GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
- } else if (actualEnergyUsage < 0) {
- currentTip.add(
- StatCollector.translateToLocalFormatted(
- "GT5U.waila.energy.produce_with_amperage",
- GT_Utility.formatNumbers(-actualEnergyUsage),
- GT_Utility.getAmperageForTier(-actualEnergyUsage, (byte) energyTier),
- GT_Utility.getColoredTierNameFromTier((byte) energyTier)));
- }
- }
- }
-}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java
index 90a2742290..51feb363dd 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableController.java
@@ -4,11 +4,15 @@ import net.minecraft.item.ItemStack;
import com.gtnewhorizon.structurelib.util.Vec3Impl;
-public abstract class StackableController<T extends StackableController<T>> extends PowerController<T> {
+import gregtech.api.logic.MuTEProcessingLogic;
- protected static String STACKABLE_TOP = "STACKABLE_TOP";
+public abstract class StackableController<C extends StackableController<C, P>, P extends MuTEProcessingLogic<P>>
+ extends Controller<C, P> {
+
+ protected static String STACKABLE_STOP = "STACKABLE_STOP";
protected static String STACKABLE_MIDDLE = "STACKABLE_MIDDLE";
- protected static String STACKABLE_BOTTOM = "STACKABLE_BOTTOM";
+ protected static String STACKABLE_START = "STACKABLE_START";
+ protected int stackCount = 0;
/**
* construct implementation for stackable multi-blocks
@@ -19,16 +23,16 @@ public abstract class StackableController<T extends StackableController<T>> exte
final int stackCount = Math.min(blueprintCount, getMaxStacks());
buildState.startBuilding(getStartingStructureOffset());
- buildPiece(STACKABLE_BOTTOM, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildPiece(getStackableStart(), trigger, hintsOnly, buildState.getCurrentOffset());
buildState.addOffset(getStartingStackOffset());
for (int i = 0; i < stackCount; i++) {
- buildPiece(STACKABLE_MIDDLE, trigger, hintsOnly, buildState.getCurrentOffset());
+ buildPiece(getStackableMiddle(i), trigger, hintsOnly, buildState.getCurrentOffset());
buildState.addOffset(getPerStackOffset());
}
if (hasTop()) {
buildState.addOffset(getAfterLastStackOffset());
- buildPiece(STACKABLE_TOP, trigger, hintsOnly, buildState.stopBuilding());
+ buildPiece(getStackableStop(), trigger, hintsOnly, buildState.stopBuilding());
} else {
buildState.stopBuilding();
}
@@ -85,27 +89,40 @@ public abstract class StackableController<T extends StackableController<T>> exte
*/
@Override
public boolean checkMachine() {
- int stackCount = 0;
+ stackCount = 0;
buildState.startBuilding(getStartingStructureOffset());
- if (!checkPiece(STACKABLE_BOTTOM, buildState.getCurrentOffset())) return buildState.failBuilding();
+ if (!checkPiece(getStackableStart(), buildState.getCurrentOffset())) return buildState.failBuilding();
buildState.addOffset(getStartingStackOffset());
for (int i = 0; i < getMaxStacks(); i++) {
- if (checkPiece(STACKABLE_MIDDLE, buildState.getCurrentOffset())) {
- buildState.addOffset(getPerStackOffset());
- stackCount++;
- } else {
+ if (!checkPiece(getStackableMiddle(i), buildState.getCurrentOffset())) {
break;
}
+
+ buildState.addOffset(getPerStackOffset());
+ stackCount++;
+
}
if (stackCount < getMinStacks()) return buildState.failBuilding();
buildState.addOffset(getAfterLastStackOffset());
- if (!checkPiece(STACKABLE_TOP, buildState.stopBuilding())) {
+ if (!checkPiece(getStackableStop(), buildState.stopBuilding())) {
return buildState.failBuilding();
}
return super.checkMachine();
}
+
+ protected String getStackableStop() {
+ return STACKABLE_STOP;
+ }
+
+ protected String getStackableMiddle(int stackIndex) {
+ return STACKABLE_MIDDLE;
+ }
+
+ protected String getStackableStart() {
+ return STACKABLE_START;
+ }
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java
new file mode 100644
index 0000000000..1dfd497151
--- /dev/null
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/StackableModularController.java
@@ -0,0 +1,77 @@
+package gregtech.api.multitileentity.multiblock.base;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jetbrains.annotations.NotNull;
+
+import gregtech.api.logic.MuTEProcessingLogic;
+import gregtech.api.multitileentity.interfaces.UpgradableModularMuTE;
+import gregtech.api.util.GT_StructureUtilityMuTE.UpgradeCasings;
+
+public abstract class StackableModularController<C extends StackableModularController<C, P>, P extends MuTEProcessingLogic<P>>
+ extends StackableController<C, P> implements UpgradableModularMuTE {
+
+ protected double durationMultiplier = 1;
+ protected double euTickMultiplier = 1;
+
+ private Map<UpgradeCasings, int[]> mucMap;
+
+ protected @NotNull Map<UpgradeCasings, int[]> getMucMap() {
+ if (mucMap == null) {
+ mucMap = createMucMap();
+ }
+ return mucMap;
+ }
+
+ protected static @NotNull Map<UpgradeCasings, int[]> createMucMap() {
+ Map<UpgradeCasings, int[]> mucCount = new HashMap<>();
+ mucCount.put(UpgradeCasings.Heater, new int[] { 0, 0, 0, 0, 0 });
+ mucCount.put(UpgradeCasings.Insulator, new int[] { 0, 0, 0, 0, 0 });
+ return mucCount;
+ }
+
+ @Override
+ public void increaseMucCount(UpgradeCasings casingType, int tier) {
+ Map<UpgradeCasings, int[]> mucCounters = getMucMap();
+ int[] casingCount = mucCounters.get(casingType);
+
+ switch (tier) {
+ case 0, 1, 2 -> casingCount[0] += 1;
+ case 3, 4, 5 -> casingCount[1] += 1;
+ case 6, 7, 8 -> casingCount[2] += 1;
+ case 9, 10, 11 -> casingCount[3] += 1;
+ default -> casingCount[4] += 1;
+ }
+ }
+
+ @Override
+ public void resetMucCount() {
+ Map<UpgradeCasings, int[]> mucCounters = getMucMap();
+ mucCounters.forEach((type, casingCount) -> { Arrays.fill(casingCount, 0); });
+ }
+
+ // Returns the cheapest MUC that is possible for the multi, which gets the minimum bonuses.
+ protected abstract UpgradeCasings getBaseMucType();
+
+ // Minimum parallel bonus per MUC. Higher tier MUCs multiply with this value for even more parallels.
+ protected abstract int getParallelFactor();
+
+ protected void calculateParallels() {
+ int parallelCount = 0;
+ int parallelFactor = getParallelFactor();
+ int[] parallelCasingList = mucMap.get(getBaseMucType());
+
+ for (int i = 0; i < 5; i++) {
+ // (i * 3 + 1) -> Convert MUC tier into minimum GT tier, in groups of 3 (LV, EV, LuV, UHV, UMV)
+ // If higher than multi tier, upgrade casing has no effect
+ if (i * 3 + 1 <= tier) {
+ parallelCount += parallelCasingList[i] * (i + 1) * parallelFactor;
+ }
+ }
+ maxParallel = parallelCount == 0 ? 1 : parallelCount;
+ }
+
+ protected abstract boolean calculateMucMultipliers();
+}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java
index 62beb64022..ccde0c49e6 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/WallShareablePart.java
@@ -2,6 +2,7 @@ package gregtech.api.multitileentity.multiblock.base;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChunkCoordinates;
@@ -12,50 +13,39 @@ import gregtech.api.multitileentity.interfaces.IMultiBlockController;
public class WallShareablePart extends MultiBlockPart {
protected List<ChunkCoordinates> targetPositions = new ArrayList<>();
- protected List<IMultiBlockController> targets = new ArrayList<>();
@Override
public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
- if (targets.size() > 1 || targetPositions.size() > 1) {
- mAllowedModes = 0;
- mMode = 0;
+ if (targetPositions.size() >= 1) {
+ allowedModes = 0;
+ setMode((byte) 0);
+ targetPosition = null;
} else {
- mAllowedModes = aAllowedModes;
+ allowedModes = aAllowedModes;
}
if (aTarget == null) {
return;
}
- targets.add(aTarget);
targetPositions.add(aTarget.getCoords());
}
@Override
- public String getLockedInventory() {
- issueClientUpdate();
- if (targets.size() > 1 || targetPositions.size() > 1) {
+ public UUID getLockedInventory() {
+ if (targetPositions.size() > 1) {
return null;
}
-
- IMultiBlockController controller = getTarget(false);
- if (!getNameOfInventoryFromIndex(controller, mLockedInventoryIndex).equals(mLockedInventory)) {
- mLockedInventory = getNameOfInventoryFromIndex(controller, mLockedInventoryIndex);
- if (mLockedInventory.equals("all")) {
- mLockedInventory = "";
- }
- }
- return mLockedInventory.equals("") ? null : mLockedInventory;
+ return super.getLockedInventory();
}
@Override
public IMultiBlockController getTarget(boolean aCheckValidity) {
- if (targets.size() > 1 || targetPositions.size() > 1 || targets.size() <= 0 || targetPositions.size() <= 0) {
+ if (targetPositions.size() != 1) {
return null;
}
- target = targets.get(0);
- mTargetPos = targetPositions.get(0);
+ targetPosition = targetPositions.get(0);
return super.getTarget(aCheckValidity);
}
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java
index e3230eac02..fb045557e4 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/casing/UpgradeCasing.java
@@ -16,9 +16,12 @@ public abstract class UpgradeCasing extends MultiBlockPart {
}
@Override
- public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
- super.setTarget(aTarget, aAllowedModes);
- if (target != null) customWork(target);
+ public void setTarget(IMultiBlockController newTarget, int aAllowedModes) {
+ super.setTarget(newTarget, aAllowedModes);
+
+ if (getTarget(false) != null) {
+ customWork(getTarget(false));
+ }
}
@Override
@@ -28,4 +31,5 @@ public abstract class UpgradeCasing extends MultiBlockPart {
}
protected abstract void customWork(IMultiBlockController aTarget);
+
}