Send over deltas
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
67
src/main/java/refinedstorage/network/MessageGridDelta.java
Executable file
67
src/main/java/refinedstorage/network/MessageGridDelta.java
Executable 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;
|
||||
}
|
||||
}
|
||||
@@ -65,7 +65,7 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora
|
||||
}
|
||||
|
||||
if (isConnected()) {
|
||||
network.getStorage().rebuild(network);
|
||||
network.getStorage().rebuild();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user