Send over deltas

This commit is contained in:
Raoul Van den Berge
2016-06-29 16:21:34 +02:00
parent e4b4abd45d
commit 281f78dd9c
9 changed files with 121 additions and 22 deletions

View File

@@ -123,12 +123,20 @@ public interface INetworkMaster {
/** /**
* Sends to all clients in a grid a packet with all the items in this network. * Sends to all clients in a grid a packet with all the items in this network.
*/ */
void updateStorageWithClient(); void sendStorageToClient();
/** /**
* Sends a player a packet with all the items in this network. * Sends a player a packet with all the items in this network.
*/ */
void updateStorageWithClient(EntityPlayerMP player); void sendStorageToClient(EntityPlayerMP player);
/**
* Sends a specific delta to all grid watchers.
*
* @param stack The stack
* @param amount The amount changed
*/
void sendStorageDelta(ItemStack stack, int amount);
/** /**
* Pushes an item to this network. * Pushes an item to this network.

View File

@@ -13,10 +13,8 @@ public interface IGroupedStorage {
/** /**
* Rebuilds the storages and items for a network. Typically called when a {@link IStorageProvider} is * Rebuilds the storages and items for a network. Typically called when a {@link IStorageProvider} is
* added or removed from the network. * added or removed from the network.
*
* @param master The network
*/ */
void rebuild(INetworkMaster master); void rebuild();
/** /**
* @return A list of {@link IStorage} connected to this network * @return A list of {@link IStorage} connected to this network

View File

@@ -57,7 +57,7 @@ public class WirelessGridHandler implements IWirelessGridHandler {
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, player.worldObj, RefinedStorageUtils.getIdFromHand(hand), 0, 0); player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, player.worldObj, RefinedStorageUtils.getIdFromHand(hand), 0, 0);
network.updateStorageWithClient((EntityPlayerMP) player); network.sendStorageToClient((EntityPlayerMP) player);
drainEnergy(player, ItemWirelessGrid.USAGE_OPEN); drainEnergy(player, ItemWirelessGrid.USAGE_OPEN);

View File

@@ -18,12 +18,20 @@ import java.util.List;
public class GroupedStorage implements IGroupedStorage { public class GroupedStorage implements IGroupedStorage {
private List<IStorage> storages = new ArrayList<IStorage>(); private List<IStorage> storages = new ArrayList<IStorage>();
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create(); private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
private INetworkMaster network;
private boolean rebuilding;
public GroupedStorage(INetworkMaster network) {
this.network = network;
}
@Override @Override
public void rebuild(INetworkMaster master) { public void rebuild() {
rebuilding = true;
storages.clear(); storages.clear();
for (INetworkSlave slave : master.getSlaves()) { for (INetworkSlave slave : network.getSlaves()) {
if (slave.canUpdate() && slave instanceof IStorageProvider) { if (slave.canUpdate() && slave instanceof IStorageProvider) {
((IStorageProvider) slave).addStorages(storages); ((IStorageProvider) slave).addStorages(storages);
} }
@@ -36,6 +44,8 @@ public class GroupedStorage implements IGroupedStorage {
add(stack); add(stack);
} }
} }
rebuilding = false;
} }
@Override @Override
@@ -54,6 +64,10 @@ public class GroupedStorage implements IGroupedStorage {
} }
stacks.put(stack.getItem(), stack.copy()); stacks.put(stack.getItem(), stack.copy());
if (!rebuilding) {
network.sendStorageDelta(stack, stack.stackSize);
}
} }
@Override @Override
@@ -66,6 +80,8 @@ public class GroupedStorage implements IGroupedStorage {
stacks.remove(otherStack.getItem(), otherStack); stacks.remove(otherStack.getItem(), otherStack);
} }
network.sendStorageDelta(stack, -stack.stackSize);
return; return;
} }
} }

View File

@@ -0,0 +1,67 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
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.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.container.ContainerGrid;
import java.util.List;
public class MessageGridDelta implements IMessage, IMessageHandler<MessageGridDelta, IMessage> {
private ItemStack stack;
private int delta;
public MessageGridDelta() {
}
public MessageGridDelta(ItemStack stack, int delta) {
this.stack = stack;
this.delta = delta;
}
@Override
public void fromBytes(ByteBuf buf) {
this.stack = ByteBufUtils.readItemStack(buf);
this.delta = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeItemStack(buf, stack);
buf.writeInt(delta);
}
@Override
public IMessage onMessage(MessageGridDelta message, MessageContext ctx) {
Container container = Minecraft.getMinecraft().thePlayer.openContainer;
if (container instanceof ContainerGrid) {
List<ItemStack> items = ((ContainerGrid) container).getGrid().getItems();
for (ItemStack item : items) {
if (RefinedStorageUtils.compareStackNoQuantity(item, message.stack)) {
item.stackSize += message.delta;
if (item.stackSize <= 0) {
items.remove(item);
}
return null;
}
}
if (message.delta > 0) {
items.add(ItemHandlerHelper.copyStackWithSize(message.stack, message.delta));
}
}
return null;
}
}

View File

@@ -65,7 +65,7 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora
} }
if (isConnected()) { if (isConnected()) {
network.getStorage().rebuild(network); network.getStorage().rebuild();
} }
} }
} }

View File

@@ -171,7 +171,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
this.redstoneMode = mode; this.redstoneMode = mode;
if (this instanceof IStorageProvider && isConnected()) { if (this instanceof IStorageProvider && isConnected()) {
network.getStorage().rebuild(network); network.getStorage().rebuild();
} }
} }

View File

@@ -39,6 +39,7 @@ import refinedstorage.block.EnumControllerType;
import refinedstorage.container.ContainerController; import refinedstorage.container.ContainerController;
import refinedstorage.container.ContainerGrid; import refinedstorage.container.ContainerGrid;
import refinedstorage.item.ItemPattern; import refinedstorage.item.ItemPattern;
import refinedstorage.network.MessageGridDelta;
import refinedstorage.network.MessageGridItems; import refinedstorage.network.MessageGridItems;
import refinedstorage.tile.ISynchronizedContainer; import refinedstorage.tile.ISynchronizedContainer;
import refinedstorage.tile.TileBase; import refinedstorage.tile.TileBase;
@@ -58,7 +59,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
private GridHandler gridHandler = new GridHandler(this); private GridHandler gridHandler = new GridHandler(this);
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this); private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
private IGroupedStorage storage = new GroupedStorage(); private IGroupedStorage storage = new GroupedStorage(this);
private boolean rebuildStorage; private boolean rebuildStorage;
private List<INetworkSlave> slaves = new ArrayList<INetworkSlave>(); private List<INetworkSlave> slaves = new ArrayList<INetworkSlave>();
@@ -132,11 +133,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
slavesToRemove.clear(); slavesToRemove.clear();
if (rebuildStorage) { if (rebuildStorage) {
storage.rebuild(this); storage.rebuild();
rebuildStorage = false; rebuildStorage = false;
updateStorageWithClient(); sendStorageToClient();
} }
if (canRun()) { if (canRun()) {
@@ -413,19 +414,32 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
} }
@Override @Override
public void updateStorageWithClient() { public void sendStorageToClient() {
for (EntityPlayer player : worldObj.playerEntities) { for (EntityPlayer player : worldObj.playerEntities) {
if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) { if (isWatchingGrid(player)) {
updateStorageWithClient((EntityPlayerMP) player); sendStorageToClient((EntityPlayerMP) player);
} }
} }
} }
@Override @Override
public void updateStorageWithClient(EntityPlayerMP player) { public void sendStorageToClient(EntityPlayerMP player) {
RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player); RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player);
} }
@Override
public void sendStorageDelta(ItemStack stack, int amount) {
for (EntityPlayer player : worldObj.playerEntities) {
if (isWatchingGrid(player)) {
RefinedStorage.NETWORK.sendTo(new MessageGridDelta(stack, amount), (EntityPlayerMP) player);
}
}
}
private boolean isWatchingGrid(EntityPlayer player) {
return player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition());
}
@Override @Override
public ItemStack push(ItemStack stack, int size, boolean simulate) { public ItemStack push(ItemStack stack, int size, boolean simulate) {
if (stack == null || stack.getItem() == null || storage.getStorages().isEmpty()) { if (stack == null || stack.getItem() == null || storage.getStorages().isEmpty()) {
@@ -460,8 +474,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
} }
storage.add(ItemHandlerHelper.copyStackWithSize(stack, sizePushed)); storage.add(ItemHandlerHelper.copyStackWithSize(stack, sizePushed));
updateStorageWithClient();
} }
return remainder; return remainder;
@@ -494,8 +506,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (newStack != null) { if (newStack != null) {
storage.remove(newStack); storage.remove(newStack);
updateStorageWithClient();
} }
return newStack; return newStack;

View File

@@ -112,7 +112,7 @@ public class TileGrid extends TileSlave implements IGrid {
public void onGridOpened(EntityPlayer player) { public void onGridOpened(EntityPlayer player) {
if (isConnected()) { if (isConnected()) {
network.updateStorageWithClient((EntityPlayerMP) player); network.sendStorageToClient((EntityPlayerMP) player);
} }
} }