Solderer improvements, fixes #345

This commit is contained in:
Raoul Van den Berge
2016-09-16 02:27:29 +02:00
parent 63552d87f7
commit 1f489a63ee
5 changed files with 42 additions and 112 deletions

View File

@@ -21,7 +21,7 @@ public class ContainerSolderer extends ContainerBase {
y += 18;
}
addSlotToContainer(new SlotOutput(solderer.getItems(), 3, 127, 38));
addSlotToContainer(new SlotOutput(solderer.getResult(), 0, 127, 38));
for (int i = 0; i < 4; ++i) {
addSlotToContainer(new SlotItemHandler(solderer.getUpgrades(), i, 187, 6 + (i * 18)));

View File

@@ -1,50 +0,0 @@
package refinedstorage.inventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.INBTSerializable;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
public class ItemHandlerProxy implements IItemHandler, IItemHandlerModifiable, INBTSerializable<NBTTagCompound> {
private ItemHandlerBasic proxy;
public ItemHandlerProxy(ItemHandlerBasic proxy) {
this.proxy = proxy;
}
@Override
public NBTTagCompound serializeNBT() {
return proxy.serializeNBT();
}
@Override
public void deserializeNBT(NBTTagCompound nbt) {
proxy.deserializeNBT(nbt);
}
@Override
public void setStackInSlot(int slot, ItemStack stack) {
proxy.setStackInSlot(slot, stack);
}
@Override
public int getSlots() {
return proxy.getSlots();
}
@Override
public ItemStack getStackInSlot(int slot) {
return proxy.getStackInSlot(slot);
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
return proxy.insertItem(slot, stack, simulate);
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
return proxy.extractItem(slot, amount, simulate);
}
}

View File

@@ -1,41 +0,0 @@
package refinedstorage.inventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import refinedstorage.tile.TileSolderer;
public class ItemHandlerSolderer extends ItemHandlerProxy {
private TileSolderer solderer;
private EnumFacing side;
public ItemHandlerSolderer(TileSolderer solderer, EnumFacing side) {
super(solderer.getItems());
this.solderer = solderer;
this.side = side;
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (solderer.getDirection() == EnumFacing.DOWN || solderer.getDirection() == EnumFacing.UP) {
if (((side == EnumFacing.WEST || side == EnumFacing.SOUTH) && slot == 0) || ((side == EnumFacing.NORTH || side == EnumFacing.EAST) && slot == 2) || (side == EnumFacing.UP && slot == 1)) {
return super.insertItem(slot, stack, simulate);
}
} else {
if ((side == solderer.getDirection().rotateY() && slot == 0) || (side == solderer.getDirection().rotateYCCW() && slot == 2) || (side == EnumFacing.UP && slot == 1)) {
return super.insertItem(slot, stack, simulate);
}
}
return stack;
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (side == EnumFacing.DOWN && slot == 3) {
return super.extractItem(slot, amount, simulate);
}
return null;
}
}

View File

@@ -1,5 +1,6 @@
package refinedstorage.tile;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.util.EnumFacing;
@@ -13,12 +14,14 @@ import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.solderer.ISoldererRecipe;
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.inventory.ItemHandlerBasic;
import refinedstorage.inventory.ItemHandlerSolderer;
import refinedstorage.inventory.ItemHandlerUpgrade;
import refinedstorage.item.ItemUpgrade;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataParameter;
import java.util.HashSet;
import java.util.Set;
public class TileSolderer extends TileNode {
public static final TileDataParameter<Integer> DURATION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileSolderer>() {
@Override
@@ -37,9 +40,29 @@ public class TileSolderer extends TileNode {
private static final String NBT_WORKING = "Working";
private static final String NBT_PROGRESS = "Progress";
private ItemHandlerBasic items = new ItemHandlerBasic(4, this);
private ItemHandlerBasic items = new ItemHandlerBasic(3, this) {
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
Set<Integer> possibleSlots = new HashSet<>();
for (ISoldererRecipe recipe : RefinedStorageAPI.instance().getSoldererRegistry().getRecipes()) {
for (int i = 0; i < 3; ++i) {
if (CompareUtils.compareStackNoQuantity(recipe.getRow(i), stack)) {
possibleSlots.add(i);
}
}
}
return possibleSlots.contains(slot) ? super.insertItem(slot, stack, simulate) : stack;
}
};
private ItemHandlerBasic result = new ItemHandlerBasic(1, this) {
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
return stack;
}
};
private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED);
private ItemHandlerSolderer[] itemsFacade = new ItemHandlerSolderer[EnumFacing.values().length];
private ISoldererRecipe recipe;
@@ -60,7 +83,7 @@ public class TileSolderer extends TileNode {
public void updateNode() {
boolean wasWorking = working;
if (items.getStackInSlot(1) == null && items.getStackInSlot(2) == null && items.getStackInSlot(3) == null) {
if (items.getStackInSlot(1) == null && items.getStackInSlot(2) == null && result.getStackInSlot(0) == null) {
stop();
} else {
ISoldererRecipe newRecipe = RefinedStorageAPI.instance().getSoldererRegistry().getRecipe(items);
@@ -68,9 +91,9 @@ public class TileSolderer extends TileNode {
if (newRecipe == null) {
stop();
} else if (newRecipe != recipe) {
boolean sameItem = items.getStackInSlot(3) != null ? CompareUtils.compareStackNoQuantity(items.getStackInSlot(3), newRecipe.getResult()) : false;
boolean sameItem = result.getStackInSlot(0) != null ? CompareUtils.compareStackNoQuantity(result.getStackInSlot(0), newRecipe.getResult()) : false;
if (items.getStackInSlot(3) == null || (sameItem && ((items.getStackInSlot(3).stackSize + newRecipe.getResult().stackSize) <= items.getStackInSlot(3).getMaxStackSize()))) {
if (result.getStackInSlot(0) == null || (sameItem && ((result.getStackInSlot(0).stackSize + newRecipe.getResult().stackSize) <= result.getStackInSlot(0).getMaxStackSize()))) {
recipe = newRecipe;
progress = 0;
working = true;
@@ -81,10 +104,10 @@ public class TileSolderer extends TileNode {
progress += 1 + upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED);
if (progress >= recipe.getDuration()) {
if (items.getStackInSlot(3) != null) {
items.getStackInSlot(3).stackSize += recipe.getResult().stackSize;
if (result.getStackInSlot(0) != null) {
result.getStackInSlot(0).stackSize += recipe.getResult().stackSize;
} else {
items.setStackInSlot(3, recipe.getResult().copy());
result.setStackInSlot(0, recipe.getResult().copy());
}
for (int i = 0; i < 3; ++i) {
@@ -130,6 +153,7 @@ public class TileSolderer extends TileNode {
readItems(items, 0, tag);
readItems(upgrades, 1, tag);
readItems(result, 2, tag);
recipe = RefinedStorageAPI.instance().getSoldererRegistry().getRecipe(items);
@@ -148,6 +172,7 @@ public class TileSolderer extends TileNode {
writeItems(items, 0, tag);
writeItems(upgrades, 1, tag);
writeItems(result, 2, tag);
tag.setBoolean(NBT_WORKING, working);
tag.setInteger(NBT_PROGRESS, progress);
@@ -179,6 +204,10 @@ public class TileSolderer extends TileNode {
return items;
}
public ItemHandlerBasic getResult() {
return result;
}
public IItemHandler getUpgrades() {
return upgrades;
}
@@ -191,17 +220,7 @@ public class TileSolderer extends TileNode {
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
if (facing == null) {
return (T) items;
}
int i = facing.ordinal();
if (itemsFacade[i] == null) {
itemsFacade[i] = new ItemHandlerSolderer(this, facing);
}
return (T) itemsFacade[i];
return facing == EnumFacing.DOWN ? (T) result : (T) items;
}
return super.getCapability(capability, facing);