package micdoodle8.mods.galacticraft.core.network;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import micdoodle8.mods.galacticraft.core.GalacticraftCore;
import micdoodle8.mods.galacticraft.core.dimension.SpaceRace;
import micdoodle8.mods.galacticraft.core.dimension.SpaceRaceManager;
import micdoodle8.mods.galacticraft.core.dimension.SpaceStationWorldData;
import micdoodle8.mods.galacticraft.core.dimension.WorldProviderSpaceStation;
import micdoodle8.mods.galacticraft.core.entities.player.GCPlayerStats;
import micdoodle8.mods.galacticraft.core.network.PacketSimple.EnumSimplePacket;
import micdoodle8.mods.galacticraft.core.util.*;
import micdoodle8.mods.galacticraft.core.world.ChunkLoadingCallback;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.EnumConnectionState;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.Packet;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ServerConnectionFromClientEvent;
import org.apache.logging.log4j.LogManager;
public class ConnectionEvents
{
private static boolean clientConnected = false;
static
{
EnumConnectionState.STATES_BY_CLASS.put(PacketSimple.class, EnumConnectionState.PLAY);
registerPacket(EnumPacketDirection.CLIENTBOUND, PacketSimple.class);
}
protected static EnumConnectionState registerPacket(EnumPacketDirection direction, Class<? extends Packet> packetClass)
{
BiMap<Integer, Class<? extends Packet>> bimap = (BiMap) EnumConnectionState.PLAY.directionMaps.get(direction);
if (bimap == null)
{
bimap = HashBiMap.<Integer, Class<? extends Packet>>create();
EnumConnectionState.PLAY.directionMaps.put(direction, bimap);
}
if (bimap.containsValue(packetClass))
{
String s = direction + " packet " + packetClass + " is already known to ID " + bimap.inverse().get(packetClass);
LogManager.getLogger().fatal(s);
throw new IllegalArgumentException(s);
}
else
{
bimap.put(Integer.valueOf(bimap.size()), packetClass);
return EnumConnectionState.PLAY;
}
}
@SubscribeEvent
public void onPlayerLogout(PlayerLoggedOutEvent event)
{
ChunkLoadingCallback.onPlayerLogout(event.player);
}
@SubscribeEvent
public void onPlayerLogin(PlayerLoggedInEvent event)
{
ChunkLoadingCallback.onPlayerLogin(event.player);
if (event.player instanceof EntityPlayerMP)
{
EntityPlayerMP thePlayer = (EntityPlayerMP) event.player;
GCPlayerStats stats = GCPlayerStats.get(thePlayer);
SpaceStationWorldData.checkAllStations(thePlayer, stats);
GalacticraftCore.packetPipeline.sendTo(new PacketSimple(EnumSimplePacket.C_UPDATE_SPACESTATION_CLIENT_ID, GCCoreUtil.getDimensionID(thePlayer.worldObj), new Object[] { WorldUtil.spaceStationDataToString(stats.getSpaceStationDimensionData()) }), thePlayer);
SpaceRace raceForPlayer = SpaceRaceManager.getSpaceRaceFromPlayer(thePlayer.getGameProfile().getName());
if (raceForPlayer != null)
{
SpaceRaceManager.sendSpaceRaceData(thePlayer, raceForPlayer);
}
}
if (event.player.worldObj.provider instanceof WorldProviderSpaceStation && event.player instanceof EntityPlayerMP)
{
((WorldProviderSpaceStation) event.player.worldObj.provider).getSpinManager().sendPackets((EntityPlayerMP) event.player);
}
}
@SubscribeEvent
public void onConnectionReceived(ServerConnectionFromClientEvent event)
{
if (ConfigManagerCore.enableDebug)
{
Integer[] idList = (Integer[]) WorldUtil.getPlanetList().get(0);
String ids = "";
for (int j = 0; j < idList.length; j++)
{
ids += idList[j].toString() + " ";
}
GCLog.info("Galacticraft server sending dimension IDs to connecting client: " + ids);
}
event.manager.sendPacket(ConnectionPacket.createDimPacket(WorldUtil.getPlanetListInts()));
event.manager.sendPacket(ConnectionPacket.createSSPacket(WorldUtil.getSpaceStationListInts()));
event.manager.sendPacket(ConnectionPacket.createConfigPacket(ConfigManagerCore.getServerConfigOverride()));
}
@SubscribeEvent
public void onConnectionOpened(ClientConnectedToServerEvent event)
{
if (!event.isLocal)
{
ConnectionEvents.clientConnected = true;
}
MapUtil.resetClient();
}
@SubscribeEvent
public void onConnectionClosed(ClientDisconnectionFromServerEvent event)
{
if (ConnectionEvents.clientConnected)
{
ConnectionEvents.clientConnected = false;
WorldUtil.unregisterPlanets();
WorldUtil.unregisterSpaceStations();
ConfigManagerCore.restoreClientConfigOverrideable();
}
}
}