package mods.eln; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent; import cpw.mods.fml.common.network.internal.FMLProxyPacket; import io.netty.channel.ChannelHandler.Sharable; import mods.eln.client.ClientKeyHandler; import mods.eln.client.ClientProxy; import mods.eln.misc.Coordonate; import mods.eln.misc.IConfigSharing; import mods.eln.misc.Utils; import mods.eln.node.INodeEntity; import mods.eln.node.NodeBase; import mods.eln.node.NodeManager; import mods.eln.server.PlayerManager; import mods.eln.sound.SoundClient; import mods.eln.sound.SoundCommand; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; import net.minecraft.tileentity.TileEntity; import java.io.*; @Sharable public class PacketHandler { public PacketHandler() { Eln.eventChannel.register(this); } @SubscribeEvent public void onServerPacket(ServerCustomPacketEvent event) { FMLProxyPacket packet = event.packet; DataInputStream stream = new DataInputStream(new ByteArrayInputStream(packet.payload().array())); NetworkManager manager = event.manager; EntityPlayer player = ((NetHandlerPlayServer) event.handler).playerEntity; // EntityPlayerMP packetRx(stream, manager, player); } public void packetRx(DataInputStream stream, NetworkManager manager, EntityPlayer player) { try { switch (stream.readByte()) { case Eln.packetPlayerKey: packetPlayerKey(stream, manager, player); break; case Eln.packetNodeSingleSerialized: packetNodeSingleSerialized(stream, manager, player); break; case Eln.packetPublishForNode: packetForNode(stream, manager, player); break; case Eln.packetForClientNode: packetForClientNode(stream, manager, player); break; case Eln.packetOpenLocalGui: packetOpenLocalGui(stream, manager, player); break; case Eln.packetPlaySound: packetPlaySound(stream, manager, player); break; case Eln.packetDestroyUuid: packetDestroyUuid(stream, manager, player); break; case Eln.packetClientToServerConnection: packetNewClient(manager, player); break; case Eln.packetServerToClientInfo: packetServerInfo(stream, manager, player); break; } } catch (IOException e) { e.printStackTrace(); } } private void packetNewClient(NetworkManager manager, EntityPlayer player) { ByteArrayOutputStream bos = new ByteArrayOutputStream(64); DataOutputStream stream = new DataOutputStream(bos); try { stream.writeByte(Eln.packetServerToClientInfo); for (IConfigSharing c : Eln.instance.configShared) { c.serializeConfig(stream); } } catch (IOException e) { e.printStackTrace(); } Utils.sendPacketToClient(bos, (EntityPlayerMP) player); } private void packetServerInfo(DataInputStream stream, NetworkManager manager, EntityPlayer player) { for (IConfigSharing c : Eln.instance.configShared) { try { c.deserialize(stream); } catch (IOException e) { e.printStackTrace(); } } } private void packetDestroyUuid(DataInputStream stream, NetworkManager manager, EntityPlayer player) { try { ClientProxy.uuidManager.kill(stream.readInt()); } catch (IOException e) { e.printStackTrace(); } } void packetPlaySound(DataInputStream stream, NetworkManager manager, EntityPlayer player) { try { if (stream.readByte() != player.dimension) return; SoundClient.play(SoundCommand.fromStream(stream, player.worldObj)); } catch (IOException e) { e.printStackTrace(); } } void packetOpenLocalGui(DataInputStream stream, NetworkManager manager, EntityPlayer player) { EntityPlayer clientPlayer = (EntityPlayer) player; try { clientPlayer.openGui(Eln.instance, stream.readInt(), clientPlayer.worldObj, stream.readInt(), stream.readInt(), stream.readInt()); } catch (IOException e) { e.printStackTrace(); } } void packetForNode(DataInputStream stream, NetworkManager manager, EntityPlayer player) { try { Coordonate coordonate = new Coordonate(stream.readInt(), stream.readInt(), stream.readInt(), stream.readByte()); NodeBase node = NodeManager.instance.getNodeFromCoordonate(coordonate); if (node != null && node.getNodeUuid().equals(stream.readUTF())) { node.networkUnserialize(stream, (EntityPlayerMP) player); } else { Utils.println("packetForNode node found"); } } catch (IOException e) { e.printStackTrace(); } } void packetForClientNode(DataInputStream stream, NetworkManager manager, EntityPlayer player) { EntityPlayer clientPlayer = (EntityPlayer) player; int x, y, z, dimention; try { x = stream.readInt(); y = stream.readInt(); z = stream.readInt(); dimention = stream.readByte(); if (clientPlayer.dimension == dimention) { TileEntity entity = clientPlayer.worldObj.getTileEntity(x, y, z); if (entity != null && entity instanceof INodeEntity) { INodeEntity node = (INodeEntity) entity; if (node.getNodeUuid().equals(stream.readUTF())) { node.serverPacketUnserialize(stream); if (0 != stream.available()) { Utils.println("0 != stream.available()"); } } else { Utils.println("Wrong node UUID warning"); int dataSkipLength = stream.readByte(); for (int idx = 0; idx < dataSkipLength; idx++) { stream.readByte(); } } } } else Utils.println("No node found for " + x + " " + y + " " + z); } catch (IOException e) { e.printStackTrace(); } } void packetNodeSingleSerialized(DataInputStream stream, NetworkManager manager, EntityPlayer player) { try { EntityPlayer clientPlayer = player; int x, y, z, dimention; x = stream.readInt(); y = stream.readInt(); z = stream.readInt(); dimention = stream.readByte(); if (clientPlayer.dimension == dimention) { TileEntity entity = clientPlayer.worldObj.getTileEntity(x, y, z); if (entity != null && entity instanceof INodeEntity) { INodeEntity node = (INodeEntity) entity; if (node.getNodeUuid().equals(stream.readUTF())) { node.serverPublishUnserialize(stream); if (0 != stream.available()) { Utils.println("0 != stream.available()"); } } else { Utils.println("Wrong node UUID warning"); int dataSkipLength = stream.readByte(); for (int idx = 0; idx < dataSkipLength; idx++) { stream.readByte(); } } } else Utils.println("No node found for " + x + " " + y + " " + z); } } catch (IOException e) { e.printStackTrace(); } } void packetPlayerKey(DataInputStream stream, NetworkManager manager, EntityPlayer player) { EntityPlayerMP playerMP = (EntityPlayerMP) player; byte id; try { id = stream.readByte(); boolean state = stream.readBoolean(); if (id == ClientKeyHandler.wrenchId) { PlayerManager.PlayerMetadata metadata = Eln.playerManager.get(playerMP); metadata.setInteractEnable(state); } } catch (IOException e) { e.printStackTrace(); } } }