Remove INetworkTile, the mod should be now much performant on servers. Packets are only sent when needed.

This commit is contained in:
Raoul Van den Berge
2016-05-14 13:23:15 +02:00
parent f50cadffb1
commit be8a7fdfd9
14 changed files with 313 additions and 153 deletions

View File

@@ -7,8 +7,11 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagIntArray;
import net.minecraft.nbt.NBTTagList;
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.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import refinedstorage.inventory.InventorySimple;
import refinedstorage.item.ItemUpgrade;
@@ -287,4 +290,14 @@ public class RefinedStorageUtils {
return 0;
}
}
public static void sendToAllAround(World world, BlockPos pos, IMessage message) {
NetworkRegistry.TargetPoint target = new NetworkRegistry.TargetPoint(world.provider.getDimensionType().getId(), pos.getX(), pos.getY(), pos.getZ(), 64);
RefinedStorage.NETWORK.sendToAllAround(message, target);
}
public static void reRenderBlock(World world, BlockPos pos) {
world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 1 | 2);
}
}

View File

@@ -0,0 +1,62 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
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.RefinedStorageUtils;
import refinedstorage.tile.TileController;
public class MessageControllerEnergyUpdate implements IMessage, IMessageHandler<MessageControllerEnergyUpdate, IMessage> {
private int x;
private int y;
private int z;
private int energy;
public MessageControllerEnergyUpdate() {
}
public MessageControllerEnergyUpdate(TileController controller) {
this.x = controller.getPos().getX();
this.y = controller.getPos().getY();
this.z = controller.getPos().getZ();
this.energy = controller.getEnergyStored(null);
}
@Override
public void fromBytes(ByteBuf buf) {
x = buf.readInt();
y = buf.readInt();
z = buf.readInt();
energy = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(x);
buf.writeInt(y);
buf.writeInt(z);
buf.writeInt(energy);
}
@Override
public IMessage onMessage(MessageControllerEnergyUpdate message, MessageContext ctx) {
BlockPos pos = new BlockPos(message.x, message.y, message.z);
World world = Minecraft.getMinecraft().theWorld;
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileController) {
((TileController) tile).setEnergyStored(message.energy);
RefinedStorageUtils.reRenderBlock(world, pos);
}
return null;
}
}

View File

@@ -0,0 +1,62 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
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.RefinedStorageUtils;
import refinedstorage.tile.TileDetector;
public class MessageDetectorPoweredUpdate implements IMessage, IMessageHandler<MessageDetectorPoweredUpdate, IMessage> {
private int x;
private int y;
private int z;
private boolean powered;
public MessageDetectorPoweredUpdate() {
}
public MessageDetectorPoweredUpdate(TileDetector detector) {
this.x = detector.getPos().getX();
this.y = detector.getPos().getY();
this.z = detector.getPos().getZ();
this.powered = detector.isPowered();
}
@Override
public void fromBytes(ByteBuf buf) {
x = buf.readInt();
y = buf.readInt();
z = buf.readInt();
powered = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(x);
buf.writeInt(y);
buf.writeInt(z);
buf.writeBoolean(powered);
}
@Override
public IMessage onMessage(MessageDetectorPoweredUpdate message, MessageContext ctx) {
BlockPos pos = new BlockPos(message.x, message.y, message.z);
World world = Minecraft.getMinecraft().theWorld;
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileDetector) {
((TileDetector) tile).setPowered(message.powered);
RefinedStorageUtils.reRenderBlock(world, pos);
}
return null;
}
}

View File

@@ -0,0 +1,62 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
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.RefinedStorageUtils;
import refinedstorage.tile.TileMachine;
public class MessageMachineConnectedUpdate implements IMessage, IMessageHandler<MessageMachineConnectedUpdate, IMessage> {
private int x;
private int y;
private int z;
private boolean connected;
public MessageMachineConnectedUpdate() {
}
public MessageMachineConnectedUpdate(TileMachine machine) {
this.x = machine.getPos().getX();
this.y = machine.getPos().getY();
this.z = machine.getPos().getZ();
this.connected = machine.isConnected();
}
@Override
public void fromBytes(ByteBuf buf) {
x = buf.readInt();
y = buf.readInt();
z = buf.readInt();
connected = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(x);
buf.writeInt(y);
buf.writeInt(z);
buf.writeBoolean(connected);
}
@Override
public IMessage onMessage(MessageMachineConnectedUpdate message, MessageContext ctx) {
BlockPos pos = new BlockPos(message.x, message.y, message.z);
World world = Minecraft.getMinecraft().theWorld;
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileMachine) {
((TileMachine) tile).setConnected(message.connected);
RefinedStorageUtils.reRenderBlock(world, pos);
}
return null;
}
}

View File

@@ -0,0 +1,62 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
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.RefinedStorageUtils;
import refinedstorage.tile.solderer.TileSolderer;
public class MessageSoldererWorkingUpdate implements IMessage, IMessageHandler<MessageSoldererWorkingUpdate, IMessage> {
private int x;
private int y;
private int z;
private boolean working;
public MessageSoldererWorkingUpdate() {
}
public MessageSoldererWorkingUpdate(TileSolderer solderer) {
this.x = solderer.getPos().getX();
this.y = solderer.getPos().getY();
this.z = solderer.getPos().getZ();
this.working = solderer.isWorking();
}
@Override
public void fromBytes(ByteBuf buf) {
x = buf.readInt();
y = buf.readInt();
z = buf.readInt();
working = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(x);
buf.writeInt(y);
buf.writeInt(z);
buf.writeBoolean(working);
}
@Override
public IMessage onMessage(MessageSoldererWorkingUpdate message, MessageContext ctx) {
BlockPos pos = new BlockPos(message.x, message.y, message.z);
World world = Minecraft.getMinecraft().theWorld;
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileSolderer) {
((TileSolderer) tile).setWorking(message.working);
RefinedStorageUtils.reRenderBlock(world, pos);
}
return null;
}
}

View File

@@ -7,7 +7,7 @@ import net.minecraft.util.math.BlockPos;
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.tile.INetworkTile;
import refinedstorage.tile.ISynchronizedContainer;
public class MessageTileContainerUpdate implements IMessage, IMessageHandler<MessageTileContainerUpdate, IMessage> {
private TileEntity tile;
@@ -31,8 +31,8 @@ public class MessageTileContainerUpdate implements IMessage, IMessageHandler<Mes
if (Minecraft.getMinecraft().theWorld != null) {
tile = Minecraft.getMinecraft().theWorld.getTileEntity(new BlockPos(x, y, z));
if (tile instanceof INetworkTile) {
((INetworkTile) tile).receiveContainerData(buf);
if (tile instanceof ISynchronizedContainer) {
((ISynchronizedContainer) tile).receiveContainerData(buf);
}
}
}
@@ -43,8 +43,8 @@ public class MessageTileContainerUpdate implements IMessage, IMessageHandler<Mes
buf.writeInt(tile.getPos().getY());
buf.writeInt(tile.getPos().getZ());
if (tile instanceof INetworkTile) {
((INetworkTile) tile).sendContainerData(buf);
if (tile instanceof ISynchronizedContainer) {
((ISynchronizedContainer) tile).sendContainerData(buf);
}
}

View File

@@ -1,55 +0,0 @@
package refinedstorage.network;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
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.tile.INetworkTile;
public class MessageTileUpdate implements IMessage, IMessageHandler<MessageTileUpdate, IMessage> {
private TileEntity tile;
private int x;
private int y;
private int z;
public MessageTileUpdate() {
}
public MessageTileUpdate(TileEntity tile) {
this.tile = tile;
}
@Override
public void fromBytes(ByteBuf buf) {
x = buf.readInt();
y = buf.readInt();
z = buf.readInt();
if (Minecraft.getMinecraft().theWorld != null) {
tile = Minecraft.getMinecraft().theWorld.getTileEntity(new BlockPos(x, y, z));
if (tile instanceof INetworkTile) {
((INetworkTile) tile).receiveData(buf);
}
}
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(tile.getPos().getX());
buf.writeInt(tile.getPos().getY());
buf.writeInt(tile.getPos().getZ());
if (tile instanceof INetworkTile) {
((INetworkTile) tile).sendData(buf);
}
}
@Override
public IMessage onMessage(MessageTileUpdate message, MessageContext ctx) {
return null;
}
}

View File

@@ -33,7 +33,6 @@ import static refinedstorage.RefinedStorage.ID;
public class CommonProxy {
public void preInit(FMLPreInitializationEvent e) {
RefinedStorage.NETWORK.registerMessage(MessageTileUpdate.class, MessageTileUpdate.class, 0, Side.CLIENT);
RefinedStorage.NETWORK.registerMessage(MessageTileContainerUpdate.class, MessageTileContainerUpdate.class, 15, Side.CLIENT);
RefinedStorage.NETWORK.registerMessage(MessageRedstoneModeUpdate.class, MessageRedstoneModeUpdate.class, 1, Side.SERVER);
RefinedStorage.NETWORK.registerMessage(MessageGridStoragePush.class, MessageGridStoragePush.class, 2, Side.SERVER);
@@ -56,6 +55,10 @@ public class CommonProxy {
RefinedStorage.NETWORK.registerMessage(MessageWirelessGridCraftingStart.class, MessageWirelessGridCraftingStart.class, 21, Side.SERVER);
RefinedStorage.NETWORK.registerMessage(MessageGridPatternCreate.class, MessageGridPatternCreate.class, 22, Side.SERVER);
RefinedStorage.NETWORK.registerMessage(MessageCraftingMonitorCancel.class, MessageCraftingMonitorCancel.class, 23, Side.SERVER);
RefinedStorage.NETWORK.registerMessage(MessageControllerEnergyUpdate.class, MessageControllerEnergyUpdate.class, 24, Side.CLIENT);
RefinedStorage.NETWORK.registerMessage(MessageSoldererWorkingUpdate.class, MessageSoldererWorkingUpdate.class, 25, Side.CLIENT);
RefinedStorage.NETWORK.registerMessage(MessageMachineConnectedUpdate.class, MessageMachineConnectedUpdate.class, 26, Side.CLIENT);
RefinedStorage.NETWORK.registerMessage(MessageDetectorPoweredUpdate.class, MessageDetectorPoweredUpdate.class, 27, Side.CLIENT);
NetworkRegistry.INSTANCE.registerGuiHandler(RefinedStorage.INSTANCE, new GuiHandler());

View File

@@ -3,11 +3,7 @@ package refinedstorage.tile;
import io.netty.buffer.ByteBuf;
import net.minecraft.inventory.Container;
public interface INetworkTile {
void receiveData(ByteBuf buf);
void sendData(ByteBuf buf);
public interface ISynchronizedContainer {
void receiveContainerData(ByteBuf buf);
void sendContainerData(ByteBuf buf);

View File

@@ -13,17 +13,13 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint;
import refinedstorage.RefinedStorage;
import refinedstorage.network.MessageTileContainerUpdate;
import refinedstorage.network.MessageTileUpdate;
public abstract class TileBase extends TileEntity implements ITickable {
public static final String NBT_DIRECTION = "Direction";
public static final String NBT_ENERGY = "Energy";
public static final int UPDATE_RANGE = 64;
private EnumFacing direction = EnumFacing.NORTH;
protected int ticks;
@@ -33,13 +29,9 @@ public abstract class TileBase extends TileEntity implements ITickable {
ticks++;
if (!worldObj.isRemote) {
if (this instanceof INetworkTile) {
TargetPoint target = new TargetPoint(worldObj.provider.getDimensionType().getId(), pos.getX(), pos.getY(), pos.getZ(), UPDATE_RANGE);
RefinedStorage.NETWORK.sendToAllAround(new MessageTileUpdate(this), target);
if (this instanceof ISynchronizedContainer) {
for (EntityPlayer player : worldObj.playerEntities) {
if (((INetworkTile) this).getContainer() == player.openContainer.getClass()) {
if (((ISynchronizedContainer) this).getContainer() == player.openContainer.getClass()) {
RefinedStorage.NETWORK.sendTo(new MessageTileContainerUpdate(this), (EntityPlayerMP) player);
}
}

View File

@@ -22,6 +22,7 @@ import refinedstorage.container.ContainerController;
import refinedstorage.item.ItemPattern;
import refinedstorage.item.ItemWirelessGrid;
import refinedstorage.network.GridPullFlags;
import refinedstorage.network.MessageControllerEnergyUpdate;
import refinedstorage.network.MessageWirelessGridItems;
import refinedstorage.storage.IStorage;
import refinedstorage.storage.IStorageProvider;
@@ -37,7 +38,7 @@ import refinedstorage.tile.grid.WirelessGridConsumer;
import java.util.*;
public class TileController extends TileBase implements IEnergyReceiver, INetworkTile, IRedstoneModeConfig {
public class TileController extends TileBase implements IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig {
public class ClientSideMachine {
public ItemStack stack;
public int energyUsage;
@@ -73,7 +74,7 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
private int wirelessGridRange;
private long lastEnergyRender;
private long lastEnergyUpdate;
public void addMachine(TileMachine machine) {
machinesToAdd.add(machine);
@@ -203,6 +204,12 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
if (lastEnergy != energy.getEnergyStored()) {
worldObj.updateComparatorOutputLevel(pos, RefinedStorageBlocks.CONTROLLER);
if (System.currentTimeMillis() - lastEnergyUpdate > 3000) {
RefinedStorageUtils.sendToAllAround(worldObj, pos, new MessageControllerEnergyUpdate(this));
lastEnergyUpdate = System.currentTimeMillis();
}
}
}
}
@@ -397,6 +404,10 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
return newStack;
}
public void setEnergyStored(int amount) {
energy.setEnergyStored(amount);
}
public boolean onOpenWirelessGrid(EntityPlayer player, EnumHand hand) {
boolean inRange = (int) Math.sqrt(Math.pow(getPos().getX() - player.posX, 2) + Math.pow(getPos().getY() - player.posY, 2) + Math.pow(getPos().getZ() - player.posZ, 2)) < getWirelessGridRange();
@@ -549,24 +560,6 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor
return clientSideMachines;
}
@Override
public void receiveData(ByteBuf buf) {
int lastEnergy = energy.getEnergyStored();
energy.setEnergyStored(buf.readInt());
if (lastEnergy != energy.getEnergyStored() && System.currentTimeMillis() - lastEnergyRender > 3000) {
lastEnergyRender = System.currentTimeMillis();
worldObj.notifyBlockUpdate(pos, worldObj.getBlockState(pos), worldObj.getBlockState(pos), 2 | 4);
}
}
@Override
public void sendData(ByteBuf buf) {
buf.writeInt(energy.getEnergyStored());
}
@Override
public void receiveContainerData(ByteBuf buf) {
energyUsage = buf.readInt();

View File

@@ -9,6 +9,7 @@ import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.container.ContainerDetector;
import refinedstorage.inventory.InventorySimple;
import refinedstorage.network.MessageDetectorPoweredUpdate;
import refinedstorage.storage.ItemGroup;
import refinedstorage.tile.config.ICompareConfig;
import refinedstorage.tile.config.RedstoneMode;
@@ -87,6 +88,8 @@ public class TileDetector extends TileMachine implements ICompareConfig {
if (powered != lastPowered) {
worldObj.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.DETECTOR);
RefinedStorageUtils.sendToAllAround(worldObj, pos, new MessageDetectorPoweredUpdate(this));
}
}
}
@@ -95,6 +98,10 @@ public class TileDetector extends TileMachine implements ICompareConfig {
return powered;
}
public void setPowered(boolean powered) {
this.powered = powered;
}
@Override
public int getCompare() {
return compare;
@@ -157,26 +164,6 @@ public class TileDetector extends TileMachine implements ICompareConfig {
RefinedStorageUtils.saveInventory(inventory, 0, nbt);
}
@Override
public void receiveData(ByteBuf buf) {
super.receiveData(buf);
boolean lastPowered = powered;
powered = buf.readBoolean();
if (powered != lastPowered) {
worldObj.notifyBlockUpdate(pos, worldObj.getBlockState(pos), worldObj.getBlockState(pos), 2 | 4);
}
}
@Override
public void sendData(ByteBuf buf) {
super.sendData(buf);
buf.writeBoolean(powered);
}
@Override
public void sendContainerData(ByteBuf buf) {
super.sendContainerData(buf);

View File

@@ -4,14 +4,16 @@ import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.block.BlockMachine;
import refinedstorage.network.MessageMachineConnectedUpdate;
import refinedstorage.tile.config.IRedstoneModeConfig;
import refinedstorage.tile.config.RedstoneMode;
import java.util.HashSet;
import java.util.Set;
public abstract class TileMachine extends TileBase implements INetworkTile, IRedstoneModeConfig {
public abstract class TileMachine extends TileBase implements ISynchronizedContainer, IRedstoneModeConfig {
protected boolean connected = false;
protected RedstoneMode redstoneMode = RedstoneMode.IGNORE;
protected TileController controller;
@@ -56,6 +58,8 @@ public abstract class TileMachine extends TileBase implements INetworkTile, IRed
if (worldObj.getBlockState(pos).getBlock() == block) {
worldObj.setBlockState(pos, worldObj.getBlockState(pos).withProperty(BlockMachine.CONNECTED, true));
RefinedStorageUtils.sendToAllAround(worldObj, pos, new MessageMachineConnectedUpdate(this));
}
worldObj.notifyNeighborsOfStateChange(pos, block);
@@ -83,6 +87,10 @@ public abstract class TileMachine extends TileBase implements INetworkTile, IRed
return connected;
}
public void setConnected(boolean connected) {
this.connected = connected;
}
@Override
public RedstoneMode getRedstoneMode() {
return redstoneMode;
@@ -100,22 +108,6 @@ public abstract class TileMachine extends TileBase implements INetworkTile, IRed
return pos;
}
@Override
public void receiveData(ByteBuf buf) {
boolean lastConnected = connected;
connected = buf.readBoolean();
if (lastConnected != connected) {
worldObj.notifyBlockUpdate(pos, worldObj.getBlockState(pos), worldObj.getBlockState(pos), 2 | 4);
}
}
@Override
public void sendData(ByteBuf buf) {
buf.writeBoolean(connected);
}
@Override
public void receiveContainerData(ByteBuf buf) {
redstoneMode = RedstoneMode.getById(buf.readInt());

View File

@@ -13,6 +13,7 @@ import refinedstorage.RefinedStorageUtils;
import refinedstorage.container.ContainerSolderer;
import refinedstorage.inventory.InventorySimple;
import refinedstorage.item.ItemUpgrade;
import refinedstorage.network.MessageSoldererWorkingUpdate;
import refinedstorage.tile.TileMachine;
public class TileSolderer extends TileMachine implements IInventory, ISidedInventory {
@@ -43,6 +44,8 @@ public class TileSolderer extends TileMachine implements IInventory, ISidedInven
public void updateMachine() {
ISoldererRecipe newRecipe = SoldererRegistry.getRecipe(inventory);
boolean lastWorking = working;
if (newRecipe == null) {
reset();
} else if (newRecipe != recipe) {
@@ -74,6 +77,10 @@ public class TileSolderer extends TileMachine implements IInventory, ISidedInven
reset();
}
}
if (working != lastWorking) {
RefinedStorageUtils.sendToAllAround(worldObj, pos, new MessageSoldererWorkingUpdate(this));
}
}
@Override
@@ -134,31 +141,15 @@ public class TileSolderer extends TileMachine implements IInventory, ISidedInven
buf.writeInt(recipe != null ? recipe.getDuration() : 0);
}
@Override
public void receiveData(ByteBuf buf) {
super.receiveData(buf);
boolean lastWorking = working;
working = buf.readBoolean();
if (working != lastWorking) {
worldObj.notifyBlockUpdate(pos, worldObj.getBlockState(pos), worldObj.getBlockState(pos), 2 | 4);
}
}
@Override
public void sendData(ByteBuf buf) {
super.sendData(buf);
buf.writeBoolean(working);
}
@Override
public Class<? extends Container> getContainer() {
return ContainerSolderer.class;
}
public void setWorking(boolean working) {
this.working = working;
}
public boolean isWorking() {
return working;
}