From 8675a87aba2ad3b4e141b8ae2c5c288715c9cca7 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Thu, 17 Jan 2013 15:44:38 +0100 Subject: [PATCH] Remove plugin reference from MCommand. Aim to work with CommandSender instead of Player in most situations. --- .../massivecraft/mcore5/InternalListener.java | 22 +- src/com/massivecraft/mcore5/MCore.java | 4 +- .../mcore5/PSTeleporterDefault.java | 8 +- .../mcore5/cmd/BukkitGlueCommand.java | 14 +- src/com/massivecraft/mcore5/cmd/CmdMcore.java | 6 - .../massivecraft/mcore5/cmd/HelpCommand.java | 8 - src/com/massivecraft/mcore5/cmd/MCommand.java | 122 ++-- .../mcore5/sender/BasicCommandSender.java | 54 ++ .../mcore5/sender/BasicServerOperator.java | 33 + .../mcore5/sender/FakeBlockCommandSender.java | 27 + src/com/massivecraft/mcore5/store/Coll.java | 4 + .../mcore5/store/JsonFileFilter.java | 4 +- .../massivecraft/mcore5/store/SenderColl.java | 157 +++++ .../mcore5/store/SenderEntity.java | 196 ++++++ .../store/storeadapter/StoreAdapterGson.java | 2 + .../massivecraft/mcore5/usys/cmd/CmdUsys.java | 3 +- .../mcore5/usys/cmd/CmdUsysAspect.java | 3 +- .../mcore5/usys/cmd/CmdUsysAspectList.java | 3 +- .../mcore5/usys/cmd/CmdUsysAspectShow.java | 3 +- .../mcore5/usys/cmd/CmdUsysAspectUse.java | 3 +- .../mcore5/usys/cmd/CmdUsysMultiverse.java | 3 +- .../mcore5/usys/cmd/CmdUsysMultiverseDel.java | 3 +- .../usys/cmd/CmdUsysMultiverseList.java | 3 +- .../mcore5/usys/cmd/CmdUsysMultiverseNew.java | 3 +- .../usys/cmd/CmdUsysMultiverseShow.java | 3 +- .../mcore5/usys/cmd/CmdUsysUniverse.java | 3 +- .../mcore5/usys/cmd/CmdUsysUniverseClear.java | 3 +- .../mcore5/usys/cmd/CmdUsysUniverseDel.java | 3 +- .../mcore5/usys/cmd/CmdUsysUniverseNew.java | 3 +- .../mcore5/usys/cmd/CmdUsysWorld.java | 3 +- .../mcore5/usys/cmd/UsysCommand.java | 20 - src/com/massivecraft/mcore5/util/MUtil.java | 15 +- .../massivecraft/mcore5/util/PermUtil.java | 27 +- .../massivecraft/mcore5/util/SenderUtil.java | 570 ++++++++++++++++++ .../mcore5/util/extractor/ExtractorLogic.java | 130 ++-- .../util/extractor/ExtractorPlayer.java | 8 + .../util/extractor/ExtractorPlayerName.java | 8 + .../util/extractor/ExtractorSender.java | 18 + .../util/extractor/ExtractorSenderId.java | 18 + .../mcore5/util/extractor/ExtractorWorld.java | 8 + .../util/extractor/ExtractorWorldName.java | 8 + 41 files changed, 1318 insertions(+), 218 deletions(-) create mode 100644 src/com/massivecraft/mcore5/sender/BasicCommandSender.java create mode 100644 src/com/massivecraft/mcore5/sender/BasicServerOperator.java create mode 100644 src/com/massivecraft/mcore5/sender/FakeBlockCommandSender.java create mode 100644 src/com/massivecraft/mcore5/store/SenderColl.java create mode 100644 src/com/massivecraft/mcore5/store/SenderEntity.java delete mode 100644 src/com/massivecraft/mcore5/usys/cmd/UsysCommand.java create mode 100644 src/com/massivecraft/mcore5/util/SenderUtil.java create mode 100644 src/com/massivecraft/mcore5/util/extractor/ExtractorSender.java create mode 100644 src/com/massivecraft/mcore5/util/extractor/ExtractorSenderId.java diff --git a/src/com/massivecraft/mcore5/InternalListener.java b/src/com/massivecraft/mcore5/InternalListener.java index 3a4762bf..80eaa1bd 100644 --- a/src/com/massivecraft/mcore5/InternalListener.java +++ b/src/com/massivecraft/mcore5/InternalListener.java @@ -22,6 +22,7 @@ import com.massivecraft.mcore5.event.MCoreAfterPlayerTeleportEvent; import com.massivecraft.mcore5.event.MCorePlayerLeaveEvent; import com.massivecraft.mcore5.store.Coll; import com.massivecraft.mcore5.store.PlayerColl; +import com.massivecraft.mcore5.store.SenderColl; import com.massivecraft.mcore5.util.SmokeUtil; public class InternalListener implements Listener @@ -71,26 +72,39 @@ public class InternalListener implements Listener } // -------------------------------------------- // - // PLAYER REFERENCES + // PLAYER AND SENDER REFERENCES // -------------------------------------------- // @EventHandler(priority = EventPriority.LOWEST) public void playerReferencesLoginLowest(PlayerLoginEvent event) { - PlayerColl.setPlayerRefferences(event.getPlayer().getName(), event.getPlayer()); + String id = event.getPlayer().getName(); + Player player = event.getPlayer(); + + PlayerColl.setPlayerRefferences(id, player); + SenderColl.setSenderRefferences(id, player); } @EventHandler(priority = EventPriority.MONITOR) public void playerReferencesLoginMonitor(PlayerLoginEvent event) { if (event.getResult() == Result.ALLOWED) return; - PlayerColl.setPlayerRefferences(event.getPlayer().getName(), null); + + String id = event.getPlayer().getName(); + Player player = null; + + PlayerColl.setPlayerRefferences(id, player); + SenderColl.setSenderRefferences(id, player); } @EventHandler(priority = EventPriority.MONITOR) public void playerReferencesQuitMonitor(PlayerQuitEvent event) { - PlayerColl.setPlayerRefferences(event.getPlayer().getName(), null); + String id = event.getPlayer().getName(); + Player player = null; + + PlayerColl.setPlayerRefferences(id, player); + SenderColl.setSenderRefferences(id, player); } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore5/MCore.java b/src/com/massivecraft/mcore5/MCore.java index 3cae1e57..7710e523 100644 --- a/src/com/massivecraft/mcore5/MCore.java +++ b/src/com/massivecraft/mcore5/MCore.java @@ -113,10 +113,10 @@ public class MCore extends MPlugin // Register commands this.cmdUsys = new CmdUsys(); - this.cmdUsys.register(true); + this.cmdUsys.register(this, true); this.cmdMcore = new CmdMcore(); - this.cmdMcore.register(true); + this.cmdMcore.register(this, true); this.postEnable(); } diff --git a/src/com/massivecraft/mcore5/PSTeleporterDefault.java b/src/com/massivecraft/mcore5/PSTeleporterDefault.java index 7cee87b1..a927ae8f 100644 --- a/src/com/massivecraft/mcore5/PSTeleporterDefault.java +++ b/src/com/massivecraft/mcore5/PSTeleporterDefault.java @@ -26,9 +26,7 @@ public class PSTeleporterDefault implements PSTeleporter // INSTANCE // -------------------------------------------- // - protected static PSTeleporterDefault instance = new PSTeleporterDefault(); - public static PSTeleporterDefault get() - { - return instance; - } + protected static PSTeleporterDefault i = new PSTeleporterDefault(); + public static PSTeleporterDefault get() { return i; } + } diff --git a/src/com/massivecraft/mcore5/cmd/BukkitGlueCommand.java b/src/com/massivecraft/mcore5/cmd/BukkitGlueCommand.java index 8e472c49..86397523 100644 --- a/src/com/massivecraft/mcore5/cmd/BukkitGlueCommand.java +++ b/src/com/massivecraft/mcore5/cmd/BukkitGlueCommand.java @@ -3,25 +3,25 @@ package com.massivecraft.mcore5.cmd; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import com.massivecraft.mcore5.MPlugin; import com.massivecraft.mcore5.util.Txt; public class BukkitGlueCommand extends Command { - protected MCommand mcommand; - public BukkitGlueCommand(MCommand mcommand) + public final MCommand mcommand; + public final MPlugin mplugin; + + public BukkitGlueCommand(MCommand mcommand, MPlugin mplugin) { super(mcommand.getAliases().get(0), mcommand.getDesc(), mcommand.getUseageTemplate(), mcommand.getAliases()); this.mcommand = mcommand; + this.mplugin = mplugin; } @Override public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if ( ! mcommand.p().isEnabled()) - { - return false; - } - + if ( ! mplugin.isEnabled()) return false; this.mcommand.execute(sender, Txt.tokenizeArguments(Txt.implode(args, " "))); return true; } diff --git a/src/com/massivecraft/mcore5/cmd/CmdMcore.java b/src/com/massivecraft/mcore5/cmd/CmdMcore.java index d475ba54..cd644a4f 100644 --- a/src/com/massivecraft/mcore5/cmd/CmdMcore.java +++ b/src/com/massivecraft/mcore5/cmd/CmdMcore.java @@ -21,10 +21,4 @@ public class CmdMcore extends MCommand this.msg("You are running %s", MCore.p.getDescription().getFullName()); this.msg("The id of this server is \"%s\".", Conf.serverid); } - - @Override - public MCore p() - { - return MCore.p; - } } \ No newline at end of file diff --git a/src/com/massivecraft/mcore5/cmd/HelpCommand.java b/src/com/massivecraft/mcore5/cmd/HelpCommand.java index 0b3c1927..ff5533d0 100644 --- a/src/com/massivecraft/mcore5/cmd/HelpCommand.java +++ b/src/com/massivecraft/mcore5/cmd/HelpCommand.java @@ -2,7 +2,6 @@ package com.massivecraft.mcore5.cmd; import java.util.ArrayList; -import com.massivecraft.mcore5.MPlugin; import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARInteger; import com.massivecraft.mcore5.util.Txt; @@ -42,13 +41,6 @@ public class HelpCommand extends MCommand if (pagenumber == null) return; sendMessage(Txt.getPage(lines, pagenumber, "Help for command \""+parentCommand.getAliases().get(0)+"\"", sender)); } - - @Override - public MPlugin p() - { - if (this.commandChain.size() == 0) return null; - return this.commandChain.get(this.commandChain.size()-1).p(); - } // -------------------------------------------- // // INSTANCE diff --git a/src/com/massivecraft/mcore5/cmd/MCommand.java b/src/com/massivecraft/mcore5/cmd/MCommand.java index b4c774fa..1fdd43a4 100644 --- a/src/com/massivecraft/mcore5/cmd/MCommand.java +++ b/src/com/massivecraft/mcore5/cmd/MCommand.java @@ -12,6 +12,7 @@ import org.bukkit.command.SimpleCommandMap; import org.bukkit.entity.Player; import com.massivecraft.mcore5.Lang; +import com.massivecraft.mcore5.MCore; import com.massivecraft.mcore5.MPlugin; import com.massivecraft.mcore5.cmd.arg.ArgReader; import com.massivecraft.mcore5.cmd.arg.ArgResult; @@ -19,12 +20,11 @@ import com.massivecraft.mcore5.cmd.req.IReq; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.util.BukkitCommandUtil; import com.massivecraft.mcore5.util.PermUtil; +import com.massivecraft.mcore5.util.SenderUtil; import com.massivecraft.mcore5.util.Txt; public abstract class MCommand -{ - public abstract MPlugin p(); - +{ // -------------------------------------------- // // COMMAND BEHAVIOR // -------------------------------------------- // @@ -135,12 +135,22 @@ public abstract class MCommand public boolean register() { - return register(false); + return register(MCore.p, false); + } + + public boolean register(MPlugin mplugin) + { + return this.register(mplugin, false); } public boolean register(boolean override) { - BukkitGlueCommand bgc = new BukkitGlueCommand(this); + return this.register(MCore.p, override); + } + + public boolean register(MPlugin mplugin, boolean override) + { + BukkitGlueCommand bgc = new BukkitGlueCommand(this, mplugin); SimpleCommandMap scm = BukkitCommandUtil.getBukkitCommandMap(); if (override) @@ -227,7 +237,7 @@ public abstract class MCommand // -------------------------------------------- // - // Call Validation + // CALL VALIDATION // -------------------------------------------- // /** @@ -303,7 +313,7 @@ public abstract class MCommand } // -------------------------------------------- // - // Help and Usage information + // HELP AND USAGE INFORMATION // -------------------------------------------- // public String getUseageTemplate(List commandChain, boolean addDesc, boolean onlyFirstAlias) @@ -383,42 +393,45 @@ public abstract class MCommand } // -------------------------------------------- // - // Message Sending Helpers + // MESSAGE SENDING HELPERS // -------------------------------------------- // - public void msg(String str, Object... args) + // CONVENIENCE SEND MESSAGE + + public boolean sendMessage(String message) { - sender.sendMessage(Txt.parse(str, args)); + return SenderUtil.sendMessage(this.sender, message); } - public void msg(String str) + public boolean sendMessage(String... messages) { - sender.sendMessage(Txt.parse(str)); + return SenderUtil.sendMessage(this.sender, messages); } - public void msg(Collection msgs) + public boolean sendMessage(Collection messages) { - for(String msg : msgs) - { - this.msg(msg); - } + return SenderUtil.sendMessage(this.sender, messages); } - public void sendMessage(String msg) + // CONVENIENCE MSG + + public boolean msg(String msg) { - sender.sendMessage(msg); + return SenderUtil.msg(this.sender, msg); } - public void sendMessage(Collection msgs) + public boolean msg(String msg, Object... args) { - for(String msg : msgs) - { - this.sendMessage(msg); - } + return SenderUtil.msg(this.sender, msg, args); + } + + public boolean msg(Collection msgs) + { + return SenderUtil.msg(this.sender, msgs); } // -------------------------------------------- // - // Argument Readers + // ARGUMENT READERS // -------------------------------------------- // public String argConcatFrom(int idx) @@ -458,63 +471,4 @@ public abstract class MCommand if (result.hasErrors()) this.msg(result.getErrors()); return result.getResult(); } - - // -------------------------------------------- // - // Argument Readers DEPRACATED TODO - // -------------------------------------------- // - - /*@Deprecated - public synchronized T argAs(int idx, Class clazz, String style, T defaultNotSet, T defaultNotFound) - { - if ( ! this.argIsSet(idx)) - { - return defaultNotSet; - } - IArgHandler handler = p().cmd.getArgHandler(clazz); - - if (handler == null) - { - p().log(Level.SEVERE, "There is no ArgHandler for " + clazz.getName()); - } - - T ret = handler.parse(this.arg(idx), style, this.sender, p()); - if (ret == null) - { - this.msg(handler.getErrors()); - return defaultNotFound; - } - return ret; - } - - @Deprecated - public T argAs(int idx, Class clazz, T defaultNotSet, T defaultNotFound) - { - return this.argAs(idx, clazz, null, defaultNotSet, defaultNotFound); - } - - @Deprecated - public T argAs(int idx, Class clazz, String style, T defaultNotSet) - { - return this.argAs(idx, clazz, style, defaultNotSet, null); - } - - @Deprecated - public T argAs(int idx, Class clazz, T defaultNotSet) - { - return this.argAs(idx, clazz, null, defaultNotSet, null); - } - - @Deprecated - public T argAs(int idx, Class clazz, String style) - { - return this.argAs(idx, clazz, style, null, null); - } - - @Deprecated - public T argAs(int idx, Class clazz) - { - return this.argAs(idx, clazz, (T)null, null); - } - */ - } diff --git a/src/com/massivecraft/mcore5/sender/BasicCommandSender.java b/src/com/massivecraft/mcore5/sender/BasicCommandSender.java new file mode 100644 index 00000000..a2b8453c --- /dev/null +++ b/src/com/massivecraft/mcore5/sender/BasicCommandSender.java @@ -0,0 +1,54 @@ +package com.massivecraft.mcore5.sender; + +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.permissions.PermissibleBase; + +public class BasicCommandSender extends PermissibleBase implements CommandSender +{ + private final String name; + + public BasicCommandSender(String name, boolean op, boolean opChangeable) + { + super(new BasicServerOperator(name, op, opChangeable)); + this.name = name; + } + + @Override + public void setOp(boolean value) + { + boolean before = this.isOp(); + super.setOp(value); + boolean after = this.isOp(); + if (before == after) return; + this.recalculatePermissions(); + } + + @Override + public String getName() + { + return this.name; + } + + @Override + public Server getServer() + { + return Bukkit.getServer(); + } + + @Override + public void sendMessage(String message) + { + // Per default + } + + @Override + public void sendMessage(String[] messages) + { + for (String message : messages) + { + this.sendMessage(message); + } + } +} diff --git a/src/com/massivecraft/mcore5/sender/BasicServerOperator.java b/src/com/massivecraft/mcore5/sender/BasicServerOperator.java new file mode 100644 index 00000000..9e30fe77 --- /dev/null +++ b/src/com/massivecraft/mcore5/sender/BasicServerOperator.java @@ -0,0 +1,33 @@ +package com.massivecraft.mcore5.sender; + +import org.bukkit.permissions.ServerOperator; + +public class BasicServerOperator implements ServerOperator +{ + private String name; + private boolean op; + private boolean changeable; + + public BasicServerOperator(String name, boolean op, boolean opChangeable) + { + this.name = name; + this.op = op; + this.changeable = opChangeable; + } + + @Override + public boolean isOp() + { + return this.op; + } + + @Override + public void setOp(boolean value) + { + if (!this.changeable) + { + throw new UnsupportedOperationException("Cannot change operator status for "+this.name); + } + this.op = value; + } +} diff --git a/src/com/massivecraft/mcore5/sender/FakeBlockCommandSender.java b/src/com/massivecraft/mcore5/sender/FakeBlockCommandSender.java new file mode 100644 index 00000000..6eeaa2c3 --- /dev/null +++ b/src/com/massivecraft/mcore5/sender/FakeBlockCommandSender.java @@ -0,0 +1,27 @@ +package com.massivecraft.mcore5.sender; + +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.command.BlockCommandSender; + +public class FakeBlockCommandSender extends BasicCommandSender implements BlockCommandSender +{ + public FakeBlockCommandSender() + { + super("@", true, false); + } + + @Override + public Block getBlock() + { + return Bukkit.getWorlds().get(0).getBlockAt(0, 0, 0); + } + + // -------------------------------------------- // + // INSTANCE + // -------------------------------------------- // + + private static FakeBlockCommandSender i = new FakeBlockCommandSender(); + public static FakeBlockCommandSender get() { return i; } + +} diff --git a/src/com/massivecraft/mcore5/store/Coll.java b/src/com/massivecraft/mcore5/store/Coll.java index 247b8977..8896ba83 100644 --- a/src/com/massivecraft/mcore5/store/Coll.java +++ b/src/com/massivecraft/mcore5/store/Coll.java @@ -142,10 +142,14 @@ public class Coll> implements CollInterface> extends Coll +{ + // -------------------------------------------- // + // CONSTANTS + // -------------------------------------------- // + + public final static boolean DEFAULT_LOWERCASING = true; + public final static boolean DEFAULT_CREATIVE = true; + + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + // "Lowercasing" means that the ids are always converted to lower case when fixed. + // This is highly recommended for sender colls. + // The senderIds are case insensitive by nature and some times you simply can't know the correct casing. + + protected boolean lowercasing; + public boolean isLowercasing() { return this.lowercasing; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public SenderColl(Db db, MPlugin mplugin, String name, Class entityClass, boolean creative, boolean lowercasing, Comparator idComparator, Comparator entityComparator) + { + super(db, mplugin, "ai", name, entityClass, String.class, creative, idComparator, entityComparator); + this.lowercasing = lowercasing; + } + + public SenderColl(Db db, MPlugin mplugin, String name, Class entityClass, boolean creative, boolean lowercasing) + { + this(db, mplugin, name, entityClass, creative, lowercasing, null, null); + } + + public SenderColl(Db db, MPlugin mplugin, String name, Class entityClass, boolean creative) + { + this(db, mplugin, name, entityClass, creative, DEFAULT_LOWERCASING); + } + + public SenderColl(Db db, MPlugin mplugin, String name, Class entityClass) + { + this(db, mplugin, name, entityClass, DEFAULT_CREATIVE); + } + + // -------------------------------------------- // + // EXTRAS + // -------------------------------------------- // + + @Override + public String fixId(Object oid) + { + if (oid == null) return null; + String ret = MUtil.extract(String.class, "senderId", oid); + if (ret == null) return ret; + return this.lowercasing ? ret.toLowerCase() : ret; + } + + public Collection getAllOnline() + { + return this.getAll(new Predictate() + { + public boolean apply(E entity) + { + return entity.isOnline(); + } + }); + } + + public Collection getAllOffline() + { + return this.getAll(new Predictate() + { + public boolean apply(E entity) + { + return entity.isOffline(); + } + }); + } + + // -------------------------------------------- // + // SENDER REFFERENCE MANAGEMENT + // -------------------------------------------- // + + protected void setSenderRefference(String senderId, CommandSender sender) + { + E senderEntity = this.get(senderId, false); + if (senderEntity == null) return; + senderEntity.sender = sender; + senderEntity.senderInitiated = true; + } + + public static void setSenderRefferences(String senderId, CommandSender sender) + { + for (Coll coll : Coll.instances) + { + if (!(coll instanceof SenderColl)) continue; + SenderColl senderColl = (SenderColl)coll; + senderColl.setSenderRefference(senderId, sender); + } + } + + // -------------------------------------------- // + // ARGUMENT READERS + // -------------------------------------------- // + + protected Collection> forgeAltColls() + { + Collection> ret = new ArrayList>(); + ret.add(this.getIds()); + if (this.isCreative()) + { + ret.add(PlayerUtil.getAllVisitorNames()); + ret.add(SenderUtil.getIdToSender().keySet()); + } + return ret; + } + + public ArgReader argReaderSenderIdFull() + { + return new ARStringMatchFullCI("player", this.forgeAltColls()); + } + + public ArgReader argReaderSenderIdStart() + { + return new ARStringMatchStartCI("player", this.forgeAltColls()); + } + + public ArgReader argReaderEntityFull() + { + return new ARStringEntity(this.argReaderSenderIdFull(), this); + } + + public ArgReader argReaderEntityStart() + { + return new ARStringEntity(this.argReaderSenderIdStart(), this); + } + +} diff --git a/src/com/massivecraft/mcore5/store/SenderEntity.java b/src/com/massivecraft/mcore5/store/SenderEntity.java new file mode 100644 index 00000000..b52523c4 --- /dev/null +++ b/src/com/massivecraft/mcore5/store/SenderEntity.java @@ -0,0 +1,196 @@ +package com.massivecraft.mcore5.store; + +import java.util.Collection; + +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.mcore5.util.SenderUtil; + +public abstract class SenderEntity> extends Entity +{ + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + // 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; + protected transient boolean senderInitiated = false; + public CommandSender getSender() + { + if ( ! this.senderInitiated) + { + this.sender = SenderUtil.getSender(this.getId()); + this.senderInitiated = true; + } + return this.sender; + } + + // -------------------------------------------- // + // OVERRIDES + // -------------------------------------------- // + + @Override + public SenderColl getColl() + { + return (SenderColl) super.getColl(); + } + + // -------------------------------------------- // + // SENDER UTIL METHOD MIRRORING + // -------------------------------------------- // + + // IS + + public boolean isSender() + { + return SenderUtil.isSenderId(this.getId()); + } + + public boolean isPlayer() + { + return SenderUtil.isPlayerId(this.getId()); + } + + public boolean isConsole() + { + return SenderUtil.isConsoleId(this.getId()); + } + + public boolean isRcon() + { + return SenderUtil.isRconId(this.getId()); + } + + public boolean isBlock() + { + return SenderUtil.isBlockId(this.getId()); + } + + public boolean isNonplayer() + { + return SenderUtil.isNonplayerId(this.getId()); + } + + public boolean isStandardNonplayer() + { + return SenderUtil.isStandardNonplayerId(this.getId()); + } + + public boolean isNonstandardNonplayer() + { + return SenderUtil.isNonstandardNonplayerId(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()); + } + + public ConsoleCommandSender getConsole() + { + return SenderUtil.getAsConsole(this.getSender()); + } + + public RemoteConsoleCommandSender getRcon() + { + return SenderUtil.getAsRcon(this.getSender()); + } + + public BlockCommandSender getBlock() + { + return SenderUtil.getAsBlock(this.getSender()); + } + + // ONLINE / OFFLINE + + public boolean isOnline() + { + return this.getSender() != null; + } + + public boolean isOffline() + { + return ! isOnline(); + } + + // DISPLAY NAME + + public String getDisplayName() + { + return SenderUtil.getDisplayName(this.getId()); + } + + public void setDisplayName(String displayName) + { + SenderUtil.setDisplayName(this.getId(), displayName); + } + + // LIST NAME + + public String getListName() + { + return SenderUtil.getListName(this.getId()); + } + + public void setListName(String listName) + { + SenderUtil.setListName(this.getId(), listName); + } + + // CONVENIENCE SEND MESSAGE + + public boolean sendMessage(String message) + { + return SenderUtil.sendMessage(this.getId(), message); + } + + public boolean sendMessage(String... messages) + { + return SenderUtil.sendMessage(this.getId(), messages); + } + + public boolean sendMessage(Collection messages) + { + return SenderUtil.sendMessage(this.getId(), messages); + } + + // CONVENIENCE MSG + + public boolean msg(String msg) + { + return SenderUtil.msg(this.getId(), msg); + } + + public boolean msg(String msg, Object... args) + { + return SenderUtil.msg(this.getId(), msg, args); + } + + public boolean msg(Collection msgs) + { + return SenderUtil.msg(this.getId(), msgs); + } + + // CONVENIENCE GAME-MODE + + public GameMode getGameMode(GameMode def) + { + return SenderUtil.getGameMode(this.getId(), def); + } + + public boolean isGameMode(GameMode gm, boolean def) + { + return SenderUtil.isGameMode(this.getId(), gm, def); + } + +} diff --git a/src/com/massivecraft/mcore5/store/storeadapter/StoreAdapterGson.java b/src/com/massivecraft/mcore5/store/storeadapter/StoreAdapterGson.java index 0b1d942c..ba60a6fb 100644 --- a/src/com/massivecraft/mcore5/store/storeadapter/StoreAdapterGson.java +++ b/src/com/massivecraft/mcore5/store/storeadapter/StoreAdapterGson.java @@ -19,6 +19,8 @@ public class StoreAdapterGson extends StoreAdapterAbstract @Override public void write(Coll coll, Object raw, Object entity) { + if (raw == null) throw new NullPointerException("raw"); + if (entity == null) throw new NullPointerException("entity"); Object temp = coll.getMplugin().gson.fromJson((JsonElement)raw, coll.getEntityClass()); coll.copy(temp, entity); } diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsys.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsys.java index efc7e64e..140aa8e4 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsys.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsys.java @@ -3,9 +3,10 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Conf; import com.massivecraft.mcore5.Permission; import com.massivecraft.mcore5.cmd.HelpCommand; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; -public class CmdUsys extends UsysCommand +public class CmdUsys extends MCommand { public final static String USYS = "usys"; diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspect.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspect.java index 8956b7c9..d6c2ef46 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspect.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspect.java @@ -2,9 +2,10 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; import com.massivecraft.mcore5.cmd.HelpCommand; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; -public class CmdUsysAspect extends UsysCommand +public class CmdUsysAspect extends MCommand { public CmdUsysAspectList cmdUsysAspectList = new CmdUsysAspectList(); public CmdUsysAspectShow cmdUsysAspectShow = new CmdUsysAspectShow(); diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectList.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectList.java index 9ff5eee4..1fb0443b 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectList.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectList.java @@ -4,13 +4,14 @@ import java.util.ArrayList; import java.util.List; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARInteger; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Aspect; import com.massivecraft.mcore5.usys.AspectColl; import com.massivecraft.mcore5.util.Txt; -public class CmdUsysAspectList extends UsysCommand +public class CmdUsysAspectList extends MCommand { public CmdUsysAspectList() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectShow.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectShow.java index 9fd12425..212fb844 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectShow.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectShow.java @@ -1,12 +1,13 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARAspect; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Aspect; import com.massivecraft.mcore5.util.Txt; -public class CmdUsysAspectShow extends UsysCommand +public class CmdUsysAspectShow extends MCommand { public CmdUsysAspectShow() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectUse.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectUse.java index 2929d36b..3016bbd9 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectUse.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysAspectUse.java @@ -1,13 +1,14 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARAspect; import com.massivecraft.mcore5.cmd.arg.ARMultiverse; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Aspect; import com.massivecraft.mcore5.usys.Multiverse; -public class CmdUsysAspectUse extends UsysCommand +public class CmdUsysAspectUse extends MCommand { public CmdUsysAspectUse() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverse.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverse.java index e059dcce..cc887062 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverse.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverse.java @@ -2,9 +2,10 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; import com.massivecraft.mcore5.cmd.HelpCommand; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; -public class CmdUsysMultiverse extends UsysCommand +public class CmdUsysMultiverse extends MCommand { public CmdUsysMultiverseList cmdUsysMultiverseList = new CmdUsysMultiverseList(); public CmdUsysMultiverseShow cmdUsysMultiverseShow = new CmdUsysMultiverseShow(); diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseDel.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseDel.java index 3c2b66f7..abd35fa5 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseDel.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseDel.java @@ -2,11 +2,12 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.MCore; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARMultiverse; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Multiverse; -public class CmdUsysMultiverseDel extends UsysCommand +public class CmdUsysMultiverseDel extends MCommand { public CmdUsysMultiverseDel() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseList.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseList.java index 4f2b5242..90720199 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseList.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseList.java @@ -4,13 +4,14 @@ import java.util.ArrayList; import java.util.List; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARInteger; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Multiverse; import com.massivecraft.mcore5.usys.MultiverseColl; import com.massivecraft.mcore5.util.Txt; -public class CmdUsysMultiverseList extends UsysCommand +public class CmdUsysMultiverseList extends MCommand { public CmdUsysMultiverseList() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseNew.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseNew.java index 3bb960f1..3e6e154d 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseNew.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseNew.java @@ -1,10 +1,11 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.MultiverseColl; -public class CmdUsysMultiverseNew extends UsysCommand +public class CmdUsysMultiverseNew extends MCommand { public CmdUsysMultiverseNew() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseShow.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseShow.java index 10c772d2..1c776b75 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseShow.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysMultiverseShow.java @@ -5,13 +5,14 @@ import java.util.List; import com.massivecraft.mcore5.MCore; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARMultiverse; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Aspect; import com.massivecraft.mcore5.usys.Multiverse; import com.massivecraft.mcore5.util.Txt; -public class CmdUsysMultiverseShow extends UsysCommand +public class CmdUsysMultiverseShow extends MCommand { public CmdUsysMultiverseShow() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverse.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverse.java index 59754327..88f7e406 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverse.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverse.java @@ -2,9 +2,10 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; import com.massivecraft.mcore5.cmd.HelpCommand; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; -public class CmdUsysUniverse extends UsysCommand +public class CmdUsysUniverse extends MCommand { public CmdUsysUniverseNew cmdUsysUniverseNew = new CmdUsysUniverseNew(); public CmdUsysUniverseDel cmdUsysUniverseDel = new CmdUsysUniverseDel(); diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseClear.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseClear.java index 289204f7..86182714 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseClear.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseClear.java @@ -2,11 +2,12 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.MCore; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARMultiverse; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Multiverse; -public class CmdUsysUniverseClear extends UsysCommand +public class CmdUsysUniverseClear extends MCommand { public CmdUsysUniverseClear() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseDel.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseDel.java index b3abfdf2..4705718a 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseDel.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseDel.java @@ -2,11 +2,12 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.MCore; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARMultiverse; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Multiverse; -public class CmdUsysUniverseDel extends UsysCommand +public class CmdUsysUniverseDel extends MCommand { public CmdUsysUniverseDel() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseNew.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseNew.java index 0c2c5c3c..d5a41962 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseNew.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysUniverseNew.java @@ -1,11 +1,12 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARMultiverse; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Multiverse; -public class CmdUsysUniverseNew extends UsysCommand +public class CmdUsysUniverseNew extends MCommand { public CmdUsysUniverseNew() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysWorld.java b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysWorld.java index 8f5372d9..956f1914 100644 --- a/src/com/massivecraft/mcore5/usys/cmd/CmdUsysWorld.java +++ b/src/com/massivecraft/mcore5/usys/cmd/CmdUsysWorld.java @@ -1,11 +1,12 @@ package com.massivecraft.mcore5.usys.cmd; import com.massivecraft.mcore5.Permission; +import com.massivecraft.mcore5.cmd.MCommand; import com.massivecraft.mcore5.cmd.arg.ARMultiverse; import com.massivecraft.mcore5.cmd.req.ReqHasPerm; import com.massivecraft.mcore5.usys.Multiverse; -public class CmdUsysWorld extends UsysCommand +public class CmdUsysWorld extends MCommand { public CmdUsysWorld() { diff --git a/src/com/massivecraft/mcore5/usys/cmd/UsysCommand.java b/src/com/massivecraft/mcore5/usys/cmd/UsysCommand.java deleted file mode 100644 index 55d91ffe..00000000 --- a/src/com/massivecraft/mcore5/usys/cmd/UsysCommand.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.massivecraft.mcore5.usys.cmd; - -import com.massivecraft.mcore5.MCore; -import com.massivecraft.mcore5.cmd.MCommand; - -public abstract class UsysCommand extends MCommand -{ - public MCore p; - public UsysCommand() - { - super(); - this.p = MCore.p; - } - - @Override - public MCore p() - { - return MCore.p; - } -} diff --git a/src/com/massivecraft/mcore5/util/MUtil.java b/src/com/massivecraft/mcore5/util/MUtil.java index 7a100b92..a6170447 100644 --- a/src/com/massivecraft/mcore5/util/MUtil.java +++ b/src/com/massivecraft/mcore5/util/MUtil.java @@ -18,6 +18,7 @@ import java.util.TreeSet; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; @@ -37,6 +38,8 @@ import com.massivecraft.mcore5.MCore; import com.massivecraft.mcore5.util.extractor.Extractor; import com.massivecraft.mcore5.util.extractor.ExtractorPlayer; import com.massivecraft.mcore5.util.extractor.ExtractorPlayerName; +import com.massivecraft.mcore5.util.extractor.ExtractorSender; +import com.massivecraft.mcore5.util.extractor.ExtractorSenderId; import com.massivecraft.mcore5.util.extractor.ExtractorWorld; import com.massivecraft.mcore5.util.extractor.ExtractorWorldName; @@ -366,9 +369,13 @@ public class MUtil static { - registerExtractor(World.class, "world", new ExtractorWorld()); - registerExtractor(String.class, "worldName", new ExtractorWorldName()); - registerExtractor(Player.class, "player", new ExtractorPlayer()); - registerExtractor(String.class, "playerName", new ExtractorPlayerName()); + registerExtractor(CommandSender.class, "sender", ExtractorSender.get()); + registerExtractor(String.class, "senderId", ExtractorSenderId.get()); + + registerExtractor(Player.class, "player", ExtractorPlayer.get()); + registerExtractor(String.class, "playerName", ExtractorPlayerName.get()); + + registerExtractor(World.class, "world", ExtractorWorld.get()); + registerExtractor(String.class, "worldName", ExtractorWorldName.get()); } } diff --git a/src/com/massivecraft/mcore5/util/PermUtil.java b/src/com/massivecraft/mcore5/util/PermUtil.java index 3cb2cea6..8658d48a 100644 --- a/src/com/massivecraft/mcore5/util/PermUtil.java +++ b/src/com/massivecraft/mcore5/util/PermUtil.java @@ -6,6 +6,7 @@ import java.util.Map.Entry; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.permissions.Permissible; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; @@ -18,29 +19,33 @@ public class PermUtil // HAS // -------------------------------------------- // - public static boolean has(CommandSender sender, Permission permission) + public static boolean has(Permissible permissable, Permission permission) { - return has(sender, permission.getName()); + return has(permissable, permission.getName()); } - public static boolean has(CommandSender sender, String perm) + public static boolean has(Permissible permissable, String perm) { - if (sender == null) return false; - return sender.hasPermission(perm); + if (permissable == null) return false; + return permissable.hasPermission(perm); } - public static boolean has(CommandSender sender, Permission permission, boolean verbose) + public static boolean has(Permissible permissable, Permission permission, boolean verbose) { - return has(sender, permission.getName(), verbose); + return has(permissable, permission.getName(), verbose); } - public static boolean has(CommandSender sender, String perm, boolean verbose) + public static boolean has(Permissible permissable, String perm, boolean verbose) { - if (has(sender, perm)) + if (has(permissable, perm)) { return true; } - else if (verbose && sender != null) + else if (verbose && permissable != null) { - sender.sendMessage(getForbiddenMessage(perm)); + if (permissable instanceof CommandSender) + { + CommandSender sender = (CommandSender)permissable; + sender.sendMessage(getForbiddenMessage(perm)); + } } return false; } diff --git a/src/com/massivecraft/mcore5/util/SenderUtil.java b/src/com/massivecraft/mcore5/util/SenderUtil.java new file mode 100644 index 00000000..34a0ead7 --- /dev/null +++ b/src/com/massivecraft/mcore5/util/SenderUtil.java @@ -0,0 +1,570 @@ +package com.massivecraft.mcore5.util; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.TreeMap; +import java.util.regex.Pattern; + +import net.minecraft.server.v1_4_6.MinecraftServer; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +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_4_6.CraftServer; +import org.bukkit.entity.Player; + +import com.massivecraft.mcore5.sender.FakeBlockCommandSender; +import com.massivecraft.mcore5.store.SenderColl; + +/** + * This Util was created to fill out the void between the Player interface and other CommandSenders. + * + * +++ The ID +++ + * We add an ID <--> CommandSender lookup feature. + * Each player has an id which is the name of the player. Players are retrievable by id using Bukkit.getPlayerExact(). + * 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() with exception for the block command sender which we call "@block". + * Non standard CommandSenders must be manually registered to the util using the register method. + * + * +++ The DisplayName and ListName +++ + * CommandSenders can have DisplayName and ListName just like normal Player. + * + * +++ Online/Offline +++ + * Players may be Online/Offline. We allow CommandSenders to be Online/Offline as well. + * This is simply done by stating that everything non-player in online all the time. + * The ConsoleCommandSender is for example always online and never offline. + * + * +++ Easy sendMessage and dispatchCommand +++ + * This feature isn't new "fake fields" like the ones above. + * Its a suite of useful utility methods for sending messages and dispatching commands as a certain sender. + * + */ +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"; + public final static String ID_BLOCK = IDPREFIX+"block"; + + // Names for standard-non-players + public final static String VANILLA_CONSOLE_NAME = "CONSOLE"; + public final static String VANILLA_RCON_NAME = "Rcon"; + public final static String VANILLA_BLOCK_NAME = "@"; + + // Player id pattern, the regex for a valid minecraft username. + public final static Pattern playerNamePattern = Pattern.compile("^[a-zA-Z0-9_]{2,16}$"); + + // -------------------------------------------- // + // REGISTRY + // -------------------------------------------- // + + protected static Map idToSender = new TreeMap(String.CASE_INSENSITIVE_ORDER); + protected static Map idToDisplayName = new TreeMap(String.CASE_INSENSITIVE_ORDER); + protected static Map idToListName = new TreeMap(String.CASE_INSENSITIVE_ORDER); + + public static synchronized boolean register(CommandSender sender) + { + if (sender == null) return false; + String id = getSenderId(sender); + CommandSender current = idToSender.get(id); + if (current != null) return current == sender; + idToSender.put(id, sender); + SenderColl.setSenderRefferences(id, sender); + return true; + } + + public static Map getIdToSender() + { + return Collections.unmodifiableMap(idToSender); + } + + static + { + // Register + register(getConsole()); + register(getRcon()); + register(getBlock()); + + // Display Name + setDisplayName(ID_CONSOLE, ChatColor.RED.toString()+ID_CONSOLE.toUpperCase()); + setDisplayName(ID_RCON, ChatColor.RED.toString()+ID_RCON.toUpperCase()); + setDisplayName(ID_BLOCK, ChatColor.RED.toString()+ID_BLOCK.toUpperCase()); + + // List Name + setListName(ID_CONSOLE, ChatColor.RED.toString()+ID_CONSOLE.toUpperCase()); + setListName(ID_RCON, ChatColor.RED.toString()+ID_RCON.toUpperCase()); + setListName(ID_BLOCK, ChatColor.RED.toString()+ID_BLOCK.toUpperCase()); + } + + // -------------------------------------------- // + // ID TYPE CHECKING + // -------------------------------------------- // + + public static boolean isSenderId(Object o) + { + return o instanceof String; + } + + public static boolean isPlayerId(Object o) + { + if (!isSenderId(o)) return false; + return playerNamePattern.matcher((String) o).matches(); + } + + public static boolean isConsoleId(Object o) + { + return ID_CONSOLE.equals(o); + } + + public static boolean isRconId(Object o) + { + return ID_RCON.equals(o); + } + + public static boolean isBlockId(Object o) + { + return ID_BLOCK.equals(o); + } + + public static boolean isNonplayerId(Object o) + { + if (!isSenderId(o)) return false; + if (isPlayerId(o)) return false; + return true; + } + + public static boolean isStandardNonplayerId(Object o) + { + if (isConsoleId(o)) return true; + if (isRconId(o)) return true; + if (isBlockId(o)) return true; + return false; + } + + public static boolean isNonstandardNonplayerId(Object o) + { + if (!isSenderId(o)) return false; + if (isStandardNonplayerId(o)) return false; + if (isPlayerId(o)) return false; + return true; + } + + // -------------------------------------------- // + // SENDER/OBJECT TYPE CHECKING + // -------------------------------------------- // + + public static boolean isSender(Object o) + { + // The object must be a CommandSender and musn't be null. + return o instanceof CommandSender; + } + + public static boolean isPlayer(Object o) + { + return o instanceof Player; + } + + 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 isBlock(Object o) + { + if (!(o instanceof BlockCommandSender)) return false; + if (!VANILLA_BLOCK_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; + } + + public static boolean isStandardNonplayer(Object o) + { + if (isConsole(o)) return true; + if (isRcon(o)) return true; + if (isBlock(o)) return true; + return false; + } + + public static boolean isNonstandardNonplayer(Object o) + { + if (!isSender(o)) return false; + if (isStandardNonplayer(o)) return false; + if (isPlayer(o)) return false; + return true; + } + + // -------------------------------------------- // + // GET 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; + if (isBlock(o)) return ID_BLOCK; + return IDPREFIX+((CommandSender)o).getName(); + } + + // -------------------------------------------- // + // GET SENDER + // -------------------------------------------- // + + // ACTUALL LOGIC + + public static synchronized CommandSender getSender(String senderId) + { + if (senderId == null) return null; + if (isPlayerId(senderId)) + { + return Bukkit.getPlayerExact(senderId); + } + 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)); + } + + public static BlockCommandSender getBlock(String senderId) + { + return getAsBlock(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 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; + } + + public static BlockCommandSender getAsBlock(Object o) + { + if (!isBlock(o)) return null; + return (BlockCommandSender) 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; + } + + public static BlockCommandSender getBlock() + { + return FakeBlockCommandSender.get(); + } + + // -------------------------------------------- // + // ONLINE/OFFLINE + // -------------------------------------------- // + // What about visibility? And the hide player API? + + public static boolean isOnline(String senderId) + { + if (senderId == null) return false; + if (isPlayerId(senderId)) + { + Player player = Bukkit.getPlayer(senderId); + if (player == null) return false; + return player.isOnline(); + } + else + { + // Non-players must be registered for us to consider them online. + CommandSender sender = getSender(senderId); + return sender != null; + } + } + + public static boolean isOffline(String senderId) + { + return ! isOnline(senderId); + } + + public static boolean isOnline(CommandSender sender) + { + return isOnline(getSenderId(sender)); + } + + public static boolean isOffline(CommandSender sender) + { + return isOffline(getSenderId(sender)); + } + + /*public static LinkedHashSet getOnlineIds(String senderId) + { + return false; + }*/ + + // -------------------------------------------- // + // DISPLAY NAME + // -------------------------------------------- // + + public static String getDisplayName(String senderId) + { + String ret = idToDisplayName.get(senderId); + if (ret != null) return ret; + + Player player = Bukkit.getPlayer(senderId); + if (player == null) return senderId; + + return player.getDisplayName(); + } + + public static void setDisplayName(String senderId, String displayName) + { + idToDisplayName.put(senderId, displayName); + + Player player = Bukkit.getPlayer(senderId); + if (player == null) return; + + player.setDisplayName(displayName); + } + + public static String getDisplayName(CommandSender sender) + { + return getDisplayName(getSenderId(sender)); + } + + public static void setDisplayName(CommandSender sender, String displayName) + { + setDisplayName(getSenderId(sender), displayName); + } + + // -------------------------------------------- // + // LIST NAME + // -------------------------------------------- // + + public static String getListName(String senderId) + { + String ret = idToListName.get(senderId); + if (ret != null) return ret; + + Player player = Bukkit.getPlayer(senderId); + if (player == null) return senderId; + + return player.getPlayerListName(); + } + + public static void setListName(String senderId, String displayName) + { + idToListName.put(senderId, displayName); + + Player player = Bukkit.getPlayer(senderId); + if (player == null) return; + + player.setPlayerListName(displayName); + } + + public static String getListName(CommandSender sender) + { + return getListName(getSenderId(sender)); + } + + public static void setListName(CommandSender sender, String displayName) + { + setListName(getSenderId(sender), displayName); + } + + // -------------------------------------------- // + // CONVENIENCE CMD + // -------------------------------------------- // + + public static boolean cmd(CommandSender sender, String cmd) + { + return Bukkit.dispatchCommand(sender, cmd); + } + + // -------------------------------------------- // + // CONVENIENCE SEND MESSAGE + // -------------------------------------------- // + + // sender + + public static boolean sendMessage(CommandSender sender, String message) + { + if (sender == null) return false; + sender.sendMessage(message); + return true; + } + + public static boolean sendMessage(CommandSender sender, String... messages) + { + if (sender == null) return false; + sender.sendMessage(messages); + return true; + } + + public static boolean sendMessage(CommandSender sender, Collection messages) + { + if (sender == null) return false; + for (String message : messages) + { + sender.sendMessage(message); + } + return true; + } + + // senderId + + public static boolean sendMessage(String senderId, String message) + { + return sendMessage(getSender(senderId), message); + } + + public static boolean sendMessage(String senderId, String... messages) + { + return sendMessage(getSender(senderId), messages); + } + + public static boolean sendMessage(String senderId, Collection messages) + { + return sendMessage(getSender(senderId), messages); + } + + // -------------------------------------------- // + // CONVENIENCE MSG + // -------------------------------------------- // + + // sender + + public static boolean msg(CommandSender sender, String msg) + { + return sendMessage(sender, Txt.parse(msg)); + } + + public static boolean msg(CommandSender sender, String msg, Object... args) + { + return sendMessage(sender, Txt.parse(msg, args)); + } + + public static boolean msg(CommandSender sender, Collection msgs) + { + if (sender == null) return false; + for (String msg : msgs) + { + msg(sender, msg); + } + return true; + } + + // senderId + + public static boolean msg(String senderId, String msg) + { + return msg(getSender(senderId), msg); + } + + public static boolean msg(String senderId, String msg, Object... args) + { + return msg(getSender(senderId), msg, args); + } + + public static boolean msg(String senderId, Collection msgs) + { + return msg(getSender(senderId), msgs); + } + + // -------------------------------------------- // + // 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/mcore5/util/extractor/ExtractorLogic.java b/src/com/massivecraft/mcore5/util/extractor/ExtractorLogic.java index 95649ff4..5c482329 100644 --- a/src/com/massivecraft/mcore5/util/extractor/ExtractorLogic.java +++ b/src/com/massivecraft/mcore5/util/extractor/ExtractorLogic.java @@ -1,9 +1,9 @@ package com.massivecraft.mcore5.util.extractor; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; @@ -27,59 +27,90 @@ import org.bukkit.event.vehicle.VehicleExitEvent; import com.massivecraft.mcore5.PS; import com.massivecraft.mcore5.store.PlayerEntity; +import com.massivecraft.mcore5.store.SenderEntity; +import com.massivecraft.mcore5.util.SenderUtil; public class ExtractorLogic { + // -------------------------------------------- // + // SENDER + // -------------------------------------------- // + + public static CommandSender sender(String o) { return SenderUtil.getSender(o); } + + public static CommandSender sender(PlayerEvent o) { return o.getPlayer(); } + public static CommandSender sender(BlockBreakEvent o) { return o.getPlayer(); } + public static CommandSender sender(BlockDamageEvent o) { return o.getPlayer(); } + public static CommandSender sender(BlockIgniteEvent o) { return o.getPlayer(); } + public static CommandSender sender(BlockPlaceEvent o) { return o.getPlayer(); } + public static CommandSender sender(SignChangeEvent o) { return o.getPlayer(); } + public static CommandSender sender(EnchantItemEvent o) { return o.getEnchanter(); } + public static CommandSender sender(PrepareItemEnchantEvent o) { return o.getEnchanter(); } + public static CommandSender sender(Entity o) { if (o instanceof CommandSender) return (CommandSender)o; return null; } + public static CommandSender sender(EntityEvent o) { return sender(o.getEntity()); } + public static CommandSender sender(InventoryClickEvent o) { return sender(o.getWhoClicked()); } + public static CommandSender sender(InventoryCloseEvent o) { return sender(o.getPlayer()); } + public static CommandSender sender(InventoryOpenEvent o) { return sender(o.getPlayer()); } + public static CommandSender sender(HangingBreakByEntityEvent o) { return sender(o.getRemover()); } + public static CommandSender sender(VehicleDamageEvent o) { return sender(o.getAttacker()); } + public static CommandSender sender(VehicleDestroyEvent o) { return sender(o.getAttacker()); } + public static CommandSender sender(VehicleEnterEvent o) { return sender(o.getEntered()); } + public static CommandSender sender(VehicleExitEvent o) { return sender(o.getExited()); } + public static CommandSender sender(VehicleEvent o) { return sender(o.getVehicle().getPassenger()); } + + public static CommandSender senderFromObject(Object o) + { + if (o == null) return null; + + if (o instanceof CommandSender) return (CommandSender)o; + + if (o instanceof String) return sender((String)o); + if (o instanceof PlayerEvent) return sender((PlayerEvent)o); + if (o instanceof BlockBreakEvent) return sender((BlockBreakEvent)o); + if (o instanceof BlockDamageEvent) return sender((BlockDamageEvent)o); + if (o instanceof BlockIgniteEvent) return sender((BlockIgniteEvent)o); + if (o instanceof BlockPlaceEvent) return sender((BlockPlaceEvent)o); + if (o instanceof SignChangeEvent) return sender((SignChangeEvent)o); + if (o instanceof EnchantItemEvent) return sender((EnchantItemEvent)o); + if (o instanceof PrepareItemEnchantEvent) return sender((PrepareItemEnchantEvent)o); + if (o instanceof Entity) return sender((Entity)o); + if (o instanceof EntityEvent) return sender((EntityEvent)o); + if (o instanceof InventoryClickEvent) return sender((InventoryClickEvent)o); + if (o instanceof InventoryCloseEvent) return sender((InventoryCloseEvent)o); + if (o instanceof InventoryOpenEvent) return sender((InventoryOpenEvent)o); + if (o instanceof HangingBreakByEntityEvent) return sender((HangingBreakByEntityEvent)o); + if (o instanceof VehicleDamageEvent) return sender((VehicleDamageEvent)o); + if (o instanceof VehicleDestroyEvent) return sender((VehicleDestroyEvent)o); + if (o instanceof VehicleEnterEvent) return sender((VehicleEnterEvent)o); + if (o instanceof VehicleExitEvent) return sender((VehicleExitEvent)o); + if (o instanceof VehicleEvent) return sender((VehicleEvent)o); + + return null; + } + + // -------------------------------------------- // + // SENDER ID + // -------------------------------------------- // + + 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(); + if (o instanceof PlayerEntity) return ((PlayerEntity)o).getId(); + CommandSender sender = senderFromObject(o); + if (sender == null) return null; + return SenderUtil.getSenderId(sender); + } + // -------------------------------------------- // // PLAYER // -------------------------------------------- // - public static Player player(String o) { return Bukkit.getPlayerExact(o); } - public static Player player(PlayerEvent o) { return o.getPlayer(); } - public static Player player(BlockBreakEvent o) { return o.getPlayer(); } - public static Player player(BlockDamageEvent o) { return o.getPlayer(); } - public static Player player(BlockIgniteEvent o) { return o.getPlayer(); } - public static Player player(BlockPlaceEvent o) { return o.getPlayer(); } - public static Player player(SignChangeEvent o) { return o.getPlayer(); } - public static Player player(EnchantItemEvent o) { return o.getEnchanter(); } - public static Player player(PrepareItemEnchantEvent o) { return o.getEnchanter(); } - public static Player player(Entity o) { if (o instanceof Player) return (Player)o; return null; } - public static Player player(EntityEvent o) { return player(o.getEntity()); } - public static Player player(InventoryClickEvent o) { return player(o.getWhoClicked()); } - public static Player player(InventoryCloseEvent o) { return player(o.getPlayer()); } - public static Player player(InventoryOpenEvent o) { return player(o.getPlayer()); } - public static Player player(HangingBreakByEntityEvent o) { return player(o.getRemover()); } - public static Player player(VehicleDamageEvent o) { return player(o.getAttacker()); } - public static Player player(VehicleDestroyEvent o) { return player(o.getAttacker()); } - public static Player player(VehicleEnterEvent o) { return player(o.getEntered()); } - public static Player player(VehicleExitEvent o) { return player(o.getExited()); } - public static Player player(VehicleEvent o) { return player(o.getVehicle().getPassenger()); } - public static Player playerFromObject(Object o) { - if (o instanceof Player) return (Player)o; - - if (o instanceof String) return player((String)o); - if (o instanceof PlayerEvent) return player((PlayerEvent)o); - if (o instanceof BlockBreakEvent) return player((BlockBreakEvent)o); - if (o instanceof BlockDamageEvent) return player((BlockDamageEvent)o); - if (o instanceof BlockIgniteEvent) return player((BlockIgniteEvent)o); - if (o instanceof BlockPlaceEvent) return player((BlockPlaceEvent)o); - if (o instanceof SignChangeEvent) return player((SignChangeEvent)o); - if (o instanceof EnchantItemEvent) return player((EnchantItemEvent)o); - if (o instanceof PrepareItemEnchantEvent) return player((PrepareItemEnchantEvent)o); - if (o instanceof Entity) return player((Entity)o); - if (o instanceof EntityEvent) return player((EntityEvent)o); - if (o instanceof InventoryClickEvent) return player((InventoryClickEvent)o); - if (o instanceof InventoryCloseEvent) return player((InventoryCloseEvent)o); - if (o instanceof InventoryOpenEvent) return player((InventoryOpenEvent)o); - if (o instanceof HangingBreakByEntityEvent) return player((HangingBreakByEntityEvent)o); - if (o instanceof VehicleDamageEvent) return player((VehicleDamageEvent)o); - if (o instanceof VehicleDestroyEvent) return player((VehicleDestroyEvent)o); - if (o instanceof VehicleEnterEvent) return player((VehicleEnterEvent)o); - if (o instanceof VehicleExitEvent) return player((VehicleExitEvent)o); - if (o instanceof VehicleEvent) return player((VehicleEvent)o); - + CommandSender sender = senderFromObject(o); + if (sender instanceof Player) return (Player)sender; return null; } @@ -89,11 +120,10 @@ public class ExtractorLogic public static String playerNameFromObject(Object o) { - if (o instanceof String) return (String)o; - if (o instanceof PlayerEntity) return ((PlayerEntity)o).getId(); - Player player = playerFromObject(o); - if (player == null) return null; - return player.getName(); + String senderId = senderIdFromObject(o); + //if (SenderUtil.isPlayerId(senderId)) return senderId; + //return null; + return senderId; } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayer.java b/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayer.java index c212c640..5dffff07 100644 --- a/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayer.java +++ b/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayer.java @@ -7,4 +7,12 @@ public class ExtractorPlayer implements Extractor { return ExtractorLogic.playerFromObject(o); } + + // -------------------------------------------- // + // INSTANCE + // -------------------------------------------- // + + private static ExtractorPlayer i = new ExtractorPlayer(); + public static ExtractorPlayer get() { return i; } + } diff --git a/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayerName.java b/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayerName.java index 354e19b7..179c6e4a 100644 --- a/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayerName.java +++ b/src/com/massivecraft/mcore5/util/extractor/ExtractorPlayerName.java @@ -7,4 +7,12 @@ public class ExtractorPlayerName implements Extractor { return ExtractorLogic.playerNameFromObject(o); } + + // -------------------------------------------- // + // INSTANCE + // -------------------------------------------- // + + private static ExtractorPlayerName i = new ExtractorPlayerName(); + public static ExtractorPlayerName get() { return i; } + } diff --git a/src/com/massivecraft/mcore5/util/extractor/ExtractorSender.java b/src/com/massivecraft/mcore5/util/extractor/ExtractorSender.java new file mode 100644 index 00000000..7ad942e7 --- /dev/null +++ b/src/com/massivecraft/mcore5/util/extractor/ExtractorSender.java @@ -0,0 +1,18 @@ +package com.massivecraft.mcore5.util.extractor; + +public class ExtractorSender implements Extractor +{ + @Override + public Object extract(Object o) + { + return ExtractorLogic.senderFromObject(o); + } + + // -------------------------------------------- // + // INSTANCE + // -------------------------------------------- // + + private static ExtractorSender i = new ExtractorSender(); + public static ExtractorSender get() { return i; } + +} diff --git a/src/com/massivecraft/mcore5/util/extractor/ExtractorSenderId.java b/src/com/massivecraft/mcore5/util/extractor/ExtractorSenderId.java new file mode 100644 index 00000000..9fbdab70 --- /dev/null +++ b/src/com/massivecraft/mcore5/util/extractor/ExtractorSenderId.java @@ -0,0 +1,18 @@ +package com.massivecraft.mcore5.util.extractor; + +public class ExtractorSenderId implements Extractor +{ + @Override + public Object extract(Object o) + { + return ExtractorLogic.senderIdFromObject(o); + } + + // -------------------------------------------- // + // INSTANCE + // -------------------------------------------- // + + private static ExtractorSenderId i = new ExtractorSenderId(); + public static ExtractorSenderId get() { return i; } + +} diff --git a/src/com/massivecraft/mcore5/util/extractor/ExtractorWorld.java b/src/com/massivecraft/mcore5/util/extractor/ExtractorWorld.java index a19c04c9..78788fda 100644 --- a/src/com/massivecraft/mcore5/util/extractor/ExtractorWorld.java +++ b/src/com/massivecraft/mcore5/util/extractor/ExtractorWorld.java @@ -7,4 +7,12 @@ public class ExtractorWorld implements Extractor { return ExtractorLogic.worldFromObject(o); } + + // -------------------------------------------- // + // INSTANCE + // -------------------------------------------- // + + private static ExtractorWorld i = new ExtractorWorld(); + public static ExtractorWorld get() { return i; } + } diff --git a/src/com/massivecraft/mcore5/util/extractor/ExtractorWorldName.java b/src/com/massivecraft/mcore5/util/extractor/ExtractorWorldName.java index 41fc23b7..37594f6c 100644 --- a/src/com/massivecraft/mcore5/util/extractor/ExtractorWorldName.java +++ b/src/com/massivecraft/mcore5/util/extractor/ExtractorWorldName.java @@ -7,4 +7,12 @@ public class ExtractorWorldName implements Extractor { return ExtractorLogic.worldNameFromObject(o); } + + // -------------------------------------------- // + // INSTANCE + // -------------------------------------------- // + + private static ExtractorWorldName i = new ExtractorWorldName(); + public static ExtractorWorldName get() { return i; } + }