Force one player name case. Prevents bugs with offline mode servers and case sensitive file systems.

This commit is contained in:
Olof Larsson 2013-08-23 10:05:41 +02:00
parent 443c800a90
commit d9d9b926c1
2 changed files with 41 additions and 0 deletions

View File

@ -32,6 +32,7 @@ public class ConfServer extends SimpleConfig
public static String dburi = "default"; public static String dburi = "default";
public static boolean usingPlayerConnectionWrap = true; public static boolean usingPlayerConnectionWrap = true;
public static boolean forceOnePlayerNameCase = true;
public static List<String> aliasesOuterMCore = MUtil.list("mcore"); public static List<String> aliasesOuterMCore = MUtil.list("mcore");
public static List<String> aliasesOuterMCoreUsys = MUtil.list("usys"); public static List<String> aliasesOuterMCoreUsys = MUtil.list("usys");

View File

@ -31,8 +31,10 @@ import com.massivecraft.mcore.event.MCoreSenderUnregisterEvent;
import com.massivecraft.mcore.mixin.Mixin; import com.massivecraft.mcore.mixin.Mixin;
import com.massivecraft.mcore.store.Coll; import com.massivecraft.mcore.store.Coll;
import com.massivecraft.mcore.store.SenderColl; import com.massivecraft.mcore.store.SenderColl;
import com.massivecraft.mcore.util.MUtil;
import com.massivecraft.mcore.util.SenderUtil; import com.massivecraft.mcore.util.SenderUtil;
import com.massivecraft.mcore.util.SmokeUtil; import com.massivecraft.mcore.util.SmokeUtil;
import com.massivecraft.mcore.util.Txt;
import com.massivecraft.mcore.wrap.PlayerConnectionWrapMCore; import com.massivecraft.mcore.wrap.PlayerConnectionWrapMCore;
public class InternalListener implements Listener public class InternalListener implements Listener
@ -54,6 +56,44 @@ public class InternalListener implements Listener
Bukkit.getPluginManager().registerEvents(this, MCore.get()); Bukkit.getPluginManager().registerEvents(this, MCore.get());
} }
// -------------------------------------------- //
// FORCE ONE PLAYER NAME CASE
// -------------------------------------------- //
// This is used with offline servers to prevent bugs on case sensitive file systems.
@EventHandler(priority = EventPriority.LOWEST)
public void forceOnePlayerNameCase(PlayerLoginEvent event)
{
// If we are enforcing one player name case ...
if (!ConfServer.forceOnePlayerNameCase) return;
// ... and the server is running in offline mode ...
if (Bukkit.getOnlineMode()) return;
// ... prepare vars ...
Player player = event.getPlayer();
String playerName = player.getName();
// ... is the player already online? ...
for (Player onlinePlayer: Bukkit.getOnlinePlayers())
{
if (!playerName.equalsIgnoreCase(onlinePlayer.getName())) continue;
event.setResult(Result.KICK_OTHER);
event.setKickMessage(Txt.parse("<b>The player <h>%s <b>is already online.", onlinePlayer.getName()));
return;
}
// ... is the first found file name different?
for (String pdname : MUtil.getPlayerDirectoryNames())
{
if (!playerName.equalsIgnoreCase(pdname)) continue;
if (playerName.equals(pdname)) break;
event.setResult(Result.KICK_OTHER);
event.setKickMessage(Txt.parse("<b>Invalid uppercase and lowercase letters in name.\n<i>Please spell this name like \"<h>%s<i>\".", pdname));
}
}
// -------------------------------------------- // // -------------------------------------------- //
// PLAYER CONNECTION WRAP INJECTION // PLAYER CONNECTION WRAP INJECTION
// -------------------------------------------- // // -------------------------------------------- //