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

@@ -2,6 +2,8 @@
### 1.0.3 ### 1.0.3
- Fixed item loading issue (raoulvdberge) - 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 ### 1.0.2
- Fixed processing patterns not handling item insertion sometimes (raoulvdberge) - Fixed processing patterns not handling item insertion sometimes (raoulvdberge)

View File

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