From 4fda020dfcc773b8a493437f03a4d2806786c556 Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Mon, 27 May 2019 22:46:32 +0200 Subject: [PATCH] Log sign base color change --- .../blockstate/BlockStateCodecSign.java | 28 ++++++-- .../LogBlock/listeners/InteractLogging.java | 68 +++++++++++++++---- src/main/java/de/diddiz/util/BukkitUtils.java | 27 ++++++++ 3 files changed, 105 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecSign.java b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecSign.java index 8864de2..9df3cfd 100644 --- a/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecSign.java +++ b/src/main/java/de/diddiz/LogBlock/blockstate/BlockStateCodecSign.java @@ -3,7 +3,7 @@ package de.diddiz.LogBlock.blockstate; import java.util.Arrays; import java.util.Collections; import java.util.List; - +import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; @@ -27,9 +27,18 @@ public class BlockStateCodecSign implements BlockStateCodec { break; } } - if (hasText) { + DyeColor signColor = sign.getColor(); + if (signColor == null) { + signColor = DyeColor.BLACK; + } + if (hasText || signColor != DyeColor.BLACK) { YamlConfiguration conf = new YamlConfiguration(); - conf.set("lines", Arrays.asList(lines)); + if (hasText) { + conf.set("lines", Arrays.asList(lines)); + } + if (signColor != DyeColor.BLACK) { + conf.set("color", signColor.name()); + } return conf; } } @@ -49,14 +58,25 @@ public class BlockStateCodecSign implements BlockStateCodec { public void deserialize(BlockState state, YamlConfiguration conf) { if (state instanceof Sign) { Sign sign = (Sign) state; + DyeColor signColor = DyeColor.BLACK; List lines = Collections.emptyList(); if (conf != null) { - lines = conf.getStringList("lines"); + if (conf.contains("lines")) { + lines = conf.getStringList("lines"); + } + if (conf.contains("color")) { + try { + signColor = DyeColor.valueOf(conf.getString("color")); + } catch (IllegalArgumentException | NullPointerException e) { + // ignored + } + } } for (int i = 0; i < 4; i++) { String line = lines.size() > i && lines.get(i) != null ? lines.get(i) : ""; sign.setLine(i, line); } + sign.setColor(signColor); } } diff --git a/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java index b89656a..743c39e 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/InteractLogging.java @@ -5,12 +5,15 @@ import de.diddiz.LogBlock.LogBlock; import de.diddiz.LogBlock.Logging; import de.diddiz.LogBlock.config.WorldConfig; import de.diddiz.util.BukkitUtils; +import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Note; import org.bukkit.Note.Tone; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; import org.bukkit.block.data.Openable; @@ -178,23 +181,60 @@ public class InteractLogging extends LoggingListener { } } break; - default: - if (BukkitUtils.isButton(type) || type == Material.LEVER) { - if (wcfg.isLogging(Logging.SWITCHINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - Switch newBlockData = (Switch) blockData.clone(); - if (!newBlockData.isPowered() || type == Material.LEVER) { - newBlockData.setPowered(!newBlockData.isPowered()); + case OAK_DOOR: + case SPRUCE_DOOR: + case BIRCH_DOOR: + case JUNGLE_DOOR: + case ACACIA_DOOR: + case DARK_OAK_DOOR: + if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { + Door newBlockData = (Door) blockData.clone(); + newBlockData.setOpen(!newBlockData.isOpen()); + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); + } + break; + case STONE_BUTTON: + case OAK_BUTTON: + case SPRUCE_BUTTON: + case BIRCH_BUTTON: + case JUNGLE_BUTTON: + case ACACIA_BUTTON: + case DARK_OAK_BUTTON: + case LEVER: + if (wcfg.isLogging(Logging.SWITCHINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { + Switch newBlockData = (Switch) blockData.clone(); + if (!newBlockData.isPowered() || type == Material.LEVER) { + newBlockData.setPowered(!newBlockData.isPowered()); + } + consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); + } + break; + case OAK_SIGN: + case SPRUCE_SIGN: + case BIRCH_SIGN: + case JUNGLE_SIGN: + case ACACIA_SIGN: + case DARK_OAK_SIGN: + case OAK_WALL_SIGN: + case SPRUCE_WALL_SIGN: + case BIRCH_WALL_SIGN: + case JUNGLE_WALL_SIGN: + case ACACIA_WALL_SIGN: + case DARK_OAK_WALL_SIGN: + ItemStack stack = event.getItem(); + if (stack != null && BukkitUtils.isDye(stack.getType())) { + final BlockState before = event.getClickedBlock().getState(); + if (before instanceof Sign) { + DyeColor newColor = BukkitUtils.dyeToDyeColor(stack.getType()); + Sign signBefore = (Sign) before; + if (newColor != null && signBefore.getColor() != newColor) { + final Sign signAfter = (Sign) event.getClickedBlock().getState(); + signAfter.setColor(newColor); + consumer.queueBlockReplace(Actor.actorFromEntity(player), signBefore, signAfter); } - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); - } - } - if (BukkitUtils.isWoodenDoor(type)) { - if (wcfg.isLogging(Logging.DOORINTERACT) && event.getAction() == Action.RIGHT_CLICK_BLOCK) { - Door newBlockData = (Door) blockData.clone(); - newBlockData.setOpen(!newBlockData.isOpen()); - consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, newBlockData); } } + default: } } } diff --git a/src/main/java/de/diddiz/util/BukkitUtils.java b/src/main/java/de/diddiz/util/BukkitUtils.java index fea1162..651dc9d 100644 --- a/src/main/java/de/diddiz/util/BukkitUtils.java +++ b/src/main/java/de/diddiz/util/BukkitUtils.java @@ -50,6 +50,7 @@ public class BukkitUtils { private static final EnumSet woodenDoors; private static final EnumSet slabs; private static final EnumSet concreteBlocks; + private static final EnumMap dyes; static { pressurePlates = EnumSet.noneOf(Material.class); @@ -393,6 +394,24 @@ public class BukkitUtils { concreteBlocks.add(Material.RED_CONCRETE); concreteBlocks.add(Material.WHITE_CONCRETE); concreteBlocks.add(Material.YELLOW_CONCRETE); + + dyes = new EnumMap<>(Material.class); + dyes.put(Material.BLACK_DYE, DyeColor.BLACK); + dyes.put(Material.BLUE_DYE, DyeColor.BLUE); + dyes.put(Material.LIGHT_GRAY_DYE, DyeColor.LIGHT_GRAY); + dyes.put(Material.BROWN_DYE, DyeColor.BROWN); + dyes.put(Material.CYAN_DYE, DyeColor.CYAN); + dyes.put(Material.GRAY_DYE, DyeColor.GRAY); + dyes.put(Material.GREEN_DYE, DyeColor.GREEN); + dyes.put(Material.LIGHT_BLUE_DYE, DyeColor.LIGHT_BLUE); + dyes.put(Material.MAGENTA_DYE, DyeColor.MAGENTA); + dyes.put(Material.LIME_DYE, DyeColor.LIME); + dyes.put(Material.ORANGE_DYE, DyeColor.ORANGE); + dyes.put(Material.PINK_DYE, DyeColor.PINK); + dyes.put(Material.PURPLE_DYE, DyeColor.PURPLE); + dyes.put(Material.RED_DYE, DyeColor.RED); + dyes.put(Material.WHITE_DYE, DyeColor.WHITE); + dyes.put(Material.YELLOW_DYE, DyeColor.YELLOW); } private static final BlockFace[] relativeBlockFaces = new BlockFace[]{ @@ -727,6 +746,14 @@ public class BukkitUtils { return bedBlocks.contains(type); } + public static boolean isDye(Material type) { + return dyes.containsKey(type); + } + + public static DyeColor dyeToDyeColor(Material type) { + return dyes.get(type); + } + public static Block getConnectedChest(Block chestBlock) { // is this a chest? BlockData blockData = chestBlock.getBlockData();