/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.util.network;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.FMLEventChannel;
import cpw.mods.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Arrays;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.network.RailcraftPacket.PacketType;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.NetHandlerPlayServer;
public class PacketHandler {
public static final PacketHandler INSTANCE = new PacketHandler();
private static final PacketType[] packetTypes = PacketType.values();
final FMLEventChannel channel;
private PacketHandler() {
channel = NetworkRegistry.INSTANCE.newEventDrivenChannel(RailcraftPacket.CHANNEL_NAME);
channel.register(this);
}
public static void init() {
// NOOP
}
@SubscribeEvent
public void onPacket(ServerCustomPacketEvent event) {
byte[] data = new byte[event.packet.payload().readableBytes()];
event.packet.payload().readBytes(data);
onPacketData(data, ((NetHandlerPlayServer) event.handler).playerEntity);
}
@SubscribeEvent
public void onPacket(ClientCustomPacketEvent event) {
byte[] data = new byte[event.packet.payload().readableBytes()];
event.packet.payload().readBytes(data);
// System.out.println("Packet Received!");
onPacketData(data, null);
}
public void onPacketData(byte[] bData, EntityPlayerMP player) {
DataInputStream data = new DataInputStream(new ByteArrayInputStream(bData));
try {
RailcraftPacket pkt;
byte packetID = data.readByte();
if (packetID < 0)
return;
// System.out.println("Packet Received: " + packetID);
PacketType type = packetTypes[packetID];
switch (type) {
case TILE_ENTITY:
pkt = new PacketTileEntity();
break;
case GUI_RETURN:
pkt = new PacketGuiReturn(player);
break;
case TILE_EXTRA_DATA:
pkt = new PacketTileExtraData();
break;
case TILE_REQUEST:
pkt = new PacketTileRequest(player);
break;
case GUI_INTEGER:
pkt = new PacketGuiInteger();
break;
case GUI_STRING:
pkt = new PacketGuiString();
break;
case GUI_WIDGET:
pkt = new PacketGuiWidget();
break;
case EFFECT:
pkt = new PacketEffect();
break;
case CONTROLLER_UPDATE:
case RECEIVER_UPDATE:
case SIGNAL_UPDATE:
pkt = new PacketPairUpdate(type);
break;
case CONTROLLER_REQUEST:
case RECEIVER_REQUEST:
case SIGNAL_REQUEST:
pkt = new PacketPairRequest(player, type);
break;
case ITEM_NBT:
pkt = new PacketCurrentItemNBT((EntityPlayer) player, ((EntityPlayer) player).getCurrentEquippedItem());
break;
case KEY_PRESS:
pkt = new PacketKeyPress(player);
break;
case GOLDEN_TICKET_GUI:
pkt = new PacketTicketGui();
break;
default:
return;
}
if (pkt != null)
pkt.readData(data);
} catch (IOException e) {
Game.logThrowable("Exception in PacketHandler.onPacketData: {0}", e, Arrays.toString(bData));
}
}
}