From c38d0dfc4a0644a7a5466a5150fa082403e30965 Mon Sep 17 00:00:00 2001 From: Daniel Saukel Date: Tue, 29 Dec 2015 16:13:06 +0100 Subject: [PATCH] Added /dxl break command + Some minor improvements --- .../github/dre2n/dungeonsxl/DungeonsXL.java | 8 +++ .../dungeonsxl/command/BreakCommand.java | 33 ++++++++++ .../dre2n/dungeonsxl/command/DCommands.java | 3 +- .../dungeonsxl/command/EscapeCommand.java | 2 +- .../dre2n/dungeonsxl/command/MsgCommand.java | 2 +- .../dre2n/dungeonsxl/command/SaveCommand.java | 2 +- .../dre2n/dungeonsxl/dungeon/EditWorld.java | 6 +- .../dre2n/dungeonsxl/file/DMessages.java | 2 + .../dre2n/dungeonsxl/global/GroupSign.java | 4 ++ .../dre2n/dungeonsxl/global/LeaveSign.java | 4 ++ .../dungeonsxl/listener/BlockListener.java | 61 +++++++++++++++---- .../dungeonsxl/listener/EntityListener.java | 2 +- .../dungeonsxl/listener/PlayerListener.java | 10 ++- .../dre2n/dungeonsxl/player/DPlayer.java | 6 +- .../dre2n/dungeonsxl/sign/InteractSign.java | 2 +- .../dre2n/dungeonsxl/sign/TriggerSign.java | 2 +- 16 files changed, 120 insertions(+), 29 deletions(-) create mode 100644 src/io/github/dre2n/dungeonsxl/command/BreakCommand.java diff --git a/src/io/github/dre2n/dungeonsxl/DungeonsXL.java b/src/io/github/dre2n/dungeonsxl/DungeonsXL.java index f23bdf2b..c5ad9bfc 100644 --- a/src/io/github/dre2n/dungeonsxl/DungeonsXL.java +++ b/src/io/github/dre2n/dungeonsxl/DungeonsXL.java @@ -52,6 +52,7 @@ public class DungeonsXL extends JavaPlugin { private DSigns dSigns; private Dungeons dungeons; + private CopyOnWriteArrayList inBreakMode = new CopyOnWriteArrayList(); private CopyOnWriteArrayList chatSpyers = new CopyOnWriteArrayList(); private CopyOnWriteArrayList dLootInventories = new CopyOnWriteArrayList(); private CopyOnWriteArrayList editWorlds = new CopyOnWriteArrayList(); @@ -404,6 +405,13 @@ public class DungeonsXL extends JavaPlugin { dungeons = new Dungeons(); } + /** + * @return the inBreakMode + */ + public CopyOnWriteArrayList getInBreakMode() { + return inBreakMode; + } + /** * @return the chatSpyers */ diff --git a/src/io/github/dre2n/dungeonsxl/command/BreakCommand.java b/src/io/github/dre2n/dungeonsxl/command/BreakCommand.java new file mode 100644 index 00000000..bd69547c --- /dev/null +++ b/src/io/github/dre2n/dungeonsxl/command/BreakCommand.java @@ -0,0 +1,33 @@ +package io.github.dre2n.dungeonsxl.command; + +import io.github.dre2n.dungeonsxl.file.DMessages.Messages; +import io.github.dre2n.dungeonsxl.util.MessageUtil; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class BreakCommand extends DCommand { + + public BreakCommand() { + setCommand("break"); + setMinArgs(0); + setMaxArgs(0); + setHelp(dMessages.getMessage(Messages.HELP_CMD_BREAK)); + setPermission("dxl.break"); + setPlayerCommand(true); + } + + @Override + public void onExecute(String[] args, CommandSender sender) { + Player player = (Player) sender; + if ( !plugin.getInBreakMode().contains(player)) { + plugin.getInBreakMode().add(player); + MessageUtil.sendMessage(sender, dMessages.getMessage(Messages.CMD_BREAK_BREAK_MODE)); + + } else { + plugin.getInBreakMode().remove(player); + MessageUtil.sendMessage(sender, dMessages.getMessage(Messages.CMD_BREAK_PROTECTED_MODE)); + } + } + +} diff --git a/src/io/github/dre2n/dungeonsxl/command/DCommands.java b/src/io/github/dre2n/dungeonsxl/command/DCommands.java index ff1d6d83..c9ba0518 100644 --- a/src/io/github/dre2n/dungeonsxl/command/DCommands.java +++ b/src/io/github/dre2n/dungeonsxl/command/DCommands.java @@ -11,13 +11,14 @@ public class DCommands { public DCommands() { // Add Commands dCommands.add(new HelpCommand()); - dCommands.add(new LeaveCommand()); + dCommands.add(new BreakCommand()); dCommands.add(new ChatCommand()); dCommands.add(new ChatSpyCommand()); dCommands.add(new CreateCommand()); dCommands.add(new EditCommand()); dCommands.add(new EscapeCommand()); dCommands.add(new InviteCommand()); + dCommands.add(new LeaveCommand()); dCommands.add(new ListCommand()); dCommands.add(new LivesCommand()); dCommands.add(new MainCommand()); diff --git a/src/io/github/dre2n/dungeonsxl/command/EscapeCommand.java b/src/io/github/dre2n/dungeonsxl/command/EscapeCommand.java index 87312cda..1855da5f 100644 --- a/src/io/github/dre2n/dungeonsxl/command/EscapeCommand.java +++ b/src/io/github/dre2n/dungeonsxl/command/EscapeCommand.java @@ -32,7 +32,7 @@ public class EscapeCommand extends DCommand { dPlayer.escape(); - EditWorld editWorld = EditWorld.get(dPlayer.getWorld()); + EditWorld editWorld = EditWorld.getByWorld(dPlayer.getWorld()); if (editWorld == null) { return; } diff --git a/src/io/github/dre2n/dungeonsxl/command/MsgCommand.java b/src/io/github/dre2n/dungeonsxl/command/MsgCommand.java index ec41f5f7..b4037e97 100644 --- a/src/io/github/dre2n/dungeonsxl/command/MsgCommand.java +++ b/src/io/github/dre2n/dungeonsxl/command/MsgCommand.java @@ -26,7 +26,7 @@ public class MsgCommand extends DCommand { @Override public void onExecute(String[] args, CommandSender sender) { Player player = (Player) sender; - EditWorld editWorld = EditWorld.get(player.getWorld()); + EditWorld editWorld = EditWorld.getByWorld(player.getWorld()); if (editWorld == null) { MessageUtil.sendMessage(player, dMessages.getMessage(Messages.ERROR_NOT_IN_DUNGEON)); diff --git a/src/io/github/dre2n/dungeonsxl/command/SaveCommand.java b/src/io/github/dre2n/dungeonsxl/command/SaveCommand.java index 428c3936..96e92ab0 100644 --- a/src/io/github/dre2n/dungeonsxl/command/SaveCommand.java +++ b/src/io/github/dre2n/dungeonsxl/command/SaveCommand.java @@ -21,7 +21,7 @@ public class SaveCommand extends DCommand { @Override public void onExecute(String[] args, CommandSender sender) { Player player = (Player) sender; - EditWorld editWorld = EditWorld.get(player.getWorld()); + EditWorld editWorld = EditWorld.getByWorld(player.getWorld()); if (editWorld != null) { editWorld.save(); MessageUtil.sendMessage(player, dMessages.getMessage(Messages.CMD_SAVE_SUCCESS)); diff --git a/src/io/github/dre2n/dungeonsxl/dungeon/EditWorld.java b/src/io/github/dre2n/dungeonsxl/dungeon/EditWorld.java index aa051e39..0daba34b 100644 --- a/src/io/github/dre2n/dungeonsxl/dungeon/EditWorld.java +++ b/src/io/github/dre2n/dungeonsxl/dungeon/EditWorld.java @@ -125,7 +125,7 @@ public class EditWorld { } // Static - public static EditWorld get(World world) { + public static EditWorld getByWorld(World world) { for (EditWorld editWorld : plugin.getEditWorlds()) { if (editWorld.world.equals(world)) { return editWorld; @@ -135,7 +135,7 @@ public class EditWorld { return null; } - public static EditWorld get(String name) { + public static EditWorld getByName(String name) { for (EditWorld editWorld : plugin.getEditWorlds()) { if (editWorld.mapName.equalsIgnoreCase(name)) { return editWorld; @@ -245,7 +245,7 @@ public class EditWorld { config.save(); // Kick Player - EditWorld editWorld = EditWorld.get(editWorldName); + EditWorld editWorld = EditWorld.getByName(editWorldName); if (editWorld != null) { DPlayer player = DPlayer.getByName(name); diff --git a/src/io/github/dre2n/dungeonsxl/file/DMessages.java b/src/io/github/dre2n/dungeonsxl/file/DMessages.java index d5e124a2..c38f6e4c 100644 --- a/src/io/github/dre2n/dungeonsxl/file/DMessages.java +++ b/src/io/github/dre2n/dungeonsxl/file/DMessages.java @@ -40,6 +40,8 @@ public class DMessages { PLAYER_TREASURES("Player_Treasures", "&1Treasures"), PLAYER_WAIT_FOR_OTHER_PLAYERS("Player_WaitForOtherPlayers", "&6Waiting for teammates..."), + CMD_BREAK_PROTECTED_MODE("Cmd_Break_ProtectedMode", "&6You may not break blocks protected by DungeonsXL anymore."), + CMD_BREAK_BREAK_MODE("Cmd_Break_BreakMode", "&6You may break a block protected by DungeonsXL."), CMD_CHAT_DUNGEON_CHAT("Cmd_Chat_DungeonChat", "&6You have entered the Dungeon-chat"), CMD_CHAT_NORMAL_CHAT("Cmd_Chat_NormalChat", "&6You are now in the public chat"), CMD_CHATSPY_STOPPED("Cmd_Chatspy_Stopped", "&6You stopped spying the DXL-chat!"), diff --git a/src/io/github/dre2n/dungeonsxl/global/GroupSign.java b/src/io/github/dre2n/dungeonsxl/global/GroupSign.java index 17193722..c230ef6c 100644 --- a/src/io/github/dre2n/dungeonsxl/global/GroupSign.java +++ b/src/io/github/dre2n/dungeonsxl/global/GroupSign.java @@ -112,6 +112,10 @@ public class GroupSign { this.multiFloor = multiFloor; } + public void delete() { + plugin.getGroupSigns().remove(this); + } + public void update() { int i = 0; for (DGroup dGroup : dGroups) { diff --git a/src/io/github/dre2n/dungeonsxl/global/LeaveSign.java b/src/io/github/dre2n/dungeonsxl/global/LeaveSign.java index f735701f..ba99cc27 100644 --- a/src/io/github/dre2n/dungeonsxl/global/LeaveSign.java +++ b/src/io/github/dre2n/dungeonsxl/global/LeaveSign.java @@ -35,6 +35,10 @@ public class LeaveSign { sign.update(); } + public void delete() { + plugin.getLeaveSigns().remove(this); + } + public static boolean playerInteract(Block block, Player player) { LeaveSign leaveSign = getSign(block); diff --git a/src/io/github/dre2n/dungeonsxl/listener/BlockListener.java b/src/io/github/dre2n/dungeonsxl/listener/BlockListener.java index 48973123..e6a6104b 100644 --- a/src/io/github/dre2n/dungeonsxl/listener/BlockListener.java +++ b/src/io/github/dre2n/dungeonsxl/listener/BlockListener.java @@ -47,37 +47,72 @@ public class BlockListener implements Listener { @EventHandler(priority = EventPriority.HIGH) public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); + Player player = event.getPlayer(); // Deny DPortal destroying if (block.getType() == Material.PORTAL) { - if (DPortal.getByBlock(event.getBlock()) != null) { + DPortal dPortal = DPortal.getByBlock(event.getBlock()); + if (dPortal != null) { + if (plugin.getInBreakMode().contains(player)) { + dPortal.delete(); + MessageUtil.sendMessage(player, plugin.getDMessages().getMessage(Messages.PLAYER_PROTECTED_BLOCK_DELETED)); + MessageUtil.sendMessage(player, plugin.getDMessages().getMessage(Messages.CMD_BREAK_PROTECTED_MODE)); + plugin.getInBreakMode().remove(player); + + } else { + event.setCancelled(true); + } + + return; + } + } + + // Delete GroupSign + GroupSign groupSign = GroupSign.getSign(block); + if (groupSign != null) { + if (plugin.getInBreakMode().contains(player)) { + groupSign.delete(); + MessageUtil.sendMessage(player, plugin.getDMessages().getMessage(Messages.PLAYER_PROTECTED_BLOCK_DELETED)); + MessageUtil.sendMessage(player, plugin.getDMessages().getMessage(Messages.CMD_BREAK_PROTECTED_MODE)); + plugin.getInBreakMode().remove(player); + + } else { event.setCancelled(true); } + + return; } // Deny DGSignblocks destroying if (GroupSign.isRelativeSign(block, 1, 0) || GroupSign.isRelativeSign(block, -1, 0) || GroupSign.isRelativeSign(block, 0, 1) || GroupSign.isRelativeSign(block, 0, -1)) { event.setCancelled(true); + return; } - // DGSign destroying - if (GroupSign.getSign(block) != null) { - plugin.getGroupSigns().remove(GroupSign.getSign(block)); + // Delete LeaveSign + LeaveSign leaveSign = LeaveSign.getSign(block); + if (leaveSign != null) { + if (plugin.getInBreakMode().contains(player)) { + leaveSign.delete(); + MessageUtil.sendMessage(player, plugin.getDMessages().getMessage(Messages.PLAYER_PROTECTED_BLOCK_DELETED)); + MessageUtil.sendMessage(player, plugin.getDMessages().getMessage(Messages.CMD_BREAK_PROTECTED_MODE)); + plugin.getInBreakMode().remove(player); + + } else { + event.setCancelled(true); + } + + return; } // Deny LeaveSignblocks destroying if (LeaveSign.isRelativeSign(block, 1, 0) || LeaveSign.isRelativeSign(block, -1, 0) || LeaveSign.isRelativeSign(block, 0, 1) || LeaveSign.isRelativeSign(block, 0, -1)) { event.setCancelled(true); - } - - // LeaveSign destroying - if (LeaveSign.getSign(block) != null) { - event.setCancelled(true); - // LeaveSign.lsigns.remove(LeaveSign.getSign(block)); + return; } // Editworld Signs - EditWorld editWorld = EditWorld.get(block.getWorld()); + EditWorld editWorld = EditWorld.getByWorld(block.getWorld()); if (editWorld != null) { editWorld.getSign().remove(event.getBlock()); } @@ -124,7 +159,7 @@ public class BlockListener implements Listener { Player player = event.getPlayer(); Block block = event.getBlock(); String[] lines = event.getLines(); - EditWorld editWorld = EditWorld.get(player.getWorld()); + EditWorld editWorld = EditWorld.getByWorld(player.getWorld()); // Group Signs if (editWorld == null) { @@ -211,7 +246,7 @@ public class BlockListener implements Listener { } // Check EditWorlds - EditWorld editWorld = EditWorld.get(event.getBlock().getWorld()); + EditWorld editWorld = EditWorld.getByWorld(event.getBlock().getWorld()); if (editWorld != null) { event.setCancelled(true); } diff --git a/src/io/github/dre2n/dungeonsxl/listener/EntityListener.java b/src/io/github/dre2n/dungeonsxl/listener/EntityListener.java index 8b0c456d..8d4601b9 100644 --- a/src/io/github/dre2n/dungeonsxl/listener/EntityListener.java +++ b/src/io/github/dre2n/dungeonsxl/listener/EntityListener.java @@ -47,7 +47,7 @@ public class EntityListener implements Listener { public void onCreatureSpawn(CreatureSpawnEvent event) { World world = event.getLocation().getWorld(); - EditWorld editWorld = EditWorld.get(world); + EditWorld editWorld = EditWorld.getByWorld(world); GameWorld gameWorld = GameWorld.getByWorld(world); if (editWorld != null || gameWorld != null) { diff --git a/src/io/github/dre2n/dungeonsxl/listener/PlayerListener.java b/src/io/github/dre2n/dungeonsxl/listener/PlayerListener.java index 261f1d00..5544aa46 100644 --- a/src/io/github/dre2n/dungeonsxl/listener/PlayerListener.java +++ b/src/io/github/dre2n/dungeonsxl/listener/PlayerListener.java @@ -98,9 +98,13 @@ public class PlayerListener implements Listener { Player player = event.getPlayer(); Block clickedBlock = event.getClickedBlock(); + if (plugin.getInBreakMode().contains(player)) { + return; + } + if (clickedBlock != null) { // Block Enderchests - if (GameWorld.getByWorld(player.getWorld()) != null || EditWorld.get(player.getWorld()) != null) { + if (GameWorld.getByWorld(player.getWorld()) != null || EditWorld.getByWorld(player.getWorld()) != null) { if (event.getAction() != Action.LEFT_CLICK_BLOCK) { if (clickedBlock.getType() == Material.ENDER_CHEST) { if ( !player.hasPermission("dxl.bypass")) { @@ -156,7 +160,7 @@ public class PlayerListener implements Listener { } // Copy/Paste a Sign and Block-info - if (EditWorld.get(player.getWorld()) != null) { + if (EditWorld.getByWorld(player.getWorld()) != null) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (item.getType() == Material.STICK) { DPlayer dPlayer = DPlayer.getByPlayer(player); @@ -294,7 +298,7 @@ public class PlayerListener implements Listener { } if (dPlayer.isEditing()) { - EditWorld editWorld = EditWorld.get(dPlayer.getWorld()); + EditWorld editWorld = EditWorld.getByWorld(dPlayer.getWorld()); if (editWorld == null) { return; } diff --git a/src/io/github/dre2n/dungeonsxl/player/DPlayer.java b/src/io/github/dre2n/dungeonsxl/player/DPlayer.java index 908e794b..f8baf156 100644 --- a/src/io/github/dre2n/dungeonsxl/player/DPlayer.java +++ b/src/io/github/dre2n/dungeonsxl/player/DPlayer.java @@ -131,7 +131,7 @@ public class DPlayer { } if (editing) { - EditWorld editWorld = EditWorld.get(world); + EditWorld editWorld = EditWorld.getByWorld(world); if (editWorld != null) { editWorld.save(); } @@ -349,7 +349,7 @@ public class DPlayer { public void sendMessage(String message) { if (editing) { - EditWorld editWorld = EditWorld.get(world); + EditWorld editWorld = EditWorld.getByWorld(world); editWorld.msg(message); for (Player player : plugin.getChatSpyers()) { if ( !editWorld.getWorld().getPlayers().contains(player)) { @@ -811,7 +811,7 @@ public class DPlayer { if ( !updateSecond) { if ( !dPlayer.getPlayer().getWorld().equals(dPlayer.world)) { if (dPlayer.editing) { - EditWorld editWorld = EditWorld.get(dPlayer.world); + EditWorld editWorld = EditWorld.getByWorld(dPlayer.world); if (editWorld != null) { if (editWorld.getLobby() == null) { MiscUtil.secureTeleport(dPlayer.getPlayer(), editWorld.getWorld().getSpawnLocation()); diff --git a/src/io/github/dre2n/dungeonsxl/sign/InteractSign.java b/src/io/github/dre2n/dungeonsxl/sign/InteractSign.java index 84eebc61..17f5ef58 100644 --- a/src/io/github/dre2n/dungeonsxl/sign/InteractSign.java +++ b/src/io/github/dre2n/dungeonsxl/sign/InteractSign.java @@ -24,7 +24,7 @@ public class InteractSign extends DSign { @Override public boolean check() { Set used = new HashSet(); - for (Block block : EditWorld.get(getSign().getLocation().getWorld()).getSign()) { + for (Block block : EditWorld.getByWorld(getSign().getLocation().getWorld()).getSign()) { if (block == null) { continue; } diff --git a/src/io/github/dre2n/dungeonsxl/sign/TriggerSign.java b/src/io/github/dre2n/dungeonsxl/sign/TriggerSign.java index 4b80d34a..aaf07c96 100644 --- a/src/io/github/dre2n/dungeonsxl/sign/TriggerSign.java +++ b/src/io/github/dre2n/dungeonsxl/sign/TriggerSign.java @@ -27,7 +27,7 @@ public class TriggerSign extends DSign { @Override public boolean check() { Set used = new HashSet(); - for (Block block : EditWorld.get(getSign().getLocation().getWorld()).getSign()) { + for (Block block : EditWorld.getByWorld(getSign().getLocation().getWorld()).getSign()) { if (block == null) { continue; }