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.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.proxy.CommonProxy;
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 constructorUsage;

View File

@@ -1,7 +1,9 @@
package refinedstorage;
import io.netty.buffer.ByteBuf;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagIntArray;
@@ -12,6 +14,7 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.InvWrapper;
@@ -21,6 +24,7 @@ import org.apache.commons.lang3.ArrayUtils;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.CompareFlags;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.item.ItemUpgrade;
import java.util.HashSet;
@@ -334,10 +338,6 @@ public final class RefinedStorageUtils {
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) {
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) {
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.
*
* @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 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.
@@ -38,10 +38,10 @@ public interface IGridHandler {
/**
* 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
*/
void onCraftingRequested(ItemStack stack, int quantity);
void onCraftingRequested(int id, int quantity);
/**
* 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);
/**
* 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
*/

View File

@@ -20,8 +20,8 @@ public class GridHandler implements IGridHandler {
}
@Override
public void onExtract(ItemStack stack, int flags, EntityPlayerMP player) {
ItemStack item = RefinedStorageUtils.getItem(network, stack);
public void onExtract(int id, int flags, EntityPlayerMP player) {
ItemStack item = network.getStorage().get(id);
if (item == null) {
return;
@@ -34,7 +34,7 @@ public class GridHandler implements IGridHandler {
ItemStack held = player.inventory.getItemStack();
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;
}
} 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
}
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 ((flags & GridExtractFlags.EXTRACT_SHIFT) == GridExtractFlags.EXTRACT_SHIFT) {
@@ -112,11 +112,17 @@ public class GridHandler implements IGridHandler {
}
@Override
public void onCraftingRequested(ItemStack stack, int quantity) {
public void onCraftingRequested(int id, int quantity) {
if (quantity <= 0 || quantity > MAX_CRAFTING_PER_REQUEST) {
return;
}
ItemStack stack = network.getStorage().get(id);
if (stack == null) {
return;
}
int quantityPerRequest = 0;
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;
}
@Override
public ItemStack get(int id) {
for (ItemStack stack : this.stacks.values()) {
if (RefinedStorageUtils.getItemStackHashCode(stack) == id) {
return stack;
}
}
return null;
}
@Override
public Collection<ItemStack> getStacks() {
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.GuiTextField;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.client.FMLClientHandler;
import org.lwjgl.input.Keyboard;
import refinedstorage.RefinedStorage;
import refinedstorage.apiimpl.network.GridHandler;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.container.ContainerCraftingSettings;
import refinedstorage.network.MessageGridCraftingStart;
@@ -19,13 +19,13 @@ public class GuiCraftingSettings extends GuiBase {
private GuiTextField amountField;
private GuiGrid gui;
private ItemStack stack;
private ClientStack stack;
private GuiButton startButton;
private GuiButton cancelButton;
private GuiButton[] incrementButtons = new GuiButton[6];
public GuiCraftingSettings(GuiGrid gui, EntityPlayer player, ItemStack stack) {
super(new ContainerCraftingSettings(player, stack), 172, 99);
public GuiCraftingSettings(GuiGrid gui, EntityPlayer player, ClientStack stack) {
super(new ContainerCraftingSettings(player, stack.getStack()), 172, 99);
this.gui = gui;
this.stack = stack;
@@ -124,7 +124,7 @@ public class GuiCraftingSettings extends GuiBase {
Integer quantity = Ints.tryParse(amountField.getText());
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();
}

View File

@@ -5,7 +5,6 @@ import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
@@ -14,6 +13,7 @@ import net.minecraftforge.fml.common.FMLCommonHandler;
import org.apache.commons.lang3.StringUtils;
import refinedstorage.RefinedStorage;
import refinedstorage.api.network.GridExtractFlags;
import refinedstorage.apiimpl.storage.ClientStack;
import refinedstorage.block.EnumGridType;
import refinedstorage.container.ContainerGrid;
import refinedstorage.gui.sidebutton.SideButtonGridSearchBoxMode;
@@ -33,11 +33,11 @@ import java.io.IOException;
import java.util.*;
public class GuiGrid extends GuiBase {
private Comparator<ItemStack> quantityComparator = new Comparator<ItemStack>() {
private Comparator<ClientStack> quantityComparator = new Comparator<ClientStack>() {
@Override
public int compare(ItemStack left, ItemStack right) {
int leftSize = left.stackSize;
int rightSize = right.stackSize;
public int compare(ClientStack left, ClientStack right) {
int leftSize = left.getStack().stackSize;
int rightSize = right.getStack().stackSize;
if (leftSize == rightSize) {
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
public int compare(ItemStack left, ItemStack right) {
public int compare(ClientStack left, ClientStack right) {
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) {
return right.getDisplayName().compareTo(left.getDisplayName());
return right.getStack().getDisplayName().compareTo(left.getStack().getDisplayName());
}
return 0;
@@ -69,7 +69,7 @@ public class GuiGrid extends GuiBase {
private GuiTextField searchField;
private ContainerGrid container;
private List<ItemStack> items = new ArrayList<ItemStack>();
private List<ClientStack> items = new ArrayList<ClientStack>();
private IGrid grid;
private int slotNumber;
@@ -124,10 +124,10 @@ public class GuiGrid extends GuiBase {
String query = searchField.getText().trim().toLowerCase();
if (!query.isEmpty()) {
Iterator<ItemStack> t = items.iterator();
Iterator<ClientStack> t = items.iterator();
while (t.hasNext()) {
ItemStack item = t.next();
ItemStack item = t.next().getStack();
if (query.startsWith("@")) {
String[] parts = query.split(" ");
@@ -266,9 +266,7 @@ public class GuiGrid extends GuiBase {
}
if (slot < items.size()) {
ItemStack stack = items.get(slot);
drawItem(x, y, stack, true, formatQuantity(stack.stackSize, slot));
drawItem(x, y, items.get(slot).getStack(), true, formatQuantity(items.get(slot).getStack().stackSize, slot));
}
if (inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isConnected()) {
@@ -296,11 +294,7 @@ public class GuiGrid extends GuiBase {
}
if (isOverSlotWithItem()) {
/**
* 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());
drawTooltip(mouseX, mouseY, items.get(slotNumber).getStack());
}
if (isOverClear(mouseX, mouseY)) {
@@ -362,7 +356,7 @@ public class GuiGrid extends GuiBase {
}
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)));
} else {
int flags = 0;
@@ -379,7 +373,7 @@ public class GuiGrid extends GuiBase {
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 net.minecraft.entity.player.EntityPlayerMP;
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 refinedstorage.api.network.IGridHandler;
import refinedstorage.container.ContainerGrid;
public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<MessageGridCraftingStart> implements IMessage {
private ItemStack stack;
private int id;
private int quantity;
public MessageGridCraftingStart() {
}
public MessageGridCraftingStart(ItemStack stack, int quantity) {
this.stack = stack;
public MessageGridCraftingStart(int id, int quantity) {
this.id = id;
this.quantity = quantity;
}
@Override
public void fromBytes(ByteBuf buf) {
stack = ByteBufUtils.readItemStack(buf);
id = buf.readInt();
quantity = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, stack);
buf.writeInt(id);
buf.writeInt(quantity);
}
@@ -41,7 +39,7 @@ public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<Messa
IGridHandler handler = ((ContainerGrid) container).getGrid().getGridHandler();
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 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.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.apiimpl.storage.ClientStack;
public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDelta, IMessage> {
private INetworkMaster network;
private ItemStack stack;
private int delta;
private boolean craftable;
private ClientStack clientStack;
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.delta = delta;
this.craftable = craftable;
}
@Override
public void fromBytes(ByteBuf buf) {
stack = ByteBufUtils.readItemStack(buf);
clientStack = RefinedStorageUtils.readClientStack(buf);
delta = buf.readInt();
craftable = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, stack);
RefinedStorageUtils.writeClientStack(buf, network, stack);
buf.writeInt(delta);
buf.writeBoolean(craftable);
}
@Override
public IMessage onMessage(MessageGridDelta message, MessageContext ctx) {
for (ItemStack stack : RefinedStorage.INSTANCE.items) {
if (RefinedStorageUtils.compareStackNoQuantity(stack, message.stack)) {
if (stack.stackSize + message.delta == 0 && !message.craftable) {
for (ClientStack stack : RefinedStorage.INSTANCE.items) {
if (stack.equals(message.clientStack)) {
if (stack.getStack().stackSize + message.delta == 0 && !message.clientStack.isCraftable()) {
RefinedStorage.INSTANCE.items.remove(stack);
} else {
stack.stackSize += message.delta;
stack.getStack().stackSize += message.delta;
}
return null;
}
}
RefinedStorage.INSTANCE.items.add(ItemHandlerHelper.copyStackWithSize(message.stack, message.delta));
RefinedStorage.INSTANCE.items.add(message.clientStack);
return null;
}

View File

@@ -3,33 +3,31 @@ package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP;
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 refinedstorage.api.network.IGridHandler;
import refinedstorage.container.ContainerGrid;
public class MessageGridPull extends MessageHandlerPlayerToServer<MessageGridPull> implements IMessage {
private ItemStack stack;
private int id;
private int flags;
public MessageGridPull() {
}
public MessageGridPull(ItemStack stack, int flags) {
this.stack = stack;
public MessageGridPull(int id, int flags) {
this.id = id;
this.flags = flags;
}
@Override
public void fromBytes(ByteBuf buf) {
stack = ByteBufUtils.readItemStack(buf);
id = buf.readInt();
flags = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, stack);
buf.writeInt(id);
buf.writeInt(flags);
}
@@ -41,7 +39,7 @@ public class MessageGridPull extends MessageHandlerPlayerToServer<MessageGridPul
IGridHandler handler = ((ContainerGrid) container).getGrid().getGridHandler();
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 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.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.apiimpl.storage.ClientStack;
import java.util.ArrayList;
import java.util.List;
public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridUpdate, IMessage> {
private INetworkMaster network;
private List<ItemStack> items = new ArrayList<ItemStack>();
private List<ClientStack> items = new ArrayList<ClientStack>();
public MessageGridUpdate() {
}
@@ -28,10 +29,7 @@ public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridU
int items = buf.readInt();
for (int i = 0; i < items; ++i) {
ItemStack stack = ByteBufUtils.readItemStack(buf);
stack.stackSize = buf.readInt();
this.items.add(stack);
this.items.add(RefinedStorageUtils.readClientStack(buf));
}
}
@@ -40,8 +38,7 @@ public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridU
buf.writeInt(network.getStorage().getStacks().size());
for (ItemStack stack : network.getStorage().getStacks()) {
ByteBufUtils.writeItemStack(buf, stack);
buf.writeInt(stack.stackSize);
RefinedStorageUtils.writeClientStack(buf, network, stack);
}
}

View File

@@ -31,6 +31,7 @@ import refinedstorage.api.network.IGridHandler;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.INetworkNode;
import refinedstorage.api.network.IWirelessGridHandler;
import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage;
import refinedstorage.apiimpl.autocrafting.BasicCraftingTask;
@@ -345,7 +346,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
int score = 0;
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;
}
@@ -474,7 +475,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
public void sendStorageDeltaToClient(ItemStack stack, int delta) {
for (EntityPlayer player : worldObj.playerEntities) {
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);
}
}
}