Send over ID's instead of stacks over the net, should fix #193

This commit is contained in:
Raoul Van den Berge
2016-07-18 23:37:56 +02:00
parent 486374f3f7
commit 8b72e4bd17
14 changed files with 147 additions and 82 deletions

View File

@@ -14,6 +14,7 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.proxy.CommonProxy; import refinedstorage.proxy.CommonProxy;
import java.util.ArrayList; import java.util.ArrayList;
@@ -44,7 +45,7 @@ public final class RefinedStorage {
} }
}; };
public List<ItemStack> items = new ArrayList<ItemStack>(); public List<ClientStack> items = new ArrayList<ClientStack>();
public int cableUsage; public int cableUsage;
public int constructorUsage; public int constructorUsage;

View File

@@ -1,7 +1,9 @@
package refinedstorage; package refinedstorage;
import io.netty.buffer.ByteBuf;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory; import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagIntArray; import net.minecraft.nbt.NBTTagIntArray;
@@ -12,6 +14,7 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.InvWrapper; import net.minecraftforge.items.wrapper.InvWrapper;
@@ -21,6 +24,7 @@ import org.apache.commons.lang3.ArrayUtils;
import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.CompareFlags; import refinedstorage.api.storage.CompareFlags;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.item.ItemUpgrade; import refinedstorage.item.ItemUpgrade;
import java.util.HashSet; import java.util.HashSet;
@@ -334,10 +338,6 @@ public final class RefinedStorageUtils {
return network.extractItem(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); return network.extractItem(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
} }
public static ItemStack getItem(INetworkMaster network, ItemStack stack) {
return network.getStorage().get(stack, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
}
public static ICraftingPattern getPattern(INetworkMaster network, ItemStack stack) { public static ICraftingPattern getPattern(INetworkMaster network, ItemStack stack) {
return network.getPattern(stack, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); return network.getPattern(stack, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
} }
@@ -345,4 +345,24 @@ public final class RefinedStorageUtils {
public static boolean hasPattern(INetworkMaster network, ItemStack stack) { public static boolean hasPattern(INetworkMaster network, ItemStack stack) {
return RefinedStorageUtils.getPattern(network, stack) != null; return RefinedStorageUtils.getPattern(network, stack) != null;
} }
public static void writeClientStack(ByteBuf buf, INetworkMaster network, ItemStack stack) {
buf.writeInt(Item.getIdFromItem(stack.getItem()));
buf.writeInt(stack.stackSize);
buf.writeInt(stack.getItemDamage());
ByteBufUtils.writeTag(buf, stack.getTagCompound());
buf.writeInt(getItemStackHashCode(stack));
buf.writeBoolean(RefinedStorageUtils.hasPattern(network, stack));
}
public static ClientStack readClientStack(ByteBuf buf) {
ItemStack stack = new ItemStack(Item.getItemById(buf.readInt()), buf.readInt(), buf.readInt());
stack.setTagCompound(ByteBufUtils.readTag(buf));
return new ClientStack(buf.readInt(), stack, buf.readBoolean());
}
public static int getItemStackHashCode(ItemStack stack) {
return stack.getItem().hashCode() * (stack.getItemDamage() + 1) * (stack.hasTagCompound() ? stack.getTagCompound().hashCode() : 1);
}
} }

View File

@@ -12,11 +12,11 @@ public interface IGridHandler {
/** /**
* Called when a player tries to extract an item from the grid. * Called when a player tries to extract an item from the grid.
* *
* @param stack The item we're trying to extract * @param id The ID of the item we're trying to extract
* @param flags How we are extracting, see {@link GridExtractFlags} * @param flags How we are extracting, see {@link GridExtractFlags}
* @param player The player that is attempting the extraction * @param player The player that is attempting the extraction
*/ */
void onExtract(ItemStack stack, int flags, EntityPlayerMP player); void onExtract(int id, int flags, EntityPlayerMP player);
/** /**
* Called when a player tries to insert an item to the grid. * Called when a player tries to insert an item to the grid.
@@ -38,10 +38,10 @@ public interface IGridHandler {
/** /**
* Called when a player requested crafting for an item. * Called when a player requested crafting for an item.
* *
* @param stack The item we're requesting crafting for * @param id The ID of the item we're requesting crafting for
* @param quantity The amount of that item that has to be crafted * @param quantity The amount of that item that has to be crafted
*/ */
void onCraftingRequested(ItemStack stack, int quantity); void onCraftingRequested(int id, int quantity);
/** /**
* Called when a player wants to cancel a crafting task. * Called when a player wants to cancel a crafting task.

View File

@@ -40,6 +40,13 @@ public interface IGroupedStorage {
*/ */
ItemStack get(ItemStack stack, int flags); ItemStack get(ItemStack stack, int flags);
/**
* Gets an item from the network by ID.
*
* @return The {@link ItemStack}, do NOT modify
*/
ItemStack get(int id);
/** /**
* @return All items in this storage network * @return All items in this storage network
*/ */

View File

@@ -20,8 +20,8 @@ public class GridHandler implements IGridHandler {
} }
@Override @Override
public void onExtract(ItemStack stack, int flags, EntityPlayerMP player) { public void onExtract(int id, int flags, EntityPlayerMP player) {
ItemStack item = RefinedStorageUtils.getItem(network, stack); ItemStack item = network.getStorage().get(id);
if (item == null) { if (item == null) {
return; return;
@@ -34,7 +34,7 @@ public class GridHandler implements IGridHandler {
ItemStack held = player.inventory.getItemStack(); ItemStack held = player.inventory.getItemStack();
if (single) { if (single) {
if (held != null && (!RefinedStorageUtils.compareStackNoQuantity(stack, held) || held.stackSize + 1 > held.getMaxStackSize())) { if (held != null && (!RefinedStorageUtils.compareStackNoQuantity(item, held) || held.stackSize + 1 > held.getMaxStackSize())) {
return; return;
} }
} else if (player.inventory.getItemStack() != null) { } else if (player.inventory.getItemStack() != null) {
@@ -55,9 +55,9 @@ public class GridHandler implements IGridHandler {
// NO OP, the quantity already set (64) is needed for shift // NO OP, the quantity already set (64) is needed for shift
} }
size = Math.min(size, stack.getItem().getItemStackLimit(stack)); size = Math.min(size, item.getItem().getItemStackLimit(item));
ItemStack took = RefinedStorageUtils.extractItem(network, stack, size); ItemStack took = RefinedStorageUtils.extractItem(network, item, size);
if (took != null) { if (took != null) {
if ((flags & GridExtractFlags.EXTRACT_SHIFT) == GridExtractFlags.EXTRACT_SHIFT) { if ((flags & GridExtractFlags.EXTRACT_SHIFT) == GridExtractFlags.EXTRACT_SHIFT) {
@@ -112,11 +112,17 @@ public class GridHandler implements IGridHandler {
} }
@Override @Override
public void onCraftingRequested(ItemStack stack, int quantity) { public void onCraftingRequested(int id, int quantity) {
if (quantity <= 0 || quantity > MAX_CRAFTING_PER_REQUEST) { if (quantity <= 0 || quantity > MAX_CRAFTING_PER_REQUEST) {
return; return;
} }
ItemStack stack = network.getStorage().get(id);
if (stack == null) {
return;
}
int quantityPerRequest = 0; int quantityPerRequest = 0;
ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, stack); ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, stack);

View File

@@ -0,0 +1,32 @@
package refinedstorage.apiimpl.storage;
import net.minecraft.item.ItemStack;
public class ClientStack {
private int id;
private ItemStack stack;
private boolean craftable;
public ClientStack(int id, ItemStack stack, boolean craftable) {
this.id = id;
this.stack = stack;
this.craftable = craftable;
}
public int getId() {
return id;
}
public ItemStack getStack() {
return stack;
}
public boolean isCraftable() {
return craftable;
}
@Override
public boolean equals(Object obj) {
return obj instanceof ClientStack && ((ClientStack) obj).getId() == id;
}
}

View File

@@ -105,6 +105,17 @@ public class GroupedStorage implements IGroupedStorage {
return null; return null;
} }
@Override
public ItemStack get(int id) {
for (ItemStack stack : this.stacks.values()) {
if (RefinedStorageUtils.getItemStackHashCode(stack) == id) {
return stack;
}
}
return null;
}
@Override @Override
public Collection<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
return stacks.values(); return stacks.values();

View File

@@ -4,11 +4,11 @@ import com.google.common.primitives.Ints;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.GuiTextField;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.FMLClientHandler;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.apiimpl.network.GridHandler; import refinedstorage.apiimpl.network.GridHandler;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.container.ContainerCraftingSettings; import refinedstorage.container.ContainerCraftingSettings;
import refinedstorage.network.MessageGridCraftingStart; import refinedstorage.network.MessageGridCraftingStart;
@@ -19,13 +19,13 @@ public class GuiCraftingSettings extends GuiBase {
private GuiTextField amountField; private GuiTextField amountField;
private GuiGrid gui; private GuiGrid gui;
private ItemStack stack; private ClientStack stack;
private GuiButton startButton; private GuiButton startButton;
private GuiButton cancelButton; private GuiButton cancelButton;
private GuiButton[] incrementButtons = new GuiButton[6]; private GuiButton[] incrementButtons = new GuiButton[6];
public GuiCraftingSettings(GuiGrid gui, EntityPlayer player, ItemStack stack) { public GuiCraftingSettings(GuiGrid gui, EntityPlayer player, ClientStack stack) {
super(new ContainerCraftingSettings(player, stack), 172, 99); super(new ContainerCraftingSettings(player, stack.getStack()), 172, 99);
this.gui = gui; this.gui = gui;
this.stack = stack; this.stack = stack;
@@ -124,7 +124,7 @@ public class GuiCraftingSettings extends GuiBase {
Integer quantity = Ints.tryParse(amountField.getText()); Integer quantity = Ints.tryParse(amountField.getText());
if (quantity != null && quantity > 0 && quantity <= GridHandler.MAX_CRAFTING_PER_REQUEST) { if (quantity != null && quantity > 0 && quantity <= GridHandler.MAX_CRAFTING_PER_REQUEST) {
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridCraftingStart(stack, quantity)); RefinedStorage.INSTANCE.network.sendToServer(new MessageGridCraftingStart(stack.getId(), quantity));
close(); close();
} }

View File

@@ -5,7 +5,6 @@ import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.SoundEvents; import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -14,6 +13,7 @@ import net.minecraftforge.fml.common.FMLCommonHandler;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.api.network.GridExtractFlags; import refinedstorage.api.network.GridExtractFlags;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.block.EnumGridType; import refinedstorage.block.EnumGridType;
import refinedstorage.container.ContainerGrid; import refinedstorage.container.ContainerGrid;
import refinedstorage.gui.sidebutton.SideButtonGridSearchBoxMode; import refinedstorage.gui.sidebutton.SideButtonGridSearchBoxMode;
@@ -33,11 +33,11 @@ import java.io.IOException;
import java.util.*; import java.util.*;
public class GuiGrid extends GuiBase { public class GuiGrid extends GuiBase {
private Comparator<ItemStack> quantityComparator = new Comparator<ItemStack>() { private Comparator<ClientStack> quantityComparator = new Comparator<ClientStack>() {
@Override @Override
public int compare(ItemStack left, ItemStack right) { public int compare(ClientStack left, ClientStack right) {
int leftSize = left.stackSize; int leftSize = left.getStack().stackSize;
int rightSize = right.stackSize; int rightSize = right.getStack().stackSize;
if (leftSize == rightSize) { if (leftSize == rightSize) {
return 0; return 0;
@@ -53,13 +53,13 @@ public class GuiGrid extends GuiBase {
} }
}; };
private Comparator<ItemStack> nameComparator = new Comparator<ItemStack>() { private Comparator<ClientStack> nameComparator = new Comparator<ClientStack>() {
@Override @Override
public int compare(ItemStack left, ItemStack right) { public int compare(ClientStack left, ClientStack right) {
if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_ASCENDING) { if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_ASCENDING) {
return left.getDisplayName().compareTo(right.getDisplayName()); return left.getStack().getDisplayName().compareTo(right.getStack().getDisplayName());
} else if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_DESCENDING) { } else if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_DESCENDING) {
return right.getDisplayName().compareTo(left.getDisplayName()); return right.getStack().getDisplayName().compareTo(left.getStack().getDisplayName());
} }
return 0; return 0;
@@ -69,7 +69,7 @@ public class GuiGrid extends GuiBase {
private GuiTextField searchField; private GuiTextField searchField;
private ContainerGrid container; private ContainerGrid container;
private List<ItemStack> items = new ArrayList<ItemStack>(); private List<ClientStack> items = new ArrayList<ClientStack>();
private IGrid grid; private IGrid grid;
private int slotNumber; private int slotNumber;
@@ -124,10 +124,10 @@ public class GuiGrid extends GuiBase {
String query = searchField.getText().trim().toLowerCase(); String query = searchField.getText().trim().toLowerCase();
if (!query.isEmpty()) { if (!query.isEmpty()) {
Iterator<ItemStack> t = items.iterator(); Iterator<ClientStack> t = items.iterator();
while (t.hasNext()) { while (t.hasNext()) {
ItemStack item = t.next(); ItemStack item = t.next().getStack();
if (query.startsWith("@")) { if (query.startsWith("@")) {
String[] parts = query.split(" "); String[] parts = query.split(" ");
@@ -266,9 +266,7 @@ public class GuiGrid extends GuiBase {
} }
if (slot < items.size()) { if (slot < items.size()) {
ItemStack stack = items.get(slot); drawItem(x, y, items.get(slot).getStack(), true, formatQuantity(items.get(slot).getStack().stackSize, slot));
drawItem(x, y, stack, true, formatQuantity(stack.stackSize, slot));
} }
if (inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isConnected()) { if (inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isConnected()) {
@@ -296,11 +294,7 @@ public class GuiGrid extends GuiBase {
} }
if (isOverSlotWithItem()) { if (isOverSlotWithItem()) {
/** drawTooltip(mouseX, mouseY, items.get(slotNumber).getStack());
* Some mods modify the NBT tag in {@link Item#addInformation(ItemStack, EntityPlayer, List, boolean)}
* and that would cause a client and server desync between the items and that makes pulling fail.
*/
drawTooltip(mouseX, mouseY, items.get(slotNumber).copy());
} }
if (isOverClear(mouseX, mouseY)) { if (isOverClear(mouseX, mouseY)) {
@@ -362,7 +356,7 @@ public class GuiGrid extends GuiBase {
} }
if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) { if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) {
if (items.get(slotNumber).stackSize == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown())) { if (items.get(slotNumber).isCraftable() && (items.get(slotNumber).getStack().stackSize == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) {
FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), items.get(slotNumber))); FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), items.get(slotNumber)));
} else { } else {
int flags = 0; int flags = 0;
@@ -379,7 +373,7 @@ public class GuiGrid extends GuiBase {
flags |= GridExtractFlags.EXTRACT_SINGLE; flags |= GridExtractFlags.EXTRACT_SINGLE;
} }
RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPull(items.get(slotNumber), flags)); RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPull(items.get(slotNumber).getId(), flags));
} }
} }
} }

View File

@@ -3,33 +3,31 @@ package refinedstorage.network;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container; import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.api.network.IGridHandler; import refinedstorage.api.network.IGridHandler;
import refinedstorage.container.ContainerGrid; import refinedstorage.container.ContainerGrid;
public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<MessageGridCraftingStart> implements IMessage { public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<MessageGridCraftingStart> implements IMessage {
private ItemStack stack; private int id;
private int quantity; private int quantity;
public MessageGridCraftingStart() { public MessageGridCraftingStart() {
} }
public MessageGridCraftingStart(ItemStack stack, int quantity) { public MessageGridCraftingStart(int id, int quantity) {
this.stack = stack; this.id = id;
this.quantity = quantity; this.quantity = quantity;
} }
@Override @Override
public void fromBytes(ByteBuf buf) { public void fromBytes(ByteBuf buf) {
stack = ByteBufUtils.readItemStack(buf); id = buf.readInt();
quantity = buf.readInt(); quantity = buf.readInt();
} }
@Override @Override
public void toBytes(ByteBuf buf) { public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, stack); buf.writeInt(id);
buf.writeInt(quantity); buf.writeInt(quantity);
} }
@@ -41,7 +39,7 @@ public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<Messa
IGridHandler handler = ((ContainerGrid) container).getGrid().getGridHandler(); IGridHandler handler = ((ContainerGrid) container).getGrid().getGridHandler();
if (handler != null) { if (handler != null) {
handler.onCraftingRequested(message.stack, message.quantity); handler.onCraftingRequested(message.id, message.quantity);
} }
} }
} }

View File

@@ -2,57 +2,57 @@ package refinedstorage.network;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils; import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.apiimpl.storage.ClientStack;
public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDelta, IMessage> { public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDelta, IMessage> {
private INetworkMaster network;
private ItemStack stack; private ItemStack stack;
private int delta; private int delta;
private boolean craftable;
private ClientStack clientStack;
public MessageGridDelta() { public MessageGridDelta() {
} }
public MessageGridDelta(ItemStack stack, int delta, boolean craftable) { public MessageGridDelta(INetworkMaster network, ItemStack stack, int delta) {
this.network = network;
this.stack = stack; this.stack = stack;
this.delta = delta; this.delta = delta;
this.craftable = craftable;
} }
@Override @Override
public void fromBytes(ByteBuf buf) { public void fromBytes(ByteBuf buf) {
stack = ByteBufUtils.readItemStack(buf); clientStack = RefinedStorageUtils.readClientStack(buf);
delta = buf.readInt(); delta = buf.readInt();
craftable = buf.readBoolean();
} }
@Override @Override
public void toBytes(ByteBuf buf) { public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, stack); RefinedStorageUtils.writeClientStack(buf, network, stack);
buf.writeInt(delta); buf.writeInt(delta);
buf.writeBoolean(craftable);
} }
@Override @Override
public IMessage onMessage(MessageGridDelta message, MessageContext ctx) { public IMessage onMessage(MessageGridDelta message, MessageContext ctx) {
for (ItemStack stack : RefinedStorage.INSTANCE.items) { for (ClientStack stack : RefinedStorage.INSTANCE.items) {
if (RefinedStorageUtils.compareStackNoQuantity(stack, message.stack)) { if (stack.equals(message.clientStack)) {
if (stack.stackSize + message.delta == 0 && !message.craftable) { if (stack.getStack().stackSize + message.delta == 0 && !message.clientStack.isCraftable()) {
RefinedStorage.INSTANCE.items.remove(stack); RefinedStorage.INSTANCE.items.remove(stack);
} else { } else {
stack.stackSize += message.delta; stack.getStack().stackSize += message.delta;
} }
return null; return null;
} }
} }
RefinedStorage.INSTANCE.items.add(ItemHandlerHelper.copyStackWithSize(message.stack, message.delta)); RefinedStorage.INSTANCE.items.add(message.clientStack);
return null; return null;
} }

View File

@@ -3,33 +3,31 @@ package refinedstorage.network;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container; import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.api.network.IGridHandler; import refinedstorage.api.network.IGridHandler;
import refinedstorage.container.ContainerGrid; import refinedstorage.container.ContainerGrid;
public class MessageGridPull extends MessageHandlerPlayerToServer<MessageGridPull> implements IMessage { public class MessageGridPull extends MessageHandlerPlayerToServer<MessageGridPull> implements IMessage {
private ItemStack stack; private int id;
private int flags; private int flags;
public MessageGridPull() { public MessageGridPull() {
} }
public MessageGridPull(ItemStack stack, int flags) { public MessageGridPull(int id, int flags) {
this.stack = stack; this.id = id;
this.flags = flags; this.flags = flags;
} }
@Override @Override
public void fromBytes(ByteBuf buf) { public void fromBytes(ByteBuf buf) {
stack = ByteBufUtils.readItemStack(buf); id = buf.readInt();
flags = buf.readInt(); flags = buf.readInt();
} }
@Override @Override
public void toBytes(ByteBuf buf) { public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, stack); buf.writeInt(id);
buf.writeInt(flags); buf.writeInt(flags);
} }
@@ -41,7 +39,7 @@ public class MessageGridPull extends MessageHandlerPlayerToServer<MessageGridPul
IGridHandler handler = ((ContainerGrid) container).getGrid().getGridHandler(); IGridHandler handler = ((ContainerGrid) container).getGrid().getGridHandler();
if (handler != null) { if (handler != null) {
handler.onExtract(message.stack, message.flags, player); handler.onExtract(message.id, message.flags, player);
} }
} }
} }

View File

@@ -2,19 +2,20 @@ package refinedstorage.network;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkMaster;
import refinedstorage.apiimpl.storage.ClientStack;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridUpdate, IMessage> { public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridUpdate, IMessage> {
private INetworkMaster network; private INetworkMaster network;
private List<ItemStack> items = new ArrayList<ItemStack>(); private List<ClientStack> items = new ArrayList<ClientStack>();
public MessageGridUpdate() { public MessageGridUpdate() {
} }
@@ -28,10 +29,7 @@ public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridU
int items = buf.readInt(); int items = buf.readInt();
for (int i = 0; i < items; ++i) { for (int i = 0; i < items; ++i) {
ItemStack stack = ByteBufUtils.readItemStack(buf); this.items.add(RefinedStorageUtils.readClientStack(buf));
stack.stackSize = buf.readInt();
this.items.add(stack);
} }
} }
@@ -40,8 +38,7 @@ public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridU
buf.writeInt(network.getStorage().getStacks().size()); buf.writeInt(network.getStorage().getStacks().size());
for (ItemStack stack : network.getStorage().getStacks()) { for (ItemStack stack : network.getStorage().getStacks()) {
ByteBufUtils.writeItemStack(buf, stack); RefinedStorageUtils.writeClientStack(buf, network, stack);
buf.writeInt(stack.stackSize);
} }
} }

View File

@@ -31,6 +31,7 @@ import refinedstorage.api.network.IGridHandler;
import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.INetworkNode; import refinedstorage.api.network.INetworkNode;
import refinedstorage.api.network.IWirelessGridHandler; import refinedstorage.api.network.IWirelessGridHandler;
import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IGroupedStorage; import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage; import refinedstorage.api.storage.IStorage;
import refinedstorage.apiimpl.autocrafting.BasicCraftingTask; import refinedstorage.apiimpl.autocrafting.BasicCraftingTask;
@@ -345,7 +346,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
int score = 0; int score = 0;
for (ItemStack input : patterns.get(i).getInputs()) { for (ItemStack input : patterns.get(i).getInputs()) {
ItemStack stored = RefinedStorageUtils.getItem(this, input); ItemStack stored = storage.get(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
score += stored != null ? stored.stackSize : 0; score += stored != null ? stored.stackSize : 0;
} }
@@ -474,7 +475,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
public void sendStorageDeltaToClient(ItemStack stack, int delta) { public void sendStorageDeltaToClient(ItemStack stack, int delta) {
for (EntityPlayer player : worldObj.playerEntities) { for (EntityPlayer player : worldObj.playerEntities) {
if (isWatchingGrid(player)) { if (isWatchingGrid(player)) {
RefinedStorage.INSTANCE.network.sendTo(new MessageGridDelta(stack, delta, RefinedStorageUtils.hasPattern(this, stack)), (EntityPlayerMP) player); RefinedStorage.INSTANCE.network.sendTo(new MessageGridDelta(this, stack, delta), (EntityPlayerMP) player);
} }
} }
} }