package joshie.progression.helpers; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import joshie.progression.crafting.Crafter; import joshie.progression.crafting.CrafterCreative; import joshie.progression.crafting.CrafterHuman; import joshie.progression.crafting.CraftingUnclaimed; import joshie.progression.json.Options; import joshie.progression.player.PlayerTeam; import joshie.progression.player.PlayerTracker; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; public class PlayerHelper { private static Cache<UUID, Crafter> crafters = CacheBuilder.newBuilder().maximumSize(64).build(); public static Crafter getCrafterForUUID(final boolean isClient, final UUID uuid) { Crafter crafter = getCrafterFromUUID(isClient, uuid); return crafter == null ? CraftingUnclaimed.INSTANCE : crafter; } public static Crafter getCrafterFromUUID(final boolean isClient, final UUID uuid) { //If we are creative always jump to the creative profile, never cache it EntityPlayer player = PlayerHelper.getPlayerFromUUID(isClient, uuid); if (Options.getSettings().craftAnythingCreative && player != null && player.capabilities.isCreativeMode) { return CrafterCreative.INSTANCE; } try { return crafters.get(uuid, new Callable<Crafter>() { @Override public Crafter call() throws Exception { return new CrafterHuman(uuid); } }); } catch (Exception e) { return CraftingUnclaimed.INSTANCE; } } public static UUID getUUIDForPlayer(EntityPlayer player) { return EntityPlayer.getUUID(player.getGameProfile()); } /** Should only ever be called serverside **/ public static Set<EntityPlayerMP> getPlayersFromUUID(UUID uuid) { Set<EntityPlayerMP> list = new LinkedHashSet(); PlayerTeam team = PlayerTracker.getServerPlayer(uuid).getTeam(); for (EntityPlayerMP player : getAllPlayers()) { /** Add the Owner **/ if (getUUIDForPlayer(player).equals(team.getOwner())) { list.add((EntityPlayerMP) player); } if (team.giveMultipleRewards()) { /** Add the Team Members **/ for (UUID member : team.getMembers()) { if (getUUIDForPlayer(player).equals(member)) { list.add((EntityPlayerMP) player); } } } } return list; } public static EntityPlayer getPlayerFromUUID(boolean isClient, UUID uuid) { if (isClient) return MCClientHelper.getPlayer(); for (EntityPlayerMP player : getAllPlayers()) { if (getUUIDForPlayer(player).equals(uuid)) { return player; } } return null; } public static List<EntityPlayerMP> getAllPlayers() { return FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerList(); } @SideOnly(Side.CLIENT) public static UUID getClientUUID() { return getUUIDForPlayer(MCClientHelper.getPlayer()); } }