From 9e5866303e8735b81e0d9f1ebf4641b97668d0cb Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Mon, 1 Oct 2012 13:18:49 +0200 Subject: [PATCH] many random updates again :P --- .../massivecraft/mcore4/InternalListener.java | 4 +- src/com/massivecraft/mcore4/MPlugin.java | 2 +- src/com/massivecraft/mcore4/SimpleConfig.java | 21 +++- .../mcore4/cmd/arg/ARAbstractStringMatch.java | 23 +++- ...RPlayerEntity.java => ARStringEntity.java} | 20 ++-- .../mcore4/cmd/arg/ARStringMatchFullCI.java | 4 +- .../mcore4/cmd/arg/ARStringMatchFullCS.java | 4 +- .../mcore4/cmd/arg/ARStringMatchStartCI.java | 11 +- .../mcore4/cmd/arg/ARStringMatchStartCS.java | 11 +- .../mcore4/event/MCorePlayerLeaveEvent.java | 4 +- src/com/massivecraft/mcore4/store/Coll.java | 30 ++++- .../mcore4/store/CollInterface.java | 3 + .../massivecraft/mcore4/store/PlayerColl.java | 47 +++++++- .../mcore4/store/PlayerEntity.java | 17 ++- src/com/massivecraft/mcore4/util/Perm.java | 111 ++++++++++++++---- .../massivecraft/mcore4/util/PlayerUtil.java | 1 + src/com/massivecraft/mcore4/util/Txt.java | 6 +- 17 files changed, 259 insertions(+), 60 deletions(-) rename src/com/massivecraft/mcore4/cmd/arg/{ARPlayerEntity.java => ARStringEntity.java} (60%) diff --git a/src/com/massivecraft/mcore4/InternalListener.java b/src/com/massivecraft/mcore4/InternalListener.java index c2fbd139..6af137da 100644 --- a/src/com/massivecraft/mcore4/InternalListener.java +++ b/src/com/massivecraft/mcore4/InternalListener.java @@ -131,14 +131,14 @@ public class InternalListener implements Listener @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void syncOnPlayerLogin(PlayerLoginEvent event) { - p.log("syncOnPlayerLogin", event.getPlayer().getName()); + //p.log("syncOnPlayerLogin", event.getPlayer().getName()); this.syncAllForPlayer(event.getPlayer()); } @EventHandler(priority = EventPriority.MONITOR) public void syncOnPlayerLeave(MCorePlayerLeaveEvent event) { - p.log("syncOnPlayerLeave", event.getPlayer().getName()); + //p.log("syncOnPlayerLeave", event.getPlayer().getName()); this.syncAllForPlayer(event.getPlayer()); } diff --git a/src/com/massivecraft/mcore4/MPlugin.java b/src/com/massivecraft/mcore4/MPlugin.java index eafc9bd5..adb1c898 100644 --- a/src/com/massivecraft/mcore4/MPlugin.java +++ b/src/com/massivecraft/mcore4/MPlugin.java @@ -59,7 +59,7 @@ public abstract class MPlugin extends JavaPlugin implements Listener public void postEnable() { - log(Txt.parse("=== ENABLE COMPLELTE (Took "+(System.currentTimeMillis()-timeEnableStart)+"ms) ===")); + log(Txt.parse("=== ENABLE COMPLETE (Took "+(System.currentTimeMillis()-timeEnableStart)+"ms) ===")); } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore4/SimpleConfig.java b/src/com/massivecraft/mcore4/SimpleConfig.java index e0790d07..d5d93171 100644 --- a/src/com/massivecraft/mcore4/SimpleConfig.java +++ b/src/com/massivecraft/mcore4/SimpleConfig.java @@ -48,9 +48,24 @@ public class SimpleConfig if (this.file().isFile()) { String content = DiscUtil.readCatch(this.file()); - if (contentRequestsDefaults(content)) return; - Object createdByGson = this.mplugin().gson.fromJson(content, this.getClass()); - Accessor.get(this.getClass()).copy(createdByGson, this); + Object toShallowLoad = null; + if (contentRequestsDefaults(content)) + { + try + { + toShallowLoad = this.getClass().newInstance(); + } + catch (Exception e) + { + e.printStackTrace(); + return; + } + } + else + { + toShallowLoad = this.mplugin().gson.fromJson(content, this.getClass()); + } + Accessor.get(this.getClass()).copy(toShallowLoad, this); } save(); } diff --git a/src/com/massivecraft/mcore4/cmd/arg/ARAbstractStringMatch.java b/src/com/massivecraft/mcore4/cmd/arg/ARAbstractStringMatch.java index a4fee16f..ca01aab6 100644 --- a/src/com/massivecraft/mcore4/cmd/arg/ARAbstractStringMatch.java +++ b/src/com/massivecraft/mcore4/cmd/arg/ARAbstractStringMatch.java @@ -20,11 +20,21 @@ public abstract class ARAbstractStringMatch implements ArgReader // Find all matches Set matches = new HashSet(); + String perfectMatch = null; + + outerloop: for (Collection altColl : this.altColls()) { for (String alt : altColl) { - if (this.matches(str, alt)) + Integer matchDistance = this.matches(str, alt); + if (matchDistance == null) continue; + if (matchDistance == 0) + { + perfectMatch = alt; + break outerloop; + } + else { matches.add(alt); } @@ -32,7 +42,11 @@ public abstract class ARAbstractStringMatch implements ArgReader } // Set result and errors - if (matches.size() == 1) + if (perfectMatch != null) + { + result.setResult(perfectMatch); + } + else if (matches.size() == 1) { result.setResult(matches.iterator().next()); } @@ -53,7 +67,10 @@ public abstract class ARAbstractStringMatch implements ArgReader // ABSTRACT // -------------------------------------------- // - public abstract boolean matches(String arg, String alt); + // return null if no match + // return 0 if perfect match + // return >0 to declare distance from perfect match + public abstract Integer matches(String arg, String alt); // -------------------------------------------- // // FIELDS diff --git a/src/com/massivecraft/mcore4/cmd/arg/ARPlayerEntity.java b/src/com/massivecraft/mcore4/cmd/arg/ARStringEntity.java similarity index 60% rename from src/com/massivecraft/mcore4/cmd/arg/ARPlayerEntity.java rename to src/com/massivecraft/mcore4/cmd/arg/ARStringEntity.java index ba56f10e..aae3cf37 100644 --- a/src/com/massivecraft/mcore4/cmd/arg/ARPlayerEntity.java +++ b/src/com/massivecraft/mcore4/cmd/arg/ARStringEntity.java @@ -1,25 +1,25 @@ package com.massivecraft.mcore4.cmd.arg; import com.massivecraft.mcore4.cmd.MCommand; -import com.massivecraft.mcore4.store.PlayerColl; -import com.massivecraft.mcore4.store.PlayerEntity; +import com.massivecraft.mcore4.store.Coll; +import com.massivecraft.mcore4.store.Entity; -public class ARPlayerEntity> implements ArgReader +public class ARStringEntity> implements ArgReader { // -------------------------------------------- // // IMPLEMENTATION // -------------------------------------------- // @Override - public ArgResult read(String str, MCommand mcommand) + public ArgResult read(String str, MCommand mcommand) { - ArgResult result = new ArgResult(); + ArgResult result = new ArgResult(); ArgResult innerResult = this.stringReader().read(str, mcommand); if (innerResult.hasResult()) { String playerName = innerResult.getResult(); - T entity = this.playerColl().get(playerName); + E entity = this.coll().get(playerName); result.setResult(entity); } else @@ -37,17 +37,17 @@ public class ARPlayerEntity> implements ArgReader protected ArgReader stringReader; public ArgReader stringReader() { return this.stringReader; } - protected PlayerColl playerColl; - public PlayerColl playerColl() { return this.playerColl; } + protected Coll coll; + public Coll coll() { return this.coll; } // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - public ARPlayerEntity(ArgReader stringReader, PlayerColl playerColl) + public ARStringEntity(ArgReader stringReader, Coll coll) { this.stringReader = stringReader; - this.playerColl = playerColl; + this.coll = coll; } } diff --git a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCI.java b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCI.java index 7828f804..65d8a0f2 100644 --- a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCI.java +++ b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCI.java @@ -9,9 +9,9 @@ public class ARStringMatchFullCI extends ARAbstractStringMatch // -------------------------------------------- // @Override - public boolean matches(String arg, String alt) + public Integer matches(String arg, String alt) { - return alt.equalsIgnoreCase(arg); + return alt.equalsIgnoreCase(arg) ? 0 : null; } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCS.java b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCS.java index 2527577c..37c317cf 100644 --- a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCS.java +++ b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchFullCS.java @@ -9,9 +9,9 @@ public class ARStringMatchFullCS extends ARAbstractStringMatch // -------------------------------------------- // @Override - public boolean matches(String arg, String alt) + public Integer matches(String arg, String alt) { - return alt.equals(arg); + return alt.equals(arg) ? 0 : null; } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCI.java b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCI.java index 04ef80d2..945891bb 100644 --- a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCI.java +++ b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCI.java @@ -9,11 +9,18 @@ public class ARStringMatchStartCI extends ARAbstractStringMatch // -------------------------------------------- // @Override - public boolean matches(String arg, String alt) + public Integer matches(String arg, String alt) { arg = arg.toLowerCase(); alt = alt.toLowerCase(); - return alt.startsWith(arg); + if (alt.startsWith(arg)) + { + return alt.length() - arg.length(); + } + else + { + return null; + } } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCS.java b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCS.java index cd51e903..fb97b9c0 100644 --- a/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCS.java +++ b/src/com/massivecraft/mcore4/cmd/arg/ARStringMatchStartCS.java @@ -9,9 +9,16 @@ public class ARStringMatchStartCS extends ARAbstractStringMatch // -------------------------------------------- // @Override - public boolean matches(String arg, String alt) + public Integer matches(String arg, String alt) { - return alt.startsWith(arg); + if (alt.startsWith(arg)) + { + return alt.length() - arg.length(); + } + else + { + return null; + } } // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore4/event/MCorePlayerLeaveEvent.java b/src/com/massivecraft/mcore4/event/MCorePlayerLeaveEvent.java index 71c015eb..68a6206c 100644 --- a/src/com/massivecraft/mcore4/event/MCorePlayerLeaveEvent.java +++ b/src/com/massivecraft/mcore4/event/MCorePlayerLeaveEvent.java @@ -8,8 +8,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import com.massivecraft.mcore4.MCore; - /** * The MCorePlayerLeaveEvent is a non-cancellable event. * It is run at the MONITOR of either PlayerKickEvent or PlayerQuitEvent. @@ -75,7 +73,7 @@ public class MCorePlayerLeaveEvent extends Event implements Runnable if (doit) { - MCore.p.log("MCorePlayerLeaveEvent", caller, player.getDisplayName(), preDisconnect, message); + //MCore.p.log("MCorePlayerLeaveEvent", caller, player.getDisplayName(), preDisconnect, message); player2event.put(this.player.getName(), this); Bukkit.getPluginManager().callEvent(this); } diff --git a/src/com/massivecraft/mcore4/store/Coll.java b/src/com/massivecraft/mcore4/store/Coll.java index 80a56fda..b768f148 100644 --- a/src/com/massivecraft/mcore4/store/Coll.java +++ b/src/com/massivecraft/mcore4/store/Coll.java @@ -72,6 +72,15 @@ public class Coll implements CollInterface protected Set ids = Collections.newSetFromMap(new ConcurrentHashMap()); @Override public Collection ids() { return Collections.unmodifiableCollection(this.ids); } @Override public Collection idsRemote() { return this.db().driver().ids(this); } + @Override public boolean containsEntity(E entity) { return this.entities.contains(entity); }; + @Override + public boolean containsId(Object oid) + { + L id = this.idFix(oid); + if (id == null) return false; + return this.ids.contains(id); + } + protected Set entities = Collections.newSetFromMap(new ConcurrentHashMap()); @Override public Collection getAll() { return Collections.unmodifiableCollection(this.entities); } @@ -112,6 +121,7 @@ public class Coll implements CollInterface { if (oid == null) return null; if (oid.getClass() == this.idClass) return this.idClass.cast(oid); + if (oid.getClass() == this.entityClass) return this.entity2id.get(oid); return null; } @@ -131,9 +141,19 @@ public class Coll implements CollInterface // COPY AND CREATE // -------------------------------------------- // + @SuppressWarnings({ "rawtypes", "unchecked" }) public void copy(Object ofrom, Object oto) { - Accessor.get(this.entityClass()).copy(ofrom, oto); + if (ofrom instanceof Entity) + { + Entity efrom = (Entity)ofrom; + Entity eto = (Entity)oto; + eto.load(efrom); + } + else + { + Accessor.get(this.entityClass()).copy(ofrom, oto); + } } // This simply creates and returns a new instance @@ -579,10 +599,16 @@ public class Coll implements CollInterface @Override public void init() { - if (instances.contains(this)) return; + if (this.inited()) return; this.syncAll(); this.examineThread = new ExamineThread(this); this.examineThread.start(); instances.add(this); } + + @Override + public boolean inited() + { + return instances.contains(this); + } } diff --git a/src/com/massivecraft/mcore4/store/CollInterface.java b/src/com/massivecraft/mcore4/store/CollInterface.java index 0911b712..1f0a7c96 100644 --- a/src/com/massivecraft/mcore4/store/CollInterface.java +++ b/src/com/massivecraft/mcore4/store/CollInterface.java @@ -36,6 +36,8 @@ public interface CollInterface // -------------------------------------------- // public Collection ids(); public Collection idsRemote(); + public boolean containsId(Object oid); + public boolean containsEntity(E entity); public Collection getAll(); public Collection getAll(Predictate where); @@ -141,6 +143,7 @@ public interface CollInterface // -------------------------------------------- // public void init(); + public boolean inited(); } \ No newline at end of file diff --git a/src/com/massivecraft/mcore4/store/PlayerColl.java b/src/com/massivecraft/mcore4/store/PlayerColl.java index cd1bae1a..af4c04f1 100644 --- a/src/com/massivecraft/mcore4/store/PlayerColl.java +++ b/src/com/massivecraft/mcore4/store/PlayerColl.java @@ -10,7 +10,7 @@ import org.bukkit.entity.Player; import com.massivecraft.mcore4.MCore; import com.massivecraft.mcore4.MPlugin; import com.massivecraft.mcore4.Predictate; -import com.massivecraft.mcore4.cmd.arg.ARPlayerEntity; +import com.massivecraft.mcore4.cmd.arg.ARStringEntity; import com.massivecraft.mcore4.cmd.arg.ARStringMatchFullCI; import com.massivecraft.mcore4.cmd.arg.ARStringMatchStartCI; import com.massivecraft.mcore4.cmd.arg.ArgReader; @@ -19,14 +19,47 @@ import com.massivecraft.mcore4.util.PlayerUtil; public class PlayerColl> extends Coll { + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + // Note that the lowercasing should be kept at either true or false. + protected boolean lowercasing = false; + public boolean isLowercasing() { return this.lowercasing; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public PlayerColl(Db db, MPlugin mplugin, String name, Class entityClass, boolean creative, boolean lowercasing) + { + super(db, mplugin, "ai", name, entityClass, String.class, creative); + this.lowercasing = lowercasing; + } + + public PlayerColl(Db db, MPlugin mplugin, String name, Class entityClass, boolean creative) + { + this(db, mplugin, name, entityClass, creative, false); + } + public PlayerColl(Db db, MPlugin mplugin, String name, Class entityClass) { - super(db, mplugin, "ai", name, entityClass, String.class, true); + this(db, mplugin, name, entityClass, true); + } + + public PlayerColl(MPlugin mplugin, String name, Class entityClass, boolean creative, boolean lowercasing) + { + this(MCore.getDb(), mplugin, name, entityClass, creative, lowercasing); + } + + public PlayerColl(MPlugin mplugin, String name, Class entityClass, boolean creative) + { + this(MCore.getDb(), mplugin, name, entityClass, creative); } public PlayerColl(MPlugin mplugin, String name, Class entityClass) { - super(MCore.getDb(), mplugin, "ai", name, entityClass, String.class, true); + this(MCore.getDb(), mplugin, name, entityClass); } // -------------------------------------------- // @@ -37,7 +70,9 @@ public class PlayerColl> extends Coll public String idFix(Object oid) { if (oid == null) return null; - return MUtil.extract(String.class, "playerName", oid); + String ret = MUtil.extract(String.class, "playerName", oid); + if (ret == null) return ret; + return this.lowercasing ? ret.toLowerCase() : ret; } public Collection getAllOnline() @@ -87,12 +122,12 @@ public class PlayerColl> extends Coll public ArgReader argReaderPlayerFull() { - return new ARPlayerEntity(this.argReaderPlayerNameFull(), this); + return new ARStringEntity(this.argReaderPlayerNameFull(), this); } public ArgReader argReaderPlayerStart() { - return new ARPlayerEntity(this.argReaderPlayerNameStart(), this); + return new ARStringEntity(this.argReaderPlayerNameStart(), this); } } diff --git a/src/com/massivecraft/mcore4/store/PlayerEntity.java b/src/com/massivecraft/mcore4/store/PlayerEntity.java index 93248820..63b1070b 100644 --- a/src/com/massivecraft/mcore4/store/PlayerEntity.java +++ b/src/com/massivecraft/mcore4/store/PlayerEntity.java @@ -2,6 +2,7 @@ package com.massivecraft.mcore4.store; import java.util.Collection; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.entity.Player; @@ -13,7 +14,21 @@ public abstract class PlayerEntity> extends Entity getColl() + { + return (PlayerColl) super.getColl(); } public boolean isOnline() diff --git a/src/com/massivecraft/mcore4/util/Perm.java b/src/com/massivecraft/mcore4/util/Perm.java index 8c188b10..9eb0cd23 100644 --- a/src/com/massivecraft/mcore4/util/Perm.java +++ b/src/com/massivecraft/mcore4/util/Perm.java @@ -6,19 +6,55 @@ import java.util.Map.Entry; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; import com.massivecraft.mcore4.Lang; public class Perm { - public static String getPermissionDescription (String perm) + // -------------------------------------------- // + // HAS + // -------------------------------------------- // + + public static boolean has(CommandSender sender, Permission permission) + { + return has(sender, permission.getName()); + } + public static boolean has(CommandSender sender, String perm) + { + if (sender == null) return false; + return sender.hasPermission(perm); + } + + public static boolean has(CommandSender sender, Permission permission, boolean verbose) + { + return has(sender, permission.getName(), verbose); + } + public static boolean has(CommandSender sender, String perm, boolean verbose) + { + if (has(sender, perm)) + { + return true; + } + else if (verbose && sender != null) + { + sender.sendMessage(getForbiddenMessage(perm)); + } + return false; + } + + // -------------------------------------------- // + // DESCRIPTIONS AND MESSAGES + // -------------------------------------------- // + + public static String getPermissionDescription(String perm) { if (perm == null) return Lang.permDoThat; Permission permission = Bukkit.getPluginManager().getPermission(perm); return getPermissionDescription(permission); } - public static String getPermissionDescription (Permission perm) + public static String getPermissionDescription(Permission perm) { if (perm == null) return Lang.permDoThat; String desc = perm.getDescription(); @@ -31,24 +67,9 @@ public class Perm return Txt.parse(Lang.permForbidden, getPermissionDescription(perm)); } - public static boolean has (CommandSender me, String perm) - { - if (me == null) return false; - return me.hasPermission(perm); - } - - public static boolean has (CommandSender me, String perm, boolean verbose) - { - if (has(me, perm)) - { - return true; - } - else if (verbose && me != null) - { - me.sendMessage(getForbiddenMessage(perm)); - } - return false; - } + // -------------------------------------------- // + // RANDOM UTILS + // -------------------------------------------- // public static T pickFirstVal(CommandSender me, Map perm2val) { @@ -63,4 +84,54 @@ public class Perm return ret; } + + // -------------------------------------------- // + // GET CREATIVE + // -------------------------------------------- // + + public static Permission getCreative(String name) + { + return getCreative(name, null, null, null); + } + + public static Permission getCreative(String name, String description) + { + return getCreative(name, description, null, null); + } + + public static Permission getCreative(String name, PermissionDefault defaultValue) + { + return getCreative(name, null, defaultValue, null); + } + + public static Permission getCreative(String name, String description, PermissionDefault defaultValue) + { + return getCreative(name, description, defaultValue, null); + } + + public static Permission getCreative(String name, Map children) + { + return getCreative(name, null, null, children); + } + + public static Permission getCreative(String name, String description, Map children) + { + return getCreative(name, description, null, children); + } + + public static Permission getCreative(String name, PermissionDefault defaultValue, Map children) + { + return getCreative(name, null, defaultValue, children); + } + + public static Permission getCreative(String name, String description, PermissionDefault defaultValue, Map children) + { + Permission ret = Bukkit.getPluginManager().getPermission(name); + if (ret == null) + { + ret = new Permission(name, description, defaultValue, children); + Bukkit.getPluginManager().addPermission(ret); + } + return ret; + } } diff --git a/src/com/massivecraft/mcore4/util/PlayerUtil.java b/src/com/massivecraft/mcore4/util/PlayerUtil.java index 42c6b233..629a22a1 100644 --- a/src/com/massivecraft/mcore4/util/PlayerUtil.java +++ b/src/com/massivecraft/mcore4/util/PlayerUtil.java @@ -85,6 +85,7 @@ public class PlayerUtil implements Listener @SuppressWarnings("unchecked") public static Player getPlayerExact(String exactPlayerName) { + if (exactPlayerName == null) return null; CraftServer craftServer = (CraftServer) Bukkit.getServer(); List entityPlayers = craftServer.getHandle().players; for (EntityPlayer entityPlayer : entityPlayers) diff --git a/src/com/massivecraft/mcore4/util/Txt.java b/src/com/massivecraft/mcore4/util/Txt.java index cb0e8e9f..ddbfa581 100644 --- a/src/com/massivecraft/mcore4/util/Txt.java +++ b/src/com/massivecraft/mcore4/util/Txt.java @@ -368,10 +368,14 @@ public class Txt } public static ArrayList getPage(List lines, int pageHumanBased, String title) + { + return getPage(lines, pageHumanBased, title, 9); + } + + public static ArrayList getPage(List lines, int pageHumanBased, String title, int pageheight) { ArrayList ret = new ArrayList(); int pageZeroBased = pageHumanBased - 1; - int pageheight = 9; int pagecount = (int)Math.ceil(((double)lines.size()) / pageheight); ret.add(titleize(title+parse("")+" "+pageHumanBased+"/"+pagecount));