package com.flansmod.common.network;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import com.flansmod.client.gui.teams.GuiTeamSelect;
import com.flansmod.common.FlansMod;
import com.flansmod.common.teams.PlayerClass;
import com.flansmod.common.teams.Team;
import com.flansmod.common.teams.TeamsManager;
public class PacketTeamSelect extends PacketBase
{
public boolean selectionPacket = false;
public String selection;
public boolean classChoicesPacket = false;
public Team[] teams;
public PlayerClass[] playerClasses;
/** If true, then this packet simply updates the available choices, rather than forcing the player to choose */
public boolean info = false;
public PacketTeamSelect() {}
public PacketTeamSelect(Team[] t, boolean i)
{
selectionPacket = false;
classChoicesPacket = false;
teams = t;
info = i;
}
public PacketTeamSelect(Team[] t)
{
this(t, false);
}
public PacketTeamSelect(PlayerClass[] c)
{
selectionPacket = false;
classChoicesPacket = true;
playerClasses = c;
}
public PacketTeamSelect(String shortName, boolean classPacket)
{
selectionPacket = true;
classChoicesPacket = classPacket;
selection = shortName;
}
@Override
public void encodeInto(ChannelHandlerContext ctx, ByteBuf data)
{
data.writeBoolean(selectionPacket);
data.writeBoolean(classChoicesPacket);
data.writeBoolean(info);
//If it is a selection packet, then we need only send the selection
if(selectionPacket)
{
writeUTF(data, selection);
}
//Otherwise, we must send the full list of teams or classes on offer
else
{
if(classChoicesPacket)
{
data.writeByte(playerClasses.length);
for (PlayerClass playerClass : playerClasses) {
writeUTF(data, playerClass.shortName);
}
}
else
{
data.writeByte(teams.length);
for (Team team : teams) {
writeUTF(data, team == null ? "null" : team.shortName);
}
}
}
}
@Override
public void decodeInto(ChannelHandlerContext ctx, ByteBuf data)
{
selectionPacket = data.readBoolean();
classChoicesPacket = data.readBoolean();
info = data.readBoolean();
if(selectionPacket)
{
selection = readUTF(data);
}
else
{
if(classChoicesPacket)
{
byte numClasses = data.readByte();
playerClasses = new PlayerClass[numClasses];
for(int i = 0; i < numClasses; i++)
{
playerClasses[i] = PlayerClass.getClass(readUTF(data));
}
}
else
{
byte numTeams = data.readByte();
teams = new Team[numTeams];
for(int i = 0; i < numTeams; i++)
{
teams[i] = Team.getTeam(readUTF(data));
}
}
}
}
/** Handle player responses to team / class selection packets */
@Override
public void handleServerSide(EntityPlayerMP playerEntity)
{
if(!selectionPacket)
{
FlansMod.log("Class / Team listing packet received on server. Rejecting.");
return;
}
if(classChoicesPacket)
{
TeamsManager.getInstance().playerSelectedClass(playerEntity, selection);
}
else
{
TeamsManager.getInstance().playerSelectedTeam(playerEntity, selection);
}
}
/** Handle a request from the server to display a team / class selection window */
@Override
@SideOnly(Side.CLIENT)
public void handleClientSide(EntityPlayer clientPlayer)
{
if(selectionPacket)
{
FlansMod.log("Class / Team selection packet received on client. Rejecting.");
return;
}
if(classChoicesPacket)
{
Minecraft.getMinecraft().displayGuiScreen(new GuiTeamSelect(playerClasses));
}
else if(info)
{
GuiTeamSelect.teamChoices = teams;
}
else Minecraft.getMinecraft().displayGuiScreen(new GuiTeamSelect(teams));
}
}