Add spawn location cache to reduce blocking on player respawn.

This commit is contained in:
KHobbits 2014-06-16 19:55:34 +01:00
parent c54e9b5dba
commit 7804516793

View file

@ -8,18 +8,29 @@ import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IEssentialsModule public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IEssentialsModule
{ {
private ConcurrentMap<String, Location> spawns;
public SpawnStorage(final IEssentials ess) public SpawnStorage(final IEssentials ess)
{ {
super(ess, Spawns.class); super(ess, Spawns.class);
reloadConfig(); reloadConfig();
} }
@Override
public final void reloadConfig()
{
super.reloadConfig();
spawns = new ConcurrentHashMap<String, Location>();
}
@Override @Override
public File getStorageFile() public File getStorageFile()
{ {
@ -52,6 +63,8 @@ public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IE
unlock(); unlock();
} }
spawns.clear();
if ("default".equalsIgnoreCase(group)) if ("default".equalsIgnoreCase(group))
{ {
loc.getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); loc.getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
@ -59,6 +72,13 @@ public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IE
} }
public Location getSpawn(final String group) public Location getSpawn(final String group)
{
Location spawnLocation;
if (spawns.containsKey(group))
{
spawnLocation = spawns.get(group);
}
else
{ {
acquireReadLock(); acquireReadLock();
try try
@ -75,14 +95,21 @@ public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IE
} }
if (!spawnMap.containsKey(groupName)) if (!spawnMap.containsKey(groupName))
{ {
return getWorldSpawn(); spawnLocation = getWorldSpawn();
}
else
{
spawnLocation = spawnMap.get(groupName);
} }
return spawnMap.get(groupName);
} }
finally finally
{ {
unlock(); unlock();
} }
spawns.put(group, spawnLocation);
}
return spawnLocation;
} }
private Location getWorldSpawn() private Location getWorldSpawn()