1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-03-23 20:06:58 +00:00

Only send terminal state to interacting players

This splits the computer state (blinking, label, etc...) and terminal
state into two separate packets. When a computer changes, the computer
state is sent to all players and the terminal state is sent to players
who are curerntly using the computer.

This reduces network usage by a substantial amount.
This commit is contained in:
SquidDev 2017-10-12 10:42:37 +01:00
parent 19e4c03d3a
commit 53f16782ab
6 changed files with 94 additions and 34 deletions

View File

@ -383,6 +383,7 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
switch( packet.m_packetType )
{
case ComputerCraftPacket.ComputerChanged:
case ComputerCraftPacket.ComputerTerminalChanged:
case ComputerCraftPacket.ComputerDeleted:
{
// Packet from Server to Client
@ -417,6 +418,7 @@ public class ComputerCraftProxyClient extends ComputerCraftProxyCommon
// Packets from Server to Client //
///////////////////////////////////
case ComputerCraftPacket.ComputerChanged:
case ComputerCraftPacket.ComputerTerminalChanged:
{
int instanceID = packet.m_dataInt[ 0 ];
if( !ComputerCraft.clientComputerRegistry.contains( instanceID ) )

View File

@ -153,11 +153,8 @@ public class ClientComputer extends ClientTerminal
ComputerCraft.sendToServer( packet );
}
@Override
public void readDescription( NBTTagCompound nbttagcompound )
private void readComputerDescription( NBTTagCompound nbttagcompound )
{
super.readDescription( nbttagcompound );
int oldID = m_computerID;
String oldLabel = m_label;
boolean oldOn = m_on;
@ -189,10 +186,11 @@ public class ClientComputer extends ClientTerminal
switch( packet.m_packetType )
{
case ComputerCraftPacket.ComputerChanged:
{
readComputerDescription( packet.m_dataNBT );
break;
case ComputerCraftPacket.ComputerTerminalChanged:
readDescription( packet.m_dataNBT );
break;
}
}
}
}

View File

@ -20,10 +20,13 @@ import dan200.computercraft.shared.network.ComputerCraftPacket;
import dan200.computercraft.shared.network.INetworkedThing;
import dan200.computercraft.shared.util.NBTUtil;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Loader;
import java.io.InputStream;
@ -131,27 +134,62 @@ public class ServerComputer extends ServerTerminal
{
m_changed = true;
}
public void broadcastState()
{
// Send state to client
private ComputerCraftPacket createComputerPacket() {
ComputerCraftPacket packet = new ComputerCraftPacket();
packet.m_packetType = ComputerCraftPacket.ComputerChanged;
packet.m_dataInt = new int[] { getInstanceID() };
packet.m_dataNBT = new NBTTagCompound();
writeDescription( packet.m_dataNBT );
ComputerCraft.sendToAllPlayers( packet );
writeComputerDescription( packet.m_dataNBT );
return packet;
}
public void sendState( EntityPlayer player )
{
// Send state to client
private ComputerCraftPacket createTerminalPacket() {
ComputerCraftPacket packet = new ComputerCraftPacket();
packet.m_packetType = ComputerCraftPacket.ComputerChanged;
packet.m_packetType = ComputerCraftPacket.ComputerTerminalChanged;
packet.m_dataInt = new int[] { getInstanceID() };
packet.m_dataNBT = new NBTTagCompound();
writeDescription( packet.m_dataNBT );
ComputerCraft.sendToPlayer( player, packet );
return packet;
}
public void broadcastState(boolean force)
{
if(hasOutputChanged() || force)
{
// Send computer state to all clients
ComputerCraft.sendToAllPlayers( createComputerPacket() );
}
if( hasTerminalChanged() || force )
{
// Send terminal state to clients who are currently interacting with the computer.
FMLCommonHandler handler = FMLCommonHandler.instance();
if( handler != null )
{
ComputerCraftPacket packet = createTerminalPacket();
MinecraftServer server = handler.getMinecraftServerInstance();
for( EntityPlayerMP player : server.getPlayerList().getPlayers() )
{
if( isInteracting( player ) )
{
ComputerCraft.sendToPlayer( player, packet );
}
}
}
}
}
public void sendComputerState( EntityPlayer player )
{
// Send state to client
ComputerCraft.sendToPlayer( player, createComputerPacket() );
}
public void sendTerminalState( EntityPlayer player )
{
// Send terminal state to client
ComputerCraft.sendToPlayer( player, createTerminalPacket() );
}
public void broadcastDelete()
@ -336,12 +374,8 @@ public class ServerComputer extends ServerTerminal
}
// Networking stuff
@Override
public void writeDescription( NBTTagCompound nbttagcompound )
public void writeComputerDescription( NBTTagCompound nbttagcompound )
{
super.writeDescription( nbttagcompound );
nbttagcompound.setInteger( "id", m_computer.getID() );
String label = m_computer.getLabel();
if( label != null )
@ -362,14 +396,9 @@ public class ServerComputer extends ServerTerminal
public void handlePacket( ComputerCraftPacket packet, EntityPlayer sender )
{
// Allow Computer/Tile updates as they may happen at any time.
if (packet.requiresContainer()) {
if (sender == null) return;
Container container = sender.openContainer;
if (!(container instanceof IContainerComputer)) return;
IComputer computer = ((IContainerComputer) container).getComputer();
if (computer != this) return;
if( packet.requiresContainer() && !isInteracting( sender ) )
{
return;
}
// Receive packets sent from the client to the server
@ -415,9 +444,20 @@ public class ServerComputer extends ServerTerminal
case ComputerCraftPacket.RequestComputerUpdate:
{
// A player asked for an update on the state of the terminal
sendState( sender );
sendComputerState( sender );
break;
}
}
}
private boolean isInteracting( EntityPlayer player )
{
if( player == null ) return false;
Container container = player.openContainer;
if( !(container instanceof IContainerComputer) ) return false;
IComputer computer = ((IContainerComputer) container).getComputer();
return computer == this;
}
}

View File

@ -33,7 +33,7 @@ public class ServerComputerRegistry extends ComputerRegistry<ServerComputer>
computer.update();
if( computer.hasTerminalChanged() || computer.hasOutputChanged() )
{
computer.broadcastState();
computer.broadcastState(false);
}
}
}
@ -44,7 +44,7 @@ public class ServerComputerRegistry extends ComputerRegistry<ServerComputer>
{
//System.out.println( "ADD SERVER COMPUTER " + instanceID );
super.add( instanceID, computer );
computer.broadcastState();
computer.broadcastState(true);
//System.out.println( getComputers().size() + " SERVER COMPUTERS" );
}

View File

@ -30,7 +30,8 @@ public class ComputerCraftPacket
// To client
public static final byte ComputerChanged = 7;
public static final byte ComputerDeleted = 8;
public static final byte ComputerTerminalChanged = 8;
public static final byte ComputerDeleted = 9;
// Packet class
public byte m_packetType;

View File

@ -18,6 +18,8 @@ import dan200.computercraft.shared.computer.blocks.BlockComputer;
import dan200.computercraft.shared.computer.blocks.TileCommandComputer;
import dan200.computercraft.shared.computer.blocks.TileComputer;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.core.IComputer;
import dan200.computercraft.shared.computer.core.IContainerComputer;
import dan200.computercraft.shared.computer.core.ServerComputer;
import dan200.computercraft.shared.computer.inventory.ContainerComputer;
import dan200.computercraft.shared.computer.items.ItemCommandComputer;
@ -58,6 +60,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Items;
import net.minecraft.inventory.Container;
import net.minecraft.item.Item;
import net.minecraft.item.ItemRecord;
import net.minecraft.item.ItemStack;
@ -70,6 +73,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.event.entity.player.PlayerContainerEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@ -646,5 +650,20 @@ public abstract class ComputerCraftProxyCommon implements IComputerCraftProxy
ComputerCraft.syncConfig();
}
}
@SubscribeEvent
public void onContainerOpen( PlayerContainerEvent.Open event )
{
// If we're opening a computer container then broadcast the terminal state
Container container = event.getContainer();
if( container instanceof IContainerComputer )
{
IComputer computer = ((IContainerComputer) container).getComputer();
if( computer instanceof ServerComputer )
{
((ServerComputer) computer).sendTerminalState( event.getEntityPlayer() );
}
}
}
}
}