Files
CodeChickenCore/codechicken/lib/packet/MetaPacket.java
T

91 lines
2.5 KiB
Java
Raw Normal View History

2013-07-16 17:58:02 +10:00
package codechicken.lib.packet;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.lang.reflect.Field;
2013-07-16 17:58:02 +10:00
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import codechicken.lib.asm.ObfMapping;
2013-07-16 17:58:02 +10:00
import net.minecraft.network.packet.NetHandler;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.Packet250CustomPayload;
2013-07-16 17:58:02 +10:00
/**
* A class that facilitates sending of multiple packets one after the other.
* It first sends an empty 250 packet and then it's payloads.
*/
public class MetaPacket extends Packet250CustomPayload
2013-07-16 17:58:02 +10:00
{
static
{
try
{
String fieldName = new ObfMapping("net/minecraft/network/packet/Packet", "packetClassToIdMap", "Ljava/util/Map;").toRuntime().s_name;
Field field = Packet.class.getDeclaredField(fieldName);
field.setAccessible(true);
Map<Class<? extends Packet>, Integer> packetClassToIdMap = (Map<Class<? extends Packet>, Integer>) field.get(null);
packetClassToIdMap.put(MetaPacket.class, 250);
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
2013-07-16 17:58:02 +10:00
public ArrayList<Packet> packets = new ArrayList<Packet>();
public MetaPacket(Packet... packets)
{
super("", null);
2013-07-16 17:58:02 +10:00
for(Packet p : packets)
this.packets.add(p);
}
public MetaPacket(Collection<? extends Packet> packets)
{
this.packets.addAll(packets);
}
@Override
public void readPacketData(DataInput datain)
{
throw new IllegalStateException("Meta packets can't be read");
}
@Override
public void writePacketData(DataOutput dataout) {
//send a dummy 250
super.writePacketData(dataout);
for(Packet p : packets)//TODO: fix extends
try {
Packet.writePacket(p, dataout);
} catch (IOException e) {
e.printStackTrace();
}
//adjust sent size for Packet.writePacket
Packet.sentSize-=getPacketSize()-super.getPacketSize();
2013-07-16 17:58:02 +10:00
}
@Override
public void processPacket(NetHandler nethandler)
{
for(Packet p : packets)//Memory connection
p.processPacket(nethandler);
}
@Override
public int getPacketSize()
{
int size = 0;
for(Packet p : packets)
size+=p.getPacketSize()+1;
2013-07-16 17:58:02 +10:00
return size;
}
}