Log sign base color change

This commit is contained in:
Brokkonaut
2019-05-27 22:46:32 +02:00
parent f6522b73f4
commit 4fda020dfc
3 changed files with 105 additions and 18 deletions

View File

@ -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<String> 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);
}
}

View File

@ -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:
}
}
}

View File

@ -50,6 +50,7 @@ public class BukkitUtils {
private static final EnumSet<Material> woodenDoors;
private static final EnumSet<Material> slabs;
private static final EnumSet<Material> concreteBlocks;
private static final EnumMap<Material, DyeColor> 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();