Newer
Older
ultramine_bukkit / src / main / java / org / ultramine / mods / bukkit / CraftPlayerCacheImpl.java
@vlad20012 vlad20012 on 24 Feb 2017 1 KB initial
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);
		}
	}
}