From 3bdca1cdb13a3d08a2ab9527d9b7c4b87637e6db Mon Sep 17 00:00:00 2001 From: Jascha Starke Date: Mon, 20 Feb 2012 21:06:20 +0100 Subject: [PATCH] v0.9.5: (in work) - major code rework - survival areas in creative worlds - multiverse support - better inventory storage - removed give-item-back-on-creative-death, as not needed and causes more trouble then usage --- lang/en_US.yml | 4 +- plugin.yml | 12 +- .../minecraft/integration/AuthMe.java | 10 +- .../minecraft/integration/Communicator.java | 10 + .../minecraft/integration/MultiVerse.java | 12 +- .../minecraft/integration/xAuth.java | 12 +- .../minecraft/limitedcreative/Commands.java | 35 +- .../limitedcreative/Configuration.java | 26 +- .../{LimitedCreativeCore.java => Core.java} | 26 +- .../minecraft/limitedcreative/Inventory.java | 109 +++-- .../minecraft/limitedcreative/LCPlayer.java | 410 ++++++++++-------- .../limitedcreative/NoBlockItemSpawn.java | 8 +- .../minecraft/limitedcreative/Perms.java | 66 +++ .../minecraft/limitedcreative/Players.java | 82 ++++ .../listeners/LimitListener.java | 80 ++-- .../listeners/MainListener.java | 59 +-- .../regions/RegionListener.java | 62 ++- .../regions/WorldGuardIntegration.java | 6 +- .../limitedcreative/serialize/Armor.java | 64 --- .../limitedcreative/serialize/Items.java | 114 ----- .../limitedcreative/store/Fallback.java | 170 ++++++++ .../limitedcreative/store/InvConfStorage.java | 111 +++++ .../limitedcreative/store/InvMemStorage.java | 47 ++ .../limitedcreative/store/InvYamlStorage.java | 72 +++ .../store/PlayerInventoryStorage.java | 41 ++ .../limitedcreative/store/PlayerOptions.java | 79 ++++ .../Storeable.java => utils/IPermission.java} | 8 +- .../jaschastarke/minecraft/utils/Locale.java | 4 +- .../minecraft/utils/Permissions.java | 27 +- .../worldedit/PermissionsBridge.java | 17 + .../minecraft/worldguard/API.java | 1 + .../worldguard/ApplicableRegions.java | 20 +- .../minecraft/worldguard/CCommand.java | 41 +- .../minecraft/worldguard/CListener.java | 24 +- .../minecraft/worldguard/CRegionManager.java | 17 +- .../minecraft/worldguard/Perms.java | 38 ++ .../events/PlayerChangedAreaEvent.java | 39 +- 37 files changed, 1362 insertions(+), 601 deletions(-) rename src/de/jaschastarke/minecraft/limitedcreative/{LimitedCreativeCore.java => Core.java} (81%) create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/Perms.java create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/Players.java delete mode 100644 src/de/jaschastarke/minecraft/limitedcreative/serialize/Armor.java delete mode 100644 src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/store/Fallback.java create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/store/InvConfStorage.java create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/store/InvMemStorage.java create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/store/InvYamlStorage.java create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/store/PlayerInventoryStorage.java create mode 100644 src/de/jaschastarke/minecraft/limitedcreative/store/PlayerOptions.java rename src/de/jaschastarke/minecraft/{limitedcreative/serialize/Storeable.java => utils/IPermission.java} (72%) create mode 100644 src/de/jaschastarke/minecraft/worldguard/Perms.java diff --git a/lang/en_US.yml b/lang/en_US.yml index 236d6a4..6c95e07 100644 --- a/lang/en_US.yml +++ b/lang/en_US.yml @@ -47,7 +47,7 @@ exception: storage: load: Failed to load your Inventory. Ask your Admin to enable "UnsafeStorage" for LimitedCreative to allow invalid enchants on items region: - no_survival: You can not be survival in an creative area + not_optional: You can not be {0} in that area blocked: chest: Access to chests is not allowed in creative mode sign: To interact with signs is not allowed in creative mode @@ -56,6 +56,8 @@ blocked: survival_flying: You should stay on ground, when leaving a creative-area outside_creative: You can not place blocks outside of the creative-area outside_creative_break: You can not destroy blocks outside of the creative-area + inside_survival: You can not place blocks inside of the survival-area + inside_survival_break: You can not destroy blocks inside of the survival-area use: You are not allowed to use this type of item place: You are not allowed to place this type of block break: You are not allowed to break this type of block diff --git a/plugin.yml b/plugin.yml index c11cfa0..a3ba3bc 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: LimitedCreative -main: de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore -version: 0.9.2-beta +main: de.jaschastarke.minecraft.limitedcreative.Core +version: 0.9.5-dev softdepend: [WorldGuard, WorldEdit, MultiInv] dev-url: http://dev.bukkit.org/server-mods/limited-creative/ commands: @@ -23,8 +23,14 @@ permissions: description: Allows switching of own game mode to creative and back default: op limitedcreative.switch_gamemode.backonly: + description: Allows switching of own game mode to default of the not world he is in, but not back + default: false + limitedcreative.switch_gamemode.survival: description: Allows switching of own game mode to survival, but not to creative - default: true + default: false + limitedcreative.switch_gamemode.creative: + description: Allows switching of own game mode to creative, but not to survival + default: false limitedcreative.switch_gamemode.other: description: Allows switching of other users game mode default: op diff --git a/src/de/jaschastarke/minecraft/integration/AuthMe.java b/src/de/jaschastarke/minecraft/integration/AuthMe.java index 76727e5..071d2fa 100644 --- a/src/de/jaschastarke/minecraft/integration/AuthMe.java +++ b/src/de/jaschastarke/minecraft/integration/AuthMe.java @@ -19,14 +19,20 @@ package de.jaschastarke.minecraft.integration; import org.bukkit.entity.Player; +import de.jaschastarke.minecraft.limitedcreative.Core; + import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.cache.limbo.LimboCache; public class AuthMe implements CommunicationBridge { public static boolean isLoggedIn(Player player) { - return PlayerCache.getInstance().isAuthenticated(player.getName()); + boolean li = PlayerCache.getInstance().isAuthenticated(player.getName()); + Core.debug("AuthMe: "+player.getName()+": logged in: "+li); + return li; } public static boolean isLoggedInComplete(Player player) { - return isLoggedIn(player) && LimboCache.getInstance().getLimboPlayer(player.getName()) == null; + boolean li = isLoggedIn(player) && LimboCache.getInstance().getLimboPlayer(player.getName()) == null; + Core.debug("AuthMe: "+player.getName()+": logged in complete: "+li); + return li; } } diff --git a/src/de/jaschastarke/minecraft/integration/Communicator.java b/src/de/jaschastarke/minecraft/integration/Communicator.java index 760bf1a..3ae43da 100644 --- a/src/de/jaschastarke/minecraft/integration/Communicator.java +++ b/src/de/jaschastarke/minecraft/integration/Communicator.java @@ -23,6 +23,8 @@ import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import de.jaschastarke.minecraft.limitedcreative.Core; + public class Communicator extends AbstractCommunicator { public Communicator(JavaPlugin plugin) { super(plugin); @@ -40,6 +42,14 @@ public class Communicator extends AbstractCommunicator { boolean creative = Bukkit.getServer().getDefaultGameMode() == GameMode.CREATIVE; if (isPluginEnabled("Multiverse-Core")) creative = MultiVerse.isCreative(world); + Core.debug("com: "+world.getName()+": is creative: "+creative); return creative; } + public GameMode getDefaultGameMode(World world) { + GameMode def = Bukkit.getServer().getDefaultGameMode(); + if (isPluginEnabled("Multiverse-Core")) + def = MultiVerse.getGameMode(world); + Core.debug("com: "+world.getName()+": game mode: "+def); + return def; + } } diff --git a/src/de/jaschastarke/minecraft/integration/MultiVerse.java b/src/de/jaschastarke/minecraft/integration/MultiVerse.java index a0ff121..e60185d 100644 --- a/src/de/jaschastarke/minecraft/integration/MultiVerse.java +++ b/src/de/jaschastarke/minecraft/integration/MultiVerse.java @@ -23,10 +23,20 @@ import org.bukkit.World; import com.onarandombox.MultiverseCore.MultiverseCore; +import de.jaschastarke.minecraft.limitedcreative.Core; + public class MultiVerse implements CommunicationBridge { public static boolean isCreative(World world) { - return getMV().getMVWorldManager().getMVWorld(world).getGameMode() == GameMode.CREATIVE; + boolean ic = getMV().getMVWorldManager().getMVWorld(world).getGameMode() == GameMode.CREATIVE; + Core.debug("Multiverse: "+world.getName()+": is creative: "+ic); + return ic; + } + + public static GameMode getGameMode(World world) { + GameMode gm = getMV().getMVWorldManager().getMVWorld(world).getGameMode(); + Core.debug("Multiverse: "+world.getName()+": game mode: "+gm); + return gm; } private static MultiverseCore getMV() { diff --git a/src/de/jaschastarke/minecraft/integration/xAuth.java b/src/de/jaschastarke/minecraft/integration/xAuth.java index 7e923ad..90915db 100644 --- a/src/de/jaschastarke/minecraft/integration/xAuth.java +++ b/src/de/jaschastarke/minecraft/integration/xAuth.java @@ -22,14 +22,18 @@ import org.bukkit.entity.Player; import com.cypherx.xauth.xAuthPlayer; +import de.jaschastarke.minecraft.limitedcreative.Core; + public class xAuth implements CommunicationBridge { public static boolean isLoggedInNotGuest(Player player) { xAuthPlayer xpl = getAuth().getPlayer(player.getName()); + boolean li = true; if (!xpl.isAuthenticated()) - return false; - if (xpl.isGuest()) - return false; - return true; + li = false; + else if (xpl.isGuest()) + li = false; + Core.debug("xAuth: "+player.getName()+": logged in not guest: "+li); + return li; } private static com.cypherx.xauth.xAuth getAuth() { diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Commands.java b/src/de/jaschastarke/minecraft/limitedcreative/Commands.java index 19df422..2bac294 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/Commands.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Commands.java @@ -27,11 +27,12 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import de.jaschastarke.minecraft.utils.IPermission; import de.jaschastarke.minecraft.utils.Util; import static de.jaschastarke.minecraft.utils.Locale.L; public class Commands { - private static LimitedCreativeCore plugin; + private static Core plugin; public static class MainCommandExecutor implements CommandExecutor { public enum Action { @@ -45,7 +46,7 @@ public class Commands { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - LimitedCreativeCore.debug(sender.getName() + ": /" + label + " " + Util.join(args)); + Core.debug(sender.getName() + ": /" + label + " " + Util.join(args)); if (args.length > 0) { Action act = null; try { @@ -76,12 +77,13 @@ public class Commands { plugin.getCommand("/region").execute(sender, "/region", args); return true; case RELOAD: - plugin.getServer().getPluginManager().disablePlugin(plugin); - plugin.getServer().getPluginManager().enablePlugin(plugin); + //plugin.getServer().getPluginManager().disablePlugin(plugin); // disable removes classloader, so re-enabling causes problems + //plugin.getServer().getPluginManager().enablePlugin(plugin); + plugin.reload(); return true; } } catch (CommandException e) { - LimitedCreativeCore.debug("CommandException: "+e.getMessage()); + Core.debug("CommandException: "+e.getMessage()); sender.sendMessage(ChatColor.DARK_RED + e.getLocalizedMessage()); return true; } @@ -92,12 +94,12 @@ public class Commands { StringBuilder message = new StringBuilder(); message.append("/"+c+" s[urvival] ["+L("command.player")+"] - "+L("command.switch.survival")+"\n"); message.append("/"+c+" c[reative] ["+L("command.player")+"] - "+L("command.switch.creative")+"\n"); - if (plugin.perm.hasPermission(sender, "limitedcreative.config")) { + if (hasPermission(sender, Perms.CONFIG)) { message.append("/"+c+" e[nable] "+L("command.config.overview")+"\n"); message.append("/"+c+" d[isable] "+L("command.config.overview")+"\n"); message.append("/"+c+" reload "+L("command.config.reload")+"\n"); } - if (plugin.perm.hasPermission(sender, "limitedcreative.regions")) + if (hasPermission(sender, Perms.REGIONS)) message.append("/"+c+" r[egion] "+L("command.worldguard.alias")+"\n"); if (message.length() > 0) { sender.sendMessage("Usage:"); @@ -110,7 +112,7 @@ public class Commands { } private void setOption(CommandSender sender, String[] args, boolean b) throws CommandException { - if (sender instanceof Player && !plugin.perm.hasPermission(sender, "limitedcreative.config")) { + if (sender instanceof Player && !hasPermission(sender, Perms.CONFIG)) { throw new LackingPermissionException(); } if (args.length > 2) @@ -154,13 +156,17 @@ public class Commands { if (target == null) { throw new InvalidCommandException("exception.command.playernotfound"); - } else if (sender instanceof Player && sender != target && !plugin.perm.hasPermission(sender, "limitedcreative.switch_gamemode.other")) { + } else if (sender instanceof Player && sender != target && !hasPermission(sender, Perms.GM_OTHER)) { throw new LackingPermissionException(); } else if (target.getGameMode() != gm) { - if (sender == target) { - LCPlayer.get(target).changeGameMode(gm); - } else { + if ((hasPermission(sender, Perms.GM)) || + Players.get(target).isGameModeAllowed(gm) || + (gm == plugin.com.getDefaultGameMode(target.getWorld()) && hasPermission(sender, Perms.GM_BACKONLY)) || + (gm == GameMode.CREATIVE && hasPermission(sender, Perms.GM_CREATIVE)) || + (gm == GameMode.SURVIVAL && hasPermission(sender, Perms.GM_SURVIVAL))) { target.setGameMode(gm); + } else { + throw new LackingPermissionException(); } if (target != sender) { sender.sendMessage(L("command.gamemode.changed", target.getName())); @@ -181,13 +187,16 @@ public class Commands { } - public static void register(LimitedCreativeCore pplugin) { + public static void register(Core pplugin) { plugin = pplugin; plugin.getCommand("limitedcreative").setExecutor(new MainCommandExecutor()); if (plugin.worldguard == null) { plugin.getCommand("/region").setExecutor(new NotAvailableCommandExecutor()); } } + private static boolean hasPermission(CommandSender sender, IPermission permission) { + return plugin.perm.hasPermission(sender, permission); + } abstract static public class CommandException extends Exception { private static final long serialVersionUID = 1L; diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Configuration.java b/src/de/jaschastarke/minecraft/limitedcreative/Configuration.java index beb2b83..aa50a38 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/Configuration.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Configuration.java @@ -25,13 +25,16 @@ import java.util.List; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; +import de.jaschastarke.minecraft.limitedcreative.store.InvYamlStorage; +import de.jaschastarke.minecraft.limitedcreative.store.PlayerInventoryStorage; + import static de.jaschastarke.minecraft.utils.Util.copyFile; import static de.jaschastarke.minecraft.utils.Locale.L; public class Configuration { private FileConfiguration c; private File file; - public static LimitedCreativeCore plugin; + public static Core plugin; public enum Option { STORECREATIVE("store.creative", true), @@ -66,7 +69,7 @@ public class Configuration { } } - public Configuration(LimitedCreativeCore pplugin) { + public Configuration(Core pplugin) { plugin = pplugin; file = new File(plugin.getDataFolder(), "config.yml"); @@ -225,4 +228,23 @@ public class Configuration { public boolean getTempStoreEnabled() { return _store_enabled; } + + /** + * @return Milliseconds + */ + public long getRepeatingMessageTimeout() { + return 10000; // 10 sec. limit + } + + /** + * The maximum height a player may fall down by leaving creative gamemode + * @return Block-Height + */ + public int getMaximumFloatingHeight() { + return 3; + } + + public PlayerInventoryStorage getInvetoryStorage() { + return new InvYamlStorage(new File(plugin.getDataFolder(), getInventoryFolder())); + } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreativeCore.java b/src/de/jaschastarke/minecraft/limitedcreative/Core.java similarity index 81% rename from src/de/jaschastarke/minecraft/limitedcreative/LimitedCreativeCore.java rename to src/de/jaschastarke/minecraft/limitedcreative/Core.java index bcb8903..a9724f4 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreativeCore.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Core.java @@ -18,6 +18,7 @@ package de.jaschastarke.minecraft.limitedcreative; import java.util.logging.Logger; +import org.bukkit.event.HandlerList; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; @@ -30,13 +31,13 @@ import de.jaschastarke.minecraft.utils.Locale; import de.jaschastarke.minecraft.utils.Permissions; -public class LimitedCreativeCore extends JavaPlugin { +public class Core extends JavaPlugin { public final Logger logger = Logger.getLogger("Minecraft"); public Configuration config; public Permissions perm; public WorldGuardIntegration worldguard; public Communicator com; - public static LimitedCreativeCore plugin; + public static Core plugin; public NoBlockItemSpawn spawnblock; @Override @@ -89,12 +90,12 @@ public class LimitedCreativeCore extends JavaPlugin { Commands.register(this); - plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { + /*plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { @Override public void run() { - LCPlayer.cleanUp(); + Players.cleanUp(); } - }, LCPlayer.CLEANUP_TIMEOUT / 50L, LCPlayer.CLEANUP_TIMEOUT / 50L); // 50 = 1000ms / 20ticks + }, Players.CLEANUP_TIMEOUT / 50L, Players.CLEANUP_TIMEOUT / 50L); // 50 = 1000ms / 20ticks*/ PluginDescriptionFile df = this.getDescription(); if (worldguard != null) @@ -103,14 +104,27 @@ public class LimitedCreativeCore extends JavaPlugin { logger.info("["+df.getName() + " v" + df.getVersion() + "] "+L("basic.loaded.no_worldguard")); } + public void reload() { + getServer().getScheduler().cancelTasks(this); + getServer().getServicesManager().unregisterAll(this); + HandlerList.unregisterAll(this); + setEnabled(false); + setEnabled(true); + } public void info(String s) { logger.info("["+this.getDescription().getName()+"] " + s); } public void warn(String s) { logger.warning("["+this.getDescription().getName()+"] " + s); } + public void error(String s) { + logger.severe("["+this.getDescription().getName()+"] " + s); + } public static void debug(String s) { - if (plugin.config.getDebug()) + if (isDebug()) plugin.info("DEBUG: " + s); } + public static boolean isDebug() { + return plugin.config.getDebug(); + } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Inventory.java b/src/de/jaschastarke/minecraft/limitedcreative/Inventory.java index e074565..288f3b4 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/Inventory.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Inventory.java @@ -17,94 +17,85 @@ */ package de.jaschastarke.minecraft.limitedcreative; -import java.io.File; -import java.io.IOException; - import org.bukkit.ChatColor; import org.bukkit.GameMode; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import de.jaschastarke.minecraft.limitedcreative.serialize.Armor; -import de.jaschastarke.minecraft.limitedcreative.serialize.Items; +import de.jaschastarke.minecraft.limitedcreative.store.PlayerInventoryStorage; import static de.jaschastarke.minecraft.utils.Locale.L; public class Inventory { - protected Player player; - protected PlayerInventory inv; + private static PlayerInventoryStorage storage = Core.plugin.config.getInvetoryStorage(); + //private static InvMemStorage tempinvs = new InvMemStorage(); - public Inventory(Player p) { - player = p; + protected LCPlayer player; + + public enum Target { + SURVIVAL, + CREATIVE; + + public static Target getTarget(GameMode gm) { + return gm == GameMode.CREATIVE ? Target.CREATIVE : Target.SURVIVAL; + } + } + + public Inventory(LCPlayer player) { + this.player = player; + } + public LCPlayer getLCPlayer() { + return player; + } + public Player getPlayer() { + return player.getPlayer(); } private PlayerInventory inv() { - return player.getInventory(); + return player.getPlayer().getInventory(); } public void save() { - LimitedCreativeCore.debug(player.getName() + " storing inventory "+player.getGameMode().toString()); - File f = new File(LimitedCreativeCore.plugin.getDataFolder(), getFileName(player, player.getGameMode())); - storeInventory(inv(), f); + Core.debug(getPlayer().getName()+": store inventory: "+getPlayer().getGameMode()); + storage.store(this, Target.getTarget(getPlayer().getGameMode())); + } + + public void load() { + load(getPlayer().getGameMode()); + } + + public boolean isStored(GameMode gm) { + return storage.contains(this, Target.getTarget(gm)); } public void load(GameMode gm) { - LimitedCreativeCore.debug(player.getName() + " loading inventory "+gm.toString()); - File f = new File(LimitedCreativeCore.plugin.getDataFolder(), getFileName(player, gm)); + Core.debug(getPlayer().getName()+": load inventory: "+gm); try { - restoreInventory(inv(), f); + storage.load(this, Target.getTarget(gm)); } catch (IllegalArgumentException e) { - if (LimitedCreativeCore.plugin.config.getUnsafeStorage()) { + if (Core.plugin.config.getUnsafeStorage()) { throw e; } else { - player.sendMessage(ChatColor.DARK_RED + L("exception.storage.load")); + getPlayer().sendMessage(ChatColor.DARK_RED + L("exception.storage.load")); } } } - public void load() { - load(player.getGameMode()); + + /*public void storeTemp() { + Core.debug(getPlayer().getName()+": temp store inventory"); + tempinvs.store(this); } + public void restoreTemp() { + Core.debug(getPlayer().getName()+": temp restore inventory"); + tempinvs.load(this); + } + public void clearTemp() { + Core.debug(getPlayer().getName()+": temp clear inventory"); + tempinvs.remove(this); + }*/ public void clear() { - inv().setArmorContents(new ItemStack[]{ - new ItemStack(0), - new ItemStack(0), - new ItemStack(0), - new ItemStack(0), - }); + inv().setArmorContents(new ItemStack[0]); inv().clear(); } - - private String getFileName(Player player, GameMode gm) { - if (gm != GameMode.SURVIVAL) { - return LimitedCreativeCore.plugin.config.getInventoryFolder() + File.separator + player.getName()+"_"+gm.toString()+".yml"; - } else { - return LimitedCreativeCore.plugin.config.getInventoryFolder() + File.separator + player.getName()+".yml"; - } - } - - protected static void storeInventory(PlayerInventory pinv, File file) { - YamlConfiguration yml = new YamlConfiguration(); - - new Armor(pinv).store(yml.createSection("armor")); - new Items(pinv).store(yml.createSection("inv")); - - try { - yml.save(file); - } catch (IOException e) { - LimitedCreativeCore.plugin.logger.severe(e.getMessage()); - } - } - protected static void restoreInventory(PlayerInventory pinv, File file) { - YamlConfiguration yml = YamlConfiguration.loadConfiguration(file); - - new Armor(pinv).restore(yml.getConfigurationSection("armor")); - new Items(pinv).restore(yml.getConfigurationSection("inv")); - } - - public boolean isStored(GameMode gm) { - File f = new File(LimitedCreativeCore.plugin.getDataFolder(), getFileName(player, gm)); - return f.exists(); - } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java b/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java index 5f07ec7..ec57bf6 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java @@ -17,8 +17,6 @@ */ package de.jaschastarke.minecraft.limitedcreative; -import java.io.File; -import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -29,7 +27,6 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -41,168 +38,174 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPickupItemEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.inventory.ItemStack; import org.bukkit.material.Lever; -import de.jaschastarke.minecraft.limitedcreative.Commands.LackingPermissionException; -import de.jaschastarke.minecraft.limitedcreative.serialize.Items; +import de.jaschastarke.minecraft.utils.IPermission; +import de.jaschastarke.minecraft.worldguard.events.PlayerChangedAreaEvent; import static de.jaschastarke.minecraft.utils.Locale.L; public class LCPlayer { - private static LimitedCreativeCore plugin = LimitedCreativeCore.plugin; - private static Map players = new HashMap(); - private Player player; - private Map tempinv = null; + private static Core plugin = Core.plugin; + + //private Player player; + private String name; private Inventory _inv; - private boolean _isPermanentCreative = false; - private boolean _isRegionCreative = false; + private GameMode _permanent_gamemode = null; private long _timestamp; - public static final long CLEANUP_TIMEOUT = 300000; // 300s = 5m - private static File _store_file = new File(plugin.getDataFolder(), "players.yml"); - public static YamlConfiguration store = YamlConfiguration.loadConfiguration(_store_file); - - private LCPlayer(Player player) { - this.player = player; - _isRegionCreative = store.getBoolean(player.getName()+".region_creative", false) && player.getGameMode() == GameMode.CREATIVE; - if (player.getGameMode() == GameMode.CREATIVE && !this.isRegionCreative()) { - LimitedCreativeCore.debug(player.getName() + " was already creative"); - setPermanentCreative(true); + public LCPlayer(Player player) { + //this.player = player; + name = player.getName(); + touch(); + + if (!this.isRegionGameMode(player.getGameMode())) { + setPermanentGameMode(player.getGameMode()); } } - private void updatePlayer(Player player) { + /*private void updatePlayer(Player player) { this.player = player; _inv = null; + }*/ + + public Player getPlayer() { + //return player; + return plugin.getServer().getPlayerExact(name); + } + public String getName() { + return name; } - public Player getRaw() { - return player; + public Inventory getInv() { + if (_inv == null) + _inv = new Inventory(this); + return _inv; } public void touch() { _timestamp = System.currentTimeMillis(); } - public boolean isOutdated() { - return !getRaw().isOnline() && _timestamp < (System.currentTimeMillis() - CLEANUP_TIMEOUT); - } - - public static LCPlayer get(Player player) { - LimitedCreativeCore.debug("player: " + player.getName() + " - " + ((Object)player).hashCode() + " - " + player.getEntityId() + " - " + player.getUniqueId()); - if (!players.containsKey(player.getName())) { - LCPlayer p = new LCPlayer(player); - players.put(player.getName(), p); - p.touch(); - return p; - } else { - LCPlayer p = players.get(player.getName()); - if (player != p.getRaw()) - p.updatePlayer(player); - p.touch(); - return p; - } - } - public static void cleanUp() { - int count = players.size(); - Iterator> i = players.entrySet().iterator(); - while (i.hasNext()) { - Map.Entry entry = i.next(); - if (entry.getValue().isOutdated()) { - LimitedCreativeCore.debug("removing "+entry.getValue().getRaw().getName()); - i.remove(); - } - } - LimitedCreativeCore.debug("cleanup done: player count: "+count+" / "+players.size()); - } - - public boolean isRegionCreative() { - return _isRegionCreative; + return (getPlayer() == null || !getPlayer().isOnline()) && + _timestamp < (System.currentTimeMillis() - Players.CLEANUP_TIMEOUT); } - public void changeGameMode(GameMode gm) throws LackingPermissionException { - if (!isRegionCreative() && !hasPermission("limitedcreative.switch_gamemode")) { - if (gm != GameMode.SURVIVAL || !hasPermission("limitedcreative.switch_gamemode.backonly")) { - LimitedCreativeCore.debug(player.getName() + " lacking permission /lc [cs]"); - throw new Commands.LackingPermissionException(); - } - } - getRaw().setGameMode(gm); - } - public void setRegionCreative(boolean b) { - LimitedCreativeCore.debug(player.getName() + " region creative: " + b); - if (b) { - store.set(player.getName()+".region_creative", true); - } else { - store.set(player.getName(), null); - } - try { - store.save(_store_file); - } catch (IOException e) { - plugin.logger.severe("Failed to save players.yml"); - e.printStackTrace(); - } - _isRegionCreative = b; - } - public boolean isPermanentCreative() { - return _isPermanentCreative; - } - public void setPermanentCreative(boolean b) { - LimitedCreativeCore.debug(player.getName() + " permanent creative: " + b); - _isPermanentCreative = b; - if (b) - setRegionCreative(false); + private Map options = new HashMap(); + public void setRegionGameMode(final GameMode gm) { + options.remove("region"); + Core.debug(getName()+": set region game mode: " + gm); + Players.getOptions().setRegionGameMode(getName(), gm); } - public boolean onSetCreative() { - LimitedCreativeCore.debug(player.getName() + " going into creative"); - if (!this.isRegionCreative()) - setPermanentCreative(true); - if (plugin.config.getStoreEnabled()) { - if (plugin.config.getPermissionToKeepInventory() && hasPermission("limitedcreative.keepinventory")) - return true; - inv().save(); - if (plugin.config.getStoreCreative() && inv().isStored(GameMode.CREATIVE)) { - inv().load(GameMode.CREATIVE); + private GameMode getRegionGameMode() { + if (!options.containsKey("region")) { + options.put("region", Players.getOptions().getRegionGameMode(getName())); + } + Core.debug(getName()+": get region game mode: " + options.get("region")); + return (GameMode) options.get("region"); + } + public boolean isRegionGameMode(final GameMode gm) { + return gm.equals(getRegionGameMode()); + } + public boolean isRegionGameMode() { + return getRegionGameMode() != null; + } + + public boolean isOptionalRegionGameMode() { + return getOptionalRegionGameMode() != null; + } + /*private boolean isOptionalRegionGameMode(final GameMode gm) { + return gm.equals(getOptionalRegionGameMode()); + }*/ + public boolean isOptionalRegionGameMode(final String region, final GameMode gm) { + return gm.equals(getOptionalRegionGameMode(region)); + } + private GameMode getOptionalRegionGameMode() { + String region = plugin.worldguard.getRegionManager().getRegionsHash(getPlayer().getLocation()); + return getOptionalRegionGameMode(region); + } + private GameMode getOptionalRegionGameMode(String region) { + if (!options.containsKey("region_opt#"+region)) { + options.put("region_opt#"+region, Players.getOptions().getOptionalRegionGameMode(getName(), region)); + } + Core.debug(getName()+": get optional region game mode: "+region+" - " + options.get("region_opt#"+region)); + return (GameMode) options.get("region_opt#"+region); + } + + public void setOptionalRegionGameMode(GameMode gm) { + String region = plugin.worldguard.getRegionManager().getRegionsHash(getPlayer().getLocation()); + setOptionalRegionGameMode(region, gm); + } + public void setOptionalRegionGameMode(String region, GameMode gm) { + options.remove("region_opt#"+region); + Core.debug(getName()+": set optional region game mode: "+region+" - " + gm); + Players.getOptions().setOptionalRegionGameMode(getName(), region, gm); + } + + public void setPermanentGameMode(GameMode temp) { + Core.debug(getName()+": set permanent game mode: " + temp); + if (temp != null) { + if (temp.equals(plugin.com.getDefaultGameMode(getPlayer().getWorld()))) { + temp = null; } else { - inv().clear(); + setRegionGameMode(null); } } - return true; + _permanent_gamemode = temp; } - private Inventory inv() { - if (_inv == null) - _inv = new Inventory(player); - return _inv; + public boolean isPermanentGameMode(GameMode temp) { + Core.debug(getName()+": get permanent game mode: " + _permanent_gamemode); + return temp.equals(_permanent_gamemode); } - public boolean onSetSurvival() { - LimitedCreativeCore.debug(player.getName() + " going into survival"); - if (isRegionCreative()) { - if (!plugin.config.getRegionOptional()) { - getRaw().sendMessage(ChatColor.RED + L("exception.region.no_survival")); - LimitedCreativeCore.debug("... denied"); - return false; + public boolean onSetGameMode(GameMode gm) { + Core.debug(getName() + " going into " + gm); + if (isRegionGameMode()) { // change to the other gamemode as the area defines + if (!isRegionGameMode(gm)) { // only when we are not switching to the mode the region allows + if (!plugin.config.getRegionOptional()) { + getPlayer().sendMessage(ChatColor.RED + L("exception.region.not_optional", gm.toString().toLowerCase())); + Core.debug("... denied"); + return false; + } else { + setOptionalRegionGameMode(gm); + } + } else { + // we are changing to the mode the region defines, thats not permanent + setOptionalRegionGameMode(null); + setPermanentGameMode(null); } + } else { + setPermanentGameMode(gm); // we are not in a region, so the mode change is permanent } - setPermanentCreative(false); + + /* + * Feature 1: Separated Inventories / Storage + */ if (plugin.config.getStoreEnabled()) { - if (plugin.config.getPermissionToKeepInventory() && hasPermission("limitedcreative.keepinventory")) + if (plugin.config.getPermissionToKeepInventory() && hasPermission(Perms.KEEPINVENTORY)) return true; - if (plugin.config.getStoreCreative()) { - inv().save(); + if (gm != GameMode.CREATIVE || plugin.config.getStoreCreative()) + getInv().save(); + if (gm == GameMode.CREATIVE) { + if (plugin.config.getStoreCreative() && getInv().isStored(GameMode.CREATIVE)) { + getInv().load(GameMode.CREATIVE); + } else { + getInv().clear(); + } + } else if (gm == GameMode.SURVIVAL) { + if (getInv().isStored(GameMode.SURVIVAL)) + getInv().load(GameMode.SURVIVAL); } - if (inv().isStored(GameMode.SURVIVAL)) - inv().load(GameMode.SURVIVAL); + } return true; } + public void onDropItem(PlayerDropItemEvent event) { - LimitedCreativeCore.debug(player.getName() + " ("+player.getGameMode()+") drops items " + event.getItemDrop().getItemStack().getType()); - if (player.getGameMode() == GameMode.CREATIVE) { - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.drop")) + Core.debug(getName() + " ("+getPlayer().getGameMode()+") drops items " + event.getItemDrop().getItemStack().getType()); + if (getPlayer().getGameMode() == GameMode.CREATIVE) { + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.DROP)) return; - LimitedCreativeCore.debug("removed"); + Core.debug("removed"); if (plugin.config.getRemoveDrop()) event.getItemDrop().remove(); else @@ -210,8 +213,8 @@ public class LCPlayer { } } public void onPickupItem(PlayerPickupItemEvent event) { - if (player.getGameMode() == GameMode.CREATIVE) { - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.pickup")) + if (getPlayer().getGameMode() == GameMode.CREATIVE) { + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.PICKUP)) return; if (plugin.config.getBlockPickupInCreative()) { event.setCancelled(true); @@ -223,36 +226,35 @@ public class LCPlayer { } public void onDie(EntityDeathEvent event) { - if (player.getGameMode() == GameMode.CREATIVE) { - if (!plugin.config.getPermissionsEnabled() || !hasPermission("limitedcreative.nolimit.drop")) { + if (getPlayer().getGameMode() == GameMode.CREATIVE) { + if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.DROP)) { event.getDrops().clear(); - tempinv = Items.storeInventory(player.getInventory()); + //getInv().storeTemp(); } } } + /* removed, because much to insecure. also we can save memory with out this public void onRespawn(PlayerRespawnEvent event) { - if (player.getGameMode() == GameMode.CREATIVE) { - if (!plugin.config.getPermissionsEnabled() || !hasPermission("limitedcreative.nolimit.drop")) { - if (tempinv != null) { - Items.restoreInventory(player.getInventory(), tempinv); - } + if (getPlayer().getGameMode() == GameMode.CREATIVE) { + if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.DROP)) { + getInv().restoreTemp(); } } - tempinv = null; - } + getInv().clearTemp(); + }*/ public void onDamage(Entity from, EntityDamageByEntityEvent event) { // receives damage if (from instanceof Player) { // its PVP Player attacker = (Player) event.getDamager(); if (attacker.getGameMode() == GameMode.CREATIVE) { - if (!plugin.config.getPermissionsEnabled() || !get(attacker).hasPermission("limitedcreative.nolimit.pvp")) { + if (!plugin.config.getPermissionsEnabled() || !Players.get(attacker).hasPermission(Perms.NoLimit.PVP)) { event.setCancelled(true); return; // skip next check } } - if (player.getGameMode() == GameMode.CREATIVE) { - if (!plugin.config.getPermissionsEnabled() || !hasPermission("limitedcreative.nolimit.pvp")) { + if (getPlayer().getGameMode() == GameMode.CREATIVE) { + if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.PVP)) { event.setCancelled(true); } } @@ -260,8 +262,8 @@ public class LCPlayer { } public void onDealDamage(EntityDamageByEntityEvent event) { // deals damage if (event.getEntity() instanceof Creature) { - if (player.getGameMode() == GameMode.CREATIVE && plugin.config.getMobDamageBlock()) { - if (!plugin.config.getPermissionsEnabled() || !hasPermission("limitedcreative.nolimit.mob_damage")) { + if (getPlayer().getGameMode() == GameMode.CREATIVE && plugin.config.getMobDamageBlock()) { + if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.MOB_DAMAGE)) { event.setCancelled(true); } } @@ -273,8 +275,8 @@ public class LCPlayer { */ public void onTarget(EntityTargetEvent event) { if (event.getEntity() instanceof Creature) { - if (player.getGameMode() == GameMode.CREATIVE && plugin.config.getMobDamageBlock()) { - if (!plugin.config.getPermissionsEnabled() || !hasPermission("limitedcreative.nolimit.mob_damage")) { + if (((Player) event.getTarget()).getGameMode() == GameMode.CREATIVE && plugin.config.getMobDamageBlock()) { + if (!plugin.config.getPermissionsEnabled() || !hasPermission(Perms.NoLimit.MOB_DAMAGE)) { event.setCancelled(true); } } @@ -282,68 +284,83 @@ public class LCPlayer { } public void onChestAccess(PlayerInteractEvent event) { - if (player.getGameMode() != GameMode.CREATIVE) + if (event.getPlayer().getGameMode() != GameMode.CREATIVE) return; - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.chest")) + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.CHEST)) return; event.getPlayer().sendMessage(L("blocked.chest")); event.setCancelled(true); } public void onChestAccess(PlayerInteractEntityEvent event) { // chest-minecarts are different events - if (player.getGameMode() != GameMode.CREATIVE) + if (getPlayer().getGameMode() != GameMode.CREATIVE) return; - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.chest")) + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.CHEST)) return; event.getPlayer().sendMessage(L("blocked.chest")); event.setCancelled(true); } public void onBenchAccess(PlayerInteractEvent event) { - if (!plugin.config.getBenchBlock() || player.getGameMode() != GameMode.CREATIVE) + if (!plugin.config.getBenchBlock() || event.getPlayer().getGameMode() != GameMode.CREATIVE) return; - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.chest")) + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.CHEST)) return; event.getPlayer().sendMessage(L("blocked.chest")); event.setCancelled(true); } public void onSignAccess(PlayerInteractEvent event) { - if (!plugin.config.getSignBlock() || player.getGameMode() != GameMode.CREATIVE) + if (!plugin.config.getSignBlock() || event.getPlayer().getGameMode() != GameMode.CREATIVE) return; - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.sign")) + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.SIGN)) return; event.getPlayer().sendMessage(L("blocked.sign")); event.setCancelled(true); } public void onButtonAccess(PlayerInteractEvent event) { - if (!plugin.config.getButtonBlock() || player.getGameMode() != GameMode.CREATIVE) + if (!plugin.config.getButtonBlock() || event.getPlayer().getGameMode() != GameMode.CREATIVE) return; if (event.getClickedBlock().getState() instanceof Lever) { - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.lever")) + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.LEVER)) return; event.getPlayer().sendMessage(L("blocked.lever")); event.setCancelled(true); } else { - if (plugin.config.getPermissionsEnabled() && hasPermission("limitedcreative.nolimit.button")) + if (plugin.config.getPermissionsEnabled() && hasPermission(Perms.NoLimit.BUTTON)) return; event.getPlayer().sendMessage(L("blocked.button")); event.setCancelled(true); } } - - private long lastFloatingTimeWarning = 0; - public void setRegionCreativeAllowed(boolean rcreative, PlayerMoveEvent event) { - GameMode DEFAULT_GAMEMODE = plugin.com.isCreative(event.getTo().getWorld()) ? GameMode.CREATIVE : GameMode.SURVIVAL; - GameMode TEMPORARY_GAMEMODE = DEFAULT_GAMEMODE == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL; + /* + * Attention: "Creative" stands for "the other gamemode". So true may mean, "be survival in creative world". + */ + public void setRegionCreativeAllowed(boolean rcreative, PlayerChangedAreaEvent changearea_event) { + Core.debug(getName()+": changed region: "+rcreative+": "+changearea_event.toString()); - if (rcreative && player.getGameMode() == DEFAULT_GAMEMODE && !isRegionCreative()) { - setRegionCreative(true); // have to be set, before setGameMode - player.setGameMode(TEMPORARY_GAMEMODE); - } else if (!rcreative && player.getGameMode() == TEMPORARY_GAMEMODE && !isPermanentCreative()) { - if (getFloatingHeight() > 3) { - if (System.currentTimeMillis() - lastFloatingTimeWarning > 10000) {// 10 sec. limit - player.sendMessage(L("blocked.survival_flying")); - lastFloatingTimeWarning = System.currentTimeMillis(); - } + PlayerMoveEvent event = changearea_event.getMoveEvent(); + GameMode CURRENT_GAMEMODE = event.getPlayer().getGameMode(); + GameMode DEFAULT_GAMEMODE = plugin.com.getDefaultGameMode(event.getTo().getWorld()); + GameMode TEMPORARY_GAMEMODE = DEFAULT_GAMEMODE == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL; // the opposite + + if (rcreative && CURRENT_GAMEMODE != TEMPORARY_GAMEMODE && !this.isRegionGameMode(TEMPORARY_GAMEMODE)) { + Core.debug(getName()+": entering creative area"); + // 1. the region allows "the other (temporary) gamemode" + // 2. but the player is not in that mode + // 3. and the player is not aware of that + // result: change him to that mode + setRegionGameMode(TEMPORARY_GAMEMODE); // have to be set, before setGameMode + if (!isOptionalRegionGameMode(changearea_event.getNewRegionHash(), CURRENT_GAMEMODE)) { + event.getPlayer().setGameMode(TEMPORARY_GAMEMODE); + } + } else if (!rcreative && event.getPlayer().getGameMode() == TEMPORARY_GAMEMODE && !isPermanentGameMode(TEMPORARY_GAMEMODE)) { + Core.debug(getName()+": leaving creative area"); + // 1. the region doesn't allow "the other gamemode" + // 2. but the player is in that mode + // 3. and the player isn't global (permanent) in that mode + // result: change him back to default mode + if (CURRENT_GAMEMODE == GameMode.CREATIVE && getFloatingHeight() > plugin.config.getMaximumFloatingHeight()) { + // but not if he is too high + this.sendTimeoutMessage(L("blocked.survival_flying")); Location newloc = event.getTo().clone(); newloc.setX(event.getFrom().getX()); @@ -351,16 +368,39 @@ public class LCPlayer { newloc.setZ(event.getFrom().getZ()); event.setTo(newloc); } else { - setRegionCreative(false); - player.setGameMode(GameMode.SURVIVAL); // also unsets isRegionCreative; + setRegionGameMode(null); + if (event.getTo().getWorld() == event.getFrom().getWorld()) { + // do not enforce the game mode change, on world teleport, as multiverse may cancel the event afterwards + // the world-change game-mode change is done by multiworld + event.getPlayer().setGameMode(DEFAULT_GAMEMODE); + } } - } else if (!rcreative && isRegionCreative()) { - setRegionCreative(false); // we have left, while in optional survival + } else if (!rcreative && this.isRegionGameMode(TEMPORARY_GAMEMODE)) { + Core.debug(getName()+": leaving creative area (while already in default gamemode)"); + // 1. the region doesn't allow "the other gamemode" + // 2. but he thinks he is still allowed + // 3. (because of else) we are not longer in that mode + // result: advise him to not longer allowed to that region + setRegionGameMode(null); + } + } + + private Map timeout_msgs = new HashMap(); + public void sendTimeoutMessage(String msg) { + Iterator> i = timeout_msgs.entrySet().iterator(); + while (i.hasNext()) { + Map.Entry entry = i.next(); + if (entry.getValue() < (System.currentTimeMillis() - plugin.config.getRepeatingMessageTimeout())) { + i.remove(); + } + } + if (!timeout_msgs.containsKey(msg)) { + timeout_msgs.put(msg, System.currentTimeMillis()); + getPlayer().sendMessage(msg); } } - public int getFloatingHeight() { - Block b = player.getLocation().getBlock(); + Block b = getPlayer().getLocation().getBlock(); int steps = 0; while (b.getType() == Material.AIR) { steps++; @@ -370,22 +410,28 @@ public class LCPlayer { } public void goToFloor() { - Block b = player.getLocation().getBlock(); + Block b = getPlayer().getLocation().getBlock(); int steps = 0; while (b.getType() == Material.AIR) { steps++; b = b.getRelative(BlockFace.DOWN); } if (steps > 2) { - player.teleport(new Location(player.getWorld(), - player.getLocation().getX(), + getPlayer().teleport(new Location(getPlayer().getWorld(), + getPlayer().getLocation().getX(), b.getY()+1, - player.getLocation().getZ())); + getPlayer().getLocation().getZ())); } } - public boolean hasPermission(String permission) { - return plugin.perm.hasPermission(this.getRaw(), permission); + public boolean hasPermission(IPermission permission) { + return plugin.perm.hasPermission(this.getPlayer(), permission); + } + + public boolean isGameModeAllowed(GameMode gm) { + if (plugin.config.getRegionOptional() && isRegionGameMode()) { + return true; + } + return false; } - } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/NoBlockItemSpawn.java b/src/de/jaschastarke/minecraft/limitedcreative/NoBlockItemSpawn.java index e81c791..307b64e 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/NoBlockItemSpawn.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/NoBlockItemSpawn.java @@ -28,6 +28,10 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +/** + * The "Block" means a Minecraft-Block, not "blocking". So this Class is used to prevent ItemSpawn which are Drops from + * specified Blocks. + */ public class NoBlockItemSpawn { public final static long TIME_OFFSET = 250; @@ -71,11 +75,11 @@ public class NoBlockItemSpawn { } public void block(Block block, LCPlayer player) { - if (player.getRaw().getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) { + if (player.getPlayer().getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) { block(block.getLocation(), block.getType()); } else { // doesn't include silktouch - for (ItemStack i : block.getDrops(player.getRaw().getItemInHand())) { + for (ItemStack i : block.getDrops(player.getPlayer().getItemInHand())) { block(block.getLocation(), i.getType()); } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Perms.java b/src/de/jaschastarke/minecraft/limitedcreative/Perms.java new file mode 100644 index 0000000..6cafb55 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/Perms.java @@ -0,0 +1,66 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative; + +import de.jaschastarke.minecraft.utils.IPermission; + +public enum Perms implements IPermission { + CONFIG("config"), + REGIONS("regions"), + GM("switch_gamemode"), + GM_BACKONLY("switch_gamemode.backonly"), + GM_SURVIVAL("switch_gamemode.survival"), + GM_CREATIVE("switch_gamemode.creative"), + GM_OTHER("switch_gamemode.other"), + KEEPINVENTORY("keepinventory"); + + private static final String NS = "limitedcreative"; + + private String perm; + private Perms(String permission) { + perm = permission; + } + @Override + public String toString() { + return NS + SEP + perm; + } + + public enum NoLimit implements IPermission { + DROP("drop"), + PICKUP("pickup"), + CHEST("chest"), + SIGN("sign"), + BUTTON("button"), + LEVER("lever"), + PVP("pvp"), + MOB_DAMAGE("mob_damage"), + USE("use"), + BREAK("break"); + + private static final String NS = "nolimit"; + + private String perm; + private NoLimit(String permission) { + perm = permission; + } + @Override + public String toString() { + return Perms.NS + SEP + NoLimit.NS + SEP + perm; + } + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Players.java b/src/de/jaschastarke/minecraft/limitedcreative/Players.java new file mode 100644 index 0000000..0468ed0 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/Players.java @@ -0,0 +1,82 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.entity.Player; + +import de.jaschastarke.minecraft.limitedcreative.store.PlayerOptions; + +public class Players { + public static final long CLEANUP_TIMEOUT = 300000; // 300s = 5m + private static Map players = new HashMap(); + private static PlayerOptions options = new PlayerOptions(); + + public static LCPlayer get(Player player) { + Core.debug("player: " + player.getName() + " - " + ((Object)player).hashCode() + " - " + player.getEntityId() + " - " + player.getUniqueId()); + if (!players.containsKey(player.getName())) { + LCPlayer p = new LCPlayer(player); + players.put(player.getName(), p); + return p; + } else { + LCPlayer p = players.get(player.getName()); + /*if (player != p.getPlayer()) + p.updatePlayer(player);*/ + p.touch(); + return p; + } + } + + public static LCPlayer get(String player) { + if (players.containsKey(player)) { + return players.get(player); + } + return null; + } + + public static void remove(String player) { + players.remove(player); + } + + /*public static void clear(String player) { + if (players.containsKey(player)) { + LCPlayer p = players.get(player); + p.updatePlayer(null); + p.touch(); // keep meta data alive till cleanup, but remove player bukkit assoc. + } + }*/ + + /*public static void cleanUp() { + int count = players.size(); + Iterator> i = players.entrySet().iterator(); + while (i.hasNext()) { + Map.Entry entry = i.next(); + if (entry.getValue().isOutdated()) { + Core.debug("removing "+entry.getValue().getName()); + i.remove(); + } + } + Core.debug("cleanup done: player count: "+count+" / "+players.size()); + }*/ + + public static PlayerOptions getOptions() { + return options; + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/listeners/LimitListener.java b/src/de/jaschastarke/minecraft/limitedcreative/listeners/LimitListener.java index 9b2a227..e9d9a3c 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/listeners/LimitListener.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/listeners/LimitListener.java @@ -42,35 +42,31 @@ import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPickupItemEvent; -import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.material.Button; import org.bukkit.material.Lever; import de.jaschastarke.minecraft.limitedcreative.BlackList; import de.jaschastarke.minecraft.limitedcreative.LCPlayer; -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; +import de.jaschastarke.minecraft.limitedcreative.Core; +import de.jaschastarke.minecraft.limitedcreative.Perms; +import de.jaschastarke.minecraft.limitedcreative.Players; import static de.jaschastarke.minecraft.utils.Locale.L; public class LimitListener implements Listener { - private LimitedCreativeCore plugin; - public LimitListener(LimitedCreativeCore plugin) { + private Core plugin; + public LimitListener(Core plugin) { this.plugin = plugin; } - @EventHandler - public void onPlayerRespawn(PlayerRespawnEvent event) { - LCPlayer.get(event.getPlayer()).onRespawn(event); - } - @EventHandler public void onPlayerDropItem(PlayerDropItemEvent event) { - LCPlayer.get(event.getPlayer()).onDropItem(event); + Players.get(event.getPlayer()).onDropItem(event); } @EventHandler public void onPlayerPickupItem(PlayerPickupItemEvent event) { - LCPlayer.get(event.getPlayer()).onPickupItem(event); + Players.get(event.getPlayer()).onPickupItem(event); } @EventHandler(priority=EventPriority.LOWEST) @@ -78,8 +74,8 @@ public class LimitListener implements Listener { if (MainListener.isCancelled(event) || event.getPlayer().getGameMode() != GameMode.CREATIVE) return; - LCPlayer player = LCPlayer.get(event.getPlayer()); - if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.use")) { + LCPlayer player = Players.get(event.getPlayer()); + if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.USE)) { if (event.getItem() != null && BlackList.isBlackListed(plugin.config.getBlockedUse(), event.getItem())) { event.setCancelled(true); event.setUseItemInHand(Event.Result.DENY); @@ -109,8 +105,8 @@ public class LimitListener implements Listener { if (event.isCancelled() || event.getPlayer().getGameMode() != GameMode.CREATIVE) return; - LCPlayer player = LCPlayer.get(event.getPlayer()); - if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.use")) { + LCPlayer player = Players.get(event.getPlayer()); + if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.USE)) { if (event.getPlayer().getItemInHand() != null && BlackList.isBlackListed(plugin.config.getBlockedUse(), event.getPlayer().getItemInHand())) { event.setCancelled(true); event.getPlayer().sendMessage(L("blocked.use")); @@ -126,22 +122,28 @@ public class LimitListener implements Listener { } @EventHandler - public void onEntityDamage(EntityDamageEvent meta_event) { - if (meta_event.isCancelled()) + public void onEntityDamage(EntityDamageEvent event) { + if (event instanceof EntityDamageByEntityEvent) + onEntityDamageByEntity((EntityDamageByEntityEvent) event); + } + + /* + * Registering to that event works, but causes a SEVERE: + * Plugin attempted to register delegated event class class org.bukkit.event.entity.EntityDamageByEntityEvent. + * It should be using class org.bukkit.event.entity.EntityDamageEvent! + */ + protected void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (event.isCancelled()) return; - if (meta_event instanceof EntityDamageByEntityEvent) { - EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) meta_event; - - Entity source = event.getDamager(); - if (source instanceof Projectile) - source = ((Projectile) source).getShooter(); - - if (event.getEntity() instanceof Player) { - LCPlayer.get((Player) event.getEntity()).onDamage(source, event); - } - if (!event.isCancelled() && source instanceof Player) { - LCPlayer.get((Player) source).onDealDamage(event); - } + Entity source = event.getDamager(); + if (source instanceof Projectile) + source = ((Projectile) source).getShooter(); + + if (event.getEntity() instanceof Player) { + Players.get((Player) event.getEntity()).onDamage(source, event); + } + if (!event.isCancelled() && source instanceof Player) { + Players.get((Player) source).onDealDamage(event); } } @EventHandler @@ -149,7 +151,7 @@ public class LimitListener implements Listener { if (event.isCancelled()) return; if (event.getTarget() instanceof Player) { - LCPlayer.get((Player) event.getTarget()).onTarget(event); + Players.get((Player) event.getTarget()).onTarget(event); } } @@ -157,24 +159,28 @@ public class LimitListener implements Listener { public void onEntityDeath(EntityDeathEvent event) { if (event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); - LCPlayer.get(player).onDie(event); + Players.get(player).onDie(event); } } + /*@EventHandler + public void onPlayerRespawn(PlayerRespawnEvent event) { + Players.get(event.getPlayer()).onRespawn(event); + }*/ @EventHandler public void onBlockBreak(BlockBreakEvent event) { if (event.isCancelled()) return; if (event.getPlayer().getGameMode() == GameMode.CREATIVE) { - LCPlayer player = LCPlayer.get(event.getPlayer()); - if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.break")) { + LCPlayer player = Players.get(event.getPlayer()); + if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.BREAK)) { if (BlackList.isBlackListed(plugin.config.getBlockedBreaks(), event.getBlock())) { event.setCancelled(true); event.getPlayer().sendMessage(L("blocked.break")); } } - if (plugin.config.getPermissionsEnabled() && player.hasPermission("limitedcreative.nolimit.drop")) + if (plugin.config.getPermissionsEnabled() && player.hasPermission(Perms.NoLimit.DROP)) return; // Prevent dropping of doors and beds when destroying the wrong part Block block = event.getBlock(); @@ -205,8 +211,8 @@ public class LimitListener implements Listener { if (event.isCancelled()) return; if (event.getPlayer().getGameMode() == GameMode.CREATIVE) { - LCPlayer player = LCPlayer.get(event.getPlayer()); - if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.use")) { + LCPlayer player = Players.get(event.getPlayer()); + if (!plugin.config.getPermissionsEnabled() || !player.hasPermission(Perms.NoLimit.USE)) { if (BlackList.isBlackListed(plugin.config.getBlockedUse(), event.getBlock())) { event.setCancelled(true); event.getPlayer().sendMessage(L("blocked.place")); diff --git a/src/de/jaschastarke/minecraft/limitedcreative/listeners/MainListener.java b/src/de/jaschastarke/minecraft/limitedcreative/listeners/MainListener.java index da9fbda..d694668 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/listeners/MainListener.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/listeners/MainListener.java @@ -17,7 +17,6 @@ */ package de.jaschastarke.minecraft.limitedcreative.listeners; -import org.bukkit.GameMode; import org.bukkit.entity.Item; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; @@ -25,13 +24,14 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerQuitEvent; -import de.jaschastarke.minecraft.limitedcreative.LCPlayer; -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; +import de.jaschastarke.minecraft.limitedcreative.Core; +import de.jaschastarke.minecraft.limitedcreative.Players; public class MainListener implements Listener { - private LimitedCreativeCore plugin; - public MainListener(LimitedCreativeCore plugin) { + private Core plugin; + public MainListener(Core plugin) { this.plugin = plugin; } @@ -47,20 +47,18 @@ public class MainListener implements Listener { @EventHandler public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) { - LimitedCreativeCore.debug("onPlayerGameModeChange: "+event.getPlayer().getName()); - LimitedCreativeCore.debug("Current GameMode: "+event.getPlayer().getGameMode()); - LimitedCreativeCore.debug("New GameMode: "+event.getNewGameMode()); - LimitedCreativeCore.debug("isLoggedin: "+plugin.com.isLoggedIn(event.getPlayer())); - LimitedCreativeCore.debug("isCancelled: "+event.isCancelled()); + if (Core.isDebug()) { + Core.debug("onPlayerGameModeChange: "+event.getPlayer().getName()); + Core.debug("Current GameMode: "+event.getPlayer().getGameMode()); + Core.debug("New GameMode: "+event.getNewGameMode()); + Core.debug("isLoggedin: "+plugin.com.isLoggedIn(event.getPlayer())); + Core.debug("isCancelled: "+event.isCancelled()); + } if (!plugin.com.isLoggedIn(event.getPlayer())) return; - if (event.getNewGameMode() == GameMode.CREATIVE) { - if (!LCPlayer.get(event.getPlayer()).onSetCreative()) - event.setCancelled(true); - } else if (event.getNewGameMode() == GameMode.SURVIVAL) { - if (!LCPlayer.get(event.getPlayer()).onSetSurvival()) - event.setCancelled(true); - } + + if (!Players.get(event.getPlayer()).onSetGameMode(event.getNewGameMode())) + event.setCancelled(true); } /** @@ -77,27 +75,8 @@ public class MainListener implements Listener { } } - - /* - public static class VehicleListen extends VehicleListener { - @EventHandler - public void onVehicleDestroy(VehicleDestroyEvent event) { - if (event.isCancelled()) - return; - if (event.getAttacker() instanceof Player) { - Player player = (Player) event.getAttacker(); - if (player.getGameMode() == GameMode.CREATIVE) { - if (plugin.config.getPermissionsEnabled() && player.hasPermission("limitedcreative.nolimit.drop")) - return; - plugin.logger.info("Vehicle destroy: "+event.getVehicle() + " - "+event.getVehicle().getEntityId()); - } - } - } - - private void register() { - if (plugin.config.getLimitEnabled()) { - pm.registerEvent(Event.Type.VEHICLE_DESTROY, this, Priority.Normal, plugin); - } - } - }*/ + public void onLogout(PlayerQuitEvent event) { + // what? i can't cancel a logout event? but how to chain the user to the server than? xD + Players.remove(event.getPlayer().getName()); + } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/regions/RegionListener.java b/src/de/jaschastarke/minecraft/limitedcreative/regions/RegionListener.java index 11f18da..e36261a 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/regions/RegionListener.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/regions/RegionListener.java @@ -16,14 +16,15 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.ItemSpawnEvent; import de.jaschastarke.minecraft.limitedcreative.LCPlayer; -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; +import de.jaschastarke.minecraft.limitedcreative.Core; +import de.jaschastarke.minecraft.limitedcreative.Players; import de.jaschastarke.minecraft.utils.Util; import de.jaschastarke.minecraft.worldguard.ApplicableRegions; import de.jaschastarke.minecraft.worldguard.CRegionManager; import de.jaschastarke.minecraft.worldguard.events.PlayerChangedAreaEvent; public class RegionListener implements Listener { - private static LimitedCreativeCore plugin = WorldGuardIntegration.plugin; + private static Core plugin = WorldGuardIntegration.plugin; private CRegionManager rm; public RegionListener(WorldGuardIntegration wgi) { rm = wgi.getRegionManager(); @@ -39,14 +40,29 @@ public class RegionListener implements Listener { public void onBlockBreak(BlockBreakEvent event) { if (event.isCancelled()) return; - LCPlayer player = LCPlayer.get(event.getPlayer()); - ApplicableRegions set = rm.getRegionSet(event.getBlock()); - if (player.isRegionCreative() && !set.allows(Flags.CREATIVE, player)) { - event.getPlayer().sendMessage(L("blocked.outside_creative_break")); - event.setCancelled(true); - } else if (player.getRaw().getGameMode() != GameMode.CREATIVE && set.allows(Flags.CREATIVE)) { - plugin.spawnblock.block(event.getBlock(), player); + LCPlayer player = Players.get(event.getPlayer()); + boolean diffrent_region = rm.isDiffrentRegion(event.getPlayer(), event.getBlock().getLocation()); + boolean creative_world = plugin.com.isCreative(event.getBlock().getWorld()); + + if (player.isRegionGameMode() && diffrent_region) { + // do not break outside of "gamemod-change-region" when in the region + if (!rm.getRegionSet(event.getBlock()).allows(Flags.CREATIVE, event.getPlayer())) { + event.getPlayer().sendMessage(L("blocked.outside_creative_break")); + event.setCancelled(true); + } + } else if (diffrent_region) { + // do not break inside of "survial-region in creative world" when outside + if (rm.getRegionSet(event.getBlock()).allows(Flags.CREATIVE)) { + event.getPlayer().sendMessage(L("blocked.inside_survival_break")); + event.setCancelled(true); + } + } + if (!creative_world) { // in survival world + // prevent any drops for survival players in creative regions in survival worlds + if (event.getPlayer().getGameMode() != GameMode.CREATIVE && rm.getRegionSet(event.getBlock()).allows(Flags.CREATIVE)) { + plugin.spawnblock.block(event.getBlock(), player); + } } } @@ -54,20 +70,28 @@ public class RegionListener implements Listener { public void onBlockPlace(BlockPlaceEvent event) { if (event.isCancelled()) return; - LCPlayer player = LCPlayer.get(event.getPlayer()); - if (player.isRegionCreative() && rm.isDiffrentRegion(event.getPlayer(), event.getBlock().getLocation())) { - // do not build outside of creative regions, when in the region - ApplicableRegions set = rm.getRegionSet(event.getBlock()); - if (!set.allows(Flags.CREATIVE, player)) { + + LCPlayer player = Players.get(event.getPlayer()); + boolean diffrent_region = rm.isDiffrentRegion(event.getPlayer(), event.getBlock().getLocation()); + + if (player.isRegionGameMode() && diffrent_region) { + // do not build outside of "gamemod-change-region" when in the region + if (!rm.getRegionSet(event.getBlock()).allows(Flags.CREATIVE, event.getPlayer())) { event.getPlayer().sendMessage(L("blocked.outside_creative")); event.setCancelled(true); } + } else if (diffrent_region) { + // do not build inside of "survial-region in creative world" when outside + if (rm.getRegionSet(event.getBlock()).allows(Flags.CREATIVE)) { + event.getPlayer().sendMessage(L("blocked.inside_survival")); + event.setCancelled(true); + } } } @EventHandler public void onPlayerChangedArea(PlayerChangedAreaEvent event) { - LCPlayer.get(event.getPlayer()).setRegionCreativeAllowed(event.getNewRegionSet().allows(Flags.CREATIVE), event.getMoveEvent()); + Players.get(event.getPlayer()).setRegionCreativeAllowed(event.getNewRegionSet().allows(Flags.CREATIVE, event.getPlayer()), event); } @EventHandler @@ -76,12 +100,12 @@ public class RegionListener implements Listener { return; Block source = event.getBlock().getRelative(event.getDirection()); - LimitedCreativeCore.debug("PistonExtend "+source.getType()+" "+event.getDirection()); + Core.debug("PistonExtend "+source.getType()+" "+event.getDirection()); if (source.getType() != Material.AIR) { if (regionSet(source).allows(Flags.CREATIVE)) { for (int i = 1; i <= 12; i++) { Block dest = source.getRelative(event.getDirection(), i); - LimitedCreativeCore.debug("dest "+i+": "+dest.getType()); + Core.debug("dest "+i+": "+dest.getType()); if (!regionSet(dest).allows(Flags.CREATIVE)) { plugin.logger.warning(L("blocked.piston", source.getRelative(event.getDirection(), i - 1).getType().toString(), Util.toString(source.getLocation()))); event.setCancelled(true); @@ -100,9 +124,9 @@ public class RegionListener implements Listener { return; Block source = event.getBlock().getRelative(event.getDirection(), 2); Block dest = source.getRelative(event.getDirection().getOppositeFace()); - LimitedCreativeCore.debug("PistonRetract "+source.getType()+" "+event.getDirection() + " " + event.isSticky()); + Core.debug("PistonRetract "+source.getType()+" "+event.getDirection() + " " + event.isSticky()); if (event.isSticky() && source.getType() != Material.AIR) { - LimitedCreativeCore.debug("dest "+dest.getType()); + Core.debug("dest "+dest.getType()); if (regionSet(source).allows(Flags.CREATIVE)) { if (!regionSet(dest).allows(Flags.CREATIVE)) { plugin.logger.warning(L("blocked.piston", source.getType().toString(), Util.toString(source.getLocation()))); diff --git a/src/de/jaschastarke/minecraft/limitedcreative/regions/WorldGuardIntegration.java b/src/de/jaschastarke/minecraft/limitedcreative/regions/WorldGuardIntegration.java index 203abf4..e6f4af1 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/regions/WorldGuardIntegration.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/regions/WorldGuardIntegration.java @@ -22,16 +22,16 @@ import java.util.List; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.flags.Flag; -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; +import de.jaschastarke.minecraft.limitedcreative.Core; import de.jaschastarke.minecraft.worldguard.CRegionManager; import de.jaschastarke.minecraft.worldguard.Integration; import de.jaschastarke.minecraft.worldguard.Interface; public class WorldGuardIntegration implements Integration { - public static LimitedCreativeCore plugin; + public static Core plugin; public static WorldGuardPlugin wg; - public WorldGuardIntegration(LimitedCreativeCore plugin) { + public WorldGuardIntegration(Core plugin) { WorldGuardIntegration.plugin = plugin; wg = (WorldGuardPlugin) plugin.getServer().getPluginManager().getPlugin("WorldGuard"); diff --git a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Armor.java b/src/de/jaschastarke/minecraft/limitedcreative/serialize/Armor.java deleted file mode 100644 index a8276ed..0000000 --- a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Armor.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Limited Creative - (Bukkit Plugin) - * Copyright (C) 2012 jascha@ja-s.de - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package de.jaschastarke.minecraft.limitedcreative.serialize; - -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.inventory.PlayerInventory; - -public class Armor implements Storeable { - private PlayerInventory inv; - public Armor(PlayerInventory pi) { - inv = pi; - } - - @Override - public void store(ConfigurationSection section) { - if (inv.getHelmet() != null && inv.getHelmet().getTypeId() != 0) - Items.sectionSetItem(section, "helmet", inv.getHelmet()); - if (inv.getChestplate() != null && inv.getChestplate().getTypeId() != 0) - Items.sectionSetItem(section, "chestplate", inv.getChestplate()); - if (inv.getLeggings() != null && inv.getLeggings().getTypeId() != 0) - Items.sectionSetItem(section, "leggins", inv.getLeggings()); - if (inv.getBoots() != null && inv.getBoots().getTypeId() != 0) - Items.sectionSetItem(section, "boots", inv.getBoots()); - } - - @Override - public void restore(ConfigurationSection section) { - if (section.contains("helmet")) - inv.setHelmet(Items.sectionGetItem(section, "helmet")); - else - inv.setHelmet(null); - - if (section.contains("chestplate")) - inv.setChestplate(Items.sectionGetItem(section, "chestplate")); - else - inv.setChestplate(null); - - if (section.contains("leggins")) - inv.setLeggings(Items.sectionGetItem(section, "leggins")); - else - inv.setLeggings(null); - - if (section.contains("boots")) - inv.setBoots(Items.sectionGetItem(section, "boots")); - else - inv.setBoots(null); - } - -} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java b/src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java deleted file mode 100644 index facc28b..0000000 --- a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Limited Creative - (Bukkit Plugin) - * Copyright (C) 2012 jascha@ja-s.de - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package de.jaschastarke.minecraft.limitedcreative.serialize; - -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; - -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; - -public class Items implements Storeable { - private PlayerInventory inv; - public Items(PlayerInventory pi) { - inv = pi; - } - - @Override - public void store(ConfigurationSection section) { - for (int i = 0; i < inv.getSize(); i++) { - if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) - sectionSetItem(section, String.valueOf(i), inv.getItem(i)); - } - } - - @Override - public void restore(ConfigurationSection section) { - inv.clear(); - for (int i = 0; i < inv.getSize(); i++) { - if (section.contains(String.valueOf(i))) - inv.setItem(i, sectionGetItem(section, String.valueOf(i))); - } - } - - public static void sectionSetItem(ConfigurationSection section, String path, ItemStack item) { - if (!LimitedCreativeCore.plugin.config.getUnsafeStorage()) { - section.set(path, item); - } else { // unsafe enchants fallback - Map serialize = item.serialize(); - if (serialize.containsKey("type") && serialize.get("type") instanceof Material) - serialize.put("type", serialize.get("type").toString()); - section.createSection(path, serialize); - }; - } - public static ItemStack sectionGetItem(ConfigurationSection section, String path) { - if (section.isItemStack(path)) { - return section.getItemStack(path); - } else { - ConfigurationSection s = section.getConfigurationSection(path); - Map serialize = s.getValues(false); - serialize.remove("enchantments"); - ItemStack result = ItemStack.deserialize(serialize); - Map item = section.getConfigurationSection(path).getValues(false); - item.remove("enchantments"); - if (s.contains("enchantments")) { - for (Map.Entry entry : s.getConfigurationSection("enchantments").getValues(false).entrySet()) { - Enchantment enchantment = Enchantment.getByName(entry.getKey().toString()); - if ((enchantment != null) && (entry.getValue() instanceof Integer)) { - result.addUnsafeEnchantment(enchantment, (Integer) entry.getValue()); - } - } - } - return result; - } - } - public static Map storeInventory(PlayerInventory inv) { - Map map = new HashMap(); - for (int i = 0; i < inv.getSize(); i++) { - if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) { - map.put(i, inv.getItem(i)); - } - } - for (int i = 0; i < inv.getArmorContents().length; i++) { - map.put((i * -1) - 1, inv.getArmorContents()[i]); - } - return map; - } - public static void restoreInventory(PlayerInventory inv, Map map) { - for (int i = 0; i < inv.getSize(); i++) { - if (map.containsKey(i)) { - inv.setItem(i, map.get(i)); - } else { - inv.setItem(i, null); - } - } - for (int i = 0; i < inv.getArmorContents().length; i++) { - int _i = (i * -1) - 1; - if (map.containsKey(_i)) { - inv.getArmorContents()[i] = map.get(_i); - } else { - inv.getArmorContents()[i] = null; - } - } - } -} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/store/Fallback.java b/src/de/jaschastarke/minecraft/limitedcreative/store/Fallback.java new file mode 100644 index 0000000..f817c15 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/store/Fallback.java @@ -0,0 +1,170 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative.store; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +import de.jaschastarke.minecraft.limitedcreative.Core; + +public class Fallback { + + public static void loadVersion1(PlayerInventory inv, ConfigurationSection sect) { + new Armor(inv).restore(sect.getConfigurationSection("armor")); + new Items(inv).restore(sect.getConfigurationSection("inv")); + } + + public static interface Storeable { + public void store(ConfigurationSection section); + public void restore(ConfigurationSection section); + } + + public static class Items implements Storeable { + private PlayerInventory inv; + public Items(PlayerInventory pi) { + inv = pi; + } + + @Override + public void store(ConfigurationSection section) { + for (int i = 0; i < inv.getSize(); i++) { + if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) + sectionSetItem(section, String.valueOf(i), inv.getItem(i)); + } + } + + @Override + public void restore(ConfigurationSection section) { + inv.clear(); + for (int i = 0; i < inv.getSize(); i++) { + if (section.contains(String.valueOf(i))) + inv.setItem(i, sectionGetItem(section, String.valueOf(i))); + } + } + + public static void sectionSetItem(ConfigurationSection section, String path, ItemStack item) { + if (!Core.plugin.config.getUnsafeStorage()) { + section.set(path, item); + } else { // unsafe enchants fallback + Map serialize = item.serialize(); + if (serialize.containsKey("type") && serialize.get("type") instanceof Material) + serialize.put("type", serialize.get("type").toString()); + section.createSection(path, serialize); + }; + } + public static ItemStack sectionGetItem(ConfigurationSection section, String path) { + if (section.isItemStack(path)) { + return section.getItemStack(path); + } else { + ConfigurationSection s = section.getConfigurationSection(path); + Map serialize = s.getValues(false); + serialize.remove("enchantments"); + ItemStack result = ItemStack.deserialize(serialize); + Map item = section.getConfigurationSection(path).getValues(false); + item.remove("enchantments"); + if (s.contains("enchantments")) { + for (Map.Entry entry : s.getConfigurationSection("enchantments").getValues(false).entrySet()) { + Enchantment enchantment = Enchantment.getByName(entry.getKey().toString()); + if ((enchantment != null) && (entry.getValue() instanceof Integer)) { + result.addUnsafeEnchantment(enchantment, (Integer) entry.getValue()); + } + } + } + return result; + } + } + public static Map storeInventory(PlayerInventory inv) { + Map map = new HashMap(); + for (int i = 0; i < inv.getSize(); i++) { + if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) { + map.put(i, inv.getItem(i)); + } + } + for (int i = 0; i < inv.getArmorContents().length; i++) { + map.put((i * -1) - 1, inv.getArmorContents()[i]); + } + return map; + } + public static void restoreInventory(PlayerInventory inv, Map map) { + for (int i = 0; i < inv.getSize(); i++) { + if (map.containsKey(i)) { + inv.setItem(i, map.get(i)); + } else { + inv.setItem(i, null); + } + } + for (int i = 0; i < inv.getArmorContents().length; i++) { + int _i = (i * -1) - 1; + if (map.containsKey(_i)) { + inv.getArmorContents()[i] = map.get(_i); + } else { + inv.getArmorContents()[i] = null; + } + } + } + } + + public static class Armor implements Storeable { + private PlayerInventory inv; + public Armor(PlayerInventory pi) { + inv = pi; + } + + @Override + public void store(ConfigurationSection section) { + if (inv.getHelmet() != null && inv.getHelmet().getTypeId() != 0) + Items.sectionSetItem(section, "helmet", inv.getHelmet()); + if (inv.getChestplate() != null && inv.getChestplate().getTypeId() != 0) + Items.sectionSetItem(section, "chestplate", inv.getChestplate()); + if (inv.getLeggings() != null && inv.getLeggings().getTypeId() != 0) + Items.sectionSetItem(section, "leggins", inv.getLeggings()); + if (inv.getBoots() != null && inv.getBoots().getTypeId() != 0) + Items.sectionSetItem(section, "boots", inv.getBoots()); + } + + @Override + public void restore(ConfigurationSection section) { + if (section.contains("helmet")) + inv.setHelmet(Items.sectionGetItem(section, "helmet")); + else + inv.setHelmet(null); + + if (section.contains("chestplate")) + inv.setChestplate(Items.sectionGetItem(section, "chestplate")); + else + inv.setChestplate(null); + + if (section.contains("leggins")) + inv.setLeggings(Items.sectionGetItem(section, "leggins")); + else + inv.setLeggings(null); + + if (section.contains("boots")) + inv.setBoots(Items.sectionGetItem(section, "boots")); + else + inv.setBoots(null); + } + + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/store/InvConfStorage.java b/src/de/jaschastarke/minecraft/limitedcreative/store/InvConfStorage.java new file mode 100644 index 0000000..fd0fc15 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/store/InvConfStorage.java @@ -0,0 +1,111 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative.store; + +import java.util.Map; + +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +import de.jaschastarke.minecraft.limitedcreative.Core; +import de.jaschastarke.minecraft.limitedcreative.Inventory; + +abstract public class InvConfStorage extends PlayerInventoryStorage { + private static final int ARMOR_SIZE = 4; + + public void store(Inventory pinv, ConfigurationSection sect) { + PlayerInventory inv = pinv.getPlayer().getInventory(); + sect.set("version", 2); + if (Core.plugin.config.getUnsafeStorage()) + sect.set("unsafe", true); + storeItems(sect.createSection("armor"), inv.getArmorContents()); + storeItems(sect.createSection("inv"), inv.getContents()); + } + + public void load(Inventory pinv, ConfigurationSection sect) { + PlayerInventory inv = pinv.getPlayer().getInventory(); + + if (!sect.contains("version")) { + Fallback.loadVersion1(inv, sect); + } else { + inv.setArmorContents(restoreItems(sect.getConfigurationSection("armor"), ARMOR_SIZE)); + inv.setContents(restoreItems(sect.getConfigurationSection("inv"), inv.getSize())); + } + } + + protected void storeItems(ConfigurationSection sect, ItemStack[] items) { + for (int i = 0; i < items.length; i++) { + ItemStack is = items[i]; + if (is != null && is.getType() != Material.AIR) { + sect.set(String.valueOf(i), serialize(is)); + } + } + } + protected ItemStack[] restoreItems(ConfigurationSection sect, int size) { + ItemStack[] items = new ItemStack[size]; + if (sect != null) { + for (int i = 0; i < size; i++) { + if (sect.contains(String.valueOf(i))) { + if (sect.isItemStack(String.valueOf(i))) { + items[i] = sect.getItemStack(String.valueOf(i)); + } else { + items[i] = deserializeItemStack(sect.get(String.valueOf(i))); + } + } else { + items[i] = null; + } + } + } + return items; + } + + protected Object serialize(ItemStack is) { + if (Core.plugin.config.getUnsafeStorage()) + return is.serialize(); + return is; + } + + @SuppressWarnings("unchecked") + protected ItemStack deserializeItemStack(Object is) { + if (is instanceof ConfigurationSection) { + ConfigurationSection sect = (ConfigurationSection) is; + Material type = Material.getMaterial(sect.getString("type")); + short damage = new Integer(sect.getInt("damage", 0)).shortValue(); + int amount = sect.getInt("amaount", 1); + + ItemStack result = new ItemStack(type, amount, damage); + if (sect.contains("enchantments")) { + for (Map.Entry entry : sect.getConfigurationSection("enchantments").getValues(false).entrySet()) { + Enchantment enchantment = Enchantment.getByName(entry.getKey().toString()); + if ((enchantment != null) && (entry.getValue() instanceof Integer)) { + result.addUnsafeEnchantment(enchantment, (Integer) entry.getValue()); + } + } + } + return result; + } else if (is instanceof Map) { + return ItemStack.deserialize((Map) is); + } else { + Core.plugin.warn("Failed to restore Item: "+is.toString()); + return null; + } + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/store/InvMemStorage.java b/src/de/jaschastarke/minecraft/limitedcreative/store/InvMemStorage.java new file mode 100644 index 0000000..b5f6443 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/store/InvMemStorage.java @@ -0,0 +1,47 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative.store; + +import org.bukkit.configuration.MemoryConfiguration; + +import de.jaschastarke.minecraft.limitedcreative.Inventory; +import de.jaschastarke.minecraft.limitedcreative.Inventory.Target; + +public class InvMemStorage extends InvConfStorage { + private MemoryConfiguration storage = new MemoryConfiguration(); + + @Override + public void store(Inventory pinv, Target target) { + store(pinv, storage.createSection(pinv.getPlayer().getName())); + } + + @Override + public void load(Inventory pinv, Target target) { + load(pinv, storage.getConfigurationSection(pinv.getPlayer().getName())); + } + + @Override + public void remove(Inventory pinv, Target target) { + storage.set(pinv.getPlayer().getName(), null); + } + + @Override + public boolean contains(Inventory pinv, Target target) { + return storage.contains(pinv.getPlayer().getName()); + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/store/InvYamlStorage.java b/src/de/jaschastarke/minecraft/limitedcreative/store/InvYamlStorage.java new file mode 100644 index 0000000..f211d22 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/store/InvYamlStorage.java @@ -0,0 +1,72 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative.store; + +import java.io.File; +import java.io.IOException; + +import org.bukkit.configuration.file.YamlConfiguration; + +import de.jaschastarke.minecraft.limitedcreative.Core; +import de.jaschastarke.minecraft.limitedcreative.Inventory; +import de.jaschastarke.minecraft.limitedcreative.Inventory.Target; + +public class InvYamlStorage extends InvConfStorage { + private static final String SUFFIX = ".yml"; + + private File dir; + public InvYamlStorage(File file) { + dir = file; + } + + @Override + public void load(Inventory pinv, Target target) { + load(pinv, YamlConfiguration.loadConfiguration(getFile(pinv, target))); + } + + @Override + public void store(Inventory pinv, Target target) { + YamlConfiguration yml = new YamlConfiguration(); + yml.options().header("DO NOT MODIFY THIS FILE"); + store(pinv, yml); + try { + yml.save(getFile(pinv, target)); + } catch (IOException e) { + Core.plugin.warn("Failed to save Inventory for Player " + pinv.getPlayer().getName()); + e.printStackTrace(); + } + } + + @Override + public void remove(Inventory pinv, Target target) { + getFile(pinv, target).delete(); + } + + @Override + public boolean contains(Inventory pinv, Target target) { + return getFile(pinv, target).exists(); + } + + protected File getFile(Inventory pinv, Target target) { + if (target != default_target) { + return new File(dir, pinv.getPlayer().getName() + "_" + target.toString().toLowerCase() + SUFFIX); + } else { + return new File(dir, pinv.getPlayer().getName() + SUFFIX); + } + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/store/PlayerInventoryStorage.java b/src/de/jaschastarke/minecraft/limitedcreative/store/PlayerInventoryStorage.java new file mode 100644 index 0000000..dfabc26 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/store/PlayerInventoryStorage.java @@ -0,0 +1,41 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative.store; + +import de.jaschastarke.minecraft.limitedcreative.Inventory; +import de.jaschastarke.minecraft.limitedcreative.Inventory.Target; + +public abstract class PlayerInventoryStorage { + protected Target default_target = Target.SURVIVAL; + final public void store(Inventory pinv) { + store(pinv, default_target); + } + final public void load(Inventory pinv) { + load(pinv, default_target); + } + final public void remove(Inventory pinv) { + remove(pinv, default_target); + } + final public boolean contains(Inventory pinv) { + return contains(pinv, default_target); + } + abstract public void store(Inventory pinv, Target target); + abstract public void load(Inventory pinv, Target target); + abstract public void remove(Inventory pinv, Target target); + abstract public boolean contains(Inventory pinv, Target target); +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/store/PlayerOptions.java b/src/de/jaschastarke/minecraft/limitedcreative/store/PlayerOptions.java new file mode 100644 index 0000000..0672236 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/store/PlayerOptions.java @@ -0,0 +1,79 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative.store; + +import java.io.File; +import java.io.IOException; + +import org.bukkit.GameMode; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + +import de.jaschastarke.minecraft.limitedcreative.Core; + +public class PlayerOptions { + private File _store_file = new File(Core.plugin.getDataFolder(), "players.yml"); + private YamlConfiguration store = YamlConfiguration.loadConfiguration(_store_file); + + { + store.options().header("DO NOT MODIFY THIS FILE"); + } + + public void setRegionGameMode(String player, GameMode gm) { + if (gm == null) + store.set(player + ".region_gamemode", null); + else + store.set(player + ".region_gamemode", gm.name()); + save(); + } + public GameMode getRegionGameMode(String player) { + if (store.contains(player + ".region_gamemode")) { + return GameMode.valueOf(store.getString(player + ".region_gamemode")); + } else if (store.contains(player + ".region_creative")) { // compatibility fallback + return store.getBoolean(player + ".region_creative") ? GameMode.CREATIVE : null; + } + return null; + } + + public GameMode getOptionalRegionGameMode(String player, String region) { + if (store.contains(player+".region")) { + ConfigurationSection sect = store.getConfigurationSection(player+".region"); + if (sect.contains(region)) { + return GameMode.valueOf(sect.getString(region)); + } + } + return null; + } + public void setOptionalRegionGameMode(String player, String region, GameMode gm) { + ConfigurationSection sect = store.contains(player+".region") ? store.getConfigurationSection(player+".region") : store.createSection(player+".region"); + String mode = gm == null ? null : gm.name(); + sect.set(region, mode); + if (sect.getKeys(true).size() == 0) + store.set(sect.getCurrentPath(), null); + save(); + } + + protected void save() { + try { + store.save(_store_file); + } catch (IOException e) { + Core.plugin.logger.severe("Failed to save players.yml"); + e.printStackTrace(); + } + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Storeable.java b/src/de/jaschastarke/minecraft/utils/IPermission.java similarity index 72% rename from src/de/jaschastarke/minecraft/limitedcreative/serialize/Storeable.java rename to src/de/jaschastarke/minecraft/utils/IPermission.java index 50ef3b0..b8ff0ba 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Storeable.java +++ b/src/de/jaschastarke/minecraft/utils/IPermission.java @@ -15,11 +15,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.jaschastarke.minecraft.limitedcreative.serialize; +package de.jaschastarke.minecraft.utils; -import org.bukkit.configuration.ConfigurationSection; +public interface IPermission { + public static final String SEP = "."; -public interface Storeable { - public void store(ConfigurationSection section); - public void restore(ConfigurationSection section); } diff --git a/src/de/jaschastarke/minecraft/utils/Locale.java b/src/de/jaschastarke/minecraft/utils/Locale.java index 19f1c8b..fd01b8b 100644 --- a/src/de/jaschastarke/minecraft/utils/Locale.java +++ b/src/de/jaschastarke/minecraft/utils/Locale.java @@ -24,7 +24,7 @@ import java.util.List; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin; -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; +import de.jaschastarke.minecraft.limitedcreative.Core; public class Locale { protected YamlConfiguration lang; @@ -46,7 +46,7 @@ public class Locale { String fn = getFilename(lang); - LimitedCreativeCore.debug("Using Locale: " + lang); + Core.debug("Using Locale: " + lang); File localefile = new File(plugin.getDataFolder(), fn); if (localefile.exists()) this.lang = YamlConfiguration.loadConfiguration(localefile); diff --git a/src/de/jaschastarke/minecraft/utils/Permissions.java b/src/de/jaschastarke/minecraft/utils/Permissions.java index 7855b0c..56bfc62 100644 --- a/src/de/jaschastarke/minecraft/utils/Permissions.java +++ b/src/de/jaschastarke/minecraft/utils/Permissions.java @@ -1,10 +1,27 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package de.jaschastarke.minecraft.utils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; +import de.jaschastarke.minecraft.limitedcreative.Core; import de.jaschastarke.minecraft.worldedit.PermissionsBridge; public class Permissions { @@ -31,6 +48,10 @@ public class Permissions { debug(player, permission, ret); return ret; } + + public boolean hasPermission(CommandSender player, IPermission permission) { + return hasPermission(player, permission.toString()); + } public boolean hasPermission(CommandSender sender, String permission) { if (sender instanceof Player) { @@ -42,7 +63,7 @@ public class Permissions { } private void debug(CommandSender player, String permission, boolean result) { - if (plugin instanceof LimitedCreativeCore && ((LimitedCreativeCore) plugin).config.getDebug()) - LimitedCreativeCore.debug("hasPermission: " + player.getName() + " - " + permission + " - " + result); + if (plugin instanceof Core && ((Core) plugin).config.getDebug()) + Core.debug("hasPermission: " + player.getName() + " - " + permission + " - " + result); } } diff --git a/src/de/jaschastarke/minecraft/worldedit/PermissionsBridge.java b/src/de/jaschastarke/minecraft/worldedit/PermissionsBridge.java index e7383c9..09215cb 100644 --- a/src/de/jaschastarke/minecraft/worldedit/PermissionsBridge.java +++ b/src/de/jaschastarke/minecraft/worldedit/PermissionsBridge.java @@ -1,3 +1,20 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package de.jaschastarke.minecraft.worldedit; import org.bukkit.OfflinePlayer; diff --git a/src/de/jaschastarke/minecraft/worldguard/API.java b/src/de/jaschastarke/minecraft/worldguard/API.java index d849589..5507d72 100644 --- a/src/de/jaschastarke/minecraft/worldguard/API.java +++ b/src/de/jaschastarke/minecraft/worldguard/API.java @@ -23,6 +23,7 @@ import org.bukkit.plugin.java.JavaPlugin; * This Namespace may be used as a Standalone-Plugin just providing the WorldGuard-API * TODO: Not done yet */ +@Deprecated // NOT READY YET public class API extends JavaPlugin { @Override public void onDisable() { diff --git a/src/de/jaschastarke/minecraft/worldguard/ApplicableRegions.java b/src/de/jaschastarke/minecraft/worldguard/ApplicableRegions.java index 564db0f..5785926 100644 --- a/src/de/jaschastarke/minecraft/worldguard/ApplicableRegions.java +++ b/src/de/jaschastarke/minecraft/worldguard/ApplicableRegions.java @@ -17,12 +17,13 @@ */ package de.jaschastarke.minecraft.worldguard; +import org.bukkit.entity.Player; + import com.sk89q.worldguard.protection.ApplicableRegionSet; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import de.jaschastarke.minecraft.limitedcreative.LCPlayer; import de.jaschastarke.minecraft.limitedcreative.regions.WorldGuardIntegration; public class ApplicableRegions { @@ -42,9 +43,9 @@ public class ApplicableRegions { return r; } - public boolean allows(StateFlag flag, LCPlayer player) { + public boolean allows(StateFlag flag, Player player) { extendRegionFlags(); - boolean r = regions.allows(flag, WorldGuardIntegration.wg.wrapPlayer(player.getRaw())); + boolean r = regions.allows(flag, WorldGuardIntegration.wg.wrapPlayer(player)); contractRegionFlags(); return r; } @@ -58,6 +59,13 @@ public class ApplicableRegions { pr.setFlag(flag, value); } } + if (mgr.getGlobalRegion() != null) { + for (FlagValue data : mgr.region(mgr.getGlobalRegion()).getFlags()) { + T flag = (T) data.getFlag(); + V value = (V) data.getValue(); + mgr.getGlobalRegion().setFlag(flag, value); + } + } } @SuppressWarnings("unchecked") private , V> void contractRegionFlags() { @@ -67,6 +75,12 @@ public class ApplicableRegions { pr.setFlag(flag, null); } } + if (mgr.getGlobalRegion() != null) { + for (FlagValue data : mgr.region(mgr.getGlobalRegion()).getFlags()) { + T flag = (T) data.getFlag(); + mgr.getGlobalRegion().setFlag(flag, null); + } + } } } diff --git a/src/de/jaschastarke/minecraft/worldguard/CCommand.java b/src/de/jaschastarke/minecraft/worldguard/CCommand.java index cf49d21..ff1837f 100644 --- a/src/de/jaschastarke/minecraft/worldguard/CCommand.java +++ b/src/de/jaschastarke/minecraft/worldguard/CCommand.java @@ -27,6 +27,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import com.sk89q.minecraft.util.commands.CommandException; +import com.sk89q.minecraft.util.commands.CommandPermissionsException; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; @@ -104,18 +106,36 @@ public class CCommand implements CommandExecutor { CRegion reg = rm.world(world).region(region); - switch (act) { - case INFO: - onInfo(sender, player, reg); - return true; - case FLAG: - onFlag(sender, player, reg, args); - return true; + try { + switch (act) { + case INFO: + onInfo(sender, player, reg); + return true; + case FLAG: + onFlag(sender, player, reg, args); + return true; + } + } catch (CommandException ex) { // worldedit command exception! + sender.sendMessage(ChatColor.DARK_RED + ex.getMessage()); + return true; } return false; } - private void onInfo(CommandSender sender, Player player, CRegion region) { + private void onInfo(CommandSender sender, Player player, CRegion region) throws CommandPermissionsException { + /* not optimal yet + if (player != null) { + if (region.getProtectedRegion().isOwner(wg.wrapPlayer(player))) { + hasPermission(sender, Perms.INFO_OWN); + } else if (region.getProtectedRegion().isMember(wg.wrapPlayer(player))) { + hasPermission(sender, Perms.INFO_MEMBER); + } else { + hasPermission(sender, Perms.INFO); + } + } else { + hasPermission(sender, Perms.INFO); + }*/ + String[] args = new String[]{"info", region.getWorld().getName(), region.getProtectedRegion().getId()}; wg.onCommand(sender, wg.getCommand("region"), "region", args); @@ -159,5 +179,10 @@ public class CCommand implements CommandExecutor { } sender.sendMessage(L("command.worldguard.flag_set", flag.getName())); } + + /*private boolean hasPermission(CommandSender sender, IPermission permission) throws CommandPermissionsException { + wg.checkPermission(sender, permission.toString()); + return true; + }*/ } diff --git a/src/de/jaschastarke/minecraft/worldguard/CListener.java b/src/de/jaschastarke/minecraft/worldguard/CListener.java index c13829d..9c6204a 100644 --- a/src/de/jaschastarke/minecraft/worldguard/CListener.java +++ b/src/de/jaschastarke/minecraft/worldguard/CListener.java @@ -19,6 +19,7 @@ package de.jaschastarke.minecraft.worldguard; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; @@ -33,34 +34,27 @@ public class CListener implements Listener { this.com = com; } - @EventHandler + @EventHandler(priority=EventPriority.HIGHEST) // run very late, because the event may be cancelled public void onPlayerMove(PlayerMoveEvent event) { if (event.isCancelled()) return; + //if (event.isCoarse()) { // next bukkit release will shortcut that if (event.getFrom().getBlockX() != event.getTo().getBlockX() || event.getFrom().getBlockY() != event.getTo().getBlockY() || event.getFrom().getBlockZ() != event.getTo().getBlockZ()) { // he really moved, and not just looked around if (com.getRegionManager().isDiffrentRegion(event.getPlayer(), event.getTo())) { - Bukkit.getServer().getPluginManager().callEvent(new PlayerChangedAreaEvent(event)); - CPlayer.get(event.getPlayer()).setHash(com.getRegionManager().getRegionsHash(event.getTo())); + String current_hash = CPlayer.get(event.getPlayer()).getHash(); + String new_hash = com.getRegionManager().getRegionsHash(event.getTo()); + Bukkit.getServer().getPluginManager().callEvent(new PlayerChangedAreaEvent(event, current_hash, new_hash)); + CPlayer.get(event.getPlayer()).setHash(new_hash); } } } - @EventHandler + @EventHandler(priority=EventPriority.HIGHEST) // run very late, because the event may be cancelled public void onPlayerTeleport(PlayerTeleportEvent event) { - if (event.isCancelled()) - return; - if (event.getFrom().getBlockX() != event.getTo().getBlockX() - || event.getFrom().getBlockY() != event.getTo().getBlockY() - || event.getFrom().getBlockZ() != event.getTo().getBlockZ()) { // he really moved, and not just looked around - - if (com.getRegionManager().isDiffrentRegion(event.getPlayer(), event.getTo())) { - Bukkit.getServer().getPluginManager().callEvent(new PlayerChangedAreaEvent(event)); - CPlayer.get(event.getPlayer()).setHash(com.getRegionManager().getRegionsHash(event.getTo())); - } - } + onPlayerMove(event); } @EventHandler diff --git a/src/de/jaschastarke/minecraft/worldguard/CRegionManager.java b/src/de/jaschastarke/minecraft/worldguard/CRegionManager.java index 80b2c96..568167d 100644 --- a/src/de/jaschastarke/minecraft/worldguard/CRegionManager.java +++ b/src/de/jaschastarke/minecraft/worldguard/CRegionManager.java @@ -82,6 +82,10 @@ public class CRegionManager { public World getWorld() { return world; } + public ProtectedRegion getGlobalRegion() { + return getWGManager(world).getRegion("__global__"); + } + @SuppressWarnings("unchecked") public void storeFlag(CRegion region, Flag flag, Object value) { if (wc == null) { @@ -136,10 +140,17 @@ public class CRegionManager { } public String getRegionsHash(Location loc) { + StringBuilder hash = new StringBuilder(loc.getWorld().getName()); List idlist = getWGGlobalManager().get(loc.getWorld()).getApplicableRegionsIDs(BukkitUtil.toVector(loc)); - String[] ids = idlist.toArray(new String[idlist.size()]); - Arrays.sort(ids); - return Util.join(ids, "|"); + if (idlist.size() > 0) { + hash.append("#"); + String[] ids = idlist.toArray(new String[idlist.size()]); + if (ids.length > 1) { + Arrays.sort(ids); + } + hash.append(Util.join(ids, ",")); + } + return hash.toString(); } public ApplicableRegions getRegionSet(Location loc) { diff --git a/src/de/jaschastarke/minecraft/worldguard/Perms.java b/src/de/jaschastarke/minecraft/worldguard/Perms.java new file mode 100644 index 0000000..b94acc7 --- /dev/null +++ b/src/de/jaschastarke/minecraft/worldguard/Perms.java @@ -0,0 +1,38 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.worldguard; + +import de.jaschastarke.minecraft.utils.IPermission; + +@Deprecated // NOT USED YET +public enum Perms implements IPermission { + INFO("info"), + INFO_OWN("info.own"), + INFO_MEMBER("info.member"); + + private static final String NS = "worldguard.region"; + + private String perm; + private Perms(String permission) { + perm = permission; + } + @Override + public String toString() { + return NS + SEP + perm; + } +} diff --git a/src/de/jaschastarke/minecraft/worldguard/events/PlayerChangedAreaEvent.java b/src/de/jaschastarke/minecraft/worldguard/events/PlayerChangedAreaEvent.java index 69e68f0..7f602a9 100644 --- a/src/de/jaschastarke/minecraft/worldguard/events/PlayerChangedAreaEvent.java +++ b/src/de/jaschastarke/minecraft/worldguard/events/PlayerChangedAreaEvent.java @@ -23,17 +23,23 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerTeleportEvent; -import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; import de.jaschastarke.minecraft.worldguard.ApplicableRegions; import de.jaschastarke.minecraft.worldguard.Interface; @SuppressWarnings("serial") public class PlayerChangedAreaEvent extends Event { private PlayerMoveEvent event; + private String _previous_hash; + private String _new_hash; public PlayerChangedAreaEvent(PlayerMoveEvent moveevent) { event = moveevent; } + public PlayerChangedAreaEvent(PlayerMoveEvent moveevent, String previous_hash, String new_hash) { + event = moveevent; + _previous_hash = previous_hash; + _new_hash = new_hash; + } public Player getPlayer() { return event.getPlayer(); @@ -50,19 +56,32 @@ public class PlayerChangedAreaEvent extends Event { return Interface.getInstance().getRegionManager().getRegionSet(event.getTo()); } - private static final HandlerList handlers = new HandlerList(); - - public HandlerList getHandlers() { - LimitedCreativeCore.debug("getHandlers"); - return handlers; + public String getPreviousRegionHash() { + if (_previous_hash == null) + _previous_hash = Interface.getInstance().getRegionManager().getRegionsHash(event.getFrom()); + return _previous_hash; } - - public static HandlerList getHandlerList() { - LimitedCreativeCore.debug("getHandlerList"); - return handlers; + public String getNewRegionHash() { + if (_new_hash == null) + _new_hash = Interface.getInstance().getRegionManager().getRegionsHash(event.getTo()); + return _new_hash; } public PlayerMoveEvent getMoveEvent() { return event; } + + public String toString() { + return getClass().getSimpleName()+"["+getPreviousRegionHash()+" -> "+getNewRegionHash()+"]"; + } + + private static final HandlerList handlers = new HandlerList(); + + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } }