I can't figure out how GalactiCraft sends space station data to the clients when they connect.
It seems to be done in src/main/java/micdoodle8/mods/galacticraft/core/network/ConnectionPacket.java and ConnectionEvents.java, but I can't seem to replicate this.
My ConnectionEvents:
My ConnectionPacket:
Then that in my preInit:
and in my init:
mostly stolen from GC, but anyway.
What happens is this:
So it seems like I need to define/register the discriminator/packet ID somewhere, but where/how? GC doesn't seem to do it, or at least I couldn't find it anywhere? Or is it this part?
from the ConnectionEvents? But how does this even work? Field field_150761_f is private, how can you put anything into it? And what does 2515 mean?
It seems to be done in src/main/java/micdoodle8/mods/galacticraft/core/network/ConnectionPacket.java and ConnectionEvents.java, but I can't seem to replicate this.
My ConnectionEvents:
Code:
public class ConnectionEvents {
private static boolean clientConnected = false;
@SubscribeEvent
public void onPlayerLogout(PlayerLoggedOutEvent event) {
//ChunkLoadingCallback.onPlayerLogout(event.player);
}
@SubscribeEvent
public void onPlayerLogin(PlayerLoggedInEvent event) {
}
@SubscribeEvent
public void onConnectionReceived(ServerConnectionFromClientEvent event) {
NBTTagCompound nbt = new NBTTagCompound ();
ProceduralGalaxy.instance.getSolarSystemManager().writeToNBT(nbt);
event.manager.scheduleOutboundPacket(
ConnectionPacket.createUpdateSystemPacket(nbt)
);
}
@SubscribeEvent
public void onConnectionOpened(ClientConnectedToServerEvent event) {
if (!event.isLocal) {
ConnectionEvents.clientConnected = true;
}
}
@SubscribeEvent
public void onConnectionClosed(ClientDisconnectionFromServerEvent event) {
if (ConnectionEvents.clientConnected) {
ConnectionEvents.clientConnected = false;
}
}
}
My ConnectionPacket:
Code:
public class ConnectionPacket {
public static final String CHANNEL = "proceduralgalaxy";
public static FMLEventChannel bus;
// I have no idea whenever I have to be unique here or something...
public static final int PACKET_ID_UPDATE_DYN_SYSTEMS = 91;
public static final int PACKET_SIGNATURE = 5381;
public void handle(ByteBuf payload, EntityPlayer player) {
int packetId = payload.readByte();
List<Object> data = new ArrayList<Object>();
// no idea how this actually works...
Class<?>[] test = {NBTTagCompound.class};
switch (packetId) {
case PACKET_ID_UPDATE_DYN_SYSTEMS:
data = NetworkUtil.decodeData(test, payload);
break;
default:
}
if (payload.readInt() != PACKET_SIGNATURE) {
GCLog.severe("Packet completion problem for connection packet "
+ packetId
+ " - maybe the player's Galacticraft version does not match the server version?");
}
}
public static FMLProxyPacket createPacket(byte packetId,
Collection<Integer> data) {
ByteBuf payload = Unpooled.buffer();
payload.writeByte(packetId);
payload.writeInt(data.size());
for (Integer i : data) {
payload.writeInt(i.intValue());
}
payload.writeInt(3519); // signature
return new FMLProxyPacket(payload, CHANNEL);
}
public static FMLProxyPacket createUpdateSystemPacket(NBTTagCompound data) {
List<Object> data1 = new ArrayList<Object>();
data1.add(data);
// NBTTagCompound data
ByteBuf payload = Unpooled.buffer();
payload.writeByte(PACKET_ID_UPDATE_DYN_SYSTEMS);
try {
NetworkUtil.encodeData(payload, data1);
} catch (IOException e) {
e.printStackTrace();
}
payload.writeInt(PACKET_SIGNATURE); // signature
return new FMLProxyPacket(payload, CHANNEL);
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onPacketData(FMLNetworkEvent.ClientCustomPacketEvent event) {
FMLProxyPacket pkt = event.packet;
onFMLProxyPacketData(event.manager, pkt,
Minecraft.getMinecraft().thePlayer);
}
@SubscribeEvent
public void onPacketData(FMLNetworkEvent.ServerCustomPacketEvent event) {
FMLProxyPacket pkt = event.packet;
onFMLProxyPacketData(event.manager, pkt,
((NetHandlerPlayServer) event.handler).playerEntity);
}
public void onFMLProxyPacketData(NetworkManager manager,
FMLProxyPacket packet, EntityPlayer player) {
try {
if ((packet == null) || (packet.payload() == null))
throw new RuntimeException(
"Empty packet sent to channel"+CHANNEL);
ByteBuf data = packet.payload();
this.handle(data, player);
} catch (Exception e) {
GCLog.severe("GC login packet handler: Failed to read packet");
GCLog.severe(e.toString());
e.printStackTrace();
}
}
}
Code:
ConnectionPacket.bus = NetworkRegistry.INSTANCE.newEventDrivenChannel(ConnectionPacket.CHANNEL);
and in my init:
Code:
FMLCommonHandler.instance().bus().register(new ConnectionEvents());
What happens is this:
Code:
14:04:28] [Client thread/ERROR] [FML/]: FMLIndexedMessageCodec exception caught
io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 91 in channel proceduralgalaxy
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?]
<etc...>
Code:
static
{
EnumConnectionState.field_150761_f.put(PacketSimple.class, EnumConnectionState.PLAY);
EnumConnectionState.PLAY.field_150770_i.put(2515, PacketSimple.class);
}