Solderer improvements, fixes #345
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
### 1.0.3
|
||||
- Fixed item loading issue (raoulvdberge)
|
||||
- Solderer now accepts items from any side, allowing easier automation (raoulvdberge)
|
||||
- Solderer is now intelligent about items in slots, and will only accept an item if it is part of a recipe (raoulvdberge)
|
||||
|
||||
### 1.0.2
|
||||
- Fixed processing patterns not handling item insertion sometimes (raoulvdberge)
|
||||
|
||||
@@ -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)));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user