diff --git a/plugin.yml b/plugin.yml index 366c5db8..be53cd7c 100644 --- a/plugin.yml +++ b/plugin.yml @@ -11,6 +11,7 @@ permissions: # -------------------------------------------- # # cmd mcore.basecommand: {description: use the MCore base command, default: false} + mcore.test: {description: run developer test, default: false} mcore.id: {description: see the server id, default: false} mcore.version: {description: diplay plugin version, default: false} mcore.hearsound: {description: hear a sound, default: false} @@ -43,6 +44,7 @@ permissions: default: false children: mcore.basecommand: true + mcore.test: true mcore.id: true mcore.version: true mcore.hearsound: true diff --git a/src/com/massivecraft/mcore/EngineCommandRegistration.java b/src/com/massivecraft/mcore/EngineCommandRegistration.java index 8a237030..f4fa757e 100644 --- a/src/com/massivecraft/mcore/EngineCommandRegistration.java +++ b/src/com/massivecraft/mcore/EngineCommandRegistration.java @@ -6,9 +6,9 @@ import java.util.Map; import java.util.Map.Entry; import org.bukkit.Bukkit; +import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.SimpleCommandMap; -import org.bukkit.craftbukkit.v1_7_R3.CraftServer; import org.bukkit.plugin.Plugin; import com.massivecraft.mcore.cmd.MCommand; @@ -103,14 +103,10 @@ public class EngineCommandRegistration extends EngineAbstract // GETTERS // -------------------------------------------- // - public static CraftServer getCraftServer() - { - return (CraftServer)Bukkit.getServer(); - } - public static SimpleCommandMap getSimpleCommandMap() { - return getCraftServer().getCommandMap(); + Server server = Bukkit.getServer(); + return (SimpleCommandMap) get(server.getClass(), "commandMap", server); } @SuppressWarnings("unchecked") diff --git a/src/com/massivecraft/mcore/EngineMainMCore.java b/src/com/massivecraft/mcore/EngineMainMCore.java index cb2e56d4..2dd18a92 100644 --- a/src/com/massivecraft/mcore/EngineMainMCore.java +++ b/src/com/massivecraft/mcore/EngineMainMCore.java @@ -15,6 +15,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByBlockEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerKickEvent; @@ -22,6 +23,7 @@ import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerChatTabCompleteEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -40,7 +42,8 @@ import com.massivecraft.mcore.event.MCoreSenderUnregisterEvent; import com.massivecraft.mcore.mixin.Mixin; import com.massivecraft.mcore.store.Coll; import com.massivecraft.mcore.store.SenderColl; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.FlyUtil; +import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.SmokeUtil; import com.massivecraft.mcore.util.Txt; @@ -70,6 +73,45 @@ public class EngineMainMCore extends EngineAbstract MCorePlayerLeaveEvent.player2event.clear(); } + // -------------------------------------------- // + // FLY UTIL & EVENT + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void updateFly(PlayerMoveEvent event) + { + // If a player ... + Player player = event.getPlayer(); + + // ... moved from one block to another ... + if (event.getFrom().getBlock().equals(event.getTo().getBlock())) return; + + // ... and the player is alive ... + if (player.isDead()) return; + + // ... trigger a fly update. + FlyUtil.update(player); + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void negateNoCheatPlusBug(EntityDamageEvent event) + { + // If a player ... + if ( ! (event.getEntity() instanceof Player)) return; + Player player = (Player)event.getEntity(); + + // ... is taking fall damage ... + if (event.getCause() != DamageCause.FALL) return; + + // ... within 2 seconds of flying ... + Long lastActive = FlyUtil.getLastActive(player); + if (lastActive == null) return; + if (System.currentTimeMillis() - lastActive > 2000) return; + + // ... cancel the event. + event.setCancelled(true); + } + // -------------------------------------------- // // RECIPIENT CHAT // -------------------------------------------- // @@ -147,14 +189,14 @@ public class EngineMainMCore extends EngineAbstract Set current = new TreeSet(String.CASE_INSENSITIVE_ORDER); current.addAll(event.getTabCompletions()); - // Add ids of all online senders that match and isn't added yet. - for (String senderId : Mixin.getOnlineSenderIds()) + // Add names of all online senders that match and isn't added yet. + for (String senderName : IdUtil.getOnlineNames()) { - if (!senderId.toLowerCase().startsWith(tokenlc)) continue; - if (current.contains(senderId)) continue; - if (!Mixin.canSee(watcher, senderId)) continue; + if (!senderName.toLowerCase().startsWith(tokenlc)) continue; + if (current.contains(senderName)) continue; + if (!Mixin.canSee(watcher, senderName)) continue; - event.getTabCompletions().add(senderId); + event.getTabCompletions().add(senderName); } } @@ -229,52 +271,54 @@ public class EngineMainMCore extends EngineAbstract // -------------------------------------------- // // PLAYER AND SENDER REFERENCES // -------------------------------------------- // + // Note: For now we update both names and ids. + // That way collections in plugins that haven't yet undergone update will still work. + + public static void setSenderReferences(CommandSender sender, CommandSender reference) + { + String id = IdUtil.getId(sender); + if (id != null) + { + SenderColl.setSenderReferences(id, reference); + } + + String name = IdUtil.getName(sender); + if (name != null) + { + SenderColl.setSenderReferences(name, reference); + } + } @EventHandler(priority = EventPriority.LOWEST) - public void senderReferencesLoginLowest(PlayerLoginEvent event) + public void setSenderReferencesLoginLowest(PlayerLoginEvent event) { - String id = SenderUtil.getSenderId(event.getPlayer()); - CommandSender sender = event.getPlayer(); - - SenderColl.setSenderRefferences(id, sender); + setSenderReferences(event.getPlayer(), event.getPlayer()); } @EventHandler(priority = EventPriority.MONITOR) - public void senderReferencesLoginMonitor(PlayerLoginEvent event) + public void setSenderReferencesLoginMonitor(PlayerLoginEvent event) { if (event.getResult() == Result.ALLOWED) return; - String id = SenderUtil.getSenderId(event.getPlayer()); - CommandSender sender = null; - - SenderColl.setSenderRefferences(id, sender); + setSenderReferences(event.getPlayer(), null); } @EventHandler(priority = EventPriority.MONITOR) - public void senderReferencesQuitMonitor(PlayerQuitEvent event) + public void setSenderReferencesQuitMonitor(PlayerQuitEvent event) { - String id = SenderUtil.getSenderId(event.getPlayer()); - CommandSender sender = null; - - SenderColl.setSenderRefferences(id, sender); + setSenderReferences(event.getPlayer(), null); } @EventHandler(priority = EventPriority.MONITOR) - public void senderReferencesRegisterMonitor(MCoreSenderRegisterEvent event) + public void setSenderReferencesRegisterMonitor(MCoreSenderRegisterEvent event) { - String id = SenderUtil.getSenderId(event.getSender()); - CommandSender sender = event.getSender(); - - SenderColl.setSenderRefferences(id, sender); + setSenderReferences(event.getSender(), event.getSender()); } @EventHandler(priority = EventPriority.MONITOR) - public void senderReferencesUnregisterMonitor(MCoreSenderUnregisterEvent event) + public void setSenderReferencesUnregisterMonitor(MCoreSenderUnregisterEvent event) { - String id = SenderUtil.getSenderId(event.getSender()); - CommandSender sender = null; - - SenderColl.setSenderRefferences(id, sender); + setSenderReferences(event.getSender(), null); } // -------------------------------------------- // @@ -372,12 +416,15 @@ public class EngineMainMCore extends EngineAbstract public void syncAllForPlayer(Player player) { + // TODO: For now we sync them both! String playerName = player.getName(); + String playerId = player.getUniqueId().toString(); for (Coll coll : Coll.getInstances()) { if (!(coll instanceof SenderColl)) continue; SenderColl pcoll = (SenderColl)coll; pcoll.syncId(playerName); + pcoll.syncId(playerId); } } diff --git a/src/com/massivecraft/mcore/MCore.java b/src/com/massivecraft/mcore/MCore.java index 0be5e7e4..d0d41b87 100644 --- a/src/com/massivecraft/mcore/MCore.java +++ b/src/com/massivecraft/mcore/MCore.java @@ -1,10 +1,10 @@ package com.massivecraft.mcore; import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Random; +import java.util.Set; import java.util.UUID; import org.bukkit.Bukkit; @@ -19,19 +19,21 @@ import com.massivecraft.mcore.adapter.ModdedEnumTypeAdapter; import com.massivecraft.mcore.adapter.ObjectIdAdapter; import com.massivecraft.mcore.adapter.PlayerInventoryAdapter; import com.massivecraft.mcore.adapter.UUIDAdapter; +import com.massivecraft.mcore.event.MCoreUuidUpdateEvent; +import com.massivecraft.mcore.fetcher.Fetcher; +import com.massivecraft.mcore.fetcher.IdAndName; import com.massivecraft.mcore.integration.protocollib.ProtocolLibFeatures; import com.massivecraft.mcore.integration.vault.VaultFeatures; import com.massivecraft.mcore.mcorecmd.CmdMCore; import com.massivecraft.mcore.mcorecmd.CmdMCoreMStore; import com.massivecraft.mcore.mcorecmd.CmdMCoreUsys; -import com.massivecraft.mcore.mixin.SenderIdMixinDefault; import com.massivecraft.mcore.mixin.EngineTeleportMixinCause; import com.massivecraft.mcore.ps.PS; import com.massivecraft.mcore.ps.PSAdapter; import com.massivecraft.mcore.store.Coll; import com.massivecraft.mcore.store.ExamineThread; import com.massivecraft.mcore.teleport.EngineScheduledTeleport; -import com.massivecraft.mcore.util.MUtil; +import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.PlayerUtil; import com.massivecraft.mcore.util.Txt; import com.massivecraft.mcore.xlib.bson.types.ObjectId; @@ -120,9 +122,20 @@ public class MCore extends MPlugin // OVERRIDE // -------------------------------------------- // + public boolean doderp = false; + @Override public void onEnable() { + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() + { + @Override + public void run() + { + doderp = true; + } + }, 20); + // This is safe since all plugins using Persist should bukkit-depend this plugin. // Note this one must be before preEnable. dooh. // TODO: Create something like "deinit all" (perhaps a forloop) to readd this. @@ -140,8 +153,8 @@ public class MCore extends MPlugin // Setup the default database //db = MStore.getDb(ConfServer.dburi); - // Setup PlayerUtil and it's events - SenderIdMixinDefault.get().setup(); + // Setup IdUtil + IdUtil.setup(); // Register events EngineMainMCore.get().activate(); @@ -158,7 +171,6 @@ public class MCore extends MPlugin MultiverseColl.get().init(); AspectColl.get().init(); MCoreConfColl.get().init(); - MCoreMPlayerColl.get().init(); // Register commands this.outerCmdMCore = new CmdMCore() { public List getAliases() { return MCoreConf.get().aliasesOuterMCore; } }; @@ -180,18 +192,32 @@ public class MCore extends MPlugin TaskDeleteFiles.get().run(); Bukkit.getScheduler().scheduleSyncDelayedTask(this, TaskDeleteFiles.get()); - //test(); + // test(); - // Schedule fetch all Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { - PlayerUtil.fetchAllIds(); + log(Txt.parse("============================================")); + log(Txt.parse("We are preparing for Mojangs switch to UUIDs.")); + log(Txt.parse("Learn more at: https://forums.bukkit.org/threads/psa-the-switch-to-uuids-potential-plugin-server-breakage.250915/")); + + // TODO: NOTE!!! IMPORTANT EVEN LATER! + IdUtil.loadDatas(); + + log(Txt.parse("Now updating database for plugins that are ready ...")); + + MCoreUuidUpdateEvent event = new MCoreUuidUpdateEvent(); + event.run(); + + log(Txt.parse(" ... done!")); + log(Txt.parse("(database saving will now commence which might lock the server for a while)")); + log(Txt.parse("============================================")); } }); + this.postEnable(); } @@ -204,16 +230,59 @@ public class MCore extends MPlugin try { // whatever you feel like - for (int i = 0; i <= 1; i++) + List objects = new ArrayList(); + + //objects.add("Cayorion"); + objects.add("a2cce16b-9494-45ff-b5ff-0362ca687d4e"); + + //objects.add("a2cce16b-9494-45ff-b5ff-0362ca687d4a"); + + objects.add("hnnn"); + objects.add("hnnnbsarc"); + + objects.add("NOT EVEN LEGIT"); + + objects.add("MonMarty"); + objects.add("Thortuna"); + objects.add("yendor46"); + objects.add("Gethelp"); + objects.add("Th3_Drunk_Monk"); + objects.add("Ryciera"); + objects.add("Jamescl"); + objects.add("spectec"); + objects.add("Tom1804"); + objects.add("imboring56"); + objects.add("BigBellyBuddah"); + objects.add("MrHappyTinkles"); + objects.add("BabaManga"); + objects.add("_Omnomivore_"); + objects.add("Cielian"); + objects.add("BboyMVB"); + objects.add("MrWackeo"); + objects.add("Kellock93"); + objects.add("Feykronos"); + objects.add("Unluvable"); + objects.add("DanyWood"); + objects.add("jadex224"); + objects.add("MinecraftSpartan"); + objects.add("ravenwolfthorn"); + objects.add("ELtongo"); + objects.add("Azas"); + objects.add("TazeHD"); + objects.add("BillyA835"); + objects.add("duhsigil"); + objects.add("Sahrotaar"); + objects.add("Alj23"); + + Set idAndNames = Fetcher.fetch(objects); + + // Map map = PlayerUtil.getPlayerIds(MUtil.list("Cayorion", "MonMarty", "Thortuna", "yendor46", "Gethelp", "Th3_Drunk_Monk", "Ryciera", "Jamescl", "spectec", "Tom1804", "imboring56", "BigBellyBuddah", "MrHappyTinkles", "BabaManga", "_Omnomivore_", "Cielian", "BboyMVB", "MrWackeo", "Kellock93", "Feykronos", "Unluvable", "DanyWood", "jadex224", "MinecraftSpartan", "ravenwolfthorn", "ELtongo", "Azas", "TazeHD", "BillyA835", "duhsigil", "Sahrotaar", "Alj23")); + + for (IdAndName idAndName: idAndNames) { - Map map = PlayerUtil.getPlayerIds(MUtil.list("Cayorion", "MonMarty", "Thortuna", "yendor46", "Gethelp", "Th3_Drunk_Monk", "Ryciera", "Jamescl", "spectec", "Tom1804", "imboring56", "BigBellyBuddah", "MrHappyTinkles", "BabaManga", "_Omnomivore_", "Cielian", "BboyMVB", "MrWackeo", "Kellock93", "Feykronos", "Unluvable", "DanyWood", "jadex224", "MinecraftSpartan", "ravenwolfthorn", "ELtongo", "Azas", "TazeHD", "BillyA835", "duhsigil", "Sahrotaar", "Alj23")); - for (Entry entry : map.entrySet()) - { - String playerName = entry.getKey(); - UUID playerId = entry.getValue(); - log(Txt.parse("%s %s", playerName, playerId.toString())); - } - log("==========================="); + String name = idAndName.getName(); + UUID id = idAndName.getId(); + log(Txt.parse("%s %s", name, id)); } } catch (Exception e) @@ -232,6 +301,7 @@ public class MCore extends MPlugin super.onDisable(); ExamineThread.get().interrupt(); TaskDeleteFiles.get().run(); + IdUtil.saveCachefileDatas(); } } diff --git a/src/com/massivecraft/mcore/MCoreMPlayer.java b/src/com/massivecraft/mcore/MCoreMPlayer.java deleted file mode 100644 index 1e89bef3..00000000 --- a/src/com/massivecraft/mcore/MCoreMPlayer.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.massivecraft.mcore; - -import com.massivecraft.mcore.store.Entity; - -public class MCoreMPlayer extends Entity -{ - // -------------------------------------------- // - // META - // -------------------------------------------- // - - public static MCoreMPlayer get(Object oid) - { - return MCoreMPlayerColl.get().get(oid); - } - - public static MCoreMPlayer get(Object oid, boolean creative) - { - return MCoreMPlayerColl.get().get(oid, creative); - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public MCoreMPlayer load(MCoreMPlayer that) - { - this.name = that.name; - - return this; - } - - @Override - public boolean isDefault() - { - if (this.name != null) return false; - - return true; - } - - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private String name = null; - public String getName() { return this.name; } - public void setName(String name) - { - this.name = name; - if (!this.attached()) return; - MCoreMPlayerColl.get().getIndexName().update(this, name); - this.changed(); - } - -} diff --git a/src/com/massivecraft/mcore/MCoreMPlayerColl.java b/src/com/massivecraft/mcore/MCoreMPlayerColl.java deleted file mode 100644 index 2003bd92..00000000 --- a/src/com/massivecraft/mcore/MCoreMPlayerColl.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.massivecraft.mcore; - -import java.util.TreeMap; -import java.util.UUID; - -import org.bukkit.entity.Player; - -import com.massivecraft.mcore.store.Coll; -import com.massivecraft.mcore.store.IndexUniqueField; -import com.massivecraft.mcore.store.MStore; -import com.massivecraft.mcore.util.MUtil; - -public class MCoreMPlayerColl extends Coll -{ - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static MCoreMPlayerColl i = new MCoreMPlayerColl(); - public static MCoreMPlayerColl get() { return i; } - public MCoreMPlayerColl() - { - super("mcore_mplayer", MCoreMPlayer.class, MStore.getDb(), MCore.get(), false, false, true); - } - - // -------------------------------------------- // - // FIELD - // -------------------------------------------- // - - private IndexUniqueField indexName = new IndexUniqueField(new TreeMap(String.CASE_INSENSITIVE_ORDER)); - public IndexUniqueField getIndexName() { return this.indexName; } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public void postAttach(MCoreMPlayer entity, String id) - { - super.postAttach(entity, id); - this.getIndexName().update(entity, entity.getName()); - } - - @Override - public void postDetach(MCoreMPlayer entity, String id) - { - super.postDetach(entity, id); - this.getIndexName().removeObject(entity); - } - - @Override - public String fixId(Object oid) - { - if (oid == null) return null; - - if (oid instanceof MCoreMPlayer) - { - return this.entity2id.get(oid); - } - - if (oid instanceof String) - { - String string = (String)oid; - string = string.toLowerCase(); - - // Handle Player Name - if (MUtil.isValidPlayerName(string)) - { - MCoreMPlayer mplayer = this.getIndexName().getObject(string); - if (mplayer != null) return mplayer.getId(); - } - - return string; - } - - if (oid instanceof UUID) - { - UUID uuid = (UUID)oid; - return uuid.toString(); - } - - if (oid instanceof Player) - { - Player player = (Player)oid; - return player.getUniqueId().toString(); - } - - return null; - } - -} diff --git a/src/com/massivecraft/mcore/MCorePerm.java b/src/com/massivecraft/mcore/MCorePerm.java index 7daa22bf..5c17472c 100644 --- a/src/com/massivecraft/mcore/MCorePerm.java +++ b/src/com/massivecraft/mcore/MCorePerm.java @@ -11,6 +11,7 @@ public enum MCorePerm // -------------------------------------------- // BASECOMMAND("basecommand"), + TEST("test"), ID("id"), VERSION("version"), HEARSOUND("hearsound"), diff --git a/src/com/massivecraft/mcore/cmd/MCommand.java b/src/com/massivecraft/mcore/cmd/MCommand.java index 5b6e9f5c..a2d4919e 100644 --- a/src/com/massivecraft/mcore/cmd/MCommand.java +++ b/src/com/massivecraft/mcore/cmd/MCommand.java @@ -450,34 +450,34 @@ public class MCommand public boolean sendMessage(String message) { - return Mixin.message(this.sender, message); + return Mixin.messageOne(this.sender, message); } public boolean sendMessage(String... messages) { - return Mixin.message(this.sender, messages); + return Mixin.messageOne(this.sender, messages); } public boolean sendMessage(Collection messages) { - return Mixin.message(this.sender, messages); + return Mixin.messageOne(this.sender, messages); } // CONVENIENCE MSG public boolean msg(String msg) { - return Mixin.msg(this.sender, msg); + return Mixin.msgOne(this.sender, msg); } public boolean msg(String msg, Object... args) { - return Mixin.msg(this.sender, msg, args); + return Mixin.msgOne(this.sender, msg, args); } public boolean msg(Collection msgs) { - return Mixin.msg(this.sender, msgs); + return Mixin.msgOne(this.sender, msgs); } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore/cmd/MCoreBukkitCommand.java b/src/com/massivecraft/mcore/cmd/MCoreBukkitCommand.java index 1cdd07ae..452db4e5 100644 --- a/src/com/massivecraft/mcore/cmd/MCoreBukkitCommand.java +++ b/src/com/massivecraft/mcore/cmd/MCoreBukkitCommand.java @@ -10,6 +10,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import com.massivecraft.mcore.mixin.Mixin; +import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.Txt; public class MCoreBukkitCommand extends Command @@ -83,12 +84,12 @@ public class MCoreBukkitCommand extends Command String tokenlc = args[args.length - 1].toLowerCase(); - // Add ids of all online senders that match and isn't added yet. - for (String senderId : Mixin.getOnlineSenderIds()) + // Add names of all online senders that match and isn't added yet. + for (String senderName : IdUtil.getOnlineNames()) { - if (!senderId.toLowerCase().startsWith(tokenlc)) continue; - if (!Mixin.canSee(sender, senderId)) continue; - ret.add(senderId); + if (!senderName.toLowerCase().startsWith(tokenlc)) continue; + if (!Mixin.canSee(sender, senderName)) continue; + ret.add(senderName); } return new ArrayList(ret); diff --git a/src/com/massivecraft/mcore/cmd/arg/ARPlayer.java b/src/com/massivecraft/mcore/cmd/arg/ARPlayer.java index 3fe00df6..6d079710 100644 --- a/src/com/massivecraft/mcore/cmd/arg/ARPlayer.java +++ b/src/com/massivecraft/mcore/cmd/arg/ARPlayer.java @@ -4,7 +4,7 @@ import org.bukkit.entity.Player; import com.massivecraft.mcore.store.SenderIdSource; import com.massivecraft.mcore.store.SenderIdSourceMixinAllSenderIds; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class ARPlayer extends ARSenderIdAbstractPredsource { @@ -40,7 +40,7 @@ public class ARPlayer extends ARSenderIdAbstractPredsource @Override public Player getResultForSenderId(String senderId) { - return SenderUtil.getPlayer(senderId); + return IdUtil.getPlayer(senderId); } } diff --git a/src/com/massivecraft/mcore/cmd/arg/ARSender.java b/src/com/massivecraft/mcore/cmd/arg/ARSender.java index 6a0c073f..d91fbb87 100644 --- a/src/com/massivecraft/mcore/cmd/arg/ARSender.java +++ b/src/com/massivecraft/mcore/cmd/arg/ARSender.java @@ -4,7 +4,7 @@ import org.bukkit.command.CommandSender; import com.massivecraft.mcore.store.SenderIdSource; import com.massivecraft.mcore.store.SenderIdSourceMixinAllSenderIds; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class ARSender extends ARSenderIdAbstractPredsource { @@ -20,12 +20,12 @@ public class ARSender extends ARSenderIdAbstractPredsource public static ARSender getFull(SenderIdSource source) { - return new ARSender(source, "sender", ArgPredictateStringEqualsLC.get()); + return new ARSender(source, "player", ArgPredictateStringEqualsLC.get()); } public static ARSender getStart(SenderIdSource source) { - return new ARSender(source, "sender", ArgPredictateStringStartsLC.get()); + return new ARSender(source, "player", ArgPredictateStringStartsLC.get()); } private ARSender(SenderIdSource source, String typename, ArgPredictate argPredictate) @@ -40,7 +40,7 @@ public class ARSender extends ARSenderIdAbstractPredsource @Override public CommandSender getResultForSenderId(String senderId) { - return SenderUtil.getSender(senderId); + return IdUtil.getSender(senderId); } } diff --git a/src/com/massivecraft/mcore/cmd/arg/ARSenderEntity.java b/src/com/massivecraft/mcore/cmd/arg/ARSenderEntity.java index 8fc01563..4ac88700 100644 --- a/src/com/massivecraft/mcore/cmd/arg/ARSenderEntity.java +++ b/src/com/massivecraft/mcore/cmd/arg/ARSenderEntity.java @@ -3,6 +3,7 @@ package com.massivecraft.mcore.cmd.arg; import com.massivecraft.mcore.store.SenderColl; import com.massivecraft.mcore.store.SenderEntity; import com.massivecraft.mcore.store.SenderIdSource; +import com.massivecraft.mcore.util.IdUtil; public class ARSenderEntity> extends ARSenderIdAbstractPredsource { @@ -57,6 +58,12 @@ public class ARSenderEntity> extends ARSenderIdAbstrac @Override public T getResultForSenderId(String senderId) { + if (senderId == null) return null; + + // Convert names to ids so we can handle both + String betterId = IdUtil.getId(senderId); + if (betterId != null) return this.coll.get(betterId); + return this.coll.get(senderId); } diff --git a/src/com/massivecraft/mcore/cmd/arg/ARSenderId.java b/src/com/massivecraft/mcore/cmd/arg/ARSenderId.java index 0de9327b..80dc0e6c 100644 --- a/src/com/massivecraft/mcore/cmd/arg/ARSenderId.java +++ b/src/com/massivecraft/mcore/cmd/arg/ARSenderId.java @@ -2,6 +2,7 @@ package com.massivecraft.mcore.cmd.arg; import com.massivecraft.mcore.store.SenderIdSource; import com.massivecraft.mcore.store.SenderIdSourceMixinAllSenderIds; +import com.massivecraft.mcore.util.IdUtil; public class ARSenderId extends ARSenderIdAbstractPredsource { @@ -37,6 +38,12 @@ public class ARSenderId extends ARSenderIdAbstractPredsource @Override public String getResultForSenderId(String senderId) { + if (senderId == null) return null; + + // Convert names to ids so we can handle both + String betterId = IdUtil.getId(senderId); + if (betterId != null) return betterId; + return senderId; } diff --git a/src/com/massivecraft/mcore/cmd/arg/ARSenderIdAbstract.java b/src/com/massivecraft/mcore/cmd/arg/ARSenderIdAbstract.java index cc57c3ed..b204940e 100644 --- a/src/com/massivecraft/mcore/cmd/arg/ARSenderIdAbstract.java +++ b/src/com/massivecraft/mcore/cmd/arg/ARSenderIdAbstract.java @@ -4,7 +4,7 @@ import java.util.Collection; import org.bukkit.command.CommandSender; -import com.massivecraft.mcore.mixin.Mixin; +import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.Txt; public abstract class ARSenderIdAbstract extends ArgReaderAbstract @@ -50,13 +50,13 @@ public abstract class ARSenderIdAbstract extends ArgReaderAbstract else if (senderIds.contains(arg)) { // Exact match - String senderId = Mixin.tryFix(arg); + String senderId = IdUtil.getName(arg); ret.setResult(this.getResultForSenderId(senderId)); } else { // Ambigious! - ret.getErrors().add("Online "+this.getTypename()+" matching \""+arg+"\" is ambigious."); + ret.getErrors().add(""+this.getTypename()+" matching \""+arg+"\" is ambigious."); if (senderIds.size() >= MAX_COUNT) { // To many to list diff --git a/src/com/massivecraft/mcore/cmd/req/ReqIsPlayer.java b/src/com/massivecraft/mcore/cmd/req/ReqIsPlayer.java index 87d76d33..c0b22158 100644 --- a/src/com/massivecraft/mcore/cmd/req/ReqIsPlayer.java +++ b/src/com/massivecraft/mcore/cmd/req/ReqIsPlayer.java @@ -1,10 +1,10 @@ package com.massivecraft.mcore.cmd.req; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import com.massivecraft.mcore.Lang; import com.massivecraft.mcore.cmd.MCommand; -import com.massivecraft.mcore.util.SenderUtil; public class ReqIsPlayer extends ReqAbstract { @@ -24,7 +24,7 @@ public class ReqIsPlayer extends ReqAbstract @Override public boolean apply(CommandSender sender, MCommand command) { - return SenderUtil.isPlayer(sender); + return sender instanceof Player; } @Override diff --git a/src/com/massivecraft/mcore/cmd/req/ReqIsntCertainSender.java b/src/com/massivecraft/mcore/cmd/req/ReqIsntCertainSender.java index c71b3508..0a22b6b2 100644 --- a/src/com/massivecraft/mcore/cmd/req/ReqIsntCertainSender.java +++ b/src/com/massivecraft/mcore/cmd/req/ReqIsntCertainSender.java @@ -4,7 +4,7 @@ import org.bukkit.command.CommandSender; import com.massivecraft.mcore.cmd.MCommand; import com.massivecraft.mcore.mixin.Mixin; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.Txt; public class ReqIsntCertainSender extends ReqAbstract @@ -15,11 +15,8 @@ public class ReqIsntCertainSender extends ReqAbstract // INSTANCE & CONSTRUCT // -------------------------------------------- // - public static ReqIsntCertainSender get(CommandSender sender) { return new ReqIsntCertainSender(sender); } - public ReqIsntCertainSender(CommandSender sender) { this.senderId = SenderUtil.getSenderId(sender); } - - public static ReqIsntCertainSender get(String senderId) { return new ReqIsntCertainSender(senderId); } - public ReqIsntCertainSender(String senderId) { this.senderId = senderId; } + public static ReqIsntCertainSender get(Object senderObject) { return new ReqIsntCertainSender(senderObject); } + public ReqIsntCertainSender(Object senderObject) { this.senderId = IdUtil.getId(senderObject); } // -------------------------------------------- // // FIELDS @@ -35,7 +32,7 @@ public class ReqIsntCertainSender extends ReqAbstract @Override public boolean apply(CommandSender sender, MCommand command) { - return !this.getSenderId().equalsIgnoreCase(SenderUtil.getSenderId(sender)); + return !this.getSenderId().equalsIgnoreCase(IdUtil.getId(sender)); } @Override diff --git a/src/com/massivecraft/mcore/cmd/req/ReqIsntPlayer.java b/src/com/massivecraft/mcore/cmd/req/ReqIsntPlayer.java index 31f727f2..9f46ee45 100644 --- a/src/com/massivecraft/mcore/cmd/req/ReqIsntPlayer.java +++ b/src/com/massivecraft/mcore/cmd/req/ReqIsntPlayer.java @@ -1,10 +1,10 @@ package com.massivecraft.mcore.cmd.req; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import com.massivecraft.mcore.Lang; import com.massivecraft.mcore.cmd.MCommand; -import com.massivecraft.mcore.util.SenderUtil; public class ReqIsntPlayer extends ReqAbstract { @@ -24,7 +24,7 @@ public class ReqIsntPlayer extends ReqAbstract @Override public boolean apply(CommandSender sender, MCommand command) { - return !SenderUtil.isPlayer(sender); + return ! (sender instanceof Player); } @Override diff --git a/src/com/massivecraft/mcore/event/MCorePlayerFlyEvent.java b/src/com/massivecraft/mcore/event/MCorePlayerFlyEvent.java new file mode 100644 index 00000000..f1a35da4 --- /dev/null +++ b/src/com/massivecraft/mcore/event/MCorePlayerFlyEvent.java @@ -0,0 +1,64 @@ +package com.massivecraft.mcore.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import com.massivecraft.mcore.util.FlyUtil; + +public class MCorePlayerFlyEvent extends MCoreEvent +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public final static float DEFAULT_SPEED = 0.1f; + + // -------------------------------------------- // + // REQUIRED EVENT CODE + // -------------------------------------------- // + + private static final HandlerList handlers = new HandlerList(); + @Override public HandlerList getHandlers() { return handlers; } + public static HandlerList getHandlerList() { return handlers; } + + // -------------------------------------------- // + // FIELD + // -------------------------------------------- // + + private final Player player; + public Player getPlayer() { return this.player; } + + private boolean allowed; + public boolean isAllowed() { return this.allowed; } + public void setAllowed(boolean allowed) { this.allowed = allowed; } + + private boolean active; + public boolean isActive() { return this.active; } + public void setActive(boolean active) { this.active = active; } + + private float speed; + public float getSpeed() { return this.speed; } + public void setSpeed(float speed) { this.speed = speed; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public MCorePlayerFlyEvent(Player player, boolean allowed, boolean active, float speed) + { + this.player = player; + this.allowed = allowed; + this.active = active; + this.speed = speed; + } + + public MCorePlayerFlyEvent(Player player) + { + this.player = player; + this.allowed = FlyUtil.isAllowed(player); + this.active = FlyUtil.isActive(player); + this.speed = FlyUtil.getSpeed(player); + } + +} + diff --git a/src/com/massivecraft/mcore/event/MCoreSenderRegisterEvent.java b/src/com/massivecraft/mcore/event/MCoreSenderRegisterEvent.java index 80ed1be8..975d476e 100644 --- a/src/com/massivecraft/mcore/event/MCoreSenderRegisterEvent.java +++ b/src/com/massivecraft/mcore/event/MCoreSenderRegisterEvent.java @@ -3,7 +3,9 @@ package com.massivecraft.mcore.event; import org.bukkit.command.CommandSender; import org.bukkit.event.HandlerList; -public class MCoreSenderRegisterEvent extends MCoreSenderEvent +import com.massivecraft.mcore.util.IdData; + +public class MCoreSenderRegisterEvent extends MCoreSenderRegistryEvent { // -------------------------------------------- // // REQUIRED EVENT CODE @@ -17,9 +19,9 @@ public class MCoreSenderRegisterEvent extends MCoreSenderEvent // CONSTRUCT // -------------------------------------------- // - public MCoreSenderRegisterEvent(CommandSender sender) + public MCoreSenderRegisterEvent(CommandSender sender, IdData data) { - super(sender); + super(sender, data); } } diff --git a/src/com/massivecraft/mcore/event/MCoreSenderEvent.java b/src/com/massivecraft/mcore/event/MCoreSenderRegistryEvent.java similarity index 59% rename from src/com/massivecraft/mcore/event/MCoreSenderEvent.java rename to src/com/massivecraft/mcore/event/MCoreSenderRegistryEvent.java index 4c405b24..f42e393c 100644 --- a/src/com/massivecraft/mcore/event/MCoreSenderEvent.java +++ b/src/com/massivecraft/mcore/event/MCoreSenderRegistryEvent.java @@ -2,7 +2,9 @@ package com.massivecraft.mcore.event; import org.bukkit.command.CommandSender; -public abstract class MCoreSenderEvent extends MCoreEvent +import com.massivecraft.mcore.util.IdData; + +public abstract class MCoreSenderRegistryEvent extends MCoreEvent { // -------------------------------------------- // // FIELDS @@ -11,13 +13,17 @@ public abstract class MCoreSenderEvent extends MCoreEvent private final CommandSender sender; public CommandSender getSender() { return this.sender; } + private final IdData data; + public IdData getData() { return this.data; } + // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - public MCoreSenderEvent(CommandSender sender) + public MCoreSenderRegistryEvent(CommandSender sender, IdData data) { this.sender = sender; + this.data = data; } } diff --git a/src/com/massivecraft/mcore/event/MCoreSenderUnregisterEvent.java b/src/com/massivecraft/mcore/event/MCoreSenderUnregisterEvent.java index bedf2aa6..a1d06e40 100644 --- a/src/com/massivecraft/mcore/event/MCoreSenderUnregisterEvent.java +++ b/src/com/massivecraft/mcore/event/MCoreSenderUnregisterEvent.java @@ -3,7 +3,9 @@ package com.massivecraft.mcore.event; import org.bukkit.command.CommandSender; import org.bukkit.event.HandlerList; -public class MCoreSenderUnregisterEvent extends MCoreSenderEvent +import com.massivecraft.mcore.util.IdData; + +public class MCoreSenderUnregisterEvent extends MCoreSenderRegistryEvent { // -------------------------------------------- // // REQUIRED EVENT CODE @@ -17,9 +19,9 @@ public class MCoreSenderUnregisterEvent extends MCoreSenderEvent // CONSTRUCT // -------------------------------------------- // - public MCoreSenderUnregisterEvent(CommandSender sender) + public MCoreSenderUnregisterEvent(CommandSender sender, IdData data) { - super(sender); + super(sender, data); } } diff --git a/src/com/massivecraft/mcore/event/MCoreUuidUpdateEvent.java b/src/com/massivecraft/mcore/event/MCoreUuidUpdateEvent.java new file mode 100644 index 00000000..c4b252dc --- /dev/null +++ b/src/com/massivecraft/mcore/event/MCoreUuidUpdateEvent.java @@ -0,0 +1,15 @@ +package com.massivecraft.mcore.event; + +import org.bukkit.event.HandlerList; + +public class MCoreUuidUpdateEvent extends MCoreEvent +{ + // -------------------------------------------- // + // REQUIRED EVENT CODE + // -------------------------------------------- // + + private static final HandlerList handlers = new HandlerList(); + @Override public HandlerList getHandlers() { return handlers; } + public static HandlerList getHandlerList() { return handlers; } + +} diff --git a/src/com/massivecraft/mcore/fetcher/Fetcher.java b/src/com/massivecraft/mcore/fetcher/Fetcher.java new file mode 100644 index 00000000..46542e9d --- /dev/null +++ b/src/com/massivecraft/mcore/fetcher/Fetcher.java @@ -0,0 +1,117 @@ +package com.massivecraft.mcore.fetcher; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import com.massivecraft.mcore.util.MUtil; + +public class Fetcher implements Callable> +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public static final ExecutorService ES = Executors.newFixedThreadPool(100); + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private final Collection objects; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public Fetcher(Collection objects) + { + this.objects = objects; + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Set call() throws Exception + { + return fetch(this.objects); + } + + // -------------------------------------------- // + // STATIC + // -------------------------------------------- // + + public static Set fetch(Collection objects) throws Exception + { + // Separate names and ids + final Set names = new TreeSet(String.CASE_INSENSITIVE_ORDER); + final Set ids = new HashSet(); + for (Object object : objects) + { + if (object instanceof UUID) + { + UUID id = (UUID)object; + ids.add(id); + } + else if (object instanceof String) + { + String string = (String)object; + if (MUtil.isValidPlayerName(string)) + { + names.add(string); + } + else if (MUtil.isValidUUID(string)) + { + ids.add(UUID.fromString(string)); + } + } + } + + // Create Tasks + Callable> taskName = new Callable>() + { + @Override + public Set call() throws Exception + { + return new HashSet(new FetcherByName(names).call().values()); + } + }; + + Callable> taskId = new Callable>() + { + @Override + public Set call() throws Exception + { + return new HashSet(new FetcherById(ids).call().values()); + } + }; + + final List>> tasks = new ArrayList>>(); + tasks.add(taskName); + tasks.add(taskId); + + // Invoke All Tasks + List>> futures = ES.invokeAll(tasks); + + // Merge Return Value + Set ret = new HashSet(); + for (Future> future : futures) + { + Set set = future.get(); + ret.addAll(set); + } + + return ret; + } + +} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherById.java b/src/com/massivecraft/mcore/fetcher/FetcherById.java new file mode 100644 index 00000000..7ad42c74 --- /dev/null +++ b/src/com/massivecraft/mcore/fetcher/FetcherById.java @@ -0,0 +1,75 @@ +package com.massivecraft.mcore.fetcher; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class FetcherById implements Callable> +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public static final ExecutorService ES = Executors.newFixedThreadPool(100); + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private final Collection ids; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public FetcherById(Collection ids) + { + this.ids = ids; + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Map call() throws Exception + { + return fetch(this.ids); + } + + // -------------------------------------------- // + // STATIC + // -------------------------------------------- // + + public static Map fetch(Collection ids) throws Exception + { + // Create Tasks + final List>> tasks = new ArrayList>>(); + for (UUID id : ids) + { + tasks.add(new FetcherByIdSingle(Arrays.asList(id))); + } + + // Invoke All Tasks + List>> futures = ES.invokeAll(tasks); + + // Merge Return Value + Map ret = new HashMap(); + for (Future> future : futures) + { + Map map = future.get(); + ret.putAll(map); + } + + return ret; + } + +} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherByIdSingle.java b/src/com/massivecraft/mcore/fetcher/FetcherByIdSingle.java new file mode 100644 index 00000000..c08b1c59 --- /dev/null +++ b/src/com/massivecraft/mcore/fetcher/FetcherByIdSingle.java @@ -0,0 +1,107 @@ +package com.massivecraft.mcore.fetcher; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Callable; + +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +/** + * Many thanks to evilmidget38! + * This utility class is based on his work. + * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ + */ +public class FetcherByIdSingle implements Callable> +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public final static String PROFILE_URL = "https://sessionserver.mojang.com/session/minecraft/profile/"; + public final static String KEY_NAME = "name"; + public final static String KEY_CAUSE = "cause"; + public final static String KEY_ERROR_MESSAGE = "errorMessage"; + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private final Collection ids; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public FetcherByIdSingle(Collection ids) + { + this.ids = ids; + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Map call() throws Exception + { + return fetch(this.ids); + } + + // -------------------------------------------- // + // STATIC + // -------------------------------------------- // + + public static Map fetch(Collection ids) throws Exception + { + Map ret = new HashMap(); + JSONParser jsonParser = new JSONParser(); + + for (UUID id : ids) + { + HttpURLConnection connection = createConnection(id); + InputStream inputStream = connection.getInputStream(); + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + + JSONObject response = (JSONObject) jsonParser.parse(inputStreamReader); + + inputStreamReader.close(); + inputStream.close(); + connection.disconnect(); + + String name = (String) response.get(KEY_NAME); + // if (name == null) continue; + // No... we want to add null values as well. + + String cause = (String) response.get(KEY_CAUSE); + if (cause != null && cause.length() > 0) + { + String errorMessage = (String) response.get(KEY_ERROR_MESSAGE); + throw new IllegalStateException(errorMessage); + } + + ret.put(id, new IdAndName(id, name)); + } + + return ret; + } + + private static HttpURLConnection createConnection(UUID id) throws Exception + { + URL url = new URL(PROFILE_URL + id.toString().replace("-", "")); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + connection.setUseCaches(false); + connection.setDoInput(true); + connection.setDoOutput(true); + return connection; + } + +} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdMojang.java b/src/com/massivecraft/mcore/fetcher/FetcherByName.java similarity index 53% rename from src/com/massivecraft/mcore/fetcher/FetcherPlayerIdMojang.java rename to src/com/massivecraft/mcore/fetcher/FetcherByName.java index 3531a3f9..302206e4 100644 --- a/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdMojang.java +++ b/src/com/massivecraft/mcore/fetcher/FetcherByName.java @@ -6,39 +6,33 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; -import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -/** - * Many thanks to evilmidget38! - * This utility class is based on his work. - * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ - */ -public class FetcherPlayerIdMojang implements Callable> +public class FetcherByName implements Callable> { // -------------------------------------------- // // CONSTANTS // -------------------------------------------- // - public static final int BATCH_SIZE = FetcherPlayerIdMojangSingle.MAX_PAGE_SIZE; - public static final ExecutorService ES = Executors.newCachedThreadPool(); + public static final ExecutorService ES = Executors.newFixedThreadPool(100); + public static final int BATCH_SIZE = FetcherByNameSingle.PROFILES_PER_REQUEST; // -------------------------------------------- // // FIELDS // -------------------------------------------- // - private final Collection playerNames; + private final Collection names; // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - public FetcherPlayerIdMojang(Collection playerNames) + public FetcherByName(Collection names) { - this.playerNames = playerNames; + this.names = names; } // -------------------------------------------- // @@ -46,41 +40,40 @@ public class FetcherPlayerIdMojang implements Callable> // -------------------------------------------- // @Override - public Map call() throws Exception + public Map call() throws Exception { - return fetch(this.playerNames); + return fetch(this.names); } // -------------------------------------------- // // STATIC // -------------------------------------------- // - public static Map fetch(Collection playerNames) throws Exception + public static Map fetch(Collection names) throws Exception { // Create batches List> batches = new ArrayList>(); - playerNames = new ArrayList(playerNames); - while (playerNames.size() > 0) + names = new ArrayList(names); + while (names.size() > 0) { - List batch = take(playerNames, BATCH_SIZE); + List batch = take(names, BATCH_SIZE); batches.add(batch); } // Create Tasks - final List>> tasks = new ArrayList>>(); + final List>> tasks = new ArrayList>>(); for (List batch : batches) { - tasks.add(new FetcherPlayerIdMojangSingle(batch)); + tasks.add(new FetcherByNameSingle(batch)); } // Invoke All Tasks - List>> futures = ES.invokeAll(tasks); + List>> futures = ES.invokeAll(tasks); // Merge Return Value - Map ret = new TreeMap (String.CASE_INSENSITIVE_ORDER); - for (Future> future : futures) + Map ret = new TreeMap (String.CASE_INSENSITIVE_ORDER); + for (Future> future : futures) { - ret.putAll(future.get()); } diff --git a/src/com/massivecraft/mcore/fetcher/FetcherByNameSingle.java b/src/com/massivecraft/mcore/fetcher/FetcherByNameSingle.java new file mode 100644 index 00000000..7ba62ff7 --- /dev/null +++ b/src/com/massivecraft/mcore/fetcher/FetcherByNameSingle.java @@ -0,0 +1,178 @@ +package com.massivecraft.mcore.fetcher; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.UUID; +import java.util.concurrent.Callable; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +/** + * Many thanks to evilmidget38! + * This utility class is based on his work. + * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ + */ +public class FetcherByNameSingle implements Callable> +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public final static int PROFILES_PER_REQUEST = 100; + public final static String PROFILE_URL = "https://api.mojang.com/profiles/minecraft"; + + public final static String KEY_ID = "id"; + public final static String KEY_NAME = "name"; + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private final Collection names; + private final boolean rateLimiting; + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public FetcherByNameSingle(Collection names) + { + this(names, true); + } + + public FetcherByNameSingle(Collection names, boolean rateLimiting) + { + this.names = names; + this.rateLimiting = rateLimiting; + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Map call() throws Exception + { + return fetch(this.names, this.rateLimiting); + } + + // -------------------------------------------- // + // STATIC + // -------------------------------------------- // + + public static Map fetch(Collection namesCollection) throws Exception + { + return fetch(namesCollection, true); + } + + public static Map fetch(Collection namesCollection, boolean rateLimiting) throws Exception + { + List names = new ArrayList(namesCollection); + Map ret = new TreeMap(String.CASE_INSENSITIVE_ORDER); + JSONParser jsonParser = new JSONParser(); + + int requests = (int) Math.ceil(names.size() / (double) PROFILES_PER_REQUEST); + for (int i = 0; i < requests; i++) + { + HttpURLConnection connection = createConnection(); + String body = JSONArray.toJSONString(names.subList(i * 100, Math.min((i + 1) * 100, names.size()))); + writeBody(connection, body); + InputStream inputStream = connection.getInputStream(); + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + + JSONArray array = (JSONArray) jsonParser.parse(inputStreamReader); + + inputStreamReader.close(); + inputStream.close(); + connection.disconnect(); + + for (Object profile : array) + { + JSONObject jsonProfile = (JSONObject) profile; + String id = (String) jsonProfile.get(KEY_ID); + String name = (String) jsonProfile.get(KEY_NAME); + UUID uuid = getUUID(id); + ret.put(name, new IdAndName(uuid, name)); + } + + if (rateLimiting && i != requests - 1) + { + Thread.sleep(100L); + } + } + + for (String name : names) + { + IdAndName idAndName = ret.get(name); + if (idAndName == null) idAndName = new IdAndName(null, name); + ret.put(name, idAndName); + } + + return ret; + } + + private static void writeBody(HttpURLConnection connection, String body) throws Exception + { + OutputStream stream = connection.getOutputStream(); + stream.write(body.getBytes()); + stream.flush(); + stream.close(); + } + + private static HttpURLConnection createConnection() throws Exception + { + URL url = new URL(PROFILE_URL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + connection.setUseCaches(false); + connection.setDoInput(true); + connection.setDoOutput(true); + return connection; + } + + private static UUID getUUID(String id) + { + return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" +id.substring(20, 32)); + } + + public static byte[] toBytes(UUID uuid) + { + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); + byteBuffer.putLong(uuid.getMostSignificantBits()); + byteBuffer.putLong(uuid.getLeastSignificantBits()); + return byteBuffer.array(); + } + + public static UUID fromBytes(byte[] array) + { + if (array.length != 16) + { + throw new IllegalArgumentException("Illegal byte array length: " + array.length); + } + ByteBuffer byteBuffer = ByteBuffer.wrap(array); + long mostSignificant = byteBuffer.getLong(); + long leastSignificant = byteBuffer.getLong(); + return new UUID(mostSignificant, leastSignificant); + } + + public static IdAndName get(String name) throws Exception + { + return fetch(Arrays.asList(name)).get(name); + } + +} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdCached.java b/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdCached.java deleted file mode 100644 index 1bd2ea64..00000000 --- a/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdCached.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.massivecraft.mcore.fetcher; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.UUID; -import java.util.Map.Entry; -import java.util.concurrent.Callable; - -import com.massivecraft.mcore.MCoreMPlayer; - -/** - * Many thanks to evilmidget38! - * This utility class is based on his work. - * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ - */ -public class FetcherPlayerIdCached implements Callable> -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private final Collection playerNames; - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public FetcherPlayerIdCached(Collection playerNames) - { - this.playerNames = playerNames; - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Map call() throws Exception - { - return fetch(this.playerNames); - } - - // -------------------------------------------- // - // STATIC - // -------------------------------------------- // - - public static Map fetch(Collection playerNames) throws Exception - { - Map ret = new TreeMap(String.CASE_INSENSITIVE_ORDER); - List playerNamesCopy = new ArrayList(playerNames); - - // Use Cache - Iterator iter = playerNamesCopy.iterator(); - while (iter.hasNext()) - { - String playerName = iter.next(); - MCoreMPlayer mplayer = MCoreMPlayer.get(playerName); - if (mplayer == null) continue; - ret.put(mplayer.getName(), UUID.fromString(mplayer.getId())); - iter.remove(); - } - - // Use Mojang API for the rest - if (playerNamesCopy.size() > 0) - { - try - { - Map mojangApiResult = FetcherPlayerIdMojang.fetch(playerNamesCopy); - // Add to the cache - for (Entry entry : mojangApiResult.entrySet()) - { - String name = entry.getKey(); - UUID id = entry.getValue(); - MCoreMPlayer mplayer = MCoreMPlayer.get(id, true); - mplayer.setName(name); - } - // Add to the return value - ret.putAll(mojangApiResult); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - // Return - return ret; - } - -} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdMojangSingle.java b/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdMojangSingle.java deleted file mode 100644 index 16db9863..00000000 --- a/src/com/massivecraft/mcore/fetcher/FetcherPlayerIdMojangSingle.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.massivecraft.mcore.fetcher; - -import java.io.DataOutputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.UUID; -import java.util.concurrent.Callable; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; -import org.json.simple.parser.JSONParser; - -/** - * Many thanks to evilmidget38! - * This utility class is based on his work. - * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ - */ -public class FetcherPlayerIdMojangSingle implements Callable> -{ - // -------------------------------------------- // - // CONSTANTS - // -------------------------------------------- // - - public final static String URL_BASE = "https://api.mojang.com/profiles/page/"; - public final static int MAX_PAGES = 100; - - // The maximum amount of profiles returned per page. - // Mojang might change this value. - // Thus we can not fully depend on it. - public final static int MAX_PAGE_SIZE = 50; - - public final static String KEY_PROFILES = "profiles"; - public final static String KEY_SIZE = "size"; - public final static String KEY_ID = "id"; - public final static String KEY_NAME = "name"; - public final static String KEY_AGENT = "agent"; - public final static String VALUGE_AGENT = "minecraft"; - - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private final Collection playerNames; - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public FetcherPlayerIdMojangSingle(Collection playerNames) - { - this.playerNames = playerNames; - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Map call() throws Exception - { - return fetch(this.playerNames); - } - - // -------------------------------------------- // - // STATIC - // -------------------------------------------- // - - public static Map fetch(Collection playerNames) throws Exception - { - Map ret = new TreeMap(String.CASE_INSENSITIVE_ORDER); - JSONParser jsonParser = new JSONParser(); - String body = createBody(playerNames); - for (int i = 1; i < MAX_PAGES; i++) - { - // If the return object has as many entries as player names requested we must have gotten all the info. - // This will often help us avoid the extra useless last call of a page with 0 entries. - if (ret.size() == playerNames.size()) break; - - HttpURLConnection connection = createConnection(i); - writeBody(connection, body); - JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(connection.getInputStream())); - JSONArray profiles = (JSONArray) jsonObject.get(KEY_PROFILES); - int size = ((Number) jsonObject.get(KEY_SIZE)).intValue(); - - // If the page is empty we are done - if (size == 0) break; - - for (Object profile : profiles) - { - JSONObject jsonProfile = (JSONObject) profile; - String id = (String) jsonProfile.get(KEY_ID); - String name = (String) jsonProfile.get(KEY_NAME); - UUID uuid = UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" + id.substring(20, 32)); - ret.put(name, uuid); - } - } - return ret; - } - - private static HttpURLConnection createConnection(int page) throws Exception - { - URL url = new URL(URL_BASE + page); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("POST"); - connection.setRequestProperty("Content-Type", "application/json"); - connection.setConnectTimeout(15000); - connection.setReadTimeout(15000); - connection.setUseCaches(false); - connection.setDoInput(true); - connection.setDoOutput(true); - return connection; - } - - @SuppressWarnings("unchecked") - private static String createBody(Collection playerNames) - { - List lookups = new ArrayList(); - for (String playerName : playerNames) - { - JSONObject obj = new JSONObject(); - obj.put(KEY_NAME, playerName); - obj.put(KEY_AGENT, VALUGE_AGENT); - lookups.add(obj); - } - return JSONValue.toJSONString(lookups); - } - - private static void writeBody(HttpURLConnection connection, String body) throws Exception - { - DataOutputStream writer = new DataOutputStream(connection.getOutputStream()); - writer.write(body.getBytes()); - writer.flush(); - writer.close(); - } - -} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameCached.java b/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameCached.java deleted file mode 100644 index b7a862a6..00000000 --- a/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameCached.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.massivecraft.mcore.fetcher; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.Map.Entry; -import java.util.concurrent.Callable; -import com.massivecraft.mcore.MCoreMPlayer; - -/** - * Many thanks to evilmidget38! - * This utility class is based on his work. - * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ - */ -public class FetcherPlayerNameCached implements Callable> -{ - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private final Collection playerIds; - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public FetcherPlayerNameCached(Collection playerIds) - { - this.playerIds = playerIds; - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Map call() throws Exception - { - return fetch(this.playerIds); - } - - // -------------------------------------------- // - // STATIC - // -------------------------------------------- // - - public static Map fetch(Collection playerIds) throws Exception - { - Map ret = new HashMap(); - List playerIdsCopy = new ArrayList(playerIds); - - // Use Cache - Iterator iter = playerIdsCopy.iterator(); - while (iter.hasNext()) - { - UUID playerId = iter.next(); - MCoreMPlayer mplayer = MCoreMPlayer.get(playerId); - if (mplayer == null) continue; - ret.put(playerId, mplayer.getName()); - iter.remove(); - } - - // Use Mojang API for the rest - if (playerIdsCopy.size() > 0) - { - try - { - Map mojangApiResult = FetcherPlayerNameMojang.fetch(playerIdsCopy); - // Add to the cache - for (Entry entry : mojangApiResult.entrySet()) - { - UUID id = entry.getKey(); - String name = entry.getValue(); - MCoreMPlayer mplayer = MCoreMPlayer.get(id, true); - mplayer.setName(name); - } - // Add to the return value - ret.putAll(mojangApiResult); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - // Return - return ret; - } - -} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameMojang.java b/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameMojang.java deleted file mode 100644 index 9d21faa9..00000000 --- a/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameMojang.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.massivecraft.mcore.fetcher; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -/** - * Many thanks to evilmidget38! - * This utility class is based on his work. - * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ - */ -public class FetcherPlayerNameMojang implements Callable> -{ - // -------------------------------------------- // - // CONSTANTS - // -------------------------------------------- // - - public static final ExecutorService ES = Executors.newCachedThreadPool(); - - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private final Collection playerIds; - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public FetcherPlayerNameMojang(Collection playerIds) - { - this.playerIds = playerIds; - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Map call() throws Exception - { - return fetch(this.playerIds); - } - - // -------------------------------------------- // - // STATIC - // -------------------------------------------- // - - public static Map fetch(Collection playerIds) throws Exception - { - // Create Tasks - final List>> tasks = new ArrayList>>(); - for (UUID playerId : playerIds) - { - tasks.add(new FetcherPlayerNameMojangSingle(playerId)); - } - - // Invoke All Tasks - List>> futures = ES.invokeAll(tasks); - - // Merge Return Value - Map ret = new HashMap(); - for (Future> future : futures) - { - Entry entry = future.get(); - if (entry == null) continue; - ret.put(entry.getKey(), entry.getValue()); - } - - return ret; - } - -} diff --git a/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameMojangSingle.java b/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameMojangSingle.java deleted file mode 100644 index 7b9c9405..00000000 --- a/src/com/massivecraft/mcore/fetcher/FetcherPlayerNameMojangSingle.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.massivecraft.mcore.fetcher; - -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.Map.Entry; -import java.util.AbstractMap.SimpleEntry; -import java.util.UUID; -import java.util.concurrent.Callable; - -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; - -/** - * Many thanks to evilmidget38! - * This utility class is based on his work. - * http://forums.bukkit.org/threads/player-name-uuid-fetcher.250926/ - */ -public class FetcherPlayerNameMojangSingle implements Callable> -{ - // -------------------------------------------- // - // CONSTANTS - // -------------------------------------------- // - - public final static String URL_BASE = "https://sessionserver.mojang.com/session/minecraft/profile/"; - public final static String KEY_NAME = "name"; - public final static String KEY_CAUSE = "cause"; - public final static String KEY_ERROR_MESSAGE = "errorMessage"; - - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - private final UUID playerId; - public UUID getPlayerId() { return this.playerId; } - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public FetcherPlayerNameMojangSingle(UUID playerId) - { - this.playerId = playerId; - } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Entry call() throws Exception - { - String playerName = fetch(this.playerId); - if (playerName == null) return null; - return new SimpleEntry(this.playerId, playerName); - } - - // -------------------------------------------- // - // STATIC - // -------------------------------------------- // - - public static String fetch(UUID playerId) throws Exception - { - JSONParser jsonParser = new JSONParser(); - HttpURLConnection connection = createConnection(playerId); - JSONObject response = (JSONObject) jsonParser.parse(new InputStreamReader(connection.getInputStream())); - String name = (String) response.get(KEY_NAME); - if (name == null) return null; - String cause = (String) response.get(KEY_CAUSE); - if (cause != null && cause.length() > 0) - { - String errorMessage = (String) response.get(KEY_ERROR_MESSAGE); - throw new IllegalStateException(errorMessage); - } - return name; - } - - private static HttpURLConnection createConnection(UUID playerId) throws Exception - { - URL url = new URL(URL_BASE + playerId.toString().replace("-", "")); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setConnectTimeout(15000); - connection.setReadTimeout(15000); - connection.setUseCaches(false); - connection.setDoInput(true); - connection.setDoOutput(true); - return connection; - } - -} diff --git a/src/com/massivecraft/mcore/fetcher/IdAndName.java b/src/com/massivecraft/mcore/fetcher/IdAndName.java new file mode 100644 index 00000000..16a24d11 --- /dev/null +++ b/src/com/massivecraft/mcore/fetcher/IdAndName.java @@ -0,0 +1,66 @@ +package com.massivecraft.mcore.fetcher; + +import java.util.UUID; + +public class IdAndName +{ + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private UUID id; + public UUID getId() { return this.id; } + + private String name; + public String getName() { return this.name; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public IdAndName(UUID id, String name) + { + if (id == null && name == null) + { + throw new NullPointerException("one of id and name can be null but not both!"); + } + + this.id = id; + this.name = name; + } + + // -------------------------------------------- // + // HASH CODE & EQUALS + // -------------------------------------------- // + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) return true; + if (obj == null) return false; + if (!(obj instanceof IdAndName)) return false; + IdAndName other = (IdAndName) obj; + if (id == null) + { + if (other.id != null) return false; + } + else if (!id.equals(other.id)) return false; + if (name == null) + { + if (other.name != null) return false; + } + else if (!name.equals(other.name)) return false; + return true; + } + +} diff --git a/src/com/massivecraft/mcore/mcorecmd/CmdMCore.java b/src/com/massivecraft/mcore/mcorecmd/CmdMCore.java index 17bddc59..2c896527 100644 --- a/src/com/massivecraft/mcore/mcorecmd/CmdMCore.java +++ b/src/com/massivecraft/mcore/mcorecmd/CmdMCore.java @@ -15,6 +15,7 @@ public class CmdMCore extends MCommand public CmdMCoreUsys cmdMCoreUsys = new CmdMCoreUsys(); public CmdMCoreMStore cmdMCoreMStore = new CmdMCoreMStore(); public CmdMCoreId cmdMCoreId = new CmdMCoreId(); + public CmdMCoreTest cmdMCoreTest = new CmdMCoreTest(); public CmdMCoreHearsound cmdMCoreHearsound = new CmdMCoreHearsound(); public VersionCommand cmdMCoreVersion = new VersionCommand(MCore.get(), MCorePerm.VERSION.node, "v", "version"); @@ -28,6 +29,7 @@ public class CmdMCore extends MCommand this.addSubCommand(this.cmdMCoreUsys); this.addSubCommand(this.cmdMCoreMStore); this.addSubCommand(this.cmdMCoreId); + this.addSubCommand(this.cmdMCoreTest); this.addSubCommand(this.cmdMCoreHearsound); this.addSubCommand(this.cmdMCoreVersion); diff --git a/src/com/massivecraft/mcore/mcorecmd/CmdMCoreTest.java b/src/com/massivecraft/mcore/mcorecmd/CmdMCoreTest.java new file mode 100644 index 00000000..0f547c8d --- /dev/null +++ b/src/com/massivecraft/mcore/mcorecmd/CmdMCoreTest.java @@ -0,0 +1,37 @@ +package com.massivecraft.mcore.mcorecmd; + +import com.massivecraft.mcore.MCorePerm; +import com.massivecraft.mcore.cmd.MCommand; +import com.massivecraft.mcore.cmd.VisibilityMode; +import com.massivecraft.mcore.cmd.req.ReqHasPerm; +import com.massivecraft.mcore.util.IdUtil; + +public class CmdMCoreTest extends MCommand +{ + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public CmdMCoreTest() + { + // Aliases + this.addAliases("test"); + + // Requirements + this.addRequirements(ReqHasPerm.get(MCorePerm.TEST.node)); + + // VisibilityMode + this.setVisibilityMode(VisibilityMode.SECRET); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public void perform() + { + IdUtil.isOnline(IdUtil.CONSOLE_ID); + } + +} diff --git a/src/com/massivecraft/mcore/mixin/CommandMixin.java b/src/com/massivecraft/mcore/mixin/CommandMixin.java index 34e2c31d..0a96cd77 100644 --- a/src/com/massivecraft/mcore/mixin/CommandMixin.java +++ b/src/com/massivecraft/mcore/mixin/CommandMixin.java @@ -1,13 +1,8 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - -import com.massivecraft.mcore.store.SenderEntity; - public interface CommandMixin { - public boolean dispatchCommand(CommandSender sender, String commandLine); - public boolean dispatchCommand(SenderEntity sender, String commandLine); - public boolean dispatchCommand(String senderId, String commandLine); - public boolean dispatchCommand(String presentId, String senderId, String commandLine); // This one is non-abstract + public boolean dispatchCommand(Object senderObject, String commandLine); + public boolean dispatchCommand(Object presentObject, Object senderObject, String commandLine); // This one is non-abstract + } diff --git a/src/com/massivecraft/mcore/mixin/CommandMixinAbstract.java b/src/com/massivecraft/mcore/mixin/CommandMixinAbstract.java index 4c1e2ae0..e4af9d90 100644 --- a/src/com/massivecraft/mcore/mixin/CommandMixinAbstract.java +++ b/src/com/massivecraft/mcore/mixin/CommandMixinAbstract.java @@ -1,27 +1,10 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - -import com.massivecraft.mcore.store.SenderEntity; -import com.massivecraft.mcore.util.SenderUtil; - public abstract class CommandMixinAbstract implements CommandMixin { @Override - public boolean dispatchCommand(CommandSender sender, String commandLine) + public boolean dispatchCommand(Object senderObject, String commandLine) { - return this.dispatchCommand(SenderUtil.getSenderId(sender), SenderUtil.getSenderId(sender), commandLine); - } - - @Override - public boolean dispatchCommand(SenderEntity sender, String commandLine) - { - return this.dispatchCommand(sender.getId(), sender.getId(), commandLine); - } - - @Override - public boolean dispatchCommand(String senderId, String commandLine) - { - return this.dispatchCommand(senderId, senderId, commandLine); + return this.dispatchCommand(senderObject, senderObject, commandLine); } } diff --git a/src/com/massivecraft/mcore/mixin/CommandMixinDefault.java b/src/com/massivecraft/mcore/mixin/CommandMixinDefault.java index 5a967866..dc534c6f 100644 --- a/src/com/massivecraft/mcore/mixin/CommandMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/CommandMixinDefault.java @@ -3,7 +3,7 @@ package com.massivecraft.mcore.mixin; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class CommandMixinDefault extends CommandMixinAbstract { @@ -19,14 +19,14 @@ public class CommandMixinDefault extends CommandMixinAbstract // -------------------------------------------- // @Override - public boolean dispatchCommand(String presentId, String senderId, String commandLine) + public boolean dispatchCommand(Object presentObject, Object senderObject, String commandLine) { // Additional enforced presence - CommandSender present = SenderUtil.getSender(presentId); + CommandSender present = IdUtil.getSender(presentObject); if (present == null) return false; // We must then of course have the presence of the sender - CommandSender sender = SenderUtil.getSender(senderId); + CommandSender sender = IdUtil.getSender(senderObject); if (sender == null) return false; // Great! Let's do it! diff --git a/src/com/massivecraft/mcore/mixin/DisplayNameMixin.java b/src/com/massivecraft/mcore/mixin/DisplayNameMixin.java index 1250c5af..550767e0 100644 --- a/src/com/massivecraft/mcore/mixin/DisplayNameMixin.java +++ b/src/com/massivecraft/mcore/mixin/DisplayNameMixin.java @@ -1,11 +1,7 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - public interface DisplayNameMixin { - public String getDisplayName(String senderId); - public void setDisplayName(String senderId, String displayName); - public String getDisplayName(CommandSender sender); - public void setDisplayName(CommandSender sender, String displayName); + public String getDisplayName(Object senderObject); + public void setDisplayName(Object senderObject, String displayName); } diff --git a/src/com/massivecraft/mcore/mixin/DisplayNameMixinAbstract.java b/src/com/massivecraft/mcore/mixin/DisplayNameMixinAbstract.java index 23430730..bdec7e8b 100644 --- a/src/com/massivecraft/mcore/mixin/DisplayNameMixinAbstract.java +++ b/src/com/massivecraft/mcore/mixin/DisplayNameMixinAbstract.java @@ -1,20 +1,6 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - -import com.massivecraft.mcore.util.SenderUtil; - public abstract class DisplayNameMixinAbstract implements DisplayNameMixin { - @Override - public String getDisplayName(CommandSender sender) - { - return this.getDisplayName(SenderUtil.getSenderId(sender)); - } - @Override - public void setDisplayName(CommandSender sender, String displayName) - { - this.setDisplayName(SenderUtil.getSenderId(sender), displayName); - } } \ No newline at end of file diff --git a/src/com/massivecraft/mcore/mixin/DisplayNameMixinDefault.java b/src/com/massivecraft/mcore/mixin/DisplayNameMixinDefault.java index 61b89d69..b032bfc5 100644 --- a/src/com/massivecraft/mcore/mixin/DisplayNameMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/DisplayNameMixinDefault.java @@ -6,7 +6,7 @@ import java.util.TreeMap; import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class DisplayNameMixinDefault extends DisplayNameMixinAbstract { @@ -30,27 +30,34 @@ public class DisplayNameMixinDefault extends DisplayNameMixinAbstract // -------------------------------------------- // @Override - public String getDisplayName(String senderId) + public String getDisplayName(Object senderObject) { + String senderId = IdUtil.getId(senderObject); if (senderId == null) return null; - // Try Our Map + // Our Map String ret = this.idToDisplayName.get(senderId); - // Try Bukkit + // Bukkit if (ret == null) { - Player player = SenderUtil.getPlayer(senderId); + Player player = IdUtil.getPlayer(senderObject); if (player != null) { ret = player.getDisplayName(); } } - // Try Fixed Id + // Fixed Name if (ret == null) { - ret = Mixin.tryFix(senderId); + ret = IdUtil.getName(senderObject); + } + + // Id Fallback + if (ret == null) + { + ret = senderId; } // Ensure Colored @@ -63,8 +70,11 @@ public class DisplayNameMixinDefault extends DisplayNameMixinAbstract } @Override - public void setDisplayName(String senderId, String displayName) + public void setDisplayName(Object senderObject, String displayName) { + String senderId = IdUtil.getId(senderObject); + if (senderId == null) return; + if (displayName == null) { this.idToDisplayName.remove(senderId); @@ -74,9 +84,9 @@ public class DisplayNameMixinDefault extends DisplayNameMixinAbstract this.idToDisplayName.put(senderId, displayName); } - Player player = SenderUtil.getPlayer(senderId); + Player player = IdUtil.getPlayer(senderObject); if (player == null) return; - player.setDisplayName(this.getDisplayName(senderId)); + player.setDisplayName(this.getDisplayName(senderObject)); } } \ No newline at end of file diff --git a/src/com/massivecraft/mcore/mixin/KickMixin.java b/src/com/massivecraft/mcore/mixin/KickMixin.java index b9de3c2e..8b7d471f 100644 --- a/src/com/massivecraft/mcore/mixin/KickMixin.java +++ b/src/com/massivecraft/mcore/mixin/KickMixin.java @@ -1,12 +1,7 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - public interface KickMixin { - public boolean kick(CommandSender sender); - public boolean kick(String senderId); - - public boolean kick(CommandSender sender, String message); - public boolean kick(String senderId, String message); + public boolean kick(Object senderObject); + public boolean kick(Object senderObject, String message); } diff --git a/src/com/massivecraft/mcore/mixin/KickMixinAbstract.java b/src/com/massivecraft/mcore/mixin/KickMixinAbstract.java index 641d59ef..e02789b8 100644 --- a/src/com/massivecraft/mcore/mixin/KickMixinAbstract.java +++ b/src/com/massivecraft/mcore/mixin/KickMixinAbstract.java @@ -1,18 +1,10 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - public abstract class KickMixinAbstract implements KickMixin { @Override - public boolean kick(CommandSender sender) + public boolean kick(Object senderObject) { - return this.kick(sender, null); - } - - @Override - public boolean kick(String senderId) - { - return this.kick(senderId, null); + return this.kick(senderObject, null); } } diff --git a/src/com/massivecraft/mcore/mixin/KickMixinDefault.java b/src/com/massivecraft/mcore/mixin/KickMixinDefault.java index c7ff0f3f..4574bc6d 100644 --- a/src/com/massivecraft/mcore/mixin/KickMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/KickMixinDefault.java @@ -1,9 +1,8 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class KickMixinDefault extends KickMixinAbstract { @@ -19,18 +18,9 @@ public class KickMixinDefault extends KickMixinAbstract // -------------------------------------------- // @Override - public boolean kick(CommandSender sender, String message) + public boolean kick(Object senderObject, String message) { - Player player = SenderUtil.getAsPlayer(sender); - if (player == null) return false; - player.kickPlayer(message); - return true; - } - - @Override - public boolean kick(String senderId, String message) - { - Player player = SenderUtil.getPlayer(senderId); + Player player = IdUtil.getPlayer(senderObject); if (player == null) return false; player.kickPlayer(message); return true; diff --git a/src/com/massivecraft/mcore/mixin/ListNameMixin.java b/src/com/massivecraft/mcore/mixin/ListNameMixin.java index 59f389f8..8805d93e 100644 --- a/src/com/massivecraft/mcore/mixin/ListNameMixin.java +++ b/src/com/massivecraft/mcore/mixin/ListNameMixin.java @@ -1,11 +1,7 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - public interface ListNameMixin { - public String getListName(String senderId); - public void setListName(String senderId, String listName); - public String getListName(CommandSender sender); - public void setListName(CommandSender sender, String listName); + public String getListName(Object senderObject); + public void setListName(Object senderObject, String listName); } diff --git a/src/com/massivecraft/mcore/mixin/ListNameMixinAbstract.java b/src/com/massivecraft/mcore/mixin/ListNameMixinAbstract.java index a7897da0..82fbfb44 100644 --- a/src/com/massivecraft/mcore/mixin/ListNameMixinAbstract.java +++ b/src/com/massivecraft/mcore/mixin/ListNameMixinAbstract.java @@ -1,20 +1,6 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - -import com.massivecraft.mcore.util.SenderUtil; - public abstract class ListNameMixinAbstract implements ListNameMixin { - @Override - public String getListName(CommandSender sender) - { - return this.getListName(SenderUtil.getSenderId(sender)); - } - @Override - public void setListName(CommandSender sender, String listName) - { - this.setListName(SenderUtil.getSenderId(sender), listName); - } } \ No newline at end of file diff --git a/src/com/massivecraft/mcore/mixin/ListNameMixinDefault.java b/src/com/massivecraft/mcore/mixin/ListNameMixinDefault.java index 9c0a511e..60f6ebd6 100644 --- a/src/com/massivecraft/mcore/mixin/ListNameMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/ListNameMixinDefault.java @@ -6,7 +6,7 @@ import java.util.TreeMap; import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class ListNameMixinDefault extends ListNameMixinAbstract { @@ -30,27 +30,34 @@ public class ListNameMixinDefault extends ListNameMixinAbstract // -------------------------------------------- // @Override - public String getListName(String senderId) + public String getListName(Object senderObject) { + String senderId = IdUtil.getId(senderObject); if (senderId == null) return null; - // Try Our Map + // Our Map String ret = this.idToListName.get(senderId); - // Try Bukkit + // Bukkit if (ret == null) { - Player player = SenderUtil.getPlayer(senderId); + Player player = IdUtil.getPlayer(senderObject); if (player != null) { ret = player.getPlayerListName(); } } - // Try Fixed Id + // Fixed Name if (ret == null) { - ret = Mixin.tryFix(senderId); + ret = IdUtil.getName(senderObject); + } + + // Id Fallback + if (ret == null) + { + ret = senderId; } // Ensure Colored @@ -63,8 +70,11 @@ public class ListNameMixinDefault extends ListNameMixinAbstract } @Override - public void setListName(String senderId, String listName) + public void setListName(Object senderObject, String listName) { + String senderId = IdUtil.getId(senderObject); + if (senderId == null) return; + if (listName == null) { this.idToListName.remove(senderId); @@ -74,9 +84,9 @@ public class ListNameMixinDefault extends ListNameMixinAbstract this.idToListName.put(senderId, listName); } - Player player = SenderUtil.getPlayer(senderId); + Player player = IdUtil.getPlayer(senderObject); if (player == null) return; - player.setPlayerListName(this.getListName(senderId)); + player.setPlayerListName(this.getListName(senderObject)); } } \ No newline at end of file diff --git a/src/com/massivecraft/mcore/mixin/MessageMixin.java b/src/com/massivecraft/mcore/mixin/MessageMixin.java index ba52ec47..0bf664f6 100644 --- a/src/com/massivecraft/mcore/mixin/MessageMixin.java +++ b/src/com/massivecraft/mcore/mixin/MessageMixin.java @@ -13,46 +13,37 @@ public interface MessageMixin // -------------------------------------------- // // All - public boolean message(String message); - public boolean message(String... messages); - public boolean message(Collection messages); + public boolean messageAll(String message); + public boolean messageAll(String... messages); + public boolean messageAll(Collection messages); // Predictate - public boolean message(Predictate predictate, String message); - public boolean message(Predictate predictate, String... messages); - public boolean message(Predictate predictate, Collection messages); + public boolean messagePredictate(Predictate predictate, String message); + public boolean messagePredictate(Predictate predictate, String... messages); + public boolean messagePredictate(Predictate predictate, Collection messages); // One - public boolean message(CommandSender sendee, String message); - public boolean message(CommandSender sendee, String... messages); - public boolean message(CommandSender sendee, Collection messages); - - // One by id - public boolean message(String sendeeId, String message); - public boolean message(String sendeeId, String... messages); - public boolean message(String sendeeId, Collection messages); + public boolean messageOne(Object sendeeObject, String message); + public boolean messageOne(Object sendeeObject, String... messages); + public boolean messageOne(Object sendeeObject, Collection messages); // -------------------------------------------- // // PARSE MESSAGE // -------------------------------------------- // // All - public boolean msg(String msg); - public boolean msg(String msg, Object... args); - public boolean msg(Collection msgs); + public boolean msgAll(String msg); + public boolean msgAll(String msg, Object... args); + public boolean msgAll(Collection msgs); // Predictate - public boolean msg(Predictate predictate, String msg); - public boolean msg(Predictate predictate, String msg, Object... args); - public boolean msg(Predictate predictate, Collection msgs); + public boolean msgPredictate(Predictate predictate, String msg); + public boolean msgPredictate(Predictate predictate, String msg, Object... args); + public boolean msgPredictate(Predictate predictate, Collection msgs); // One - public boolean msg(CommandSender sendee, String msg); - public boolean msg(CommandSender sendee, String msg, Object... args); - public boolean msg(CommandSender sendee, Collection msgs); - - // One by id - public boolean msg(String sendeeId, String msg); - public boolean msg(String sendeeId, String msg, Object... args); - public boolean msg(String sendeeId, Collection msgs); + public boolean msgOne(Object sendeeObject, String msg); + public boolean msgOne(Object sendeeObject, String msg, Object... args); + public boolean msgOne(Object sendeeObject, Collection msgs); + } diff --git a/src/com/massivecraft/mcore/mixin/MessageMixinAbstract.java b/src/com/massivecraft/mcore/mixin/MessageMixinAbstract.java index 3324915c..274a4c4f 100644 --- a/src/com/massivecraft/mcore/mixin/MessageMixinAbstract.java +++ b/src/com/massivecraft/mcore/mixin/MessageMixinAbstract.java @@ -17,54 +17,41 @@ public abstract class MessageMixinAbstract implements MessageMixin // All @Override - public boolean message(String message) + public boolean messageAll(String message) { - return this.message(MUtil.list(message)); + return this.messageAll(MUtil.list(message)); } @Override - public boolean message(String... messages) + public boolean messageAll(String... messages) { - return this.message(Arrays.asList(messages)); + return this.messageAll(Arrays.asList(messages)); } // Predictate @Override - public boolean message(Predictate predictate, String message) + public boolean messagePredictate(Predictate predictate, String message) { - return this.message(predictate, MUtil.list(message)); + return this.messagePredictate(predictate, MUtil.list(message)); } @Override - public boolean message(Predictate predictate, String... messages) + public boolean messagePredictate(Predictate predictate, String... messages) { - return this.message(predictate, Arrays.asList(messages)); + return this.messagePredictate(predictate, Arrays.asList(messages)); } // One @Override - public boolean message(CommandSender sendee, String message) + public boolean messageOne(Object sendeeObject, String message) { - return this.message(sendee, MUtil.list(message)); + return this.messageOne(sendeeObject, MUtil.list(message)); } @Override - public boolean message(CommandSender sendee, String... messages) + public boolean messageOne(Object sendeeObject, String... messages) { - return this.message(sendee, Arrays.asList(messages)); - } - - // One by id - @Override - public boolean message(String sendeeId, String message) - { - return this.message(sendeeId, MUtil.list(message)); - } - - @Override - public boolean message(String sendeeId, String... messages) - { - return this.message(sendeeId, Arrays.asList(messages)); + return this.messageOne(sendeeObject, Arrays.asList(messages)); } // -------------------------------------------- // @@ -74,78 +61,59 @@ public abstract class MessageMixinAbstract implements MessageMixin // All @Override - public boolean msg(String msg) + public boolean msgAll(String msg) { - return this.message(Txt.parse(msg)); + return this.messageAll(Txt.parse(msg)); } @Override - public boolean msg(String msg, Object... args) + public boolean msgAll(String msg, Object... args) { - return this.message(Txt.parse(msg, args)); + return this.messageAll(Txt.parse(msg, args)); } @Override - public boolean msg(Collection msgs) + public boolean msgAll(Collection msgs) { - return this.message(Txt.parse(msgs)); + return this.messageAll(Txt.parse(msgs)); } // Predictate @Override - public boolean msg(Predictate predictate, String msg) + public boolean msgPredictate(Predictate predictate, String msg) { - return this.message(predictate, Txt.parse(msg)); + return this.messagePredictate(predictate, Txt.parse(msg)); } @Override - public boolean msg(Predictate predictate, String msg, Object... args) + public boolean msgPredictate(Predictate predictate, String msg, Object... args) { - return this.message(predictate, Txt.parse(msg, args)); + return this.messagePredictate(predictate, Txt.parse(msg, args)); } @Override - public boolean msg(Predictate predictate, Collection msgs) + public boolean msgPredictate(Predictate predictate, Collection msgs) { - return this.message(predictate, Txt.parse(msgs)); + return this.messagePredictate(predictate, Txt.parse(msgs)); } // One @Override - public boolean msg(CommandSender sendee, String msg) + public boolean msgOne(Object sendeeObject, String msg) { - return this.message(sendee, Txt.parse(msg)); + return this.messageOne(sendeeObject, Txt.parse(msg)); } @Override - public boolean msg(CommandSender sendee, String msg, Object... args) + public boolean msgOne(Object sendeeObject, String msg, Object... args) { - return this.message(sendee, Txt.parse(msg, args)); + return this.messageOne(sendeeObject, Txt.parse(msg, args)); } @Override - public boolean msg(CommandSender sendee, Collection msgs) + public boolean msgOne(Object sendeeObject, Collection msgs) { - return this.message(sendee, Txt.parse(msgs)); - } - - // One by id - @Override - public boolean msg(String sendeeId, String msg) - { - return this.message(sendeeId, Txt.parse(msg)); - } - - @Override - public boolean msg(String sendeeId, String msg, Object... args) - { - return this.message(sendeeId, Txt.parse(msg, args)); - } - - @Override - public boolean msg(String sendeeId, Collection msgs) - { - return this.message(sendeeId, Txt.parse(msgs)); + return this.messageOne(sendeeObject, Txt.parse(msgs)); } } diff --git a/src/com/massivecraft/mcore/mixin/MessageMixinDefault.java b/src/com/massivecraft/mcore/mixin/MessageMixinDefault.java index 99af186f..506facc5 100644 --- a/src/com/massivecraft/mcore/mixin/MessageMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/MessageMixinDefault.java @@ -5,7 +5,7 @@ import java.util.Collection; import org.bukkit.command.CommandSender; import com.massivecraft.mcore.Predictate; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class MessageMixinDefault extends MessageMixinAbstract { @@ -21,44 +21,37 @@ public class MessageMixinDefault extends MessageMixinAbstract // -------------------------------------------- // @Override - public boolean message(Collection messages) + public boolean messageAll(Collection messages) { if (messages == null) return false; - for (CommandSender sender : SenderUtil.getOnlineSenders()) + for (CommandSender sender : IdUtil.getOnlineSenders()) { - this.message(sender, messages); + this.messageOne(sender, messages); } return true; } @Override - public boolean message(Predictate predictate, Collection messages) + public boolean messagePredictate(Predictate predictate, Collection messages) { if (predictate == null) return false; if (messages == null) return false; - for (CommandSender sender : SenderUtil.getOnlineSenders()) + for (CommandSender sender : IdUtil.getOnlineSenders()) { if (!predictate.apply(sender)) continue; - this.message(sender, messages); + this.messageOne(sender, messages); } return true; } @Override - public boolean message(CommandSender sendee, Collection messages) + public boolean messageOne(Object sendeeObject, Collection messages) { + CommandSender sendee = IdUtil.getSender(sendeeObject); if (sendee == null) return false; if (messages == null) return false; sendee.sendMessage(messages.toArray(new String[0])); return true; } - - @Override - public boolean message(String sendeeId, Collection messages) - { - if (sendeeId == null) return false; - if (messages == null) return false; - return this.message(SenderUtil.getSender(sendeeId), messages); - } } diff --git a/src/com/massivecraft/mcore/mixin/Mixin.java b/src/com/massivecraft/mcore/mixin/Mixin.java index c0b2ee10..cc7752eb 100644 --- a/src/com/massivecraft/mcore/mixin/Mixin.java +++ b/src/com/massivecraft/mcore/mixin/Mixin.java @@ -2,7 +2,6 @@ package com.massivecraft.mcore.mixin; import java.util.Collection; import java.util.List; -import java.util.Set; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -46,10 +45,6 @@ public class Mixin public static VisibilityMixin getVisibilityMixin() { return visibilityMixin; } public static void setVisibilityMixin(VisibilityMixin val) { visibilityMixin = val; } - private static SenderIdMixin senderIdMixin = SenderIdMixinDefault.get(); - public static SenderIdMixin getSenderIdMixin() { return senderIdMixin; } - public static void setSenderIdMixin(SenderIdMixin val) { senderIdMixin = val; } - private static TeleportMixin teleportMixin = TeleportMixinDefault.get(); public static TeleportMixin getTeleportMixin() { return teleportMixin; } public static void setTeleportMixin(TeleportMixin val) { teleportMixin = val; } @@ -128,24 +123,14 @@ public class Mixin // STATIC EXPOSE: DISPLAY NAME // -------------------------------------------- // - public static String getDisplayName(String senderId) + public static String getDisplayName(Object senderObject) { - return getDisplayNameMixin().getDisplayName(senderId); + return getDisplayNameMixin().getDisplayName(senderObject); } - public static void setDisplayName(String senderId, String displayName) + public static void setDisplayName(Object senderObject, String displayName) { - getDisplayNameMixin().setDisplayName(senderId, displayName); - } - - public static String getDisplayName(CommandSender sender) - { - return getDisplayNameMixin().getDisplayName(sender); - } - - public static void setDisplayName(CommandSender sender, String displayName) - { - getDisplayNameMixin().setDisplayName(sender, displayName); + getDisplayNameMixin().setDisplayName(senderObject, displayName); } // -------------------------------------------- // @@ -176,103 +161,48 @@ public class Mixin // STATIC EXPOSE: SENDER PS // -------------------------------------------- // - public static PS getSenderPs(String senderId) + public static PS getSenderPs(Object senderObject) { - return getSenderPsMixin().getSenderPs(senderId); + return getSenderPsMixin().getSenderPs(senderObject); } - public static void setSenderPs(String senderId, PS ps) + public static void setSenderPs(Object senderObject, PS ps) { - getSenderPsMixin().setSenderPs(senderId, ps); + getSenderPsMixin().setSenderPs(senderObject, ps); } // -------------------------------------------- // // STATIC EXPOSE: PLAYED // -------------------------------------------- // - public static boolean isOnline(String senderId) + public static boolean isOnline(Object senderObject) { - return getPlayedMixin().isOnline(senderId); + return getPlayedMixin().isOnline(senderObject); } - public static boolean isOffline(String senderId) + public static boolean isOffline(Object senderObject) { - return getPlayedMixin().isOffline(senderId); + return getPlayedMixin().isOffline(senderObject); } - public static Long getLastPlayed(String senderId) + public static Long getLastPlayed(Object senderObject) { - return getPlayedMixin().getLastPlayed(senderId); + return getPlayedMixin().getLastPlayed(senderObject); } - public static Long getFirstPlayed(String senderId) + public static Long getFirstPlayed(Object senderObject) { - return getPlayedMixin().getFirstPlayed(senderId); + return getPlayedMixin().getFirstPlayed(senderObject); } - public static boolean hasPlayedBefore(String senderId) + public static boolean hasPlayedBefore(Object senderObject) { - return getPlayedMixin().hasPlayedBefore(senderId); + return getPlayedMixin().hasPlayedBefore(senderObject); } // -------------------------------------------- // // STATIC EXPOSE: VISIBILITY // -------------------------------------------- // - public static boolean canSee(String watcherId, String watcheeId) + public static boolean canSee(Object watcherObject, Object watcheeObject) { - return getVisibilityMixin().canSee(watcherId, watcheeId); - } - public static boolean canSee(CommandSender watcher, String watcheeId) - { - return getVisibilityMixin().canSee(watcher, watcheeId); - } - public static boolean canSee(String watcherId, CommandSender watchee) - { - return getVisibilityMixin().canSee(watcherId, watchee); - } - public static boolean canSee(CommandSender watcher, CommandSender watchee) - { - return getVisibilityMixin().canSee(watcher, watchee); - } - - // -------------------------------------------- // - // STATIC EXPOSE: SENDER ID - // -------------------------------------------- // - - public static String reqFix(String senderId) - { - return getSenderIdMixin().reqFix(senderId); - } - public static String tryFix(String senderId) - { - return getSenderIdMixin().tryFix(senderId); - } - public static boolean canFix(String senderId) - { - return getSenderIdMixin().canFix(senderId); - } - - public static Set getAllSenderIds() - { - return getSenderIdMixin().getAllSenderIds(); - } - public static Set getOnlineSenderIds() - { - return getSenderIdMixin().getOnlineSenderIds(); - } - public static Set getOfflineSenderIds() - { - return getSenderIdMixin().getOfflineSenderIds(); - } - - public static Set getAllPlayerIds() - { - return getSenderIdMixin().getAllPlayerIds(); - } - public static Set getOnlinePlayerIds() - { - return getSenderIdMixin().getOnlinePlayerIds(); - } - public static Set getOfflinePlayerIds() - { - return getSenderIdMixin().getOfflinePlayerIds(); + return getVisibilityMixin().canSee(watcherObject, watcheeObject); } // -------------------------------------------- // @@ -284,274 +214,94 @@ public class Mixin return getTeleportMixin().isCausedByMixin(event); } - // CommandSender & PS - public static void teleport(CommandSender teleportee, PS to) throws TeleporterException + // PS + public static void teleport(Object teleporteeObject, PS to) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to); + getTeleportMixin().teleport(teleporteeObject, to); } - public static void teleport(CommandSender teleportee, PS to, String desc) throws TeleporterException + public static void teleport(Object teleporteeObject, PS to, String desc) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc); + getTeleportMixin().teleport(teleporteeObject, to, desc); } - public static void teleport(CommandSender teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException + public static void teleport(Object teleporteeObject, PS to, String desc, Permissible delayPermissible) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); + getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); } - public static void teleport(CommandSender teleportee, PS to, String desc, int delaySeconds) throws TeleporterException + public static void teleport(Object teleporteeObject, PS to, String desc, int delaySeconds) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); + getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); } - // CommandSender & CommandSender - public static void teleport(CommandSender teleportee, CommandSender to) throws TeleporterException + // CommandSender + public static void teleport(Object teleporteeObject, CommandSender to) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to); + getTeleportMixin().teleport(teleporteeObject, to); } - public static void teleport(CommandSender teleportee, CommandSender to, String desc) throws TeleporterException + public static void teleport(Object teleporteeObject, CommandSender to, String desc) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc); + getTeleportMixin().teleport(teleporteeObject, to, desc); } - public static void teleport(CommandSender teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException + public static void teleport(Object teleporteeObject, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); + getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); } - public static void teleport(CommandSender teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException + public static void teleport(Object teleporteeObject, CommandSender to, String desc, int delaySeconds) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); + getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); } - // CommandSender & SenderEntity - public static void teleport(CommandSender teleportee, SenderEntity to) throws TeleporterException + // SenderEntity + public static void teleport(Object teleporteeObject, SenderEntity to) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to); + getTeleportMixin().teleport(teleporteeObject, to); } - public static void teleport(CommandSender teleportee, SenderEntity to, String desc) throws TeleporterException + public static void teleport(Object teleporteeObject, SenderEntity to, String desc) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc); + getTeleportMixin().teleport(teleporteeObject, to, desc); } - public static void teleport(CommandSender teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException + public static void teleport(Object teleporteeObject, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); + getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); } - public static void teleport(CommandSender teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException + public static void teleport(Object teleporteeObject, SenderEntity to, String desc, int delaySeconds) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); + getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); } - // CommandSender & String - public static void teleport(CommandSender teleportee, String to) throws TeleporterException + // String + public static void teleport(Object teleporteeObject, String to) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to); + getTeleportMixin().teleport(teleporteeObject, to); } - public static void teleport(CommandSender teleportee, String to, String desc) throws TeleporterException + public static void teleport(Object teleporteeObject, String to, String desc) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc); + getTeleportMixin().teleport(teleporteeObject, to, desc); } - public static void teleport(CommandSender teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException + public static void teleport(Object teleporteeObject, String to, String desc, Permissible delayPermissible) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); + getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); } - public static void teleport(CommandSender teleportee, String to, String desc, int delaySeconds) throws TeleporterException + public static void teleport(Object teleporteeObject, String to, String desc, int delaySeconds) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); + getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); } - // CommandSender & PSGetter - public static void teleport(CommandSender teleportee, PSGetter to) throws TeleporterException + // PSGetter + public static void teleport(Object teleporteeObject, PSGetter to) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to); + getTeleportMixin().teleport(teleporteeObject, to); } - public static void teleport(CommandSender teleportee, PSGetter to, String desc) throws TeleporterException + public static void teleport(Object teleporteeObject, PSGetter to, String desc) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc); + getTeleportMixin().teleport(teleporteeObject, to, desc); } - public static void teleport(CommandSender teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException + public static void teleport(Object teleporteeObject, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); + getTeleportMixin().teleport(teleporteeObject, to, desc, delayPermissible); } - public static void teleport(CommandSender teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException + public static void teleport(Object teleporteeObject, PSGetter to, String desc, int delaySeconds) throws TeleporterException { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // SenderEntity & PS - public static void teleport(SenderEntity teleportee, PS to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(SenderEntity teleportee, PS to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(SenderEntity teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(SenderEntity teleportee, PS to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // SenderEntity & CommandSender - public static void teleport(SenderEntity teleportee, CommandSender to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(SenderEntity teleportee, CommandSender to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(SenderEntity teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(SenderEntity teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // SenderEntity & SenderEntity - public static void teleport(SenderEntity teleportee, SenderEntity to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(SenderEntity teleportee, SenderEntity to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(SenderEntity teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(SenderEntity teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // SenderEntity & String - public static void teleport(SenderEntity teleportee, String to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(SenderEntity teleportee, String to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(SenderEntity teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(SenderEntity teleportee, String to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // SenderEntity & PSGetter - public static void teleport(SenderEntity teleportee, PSGetter to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(SenderEntity teleportee, PSGetter to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(SenderEntity teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(SenderEntity teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // String & PS - public static void teleport(String teleportee, PS to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(String teleportee, PS to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(String teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(String teleportee, PS to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // String & CommandSender - public static void teleport(String teleportee, CommandSender to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(String teleportee, CommandSender to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(String teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(String teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // String & SenderEntity - public static void teleport(String teleportee, SenderEntity to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(String teleportee, SenderEntity to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(String teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(String teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // String & String - public static void teleport(String teleportee, String to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(String teleportee, String to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(String teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(String teleportee, String to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); - } - - // String & PSGetter - public static void teleport(String teleportee, PSGetter to) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to); - } - public static void teleport(String teleportee, PSGetter to, String desc) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc); - } - public static void teleport(String teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delayPermissible); - } - public static void teleport(String teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException - { - getTeleportMixin().teleport(teleportee, to, desc, delaySeconds); + getTeleportMixin().teleport(teleporteeObject, to, desc, delaySeconds); } // -------------------------------------------- // @@ -559,137 +309,101 @@ public class Mixin // -------------------------------------------- // // All - public static boolean message(String message) + public static boolean messageAll(String message) { - return getMessageMixin().message(message); + return getMessageMixin().messageAll(message); } - public static boolean message(String... messages) + public static boolean messageAll(String... messages) { - return getMessageMixin().message(messages); + return getMessageMixin().messageAll(messages); } - public static boolean message(Collection messages) + public static boolean messageAll(Collection messages) { - return getMessageMixin().message(messages); + return getMessageMixin().messageAll(messages); } // Predictate - public static boolean message(Predictate predictate, String message) + public static boolean messagePredictate(Predictate predictate, String message) { - return getMessageMixin().message(predictate, message); + return getMessageMixin().messagePredictate(predictate, message); } - public static boolean message(Predictate predictate, String... messages) + public static boolean messagePredictate(Predictate predictate, String... messages) { - return getMessageMixin().message(predictate, messages); + return getMessageMixin().messagePredictate(predictate, messages); } - public static boolean message(Predictate predictate, Collection messages) + public static boolean messagePredictate(Predictate predictate, Collection messages) { - return getMessageMixin().message(predictate, messages); + return getMessageMixin().messagePredictate(predictate, messages); } // One - public static boolean message(CommandSender sender, String message) + public static boolean messageOne(Object senderObject, String message) { - return getMessageMixin().message(sender, message); + return getMessageMixin().messageOne(senderObject, message); } - public static boolean message(CommandSender sender, String... messages) + public static boolean messageOne(Object senderObject, String... messages) { - return getMessageMixin().message(sender, messages); + return getMessageMixin().messageOne(senderObject, messages); } - public static boolean message(CommandSender sender, Collection messages) + public static boolean messageOne(Object senderObject, Collection messages) { - return getMessageMixin().message(sender, messages); - } - - // One by id - public static boolean message(String senderId, String message) - { - return getMessageMixin().message(senderId, message); - } - public static boolean message(String senderId, String... messages) - { - return getMessageMixin().message(senderId, messages); - } - public static boolean message(String senderId, Collection messages) - { - return getMessageMixin().message(senderId, messages); + return getMessageMixin().messageOne(senderObject, messages); } // All - public static boolean msg(String msg) + public static boolean msgAll(String msg) { - return getMessageMixin().msg(msg); + return getMessageMixin().msgAll(msg); } - public static boolean msg(String msg, Object... args) + public static boolean msgAll(String msg, Object... args) { - return getMessageMixin().msg(msg, args); + return getMessageMixin().msgAll(msg, args); } - public static boolean msg(Collection msgs) + public static boolean msgAll(Collection msgs) { - return getMessageMixin().msg(msgs); + return getMessageMixin().msgAll(msgs); } // Predictate - public static boolean msg(Predictate predictate, String msg) + public static boolean msgPredictate(Predictate predictate, String msg) { - return getMessageMixin().msg(predictate, msg); + return getMessageMixin().msgPredictate(predictate, msg); } - public static boolean msg(Predictate predictate, String msg, Object... args) + public static boolean msgPredictate(Predictate predictate, String msg, Object... args) { - return getMessageMixin().msg(predictate, msg, args); + return getMessageMixin().msgPredictate(predictate, msg, args); } - public static boolean msg(Predictate predictate, Collection msgs) + public static boolean msgPredictate(Predictate predictate, Collection msgs) { - return getMessageMixin().msg(predictate, msgs); + return getMessageMixin().msgPredictate(predictate, msgs); } // One - public static boolean msg(CommandSender sender, String msg) + public static boolean msgOne(Object senderObject, String msg) { - return getMessageMixin().msg(sender, msg); + return getMessageMixin().msgOne(senderObject, msg); } - public static boolean msg(CommandSender sender, String msg, Object... args) + public static boolean msgOne(Object senderObject, String msg, Object... args) { - return getMessageMixin().msg(sender, msg, args); + return getMessageMixin().msgOne(senderObject, msg, args); } - public static boolean msg(CommandSender sender, Collection msgs) + public static boolean msgOne(Object senderObject, Collection msgs) { - return getMessageMixin().msg(sender, msgs); - } - - // One by id - public static boolean msg(String senderId, String msg) - { - return getMessageMixin().msg(senderId, msg); - } - public static boolean msg(String senderId, String msg, Object... args) - { - return getMessageMixin().msg(senderId, msg, args); - } - public static boolean msg(String senderId, Collection msgs) - { - return getMessageMixin().msg(senderId, msgs); + return getMessageMixin().msgOne(senderObject, msgs); } // -------------------------------------------- // // STATIC EXPOSE: KICK // -------------------------------------------- // - public static boolean kick(CommandSender sender) + public static boolean kick(Object senderObject) { - return getKickMixin().kick(sender); - } - public static boolean kick(String senderId) - { - return getKickMixin().kick(senderId); + return getKickMixin().kick(senderObject); } - public static boolean kick(CommandSender sender, String message) + public static boolean kick(Object senderObject, String message) { - return getKickMixin().kick(sender, message); - } - public static boolean kick(String senderId, String message) - { - return getKickMixin().kick(senderId, message); + return getKickMixin().kick(senderObject, message); } // -------------------------------------------- // @@ -710,24 +424,14 @@ public class Mixin // STATIC EXPOSE: COMMAND // -------------------------------------------- // - public static boolean dispatchCommand(CommandSender sender, String commandLine) + public static boolean dispatchCommand(Object senderObject, String commandLine) { - return getCommandMixin().dispatchCommand(sender, commandLine); + return getCommandMixin().dispatchCommand(senderObject, commandLine); } - public static boolean dispatchCommand(SenderEntity sender, String commandLine) + public static boolean dispatchCommand(Object presentObject, Object senderObject, String commandLine) { - return getCommandMixin().dispatchCommand(sender, commandLine); - } - - public static boolean dispatchCommand(String senderId, String commandLine) - { - return getCommandMixin().dispatchCommand(senderId, commandLine); - } - - public static boolean dispatchCommand(String presentId, String senderId, String commandLine) - { - return getCommandMixin().dispatchCommand(presentId, senderId, commandLine); + return getCommandMixin().dispatchCommand(presentObject, senderObject, commandLine); } } diff --git a/src/com/massivecraft/mcore/mixin/PlayedMixin.java b/src/com/massivecraft/mcore/mixin/PlayedMixin.java index e8f0bfe1..c483d60f 100644 --- a/src/com/massivecraft/mcore/mixin/PlayedMixin.java +++ b/src/com/massivecraft/mcore/mixin/PlayedMixin.java @@ -2,9 +2,9 @@ package com.massivecraft.mcore.mixin; public interface PlayedMixin { - public boolean isOnline(String senderId); - public boolean isOffline(String senderId); - public Long getFirstPlayed(String senderId); - public Long getLastPlayed(String senderId); - public boolean hasPlayedBefore(String senderId); + public boolean isOnline(Object senderObject); + public boolean isOffline(Object senderObject); + public Long getFirstPlayed(Object senderObject); + public Long getLastPlayed(Object senderObject); + public boolean hasPlayedBefore(Object senderObject); } diff --git a/src/com/massivecraft/mcore/mixin/PlayedMixinAbstract.java b/src/com/massivecraft/mcore/mixin/PlayedMixinAbstract.java index 8f3a999d..f0c8d5ee 100644 --- a/src/com/massivecraft/mcore/mixin/PlayedMixinAbstract.java +++ b/src/com/massivecraft/mcore/mixin/PlayedMixinAbstract.java @@ -1,18 +1,25 @@ package com.massivecraft.mcore.mixin; +import com.massivecraft.mcore.util.IdUtil; + public abstract class PlayedMixinAbstract implements PlayedMixin { - @Override - public boolean isOffline(String senderId) + public boolean isOnline(Object senderObject) { - return !this.isOnline(senderId); + return IdUtil.isOnline(senderObject); + } + + @Override + public boolean isOffline(Object senderObject) + { + return !this.isOnline(senderObject); } @Override - public boolean hasPlayedBefore(String senderId) + public boolean hasPlayedBefore(Object senderObject) { - Long firstPlayed = this.getFirstPlayed(senderId); + Long firstPlayed = this.getFirstPlayed(senderObject); return firstPlayed != null && firstPlayed != 0; } diff --git a/src/com/massivecraft/mcore/mixin/PlayedMixinDefault.java b/src/com/massivecraft/mcore/mixin/PlayedMixinDefault.java index 12ada3d4..1b2f976d 100644 --- a/src/com/massivecraft/mcore/mixin/PlayedMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/PlayedMixinDefault.java @@ -1,8 +1,12 @@ package com.massivecraft.mcore.mixin; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import com.massivecraft.mcore.util.IdUtil; + public class PlayedMixinDefault extends PlayedMixinAbstract { // -------------------------------------------- // @@ -17,29 +21,34 @@ public class PlayedMixinDefault extends PlayedMixinAbstract // -------------------------------------------- // @Override - public boolean isOnline(String senderId) + public Long getFirstPlayed(Object senderObject) { - if (senderId == null) return false; - return Mixin.getOnlineSenderIds().contains(senderId); - } - - @Override - public Long getFirstPlayed(String senderId) - { - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(senderId); + UUID uuid = IdUtil.getUuid(senderObject); + if (uuid == null) return null; + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); + if (offlinePlayer == null) return null; + Long ret = offlinePlayer.getFirstPlayed(); if (ret == 0) ret = null; + return ret; } @Override - public Long getLastPlayed(String senderId) + public Long getLastPlayed(Object senderObject) { - if (this.isOnline(senderId)) return System.currentTimeMillis(); + //if (this.isOnline(senderObject)) return System.currentTimeMillis(); + // We do in fact NOT want this commented out behavior + // It's important we can check the previous played time on join! + + UUID uuid = IdUtil.getUuid(senderObject); + if (uuid == null) return null; + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid); + if (offlinePlayer == null) return null; - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(senderId); Long ret = offlinePlayer.getLastPlayed(); if (ret == 0) ret = null; + return ret; } diff --git a/src/com/massivecraft/mcore/mixin/SenderIdMixin.java b/src/com/massivecraft/mcore/mixin/SenderIdMixin.java deleted file mode 100644 index 7337c1bb..00000000 --- a/src/com/massivecraft/mcore/mixin/SenderIdMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.massivecraft.mcore.mixin; - -import java.util.Set; - -public interface SenderIdMixin -{ - // Q: What do you mean "fix" a senderId? - // A: A senderId is case insensitive. However a certain caseing may be the best looking one. Player do for example have an optimal caseing. - public String reqFix(String senderId); - public String tryFix(String senderId); - public boolean canFix(String senderId); - - // These may be unmodifiable. Don't expect them to be changeable. - public Set getAllSenderIds(); - public Set getOnlineSenderIds(); - public Set getOfflineSenderIds(); - - public Set getAllPlayerIds(); - public Set getOnlinePlayerIds(); - public Set getOfflinePlayerIds(); - -} diff --git a/src/com/massivecraft/mcore/mixin/SenderIdMixinAbstract.java b/src/com/massivecraft/mcore/mixin/SenderIdMixinAbstract.java deleted file mode 100644 index f6f06d83..00000000 --- a/src/com/massivecraft/mcore/mixin/SenderIdMixinAbstract.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.massivecraft.mcore.mixin; - -public abstract class SenderIdMixinAbstract implements SenderIdMixin -{ - @Override - public String tryFix(String senderId) - { - String ret = this.reqFix(senderId); - if (ret != null) return ret; - return senderId; - } - - @Override - public boolean canFix(String senderId) - { - return this.reqFix(senderId) != null; - } -} \ No newline at end of file diff --git a/src/com/massivecraft/mcore/mixin/SenderIdMixinDefault.java b/src/com/massivecraft/mcore/mixin/SenderIdMixinDefault.java deleted file mode 100644 index 057376e8..00000000 --- a/src/com/massivecraft/mcore/mixin/SenderIdMixinDefault.java +++ /dev/null @@ -1,232 +0,0 @@ -package com.massivecraft.mcore.mixin; - -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentSkipListMap; -import java.util.concurrent.ConcurrentSkipListSet; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; - -import com.massivecraft.mcore.MCore; -import com.massivecraft.mcore.event.MCorePlayerLeaveEvent; -import com.massivecraft.mcore.event.MCoreSenderRegisterEvent; -import com.massivecraft.mcore.event.MCoreSenderUnregisterEvent; -import com.massivecraft.mcore.util.PlayerUtil; -import com.massivecraft.mcore.util.SenderUtil; -import com.massivecraft.mcore.util.Txt; - -public class SenderIdMixinDefault extends SenderIdMixinAbstract implements Listener -{ - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static SenderIdMixinDefault i = new SenderIdMixinDefault(); - public static SenderIdMixinDefault get() { return i; } - - // -------------------------------------------- // - // SETUP - // -------------------------------------------- // - - public void setup() - { - long start = System.currentTimeMillis(); - - // Create new empty sets - this.allSenderIds = new ConcurrentSkipListMap(String.CASE_INSENSITIVE_ORDER); - this.onlineSenderIds = new ConcurrentSkipListSet(String.CASE_INSENSITIVE_ORDER); - this.offlineSenderIds = new ConcurrentSkipListSet(String.CASE_INSENSITIVE_ORDER); - - this.allPlayerIds = new ConcurrentSkipListSet(String.CASE_INSENSITIVE_ORDER); - this.onlinePlayerIds = new ConcurrentSkipListSet(String.CASE_INSENSITIVE_ORDER); - this.offlinePlayerIds = new ConcurrentSkipListSet(String.CASE_INSENSITIVE_ORDER); - - // Add online players - for (Player player : Bukkit.getOnlinePlayers()) - { - String id = player.getName(); - - this.allSenderIds.put(id, id); - this.allPlayerIds.add(id); - - this.onlineSenderIds.add(id); - this.onlinePlayerIds.add(id); - } - - // Add offline players - for (String id : PlayerUtil.getDirectoryPlayerNames()) - { - // Check if this player was added already since it's online - if (this.onlinePlayerIds.contains(id)) continue; - - this.allSenderIds.put(id, id); - this.allPlayerIds.add(id); - - this.offlineSenderIds.add(id); - this.offlinePlayerIds.add(id); - } - - // Add command senders - for (String id : SenderUtil.getIdToSender().keySet()) - { - this.allSenderIds.put(id, id); - this.onlineSenderIds.add(id); - } - - Bukkit.getServer().getPluginManager().registerEvents(this, MCore.get()); - - long end = System.currentTimeMillis(); - MCore.get().log(Txt.parse("Setup of SenderIdMixinDefault took %dms.", end-start)); - } - - // -------------------------------------------- // - // FIELDS - // -------------------------------------------- // - - // The first field is a map since we use it for the "try" methods. - protected Map allSenderIds; - protected Set onlineSenderIds; - protected Set offlineSenderIds; - - protected Set allPlayerIds; - protected Set onlinePlayerIds; - protected Set offlinePlayerIds; - - // -------------------------------------------- // - // UTIL - // -------------------------------------------- // - - protected void onOnlineChanged(CommandSender sender, boolean isOnline) - { - boolean isPlayer = SenderUtil.isPlayer(sender); - String id = SenderUtil.getSenderId(sender); - - this.allSenderIds.put(id, id); - if (isPlayer) - { - this.allPlayerIds.add(id); - } - - if (isOnline) - { - this.onlineSenderIds.add(id); - this.offlineSenderIds.remove(id); - if (isPlayer) - { - this.onlinePlayerIds.add(id); - this.offlinePlayerIds.remove(id); - } - } - else - { - this.offlineSenderIds.add(id); - this.onlineSenderIds.remove(id); - if (isPlayer) - { - this.offlinePlayerIds.add(id); - this.onlinePlayerIds.remove(id); - } - } - } - - // -------------------------------------------- // - // LISTENER - // -------------------------------------------- // - - // We don't care if it's cancelled or not. - // We just wan't to make sure this id is known of and can be "fixed" asap. - // Online or not? We just use the mixin to get the actuall value. - @EventHandler(priority = EventPriority.LOWEST) - public void playerLoginLowest(PlayerLoginEvent event) - { - boolean isOnline = Mixin.isOnline(SenderUtil.getSenderId(event.getPlayer())); - this.onOnlineChanged(event.getPlayer(), isOnline); - } - - // Can't be cancelled - @EventHandler(priority = EventPriority.LOWEST) - public void playerJoinLowest(PlayerJoinEvent event) - { - this.onOnlineChanged(event.getPlayer(), true); - } - - // Can't be cancelled - @EventHandler(priority = EventPriority.LOWEST) - public void senderRegisterLowest(MCoreSenderRegisterEvent event) - { - this.onOnlineChanged(event.getSender(), true); - } - - // Can't be cancelled - @EventHandler(priority = EventPriority.MONITOR) - public void playerLeaveMonitor(MCorePlayerLeaveEvent event) - { - this.onOnlineChanged(event.getPlayer(), false); - } - - // Can't be cancelled - @EventHandler(priority = EventPriority.MONITOR) - public void senderUnregisterLowest(MCoreSenderUnregisterEvent event) - { - this.onOnlineChanged(event.getSender(), false); - } - - // -------------------------------------------- // - // OVERRIDE: FIX - // -------------------------------------------- // - - @Override - public String reqFix(String senderId) - { - return this.allSenderIds.get(senderId); - } - - // -------------------------------------------- // - // OVERRIDE: SETS - // -------------------------------------------- // - - @Override - public Set getAllSenderIds() - { - return Collections.unmodifiableSet(this.allSenderIds.keySet()); - } - - @Override - public Set getOnlineSenderIds() - { - return Collections.unmodifiableSet(this.onlineSenderIds); - } - - @Override - public Set getOfflineSenderIds() - { - return Collections.unmodifiableSet(this.offlineSenderIds); - } - - @Override - public Set getAllPlayerIds() - { - return Collections.unmodifiableSet(this.allPlayerIds); - } - - @Override - public Set getOnlinePlayerIds() - { - return Collections.unmodifiableSet(this.onlinePlayerIds); - } - - @Override - public Set getOfflinePlayerIds() - { - return Collections.unmodifiableSet(this.offlinePlayerIds); - } - -} \ No newline at end of file diff --git a/src/com/massivecraft/mcore/mixin/SenderPsMixin.java b/src/com/massivecraft/mcore/mixin/SenderPsMixin.java index f433726c..7a22e33c 100644 --- a/src/com/massivecraft/mcore/mixin/SenderPsMixin.java +++ b/src/com/massivecraft/mcore/mixin/SenderPsMixin.java @@ -4,6 +4,6 @@ import com.massivecraft.mcore.ps.PS; public interface SenderPsMixin { - public PS getSenderPs(String senderId); - public void setSenderPs(String senderId, PS ps); + public PS getSenderPs(Object senderObject); + public void setSenderPs(Object senderObject, PS ps); } diff --git a/src/com/massivecraft/mcore/mixin/SenderPsMixinDefault.java b/src/com/massivecraft/mcore/mixin/SenderPsMixinDefault.java index 99f19ddc..58c0fa21 100644 --- a/src/com/massivecraft/mcore/mixin/SenderPsMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/SenderPsMixinDefault.java @@ -3,7 +3,7 @@ package com.massivecraft.mcore.mixin; import org.bukkit.entity.Player; import com.massivecraft.mcore.ps.PS; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class SenderPsMixinDefault extends SenderPsMixinAbstract { @@ -19,15 +19,15 @@ public class SenderPsMixinDefault extends SenderPsMixinAbstract // -------------------------------------------- // @Override - public PS getSenderPs(String senderId) + public PS getSenderPs(Object senderObject) { - Player player = SenderUtil.getPlayer(senderId); + Player player = IdUtil.getPlayer(senderObject); if (player == null) return null; return PS.valueOf(player.getLocation()); } @Override - public void setSenderPs(String senderId, PS ps) + public void setSenderPs(Object senderObject, PS ps) { // Bukkit does not support setting the physical state for offline players for now. } diff --git a/src/com/massivecraft/mcore/mixin/TeleportMixin.java b/src/com/massivecraft/mcore/mixin/TeleportMixin.java index 12538213..93bc32ac 100644 --- a/src/com/massivecraft/mcore/mixin/TeleportMixin.java +++ b/src/com/massivecraft/mcore/mixin/TeleportMixin.java @@ -17,12 +17,6 @@ public interface TeleportMixin public boolean isCausedByMixin(PlayerTeleportEvent event); // PERMUTATION - // - // # teleportee - // CommandSender - // SenderEntity - // String - // // # to // PS // CommandSender @@ -34,108 +28,34 @@ public interface TeleportMixin // COMMAND SENDER // -------------------------------------------- // - // CommandSender & PS - public void teleport(CommandSender teleportee, PS to) throws TeleporterException; - public void teleport(CommandSender teleportee, PS to, String desc) throws TeleporterException; - public void teleport(CommandSender teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(CommandSender teleportee, PS to, String desc, int delaySeconds) throws TeleporterException; + // PS + public void teleport(Object teleporteeObject, PS to) throws TeleporterException; + public void teleport(Object teleporteeObject, PS to, String desc) throws TeleporterException; + public void teleport(Object teleporteeObject, PS to, String desc, Permissible delayPermissible) throws TeleporterException; + public void teleport(Object teleporteeObject, PS to, String desc, int delaySeconds) throws TeleporterException; - // CommandSender & CommandSender - public void teleport(CommandSender teleportee, CommandSender to) throws TeleporterException; - public void teleport(CommandSender teleportee, CommandSender to, String desc) throws TeleporterException; - public void teleport(CommandSender teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(CommandSender teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException; + // CommandSender + public void teleport(Object teleporteeObject, CommandSender to) throws TeleporterException; + public void teleport(Object teleporteeObject, CommandSender to, String desc) throws TeleporterException; + public void teleport(Object teleporteeObject, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException; + public void teleport(Object teleporteeObject, CommandSender to, String desc, int delaySeconds) throws TeleporterException; - // CommandSender & SenderEntity - public void teleport(CommandSender teleportee, SenderEntity to) throws TeleporterException; - public void teleport(CommandSender teleportee, SenderEntity to, String desc) throws TeleporterException; - public void teleport(CommandSender teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(CommandSender teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException; + // SenderEntity + public void teleport(Object teleporteeObject, SenderEntity to) throws TeleporterException; + public void teleport(Object teleporteeObject, SenderEntity to, String desc) throws TeleporterException; + public void teleport(Object teleporteeObject, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException; + public void teleport(Object teleporteeObject, SenderEntity to, String desc, int delaySeconds) throws TeleporterException; - // CommandSender & String - public void teleport(CommandSender teleportee, String to) throws TeleporterException; - public void teleport(CommandSender teleportee, String to, String desc) throws TeleporterException; - public void teleport(CommandSender teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(CommandSender teleportee, String to, String desc, int delaySeconds) throws TeleporterException; + // String + public void teleport(Object teleporteeObject, String to) throws TeleporterException; + public void teleport(Object teleporteeObject, String to, String desc) throws TeleporterException; + public void teleport(Object teleporteeObject, String to, String desc, Permissible delayPermissible) throws TeleporterException; + public void teleport(Object teleporteeObject, String to, String desc, int delaySeconds) throws TeleporterException; - // CommandSender & PSGetter - public void teleport(CommandSender teleportee, PSGetter to) throws TeleporterException; - public void teleport(CommandSender teleportee, PSGetter to, String desc) throws TeleporterException; - public void teleport(CommandSender teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(CommandSender teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException; - - //// SenderEntity - - // -------------------------------------------- // - // SENDER ENTITY - // -------------------------------------------- // - - // SenderEntity & PS - public void teleport(SenderEntity teleportee, PS to) throws TeleporterException; - public void teleport(SenderEntity teleportee, PS to, String desc) throws TeleporterException; - public void teleport(SenderEntity teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(SenderEntity teleportee, PS to, String desc, int delaySeconds) throws TeleporterException; - - // SenderEntity & CommandSender - public void teleport(SenderEntity teleportee, CommandSender to) throws TeleporterException; - public void teleport(SenderEntity teleportee, CommandSender to, String desc) throws TeleporterException; - public void teleport(SenderEntity teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(SenderEntity teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException; - - // SenderEntity & SenderEntity - public void teleport(SenderEntity teleportee, SenderEntity to) throws TeleporterException; - public void teleport(SenderEntity teleportee, SenderEntity to, String desc) throws TeleporterException; - public void teleport(SenderEntity teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(SenderEntity teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException; - - // SenderEntity & String - public void teleport(SenderEntity teleportee, String to) throws TeleporterException; - public void teleport(SenderEntity teleportee, String to, String desc) throws TeleporterException; - public void teleport(SenderEntity teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(SenderEntity teleportee, String to, String desc, int delaySeconds) throws TeleporterException; - - // SenderEntity & PSGetter - public void teleport(SenderEntity teleportee, PSGetter to) throws TeleporterException; - public void teleport(SenderEntity teleportee, PSGetter to, String desc) throws TeleporterException; - public void teleport(SenderEntity teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(SenderEntity teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException; - - //// String - - // -------------------------------------------- // - // STRING - // -------------------------------------------- // - - // String & PS - public void teleport(String teleportee, PS to) throws TeleporterException; - public void teleport(String teleportee, PS to, String desc) throws TeleporterException; - public void teleport(String teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(String teleportee, PS to, String desc, int delaySeconds) throws TeleporterException; - - // String & CommandSender - public void teleport(String teleportee, CommandSender to) throws TeleporterException; - public void teleport(String teleportee, CommandSender to, String desc) throws TeleporterException; - public void teleport(String teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(String teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException; - - // String & SenderEntity - public void teleport(String teleportee, SenderEntity to) throws TeleporterException; - public void teleport(String teleportee, SenderEntity to, String desc) throws TeleporterException; - public void teleport(String teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(String teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException; - - // String & String - public void teleport(String teleportee, String to) throws TeleporterException; - public void teleport(String teleportee, String to, String desc) throws TeleporterException; - public void teleport(String teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(String teleportee, String to, String desc, int delaySeconds) throws TeleporterException; - - // String & PSGetter - public void teleport(String teleportee, PSGetter to) throws TeleporterException; - public void teleport(String teleportee, PSGetter to, String desc) throws TeleporterException; - public void teleport(String teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException; - public void teleport(String teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException; - // This very last method is is the core logic. - // Everything else is implemented in the abstract. + // PSGetter + public void teleport(Object teleporteeObject, PSGetter to) throws TeleporterException; + public void teleport(Object teleporteeObject, PSGetter to, String desc) throws TeleporterException; + public void teleport(Object teleporteeObject, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException; + public void teleport(Object teleporteeObject, PSGetter to, String desc, int delaySeconds) throws TeleporterException; } diff --git a/src/com/massivecraft/mcore/mixin/TeleportMixinAbstract.java b/src/com/massivecraft/mcore/mixin/TeleportMixinAbstract.java index 80e5c504..57a24742 100644 --- a/src/com/massivecraft/mcore/mixin/TeleportMixinAbstract.java +++ b/src/com/massivecraft/mcore/mixin/TeleportMixinAbstract.java @@ -10,7 +10,6 @@ import com.massivecraft.mcore.store.SenderEntity; import com.massivecraft.mcore.teleport.PSGetter; import com.massivecraft.mcore.teleport.PSGetterPS; import com.massivecraft.mcore.teleport.PSGetterPlayer; -import com.massivecraft.mcore.util.SenderUtil; public abstract class TeleportMixinAbstract implements TeleportMixin { @@ -34,384 +33,132 @@ public abstract class TeleportMixinAbstract implements TeleportMixin } // -------------------------------------------- // - // COMMAND SENDER + // SENDER OBJECT // -------------------------------------------- // - // CommandSender & PS + // PS @Override - public void teleport(CommandSender teleportee, PS to) throws TeleporterException + public void teleport(Object teleportee, PS to) throws TeleporterException { this.teleport(teleportee, to, null); } @Override - public void teleport(CommandSender teleportee, PS to, String desc) throws TeleporterException + public void teleport(Object teleportee, PS to, String desc) throws TeleporterException { this.teleport(teleportee, to, desc, 0); } @Override - public void teleport(CommandSender teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException + public void teleport(Object teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException { this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); } @Override - public void teleport(CommandSender teleportee, PS to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(SenderUtil.getSenderId(teleportee), to, desc, delaySeconds); - } - - // CommandSender & CommandSender - @Override - public void teleport(CommandSender teleportee, CommandSender to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(CommandSender teleportee, CommandSender to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(CommandSender teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(CommandSender teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(SenderUtil.getSenderId(teleportee), to, desc, delaySeconds); - } - - // CommandSender & SenderEntity - @Override - public void teleport(CommandSender teleportee, SenderEntity to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(CommandSender teleportee, SenderEntity to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(CommandSender teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(CommandSender teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(SenderUtil.getSenderId(teleportee), to, desc, delaySeconds); - } - - // CommandSender & String - @Override - public void teleport(CommandSender teleportee, String to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(CommandSender teleportee, String to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(CommandSender teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(CommandSender teleportee, String to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(SenderUtil.getSenderId(teleportee), to, desc, delaySeconds); - } - - // CommandSender & PSGetter - @Override - public void teleport(CommandSender teleportee, PSGetter to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(CommandSender teleportee, PSGetter to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(CommandSender teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(CommandSender teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(SenderUtil.getSenderId(teleportee), to, desc, delaySeconds); - } - - // -------------------------------------------- // - // SENDER ENTITY - // -------------------------------------------- // - - // SenderEntity & PS - @Override - public void teleport(SenderEntity teleportee, PS to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(SenderEntity teleportee, PS to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(SenderEntity teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(SenderEntity teleportee, PS to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee.getId(), to, desc, delaySeconds); - } - - // SenderEntity & CommandSender - @Override - public void teleport(SenderEntity teleportee, CommandSender to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(SenderEntity teleportee, CommandSender to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(SenderEntity teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(SenderEntity teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee.getId(), to, desc, delaySeconds); - } - - // SenderEntity & SenderEntity - @Override - public void teleport(SenderEntity teleportee, SenderEntity to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(SenderEntity teleportee, SenderEntity to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(SenderEntity teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(SenderEntity teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee.getId(), to, desc, delaySeconds); - } - - // SenderEntity & String - @Override - public void teleport(SenderEntity teleportee, String to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(SenderEntity teleportee, String to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(SenderEntity teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(SenderEntity teleportee, String to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee.getId(), to, desc, delaySeconds); - } - - // SenderEntity & PSGetter - @Override - public void teleport(SenderEntity teleportee, PSGetter to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(SenderEntity teleportee, PSGetter to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(SenderEntity teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(SenderEntity teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException - { - this.teleport(teleportee.getId(), to, desc, delaySeconds); - } - - // -------------------------------------------- // - // STRING - // -------------------------------------------- // - - // String & PS - @Override - public void teleport(String teleportee, PS to) throws TeleporterException - { - this.teleport(teleportee, to, null); - } - - @Override - public void teleport(String teleportee, PS to, String desc) throws TeleporterException - { - this.teleport(teleportee, to, desc, 0); - } - - @Override - public void teleport(String teleportee, PS to, String desc, Permissible delayPermissible) throws TeleporterException - { - this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); - } - - @Override - public void teleport(String teleportee, PS to, String desc, int delaySeconds) throws TeleporterException + public void teleport(Object teleportee, PS to, String desc, int delaySeconds) throws TeleporterException { this.teleport(teleportee, PSGetterPS.valueOf(to), desc, delaySeconds); } - // String & CommandSender + // CommandSender @Override - public void teleport(String teleportee, CommandSender to) throws TeleporterException + public void teleport(Object teleportee, CommandSender to) throws TeleporterException { this.teleport(teleportee, to, null); } @Override - public void teleport(String teleportee, CommandSender to, String desc) throws TeleporterException + public void teleport(Object teleportee, CommandSender to, String desc) throws TeleporterException { this.teleport(teleportee, to, desc, 0); } @Override - public void teleport(String teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException + public void teleport(Object teleportee, CommandSender to, String desc, Permissible delayPermissible) throws TeleporterException { this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); } @Override - public void teleport(String teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException + public void teleport(Object teleportee, CommandSender to, String desc, int delaySeconds) throws TeleporterException { this.teleport(teleportee, PSGetterPlayer.valueOf(to), desc, delaySeconds); } - // String & SenderEntity + // SenderEntity @Override - public void teleport(String teleportee, SenderEntity to) throws TeleporterException + public void teleport(Object teleportee, SenderEntity to) throws TeleporterException { this.teleport(teleportee, to, null); } @Override - public void teleport(String teleportee, SenderEntity to, String desc) throws TeleporterException + public void teleport(Object teleportee, SenderEntity to, String desc) throws TeleporterException { this.teleport(teleportee, to, desc, 0); } @Override - public void teleport(String teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException + public void teleport(Object teleportee, SenderEntity to, String desc, Permissible delayPermissible) throws TeleporterException { this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); } @Override - public void teleport(String teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException + public void teleport(Object teleportee, SenderEntity to, String desc, int delaySeconds) throws TeleporterException { this.teleport(teleportee, PSGetterPlayer.valueOf(to), desc, delaySeconds); } - // String & String + // String @Override - public void teleport(String teleportee, String to) throws TeleporterException + public void teleport(Object teleportee, String to) throws TeleporterException { this.teleport(teleportee, to, null); } @Override - public void teleport(String teleportee, String to, String desc) throws TeleporterException + public void teleport(Object teleportee, String to, String desc) throws TeleporterException { this.teleport(teleportee, to, desc, 0); } @Override - public void teleport(String teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException + public void teleport(Object teleportee, String to, String desc, Permissible delayPermissible) throws TeleporterException { this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); } @Override - public void teleport(String teleportee, String to, String desc, int delaySeconds) throws TeleporterException + public void teleport(Object teleportee, String to, String desc, int delaySeconds) throws TeleporterException { this.teleport(teleportee, PSGetterPlayer.valueOf(to), desc, delaySeconds); } - // String & PSGetter + // PSGetter @Override - public void teleport(String teleportee, PSGetter to) throws TeleporterException + public void teleport(Object teleportee, PSGetter to) throws TeleporterException { this.teleport(teleportee, to, null); } @Override - public void teleport(String teleportee, PSGetter to, String desc) throws TeleporterException + public void teleport(Object teleportee, PSGetter to, String desc) throws TeleporterException { this.teleport(teleportee, to, desc, 0); } @Override - public void teleport(String teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException + public void teleport(Object teleportee, PSGetter to, String desc, Permissible delayPermissible) throws TeleporterException { this.teleport(teleportee, to, desc, getTpdelay(delayPermissible)); } + // To implement! + /*@Override + public void teleport(Object teleportee, PSGetter to, String desc, int delaySeconds) throws TeleporterException + { + //this.teleport(teleportee, to, desc, delaySeconds); + }*/ } diff --git a/src/com/massivecraft/mcore/mixin/TeleportMixinDefault.java b/src/com/massivecraft/mcore/mixin/TeleportMixinDefault.java index 2b1acc25..15543d75 100644 --- a/src/com/massivecraft/mcore/mixin/TeleportMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/TeleportMixinDefault.java @@ -9,7 +9,7 @@ import com.massivecraft.mcore.event.MCorePlayerPSTeleportEvent; import com.massivecraft.mcore.ps.PS; import com.massivecraft.mcore.teleport.PSGetter; import com.massivecraft.mcore.teleport.ScheduledTeleport; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.Txt; public class TeleportMixinDefault extends TeleportMixinAbstract @@ -71,20 +71,21 @@ public class TeleportMixinDefault extends TeleportMixinAbstract // -------------------------------------------- // @Override - public void teleport(String teleporteeId, PSGetter toGetter, String desc, int delaySeconds) throws TeleporterException + public void teleport(Object teleporteeObject, PSGetter toGetter, String desc, int delaySeconds) throws TeleporterException { - if (!SenderUtil.isPlayerId(teleporteeId)) throw new TeleporterException(Txt.parse("%s is not a player.", Mixin.getDisplayName(teleporteeId))); + String teleporteeId = IdUtil.getId(teleporteeObject); + if (!IdUtil.isPlayerId(teleporteeId)) throw new TeleporterException(Txt.parse("%s is not a player.", Mixin.getDisplayName(teleporteeId))); if (delaySeconds > 0) { // With delay if (desc != null) { - Mixin.msg(teleporteeId, "Teleporting to "+desc+" in "+delaySeconds+"s unless you move."); + Mixin.msgOne(teleporteeId, "Teleporting to "+desc+" in "+delaySeconds+"s unless you move."); } else { - Mixin.msg(teleporteeId, "Teleporting in "+delaySeconds+"s unless you move."); + Mixin.msgOne(teleporteeId, "Teleporting in "+delaySeconds+"s unless you move."); } new ScheduledTeleport(teleporteeId, toGetter, desc, delaySeconds).schedule(); @@ -106,10 +107,10 @@ public class TeleportMixinDefault extends TeleportMixinAbstract if (desc != null) { - Mixin.msg(teleporteeId, "Teleporting to "+desc+"."); + Mixin.msgOne(teleporteeId, "Teleporting to "+desc+"."); } - Player teleportee = SenderUtil.getPlayer(teleporteeId); + Player teleportee = IdUtil.getPlayer(teleporteeId); if (teleportee != null) { teleportPlayer(teleportee, to); diff --git a/src/com/massivecraft/mcore/mixin/VisibilityMixin.java b/src/com/massivecraft/mcore/mixin/VisibilityMixin.java index 1a6335bf..13218d9e 100644 --- a/src/com/massivecraft/mcore/mixin/VisibilityMixin.java +++ b/src/com/massivecraft/mcore/mixin/VisibilityMixin.java @@ -1,11 +1,6 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; - public interface VisibilityMixin { - public boolean canSee(String watcherId, String watcheeId); - public boolean canSee(CommandSender watcher, String watcheeId); - public boolean canSee(String watcherId, CommandSender watchee); - public boolean canSee(CommandSender watcher, CommandSender watchee); + public boolean canSee(Object watcherObject, Object watcheeObject); } diff --git a/src/com/massivecraft/mcore/mixin/VisibilityMixinDefault.java b/src/com/massivecraft/mcore/mixin/VisibilityMixinDefault.java index b1a6d45b..87a5d54b 100644 --- a/src/com/massivecraft/mcore/mixin/VisibilityMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/VisibilityMixinDefault.java @@ -1,9 +1,8 @@ package com.massivecraft.mcore.mixin; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class VisibilityMixinDefault extends VisibilityMixinAbstract { @@ -19,28 +18,10 @@ public class VisibilityMixinDefault extends VisibilityMixinAbstract // -------------------------------------------- // @Override - public boolean canSee(String watcherId, String watcheeId) + public boolean canSee(Object watcherObject, Object watcheeObject) { - return this.canSee(SenderUtil.getSender(watcherId), SenderUtil.getSender(watcheeId)); - } - - @Override - public boolean canSee(CommandSender watcher, String watcheeId) - { - return this.canSee(watcher, SenderUtil.getSender(watcheeId)); - } - - @Override - public boolean canSee(String watcherId, CommandSender watchee) - { - return this.canSee(SenderUtil.getSender(watcherId), watchee); - } - - @Override - public boolean canSee(CommandSender watcher, CommandSender watchee) - { - Player pwatcher = SenderUtil.getAsPlayer(watcher); - Player pwatchee = SenderUtil.getAsPlayer(watchee); + Player pwatcher = IdUtil.getPlayer(watcherObject); + Player pwatchee = IdUtil.getPlayer(watcheeObject); if (pwatcher == null) return true; if (pwatchee == null) return true; diff --git a/src/com/massivecraft/mcore/mixin/WorldMixinDefault.java b/src/com/massivecraft/mcore/mixin/WorldMixinDefault.java index ee741b58..4055cb49 100644 --- a/src/com/massivecraft/mcore/mixin/WorldMixinDefault.java +++ b/src/com/massivecraft/mcore/mixin/WorldMixinDefault.java @@ -93,7 +93,7 @@ public class WorldMixinDefault extends WorldMixinAbstract { if (verbooseChange || verbooseSame) { - Mixin.msg(sender, "Unknown world %s.", worldId); + Mixin.msgOne(sender, "Unknown world %s.", worldId); } return false; } @@ -109,7 +109,7 @@ public class WorldMixinDefault extends WorldMixinAbstract { if (verbooseSame) { - Mixin.msg(sender, "Spawn location is already %s for %s.", currentFormatted, worldDisplayName); + Mixin.msgOne(sender, "Spawn location is already %s for %s.", currentFormatted, worldDisplayName); } return true; } @@ -117,7 +117,7 @@ public class WorldMixinDefault extends WorldMixinAbstract // Report if (verbooseChange) { - Mixin.msg(sender, "Changing spawn location from %s to %s for %s.", currentFormatted, goalFormatted, worldDisplayName); + Mixin.msgOne(sender, "Changing spawn location from %s to %s for %s.", currentFormatted, goalFormatted, worldDisplayName); } // Set it diff --git a/src/com/massivecraft/mcore/sender/BasicCommandSender.java b/src/com/massivecraft/mcore/sender/BasicCommandSender.java index 1ca9ed3c..c6374b00 100644 --- a/src/com/massivecraft/mcore/sender/BasicCommandSender.java +++ b/src/com/massivecraft/mcore/sender/BasicCommandSender.java @@ -6,11 +6,11 @@ import org.bukkit.command.CommandSender; import org.bukkit.permissions.PermissibleBase; import com.massivecraft.mcore.MCore; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class BasicCommandSender extends PermissibleBase implements CommandSender { - private final String name; + public final String name; public BasicCommandSender(String name, boolean op, boolean opChangeable) { @@ -55,7 +55,7 @@ public class BasicCommandSender extends PermissibleBase implements CommandSender } } - public boolean register() + public void register() { final BasicCommandSender ME = this; @@ -70,17 +70,17 @@ public class BasicCommandSender extends PermissibleBase implements CommandSender }); // and register now - return this.registerImmediately(); + registerImmediately(); } - public boolean registerImmediately() + public void registerImmediately() { - return SenderUtil.register(this); + IdUtil.register(this); } - public boolean unregister() + public void unregister() { - return SenderUtil.unregister(this); + IdUtil.unregister(this); } } diff --git a/src/com/massivecraft/mcore/store/Coll.java b/src/com/massivecraft/mcore/store/Coll.java index 679a29fc..a6559f7b 100644 --- a/src/com/massivecraft/mcore/store/Coll.java +++ b/src/com/massivecraft/mcore/store/Coll.java @@ -327,7 +327,7 @@ public class Coll implements CollInterface if (entity instanceof Entity) { ((Entity)entity).setColl(this); - ((Entity)entity).setid(id); + ((Entity)entity).setId(id); } // Attach @@ -497,7 +497,7 @@ public class Coll implements CollInterface if (entity instanceof Entity) { ((Entity)entity).setColl(null); - ((Entity)entity).setid(null); + ((Entity)entity).setId(null); } return entity; @@ -742,6 +742,14 @@ public class Coll implements CollInterface @Override public void syncSuspects() { + /*if (MCore.get().doderp) + { + if (this.changedIds.size() > 0) + { + System.out.println("Coll " + this.getName() + " had suspects " + Txt.implode(this.changedIds, " ")); + } + }*/ + for (String id : this.changedIds) { this.syncId(id); diff --git a/src/com/massivecraft/mcore/store/Entity.java b/src/com/massivecraft/mcore/store/Entity.java index 62fb0b7a..f4cf93dd 100644 --- a/src/com/massivecraft/mcore/store/Entity.java +++ b/src/com/massivecraft/mcore/store/Entity.java @@ -25,7 +25,7 @@ public abstract class Entity> implements Comparable public Coll getColl() { return this.coll; } protected transient String id; - protected void setid(String id) { this.id = id; } + protected void setId(String id) { this.id = id; } public String getId() { return this.id; } public String getUniverse() diff --git a/src/com/massivecraft/mcore/store/SenderColl.java b/src/com/massivecraft/mcore/store/SenderColl.java index c3a14928..f9abdeb3 100644 --- a/src/com/massivecraft/mcore/store/SenderColl.java +++ b/src/com/massivecraft/mcore/store/SenderColl.java @@ -9,8 +9,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import com.massivecraft.mcore.Predictate; -import com.massivecraft.mcore.mixin.Mixin; -import com.massivecraft.mcore.util.MUtil; +import com.massivecraft.mcore.util.IdUtil; public class SenderColl> extends Coll implements SenderIdSource { @@ -41,52 +40,54 @@ public class SenderColl> extends Coll implements Se } // -------------------------------------------- // - // EXTRAS + // OVERRIDE: Coll // -------------------------------------------- // - public List getFixedIds() - { - List ret = new ArrayList(); - for (String senderId : this.getIds()) - { - ret.add(Mixin.tryFix(senderId)); - } - return ret; - } - - @Override - public Collection> getSenderIdCollections() - { - List> ret = new ArrayList>(); - ret.add(this.getFixedIds()); - return ret; - } - - @Override public String fixId(Object oid) { if (oid == null) return null; - String ret = null; if (oid instanceof String) { - ret = (String)oid; - } - else if (oid.getClass() == this.entityClass) - { - ret = this.entity2id.get(oid); - } - else - { - ret = MUtil.extract(String.class, "senderId", oid); + String ret = (String)oid; + return this.isLowercasing() ? ret.toLowerCase() : ret; } - if (ret == null) return null; + if (oid.getClass() == this.entityClass) + { + return fixId(this.entity2id.get(oid)); + } - return this.isLowercasing() ? ret.toLowerCase() : ret; + return fixId(IdUtil.getId(oid)); } + // -------------------------------------------- // + // OVERRIDE: SenderIdSource + // -------------------------------------------- // + + @Override + public Collection> getSenderIdCollections() + { + List> ret = new ArrayList>(); + ret.add(this.getIds()); + + List names = new ArrayList(); + for (String id : this.getIds()) + { + String name = IdUtil.getName(id); + if (name == null) continue; + names.add(name); + } + ret.add(names); + + return ret; + } + + // -------------------------------------------- // + // EXTRAS + // -------------------------------------------- // + public Collection getAllOnline() { return this.getAll(new Predictate() @@ -110,10 +111,10 @@ public class SenderColl> extends Coll implements Se } // -------------------------------------------- // - // SENDER REFFERENCE MANAGEMENT + // SENDER REFERENCE MANAGEMENT // -------------------------------------------- // - protected void setSenderRefference(String senderId, CommandSender sender) + protected void setSenderReference(String senderId, CommandSender sender) { E senderEntity = this.get(senderId, false); if (senderEntity == null) return; @@ -121,19 +122,20 @@ public class SenderColl> extends Coll implements Se senderEntity.senderInitiated = true; } - public static void setSenderRefferences(String senderId, CommandSender sender) + public static void setSenderReferences(String senderId, CommandSender sender) { for (Coll coll : Coll.getInstances()) { if (!(coll instanceof SenderColl)) continue; SenderColl senderColl = (SenderColl)coll; - senderColl.setSenderRefference(senderId, sender); + senderColl.setSenderReference(senderId, sender); } } // -------------------------------------------- // // ARGUMENT READERS // -------------------------------------------- // + // TODO: Why were these removed? /*public ArgReader getARFullAny() { diff --git a/src/com/massivecraft/mcore/store/SenderEntity.java b/src/com/massivecraft/mcore/store/SenderEntity.java index 73ac7d09..ac0689d5 100644 --- a/src/com/massivecraft/mcore/store/SenderEntity.java +++ b/src/com/massivecraft/mcore/store/SenderEntity.java @@ -1,16 +1,15 @@ package com.massivecraft.mcore.store; import java.util.Collection; +import java.util.UUID; import org.bukkit.GameMode; -import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.command.RemoteConsoleCommandSender; import org.bukkit.entity.Player; import com.massivecraft.mcore.mixin.Mixin; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public abstract class SenderEntity> extends Entity { @@ -18,6 +17,8 @@ public abstract class SenderEntity> extends Entity // FIELDS // -------------------------------------------- // + // TODO: With the new IdUtil containing a built in index ; + // TODO: ; Do we even need this local-cache? // We keep a reference to the sender to provide fast "reverse lookup". // The sender reference is initiated here and is kept updated using the InternalListener protected transient CommandSender sender = null; @@ -26,19 +27,20 @@ public abstract class SenderEntity> extends Entity { if ( ! this.senderInitiated) { - this.sender = SenderUtil.getSender(this.getId()); + this.sender = IdUtil.getSender(this.getId()); this.senderInitiated = true; } return this.sender; } - - // -------------------------------------------- // - // FIXED ID - // -------------------------------------------- // - - public String getFixedId() + + public String getName() { - return Mixin.tryFix(this.getId()); + return IdUtil.getName(this.getId()); + } + + public UUID getUuid() + { + return IdUtil.getUuid(this.getId()); } // -------------------------------------------- // @@ -57,48 +59,26 @@ public abstract class SenderEntity> extends Entity // IS - public boolean isSender() - { - return SenderUtil.isSenderId(this.getId()); - } - public boolean isPlayer() { - return SenderUtil.isPlayerId(this.getId()); + return IdUtil.isPlayerId(this.getId()); } public boolean isConsole() { - return SenderUtil.isConsoleId(this.getId()); - } - - public boolean isRcon() - { - return SenderUtil.isRconId(this.getId()); + return IdUtil.isConsoleId(this.getId()); } // GET - // TODO: Usage of sender instead of id here is cheating but is good performance-wise so it can be ok. - public Player getPlayer() { - return SenderUtil.getAsPlayer(this.getSender()); + return IdUtil.getAsPlayer(this.getSender()); } public ConsoleCommandSender getConsole() { - return SenderUtil.getAsConsole(this.getSender()); - } - - public RemoteConsoleCommandSender getRcon() - { - return SenderUtil.getAsRcon(this.getSender()); - } - - public BlockCommandSender getBlock() - { - return SenderUtil.getAsBlock(this.getSender()); + return IdUtil.getAsConsole(this.getSender()); } // ONLINE / OFFLINE @@ -141,46 +121,46 @@ public abstract class SenderEntity> extends Entity public boolean sendMessage(String message) { - return Mixin.message(this.getId(), message); + return Mixin.messageOne(this.getId(), message); } public boolean sendMessage(String... messages) { - return Mixin.message(this.getId(), messages); + return Mixin.messageOne(this.getId(), messages); } public boolean sendMessage(Collection messages) { - return Mixin.message(this.getId(), messages); + return Mixin.messageOne(this.getId(), messages); } // CONVENIENCE MSG public boolean msg(String msg) { - return Mixin.msg(this.getId(), msg); + return Mixin.msgOne(this.getId(), msg); } public boolean msg(String msg, Object... args) { - return Mixin.msg(this.getId(), msg, args); + return Mixin.msgOne(this.getId(), msg, args); } public boolean msg(Collection msgs) { - return Mixin.msg(this.getId(), msgs); + return Mixin.msgOne(this.getId(), msgs); } // CONVENIENCE GAME-MODE public GameMode getGameMode(GameMode def) { - return SenderUtil.getGameMode(this.getId(), def); + return IdUtil.getGameMode(this.getId(), def); } public boolean isGameMode(GameMode gm, boolean def) { - return SenderUtil.isGameMode(this.getId(), gm, def); + return IdUtil.isGameMode(this.getId(), gm, def); } } diff --git a/src/com/massivecraft/mcore/store/SenderIdSourceMixinAllPlayerIds.java b/src/com/massivecraft/mcore/store/SenderIdSourceMixinAllPlayerIds.java deleted file mode 100644 index 12b608f0..00000000 --- a/src/com/massivecraft/mcore/store/SenderIdSourceMixinAllPlayerIds.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.massivecraft.mcore.store; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import com.massivecraft.mcore.mixin.Mixin; - -public class SenderIdSourceMixinAllPlayerIds implements SenderIdSource -{ - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static SenderIdSourceMixinAllPlayerIds i = new SenderIdSourceMixinAllPlayerIds(); - public static SenderIdSourceMixinAllPlayerIds get() { return i; } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Collection> getSenderIdCollections() - { - List> ret = new ArrayList>(); - ret.add(Mixin.getAllPlayerIds()); - return ret; - } - -} diff --git a/src/com/massivecraft/mcore/store/SenderIdSourceMixinAllSenderIds.java b/src/com/massivecraft/mcore/store/SenderIdSourceMixinAllSenderIds.java index 4f793fb4..e6f1a468 100644 --- a/src/com/massivecraft/mcore/store/SenderIdSourceMixinAllSenderIds.java +++ b/src/com/massivecraft/mcore/store/SenderIdSourceMixinAllSenderIds.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.massivecraft.mcore.mixin.Mixin; +import com.massivecraft.mcore.util.IdUtil; public class SenderIdSourceMixinAllSenderIds implements SenderIdSource { @@ -23,7 +23,8 @@ public class SenderIdSourceMixinAllSenderIds implements SenderIdSource public Collection> getSenderIdCollections() { List> ret = new ArrayList>(); - ret.add(Mixin.getAllSenderIds()); + ret.add(IdUtil.getAllNames()); + ret.add(IdUtil.getAllIds()); return ret; } diff --git a/src/com/massivecraft/mcore/store/SenderIdSourceMixinOnlinePlayerIds.java b/src/com/massivecraft/mcore/store/SenderIdSourceMixinOnlinePlayerIds.java deleted file mode 100644 index aa2af0ac..00000000 --- a/src/com/massivecraft/mcore/store/SenderIdSourceMixinOnlinePlayerIds.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.massivecraft.mcore.store; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import com.massivecraft.mcore.mixin.Mixin; - -public class SenderIdSourceMixinOnlinePlayerIds implements SenderIdSource -{ - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static SenderIdSourceMixinOnlinePlayerIds i = new SenderIdSourceMixinOnlinePlayerIds(); - public static SenderIdSourceMixinOnlinePlayerIds get() { return i; } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Collection> getSenderIdCollections() - { - List> ret = new ArrayList>(); - ret.add(Mixin.getOnlinePlayerIds()); - return ret; - } - -} diff --git a/src/com/massivecraft/mcore/store/SenderIdSourceMixinOnlineSenderIds.java b/src/com/massivecraft/mcore/store/SenderIdSourceMixinOnlineSenderIds.java deleted file mode 100644 index 613a81a1..00000000 --- a/src/com/massivecraft/mcore/store/SenderIdSourceMixinOnlineSenderIds.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.massivecraft.mcore.store; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import com.massivecraft.mcore.mixin.Mixin; - -public class SenderIdSourceMixinOnlineSenderIds implements SenderIdSource -{ - // -------------------------------------------- // - // INSTANCE & CONSTRUCT - // -------------------------------------------- // - - private static SenderIdSourceMixinOnlineSenderIds i = new SenderIdSourceMixinOnlineSenderIds(); - public static SenderIdSourceMixinOnlineSenderIds get() { return i; } - - // -------------------------------------------- // - // OVERRIDE - // -------------------------------------------- // - - @Override - public Collection> getSenderIdCollections() - { - List> ret = new ArrayList>(); - ret.add(Mixin.getOnlineSenderIds()); - return ret; - } - -} diff --git a/src/com/massivecraft/mcore/teleport/EngineScheduledTeleport.java b/src/com/massivecraft/mcore/teleport/EngineScheduledTeleport.java index d0da9349..0ace92c6 100644 --- a/src/com/massivecraft/mcore/teleport/EngineScheduledTeleport.java +++ b/src/com/massivecraft/mcore/teleport/EngineScheduledTeleport.java @@ -11,8 +11,8 @@ import org.bukkit.plugin.Plugin; import com.massivecraft.mcore.EngineAbstract; import com.massivecraft.mcore.MCore; import com.massivecraft.mcore.mixin.Mixin; +import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.MUtil; -import com.massivecraft.mcore.util.SenderUtil; public class EngineScheduledTeleport extends EngineAbstract { @@ -95,14 +95,14 @@ public class EngineScheduledTeleport extends EngineAbstract if (MUtil.isSameBlock(event.getFrom(), event.getTo())) return; // ... and there is a ScheduledTeleport ... - ScheduledTeleport scheduledTeleport = teleporteeIdToScheduledTeleport.get(SenderUtil.getSenderId(event.getPlayer())); + ScheduledTeleport scheduledTeleport = teleporteeIdToScheduledTeleport.get(IdUtil.getId(event.getPlayer())); if (scheduledTeleport == null) return; // ... unschedule it ... scheduledTeleport.unschedule(); // ... and inform the teleportee. - Mixin.msg(scheduledTeleport.getTeleporteeId(), "Cancelled teleport to "+scheduledTeleport.getDestinationDesc()+"."); + Mixin.msgOne(scheduledTeleport.getTeleporteeId(), "Cancelled teleport to "+scheduledTeleport.getDestinationDesc()+"."); } } diff --git a/src/com/massivecraft/mcore/teleport/PSGetterPlayer.java b/src/com/massivecraft/mcore/teleport/PSGetterPlayer.java index 980dbfb2..7c1cd643 100644 --- a/src/com/massivecraft/mcore/teleport/PSGetterPlayer.java +++ b/src/com/massivecraft/mcore/teleport/PSGetterPlayer.java @@ -5,7 +5,7 @@ import org.bukkit.command.CommandSender; import com.massivecraft.mcore.mixin.Mixin; import com.massivecraft.mcore.ps.PS; import com.massivecraft.mcore.store.SenderEntity; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public final class PSGetterPlayer extends PSGetterAbstract { @@ -33,7 +33,7 @@ public final class PSGetterPlayer extends PSGetterAbstract public static PSGetterPlayer valueOf(CommandSender player) { - return new PSGetterPlayer(SenderUtil.getSenderId(player)); + return new PSGetterPlayer(IdUtil.getId(player)); } public static PSGetterPlayer valueOf(SenderEntity playerEntity) diff --git a/src/com/massivecraft/mcore/teleport/ScheduledTeleport.java b/src/com/massivecraft/mcore/teleport/ScheduledTeleport.java index 810422eb..c103d8c7 100644 --- a/src/com/massivecraft/mcore/teleport/ScheduledTeleport.java +++ b/src/com/massivecraft/mcore/teleport/ScheduledTeleport.java @@ -73,7 +73,7 @@ public class ScheduledTeleport implements Runnable } catch (TeleporterException e) { - Mixin.message(this.getTeleporteeId(), e.getMessage()); + Mixin.messageOne(this.getTeleporteeId(), e.getMessage()); } } diff --git a/src/com/massivecraft/mcore/util/FlyUtil.java b/src/com/massivecraft/mcore/util/FlyUtil.java new file mode 100644 index 00000000..a98487cc --- /dev/null +++ b/src/com/massivecraft/mcore/util/FlyUtil.java @@ -0,0 +1,133 @@ +package com.massivecraft.mcore.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.bukkit.GameMode; +import org.bukkit.entity.Player; + +import com.massivecraft.mcore.event.MCorePlayerFlyEvent; + +public class FlyUtil +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public final static float DEFAULT_SPEED = 0.1f; + + // -------------------------------------------- // + // LAST ALLOWED + // -------------------------------------------- // + + public static Map idToLastActive = new HashMap(); + + public static Long getLastActive(Player player) + { + return idToLastActive.get(player.getUniqueId()); + } + + public static void setLastActive(Player player, Long millis) + { + idToLastActive.put(player.getUniqueId(), millis); + } + + // -------------------------------------------- // + // UPDATE BY EVENT + // -------------------------------------------- // + + public static void update(Player player) + { + MCorePlayerFlyEvent event = new MCorePlayerFlyEvent(player); + event.run(); + + setAllowed(player, event.isAllowed()); + setActive(player, event.isActive()); + setSpeed(player, event.getSpeed()); + } + + public static void reset(Player player) + { + setAllowed(player, player.getGameMode() == GameMode.CREATIVE); + setActive(player, player.getGameMode() == GameMode.CREATIVE); + setSpeed(player, DEFAULT_SPEED); + update(player); + } + + // -------------------------------------------- // + // ALLOWED + // -------------------------------------------- // + + public static boolean setAllowed(Player player, boolean allowed) + { + // NoChange + if (isAllowed(player) == allowed) return false; + + // Apply + player.setFallDistance(0); + player.setAllowFlight(allowed); + player.setFallDistance(0); + + // Return + return true; + } + + public static boolean isAllowed(Player player) + { + return player.getAllowFlight(); + } + + // -------------------------------------------- // + // ACTIVE + // -------------------------------------------- // + + public static boolean setActive(Player player, boolean active) + { + // Last Active Update + if (active) + { + setLastActive(player, System.currentTimeMillis()); + } + + // NoChange + if (isActive(player) == active) return false; + + // Apply + player.setFallDistance(0); + player.setFlying(active); + player.setFallDistance(0); + + // Return + return true; + } + + public static boolean isActive(Player player) + { + return player.isFlying(); + } + + // -------------------------------------------- // + // ACTIVE + // -------------------------------------------- // + + public static boolean setSpeed(Player player, float speed) + { + // NoChange + if (getSpeed(player) == speed) return false; + + // Apply + player.setFallDistance(0); + player.setFlySpeed(speed); + player.setFallDistance(0); + + // Return + return true; + } + + public static float getSpeed(Player player) + { + return player.getFlySpeed(); + } + +} diff --git a/src/com/massivecraft/mcore/util/IdData.java b/src/com/massivecraft/mcore/util/IdData.java new file mode 100644 index 00000000..fd891a80 --- /dev/null +++ b/src/com/massivecraft/mcore/util/IdData.java @@ -0,0 +1,78 @@ +package com.massivecraft.mcore.util; + +public class IdData +{ + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private String id; + public String getId() { return this.id; } + + private String name; + public String getName() { return this.name; } + + private long millis; + public long getMillis() { return this.millis; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + // It's always good to have a no-arg constructor + public IdData() + { + + } + + public IdData(String id, String name) + { + this(id, name, System.currentTimeMillis()); + } + + public IdData(String id, String name, long millis) + { + if (id == null && name == null) throw new NullPointerException("Either id or name must be set. They can't both be null!"); + + this.id = id; + this.name = name; + this.millis = millis; + } + + // -------------------------------------------- // + // HASH CODE & EQUALS + // -------------------------------------------- // + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + (int) (millis ^ (millis >>> 32)); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) return true; + if (obj == null) return false; + if (!(obj instanceof IdData)) return false; + IdData other = (IdData) obj; + if (id == null) + { + if (other.id != null) return false; + } + else if (!id.equals(other.id)) return false; + if (millis != other.millis) return false; + if (name == null) + { + if (other.name != null) return false; + } + else if (!name.equals(other.name)) return false; + return true; + } + +} diff --git a/src/com/massivecraft/mcore/util/IdUpdateUtil.java b/src/com/massivecraft/mcore/util/IdUpdateUtil.java new file mode 100644 index 00000000..293717e1 --- /dev/null +++ b/src/com/massivecraft/mcore/util/IdUpdateUtil.java @@ -0,0 +1,106 @@ +package com.massivecraft.mcore.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import com.massivecraft.mcore.MCore; +import com.massivecraft.mcore.store.Coll; +import com.massivecraft.mcore.store.Entity; + +public class IdUpdateUtil +{ + // -------------------------------------------- // + // SINGLE + // -------------------------------------------- // + + public static String update(String string, boolean force) + { + if (string == null) return null; + + String ret = IdUtil.getId(string); + if (ret != null) return ret; + + if (!force) return string; + + return null; + } + + // -------------------------------------------- // + // COLL + // -------------------------------------------- // + + public static void update(Collection from, Collection to, boolean force) + { + for (String string : from) + { + string = update(string, force); + if (string == null) continue; + to.add(string); + } + } + + public static List update(List strings, boolean force) + { + List ret = new ArrayList(); + update(strings, ret, force); + return ret; + } + + public static Set update(Set strings, boolean force) + { + Set ret = new LinkedHashSet(); + update(strings, ret, force); + return ret; + } + + // -------------------------------------------- // + // COLL + // -------------------------------------------- // + + public static > void update(Coll coll) + { + update(coll, false); + } + + public static > void update(Coll coll, boolean force) + { + long pre = System.currentTimeMillis(); + MCore.get().log(Txt.parse("Pre update %s.", coll.getName())); + + int countTotal = coll.getAll().size(); + int countUpdate = 0; + for (E entity : coll.getAll()) + { + if (update(coll, entity, force)) countUpdate++; + } + + long post = System.currentTimeMillis(); + long delta = post - pre; + MCore.get().log(Txt.parse("Post update %s. Took %dms. %d/%d changed.", coll.getName(), delta, countUpdate, countTotal)); + } + + public static > boolean update(Coll coll, E entity, boolean force) + { + // Before and After + String before = coll.getId(entity); + if (before == null) return false; + String after = update(before, force); + if (after == null && !force) return false; + + // NoChange + if (MUtil.equals(before, after)) return false; + + // Apply + coll.detachEntity(entity); + if (after == null) return true; + coll.attach(entity, after); + coll.syncId(after); + + return true; + } + + +} diff --git a/src/com/massivecraft/mcore/util/IdUtil.java b/src/com/massivecraft/mcore/util/IdUtil.java new file mode 100644 index 00000000..003c6324 --- /dev/null +++ b/src/com/massivecraft/mcore/util/IdUtil.java @@ -0,0 +1,1083 @@ +package com.massivecraft.mcore.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.ConcurrentSkipListSet; + +import net.minecraft.server.v1_7_R3.DedicatedServer; +import net.minecraft.server.v1_7_R3.NBTCompressedStreamTools; +import net.minecraft.server.v1_7_R3.NBTTagCompound; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.craftbukkit.v1_7_R3.CraftServer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; + +import com.massivecraft.mcore.MCore; +import com.massivecraft.mcore.event.MCorePlayerLeaveEvent; +import com.massivecraft.mcore.event.MCoreSenderRegisterEvent; +import com.massivecraft.mcore.event.MCoreSenderUnregisterEvent; +import com.massivecraft.mcore.fetcher.Fetcher; +import com.massivecraft.mcore.fetcher.IdAndName; +import com.massivecraft.mcore.mixin.Mixin; +import com.massivecraft.mcore.store.Coll; +import com.massivecraft.mcore.store.SenderColl; +import com.massivecraft.mcore.store.SenderEntity; +import com.massivecraft.mcore.xlib.gson.reflect.TypeToken; + +/** + * Identification of a CommandSender can be done in 4 different ways. + * + * 1. CommandSender sender (the sender itself) + * 2. UUID senderUuid (the uuid for the sender) + * 3. String senderId (the string id for the sender) + * 4. String senderName (the name for the sender) + * (5). Object senderObject (any of the four above) + * + * This works very fine for players (instances of the Player class). + * The UUID would be the Mojang account uuid, the id would be the stringified UUID and the name would be the current player name (it's always unique even though it can be changed). + * + * Then there is the server console command sender (instance of ConsoleCommandSender). + * This one does not natively have a proper uuid, id or name. + * I have however given it some. + * It's very often practical being able to treat the console as any player. + * + * We provide the following features: + * - Lookup of all the data based on one of the unique parts. + * - Maintained sets for All, Online and Offline. + * + * Players are registered automatically. + * Console is registered with imaginary and deterministic data values. + * Non standard CommandSenders must be manually registered using the register method. + */ +public class IdUtil implements Listener, Runnable +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + // This class mostly contains static content. + // A few things needs an instantiated class though. + // Such as the event listeners. + + private static IdUtil i = new IdUtil(); + public static IdUtil get() { return i; } + + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + // Taken directly from my own imagination! + + public final static String IDPREFIX = "@"; + public final static String CONSOLE_ID = IDPREFIX+"console"; + public final static IdData CONSOLE_DATA = new IdData(CONSOLE_ID, CONSOLE_ID); + + // This is lock object is used when reading from and saving to this file. + // Useful since saving might happen async. + private final static Object CACHEFILE_LOCK = new Object(); + public final static File CACHEFILE = new File(MCore.get().getDataFolder(), "idnamecache.json"); + public final static File CACHEFILE_TEMP = new File(MCore.get().getDataFolder(), "idnamecache.json.temp"); + public final static Type CACHEFILE_TYPE = new TypeToken>() {}.getType(); + + // -------------------------------------------- // + // DATA STORAGE + // -------------------------------------------- // + // IdData storage. Maintaining relation between name and id. + + // The full set + private static Set datas = Collections.newSetFromMap(new ConcurrentHashMap()); + public static Set getDatas() { return datas; } + + // Id Index + private static Map idToData = new ConcurrentSkipListMap<>(String.CASE_INSENSITIVE_ORDER); + public static Map getIdToData() { return idToData; } + + // Name Index + private static Map nameToData = new ConcurrentSkipListMap<>(String.CASE_INSENSITIVE_ORDER); + public static Map getNameToData() { return nameToData; } + + // -------------------------------------------- // + // MAINTAINED SETS + // -------------------------------------------- // + // Used for chat tab completion, argument readers, etc. + + private static Set onlineIds = new ConcurrentSkipListSet<>(String.CASE_INSENSITIVE_ORDER); + public static Set getOnlineIds() { return Collections.unmodifiableSet(onlineIds); } + + private static Set onlineNames = new ConcurrentSkipListSet<>(String.CASE_INSENSITIVE_ORDER); + public static Set getOnlineNames() { return Collections.unmodifiableSet(onlineNames); } + + + private static Set allIds = new ConcurrentSkipListSet<>(String.CASE_INSENSITIVE_ORDER); + public static Set getAllIds() { return Collections.unmodifiableSet(allIds); } + + private static Set allNames = new ConcurrentSkipListSet<>(String.CASE_INSENSITIVE_ORDER); + public static Set getAllNames() { return Collections.unmodifiableSet(allNames); } + + // -------------------------------------------- // + // REGISTRY + // -------------------------------------------- // + // For registering extra custom CommandSender implementations. + // It's assumed that the getName() returns the name which is also the id. + + private static Map registryIdToSender = new ConcurrentHashMap<>(); + private static Map registrySenderToId = new ConcurrentHashMap<>(); + + public static void register(CommandSender sender) + { + if (sender == null) throw new NullPointerException("sender"); + String id = getId(sender); + String name = id; + IdData data = new IdData(id, name); + + registryIdToSender.put(id, sender); + registrySenderToId.put(sender, id); + + // Update data before the event is ran so that data is available. + update(id, name, true); + + MCoreSenderRegisterEvent event = new MCoreSenderRegisterEvent(sender, data); + event.run(); + } + + public static void unregister(CommandSender sender) + { + if (sender == null) throw new NullPointerException("sender"); + String id = getId(sender); + String name = id; + IdData data = new IdData(id, name); + + Object removed = registryIdToSender.remove(id); + registrySenderToId.remove(sender); + if (removed == null) return; + + // Update data before the event is ran so that data is available. + update(id, name, false); + + MCoreSenderUnregisterEvent event = new MCoreSenderUnregisterEvent(sender, data); + event.run(); + } + + // -------------------------------------------- // + // GET ONLINE SENDERS + // -------------------------------------------- // + // Used for retrieving the full set of senders currently present on this server. + + public static Set getOnlineSenders() + { + Set ret = new LinkedHashSet(); + + // Add Online Players + ret.addAll(Arrays.asList(Bukkit.getOnlinePlayers())); + + // Add Console + ret.add(getConsole()); + + // Add Registered + ret.addAll(registryIdToSender.values()); + + return ret; + } + + // -------------------------------------------- // + // UPDATE ONE + // -------------------------------------------- // + + // Returns the name corresponding to the removed id. + private static String removeId(String id) + { + if (id == null) throw new NullPointerException("id"); + + onlineIds.remove(id); + allIds.remove(id); + + IdData data = idToData.remove(id); + if (data == null) return null; + datas.remove(data); + return data.getName(); + } + + // Returns the id corresponding to the removed name. + private static String removeName(String name) + { + if (name == null) throw new NullPointerException("name"); + + onlineNames.remove(name); + allNames.remove(name); + + IdData data = nameToData.remove(name); + if (data == null) return null; + datas.remove(data); + return data.getId(); + } + + private static void addData(IdData data, boolean online) + { + if (data == null) throw new NullPointerException("data"); + String id = data.getId(); + String name = data.getName(); + + datas.add(data); + + if (id != null) + { + idToData.put(id, data); + } + + if (name != null) + { + nameToData.put(name, data); + } + + if (id != null && name != null) + { + if (online) onlineIds.add(id); + allIds.add(id); + + if (online) onlineNames.add(name); + allNames.add(name); + } + } + + public static void update(String id, String name) + { + update(id, name, null); + } + + public static void update(String id, String name, long millis) + { + update(id, name, millis, null); + } + + public static void update(final String id, final String name, Boolean online) + { + update(id, name, System.currentTimeMillis(), online); + } + + public static void update(final String id, final String name, final long millis, Boolean online) + { + // First Null Check + if (id == null && name == null) throw new NullPointerException("Either id or name must be set. They can't both be null."); + + // Calculate previous millis + // The millis must be newer than the previous millis for the update to continue. + Long previousMillis = null; + Long idMillis = getMillis(id); + if (idMillis != null && (previousMillis == null || idMillis < previousMillis)) + { + previousMillis = idMillis; + } + Long nameMillis = getMillis(name); + if (nameMillis != null && (previousMillis == null || nameMillis < previousMillis)) + { + previousMillis = nameMillis; + } + // The previousMillis is now null or the lowest of the two. + if (previousMillis != null && previousMillis > millis) return; + + // Online Fix + if (online == null) + { + if (id != null) + { + online = onlineIds.contains(id); + } + else if (name != null) + { + online = onlineNames.contains(name); + } + } + + // Removal of previous data + // TODO: This is not optimal but will do for now. It only "uproots" one step. + String otherId = null; + String otherName = null; + + if (id != null) otherName = removeId(id); + if (name != null) otherId = removeName(name); + + if (otherId != null && !otherId.equals(id)) removeId(otherId); + if (otherName != null && !otherName.equals(name)) removeName(otherName); + + // Adding new data + IdData data = new IdData(id, name, millis); + addData(data, online); + } + + // -------------------------------------------- // + // SETUP + // -------------------------------------------- // + // This is ran as the initial setup. + // Do not call this manually. + // It should only be called on plugin enable. + + @SuppressWarnings("deprecation") + public static void setup() + { + // Time: Start + long start = System.currentTimeMillis(); + + // Clear Datas + datas.clear(); + idToData.clear(); + nameToData.clear(); + + onlineIds.clear(); + onlineNames.clear(); + + allIds.clear(); + allNames.clear(); + + // Load Datas + loadDatas(); + + // Since Console initially does not exist we schedule the register. + Bukkit.getScheduler().scheduleSyncDelayedTask(MCore.get(), new Runnable() + { + @Override + public void run() + { + register(getConsole()); + } + }); + + // Cachefile + long ticks = 20*60; // 5min + Bukkit.getScheduler().scheduleAsyncRepeatingTask(MCore.get(), get(), ticks, ticks); + + // Register Event Listeners + Bukkit.getPluginManager().registerEvents(get(), MCore.get()); + + // Time: End + long end = System.currentTimeMillis(); + MCore.get().log(Txt.parse("Setup of IdUtil took %dms.", end-start)); + } + + // -------------------------------------------- // + // LISTENER + // -------------------------------------------- // + // Here we maintain the maps continuously. + // Filling them on setup only would not work. + // When players log on/off that must be taken note of. + + // We don't care if it's cancelled or not. + // We just wan't to make sure this id is known of and can be "fixed" asap. + // Online or not? We just use the mixin to get the actuall value. + + @EventHandler(priority = EventPriority.LOWEST) + public void playerLoginLowest(PlayerLoginEvent event) + { + Player player = event.getPlayer(); + UUID uuid = player.getUniqueId(); + String id = uuid.toString(); + String name = player.getName(); + + // Declaring Existence? Sure, whatever you were before! + boolean online = Mixin.isOnline(player); + + update(id, name, online); + } + + // Can't be cancelled + @EventHandler(priority = EventPriority.LOWEST) + public void playerJoinLowest(PlayerJoinEvent event) + { + Player player = event.getPlayer(); + UUID uuid = player.getUniqueId(); + String id = uuid.toString(); + String name = player.getName(); + + // Joining? Sure, the player is online! + boolean online = true; + + update(id, name, online); + } + + // Can't be cancelled + @EventHandler(priority = EventPriority.HIGHEST) + public void playerLeaveMonitor(MCorePlayerLeaveEvent event) + { + Player player = event.getPlayer(); + UUID uuid = player.getUniqueId(); + String id = uuid.toString(); + String name = player.getName(); + + // Leaving? Is it an actuall leave? + boolean online = !Mixin.isActualLeave(event); + + update(id, name, online); + } + + // -------------------------------------------- // + // GET DATA + // -------------------------------------------- // + // Get data from a senderObject (any of: CommandSender, UUID, String id, String name) + // These methods avoid using the data cache if possible. + + public static IdData getData(Object senderObject) + { + // Null Return + if (senderObject == null) return null; + + // Already Done + if (senderObject instanceof IdData) return (IdData) senderObject; + + // Console Type + if (senderObject instanceof ConsoleCommandSender) return CONSOLE_DATA; + + // Console Id/Name + if (CONSOLE_ID.equals(senderObject)) return CONSOLE_DATA; + + // SenderEntity Recurse + if (senderObject instanceof SenderEntity) + { + SenderEntity senderEntity = (SenderEntity)senderObject; + return getData(senderEntity.getId()); + } + + // Player + // CommandSender + // UUID + if (senderObject instanceof CommandSender || senderObject instanceof UUID) + { + String id = getId(senderObject); + return getIdToData().get(id); + } + + // String + if (senderObject instanceof String) + { + IdData ret = getIdToData().get(senderObject); + if (ret != null) return ret; + return getNameToData().get(senderObject); + } + + // Return Null + return null; + } + + public static ConsoleCommandSender getConsole() + { + return Bukkit.getConsoleSender(); + } + + public static Player getPlayer(Object senderObject) + { + return getAsPlayer(getSender(senderObject)); + } + + @SuppressWarnings("deprecation") + public static CommandSender getSender(Object senderObject) + { + // Null Return + if (senderObject == null) return null; + + // Already Done + if (senderObject instanceof CommandSender) return (CommandSender) senderObject; + + // Console Type + // Handled at "Already Done" + + // Console Id/Name + if (CONSOLE_ID.equals(senderObject)) return getConsole(); + + // SenderEntity Recurse + if (senderObject instanceof SenderEntity) + { + SenderEntity senderEntity = (SenderEntity)senderObject; + return getSender(senderEntity.getId()); + } + + // Player + // Handled at "Already Done" + + // CommandSender + // Handled at "Already Done" + + // UUID + if (senderObject instanceof UUID) + { + // Attempt finding player + UUID uuid = (UUID)senderObject; + Player player = Bukkit.getPlayer(uuid); + if (player != null) return player; + + // Otherwise assume registered sender + return registryIdToSender.get(uuid.toString()); + } + + // String + if (senderObject instanceof String) + { + // Recurse as UUID + String string = (String)senderObject; + UUID uuid = uuidFromString(string); + if (uuid != null) return getSender(uuid); + + // Registry + CommandSender sender = registryIdToSender.get(string); + if (sender != null) return sender; + + // Bukkit API + return Bukkit.getPlayerExact(string); + } + + // Return Null + return null; + } + + public static UUID getUuid(Object senderObject) + { + // Null Return + if (senderObject == null) return null; + + // Already Done + if (senderObject instanceof UUID) return (UUID)senderObject; + + // Console Type + if (senderObject instanceof ConsoleCommandSender) return null; + + // Console Id/Name + if (CONSOLE_ID.equals(senderObject)) return null; + + // SenderEntity Recurse + if (senderObject instanceof SenderEntity) + { + SenderEntity senderEntity = (SenderEntity)senderObject; + return getUuid(senderEntity.getId()); + } + + // Player + if (senderObject instanceof Player) return ((Player)senderObject).getUniqueId(); + + // CommandSender + if (senderObject instanceof CommandSender) + { + CommandSender sender = (CommandSender)senderObject; + String id = sender.getName(); + return uuidFromString(id); + } + + // UUID + // Handled at "Already Done" + + // String + if (senderObject instanceof String) + { + // Is UUID + String string = (String)senderObject; + UUID uuid = uuidFromString(string); + if (uuid != null) return uuid; + + // Is Name + // Handled at "Data" + } + + // Data + IdData data = getData(senderObject); + if (data != null) + { + String id = data.getId(); + if (id == null) return null; + UUID uuid = uuidFromString(id); + return uuid; + } + + // Return Null + return null; + } + + public static String getId(Object senderObject) + { + // Null Return + if (senderObject == null) return null; + + // Already Done + if (senderObject instanceof String && MUtil.isValidUUID((String)senderObject)) return (String)senderObject; + + // Console Type + if (senderObject instanceof ConsoleCommandSender) return CONSOLE_ID; + + // Console Id/Name + if (CONSOLE_ID.equals(senderObject)) return CONSOLE_ID; + + // SenderEntity Recurse + if (senderObject instanceof SenderEntity) + { + SenderEntity senderEntity = (SenderEntity)senderObject; + return getId(senderEntity.getId()); + } + + // Player + if (senderObject instanceof Player) return ((Player)senderObject).getUniqueId().toString(); + + // CommandSender + if (senderObject instanceof CommandSender) return ((CommandSender)senderObject).getName(); + + // UUID + if (senderObject instanceof UUID) return ((UUID)senderObject).toString(); + + // String + // Handled at "Data" + + // Data + IdData data = getData(senderObject); + if (data != null) + { + return data.getId(); + } + + // Return Null + return null; + } + + public static String getName(Object senderObject) + { + // Null Return + if (senderObject == null) return null; + + // Already Done + // Handled at "Data" (not applicable - names can look differently) + + // Console Type + if (senderObject instanceof ConsoleCommandSender) return CONSOLE_ID; + + // Console Id/Name + if (CONSOLE_ID.equals(senderObject)) return CONSOLE_ID; + + // SenderEntity Recurse + if (senderObject instanceof SenderEntity) + { + SenderEntity senderEntity = (SenderEntity)senderObject; + return getName(senderEntity.getId()); + } + + // Player + // Handled at "CommandSender" + + // CommandSender + if (senderObject instanceof CommandSender) return ((CommandSender)senderObject).getName(); + + // UUID + // Handled at "Data". + + // String + // Handled at "Data" + // Note: We try to use stored data to fix the capitalization! + + // Data + IdData data = getData(senderObject); + if (data != null) + { + return data.getName(); + } + + // TryFix Behavior + // Note: We try to use stored data to fix the capitalization! + if (senderObject instanceof String) return (String)senderObject; + + // Return Null + return null; + } + + public static boolean isOnline(Object senderObject) + { + // Fix the id ... + if (senderObject == null) return false; + String id = getId(senderObject); + if (id == null) return false; + + // ... console is always online ... + // (this counters console being offline till the first tick due to deferred register) + if (CONSOLE_ID.equals(id)) return true; + + // ... return by (case insensitive) set contains. + return getOnlineIds().contains(id); + } + + public static Long getMillis(Object senderObject) + { + IdData data = getData(senderObject); + if (data == null) return null; + return data.getMillis(); + } + + // -------------------------------------------- // + // ID TYPE CHECKING + // -------------------------------------------- // + + public static boolean isPlayerId(String string) + { + // NOTE: Assuming all custom ids look like "@shite". + return MUtil.isValidPlayerName(string) || MUtil.isValidUUID(string); + } + + public static boolean isConsoleId(String string) + { + return CONSOLE_ID.equals(string); + } + + // -------------------------------------------- // + // GET AS + // -------------------------------------------- // + + public static CommandSender getAsSender(Object object) + { + if (!(object instanceof CommandSender)) return null; + return (CommandSender) object; + } + + public static Player getAsPlayer(Object object) + { + if (!(object instanceof Player)) return null; + return (Player) object; + } + + public static ConsoleCommandSender getAsConsole(Object object) + { + if (!(object instanceof ConsoleCommandSender)) return null; + return (ConsoleCommandSender) object; + } + + // -------------------------------------------- // + // CONVENIENCE GAME-MODE + // -------------------------------------------- // + + public static GameMode getGameMode(Object object, GameMode def) + { + Player player = getPlayer(object); + if (player == null) return def; + return player.getGameMode(); + } + + public static boolean isGameMode(Object object, GameMode gm, boolean def) + { + Player player = getPlayer(object); + if (player == null) return def; + return player.getGameMode() == gm; + } + + // -------------------------------------------- // + // DATAS + // -------------------------------------------- // + + public static void loadDatas() + { + MCore.get().log(Txt.parse("Loading Playerdat datas...")); + for (IdData data : getPlayerdatDatas()) + { + update(data.getId(), data.getName(), data.getMillis(), false); + } + + MCore.get().log(Txt.parse("Loading Cachefile datas...")); + for (IdData data : getCachefileDatas()) + { + update(data.getId(), data.getName(), data.getMillis(), false); + } + + MCore.get().log(Txt.parse("Loading Onlineplayer datas...")); + for (IdData data : getOnlineplayerDatas()) + { + update(data.getId(), data.getName(), data.getMillis(), true); + } + + MCore.get().log(Txt.parse("Loading Registry datas...")); + for (String id : registryIdToSender.keySet()) + { + String name = id; + update(id, name, true); + } + + if (Bukkit.getServer().getOnlineMode()) + { + MCore.get().log(Txt.parse("Loading Dbmojangapi datas...")); + for (IdData data : getDbmojangapiDatas()) + { + update(data.getId(), data.getName(), data.getMillis()); + } + } + else + { + MCore.get().log(Txt.parse("Skipping Dbmojangapi datas since offline mode...")); + } + + + MCore.get().log(Txt.parse("Saving Cachefile...")); + saveCachefileDatas(); + } + + // -------------------------------------------- // + // CACHEFILE DATAS + // -------------------------------------------- // + + public static void saveCachefileDatas() + { + synchronized (CACHEFILE_LOCK) + { + String content = MCore.gson.toJson(datas, CACHEFILE_TYPE); + DiscUtil.writeCatch(CACHEFILE_TEMP, content); + if (!CACHEFILE_TEMP.exists()) return; + CACHEFILE.delete(); + CACHEFILE_TEMP.renameTo(CACHEFILE); + } + } + + public static Set getCachefileDatas() + { + synchronized (CACHEFILE_LOCK) + { + String content = DiscUtil.readCatch(CACHEFILE); + if (content == null) return new HashSet(); + Set ret = MCore.gson.fromJson(content, CACHEFILE_TYPE); + return ret; + } + } + + @Override + public void run() + { + saveCachefileDatas(); + } + + // -------------------------------------------- // + // PLAYERDAT DATAS + // -------------------------------------------- // + // This data source is based on the player.dat files. + // It extracts relevant NBT contents. + // NOTE: The reason this section contains some NMS is because MCore loads at startup. Some of the Bukkit API is broken then and I could not use it. + + public static File getBaseworldDirectory() + { + CraftServer cserver = (CraftServer)Bukkit.getServer(); + DedicatedServer dserver = (DedicatedServer)cserver.getServer(); + String levelName = dserver.propertyManager.getString("level-name", "world"); + return new File(Bukkit.getWorldContainer(), levelName); + } + + public static File getPlayerdatDirectory() + { + // after 1.7.8 + // a2cce16b-9494-45ff-b5ff-0362ca687d4e.dat (the uuid) + return new File(getBaseworldDirectory(), "playerdata"); + } + + public static Set getPlayerdatDatas() + { + Set ret = new LinkedHashSet(); + + // Get the directory + File directory = getPlayerdatDirectory(); + + // List the files in the directory + File[] files = directory.listFiles(); + + // The directory may not exist + if (files == null) return ret; + + // For each file + for (File file : files) + { + IdData data = getPlayerdatData(file); + if (data == null) continue; + ret.add(data); + } + + return ret; + } + + // For the data to be interesting it must contain the bukkit.laskKnownName NBT entry. + // It's especially nice if bukkit.lastPlayed also is present. + // If bukkit.lastPlayed isn't present we will set lastPlayed millis to 0 in the data. + // This will mean the data is considered quite uncertain since data entries are prioritized after their millis. + public static IdData getPlayerdatData(File file) + { + // Get filename + String filename = file.getName(); + + // Ensure filename ends with ".dat" + if (!filename.toLowerCase().endsWith(".dat")) return null; + + // Pick id through ".dat" removal + String id = filename.substring(0, filename.length()-4); + + // Ensure file name was of the correct format + UUID uuid = uuidFromString(id); + if (uuid == null) return null; + + // Load Compound + NBTTagCompound compound = loadTagCompound(file); + if (compound == null) return null; + + // Get Compound --> bukkit + if (!compound.hasKey("bukkit")) return null; + NBTTagCompound bukkit = compound.getCompound("bukkit"); + if (bukkit == null) return null; + + // Get Compound --> bukkit --> lastKnownName + if (!bukkit.hasKey("lastKnownName")) return null; + String name = bukkit.getString("lastKnownName"); + if (name == null) return null; + + // Last Played? + long lastPlayed = 0; + if (bukkit.hasKey("lastPlayed")) + { + lastPlayed = bukkit.getLong("lastPlayed"); + } + + // Add to ret + return new IdData(id, name, lastPlayed); + } + + public static NBTTagCompound loadTagCompound(File file) + { + if (!file.exists()) return null; + try + { + return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file))); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + } + + // -------------------------------------------- // + // ONLINEPLAYER DATAS + // -------------------------------------------- // + // This data source is simply based on the players currently online + + public static Set getOnlineplayerDatas() + { + Set ret = new LinkedHashSet(); + + long millis = System.currentTimeMillis(); + + for (Player player : Bukkit.getOnlinePlayers()) + { + String id = getId(player); + if (id == null) throw new NullPointerException("id"); + + String name = getName(player); + if (name == null) throw new NullPointerException("name"); + + IdData data = new IdData(id, name, millis); + + ret.add(data); + } + + return ret; + } + + // -------------------------------------------- // + // DBMOJANGAPI DATAS + // -------------------------------------------- // + // This data source searches the database for player names and ids (strings). + // It then discards the strings already present in IdUtil. + // The renaming strings are queried through the Mojang API. + + public static Set getDbmojangapiDatas() + { + Set ret = new LinkedHashSet(); + + // Add valid names from DB + Set strings = new TreeSet(String.CASE_INSENSITIVE_ORDER); + for (Coll coll : Coll.getInstances()) + { + if (!(coll instanceof SenderColl)) continue; + for (String id : coll.getIds()) + { + // https://github.com/Mojang/AccountsClient/issues/2 + // Would have been nice but no. Mojang did not have time to implement this feature for us :/ + //if (MUtil.isValidPlayerName(id) || MUtil.isValidUUID(id)) + if (MUtil.isValidPlayerName(id)) + { + strings.add(id); + } + } + } + MCore.get().log(Txt.parse("Player Strings Found: %d", strings.size())); + + // Remove Cached + Iterator iter = strings.iterator(); + int cached = 0; + while (iter.hasNext()) + { + String string = iter.next(); + if (getData(string) != null) + { + cached++; + iter.remove(); + } + } + MCore.get().log(Txt.parse("Player Strings Cached: %d", cached)); + MCore.get().log(Txt.parse("Player Strings Remaining: %d", strings.size())); + + // Fetch + MCore.get().log(Txt.parse("Now fetching the remaining players from Mojang API ...")); + Collection idAndNames = null; + try + { + idAndNames = Fetcher.fetch(strings); + } + catch (Exception e) + { + e.printStackTrace(); + return null; + } + MCore.get().log(Txt.parse(" ... done!")); + long millis = System.currentTimeMillis(); + + // Add + for (IdAndName idAndName : idAndNames) + { + String id = null; + UUID uuid = idAndName.getId(); + if (uuid != null) id = uuid.toString(); + + String name = idAndName.getName(); + + ret.add(new IdData(id, name, millis)); + } + + return ret; + } + + // -------------------------------------------- // + // UTIL + // -------------------------------------------- // + + public static UUID uuidFromString(String string) + { + try + { + return UUID.fromString(string); + } + catch (IllegalArgumentException e) + { + return null; + } + } + +} diff --git a/src/com/massivecraft/mcore/util/InventoryUtil.java b/src/com/massivecraft/mcore/util/InventoryUtil.java index 98682b19..8ee1e888 100644 --- a/src/com/massivecraft/mcore/util/InventoryUtil.java +++ b/src/com/massivecraft/mcore/util/InventoryUtil.java @@ -251,6 +251,50 @@ public class InventoryUtil return (PlayerInventory)cloneInventory((Inventory)inventory); } + // -------------------------------------------- // + // EQUALS + // -------------------------------------------- // + + public static boolean equals(ItemStack one, ItemStack two) + { + if (isNothing(one)) return isNothing(two); + if (isNothing(two)) return false; + return one.equals(two); + } + + public static boolean equals(ItemStack[] one, ItemStack[] two) + { + if (one == null) return two == null; + if (two == null) return false; + if (one.length != two.length) return false; + for (int i = 0; i < one.length; i++) + { + if (!equals(one[i], two[i])) return false; + } + return true; + } + + public static boolean equals(Inventory one, Inventory two) + { + if (one == null) return two == null; + if (two == null) return false; + if (!equals(one.getContents(), two.getContents())) return false; + if (one instanceof PlayerInventory) + { + PlayerInventory pone = (PlayerInventory)one; + if (two instanceof PlayerInventory) + { + PlayerInventory ptwo = (PlayerInventory)two; + return equals(pone.getArmorContents(), ptwo.getArmorContents()); + } + else + { + return false; + } + } + return true; + } + // -------------------------------------------- // // SET CONTENT // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore/util/MUtil.java b/src/com/massivecraft/mcore/util/MUtil.java index 5adb85cd..51f234d4 100644 --- a/src/com/massivecraft/mcore/util/MUtil.java +++ b/src/com/massivecraft/mcore/util/MUtil.java @@ -1,5 +1,7 @@ package com.massivecraft.mcore.util; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -12,6 +14,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.Map.Entry; import java.util.regex.Pattern; import java.util.Set; @@ -70,12 +73,30 @@ public class MUtil // IS VALID UUID // -------------------------------------------- // - // The regex for a valid UUID in string form - public final static Pattern uuidPattern = Pattern.compile("^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"); - public static boolean isValidUUID(String string) { - return uuidPattern.matcher(string).matches(); + if (string == null) return false; + try + { + UUID.fromString(string); + return true; + } + catch (Exception e) + { + return false; + } + } + + // -------------------------------------------- // + // STACK TRACE STRING + // -------------------------------------------- // + + public static String getStackTraceString() + { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + new Throwable().printStackTrace(pw); + return sw.toString(); } // -------------------------------------------- // @@ -488,7 +509,7 @@ public class MUtil public static boolean equals(Object herp, Object derp) { if (herp == null) return derp == null; - if (derp == null) return herp == null; + if (derp == null) return false; return herp.equals(derp); } @@ -634,7 +655,7 @@ public class MUtil registerExtractor(World.class, "world", ExtractorWorld.get()); registerExtractor(String.class, "worldName", ExtractorWorldName.get()); - registerExtractor(String.class, "accountId", ExtractorPlayerName.get()); + registerExtractor(String.class, "accountId", ExtractorSenderId.get()); } } diff --git a/src/com/massivecraft/mcore/util/PlayerUtil.java b/src/com/massivecraft/mcore/util/PlayerUtil.java index 6a6da583..5b92055f 100644 --- a/src/com/massivecraft/mcore/util/PlayerUtil.java +++ b/src/com/massivecraft/mcore/util/PlayerUtil.java @@ -1,47 +1,20 @@ package com.massivecraft.mcore.util; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.UUID; import java.util.concurrent.ConcurrentSkipListSet; -import net.minecraft.server.v1_7_R3.DedicatedServer; -import net.minecraft.server.v1_7_R3.EntityPlayer; -import net.minecraft.server.v1_7_R3.NBTCompressedStreamTools; -import net.minecraft.server.v1_7_R3.NBTTagCompound; -import net.minecraft.server.v1_7_R3.PacketPlayOutUpdateHealth; - import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_7_R3.CraftServer; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import com.massivecraft.mcore.MCore; -import com.massivecraft.mcore.MCoreMPlayer; -import com.massivecraft.mcore.fetcher.FetcherPlayerIdCached; -import com.massivecraft.mcore.fetcher.FetcherPlayerNameCached; -import com.massivecraft.mcore.mixin.Mixin; -import com.massivecraft.mcore.store.Coll; -import com.massivecraft.mcore.store.SenderColl; public class PlayerUtil implements Listener { @@ -156,251 +129,14 @@ public class PlayerUtil implements Listener */ public static void sendHealthFoodUpdatePacket(Player player) { + // No need for nms anymore. + // We can trigger this packet through the use of this bukkit api method: + player.setHealthScaled(player.isHealthScaled()); + /* CraftPlayer cplayer = (CraftPlayer)player; EntityPlayer eplayer = cplayer.getHandle(); eplayer.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(cplayer.getScaledHealth(), eplayer.getFoodData().a(), eplayer.getFoodData().e())); - } - - // -------------------------------------------- // - // PLAYER DIRECTORIES - // -------------------------------------------- // - // Getting the player directories even when the server just started. - // We also supply ways to pull player names or UUIDs. - - public static File getDirectoryBaseworld() - { - CraftServer cserver = (CraftServer)Bukkit.getServer(); - DedicatedServer dserver = (DedicatedServer)cserver.getServer(); - String levelName = dserver.propertyManager.getString("level-name", "world"); - return new File(Bukkit.getWorldContainer(), levelName); - } - - public static File getDirectoryPlayerdata() - { - // after 1.7.8 - // a2cce16b-9494-45ff-b5ff-0362ca687d4e.dat (the uuid) - return new File(getDirectoryBaseworld(), "playerdata"); - } - - public static List getDirectoryPlayerIds() - { - List ret = new ArrayList(); - - // Get the directory - File directory = getDirectoryPlayerdata(); - - // List the files in the directory - File[] files = directory.listFiles(); - - // The directory may not exist - if (files == null) return ret; - - // Populate by removing .dat - for (File file : files) - { - String filename = file.getName(); - - // Ensure it's actually a .dat player filefile - if (!filename.toLowerCase().endsWith(".dat")) continue; - - String uuid = filename.substring(0, filename.length()-4); - - try - { - ret.add(UUID.fromString(uuid)); - } - catch (Exception e) - { - // ignored - } - - } - - return ret; - } - - public static List getDirectoryPlayerNames() - { - List ret = new ArrayList(); - - // Get the directory - File directory = getDirectoryPlayerdata(); - - // List the files in the directory - File[] files = directory.listFiles(); - - // The directory may not exist - if (files == null) return ret; - - // For each file - for (File file : files) - { - NBTTagCompound compound = loadTagCompound(file); - if (compound == null) continue; - - if (!compound.hasKey("bukkit")) continue; - NBTTagCompound bukkit = compound.getCompound("bukkit"); - if (bukkit == null) continue; - - if (!bukkit.hasKey("lastKnownName")) continue; - String lastKnownName = bukkit.getString("lastKnownName"); - if (lastKnownName == null) continue; - - ret.add(lastKnownName); - } - - return ret; - } - - public static NBTTagCompound loadTagCompound(File file) - { - if (!file.exists()) return null; - try - { - return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file))); - } - catch (FileNotFoundException e) - { - e.printStackTrace(); - return null; - } - } - - // -------------------------------------------- // - // PLAYER ID <---> PLAYER NAME - // -------------------------------------------- // - - // Update Cache on Login - @EventHandler(priority = EventPriority.LOWEST) - public void playerIdPlayerName(PlayerLoginEvent event) - { - final String playerName = event.getPlayer().getName(); - final UUID playerId = event.getPlayer().getUniqueId(); - MCoreMPlayer mplayer = MCoreMPlayer.get(playerId, true); - mplayer.setName(playerName); - } - - public static Map getPlayerIds(Collection playerNames) - { - try - { - return FetcherPlayerIdCached.fetch(playerNames); - } - catch (Exception e) - { - e.printStackTrace(); - return new TreeMap(String.CASE_INSENSITIVE_ORDER); - } - } - public static UUID getPlayerId(String playerName) - { - List playerNames = Collections.singletonList(playerName); - Map map = getPlayerIds(playerNames); - return map.get(playerName); - } - - public static Map getPlayerNames(Collection playerIds) - { - try - { - return FetcherPlayerNameCached.fetch(playerIds); - } - catch (Exception e) - { - e.printStackTrace(); - return new HashMap(); - } - } - public static String getPlayerName(UUID playerId) - { - List playerIds = Collections.singletonList(playerId); - Map map = getPlayerNames(playerIds); - return map.get(playerId); - } - - // -------------------------------------------- // - // PLAYER ID <---> PLAYER NAME: FETCH ALL - // -------------------------------------------- // - - public static void fetchAllIds() - { - // --- Starting Information --- - MCore.get().log(Txt.parse("============================================")); - MCore.get().log(Txt.parse("We are preparing for Mojangs switch to UUIDs.")); - MCore.get().log(Txt.parse("Learn more at: https://forums.bukkit.org/threads/psa-the-switch-to-uuids-potential-plugin-server-breakage.250915/")); - MCore.get().log(Txt.parse("Now fetching and caching UUID for all player names on this server!")); - MCore.get().log(Txt.parse("The mstore collection \"mcore_mplayer\" will contain the cached information.")); - - // --- Find Player Names --- - // Here we build a set containing all player names we know of! - Set playerNames = new TreeSet(String.CASE_INSENSITIVE_ORDER); - - // All from mixin - playerNames.addAll(Mixin.getAllPlayerIds()); - - // All from sender colls - for (Coll coll : Coll.getInstances()) - { - if (!(coll instanceof SenderColl)) continue; - playerNames.addAll(coll.getIds()); - } - - // Only valid player names - Iterator iter = playerNames.iterator(); - while (iter.hasNext()) - { - String playerName =iter.next(); - if (MUtil.isValidPlayerName(playerName)) continue; - iter.remove(); - } - - // Report: Player Names Found - MCore.get().log(Txt.parse("Player Names Found: %d", playerNames.size())); - - // --- Remove Cached --- - // Here we remove what we already have cached. - iter = playerNames.iterator(); - int cached = 0; - while (iter.hasNext()) - { - String playerName = iter.next(); - MCoreMPlayer mplayer = MCoreMPlayer.get(playerName); - if (mplayer == null) continue; - if (mplayer.getName() == null) continue; - cached++; - iter.remove(); - } - MCore.get().log(Txt.parse("Player Names Cached: %d", cached)); - MCore.get().log(Txt.parse("Player Names Remaining: %d", playerNames.size())); - - // --- Fetch --- - // Here we fetch the remaining player names. - // We fetch them through the cached fetcher. - // This way we will use the mojang fetcher but also cache the result for the future. - - MCore.get().log(Txt.parse("Now fetching the remaining players from Mojang API ...")); - - getPlayerIds(playerNames); - - MCore.get().log(Txt.parse(" ... done!")); - MCore.get().log(Txt.parse("(database saving will now commence which might lock the server for a while)")); - MCore.get().log(Txt.parse("============================================")); - } - - public static List take(Collection coll, int count) - { - List ret = new ArrayList(); - - Iterator iter = coll.iterator(); - int i = 0; - while (iter.hasNext() && i < count) - { - i++; - ret.add(iter.next()); - iter.remove(); - } - - return ret; + */ } } diff --git a/src/com/massivecraft/mcore/util/SenderUtil.java b/src/com/massivecraft/mcore/util/SenderUtil.java deleted file mode 100644 index 230ffdc1..00000000 --- a/src/com/massivecraft/mcore/util/SenderUtil.java +++ /dev/null @@ -1,315 +0,0 @@ -package com.massivecraft.mcore.util; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.Map.Entry; -import java.util.TreeMap; - -import net.minecraft.server.v1_7_R3.MinecraftServer; - -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Server; -import org.bukkit.command.BlockCommandSender; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.command.RemoteConsoleCommandSender; -import org.bukkit.craftbukkit.v1_7_R3.CraftServer; -import org.bukkit.entity.Player; - -import com.massivecraft.mcore.MCore; -import com.massivecraft.mcore.event.MCoreSenderRegisterEvent; -import com.massivecraft.mcore.event.MCoreSenderUnregisterEvent; - -/** - * We add an ID <--> CommandSender lookup feature. - * Each player has an id which is the UUID of the player. - * Players are retrievable by id using Bukkit.getPlayer(). - * Other command senders have no true id. We make it so they have. - * Non-player-sender-ids always start with and ampersand (@). This is to avoid clashes with regular player names. - * The id is simply "@"+CommandSender.getName() - * Non standard CommandSenders must be manually registered to the util using the register method. - */ -public class SenderUtil -{ - // -------------------------------------------- // - // CONSTANTS - // -------------------------------------------- // - - // The id prefix - public final static String IDPREFIX = "@"; - - // Ids for standard-non-players - public final static String ID_CONSOLE = IDPREFIX+"console"; - public final static String ID_RCON = IDPREFIX+"rcon"; - - // Names for standard-non-players - public final static String VANILLA_CONSOLE_NAME = "CONSOLE"; - public final static String VANILLA_RCON_NAME = "Rcon"; - - // -------------------------------------------- // - // REGISTRY - // -------------------------------------------- // - - protected static Map idToSender = new TreeMap(String.CASE_INSENSITIVE_ORDER); - - public static synchronized boolean register(CommandSender sender) - { - if (sender == null) return false; - String id = getSenderId(sender); - idToSender.put(id, sender); - new MCoreSenderRegisterEvent(sender).run(); - return true; - } - - public static synchronized boolean unregister(CommandSender sender) - { - boolean ret = (idToSender.remove(getSenderId(sender)) != null); - if (ret) - { - new MCoreSenderUnregisterEvent(sender).run(); - } - return ret; - } - - public static Map getIdToSender() - { - return Collections.unmodifiableMap(idToSender); - } - - static - { - // Since the console and rcon initially does not exist we schedule the register for these senders. - Bukkit.getScheduler().scheduleSyncDelayedTask(MCore.get(), new Runnable() - { - @Override - public void run() - { - register(getConsole()); - register(getRcon()); - } - }); - } - - // -------------------------------------------- // - // ID TYPE CHECKING - // -------------------------------------------- // - - public static boolean isSenderId(Object o) - { - return o instanceof String || o instanceof UUID; - } - - public static boolean isPlayerId(Object o) - { - if (o instanceof UUID) return true; - if (!(o instanceof String)) return false; - String string = (String)o; - return MUtil.isValidPlayerName(string) || MUtil.isValidUUID(string); - } - - public static boolean isConsoleId(Object o) - { - return ID_CONSOLE.equals(o); - } - - public static boolean isRconId(Object o) - { - return ID_RCON.equals(o); - } - - // -------------------------------------------- // - // SENDER/OBJECT TYPE CHECKING - // -------------------------------------------- // - - public static boolean isSender(Object o) - { - return o instanceof CommandSender; - } - - public static boolean isPlayer(Object o) - { - return o instanceof Player; - } - - public static boolean isBlock(Object o) - { - return o instanceof BlockCommandSender; - } - - public static boolean isConsole(Object o) - { - if (!(o instanceof ConsoleCommandSender)) return false; - if (!VANILLA_CONSOLE_NAME.equals(((CommandSender)o).getName())) return false; - return true; - } - - public static boolean isRcon(Object o) - { - if (!(o instanceof RemoteConsoleCommandSender)) return false; - if (!VANILLA_RCON_NAME.equals(((CommandSender)o).getName())) return false; - return true; - } - - public static boolean isNonplayer(Object o) - { - if (!isSender(o)) return false; - if (isPlayer(o)) return false; - return true; - } - - // -------------------------------------------- // - // GET ID - // -------------------------------------------- // - - // TODO: Returns outdated value (name instead of ID) - public static String getSenderId(Object o) - { - if (!isSender(o)) return null; - if (isPlayer(o)) return ((CommandSender)o).getName(); - if (isConsole(o)) return ID_CONSOLE; - if (isRcon(o)) return ID_RCON; - return ((CommandSender)o).getName(); - } - - // -------------------------------------------- // - // GET SENDER - // -------------------------------------------- // - - // ACTUALL LOGIC - - // Note: Handles both player id and name. - public static synchronized CommandSender getSender(String senderId) - { - if (senderId == null) return null; - - if (MUtil.isValidPlayerName(senderId)) - { - return Bukkit.getPlayerExact(senderId); - } - - if (MUtil.isValidUUID(senderId)) - { - UUID uuid = UUID.fromString(senderId); - return Bukkit.getPlayer(uuid); - } - - return idToSender.get(senderId); - } - - // ID STUFF - - public static Player getPlayer(String senderId) - { - return getAsPlayer(getSender(senderId)); - } - - public static ConsoleCommandSender getConsole(String senderId) - { - return getAsConsole(getSender(senderId)); - } - - public static RemoteConsoleCommandSender getRcon(String senderId) - { - return getAsRcon(getSender(senderId)); - } - - // MARCHAL STUFF - - public static CommandSender getAsSender(Object o) - { - if (!isSender(o)) return null; - return (CommandSender) o; - } - - public static Player getAsPlayer(Object o) - { - if (!isPlayer(o)) return null; - return (Player) o; - } - - public static BlockCommandSender getAsBlock(Object o) - { - if (!isBlock(o)) return null; - return (BlockCommandSender) o; - } - - public static ConsoleCommandSender getAsConsole(Object o) - { - if (!isConsole(o)) return null; - return (ConsoleCommandSender) o; - } - - public static RemoteConsoleCommandSender getAsRcon(Object o) - { - if (!isRcon(o)) return null; - return (RemoteConsoleCommandSender) o; - } - - // -------------------------------------------- // - // GET STANDARD-NON-PLAYERS - // -------------------------------------------- // - - public static ConsoleCommandSender getConsole() - { - return Bukkit.getConsoleSender(); - } - - public static RemoteConsoleCommandSender getRcon() - { - Server server = Bukkit.getServer(); - CraftServer craftServer = (CraftServer)server; - MinecraftServer minecraftServer = craftServer.getServer(); - return minecraftServer.remoteConsole; - } - - // -------------------------------------------- // - // GET ALL ONLINE - // -------------------------------------------- // - - public static List getOnlineSenders() - { - List ret = new ArrayList(Arrays.asList(Bukkit.getOnlinePlayers())); - for (Entry entry : idToSender.entrySet()) - { - String id = entry.getKey(); - CommandSender sender = entry.getValue(); - if (isPlayerId(id)) continue; - ret.add(sender); - } - return ret; - } - - // -------------------------------------------- // - // CONVENIENCE GAME-MODE - // -------------------------------------------- // - - public static GameMode getGameMode(String senderId, GameMode def) - { - Player player = getPlayer(senderId); - if (player == null) return def; - return player.getGameMode(); - } - - public static boolean isGameMode(String senderId, GameMode gm, boolean def) - { - Player player = getPlayer(senderId); - if (player == null) return def; - return player.getGameMode() == gm; - } - - public static GameMode getGameMode(CommandSender sender, GameMode def) - { - return getGameMode(getSenderId(sender), def); - } - - public static boolean isGameMode(CommandSender sender, GameMode gm, boolean def) - { - return isGameMode(getSenderId(sender), gm, def); - } - -} diff --git a/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java b/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java index a836d554..7dcfe716 100644 --- a/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java +++ b/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java @@ -26,8 +26,7 @@ import org.bukkit.event.vehicle.VehicleEvent; import org.bukkit.event.vehicle.VehicleExitEvent; import com.massivecraft.mcore.ps.PS; -import com.massivecraft.mcore.store.SenderEntity; -import com.massivecraft.mcore.util.SenderUtil; +import com.massivecraft.mcore.util.IdUtil; public class ExtractorLogic { @@ -35,7 +34,7 @@ public class ExtractorLogic // SENDER // -------------------------------------------- // - public static CommandSender sender(String o) { return SenderUtil.getSender(o); } + public static CommandSender sender(String o) { return IdUtil.getSender(o); } public static CommandSender sender(PlayerEvent o) { return o.getPlayer(); } public static CommandSender sender(BlockBreakEvent o) { return o.getPlayer(); } @@ -94,11 +93,14 @@ public class ExtractorLogic public static String senderIdFromObject(Object o) { if (o == null) return null; - if (o instanceof String) return (String)o; - if (o instanceof SenderEntity) return ((SenderEntity)o).getId(); + + String id = IdUtil.getId(o); + if (id != null) return id; + CommandSender sender = senderFromObject(o); if (sender == null) return null; - return SenderUtil.getSenderId(sender); + + return IdUtil.getId(sender); } // -------------------------------------------- //