Send over deltas instead of resending the entire storage every time

This commit is contained in:
Raoul Van den Berge
2016-07-02 21:41:41 +02:00
parent 069793a39a
commit 51b157660c
8 changed files with 93 additions and 19 deletions

View File

@@ -46,7 +46,6 @@ public final class RefinedStorage {
public static RefinedStorage INSTANCE;
public List<ItemStack> items = new ArrayList<ItemStack>();
public long lastItemUpdate;
public int cableRfUsage;
public int constructorRfUsage;

View File

@@ -135,6 +135,14 @@ public interface INetworkMaster {
*/
void sendStorageToClient(EntityPlayerMP player);
/**
* Sends a storage change to the client.
*
* @param stack The stack
* @param delta The delta changed
*/
void sendStorageDeltaToClient(ItemStack stack, int delta);
/**
* Pushes an item to this network.
*

View File

@@ -60,7 +60,7 @@ public class GroupedStorage implements IGroupedStorage {
if (RefinedStorageUtils.compareStackNoQuantity(otherStack, stack)) {
otherStack.stackSize += stack.stackSize;
network.sendStorageToClient();
network.sendStorageDeltaToClient(stack, stack.stackSize);
return;
}
@@ -68,7 +68,7 @@ public class GroupedStorage implements IGroupedStorage {
stacks.put(stack.getItem(), stack.copy());
network.sendStorageToClient();
network.sendStorageDeltaToClient(stack, stack.stackSize);
}
@Override
@@ -83,7 +83,7 @@ public class GroupedStorage implements IGroupedStorage {
}
}
network.sendStorageToClient();
network.sendStorageDeltaToClient(stack, -stack.stackSize);
return;
}

View File

@@ -0,0 +1,59 @@
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;
public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDelta, IMessage> {
private ItemStack stack;
private int delta;
private boolean craftable;
public MessageGridDelta() {
}
public MessageGridDelta(ItemStack stack, int delta, boolean craftable) {
this.stack = stack;
this.delta = delta;
this.craftable = craftable;
}
@Override
public void fromBytes(ByteBuf buf) {
stack = ByteBufUtils.readItemStack(buf);
delta = buf.readInt();
craftable = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, 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) {
RefinedStorage.INSTANCE.items.remove(stack);
} else {
stack.stackSize += message.delta;
}
return null;
}
}
RefinedStorage.INSTANCE.items.add(ItemHandlerHelper.copyStackWithSize(message.stack, message.delta));
return null;
}
}

View File

@@ -12,14 +12,14 @@ import refinedstorage.api.network.INetworkMaster;
import java.util.ArrayList;
import java.util.List;
public class MessageGridItems implements IMessage, IMessageHandler<MessageGridItems, IMessage> {
public class MessageGridUpdate implements IMessage, IMessageHandler<MessageGridUpdate, IMessage> {
private INetworkMaster network;
private List<ItemStack> items = new ArrayList<ItemStack>();
public MessageGridItems() {
public MessageGridUpdate() {
}
public MessageGridItems(INetworkMaster network) {
public MessageGridUpdate(INetworkMaster network) {
this.network = network;
}
@@ -28,10 +28,8 @@ public class MessageGridItems implements IMessage, IMessageHandler<MessageGridIt
int items = buf.readInt();
for (int i = 0; i < items; ++i) {
int size = buf.readInt();
ItemStack stack = ByteBufUtils.readItemStack(buf);
stack.stackSize = size;
stack.stackSize = buf.readInt();
this.items.add(stack);
}
@@ -41,16 +39,15 @@ public class MessageGridItems implements IMessage, IMessageHandler<MessageGridIt
public void toBytes(ByteBuf buf) {
buf.writeInt(network.getStorage().getStacks().size());
for (ItemStack item : network.getStorage().getStacks()) {
buf.writeInt(item.stackSize);
ByteBufUtils.writeItemStack(buf, item);
for (ItemStack stack : network.getStorage().getStacks()) {
ByteBufUtils.writeItemStack(buf, stack);
buf.writeInt(stack.stackSize);
}
}
@Override
public IMessage onMessage(MessageGridItems message, MessageContext ctx) {
public IMessage onMessage(MessageGridUpdate message, MessageContext ctx) {
RefinedStorage.INSTANCE.items = message.items;
RefinedStorage.INSTANCE.lastItemUpdate = System.currentTimeMillis();
return null;
}

View File

@@ -55,7 +55,8 @@ public class CommonProxy {
RefinedStorage.NETWORK.registerMessage(MessageGridCraftingStart.class, MessageGridCraftingStart.class, id++, Side.SERVER);
RefinedStorage.NETWORK.registerMessage(MessageGridPatternCreate.class, MessageGridPatternCreate.class, id++, Side.SERVER);
RefinedStorage.NETWORK.registerMessage(MessageCraftingMonitorCancel.class, MessageCraftingMonitorCancel.class, id++, Side.SERVER);
RefinedStorage.NETWORK.registerMessage(MessageGridItems.class, MessageGridItems.class, id++, Side.CLIENT);
RefinedStorage.NETWORK.registerMessage(MessageGridUpdate.class, MessageGridUpdate.class, id++, Side.CLIENT);
RefinedStorage.NETWORK.registerMessage(MessageGridDelta.class, MessageGridDelta.class, id++, Side.CLIENT);
NetworkRegistry.INSTANCE.registerGuiHandler(RefinedStorage.INSTANCE, new GuiHandler());

View File

@@ -38,7 +38,8 @@ import refinedstorage.block.EnumControllerType;
import refinedstorage.container.ContainerController;
import refinedstorage.container.ContainerGrid;
import refinedstorage.item.ItemPattern;
import refinedstorage.network.MessageGridItems;
import refinedstorage.network.MessageGridDelta;
import refinedstorage.network.MessageGridUpdate;
import refinedstorage.tile.IConnectionHandler;
import refinedstorage.tile.ISynchronizedContainer;
import refinedstorage.tile.TileBase;
@@ -391,7 +392,16 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
@Override
public void sendStorageToClient(EntityPlayerMP player) {
RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player);
RefinedStorage.NETWORK.sendTo(new MessageGridUpdate(this), player);
}
@Override
public void sendStorageDeltaToClient(ItemStack stack, int delta) {
for (EntityPlayer player : worldObj.playerEntities) {
if (isWatchingGrid(player)) {
RefinedStorage.NETWORK.sendTo(new MessageGridDelta(stack, delta, RefinedStorageUtils.getPatternFromNetwork(this, stack) != null), (EntityPlayerMP) player);
}
}
}
private boolean isWatchingGrid(EntityPlayer player) {

View File

@@ -106,6 +106,6 @@ public class WirelessGrid implements IGrid {
@Override
public boolean isConnected() {
return System.currentTimeMillis() - RefinedStorage.INSTANCE.lastItemUpdate < 1000;
return true;
}
}