aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorkekzdealer <kekzdealer@gmail.com>2019-11-21 18:38:33 +0100
committerkekzdealer <kekzdealer@gmail.com>2019-11-21 18:38:33 +0100
commitf9eac626254ed31477925618a45af5005e4628ac (patch)
tree60e9b73067f9cb5e7a656a1d73b2a232887e0da8 /src/main/java
parent5fe214204875ac23e078e514dcd4fc8a001e3d37 (diff)
downloadGT5-Unofficial-f9eac626254ed31477925618a45af5005e4628ac.tar.gz
GT5-Unofficial-f9eac626254ed31477925618a45af5005e4628ac.tar.bz2
GT5-Unofficial-f9eac626254ed31477925618a45af5005e4628ac.zip
first try at MultiItemHandler
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/kekztech/KekzCore.java7
-rw-r--r--src/main/java/kekztech/MultiItemHandler.java86
-rw-r--r--src/main/java/tileentities/GTMTE_ItemServer.java41
-rw-r--r--src/main/java/tileentities/TE_ItemServerIOPort.java44
4 files changed, 151 insertions, 27 deletions
diff --git a/src/main/java/kekztech/KekzCore.java b/src/main/java/kekztech/KekzCore.java
index 41f02ae036..9d0ae23283 100644
--- a/src/main/java/kekztech/KekzCore.java
+++ b/src/main/java/kekztech/KekzCore.java
@@ -119,7 +119,6 @@ public class KekzCore {
System.out.println("Registering KekzTech recipes...");
final MetaItem_CraftingComponent craftingItem = MetaItem_CraftingComponent.getInstance();
- final MetaItem_ReactorComponent reactorItem = MetaItem_ReactorComponent.getInstance();
// Multiblock Controllers
final Object[] mk1_recipe = {
@@ -393,9 +392,9 @@ public class KekzCore {
Materials.CarbonDioxide.getGas(16000),
craftingItem.getStackOfAmountFromDamage(Items.IsotopicallyPureDiamondCrystal.getMetaID(), 1), 10000, 2400, 7680);
GT_Values.RA.addAutoclaveRecipe(
- craftingItem.getStackOfAmountFromDamage(Items.IsotopicallyPureDiamondDust.getMetaID(), 4),
- Materials.CarbonDioxide.getGas(16000),
- craftingItem.getStackOfAmountFromDamage(Items.IsotopicallyPureDiamondCrystal.getMetaID(), 1), 10000, 2400, 1920);
+ craftingItem.getStackOfAmountFromDamage(Items.BoronArsenideDust.getMetaID(), 4),
+ Materials.Nitrogen.getGas(4000),
+ craftingItem.getStackOfAmountFromDamage(Items.BoronArsenideCrystal.getMetaID(), 1), 10000, 2400, 1920);
// Heat Pipes
GT_Values.RA.addLatheRecipe(
diff --git a/src/main/java/kekztech/MultiItemHandler.java b/src/main/java/kekztech/MultiItemHandler.java
index aac3dc59c4..766abbbb93 100644
--- a/src/main/java/kekztech/MultiItemHandler.java
+++ b/src/main/java/kekztech/MultiItemHandler.java
@@ -1,18 +1,41 @@
package kekztech;
+import java.util.ArrayList;
+
+import net.minecraft.item.ItemStack;
+
public class MultiItemHandler {
- private int itemTypeCapacity = 128;
- private int perTypeCapacity = 1024;
+ private int perTypeCapacity = 0;
private boolean locked = true;
+ private final ArrayList<ItemStack> items = new ArrayList<>();
+
public MultiItemHandler() {
}
- public void setItemTypeCapacity(int itemTypeCapacity) {
- this.itemTypeCapacity = itemTypeCapacity;
+ /**
+ * Tries to adapt the internal storage to match structure changes.
+ * Structure should turn off and give a warning if this returns false.
+ * Otherwise items might unavailable.
+ *
+ * @param itemTypeCapacity
+ * New item array length to adapt to.
+ * @return Success status of the operation.
+ */
+ public boolean setItemTypeCapacity(int itemTypeCapacity) {
+ if(items.size() > itemTypeCapacity) {
+ System.out.println("WARNING: ITEM SERVER STRUCTURE WAS DOWNSIZED TOO FAR! LOCKING FOR SAFETY.");
+ setLock(true);
+ return false;
+ } else {
+ items.ensureCapacity(itemTypeCapacity);
+ // If the lock was engaged, it should only be disengaged by turning
+ // the structure back on after fixing the above warning.
+ return true;
+ }
}
public void setPerTypeCapacity(int perTypeCapacity) {
@@ -21,6 +44,7 @@ public class MultiItemHandler {
/**
* Lock internal storage in case Item Server is not running.
+ * May also be engaged in case of item safety issues.
*
* @param state
* Lock state.
@@ -30,12 +54,64 @@ public class MultiItemHandler {
}
public int getItemTypeCapacity() {
- return itemTypeCapacity;
+ return items.size();
}
public int getPerTypeCapacity() {
return perTypeCapacity;
}
+ public ItemStack getStackInSlot(int slot) {
+ System.out.println("Stack in slot " + slot + " requested");
+ if(locked || slot >= items.size()) {
+ return null;
+ } else {
+ return items.get(slot);
+ }
+ }
+
+ public void insertStackInSlot(int slot, ItemStack itemStack) {
+ System.out.println("Inserting " + itemStack.getDisplayName() + " into " + slot);
+ if(itemStack == null
+ || items.get(slot) != null
+ || locked
+ || slot >= items.size()) {
+ return;
+ } else {
+ items.set(slot, itemStack);
+ }
+ }
+
+ public int increaseStackInSlot(int slot, int amount) {
+ System.out.println("Increasing item in slot " + slot + " by " + amount);
+ if(slot >= items.size()
+ || locked
+ || amount <= 0) {
+ return 0;
+ } else {
+ final int space = perTypeCapacity - items.get(slot).stackSize;
+ final int fit = Math.min(space, amount);
+ items.get(slot).stackSize += fit;
+ return fit;
+ }
+ }
+
+ public int reduceStackInSlot(int slot, int amount) {
+ System.out.println("Reducing item in slot " + slot + " by " + amount);
+ if(slot >= items.size()
+ || locked
+ || amount <= 0) {
+ return 0;
+ } else {
+ final int available = items.get(slot).stackSize;
+ final int take = Math.min(available, amount);
+ items.get(slot).stackSize -= take;
+ if(take == available) {
+ items.set(slot, null);
+ }
+ return take;
+ }
+ }
+
}
diff --git a/src/main/java/tileentities/GTMTE_ItemServer.java b/src/main/java/tileentities/GTMTE_ItemServer.java
index 8fcb72c498..9b4d50c5d4 100644
--- a/src/main/java/tileentities/GTMTE_ItemServer.java
+++ b/src/main/java/tileentities/GTMTE_ItemServer.java
@@ -15,7 +15,6 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
import gregtech.api.objects.GT_RenderedTexture;
-import kekztech.MultiFluidHandler;
import kekztech.MultiItemHandler;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
@@ -115,9 +114,20 @@ public class GTMTE_ItemServer extends GT_MetaTileEntity_MultiBlockBase {
this.mEUt = (int) (BASE_SLICE_ENERGY_COST * sliceCount * Math.pow(2, config));
super.mMaxProgresstime = 10;
+ mih.setPerTypeCapacity((int) (BASE_PER_ITEM_CAPACITY * Math.pow(4, config)));
+
return true;
}
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+
+ if(mih != null) {
+ mih.setLock(!super.getBaseMetaTileEntity().isActive());
+ }
+ }
+
public Vector3ic rotateOffsetVector(Vector3ic forgeDirection, int x, int y, int z) {
final Vector3i offset = new Vector3i();
@@ -178,7 +188,12 @@ public class GTMTE_ItemServer extends GT_MetaTileEntity_MultiBlockBase {
if(thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == CASING) {
// yay
} else if (thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == IO_PORT) {
- // TODO: register IO port
+ final TE_ItemServerIOPort port =
+ (TE_ItemServerIOPort) thisController.getWorld().getTileEntity(
+ thisController.getXCoord() + offset.x(),
+ thisController.getYCoord() + offset.y(),
+ thisController.getZCoord() + offset.z());
+ ioPorts.add(port);
} else {
formationChecklist = false;
}
@@ -215,6 +230,14 @@ public class GTMTE_ItemServer extends GT_MetaTileEntity_MultiBlockBase {
if(formationChecklist) {
slicesFound = sliceCount;
+
+ if(mih == null) {
+ mih = new MultiItemHandler();
+ mih.setItemTypeCapacity(slicesFound * BASE_ITEM_TYPES_PER_SLICE);
+ }
+ for(TE_ItemServerIOPort port : ioPorts) {
+ port.setMultiItemHandler(mih);
+ }
}
return formationChecklist;
@@ -251,7 +274,12 @@ public class GTMTE_ItemServer extends GT_MetaTileEntity_MultiBlockBase {
if(thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == CASING) {
// yay
} else if (thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == IO_PORT) {
- // TODO register port
+ final TE_ItemServerIOPort port =
+ (TE_ItemServerIOPort) thisController.getWorld().getTileEntity(
+ thisController.getXCoord() + offset.x(),
+ thisController.getYCoord() + offset.y(),
+ thisController.getZCoord() + offset.z());
+ ioPorts.add(port);
} else {
formationChecklist = false;
}
@@ -298,7 +326,12 @@ public class GTMTE_ItemServer extends GT_MetaTileEntity_MultiBlockBase {
if(thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == CASING) {
// yay
} else if (thisController.getBlockOffset(offset.x(), offset.y(), offset.z()) == IO_PORT) {
- // TODO: register IO port
+ final TE_ItemServerIOPort port =
+ (TE_ItemServerIOPort) thisController.getWorld().getTileEntity(
+ thisController.getXCoord() + offset.x(),
+ thisController.getYCoord() + offset.y(),
+ thisController.getZCoord() + offset.z());
+ ioPorts.add(port);
} else {
formationChecklist = false;
}
diff --git a/src/main/java/tileentities/TE_ItemServerIOPort.java b/src/main/java/tileentities/TE_ItemServerIOPort.java
index 17e322fa82..46a3a9c7bb 100644
--- a/src/main/java/tileentities/TE_ItemServerIOPort.java
+++ b/src/main/java/tileentities/TE_ItemServerIOPort.java
@@ -11,41 +11,60 @@ public class TE_ItemServerIOPort extends TileEntity implements IInventory {
private MultiItemHandler mih;
public void setMultiItemHandler(MultiItemHandler mih) {
+ System.out.println("MIH set");
this.mih = mih;
}
@Override
public int getSizeInventory() {
- return mih.getItemTypeCapacity();
+ return (mih != null) ? mih.getItemTypeCapacity() : 9;
}
@Override
public ItemStack getStackInSlot(int slot) {
- // TODO Auto-generated method stub
- return null;
+ return (mih != null) ? mih.getStackInSlot(slot) : null;
}
@Override
public ItemStack decrStackSize(int slot, int amount) {
- // TODO Auto-generated method stub
+ if(mih != null) {
+ if(mih.getStackInSlot(slot) != null) {
+ final ItemStack obtained = mih.getStackInSlot(slot).copy();
+ obtained.stackSize = mih.reduceStackInSlot(slot, amount);
+ super.markDirty();
+ return obtained;
+ } else {
+ return null;
+ }
+ }
return null;
}
@Override
public ItemStack getStackInSlotOnClosing(int slot) {
- // TODO Auto-generated method stub
return null;
}
@Override
public void setInventorySlotContents(int slot, ItemStack itemStack) {
- // TODO Auto-generated method stub
-
+ if(mih != null) {
+ if(itemStack == null || !itemStack.isItemEqual(mih.getStackInSlot(slot))) {
+ return;
+ } else {
+ final int change = itemStack.stackSize - mih.getStackInSlot(slot).stackSize;
+ if(change < 0) {
+ mih.reduceStackInSlot(slot, change);
+ } else {
+ mih.increaseStackInSlot(slot, change);
+ }
+ super.markDirty();
+ }
+ }
}
@Override
public String getInventoryName() {
- return "Item Server";
+ return "Item Server IO Port";
}
@Override
@@ -55,30 +74,27 @@ public class TE_ItemServerIOPort extends TileEntity implements IInventory {
@Override
public int getInventoryStackLimit() {
- return mih.getPerTypeCapacity();
+ return (mih != null) ? mih.getPerTypeCapacity() : 0;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
- return true;
+ return false;
}
@Override
public void openInventory() {
- // TODO Auto-generated method stub
}
@Override
public void closeInventory() {
- // TODO Auto-generated method stub
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack itemStack) {
- // TODO Auto-generated method stub
- return false;
+ return (mih != null) ? (mih.getStackInSlot(slot).isItemEqual(itemStack) || mih.getStackInSlot(slot) == null) : false;
}
}