package joshie.progression.player;
import joshie.progression.api.IPlayerTeam;
import joshie.progression.gui.editors.ITextEditable;
import joshie.progression.helpers.PlayerHelper;
import joshie.progression.network.PacketHandler;
import joshie.progression.network.PacketSyncTeam;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.*;
public class PlayerTeam implements ITextEditable, IPlayerTeam {
public enum TeamType {
SINGLE, TEAM;
}
private Set<UUID> invited = new HashSet();
private Set<UUID> members = new HashSet();
private TeamType type;
private UUID owner;
private boolean isActive = true;
private boolean multipleRewards = true;
private boolean isTrueTeam = true;
private String name;
private transient HashMap<UUID, EntityPlayer> teamCache = new HashMap();
public PlayerTeam() {}
public PlayerTeam(TeamType type, String name, UUID owner) {
this.owner = owner;
this.type = type;
if (this.name != null) {
this.name = name;
} else this.name = "Single Player";
}
public boolean isInvited(UUID uuid) {
return invited.contains(uuid);
}
public void addToInvited(UUID uuid) {
invited.add(uuid);
}
public TeamType getType() {
return type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public UUID getOwner() {
return owner;
}
//For quicker access
public void rebuildTeamCache() {
teamCache = new HashMap();
EntityPlayer owner = PlayerHelper.getPlayerFromUUID(false, getOwner());
if (owner != null) teamCache.put(getOwner(), owner);
for (UUID uuid: getMembers()) {
EntityPlayer member = PlayerHelper.getPlayerFromUUID(false, uuid);
if (member != null) teamCache.put(uuid, member);
}
}
private boolean hasIllegalUUIDInCache() {
for (UUID uuid: teamCache.keySet()) {
if (getOwner() == uuid || getMembers().contains(uuid)) continue;
return true;
}
return false;
}
@Override
public Collection<EntityPlayer> getTeamEntities() {
if (teamCache.isEmpty() || hasIllegalUUIDInCache()) {
rebuildTeamCache();
}
return teamCache.values();
}
@Override
public boolean isTrueTeam() {
return isTrueTeam;
}
@Override
public boolean isSingle() {
return type == TeamType.SINGLE;
}
public boolean giveMultipleRewards() {
return multipleRewards;
}
public void toggleMultiple() {
multipleRewards = !multipleRewards;
syncChanges(Side.CLIENT);
}
public void toggleIsTrueTeam() {
isTrueTeam = !isTrueTeam;
syncChanges(Side.CLIENT);
}
public boolean isOwner(EntityPlayer player) {
return PlayerHelper.getUUIDForPlayer(player).equals(getOwner());
}
public Set<UUID> getMembers() {
return members;
}
public Set<UUID> getEveryone() {
Set<UUID> everyone = new LinkedHashSet();
everyone.add(getOwner());
if (giveMultipleRewards()) {
everyone.addAll(getMembers());
}
return everyone;
}
@SideOnly(Side.CLIENT)
@Override
public String getTextField() {
return this.name;
}
@SideOnly(Side.CLIENT)
@Override
public void setTextField(String arg0) {
boolean sync = false;
if (!this.name.equals(arg0)) sync = true;
this.name = arg0;
if (sync) syncChanges(Side.CLIENT);
}
public void addMember(UUID uuid) {
members.add(uuid);
}
//Returns false if this team no longer exists
public boolean removeMember(UUID uuid) {
if (uuid == getOwner() && members.size() == 0) {
return false;
} else if (uuid == getOwner()) { //If the owner leaves, then the next level member becomes the owner
for (UUID member: members) {
owner = member;
break;
}
//Remove the new leader from members
members.remove(owner);
} else members.remove(uuid);
//Otherwise, Remove
return true;
}
/** Whether or not this data is used by anyone **/
public boolean isActive() {
return isActive;
}
/** Should only be called client side, called to update the data on the server **/
public void syncChanges(Side side) {
if (side == Side.CLIENT) PacketHandler.sendToServer(new PacketSyncTeam(this));
else if (side == Side.SERVER) {
for (EntityPlayerMP player : PlayerHelper.getPlayersFromUUID(getOwner())) {
PacketHandler.sendToClient(new PacketSyncTeam(this), player);
}
}
}
public void readFromNBT(NBTTagCompound tag) {
name = tag.getString("Name");
multipleRewards = tag.getBoolean("MultipleRewards");
isTrueTeam = tag.getBoolean("CountWholeTeam");
type = tag.getBoolean("IsSingleTeam") ? TeamType.SINGLE : TeamType.TEAM;
if (tag.hasKey("Owner")) owner = UUID.fromString(tag.getString("Owner"));
else if (tag.hasKey("UUID-Most")) owner = new UUID(tag.getLong("UUID-Most"), tag.getLong("UUID-Least"));
isActive = tag.getBoolean("IsActive");
members = new HashSet();
NBTTagList list = tag.getTagList("TeamMembers", 8);
for (int j = 0; j < list.tagCount(); j++) {
addMember(UUID.fromString(list.getStringTagAt(j)));
}
}
public void writeToNBT(NBTTagCompound tag) {
tag.setString("Name", name);
tag.setBoolean("MultipleRewards", multipleRewards);
tag.setBoolean("CountWholeTeam", isTrueTeam);
tag.setBoolean("IsSingleTeam", type == TeamType.SINGLE);
tag.setString("Owner", owner.toString());
tag.setBoolean("IsActive", isActive);
NBTTagList list = new NBTTagList();
for (UUID uuid : members) {
list.appendTag(new NBTTagString(uuid.toString()));
}
tag.setTag("TeamMembers", list);
}
}