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:
parent
19e4c03d3a
commit
53f16782ab
@ -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 ) )
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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" );
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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() );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user