package org.ultramine.mods.bukkit; import com.google.common.base.Function; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraftforge.common.MinecraftForge; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.ultramine.mods.bukkit.api.CraftPlayerCreationForgeEvent; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class CraftPlayerCacheImpl implements CraftPlayerCache { private final Map<UUID, WeakReference<CraftPlayer>> cache = new HashMap<UUID, WeakReference<CraftPlayer>>(); private final CraftServer server; public CraftPlayerCacheImpl(CraftServer server) { this.server = server; } @Override public CraftPlayer getOrCreate(EntityPlayerMP player) { UUID uuid = player.getGameProfile().getId(); WeakReference<CraftPlayer> ref = cache.get(uuid); CraftPlayer craft = ref == null ? null : ref.get(); if(craft == null) { craft = new CraftPlayer(server, player); MinecraftForge.EVENT_BUS.post(new CraftPlayerCreationForgeEvent(craft)); cache.put(uuid, new WeakReference<CraftPlayer>(craft)); } else { craft.setHandle(player); } return craft; } @Override public void updateReferences(EntityPlayerMP player) { WeakReference<CraftPlayer> ref = cache.get(player.getGameProfile().getId()); CraftPlayer craft = ref == null ? null : ref.get(); if(craft != null) craft.setHandle(player); } @Override public void forEach(Function<CraftPlayer, Void> consumer) { for(WeakReference<CraftPlayer> ref : cache.values()) { CraftPlayer craft = ref.get(); if(craft != null) consumer.apply(craft); } } }