From 8f8c62b71b76675903405df4f7f11edc1a7c6db6 Mon Sep 17 00:00:00 2001 From: Dinnerbone Date: Sun, 25 Sep 2011 04:21:35 +0100 Subject: [PATCH] Ensure there's only one OfflinePlayer object per actual offline player --- .../java/org/bukkit/craftbukkit/CraftServer.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 8bb53fc3a4..36e66ec272 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -6,6 +6,7 @@ import com.avaje.ebean.config.DataSourceConfig; import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.SQLitePlatform; import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation; +import com.google.common.collect.MapMaker; import net.minecraft.server.IWorldAccess; import org.bukkit.World.Environment; import org.bukkit.command.*; @@ -89,6 +90,7 @@ public final class CraftServer implements Server { private final Map worlds = new LinkedHashMap(); private final Configuration configuration; private final Yaml yaml = new Yaml(new SafeConstructor()); + private final Map offlinePlayers = new MapMaker().softValues().makeMap(); public CraftServer(MinecraftServer console, ServerConfigurationManager server) { this.console = console; @@ -790,9 +792,17 @@ public final class CraftServer implements Server { public OfflinePlayer getOfflinePlayer(String name) { OfflinePlayer result = getPlayerExact(name); + String lname = name.toLowerCase(); if (result == null) { - result = new CraftOfflinePlayer(this, name); + result = offlinePlayers.get(lname); + + if (result == null) { + result = new CraftOfflinePlayer(this, name); + offlinePlayers.put(lname, result); + } + } else { + offlinePlayers.remove(lname); } return result;