diff --git a/src/main/java/net/neganote/gtutilities/common/item/InfiniteSprayCanBehaviour.java b/src/main/java/net/neganote/gtutilities/common/item/InfiniteSprayCanBehaviour.java index 3a0bab9..88d7a58 100644 --- a/src/main/java/net/neganote/gtutilities/common/item/InfiniteSprayCanBehaviour.java +++ b/src/main/java/net/neganote/gtutilities/common/item/InfiniteSprayCanBehaviour.java @@ -32,6 +32,7 @@ import net.minecraft.world.level.block.StainedGlassPaneBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Property; import net.minecraftforge.common.Tags; @@ -183,6 +184,10 @@ private boolean handleSpecialBlockEntities(BlockEntity first, DyeColor color, in var player = context.getPlayer(); if (player == null) return false; + if (first instanceof SignBlockEntity sign) { + return handleSignRecolor(sign, color, context); + } + if (GTCEu.Mods.isAE2Loaded() && first instanceof IColorableBlockEntity) { var collected = BreadthFirstBlockSearch.conditionalSearch( IColorableBlockEntity.class, @@ -237,6 +242,38 @@ else if (first instanceof ShulkerBoxBlockEntity shulkerBox) { return false; } + private boolean handleSignRecolor(SignBlockEntity sign, @Nullable DyeColor color, UseOnContext context) { + Level level = context.getLevel(); + Player player = context.getPlayer(); + if (player == null) return false; + + boolean isFront = sign.isFacingFrontText(player); + + var signText = sign.getText(isFront); + + if (sign.isWaxed()) return false; + + DyeColor targetColor = (color == null) ? DyeColor.BLACK : color; + boolean changed = false; + + if (signText.getColor() != targetColor) { + sign.updateText(text -> text.setColor(targetColor), isFront); + changed = true; + } + + if (color == null && signText.hasGlowingText()) { + sign.updateText(text -> text.setHasGlowingText(false), isFront); + changed = true; + } + + if (changed && level != null) { + level.sendBlockUpdated(sign.getBlockPos(), sign.getBlockState(), sign.getBlockState(), 3); + return true; + } + + return false; + } + private void paintPaintables(Set paintables, DyeColor color) { for (var c : paintables) { paintPaintable(c, color);