diff --git a/src/main/java/de/diddiz/LogBlock/BlockChange.java b/src/main/java/de/diddiz/LogBlock/BlockChange.java index dddfa4b..491c35f 100644 --- a/src/main/java/de/diddiz/LogBlock/BlockChange.java +++ b/src/main/java/de/diddiz/LogBlock/BlockChange.java @@ -7,9 +7,14 @@ import de.diddiz.util.Utils; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Note; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Openable; import org.bukkit.block.data.Powerable; +import org.bukkit.block.data.type.Comparator; +import org.bukkit.block.data.type.DaylightDetector; +import org.bukkit.block.data.type.NoteBlock; +import org.bukkit.block.data.type.Repeater; import org.bukkit.block.data.type.Switch; import org.bukkit.inventory.ItemStack; @@ -100,7 +105,7 @@ public class BlockChange implements LookupCacheElement { if (actor != null) { msg.append(actor.getName()).append(" "); } - if (type.equals(replaced)) { + if (type.getMaterial().equals(replaced.getMaterial())) { if (BukkitUtils.isEmpty(type.getMaterial())) { msg.append("did an unspecified action"); } else if (ca != null) { @@ -117,13 +122,20 @@ public class BlockChange implements LookupCacheElement { // Door, Trapdoor, Fence gate msg.append(((Openable)type).isOpen() ? "opened" : "closed").append(" ").append(type.getMaterial().name()); } else if (type.getMaterial() == Material.LEVER) { - msg.append("switched ").append(type.getMaterial().name()); + msg.append("switched ").append(type.getMaterial().name()).append(" ").append(((Switch) type).isPowered() ? "on" : "off"); } else if (type instanceof Switch) { msg.append("pressed ").append(type.getMaterial().name()); } else if (type.getMaterial() == Material.CAKE) { msg.append("ate a piece of ").append(type.getMaterial().name()); - } else if (type.getMaterial() == Material.NOTE_BLOCK || type.getMaterial() == Material.REPEATER || type.getMaterial() == Material.COMPARATOR || type.getMaterial() == Material.DAYLIGHT_DETECTOR) { - msg.append("changed ").append(type.getMaterial().name()); + } else if (type.getMaterial() == Material.NOTE_BLOCK) { + Note note = ((NoteBlock) type).getNote(); + msg.append("set ").append(type.getMaterial().name()).append(" to ").append(note.getTone().name()).append(note.isSharped() ? "#" : ""); + } else if (type.getMaterial() == Material.REPEATER) { + msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((Repeater) type).getDelay()).append(" ticks delay"); + } else if (type.getMaterial() == Material.COMPARATOR) { + msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((Comparator) type).getMode()); + } else if (type.getMaterial() == Material.DAYLIGHT_DETECTOR) { + msg.append("set ").append(type.getMaterial().name()).append(" to ").append(((DaylightDetector) type).isInverted() ? "inverted" : "normal"); } else if (type instanceof Powerable) { msg.append("stepped on ").append(type.getMaterial().name()); } else if (type.getMaterial() == Material.TRIPWIRE) { diff --git a/src/main/java/de/diddiz/LogBlock/Logging.java b/src/main/java/de/diddiz/LogBlock/Logging.java index cd9323d..b18a5be 100644 --- a/src/main/java/de/diddiz/LogBlock/Logging.java +++ b/src/main/java/de/diddiz/LogBlock/Logging.java @@ -8,7 +8,7 @@ public enum Logging { PRESUREPLATEINTERACT, TRIPWIREINTERACT, CREATURECROPTRAMPLE, CROPTRAMPLE, NATURALSTRUCTUREGROW, GRASSGROWTH, MYCELIUMSPREAD, VINEGROWTH, MUSHROOMSPREAD, WITHER(true), WITHER_SKULL(true), BONEMEALSTRUCTUREGROW, WORLDEDIT, TNTMINECARTEXPLOSION(true), - ENDERCRYSTALEXPLOSION(true), BEDEXPLOSION(true), DRAGONEGGTELEPORT(true); + ENDERCRYSTALEXPLOSION(true), BEDEXPLOSION(true), DRAGONEGGTELEPORT(true), DAYLIGHTDETECTORINTERACT; public static final int length = Logging.values().length; private final boolean defaultEnabled; diff --git a/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java index 8bfc211..e0a6b5e 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java @@ -7,10 +7,21 @@ import de.diddiz.LogBlock.config.WorldConfig; import de.diddiz.util.BukkitUtils; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Tag; +import org.bukkit.Note; +import org.bukkit.Note.Tone; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Bisected.Half; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Openable; +import org.bukkit.block.data.type.Cake; +import org.bukkit.block.data.type.Comparator; +import org.bukkit.block.data.type.Comparator.Mode; +import org.bukkit.block.data.type.DaylightDetector; +import org.bukkit.block.data.type.Door; +import org.bukkit.block.data.type.NoteBlock; +import org.bukkit.block.data.type.Repeater; +import org.bukkit.block.data.type.Switch; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -51,27 +62,52 @@ public class InteractLogging extends LoggingListener { case ACACIA_TRAPDOOR: case DARK_OAK_TRAPDOOR: if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); + Openable newBlockData = (Openable) blockData.clone(); + newBlockData.setOpen(!newBlockData.isOpen()); + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); } break; case CAKE: if (wcfg.isLogging(Logging.CAKEEAT) && event.getAction() == Action.RIGHT_CLICK_BLOCK && player.getFoodLevel() < 20) { - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); + Cake newBlockData = (Cake) blockData.clone(); + if (newBlockData.getBites() < 6) { + newBlockData.setBites(newBlockData.getBites() + 1); + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); + } else { + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, Material.AIR.createBlockData()); + } } break; case NOTE_BLOCK: if (wcfg.isLogging(Logging.NOTEBLOCKINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); + NoteBlock newBlockData = (NoteBlock) blockData.clone(); + if (newBlockData.getNote().getOctave() == 2) { + newBlockData.setNote(new Note(0, Tone.F, true)); + } else { + newBlockData.setNote(newBlockData.getNote().sharped()); + } + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); } break; case REPEATER: if (wcfg.isLogging(Logging.DIODEINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); + Repeater newBlockData = (Repeater) blockData.clone(); + newBlockData.setDelay((newBlockData.getDelay() % 4) + 1); + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); } break; case COMPARATOR: if (wcfg.isLogging(Logging.COMPARATORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); + Comparator newBlockData = (Comparator) blockData.clone(); + newBlockData.setMode(newBlockData.getMode() == Mode.COMPARE ? Mode.SUBTRACT : Mode.COMPARE); + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); + } + break; + case DAYLIGHT_DETECTOR: + if (wcfg.isLogging(Logging.DAYLIGHTDETECTORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { + DaylightDetector newBlockData = (DaylightDetector) blockData.clone(); + newBlockData.setInverted(!newBlockData.isInverted()); + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); } break; case OAK_PRESSURE_PLATE: @@ -104,14 +140,27 @@ public class InteractLogging extends LoggingListener { } break; default: - if (Tag.BUTTONS.isTagged(type) || type == Material.LEVER) { + if (BukkitUtils.isButton(type) || type == Material.LEVER) { if (wcfg.isLogging(Logging.SWITCHINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); + Switch newBlockData = (Switch) blockData.clone(); + if (!newBlockData.isPowered() || type == Material.LEVER) { + newBlockData.setPowered(!newBlockData.isPowered()); + } + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); } } - if (Tag.WOODEN_DOORS.isTagged(type)) { + if (BukkitUtils.isWoodenDoor(type)) { if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, blockData); + Door newBlockData = (Door) blockData.clone(); + newBlockData.setOpen(!newBlockData.isOpen()); + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); + Block otherBlock = clicked.getRelative(newBlockData.getHalf() == Half.TOP ? BlockFace.DOWN : BlockFace.UP); + if (otherBlock.getType() == type) { + BlockData blockData2 = otherBlock.getBlockData(); + Door newBlockData2 = (Door) blockData2.clone(); + newBlockData2.setOpen(!newBlockData2.isOpen()); + consumer.queueBlock(Actor.actorFromEntity(player), otherBlock.getLocation(), blockData2, newBlockData2); + } } } } diff --git a/src/main/java/de/diddiz/util/BukkitUtils.java b/src/main/java/de/diddiz/util/BukkitUtils.java index c431ee5..8e0aa14 100644 --- a/src/main/java/de/diddiz/util/BukkitUtils.java +++ b/src/main/java/de/diddiz/util/BukkitUtils.java @@ -43,9 +43,12 @@ public class BukkitUtils { private static final Set bedBlocks; private static final Map projectileItems; + private static final EnumSet buttons; + private static final EnumSet pressurePlates; + private static final EnumSet woodenDoors; static { - EnumSet pressurePlates = EnumSet.noneOf(Material.class); + pressurePlates = EnumSet.noneOf(Material.class); pressurePlates.add(Material.OAK_PRESSURE_PLATE); pressurePlates.add(Material.SPRUCE_PRESSURE_PLATE); pressurePlates.add(Material.BIRCH_PRESSURE_PLATE); @@ -56,6 +59,14 @@ public class BukkitUtils { pressurePlates.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE); pressurePlates.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE); + woodenDoors = EnumSet.noneOf(Material.class); + woodenDoors.add(Material.OAK_DOOR); + woodenDoors.add(Material.SPRUCE_DOOR); + woodenDoors.add(Material.BIRCH_DOOR); + woodenDoors.add(Material.JUNGLE_DOOR); + woodenDoors.add(Material.ACACIA_DOOR); + woodenDoors.add(Material.DARK_OAK_DOOR); + EnumSet saplings = EnumSet.noneOf(Material.class); saplings.add(Material.OAK_SAPLING); saplings.add(Material.SPRUCE_SAPLING); @@ -103,6 +114,15 @@ public class BukkitUtils { slabs.add(Material.DARK_PRISMARINE_SLAB); slabs.add(Material.PRISMARINE_BRICK_SLAB); + buttons = EnumSet.noneOf(Material.class); + buttons.add(Material.STONE_BUTTON); + buttons.add(Material.OAK_BUTTON); + buttons.add(Material.SPRUCE_BUTTON); + buttons.add(Material.BIRCH_BUTTON); + buttons.add(Material.JUNGLE_BUTTON); + buttons.add(Material.ACACIA_BUTTON); + buttons.add(Material.DARK_OAK_BUTTON); + singleBlockPlants = EnumSet.noneOf(Material.class); singleBlockPlants.add(Material.GRASS); singleBlockPlants.add(Material.FERN); @@ -142,13 +162,7 @@ public class BukkitUtils { relativeBreakable = EnumSet.noneOf(Material.class); relativeBreakable.add(Material.WALL_SIGN); relativeBreakable.add(Material.LADDER); - relativeBreakable.add(Material.STONE_BUTTON); - relativeBreakable.add(Material.OAK_BUTTON); - relativeBreakable.add(Material.SPRUCE_BUTTON); - relativeBreakable.add(Material.BIRCH_BUTTON); - relativeBreakable.add(Material.JUNGLE_BUTTON); - relativeBreakable.add(Material.ACACIA_BUTTON); - relativeBreakable.add(Material.DARK_OAK_BUTTON); + relativeBreakable.addAll(buttons); relativeBreakable.add(Material.REDSTONE_WALL_TORCH); relativeBreakable.add(Material.LEVER); relativeBreakable.add(Material.WALL_TORCH); @@ -180,12 +194,7 @@ public class BukkitUtils { relativeTopBreakable.add(Material.WALL_TORCH); relativeTopBreakable.add(Material.REDSTONE_TORCH); relativeTopBreakable.add(Material.REDSTONE_WALL_TORCH); - relativeTopBreakable.add(Material.OAK_DOOR); - relativeTopBreakable.add(Material.SPRUCE_DOOR); - relativeTopBreakable.add(Material.BIRCH_DOOR); - relativeTopBreakable.add(Material.JUNGLE_DOOR); - relativeTopBreakable.add(Material.ACACIA_DOOR); - relativeTopBreakable.add(Material.DARK_OAK_DOOR); + relativeTopBreakable.addAll(woodenDoors); relativeTopBreakable.add(Material.IRON_DOOR); relativeTopBreakable.addAll(carpets); relativeTopBreakable.addAll(doublePlants); @@ -577,6 +586,14 @@ public class BukkitUtils { return doublePlants.contains(m); } + public static boolean isWoodenDoor(Material m) { + return woodenDoors.contains(m); + } + + public static boolean isButton(Material m) { + return buttons.contains(m); + } + public static boolean isEmpty(Material m) { return m == Material.AIR || m == Material.CAVE_AIR || m == Material.VOID_AIR; }