package micdoodle8.mods.galacticraft.core.network;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import micdoodle8.mods.galacticraft.core.network.PacketSimple.EnumSimplePacket;
import micdoodle8.mods.galacticraft.core.util.ConfigManagerCore;
import micdoodle8.mods.galacticraft.core.util.GCLog;
import micdoodle8.mods.galacticraft.core.util.WorldUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.NetHandlerPlayServer;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.network.FMLEventChannel;
import net.minecraftforge.fml.common.network.FMLNetworkEvent;
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class ConnectionPacket
{
public static final String CHANNEL = "galacticraft";
public static FMLEventChannel bus;
public void handle(ByteBuf payload, EntityPlayer player)
{
int packetId = payload.readByte();
List<Object> data = new ArrayList<Object>();
switch (packetId)
{
case 101:
int length = payload.readInt();
for (int i = 0; i < length; i++)
{
data.add(payload.readInt());
}
WorldUtil.decodePlanetsListClient(data);
break;
case 102:
int llength = payload.readInt();
for (int i = 0; i < llength; i++)
{
data.add(payload.readInt());
}
WorldUtil.decodeSpaceStationListClient(data);
break;
case 103:
try
{
data = NetworkUtil.decodeData(EnumSimplePacket.C_UPDATE_CONFIGS.getDecodeClasses(), payload);
ConfigManagerCore.saveClientConfigOverrideable();
ConfigManagerCore.setConfigOverride(data);
if (ConfigManagerCore.enableDebug)
{
GCLog.info("Server-set configs received OK on client.");
}
}
catch (Exception e)
{
System.err.println("[Galacticraft] Error handling connection packet - maybe the player's Galacticraft version does not match the server version?");
e.printStackTrace();
}
break;
default:
}
if (payload.readInt() != 3519)
{
GCLog.severe("Packet completion problem for connection packet " + packetId + " - maybe the player's Galacticraft version does not match the server version?");
}
}
public static FMLProxyPacket createDimPacket(Integer[] dims)
{
ArrayList<Integer> data = new ArrayList();
for (Integer dim : dims)
{
data.add(dim);
}
return createPacket((byte) 101, data);
}
public static FMLProxyPacket createSSPacket(Integer[] dims)
{
ArrayList<Integer> data = new ArrayList();
Collections.addAll(data, dims);
return createPacket((byte) 102, data);
}
public static FMLProxyPacket createPacket(byte packetId, Collection<Integer> data)
{
PacketBuffer payload = new PacketBuffer(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 createConfigPacket(List<Object> data)
{
PacketBuffer payload = new PacketBuffer(Unpooled.buffer());
payload.writeByte(103);
try
{
NetworkUtil.encodeData(payload, data);
}
catch (IOException e)
{
e.printStackTrace();
}
payload.writeInt(3519); //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 Galacticraft 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();
}
}
}