diff --git a/src/com/massivecraft/mcore1/MCore.java b/src/com/massivecraft/mcore1/MCore.java index 8b744a95..64d83aa3 100644 --- a/src/com/massivecraft/mcore1/MCore.java +++ b/src/com/massivecraft/mcore1/MCore.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -17,9 +18,10 @@ import org.bukkit.plugin.java.JavaPlugin; import com.massivecraft.mcore1.cmd.Cmd; import com.massivecraft.mcore1.lib.gson.GsonBuilder; -import com.massivecraft.mcore1.perm.Perm; +import com.massivecraft.mcore1.persist.One; import com.massivecraft.mcore1.persist.Persist; import com.massivecraft.mcore1.text.Txt; +import com.massivecraft.mcore1.util.Perm; public class MCore extends JavaPlugin { @@ -92,10 +94,26 @@ public class MCore extends JavaPlugin permInstances.put(owner, new Perm(getTxt(owner))); } + // -------------------------------------------- // + // ONE + // -------------------------------------------- // + private static Map oneInstances = new HashMap(); + public static Map getOneInstances() { return oneInstances; } + public static One getOne(MPlugin owner) { return oneInstances.get(owner); } + public static void removeOne(MPlugin owner) { oneInstances.remove(owner); } + public static void createOne(MPlugin owner) + { + if (oneInstances.containsKey(owner)) return; + createTxt(owner); + oneInstances.put(owner, new One(owner)); + } + // -------------------------------------------- // // DERP // -------------------------------------------- // + public static Random random = new Random(); + public MCore() { this.serverListener = new MCoreServerListener(this); @@ -123,7 +141,7 @@ public class MCore extends JavaPlugin Bukkit.getPluginManager().registerEvent(Type.SERVER_COMMAND, this.serverListener, Event.Priority.Lowest, this); } - public GsonBuilder getGsonBuilder() + public static GsonBuilder getGsonBuilder() { return new GsonBuilder() .setPrettyPrinting() diff --git a/src/com/massivecraft/mcore1/plugin/MPlugin.java b/src/com/massivecraft/mcore1/MPlugin.java similarity index 77% rename from src/com/massivecraft/mcore1/plugin/MPlugin.java rename to src/com/massivecraft/mcore1/MPlugin.java index 19eaf426..8244ebff 100644 --- a/src/com/massivecraft/mcore1/plugin/MPlugin.java +++ b/src/com/massivecraft/mcore1/MPlugin.java @@ -1,4 +1,4 @@ -package com.massivecraft.mcore1.plugin; +package com.massivecraft.mcore1; import java.util.logging.Level; import java.util.logging.Logger; @@ -8,11 +8,13 @@ import org.bukkit.event.Event; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; -import com.massivecraft.mcore1.MCore; import com.massivecraft.mcore1.cmd.Cmd; -import com.massivecraft.mcore1.perm.Perm; +import com.massivecraft.mcore1.lib.gson.Gson; +import com.massivecraft.mcore1.lib.gson.GsonBuilder; +import com.massivecraft.mcore1.persist.One; import com.massivecraft.mcore1.persist.Persist; import com.massivecraft.mcore1.text.Txt; +import com.massivecraft.mcore1.util.Perm; public abstract class MPlugin extends JavaPlugin @@ -20,9 +22,13 @@ public abstract class MPlugin extends JavaPlugin // Tools public Cmd cmd; public Persist persist; + public One one; public Txt txt; public Perm perm; + // Gson + public Gson gson; + // -------------------------------------------- // // ENABLE // -------------------------------------------- // @@ -37,15 +43,20 @@ public abstract class MPlugin extends JavaPlugin // Ensure the base folder exists this.getDataFolder().mkdirs(); + // Create Gson + this.gson = this.getGsonBuilder().create(); + // Create Tools MCore.createCmd(this); MCore.createPersist(this); + MCore.createOne(this); MCore.createTxt(this); MCore.createPerm(this); // Assign tool pointers this.cmd = MCore.getCmd(this); this.persist = MCore.getPersist(this); + this.one = MCore.getOne(this); this.txt = MCore.getTxt(this); this.perm = MCore.getPerm(this); @@ -65,18 +76,29 @@ public abstract class MPlugin extends JavaPlugin { MCore.getPersist(this).saveAll(); MCore.removePersist(this); + MCore.removeOne(this); MCore.removeCmd(this); MCore.removePerm(this); MCore.removeTxt(this); this.cmd = null; this.persist = null; + this.one = null; this.txt = null; this.perm = null; log("Disabled"); } + // -------------------------------------------- // + // GSON + // -------------------------------------------- // + + public GsonBuilder getGsonBuilder() + { + return MCore.getGsonBuilder(); + } + // -------------------------------------------- // // CONVENIENCE // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore1/cmd/MCommand.java b/src/com/massivecraft/mcore1/cmd/MCommand.java index dc130f7a..c7eb1348 100644 --- a/src/com/massivecraft/mcore1/cmd/MCommand.java +++ b/src/com/massivecraft/mcore1/cmd/MCommand.java @@ -8,15 +8,15 @@ import org.bukkit.entity.Player; import com.massivecraft.mcore1.Lang; import com.massivecraft.mcore1.MCore; +import com.massivecraft.mcore1.MPlugin; import com.massivecraft.mcore1.cmd.arg.IArgHandler; import com.massivecraft.mcore1.cmd.req.IReq; import com.massivecraft.mcore1.persist.IClassManager; import com.massivecraft.mcore1.persist.Persist; -import com.massivecraft.mcore1.plugin.MPlugin; public abstract class MCommand { - public abstract MPlugin getPlugin(); + public abstract MPlugin p(); // -------------------------------------------- // // COMMAND BEHAVIOR @@ -39,6 +39,8 @@ public abstract class MCommand protected List aliases; public List getAliases() { return this.aliases; } public void setAliases(List val) { this.aliases = val; } + public void addAliases(String... aliases) { this.aliases.addAll(Arrays.asList(aliases)); } + public void addAliases(List aliases) { this.aliases.addAll(aliases); } // FIELD: requiredArgs // These args must always be sent @@ -76,7 +78,7 @@ public abstract class MCommand { if (this.desc == null) { - String pdesc = getPlugin().perm.getPermissionDescription(this.descPermission); + String pdesc = p().perm.getPermissionDescription(this.descPermission); if (pdesc != null) { return pdesc; @@ -261,7 +263,7 @@ public abstract class MCommand { // Get the to many string slice List theToMany = args.subList(this.requiredArgs.size() + this.optionalArgs.size(), args.size()); - msg(Lang.commandToManyArgs, getPlugin().txt.implode(theToMany, " ")); + msg(Lang.commandToManyArgs, p().txt.implode(theToMany, " ")); sender.sendMessage(this.getUseageTemplate()); } return false; @@ -280,16 +282,16 @@ public abstract class MCommand public String getUseageTemplate(List commandChain, boolean addDesc) { StringBuilder ret = new StringBuilder(); - ret.append(getPlugin().txt.getDesign().getColorCommand()); + ret.append(p().txt.getDesign().getColorCommand()); ret.append('/'); for (MCommand mc : commandChain) { - ret.append(getPlugin().txt.implode(mc.aliases, ",")); + ret.append(p().txt.implode(mc.aliases, ",")); ret.append(' '); } - ret.append(getPlugin().txt.implode(this.aliases, ",")); + ret.append(p().txt.implode(this.aliases, ",")); List args = new ArrayList(); @@ -314,15 +316,15 @@ public abstract class MCommand if (args.size() > 0) { - ret.append(getPlugin().txt.getDesign().getColorParameter()); + ret.append(p().txt.getDesign().getColorParameter()); ret.append(' '); - ret.append(getPlugin().txt.implode(args, " ")); + ret.append(p().txt.implode(args, " ")); } if (addDesc) { ret.append(' '); - ret.append(getPlugin().txt.getDesign().getColorInfo()); + ret.append(p().txt.getDesign().getColorInfo()); ret.append(this.getDesc()); } @@ -345,12 +347,12 @@ public abstract class MCommand public void msg(String str, Object... args) { - sender.sendMessage(getPlugin().txt.parse(str, args)); + sender.sendMessage(p().txt.parse(str, args)); } public void msg(String str) { - sender.sendMessage(getPlugin().txt.parse(str)); + sender.sendMessage(p().txt.parse(str)); } public void sendMessage(String msg) @@ -391,8 +393,8 @@ public abstract class MCommand { return defaultNotSet; } - IArgHandler handler = getPlugin().cmd.getArgHandler(clazz); - T ret = handler.parse(this.arg(idx), style, this.sender, getPlugin()); + IArgHandler handler = p().cmd.getArgHandler(clazz); + T ret = handler.parse(this.arg(idx), style, this.sender, p()); if (ret == null) { this.msg(handler.getError()); @@ -411,6 +413,11 @@ public abstract class MCommand return this.argAs(idx, clazz, null, defaultNotSet, null); } + public T argAs(int idx, Class clazz, String style) + { + return this.argAs(idx, clazz, style, null, null); + } + public T argAs(int idx, Class clazz) { return this.argAs(idx, clazz, null, null); diff --git a/src/com/massivecraft/mcore1/cmd/arg/AHBase.java b/src/com/massivecraft/mcore1/cmd/arg/AHBase.java index 95eecf56..2db0ec09 100644 --- a/src/com/massivecraft/mcore1/cmd/arg/AHBase.java +++ b/src/com/massivecraft/mcore1/cmd/arg/AHBase.java @@ -2,7 +2,7 @@ package com.massivecraft.mcore1.cmd.arg; import org.bukkit.command.CommandSender; -import com.massivecraft.mcore1.plugin.MPlugin; +import com.massivecraft.mcore1.MPlugin; public abstract class AHBase implements IArgHandler { diff --git a/src/com/massivecraft/mcore1/cmd/arg/AHPlayer.java b/src/com/massivecraft/mcore1/cmd/arg/AHPlayer.java index afc52e51..ddab20d9 100644 --- a/src/com/massivecraft/mcore1/cmd/arg/AHPlayer.java +++ b/src/com/massivecraft/mcore1/cmd/arg/AHPlayer.java @@ -6,7 +6,7 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import com.massivecraft.mcore1.plugin.MPlugin; +import com.massivecraft.mcore1.MPlugin; public class AHPlayer extends AHBase { diff --git a/src/com/massivecraft/mcore1/cmd/arg/AHPlayerWrapper.java b/src/com/massivecraft/mcore1/cmd/arg/AHPlayerWrapper.java index e0b89482..23989b55 100644 --- a/src/com/massivecraft/mcore1/cmd/arg/AHPlayerWrapper.java +++ b/src/com/massivecraft/mcore1/cmd/arg/AHPlayerWrapper.java @@ -2,8 +2,8 @@ package com.massivecraft.mcore1.cmd.arg; import org.bukkit.command.CommandSender; +import com.massivecraft.mcore1.MPlugin; import com.massivecraft.mcore1.persist.IClassManager; -import com.massivecraft.mcore1.plugin.MPlugin; public abstract class AHPlayerWrapper extends AHBase { diff --git a/src/com/massivecraft/mcore1/cmd/arg/AHPrimitive.java b/src/com/massivecraft/mcore1/cmd/arg/AHPrimitive.java index 04db6211..14b3f85a 100644 --- a/src/com/massivecraft/mcore1/cmd/arg/AHPrimitive.java +++ b/src/com/massivecraft/mcore1/cmd/arg/AHPrimitive.java @@ -2,7 +2,7 @@ package com.massivecraft.mcore1.cmd.arg; import org.bukkit.command.CommandSender; -import com.massivecraft.mcore1.plugin.MPlugin; +import com.massivecraft.mcore1.MPlugin; public abstract class AHPrimitive extends AHBase { diff --git a/src/com/massivecraft/mcore1/cmd/arg/IArgHandler.java b/src/com/massivecraft/mcore1/cmd/arg/IArgHandler.java index 42ca0a00..a7d642e9 100644 --- a/src/com/massivecraft/mcore1/cmd/arg/IArgHandler.java +++ b/src/com/massivecraft/mcore1/cmd/arg/IArgHandler.java @@ -2,7 +2,7 @@ package com.massivecraft.mcore1.cmd.arg; import org.bukkit.command.CommandSender; -import com.massivecraft.mcore1.plugin.MPlugin; +import com.massivecraft.mcore1.MPlugin; public interface IArgHandler { diff --git a/src/com/massivecraft/mcore1/cmd/req/ReqHasPerm.java b/src/com/massivecraft/mcore1/cmd/req/ReqHasPerm.java index ceb24133..a0b6652c 100644 --- a/src/com/massivecraft/mcore1/cmd/req/ReqHasPerm.java +++ b/src/com/massivecraft/mcore1/cmd/req/ReqHasPerm.java @@ -24,7 +24,7 @@ public class ReqHasPerm implements IReq @Override public String createErrorMessage(CommandSender sender, MCommand command) { - return command.getPlugin().perm.getForbiddenMessage(this.perm); + return command.p().perm.getForbiddenMessage(this.perm); } } diff --git a/src/com/massivecraft/mcore1/cmd/req/ReqIsPlayer.java b/src/com/massivecraft/mcore1/cmd/req/ReqIsPlayer.java index 7f84f578..8bec21d5 100644 --- a/src/com/massivecraft/mcore1/cmd/req/ReqIsPlayer.java +++ b/src/com/massivecraft/mcore1/cmd/req/ReqIsPlayer.java @@ -19,4 +19,10 @@ public class ReqIsPlayer implements IReq { return Lang.commandSenderMustBePlayer; } + + protected static ReqIsPlayer instance= new ReqIsPlayer(); + public static ReqIsPlayer getInstance() + { + return instance; + } } diff --git a/src/com/massivecraft/mcore1/persist/IClassManager.java b/src/com/massivecraft/mcore1/persist/IClassManager.java index a150d943..593ef1f2 100644 --- a/src/com/massivecraft/mcore1/persist/IClassManager.java +++ b/src/com/massivecraft/mcore1/persist/IClassManager.java @@ -67,6 +67,11 @@ public interface IClassManager public T getBestMatch(Object oid); // Get all + public Collection getAllLoaded(); + public Collection getAllLoaded(Predictate where); + public Collection getAllLoaded(Predictate where, Comparator orderby); + public Collection getAllLoaded(Predictate where, Comparator orderby, Integer limit); + public Collection getAllLoaded(Predictate where, Comparator orderby, Integer limit, Integer offset); public Collection getAll(); public Collection getAll(Predictate where); public Collection getAll(Predictate where, Comparator orderby); diff --git a/src/com/massivecraft/mcore1/persist/One.java b/src/com/massivecraft/mcore1/persist/One.java new file mode 100644 index 00000000..6a5fdec2 --- /dev/null +++ b/src/com/massivecraft/mcore1/persist/One.java @@ -0,0 +1,156 @@ +package com.massivecraft.mcore1.persist; + +import java.io.File; +import java.lang.reflect.Type; +import java.util.logging.Level; + +import com.massivecraft.mcore1.MPlugin; +import com.massivecraft.mcore1.util.DiscUtil; + +// TODO: Give better name and place to differenciate from the entity-orm-ish system in "com.massivecraft.core.persist". + +public class One { + + private MPlugin p; + public One(MPlugin p) + { + this.p = p; + } + + // ------------------------------------------------------------ // + // GET NAME - What should we call this type of object? + // ------------------------------------------------------------ // + + public static String getName(Class clazz) + { + return clazz.getSimpleName().toLowerCase(); + } + + public static String getName(Object o) + { + return getName(o.getClass()); + } + + public static String getName(Type type) + { + return getName(type.getClass()); + } + + // ------------------------------------------------------------ // + // GET FILE - In which file would we like to store this object? + // ------------------------------------------------------------ // + + public File getFile(String name) + { + return new File(p.getDataFolder(), name+".json"); + } + + public File getFile(Class clazz) + { + return getFile(getName(clazz)); + } + + public File getFile(Object obj) + { + return getFile(getName(obj)); + } + + public File getFile(Type type) + { + return getFile(getName(type)); + } + + + // NICE WRAPPERS + + public T loadOrSaveDefault(T def, Class clazz) + { + return loadOrSaveDefault(def, clazz, getFile(clazz)); + } + + public T loadOrSaveDefault(T def, Class clazz, String name) + { + return loadOrSaveDefault(def, clazz, getFile(name)); + } + + public T loadOrSaveDefault(T def, Class clazz, File file) + { + if ( ! file.exists()) + { + p.log("Creating default: "+file); + this.save(def, file); + return def; + } + + T loaded = this.load(clazz, file); + + if (loaded == null) + { + p.log(Level.WARNING, "Using default as I failed to load: "+file); + return def; + } + + return loaded; + } + + // SAVE + + public boolean save(Object instance) + { + return save(instance, getFile(instance)); + } + + public boolean save(Object instance, String name) + { + return save(instance, getFile(name)); + } + + public boolean save(Object instance, File file) + { + return DiscUtil.writeCatch(file, p.gson.toJson(instance)); + } + + // LOAD BY CLASS + + public T load(Class clazz) + { + return load(clazz, getFile(clazz)); + } + + public T load(Class clazz, String name) + { + return load(clazz, getFile(name)); + } + + public T load(Class clazz, File file) + { + String content = DiscUtil.readCatch(file); + if (content == null) + { + return null; + } + + T instance = p.gson.fromJson(content, clazz); + + return instance; + } + + // LOAD BY TYPE + @SuppressWarnings("unchecked") + public T load(Type typeOfT, String name) + { + return (T) load(typeOfT, getFile(name)); + } + + @SuppressWarnings("unchecked") + public T load(Type typeOfT, File file) + { + String content = DiscUtil.readCatch(file); + if (content == null) { + return null; + } + + return (T) p.gson.fromJson(content, typeOfT); + } + +} diff --git a/src/com/massivecraft/mcore1/persist/PlayerEntity.java b/src/com/massivecraft/mcore1/persist/PlayerEntity.java index 43a04a68..f869e606 100644 --- a/src/com/massivecraft/mcore1/persist/PlayerEntity.java +++ b/src/com/massivecraft/mcore1/persist/PlayerEntity.java @@ -1,17 +1,13 @@ package com.massivecraft.mcore1.persist; +import java.util.List; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; -public abstract class PlayerEntity extends Entity +public abstract class PlayerEntity> extends Entity { - @Override - protected PlayerEntity getThis() - { - return this; - } - public Player getPlayer() { return Bukkit.getPlayer(this.getId()); @@ -26,5 +22,25 @@ public abstract class PlayerEntity extends Entity { return ! isOnline(); } - + + // -------------------------------------------- // + // Message Sending Helpers + // -------------------------------------------- // + + public void sendMessage(String msg) + { + Player player = this.getPlayer(); + if (player == null) return; + player.sendMessage(msg); + } + + public void sendMessage(List msgs) + { + Player player = this.getPlayer(); + if (player == null) return; + for(String msg : msgs) + { + player.sendMessage(msg); + } + } } diff --git a/src/com/massivecraft/mcore1/persist/gson/GsonClassManager.java b/src/com/massivecraft/mcore1/persist/gson/GsonClassManager.java index 2f2e78ad..d6cf9c5d 100644 --- a/src/com/massivecraft/mcore1/persist/gson/GsonClassManager.java +++ b/src/com/massivecraft/mcore1/persist/gson/GsonClassManager.java @@ -408,6 +408,36 @@ public abstract class GsonClassManager implements IClassManager return this.get(oid, this.getIsCreative()); } + @Override + public Collection getAllLoaded() + { + return entities; + } + + @Override + public Collection getAllLoaded(Predictate where) + { + return Persist.uglySQL(this.getAllLoaded(), where, null, null, null); + } + + @Override + public Collection getAllLoaded(Predictate where, Comparator orderby) + { + return Persist.uglySQL(this.getAllLoaded(), where, orderby, null, null); + } + + @Override + public Collection getAllLoaded(Predictate where, Comparator orderby, Integer limit) + { + return Persist.uglySQL(this.getAllLoaded(), where, orderby, limit, null); + } + + @Override + public Collection getAllLoaded(Predictate where, Comparator orderby, Integer limit, Integer offset) + { + return Persist.uglySQL(this.getAllLoaded(), where, orderby, limit, offset); + } + @Override public Collection getAll() { @@ -418,25 +448,25 @@ public abstract class GsonClassManager implements IClassManager @Override public Collection getAll(Predictate where) { - return Persist.uglySQL(this.entities, where, null, null, null); + return Persist.uglySQL(this.getAll(), where, null, null, null); } @Override public Collection getAll(Predictate where, Comparator orderby) { - return Persist.uglySQL(this.entities, where, orderby, null, null); + return Persist.uglySQL(this.getAll(), where, orderby, null, null); } @Override public Collection getAll(Predictate where, Comparator orderby, Integer limit) { - return Persist.uglySQL(this.entities, where, orderby, limit, null); + return Persist.uglySQL(this.getAll(), where, orderby, limit, null); } @Override public Collection getAll(Predictate where, Comparator orderby, Integer limit, Integer offset) { - return Persist.uglySQL(this.entities, where, orderby, limit, offset); + return Persist.uglySQL(this.getAll(), where, orderby, limit, offset); } @Override diff --git a/src/com/massivecraft/mcore1/persist/gson/GsonPlayerEntityManager.java b/src/com/massivecraft/mcore1/persist/gson/GsonPlayerEntityManager.java index d2c44a3a..211926cd 100644 --- a/src/com/massivecraft/mcore1/persist/gson/GsonPlayerEntityManager.java +++ b/src/com/massivecraft/mcore1/persist/gson/GsonPlayerEntityManager.java @@ -11,7 +11,7 @@ import com.massivecraft.mcore1.Predictate; import com.massivecraft.mcore1.lib.gson.Gson; import com.massivecraft.mcore1.persist.PlayerEntity; -public abstract class GsonPlayerEntityManager extends GsonClassManager +public abstract class GsonPlayerEntityManager> extends GsonClassManager { public GsonPlayerEntityManager(Gson gson, File folder, boolean creative, boolean lazy) { @@ -43,7 +43,7 @@ public abstract class GsonPlayerEntityManager extends Gs public Collection getAllOnline() { - return this.getAll(new Predictate() + return this.getAllLoaded(new Predictate() { public boolean apply(T entity) { diff --git a/src/com/massivecraft/mcore1/perm/Perm.java b/src/com/massivecraft/mcore1/util/Perm.java similarity index 93% rename from src/com/massivecraft/mcore1/perm/Perm.java rename to src/com/massivecraft/mcore1/util/Perm.java index b2edf53d..bb8340b2 100644 --- a/src/com/massivecraft/mcore1/perm/Perm.java +++ b/src/com/massivecraft/mcore1/util/Perm.java @@ -1,4 +1,4 @@ -package com.massivecraft.mcore1.perm; +package com.massivecraft.mcore1.util; import java.util.Map; import java.util.Map.Entry;