diff --git a/lang/messages.properties b/lang/messages.properties index c6e6c09..4d8cfd4 100644 --- a/lang/messages.properties +++ b/lang/messages.properties @@ -4,11 +4,13 @@ basic.loaded.module: Module loaded. basic.feature.store: separated inventories basic.feature.limit: creative restrictions basic.feature.region: creative regions +basic.feature.gamemodecommands: GameMode Commands basic.conflict: Due to conflict with the plugin {0}, the feature {1} is disabled basic.warning.worldguard_not_found: WorldGuard isn't found, the feature {0} is disabled # double single-quote '' because of MessageFormater to insert {0} command.player: player +command.general: LimitedCreative: GameMode-Switch, Creative-Regions, Config and more command.switch.survival: Changes the game mode of a player to survival command.switch.creative: Changes the game mode of a player to creative command.switch.adventure: Changes the game mode of a player to adventure diff --git a/pom.xml b/pom.xml index d43cf78..352151e 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ ${project.artifactId} - + lang/ ${basedir}/lang/ - + @@ -157,14 +157,22 @@ WorldGuard WorldEdit MultiInv + xAuth + AuthMe + MultiInv + Multiverse-Inventories http://dev.bukkit.org/server-mods/limited-creative/ - de.jaschastarke.minecraft.limitedcreative.Permissions + de.jaschastarke.minecraft.limitedcreative.Permissions:CONTAINER de.jaschastarke.minecraft.limitedcreative.inventories.InventoryPermissions + de.jaschastarke.minecraft.limitedcreative.SwitchGameModePermissions:ALL + + de.jaschastarke.minecraft.limitedcreative.MainCommand + diff --git a/src/de/jaschastarke/minecraft/limitedcreative/FeatureSwitchGameMode.java b/src/de/jaschastarke/minecraft/limitedcreative/FeatureSwitchGameMode.java new file mode 100644 index 0000000..733d68d --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/FeatureSwitchGameMode.java @@ -0,0 +1,113 @@ +package de.jaschastarke.minecraft.limitedcreative; + +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; + +import de.jaschastarke.IHasName; +import de.jaschastarke.bukkit.lib.CoreModule; +import de.jaschastarke.bukkit.lib.commands.AbstractCommandList; +import de.jaschastarke.bukkit.lib.commands.CommandContext; +import de.jaschastarke.bukkit.lib.commands.CommandException; +import de.jaschastarke.bukkit.lib.commands.ICommand; +import de.jaschastarke.bukkit.lib.commands.MethodCommand; +import de.jaschastarke.bukkit.lib.commands.IMethodCommandContainer; +import de.jaschastarke.bukkit.lib.commands.MissingPermissionCommandException; +import de.jaschastarke.bukkit.lib.commands.NeedsPlayerCommandException; +import de.jaschastarke.bukkit.lib.commands.annotations.Alias; +import de.jaschastarke.bukkit.lib.commands.annotations.Description; +import de.jaschastarke.bukkit.lib.commands.annotations.IsCommand; +import de.jaschastarke.bukkit.lib.commands.annotations.NeedsPermission; +import de.jaschastarke.bukkit.lib.commands.annotations.Usage; +import de.jaschastarke.minecraft.lib.permissions.IAbstractPermission; +import de.jaschastarke.minecraft.lib.permissions.IPermission; + +public class FeatureSwitchGameMode extends CoreModule { + public FeatureSwitchGameMode(LimitedCreative plugin) { + super(plugin); + } + protected Commands commands = null; + + @Override + public String getName() { + return "SwitchGameMode"; + } + + @Override + public void OnEnable() { + if (commands == null) + commands = new Commands(); + plugin.getMainCommand().getHandler().registerCommands(commands.getCommandList()); + } + + @Override + public void OnDisable() { + if (commands != null) + plugin.getMainCommand().getHandler().removeCommands(commands.getCommandList()); + } + + public class Commands extends AbstractCommandList implements IMethodCommandContainer, IHasName { + private List commands = MethodCommand.getMethodCommandsFor(this); + public List getCommandList() { + return commands; + } + + @Override + public String getName() { + return plugin.getName() + " - " + plugin.getLang().trans("basic.feature.gamemodecommands"); + } + @Override + public IPermission getPermission(String subPerm) { + return SwitchGameModePermissions.ALL.getPermission(subPerm); + } + + protected boolean changeGameMode(CommandContext context, String player, GameMode tgm, IAbstractPermission permission) throws MissingPermissionCommandException, CommandException { + Player target = null; + if (player != null && !player.isEmpty()) + target = Bukkit.getPlayer(player); + else if (context.isPlayer()) + target = context.getPlayer(); + + if (target == null) + throw new NeedsPlayerCommandException(); + + if (!target.equals(context.getSender()) && !context.checkPermission(SwitchGameModePermissions.OTHER)) + throw new MissingPermissionCommandException(SwitchGameModePermissions.OTHER); + + GameMode wgm = Hooks.DefaultWorldGameMode.get(target.getWorld()); + + if (context.checkPermission(permission) || (wgm == tgm && context.checkPermission(SwitchGameModePermissions.BACKONLY))) + throw new MissingPermissionCommandException(permission); + + target.setGameMode(tgm); + return true; + } + + @IsCommand("survival") + @Alias("s") + @Description(value = "command.switch.survival", translate = true) + @NeedsPermission(value={"survival", "backonly"}, optional = true) + @Usage("[player]") + public boolean survival(CommandContext context, String player) throws MissingPermissionCommandException, CommandException { + return changeGameMode(context, player, GameMode.SURVIVAL, SwitchGameModePermissions.SURVIVAL); + } + @IsCommand("creative") + @Alias("c") + @Description(value = "command.switch.creative", translate = true) + @NeedsPermission(value={"creative", "backonly"}, optional = true) + @Usage("[player]") + public boolean creative(CommandContext context, String player) throws MissingPermissionCommandException, CommandException { + return changeGameMode(context, player, GameMode.CREATIVE, SwitchGameModePermissions.CREATIVE); + } + @IsCommand("adventure") + @Alias("a") + @Description(value = "command.switch.adventure", translate = true) + @NeedsPermission(value={"adventure", "backonly"}, optional = true) + @Usage("[player]") + public boolean adventure(CommandContext context, String player) throws MissingPermissionCommandException, CommandException { + return changeGameMode(context, player, GameMode.ADVENTURE, SwitchGameModePermissions.ADVENTURE); + } + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java b/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java index 6138270..c6b7c39 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java @@ -5,8 +5,8 @@ import de.jaschastarke.bukkit.lib.Core; import de.jaschastarke.bukkit.lib.PluginLang; public class LimitedCreative extends Core { - private i18n lang; protected Config config = null; + protected MainCommand command = null; @Override public void OnInitialize() { @@ -14,16 +14,20 @@ public class LimitedCreative extends Core { config = new Config(this); this.debug = config.getDebug(); - lang = new PluginLang("lang/messages", this); + setLang(new PluginLang("lang/messages", this)); + + command = new MainCommand(this); + commands.registerCommand(command); Hooks.inizializeHooks(this); + addModule(new FeatureSwitchGameMode(this)); addModule(new ModInventories(this)); addModule(new ModCreativeLimits(this)); addModule(new ModRegions(this)); addModule(new ModCmdBlocker(this)); - config.save(); + config.saveDefault(); } public Config getPluginConfig() { @@ -32,9 +36,13 @@ public class LimitedCreative extends Core { @Deprecated public String L(String msg, Object... objects) { - return lang.trans(msg, objects); + return getLang().trans(msg, objects); } public i18n getLocale() { - return lang; + return getLang(); + } + + public MainCommand getMainCommand() { + return command; } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/MainCommand.java b/src/de/jaschastarke/minecraft/limitedcreative/MainCommand.java new file mode 100644 index 0000000..0bd6b08 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/MainCommand.java @@ -0,0 +1,54 @@ +package de.jaschastarke.minecraft.limitedcreative; + +import de.jaschastarke.LocaleString; +import de.jaschastarke.bukkit.lib.commands.BukkitCommand; +import de.jaschastarke.bukkit.lib.commands.IHelpDescribed; +import de.jaschastarke.maven.ArchiveDocComments; +import de.jaschastarke.minecraft.lib.permissions.IAbstractPermission; + +/** + * LimitedCreative: GameMode-Switch, Creative-Regions, Config and more + * @usage / - displays LimitedCreative-Help + * @permission limitedcreative.command + */ +@ArchiveDocComments +public class MainCommand extends BukkitCommand implements IHelpDescribed { + private LimitedCreative plugin; + + public MainCommand() { + } + public MainCommand(LimitedCreative plugin) { + this.plugin = plugin; + } + + @Override + public String getName() { + return "limitedcreative"; + } + + @Override + public String[] getAliases() { + return new String[]{"lc"}; + } + + /** + * @internal has no effect, as not tested by any command handler + * @see IHelpDescribed + */ + @Override + public IAbstractPermission[] getRequiredPermissions() { + return new IAbstractPermission[]{Permissions.COMMAND}; + } + @Override + public String getUsage() { + return ""; + } + @Override + public CharSequence getDescription() { + return new LocaleString("command.general"); + } + @Override + public String getPackageName() { + return plugin.getName(); + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/ModInventories.java b/src/de/jaschastarke/minecraft/limitedcreative/ModInventories.java index 4e6c60a..5e73ca1 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/ModInventories.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/ModInventories.java @@ -7,10 +7,8 @@ import java.util.WeakHashMap; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.material.MaterialData; import de.jaschastarke.bukkit.lib.CoreModule; -import de.jaschastarke.bukkit.lib.permissions.PermissionManager; import de.jaschastarke.minecraft.limitedcreative.inventories.ArmoryConfig; import de.jaschastarke.minecraft.limitedcreative.inventories.Inventory; import de.jaschastarke.minecraft.limitedcreative.inventories.InventoryConfig; @@ -73,7 +71,7 @@ public class ModInventories extends CoreModule { } public void onSetGameMode(Player player, GameMode gm) { - if (PermissionManager.hasPermission(player, InventoryPermissions.KEEP_INVENTORY)) + if (plugin.getPermManager().hasPermission(player, InventoryPermissions.KEEP_INVENTORY)) return; player.closeInventory(); @@ -107,17 +105,17 @@ public class ModInventories extends CoreModule { } public void setCreativeArmor(Player player) { - Map armor = armor_config.getCreativeArmor(); + Map armor = armor_config.getCreativeArmor(); if (armor != null) { ItemStack[] is = new ItemStack[4]; if (armor.containsKey("feet")) - is[0] = armor.get("feet").toItemStack(1); + is[0] = armor.get("feet"); if (armor.containsKey("legs")) - is[1] = armor.get("legs").toItemStack(1); + is[1] = armor.get("legs"); if (armor.containsKey("chest")) - is[2] = armor.get("chest").toItemStack(1); + is[2] = armor.get("chest"); if (armor.containsKey("head")) - is[3] = armor.get("head").toItemStack(1); + is[3] = armor.get("head"); player.getInventory().setArmorContents(is); } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Permissions.java b/src/de/jaschastarke/minecraft/limitedcreative/Permissions.java index 0133a49..2d259fb 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/Permissions.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Permissions.java @@ -19,26 +19,26 @@ package de.jaschastarke.minecraft.limitedcreative; import org.bukkit.permissions.PermissionDefault; -import de.jaschastarke.Singleton; import de.jaschastarke.maven.ArchiveDocComments; import de.jaschastarke.minecraft.lib.permissions.BasicPermission; import de.jaschastarke.minecraft.lib.permissions.IPermission; -import de.jaschastarke.minecraft.lib.permissions.SimplePermissionContainer; +import de.jaschastarke.minecraft.lib.permissions.SimplePermissionContainerNode; @ArchiveDocComments -public class Permissions extends SimplePermissionContainer implements Singleton { - private static Permissions instance = new Permissions(); - public static Permissions getInstance() { - return instance; +public class Permissions extends SimplePermissionContainerNode { + protected Permissions(String name) { + super(name); } + + public final static Permissions CONTAINER = new Permissions("limitedcreative"); /** * Allows changing plugin configuration ingame via commands */ - public static final IPermission CONFIG = new BasicPermission(instance, "config", PermissionDefault.OP); - - @Override - public String getFullString() { - return "limitedcreative"; - } + public static final IPermission CONFIG = new BasicPermission(CONTAINER, "config", PermissionDefault.OP); + /** + * Gives player access to the general /limitedcreative command. This permission doesn't affect the usability, but + * allows to hide the command from /help for users. + */ + public static final IPermission COMMAND = new BasicPermission(CONTAINER, "command", PermissionDefault.OP); } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/SwitchGameModePermissions.java b/src/de/jaschastarke/minecraft/limitedcreative/SwitchGameModePermissions.java new file mode 100644 index 0000000..935c157 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/SwitchGameModePermissions.java @@ -0,0 +1,52 @@ +package de.jaschastarke.minecraft.limitedcreative; + +import org.bukkit.permissions.PermissionDefault; + +import de.jaschastarke.maven.ArchiveDocComments; +import de.jaschastarke.minecraft.lib.permissions.BasicPermission; +import de.jaschastarke.minecraft.lib.permissions.IAbstractPermission; +import de.jaschastarke.minecraft.lib.permissions.IsChildPermission; +import de.jaschastarke.minecraft.lib.permissions.ParentPermissionContainerNode; + +@ArchiveDocComments +public class SwitchGameModePermissions extends ParentPermissionContainerNode { + /** + * Allows switching of own game mode to creative/adventure and back + */ + public final static SwitchGameModePermissions ALL = new SwitchGameModePermissions(Permissions.CONTAINER, "switch_gamemode"); + + protected SwitchGameModePermissions(IAbstractPermission parent, String name) { + super(parent, name); + } + + @Override + public PermissionDefault getDefault() { + return PermissionDefault.OP; + } + + /** + * Allows switching of own game mode to default of the not world he is in, but not to an other + */ + public final static BasicPermission BACKONLY = new BasicPermission(ALL, "backonly", PermissionDefault.FALSE); + + /** + * Allows switching of own game mode to survival, but not to creative/adventure + */ + @IsChildPermission + public final static BasicPermission SURVIVAL = new BasicPermission(ALL, "survival", PermissionDefault.FALSE); + /** + * Allows switching of own game mode to creative, but not to survival/adventure + */ + @IsChildPermission + public final static BasicPermission CREATIVE = new BasicPermission(ALL, "creative", PermissionDefault.FALSE); + /** + * Allows switching of own game mode to adventure, but not to creative/survival + */ + @IsChildPermission + public final static BasicPermission ADVENTURE = new BasicPermission(ALL, "adventure", PermissionDefault.FALSE); + + /** + * Allows switching of other users game mode + */ + public final static BasicPermission OTHER = new BasicPermission(ALL, "other", PermissionDefault.OP); +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/hooks/MultiVerseHooks.java b/src/de/jaschastarke/minecraft/limitedcreative/hooks/MultiVerseHooks.java index 20e903e..40ef5a2 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/hooks/MultiVerseHooks.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/hooks/MultiVerseHooks.java @@ -21,7 +21,7 @@ public class MultiVerseHooks { }); Hooks.DefaultWorldGameMode.register(new WorldTypeHooker.Check() { @Override - public GameMode test(World world) { + public GameMode get(World world) { MultiverseWorld mvWorld = getMV().getMVWorldManager().getMVWorld(world); if (mvWorld == null) return null; diff --git a/src/de/jaschastarke/minecraft/limitedcreative/hooks/WorldTypeHooker.java b/src/de/jaschastarke/minecraft/limitedcreative/hooks/WorldTypeHooker.java index de041ed..62d64ca 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/hooks/WorldTypeHooker.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/hooks/WorldTypeHooker.java @@ -8,12 +8,12 @@ import de.jaschastarke.hooking.AbstractHooker; public class WorldTypeHooker extends AbstractHooker { public interface Check { - GameMode test(World world); + GameMode get(World world); } - public GameMode test(World world) { + public GameMode get(World world) { for (Check c : hooks) { - return c.test(world); + return c.get(world); } return Bukkit.getServer().getDefaultGameMode(); } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java b/src/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java index c8ec904..6e8ce8c 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/inventories/ArmoryConfig.java @@ -5,12 +5,13 @@ import java.util.Map; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import de.jaschastarke.bukkit.lib.ModuleLogger; import de.jaschastarke.bukkit.lib.configuration.Configuration; import de.jaschastarke.bukkit.lib.items.MaterialDataNotRecognizedException; -import de.jaschastarke.bukkit.lib.items.MaterilNotRecognizedException; +import de.jaschastarke.bukkit.lib.items.MaterialNotRecognizedException; import de.jaschastarke.bukkit.lib.items.Utils; import de.jaschastarke.configuration.IConfigurationSubGroup; import de.jaschastarke.configuration.annotations.IsConfigurationNode; @@ -59,22 +60,26 @@ public class ArmoryConfig extends Configuration implements IConfigurationSubGrou public boolean getEnabled() { return config.getBoolean("enabled", true); } - public Map getCreativeArmor() { + public Map getCreativeArmor() { if (getEnabled()) { - Map armor = new HashMap(); + Map armor = new HashMap(); for (Map.Entry entry : config.getValues(false).entrySet()) { if (!entry.getKey().equals("enabled")) { - MaterialData md = null; - try { - md = Utils.parseMaterial((String) entry.getValue()); - } catch (MaterilNotRecognizedException e) { - getLog().warn(L("exception.config.material_not_found", entry.getValue())); - } catch (MaterialDataNotRecognizedException e) { - getLog().warn(L("exception.config.materiak_data_not_found", entry.getValue())); + if (entry instanceof ItemStack) { + armor.put(entry.getKey(), (ItemStack) entry); + } else { + MaterialData md = null; + try { + md = Utils.parseMaterial((String) entry.getValue()); + } catch (MaterialNotRecognizedException e) { + getLog().warn(L("exception.config.material_not_found", entry.getValue())); + } catch (MaterialDataNotRecognizedException e) { + getLog().warn(L("exception.config.materiak_data_not_found", entry.getValue())); + } + + if (md != null) + armor.put(entry.getKey(), md.toItemStack()); } - - if (md != null) - armor.put(entry.getKey(), md); } } return armor.size() > 0 ? armor : null; @@ -90,20 +95,20 @@ public class ArmoryConfig extends Configuration implements IConfigurationSubGrou * *see Blacklist for details on Item-Types */ @IsConfigurationNode(order = 500) - public String getHead() { - return config.getString("head", "CHAINMAIL_HELMET"); + public Object getHead() { + return config.get("head", "CHAINMAIL_HELMET"); } @IsConfigurationNode(order = 501) - public String getChest() { - return config.getString("chest", "CHAINMAIL_CHESTPLATE"); + public Object getChest() { + return config.get("chest", "CHAINMAIL_CHESTPLATE"); } @IsConfigurationNode(order = 502) - public String getLegs() { - return config.getString("legs", "CHAINMAIL_LEGGINGS"); + public Object getLegs() { + return config.get("legs", "CHAINMAIL_LEGGINGS"); } @IsConfigurationNode(order = 503) - public String getFeet() { - return config.getString("feet", "CHAINMAIL_BOOTS"); + public Object getFeet() { + return config.get("feet", "CHAINMAIL_BOOTS"); } @Deprecated diff --git a/src/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryPermissions.java b/src/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryPermissions.java index 358ba33..b889a8b 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryPermissions.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/inventories/InventoryPermissions.java @@ -25,11 +25,16 @@ import de.jaschastarke.minecraft.lib.permissions.IPermission; import de.jaschastarke.minecraft.lib.permissions.SimplePermissionContainer; import de.jaschastarke.minecraft.limitedcreative.Permissions; +/** + * + * @internal Doesn't represent a node, is only a list of additional permissions with an other parent. + * + */ @ArchiveDocComments public class InventoryPermissions extends SimplePermissionContainer { /** * Allows bypassing the inventory separation */ - public static final IPermission KEEP_INVENTORY = new BasicPermission(Permissions.getInstance(), "keepinventory", PermissionDefault.FALSE); + public static final IPermission KEEP_INVENTORY = new BasicPermission(Permissions.CONTAINER, "keepinventory", PermissionDefault.FALSE); }