diff --git a/lang/default.yml b/lang/default.yml index 1284ad9..e5b0b8a 100644 --- a/lang/default.yml +++ b/lang/default.yml @@ -31,4 +31,5 @@ exception: blocked: chest: Access to chests is not allowed in creative mode sign: To interact with signs is not allowed in creative mode - survival_flying: You should stay on ground, when leaving a creative-area \ No newline at end of file + survival_flying: You should stay on ground, when leaving a creative-area + outside_creative: You can not place blocks outside of the creative-area \ No newline at end of file diff --git a/plugin.yml b/plugin.yml index d0b8afd..7858f9a 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: LimitedCreative main: de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore -version: 0.5-alpha +version: 0.5.1-alpha softdepend: [WorldGuard] commands: limitedcreative: diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Commands.java b/src/de/jaschastarke/minecraft/limitedcreative/Commands.java index 1568b39..abd5d86 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/Commands.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Commands.java @@ -25,6 +25,8 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; + +import de.jaschastarke.minecraft.worldguard.CCommand; import static de.jaschastarke.minecraft.utils.Locale.L; public class Commands { @@ -190,7 +192,7 @@ public class Commands { plugin = pplugin; plugin.getCommand("limitedcreative").setExecutor(new MainCommandExecutor()); if (plugin.worldguard != null) { - plugin.getCommand("/region").setExecutor(plugin.worldguard.new WGICommandExecutor()); // very odd syntax, but i liiiikey internal classes :D + plugin.getCommand("/region").setExecutor(new CCommand(plugin, plugin.worldguard.getRegionManager())); } else { plugin.getCommand("/region").setExecutor(new NotAvailableCommandExecutor()); } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java b/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java index 37f42c7..5eba551 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java @@ -57,7 +57,7 @@ public class LCPlayer { private LCPlayer(Player pplayer) { player = pplayer; - _isRegionCreative = store.getBoolean(player.getName()+".region_creative", false); + _isRegionCreative = store.getBoolean(player.getName()+".region_creative", false) && player.getGameMode() == GameMode.CREATIVE; if (player.getGameMode() == GameMode.CREATIVE && !this.getRegionCreative()) isPermanentCreative = true; } @@ -197,6 +197,8 @@ public class LCPlayer { event.getPlayer().sendMessage(L("blocked.sign")); event.setCancelled(true); } + + private long lastFloatingTimeWarning = 0; public void setRegionCreativeAllowed(boolean rcreative, PlayerMoveEvent event) { if (rcreative && player.getGameMode() == GameMode.SURVIVAL) { @@ -204,7 +206,10 @@ public class LCPlayer { player.setGameMode(GameMode.CREATIVE); } else if (!rcreative && player.getGameMode() == GameMode.CREATIVE && !isPermanentCreative) { if (getFloatingHeight() > 3) { - player.sendMessage(L("blocked.survival_flying")); + if (System.currentTimeMillis() - lastFloatingTimeWarning > 10000) {// 10 sec. limit + player.sendMessage(L("blocked.survival_flying")); + lastFloatingTimeWarning = System.currentTimeMillis(); + } event.setTo(event.getFrom()); } else { player.setGameMode(GameMode.SURVIVAL); // also unsets isRegionCreative; diff --git a/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreativeCore.java b/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreativeCore.java index 57292f3..92404d4 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreativeCore.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/LimitedCreativeCore.java @@ -22,6 +22,7 @@ import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; import static de.jaschastarke.minecraft.utils.Locale.L; +import de.jaschastarke.minecraft.limitedcreative.regions.WorldGuardIntegration; import de.jaschastarke.minecraft.utils.Locale; @@ -30,6 +31,7 @@ public class LimitedCreativeCore extends JavaPlugin { public Configuration config; public WorldGuardIntegration worldguard; public static LimitedCreativeCore plugin; + public NoBlockItemSpawn spawnblock; public static boolean serializeFallBack = false; @@ -50,6 +52,8 @@ public class LimitedCreativeCore extends JavaPlugin { } new Locale(this); + + spawnblock = new NoBlockItemSpawn(); Listener.register(this); diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Listener.java b/src/de/jaschastarke/minecraft/limitedcreative/Listener.java index 02c7ab2..785d2d2 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/Listener.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Listener.java @@ -18,19 +18,25 @@ package de.jaschastarke.minecraft.limitedcreative; import org.bukkit.GameMode; +import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.block.ContainerBlock; import org.bukkit.block.Sign; import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.entity.StorageMinecart; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockListener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityListener; +import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; @@ -128,20 +134,93 @@ public final class Listener { LCPlayer.get(player).onDie(event); } } + + @Override + public void onItemSpawn(ItemSpawnEvent event) { + if (event.getEntity() instanceof Item) { + if (plugin.spawnblock.isBlocked(event.getLocation().getBlock().getLocation(), ((Item) event.getEntity()).getItemStack().getType())) { + event.setCancelled(true); + } + } + } private void register() { if (plugin.config.getLimitEnabled()) { + plugin.getServer().getPluginManager().registerEvent(Event.Type.ITEM_SPAWN, this, Priority.Normal, plugin); pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.Normal, plugin); pm.registerEvent(Event.Type.ENTITY_DEATH, this, Priority.Low, plugin); } } } + public static class BlockListen extends BlockListener { + @Override + public void onBlockBreak(BlockBreakEvent event) { + if (event.isCancelled()) + return; + if (event.getPlayer().getGameMode() == GameMode.CREATIVE) { + // Prevent dropping of doors and beds when destroying the wrong part + if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.drop")) + return; + Block block = event.getBlock(); + Material mat = block.getType(); + switch (event.getBlock().getType()) { + case WOODEN_DOOR: + mat = Material.WOOD_DOOR; + plugin.spawnblock.block(block.getRelative(BlockFace.DOWN).getLocation(), mat); + break; + case IRON_DOOR_BLOCK: + mat = Material.IRON_DOOR; + plugin.spawnblock.block(block.getRelative(BlockFace.DOWN).getLocation(), mat); + break; + case BED_BLOCK: + mat = Material.BED; + plugin.spawnblock.block(block.getRelative(BlockFace.NORTH).getLocation(), mat); + plugin.spawnblock.block(block.getRelative(BlockFace.EAST).getLocation(), mat); + plugin.spawnblock.block(block.getRelative(BlockFace.SOUTH).getLocation(), mat); + plugin.spawnblock.block(block.getRelative(BlockFace.WEST).getLocation(), mat); + break; + default: + plugin.spawnblock.block(event.getBlock().getLocation(), mat); + } + } + } + private void register() { + if (plugin.config.getLimitEnabled()) { + pm.registerEvent(Event.Type.BLOCK_BREAK, this, Priority.Normal, plugin); + } + } + } + /* + public static class VehicleListen extends VehicleListener { + @Override + 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 static void register(LimitedCreativeCore pplugin) { plugin = pplugin; pm = plugin.getServer().getPluginManager(); new PlayerListen().register(); new EntityListen().register(); + new BlockListen().register(); + //new VehicleListen().register(); } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/NoBlockItemSpawn.java b/src/de/jaschastarke/minecraft/limitedcreative/NoBlockItemSpawn.java new file mode 100644 index 0000000..29ab766 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/NoBlockItemSpawn.java @@ -0,0 +1,87 @@ +/* + * 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.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; + + +public class NoBlockItemSpawn { + public final static long TIME_OFFSET = 1000; + + private List list = new ArrayList(); + + public boolean isBlocked(Location l, Material type) { + cleanup(); + for (BlockItemDrop block : list) { + if (block.getLocation().equals(l) && block.getType().equals(type)) + return true; + } + return false; + } + private void cleanup() { + Iterator i = list.iterator(); + while (i.hasNext()) { + BlockItemDrop block = i.next(); + if (block.getTimestamp() < System.currentTimeMillis() - TIME_OFFSET) + i.remove(); + } + } + + private class BlockItemDrop { + public BlockItemDrop(Location l, Material type) { + this.l = l; + this.type = type; + this.timestamp = System.currentTimeMillis(); + } + private Location l; + private Material type; + private long timestamp; + public Location getLocation() { + return l; + } + public Material getType() { + return type; + } + public long getTimestamp() { + return timestamp; + } + } + + public void block(Block block, LCPlayer player) { + Material mat = block.getType(); + if (player == null || !player.getRaw().getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) { // different drop type prevention + net.minecraft.server.Block type = net.minecraft.server.Block.byId[mat.getId()]; + mat = Material.getMaterial(type.getDropType(block.getData(), null, 0)); + } + block(block.getLocation(), mat); + } + + public void block(Block block) { + block(block, null); + } + public void block(Location l, Material type) { + list.add(new BlockItemDrop(l, type)); + } +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/WorldGuardIntegration.java b/src/de/jaschastarke/minecraft/limitedcreative/WorldGuardIntegration.java deleted file mode 100644 index a6a27a7..0000000 --- a/src/de/jaschastarke/minecraft/limitedcreative/WorldGuardIntegration.java +++ /dev/null @@ -1,216 +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; - -import java.io.File; - -import org.bukkit.ChatColor; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.Event.Priority; -import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerMoveEvent; - -import static de.jaschastarke.minecraft.utils.Locale.L; - -import com.sk89q.worldedit.Vector; -import com.sk89q.worldguard.bukkit.WorldGuardPlugin; -import com.sk89q.worldguard.protection.flags.Flag; -import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; -import com.sk89q.worldguard.protection.flags.RegionGroupFlag; -import com.sk89q.worldguard.protection.flags.StateFlag; -import com.sk89q.worldguard.protection.managers.RegionManager; -import com.sk89q.worldguard.protection.regions.GlobalProtectedRegion; -import com.sk89q.worldguard.protection.regions.ProtectedRegion; - -import de.jaschastarke.minecraft.regions.ApplicableRegions; -import de.jaschastarke.minecraft.regions.CRegion; -import de.jaschastarke.minecraft.regions.CRegionManager; -import de.jaschastarke.minecraft.regions.FlagList; -import de.jaschastarke.minecraft.regions.FlagValue; -import de.jaschastarke.minecraft.utils.Util; - -public class WorldGuardIntegration { - public static LimitedCreativeCore plugin; - public static WorldGuardPlugin wg; - private CRegionManager rm; - - public WorldGuardIntegration(LimitedCreativeCore pplugin) { - plugin = pplugin; - wg = (WorldGuardPlugin) plugin.getServer().getPluginManager().getPlugin("WorldGuard"); - } - - public static boolean available() { - return LimitedCreativeCore.plugin.getServer().getPluginManager().getPlugin("WorldGuard") != null; - } - - - public static final StateFlag CREATIVE = new StateFlag("creative", false); - public static final RegionGroupFlag CREATIVE_GROUP = new RegionGroupFlag("creative-group", RegionGroupFlag.RegionGroup.MEMBERS); - static { - CREATIVE.setGroupFlag(CREATIVE_GROUP); - } - - public void init() { - rm = new CRegionManager(new File(plugin.getDataFolder(), "regions.yml")); - FlagList.addFlag(CREATIVE); - FlagList.addFlag(CREATIVE_GROUP); - - new WGIPlayerListen().register(); - } - - public enum Action { - FLAG, - INFO - } - - public class WGIPlayerListen extends PlayerListener { - @Override - public void onPlayerMove(PlayerMoveEvent event) { - if (event.isCancelled()) - return; - if (event.getFrom().getBlockX() != event.getTo().getBlockX() - || event.getFrom().getBlockY() != event.getTo().getBlockY() - || event.getFrom().getBlockZ() != event.getTo().getBlockZ()) { - - LCPlayer player = LCPlayer.get(event.getPlayer()); - RegionManager mgr = wg.getGlobalRegionManager().get(event.getPlayer().getWorld()); - Vector pt = new Vector(event.getTo().getBlockX(), event.getTo().getBlockY(), event.getTo().getBlockZ()); - ApplicableRegions set = new ApplicableRegions(mgr.getApplicableRegions(pt), rm.world(event.getPlayer().getWorld())); - - player.setRegionCreativeAllowed(set.allows(CREATIVE, player), event); - } - } - - private void register() { - plugin.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_MOVE, this, Priority.Normal, plugin); - } - } - - /** - * @TODO: Move "generic" region command to .regions-NS - */ - public class WGICommandExecutor implements CommandExecutor { - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (args.length < 2) { - return false; - } - if (!sender.hasPermission("limitedcreative.regions")) { - sender.sendMessage(ChatColor.DARK_RED + "exception.command.lackingpermission"); - return true; - } - Player player = sender instanceof Player ? (Player) sender : null; - World world = null; - Action act; - String rid; - try { - act = Action.valueOf(args[0].toUpperCase()); - } catch (IllegalArgumentException e) { - return false; - } - String[] wr = args[1].split("#"); - if (wr.length == 2) { - world = plugin.getServer().getWorld(wr[0]); - rid = wr[1]; - } else { - rid = args[1]; - if (player != null) { - world = player.getWorld(); - } else { - sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.world_not_found")); - return true; - } - } - - - RegionManager mgr = wg.getGlobalRegionManager().get(world); - ProtectedRegion region = mgr.getRegion(rid); - if (region == null) { - if (rid.equalsIgnoreCase("__global__")) { - region = new GlobalProtectedRegion(rid); - mgr.addRegion(region); - } else { - sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.region_not_found")); - return true; - } - } - - 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; - } - return false; - } - - private void onInfo(CommandSender sender, Player player, CRegion region) { - String[] args = new String[]{"info", region.getWorld().getName(), region.getProtectedRegion().getId()}; - wg.onCommand(sender, wg.getCommand("region"), "/region", args); - - StringBuilder list = new StringBuilder(); - for (FlagValue data : region.getFlags()) { - if (list.length() > 0) - list.append(", "); - list.append(data.getFlag().getName()); - list.append(": "); - list.append(data.getValue().toString()); - } - - sender.sendMessage(ChatColor.GREEN + L("command.worldguard.additional_flags") + ": " + list.toString()); - } - private void onFlag(CommandSender sender, Player player, CRegion region, String[] args) { - if (args.length < 3) { - sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.no_flag_given")); - sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.available_flags") + ": " + FlagList.getStringListAvailableFlags(sender)); - return; - } - String flagName = args[2]; - Flag flag = FlagList.getFlag(flagName); - if (flag == null) { - sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.unknown_flag") + ": " + flagName); - sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.available_flags") + ": " + FlagList.getStringListAvailableFlags(sender)); - return; - } - String value = null; - if (args.length > 3) - value = Util.join(args, 3); - - try { - if (value != null) { - region.setFlag(flag, flag.parseInput(wg, sender, value)); - } else { - region.setFlag(flag, null); - } - } catch (InvalidFlagFormat e) { - sender.sendMessage(ChatColor.DARK_RED + e.getLocalizedMessage()); - return; - } - sender.sendMessage(L("command.worldguard.flag_set", flag.getName())); - } - } -} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/regions/WorldGuardIntegration.java b/src/de/jaschastarke/minecraft/limitedcreative/regions/WorldGuardIntegration.java new file mode 100644 index 0000000..c699238 --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/regions/WorldGuardIntegration.java @@ -0,0 +1,149 @@ +/* + * 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.regions; + +import java.io.File; + +import org.bukkit.GameMode; +import org.bukkit.event.Event; +import org.bukkit.event.Event.Priority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockListener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerMoveEvent; + + +import com.sk89q.worldedit.Vector; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.flags.RegionGroupFlag; +import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.managers.RegionManager; + +import de.jaschastarke.minecraft.limitedcreative.LCPlayer; +import de.jaschastarke.minecraft.limitedcreative.LimitedCreativeCore; +import de.jaschastarke.minecraft.worldguard.ApplicableRegions; +import de.jaschastarke.minecraft.worldguard.CRegionManager; +import de.jaschastarke.minecraft.worldguard.FlagList; +import static de.jaschastarke.minecraft.utils.Locale.L; + +public class WorldGuardIntegration { + public static LimitedCreativeCore plugin; + public static WorldGuardPlugin wg; + private CRegionManager rm; + + public WorldGuardIntegration(LimitedCreativeCore pplugin) { + plugin = pplugin; + wg = (WorldGuardPlugin) plugin.getServer().getPluginManager().getPlugin("WorldGuard"); + } + + public static boolean available() { + return LimitedCreativeCore.plugin.getServer().getPluginManager().getPlugin("WorldGuard") != null; + } + + + public static final StateFlag CREATIVE = new StateFlag("creative", false); + public static final RegionGroupFlag CREATIVE_GROUP = new RegionGroupFlag("creative-group", RegionGroupFlag.RegionGroup.MEMBERS); + static { + CREATIVE.setGroupFlag(CREATIVE_GROUP); + } + + public void init() { + rm = new CRegionManager(new File(plugin.getDataFolder(), "regions.yml")); + + FlagList.addFlag(CREATIVE); + FlagList.addFlag(CREATIVE_GROUP); + + new WGIPlayerListen().register(); + new WGIBlockListen().register(); + } + + public CRegionManager getRegionManager() { + return rm; + } + + + public class WGIBlockListen extends BlockListener { + @Override + public void onBlockBreak(BlockBreakEvent event) { + if (event.isCancelled()) + return; + LCPlayer player = LCPlayer.get(event.getPlayer()); + RegionManager mgr = wg.getGlobalRegionManager().get(event.getPlayer().getWorld()); + Vector pt = new Vector(event.getBlock().getLocation().getBlockX(), event.getBlock().getLocation().getBlockY(), event.getBlock().getLocation().getBlockZ()); + ApplicableRegions set = new ApplicableRegions(mgr.getApplicableRegions(pt), rm.world(event.getPlayer().getWorld())); + + boolean creative_region = set.allows(CREATIVE); + plugin.logger.info("in creative region: "+Boolean.toString(creative_region)+" - "+event.getBlock().getLocation()); + if (creative_region && player.getRaw().getGameMode() != GameMode.CREATIVE) { + plugin.spawnblock.block(event.getBlock(), player); + } + } + + @Override + public void onBlockPlace(BlockPlaceEvent event) { + if (event.isCancelled()) + return; + LCPlayer player = LCPlayer.get(event.getPlayer()); + if (player.getRegionCreative()) { + // do not build outside of creative regions, when in the region + RegionManager mgr = wg.getGlobalRegionManager().get(event.getPlayer().getWorld()); + Vector pt = new Vector(event.getBlock().getLocation().getBlockX(), event.getBlock().getLocation().getBlockY(), event.getBlock().getLocation().getBlockZ()); + ApplicableRegions set = new ApplicableRegions(mgr.getApplicableRegions(pt), rm.world(event.getPlayer().getWorld())); + if (!set.allows(CREATIVE, player)) { + event.getPlayer().sendMessage(L("blocked.outside_creative")); + event.setCancelled(true); + } + } + } + + @Override + public void onBlockDispense(BlockDispenseEvent event) { + plugin.logger.info("Block dispense: "+event.getBlock().getType()+" - "+event.getItem().getType()); + } + + private void register() { + plugin.getServer().getPluginManager().registerEvent(Event.Type.BLOCK_BREAK, this, Priority.Normal, plugin); + plugin.getServer().getPluginManager().registerEvent(Event.Type.BLOCK_PLACE, this, Priority.Normal, plugin); + plugin.getServer().getPluginManager().registerEvent(Event.Type.BLOCK_DISPENSE, this, Priority.Normal, plugin); + } + } + public class WGIPlayerListen extends PlayerListener { + @Override + public void onPlayerMove(PlayerMoveEvent event) { + if (event.isCancelled()) + return; + if (event.getFrom().getBlockX() != event.getTo().getBlockX() + || event.getFrom().getBlockY() != event.getTo().getBlockY() + || event.getFrom().getBlockZ() != event.getTo().getBlockZ()) { + + LCPlayer player = LCPlayer.get(event.getPlayer()); + RegionManager mgr = wg.getGlobalRegionManager().get(event.getPlayer().getWorld()); + Vector pt = new Vector(event.getTo().getBlockX(), event.getTo().getBlockY(), event.getTo().getBlockZ()); + ApplicableRegions set = new ApplicableRegions(mgr.getApplicableRegions(pt), rm.world(event.getPlayer().getWorld())); + + player.setRegionCreativeAllowed(set.allows(CREATIVE, player), event); + } + } + + private void register() { + plugin.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_MOVE, this, Priority.Normal, plugin); + } + } +} diff --git a/src/de/jaschastarke/minecraft/regions/ApplicableRegions.java b/src/de/jaschastarke/minecraft/worldguard/ApplicableRegions.java similarity index 92% rename from src/de/jaschastarke/minecraft/regions/ApplicableRegions.java rename to src/de/jaschastarke/minecraft/worldguard/ApplicableRegions.java index 74b08c9..564db0f 100644 --- a/src/de/jaschastarke/minecraft/regions/ApplicableRegions.java +++ b/src/de/jaschastarke/minecraft/worldguard/ApplicableRegions.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.jaschastarke.minecraft.regions; +package de.jaschastarke.minecraft.worldguard; import com.sk89q.worldguard.protection.ApplicableRegionSet; import com.sk89q.worldguard.protection.flags.Flag; @@ -23,7 +23,7 @@ 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.WorldGuardIntegration; +import de.jaschastarke.minecraft.limitedcreative.regions.WorldGuardIntegration; public class ApplicableRegions { private ApplicableRegionSet regions; diff --git a/src/de/jaschastarke/minecraft/worldguard/CCommand.java b/src/de/jaschastarke/minecraft/worldguard/CCommand.java new file mode 100644 index 0000000..f54e7fc --- /dev/null +++ b/src/de/jaschastarke/minecraft/worldguard/CCommand.java @@ -0,0 +1,163 @@ +/* + * 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 static de.jaschastarke.minecraft.utils.Locale.L; + +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; + +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.flags.Flag; +import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; +import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.regions.GlobalProtectedRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; + +import de.jaschastarke.minecraft.utils.Util; + +public class CCommand implements CommandExecutor { + public enum Action { + FLAG, + INFO + } + + private CRegionManager rm; + private JavaPlugin plugin; + private WorldGuardPlugin wg; + + public CCommand(JavaPlugin plugin, CRegionManager mgr, WorldGuardPlugin wg) { + this.plugin = plugin; + this.rm = mgr; + this.wg = wg; + } + public CCommand(JavaPlugin plugin, CRegionManager mgr) { + this.plugin = plugin; + this.rm = mgr; + this.wg = (WorldGuardPlugin) plugin.getServer().getPluginManager().getPlugin("WorldGuard"); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length < 2) { + return false; + } + if (!sender.hasPermission("limitedcreative.regions")) { + sender.sendMessage(ChatColor.DARK_RED + "exception.command.lackingpermission"); + return true; + } + Player player = sender instanceof Player ? (Player) sender : null; + World world = null; + Action act; + String rid; + try { + act = Action.valueOf(args[0].toUpperCase()); + } catch (IllegalArgumentException e) { + return false; + } + String[] wr = args[1].split("#"); + if (wr.length == 2) { + world = plugin.getServer().getWorld(wr[0]); + rid = wr[1]; + } else { + rid = args[1]; + if (player != null) { + world = player.getWorld(); + } else { + sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.world_not_found")); + return true; + } + } + + + RegionManager mgr = wg.getGlobalRegionManager().get(world); + ProtectedRegion region = mgr.getRegion(rid); + if (region == null) { + if (rid.equalsIgnoreCase("__global__")) { + region = new GlobalProtectedRegion(rid); + mgr.addRegion(region); + } else { + sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.region_not_found")); + return true; + } + } + + 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; + } + return false; + } + + private void onInfo(CommandSender sender, Player player, CRegion region) { + String[] args = new String[]{"info", region.getWorld().getName(), region.getProtectedRegion().getId()}; + wg.onCommand(sender, wg.getCommand("region"), "/region", args); + + StringBuilder list = new StringBuilder(); + for (FlagValue data : region.getFlags()) { + if (list.length() > 0) + list.append(", "); + list.append(data.getFlag().getName()); + list.append(": "); + list.append(data.getValue().toString()); + } + + sender.sendMessage(ChatColor.GREEN + L("command.worldguard.additional_flags") + ": " + list.toString()); + } + private void onFlag(CommandSender sender, Player player, CRegion region, String[] args) { + if (args.length < 3) { + sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.no_flag_given")); + sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.available_flags") + ": " + FlagList.getStringListAvailableFlags(sender)); + return; + } + String flagName = args[2]; + Flag flag = FlagList.getFlag(flagName); + if (flag == null) { + sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.unknown_flag") + ": " + flagName); + sender.sendMessage(ChatColor.DARK_RED + L("command.worldguard.available_flags") + ": " + FlagList.getStringListAvailableFlags(sender)); + return; + } + String value = null; + if (args.length > 3) + value = Util.join(args, 3); + + try { + if (value != null) { + region.setFlag(flag, flag.parseInput(wg, sender, value)); + } else { + region.setFlag(flag, null); + } + } catch (InvalidFlagFormat e) { + sender.sendMessage(ChatColor.DARK_RED + e.getLocalizedMessage()); + return; + } + sender.sendMessage(L("command.worldguard.flag_set", flag.getName())); + } + +} diff --git a/src/de/jaschastarke/minecraft/regions/CRegion.java b/src/de/jaschastarke/minecraft/worldguard/CRegion.java similarity index 91% rename from src/de/jaschastarke/minecraft/regions/CRegion.java rename to src/de/jaschastarke/minecraft/worldguard/CRegion.java index 54749da..9ffad02 100644 --- a/src/de/jaschastarke/minecraft/regions/CRegion.java +++ b/src/de/jaschastarke/minecraft/worldguard/CRegion.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.jaschastarke.minecraft.regions; +package de.jaschastarke.minecraft.worldguard; import java.util.Iterator; import java.util.List; @@ -24,7 +24,8 @@ import org.bukkit.World; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import de.jaschastarke.minecraft.regions.CRegionManager.CWorld; + +import de.jaschastarke.minecraft.worldguard.CRegionManager.CWorld; public class CRegion { private ProtectedRegion region; diff --git a/src/de/jaschastarke/minecraft/regions/CRegionManager.java b/src/de/jaschastarke/minecraft/worldguard/CRegionManager.java similarity index 96% rename from src/de/jaschastarke/minecraft/regions/CRegionManager.java rename to src/de/jaschastarke/minecraft/worldguard/CRegionManager.java index fa6cf08..3ff6cf9 100644 --- a/src/de/jaschastarke/minecraft/regions/CRegionManager.java +++ b/src/de/jaschastarke/minecraft/worldguard/CRegionManager.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.jaschastarke.minecraft.regions; +package de.jaschastarke.minecraft.worldguard; import java.io.File; import java.io.IOException; diff --git a/src/de/jaschastarke/minecraft/regions/FlagList.java b/src/de/jaschastarke/minecraft/worldguard/FlagList.java similarity index 94% rename from src/de/jaschastarke/minecraft/regions/FlagList.java rename to src/de/jaschastarke/minecraft/worldguard/FlagList.java index b4abf32..69e87d7 100644 --- a/src/de/jaschastarke/minecraft/regions/FlagList.java +++ b/src/de/jaschastarke/minecraft/worldguard/FlagList.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.jaschastarke.minecraft.regions; +package de.jaschastarke.minecraft.worldguard; import java.util.ArrayList; import java.util.List; diff --git a/src/de/jaschastarke/minecraft/regions/FlagValue.java b/src/de/jaschastarke/minecraft/worldguard/FlagValue.java similarity index 93% rename from src/de/jaschastarke/minecraft/regions/FlagValue.java rename to src/de/jaschastarke/minecraft/worldguard/FlagValue.java index cbd31ae..6cf6a91 100644 --- a/src/de/jaschastarke/minecraft/regions/FlagValue.java +++ b/src/de/jaschastarke/minecraft/worldguard/FlagValue.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.jaschastarke.minecraft.regions; +package de.jaschastarke.minecraft.worldguard; import com.sk89q.worldguard.protection.flags.Flag; diff --git a/src/de/jaschastarke/minecraft/regions/IRestrictedFlag.java b/src/de/jaschastarke/minecraft/worldguard/IRestrictedFlag.java similarity index 92% rename from src/de/jaschastarke/minecraft/regions/IRestrictedFlag.java rename to src/de/jaschastarke/minecraft/worldguard/IRestrictedFlag.java index 21cd9ea..3ef2384 100644 --- a/src/de/jaschastarke/minecraft/regions/IRestrictedFlag.java +++ b/src/de/jaschastarke/minecraft/worldguard/IRestrictedFlag.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.jaschastarke.minecraft.regions; +package de.jaschastarke.minecraft.worldguard; import org.bukkit.command.CommandSender;