mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-07-12 06:52:57 +00:00

Packets will be discarded if the sending player is not currently interacting with the appropriate computer. This ensures players cannot control other people's computers. This is enforced by checking if the current container is a "computer container", and this container holds the correct computer.
236 lines
6.4 KiB
Java
236 lines
6.4 KiB
Java
/**
|
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
|
* Copyright Daniel Ratcliffe, 2011-2016. Do not distribute without permission.
|
|
* Send enquiries to dratcliffe@gmail.com
|
|
*/
|
|
|
|
package dan200.computercraft.shared.network;
|
|
|
|
import io.netty.buffer.ByteBuf;
|
|
import net.minecraft.nbt.CompressedStreamTools;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.network.PacketBuffer;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.UnsupportedEncodingException;
|
|
|
|
public class ComputerCraftPacket
|
|
{
|
|
// Packet types
|
|
// To server
|
|
public static final byte TurnOn = 1;
|
|
public static final byte Reboot = 2;
|
|
public static final byte Shutdown = 3;
|
|
public static final byte QueueEvent = 4;
|
|
public static final byte RequestComputerUpdate = 5;
|
|
public static final byte SetLabel = 6;
|
|
public static final byte RequestTileEntityUpdate = 9;
|
|
|
|
// To client
|
|
public static final byte ComputerChanged = 7;
|
|
public static final byte ComputerDeleted = 8;
|
|
|
|
// Packet class
|
|
public byte m_packetType;
|
|
public String[] m_dataString;
|
|
public int[] m_dataInt;
|
|
public byte[][] m_dataByte;
|
|
public NBTTagCompound m_dataNBT;
|
|
|
|
public ComputerCraftPacket()
|
|
{
|
|
m_packetType = 0;
|
|
m_dataString = null;
|
|
m_dataInt = null;
|
|
m_dataByte = null;
|
|
m_dataNBT = null;
|
|
}
|
|
|
|
public void toBytes( PacketBuffer buffer )
|
|
{
|
|
buffer.writeByte( m_packetType );
|
|
if( m_dataString != null )
|
|
{
|
|
buffer.writeByte( m_dataString.length );
|
|
}
|
|
else
|
|
{
|
|
buffer.writeByte( 0 );
|
|
}
|
|
if( m_dataInt != null )
|
|
{
|
|
buffer.writeByte( m_dataInt.length );
|
|
}
|
|
else
|
|
{
|
|
buffer.writeByte( 0 );
|
|
}
|
|
if( m_dataByte != null )
|
|
{
|
|
buffer.writeInt( m_dataByte.length );
|
|
}
|
|
else
|
|
{
|
|
buffer.writeInt( 0 );
|
|
}
|
|
if( m_dataString != null )
|
|
{
|
|
for( String s : m_dataString )
|
|
{
|
|
if( s != null )
|
|
{
|
|
try
|
|
{
|
|
byte[] b = s.getBytes( "UTF-8" );
|
|
buffer.writeBoolean( true );
|
|
buffer.writeInt( b.length );
|
|
buffer.writeBytes( b );
|
|
}
|
|
catch( UnsupportedEncodingException e )
|
|
{
|
|
buffer.writeBoolean( false );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
buffer.writeBoolean( false );
|
|
}
|
|
}
|
|
}
|
|
if( m_dataInt != null )
|
|
{
|
|
for( int i : m_dataInt )
|
|
{
|
|
buffer.writeInt( i );
|
|
}
|
|
}
|
|
if( m_dataByte != null )
|
|
{
|
|
for( byte[] bytes : m_dataByte )
|
|
{
|
|
if( bytes != null )
|
|
{
|
|
buffer.writeInt( bytes.length );
|
|
buffer.writeBytes( bytes );
|
|
}
|
|
else
|
|
{
|
|
buffer.writeInt( 0 );
|
|
}
|
|
}
|
|
}
|
|
if( m_dataNBT != null )
|
|
{
|
|
try
|
|
{
|
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|
CompressedStreamTools.writeCompressed( m_dataNBT, bos );
|
|
byte[] bytes = bos.toByteArray();
|
|
buffer.writeBoolean( true );
|
|
buffer.writeInt( bytes.length );
|
|
buffer.writeBytes( bytes );
|
|
}
|
|
catch( IOException e )
|
|
{
|
|
buffer.writeBoolean( false );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
buffer.writeBoolean( false );
|
|
}
|
|
}
|
|
|
|
public void fromBytes( ByteBuf buffer )
|
|
{
|
|
m_packetType = buffer.readByte();
|
|
byte nString = buffer.readByte();
|
|
byte nInt = buffer.readByte();
|
|
int nByte = buffer.readInt();
|
|
if( nString == 0 )
|
|
{
|
|
m_dataString = null;
|
|
}
|
|
else
|
|
{
|
|
m_dataString = new String[ nString ];
|
|
for( int k = 0; k < nString; k++ )
|
|
{
|
|
if( buffer.readBoolean() )
|
|
{
|
|
int len = buffer.readInt();
|
|
byte[] b = new byte[len];
|
|
buffer.readBytes( b );
|
|
try
|
|
{
|
|
m_dataString[ k ] = new String( b, "UTF-8" );
|
|
}
|
|
catch( UnsupportedEncodingException e )
|
|
{
|
|
m_dataString[ k ] = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if( nInt == 0 )
|
|
{
|
|
m_dataInt = null;
|
|
}
|
|
else
|
|
{
|
|
m_dataInt = new int[ nInt ];
|
|
for( int k = 0; k < nInt; k++ )
|
|
{
|
|
m_dataInt[ k ] = buffer.readInt();
|
|
}
|
|
}
|
|
if( nByte == 0 )
|
|
{
|
|
m_dataByte = null;
|
|
}
|
|
else
|
|
{
|
|
m_dataByte = new byte[ nByte ][];
|
|
for( int k = 0; k < nByte; k++ )
|
|
{
|
|
int length = buffer.readInt();
|
|
if( length > 0 )
|
|
{
|
|
m_dataByte[ k ] = new byte[ length ];
|
|
buffer.getBytes( buffer.readerIndex(), m_dataByte[ k ] );
|
|
}
|
|
}
|
|
}
|
|
boolean bNBT = buffer.readBoolean();
|
|
if( !bNBT )
|
|
{
|
|
m_dataNBT = null;
|
|
}
|
|
else
|
|
{
|
|
int byteLength = buffer.readInt();
|
|
byte[] bytes = new byte[ byteLength ];
|
|
buffer.getBytes( buffer.readerIndex(), bytes );
|
|
try
|
|
{
|
|
ByteArrayInputStream bis = new ByteArrayInputStream( bytes );
|
|
m_dataNBT = CompressedStreamTools.readCompressed( bis );
|
|
}
|
|
catch( IOException e )
|
|
{
|
|
m_dataNBT = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determine whether this packet requires the player to be interacting with the
|
|
* target.
|
|
*/
|
|
public boolean requiresContainer() {
|
|
return m_packetType != RequestComputerUpdate && m_packetType != RequestTileEntityUpdate;
|
|
}
|
|
}
|