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.
*/
void updateStorageWithClient();
void sendStorageToClient();
/**
* 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.

View File

@@ -13,10 +13,8 @@ public interface IGroupedStorage {
/**
* Rebuilds the storages and items for a network. Typically called when a {@link IStorageProvider} is
* 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

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);
network.updateStorageWithClient((EntityPlayerMP) player);
network.sendStorageToClient((EntityPlayerMP) player);
drainEnergy(player, ItemWirelessGrid.USAGE_OPEN);

View File

@@ -18,12 +18,20 @@ import java.util.List;
public class GroupedStorage implements IGroupedStorage {
private List<IStorage> storages = new ArrayList<IStorage>();
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
private INetworkMaster network;
private boolean rebuilding;
public GroupedStorage(INetworkMaster network) {
this.network = network;
}
@Override
public void rebuild(INetworkMaster master) {
public void rebuild() {
rebuilding = true;
storages.clear();
for (INetworkSlave slave : master.getSlaves()) {
for (INetworkSlave slave : network.getSlaves()) {
if (slave.canUpdate() && slave instanceof IStorageProvider) {
((IStorageProvider) slave).addStorages(storages);
}
@@ -36,6 +44,8 @@ public class GroupedStorage implements IGroupedStorage {
add(stack);
}
}
rebuilding = false;
}
@Override
@@ -54,6 +64,10 @@ public class GroupedStorage implements IGroupedStorage {
}
stacks.put(stack.getItem(), stack.copy());
if (!rebuilding) {
network.sendStorageDelta(stack, stack.stackSize);
}
}
@Override
@@ -66,6 +80,8 @@ public class GroupedStorage implements IGroupedStorage {
stacks.remove(otherStack.getItem(), otherStack);
}
network.sendStorageDelta(stack, -stack.stackSize);
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()) {
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;
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.ContainerGrid;
import refinedstorage.item.ItemPattern;
import refinedstorage.network.MessageGridDelta;
import refinedstorage.network.MessageGridItems;
import refinedstorage.tile.ISynchronizedContainer;
import refinedstorage.tile.TileBase;
@@ -58,7 +59,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
private GridHandler gridHandler = new GridHandler(this);
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
private IGroupedStorage storage = new GroupedStorage();
private IGroupedStorage storage = new GroupedStorage(this);
private boolean rebuildStorage;
private List<INetworkSlave> slaves = new ArrayList<INetworkSlave>();
@@ -132,11 +133,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
slavesToRemove.clear();
if (rebuildStorage) {
storage.rebuild(this);
storage.rebuild();
rebuildStorage = false;
updateStorageWithClient();
sendStorageToClient();
}
if (canRun()) {
@@ -413,19 +414,32 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
}
@Override
public void updateStorageWithClient() {
public void sendStorageToClient() {
for (EntityPlayer player : worldObj.playerEntities) {
if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) {
updateStorageWithClient((EntityPlayerMP) player);
if (isWatchingGrid(player)) {
sendStorageToClient((EntityPlayerMP) player);
}
}
}
@Override
public void updateStorageWithClient(EntityPlayerMP player) {
public void sendStorageToClient(EntityPlayerMP 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
public ItemStack push(ItemStack stack, int size, boolean simulate) {
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));
updateStorageWithClient();
}
return remainder;
@@ -494,8 +506,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (newStack != null) {
storage.remove(newStack);
updateStorageWithClient();
}
return newStack;

View File

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