2013-07-16 17:58:02 +10:00
|
|
|
package codechicken.lib.packet;
|
|
|
|
|
|
|
|
|
|
import java.io.DataInput;
|
|
|
|
|
import java.io.DataOutput;
|
|
|
|
|
import java.io.IOException;
|
2013-08-08 19:16:06 +10:00
|
|
|
import java.lang.reflect.Field;
|
2013-07-16 17:58:02 +10:00
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collection;
|
2013-08-08 19:16:06 +10:00
|
|
|
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;
|
2013-08-08 19:16:06 +10:00
|
|
|
import net.minecraft.network.packet.Packet250CustomPayload;
|
2013-07-16 17:58:02 +10:00
|
|
|
|
2013-08-08 19:16:06 +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
|
|
|
{
|
2013-08-08 19:16:06 +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)
|
|
|
|
|
{
|
2013-08-08 19:16:06 +10:00
|
|
|
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
|
2013-12-21 23:01:53 +10:00
|
|
|
public void writePacketData(DataOutput dataout) {
|
2013-12-21 23:43:28 +10:00
|
|
|
try {//TODO: fix super IOException
|
|
|
|
|
//send a dummy 250
|
|
|
|
|
super.writePacketData(dataout);
|
2013-12-21 23:01:53 +10:00
|
|
|
|
2013-12-21 23:43:28 +10:00
|
|
|
for(Packet p : packets)
|
2013-12-21 23:01:53 +10:00
|
|
|
Packet.writePacket(p, dataout);
|
|
|
|
|
|
2013-12-21 23:43:28 +10:00
|
|
|
//adjust sent size for Packet.writePacket
|
|
|
|
|
Packet.sentSize-=getPacketSize()-super.getPacketSize();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
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)
|
2013-08-08 19:16:06 +10:00
|
|
|
size+=p.getPacketSize()+1;
|
2013-07-16 17:58:02 +10:00
|
|
|
return size;
|
|
|
|
|
}
|
|
|
|
|
}
|