From c7a5775e007e01ed1c8d3bf08fe57f9849c39579 Mon Sep 17 00:00:00 2001 From: Pasqual Koschmieder Date: Sat, 28 Jun 2025 00:16:37 +0200 Subject: [PATCH 1/3] feat: split sign text color and glowing setting --- .../signs/configuration/SignLayout.java | 21 ++-- .../NodeSignsConfigurationHelper.java | 96 +++++++++++++++++-- .../platform/bukkit/BukkitCompatibility.java | 35 +++++-- .../platform/bukkit/BukkitPlatformSign.java | 5 +- .../minestom/MinestomPlatformSign.java | 47 +++++---- .../minestom/MinestomSignBlockHandler.java | 25 ++--- .../minestom/functionality/SignsCommand.java | 16 ++-- .../platform/nukkit/NukkitPlatformSign.java | 15 ++- .../platform/sponge/SpongePlatformSign.java | 5 +- 9 files changed, 199 insertions(+), 66 deletions(-) diff --git a/modules/signs/api/src/main/java/eu/cloudnetservice/modules/signs/configuration/SignLayout.java b/modules/signs/api/src/main/java/eu/cloudnetservice/modules/signs/configuration/SignLayout.java index 34fa823238..4cff6314ff 100644 --- a/modules/signs/api/src/main/java/eu/cloudnetservice/modules/signs/configuration/SignLayout.java +++ b/modules/signs/api/src/main/java/eu/cloudnetservice/modules/signs/configuration/SignLayout.java @@ -27,7 +27,8 @@ public record SignLayout( @NonNull List lines, @NonNull String blockMaterial, int blockSubId, - @Nullable String glowingColor + @Nullable String textColor, + boolean textGlowing ) { public static @NonNull Builder builder() { @@ -39,7 +40,8 @@ public record SignLayout( .lines(new ArrayList<>(signLayout.lines())) .blockMaterial(signLayout.blockMaterial()) .blockSubId(signLayout.blockSubId()) - .glowingColor(signLayout.glowingColor()); + .textColor(signLayout.textColor()) + .textGlowing(signLayout.textGlowing()); } public static class Builder { @@ -47,7 +49,8 @@ public static class Builder { private List lines; private String blockMaterial; private int blockSubId = -1; - private String glowingColor; + private String textColor; + private boolean textGlowing; public @NonNull Builder lines(@NonNull Collection lines) { this.lines = new ArrayList<>(lines); @@ -68,8 +71,13 @@ public static class Builder { return this; } - public @NonNull Builder glowingColor(@Nullable String glowingColor) { - this.glowingColor = glowingColor; + public @NonNull Builder textColor(@Nullable String textColor) { + this.textColor = textColor; + return this; + } + + public @NonNull Builder textGlowing(boolean textGlowing) { + this.textGlowing = textGlowing; return this; } @@ -77,8 +85,7 @@ public static class Builder { Preconditions.checkNotNull(this.lines, "Missing lines"); Preconditions.checkNotNull(this.blockMaterial, "Missing block material"); - return new SignLayout(this.lines, this.blockMaterial, this.blockSubId, this.glowingColor); + return new SignLayout(this.lines, this.blockMaterial, this.blockSubId, this.textColor, this.textGlowing); } } - } diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/node/configuration/NodeSignsConfigurationHelper.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/node/configuration/NodeSignsConfigurationHelper.java index aa5a80bea6..fdfcf96684 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/node/configuration/NodeSignsConfigurationHelper.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/node/configuration/NodeSignsConfigurationHelper.java @@ -25,7 +25,10 @@ import eu.cloudnetservice.modules.signs.configuration.SignsConfiguration; import eu.cloudnetservice.modules.signs.impl._deprecated.configuration.SignConfigurationReaderAndWriter; import eu.cloudnetservice.modules.signs.impl._deprecated.configuration.entry.SignLayoutConfiguration; +import io.leangen.geantyref.TypeFactory; +import java.lang.reflect.Type; import java.nio.file.Path; +import java.util.List; import java.util.stream.Collectors; import lombok.NonNull; import org.jetbrains.annotations.Contract; @@ -47,25 +50,104 @@ public static void write(@NonNull SignsConfiguration configuration, @NonNull Pat public static SignsConfiguration read(@NonNull Path path) { var configurationDocument = DocumentFactory.json().parse(path); if (configurationDocument.contains("config")) { - // write the new configuration file + // convert the old v3 configuration var configuration = convertOldConfiguration(configurationDocument, path); write(configuration, path); - // notify that the convert was successful LOGGER.info("Successfully converted the old signs configuration file"); - // no need to load the configuration from the file again return configuration; } - // check if the configuration file already exists + if (configurationDocument.empty()) { - // create a new configuration entry + // initial config load: create a new, blank config entry var configuration = SignsConfiguration.builder() .modifyEntries(entries -> entries.add(SignConfigurationType.JAVA.createEntry("Lobby"))) .build(); write(configuration, path); return configuration; } - // the document contains a configuration - return configurationDocument.toInstanceOf(SignsConfiguration.class); + + // document contains a modern configuration, load that - migrate if necessary + convertGlowingColor(configurationDocument); + var configuration = configurationDocument.toInstanceOf(SignsConfiguration.class); + write(configuration, path); + return configuration; + } + + /** + * Converts the old {@code glowingColor} setting for all config entries in the given config document. + * + * @param configDocument the config document to convert. + * @throws NullPointerException if the given config document is null. + */ + private static void convertGlowingColor(@NonNull Document.Mutable configDocument) { + var listDocumentType = TypeFactory.parameterizedClass(List.class, Document.class); + var layoutNames = List.of("searchingLayout", "startingLayout", "emptyLayout", "onlineLayout", "fullLayout"); + + List configEntries = configDocument.readObject("entries", listDocumentType); + for (var entryIndex = 0; entryIndex < configEntries.size(); entryIndex++) { + // convert top-level layouts + var configEntry = configEntries.get(entryIndex).mutableCopy(); + convertGlowingInConfig(configEntry, listDocumentType, layoutNames); + + // convert group-level layouts + List groupConfigurations = configEntry.readObject("groupConfigurations", listDocumentType); + for (var groupIndex = 0; groupIndex < groupConfigurations.size(); groupIndex++) { + var groupConfig = groupConfigurations.get(groupIndex).mutableCopy(); + convertGlowingInConfig(groupConfig, listDocumentType, layoutNames); + groupConfigurations.set(groupIndex, groupConfig); + } + configEntry.append("groupConfigurations", groupConfigurations); + + // update the config entry + configEntries.set(entryIndex, configEntry); + } + + // copy the modified config entries into the source document + configDocument.append("entries", configEntries); + } + + /** + * Converts the old {@code glowingColor} setting for all layout holders in the given config document. + * + * @param config the config document to convert. + * @param listDocumentType type representing a list of documents. + * @param layoutNames the layout property names to convert. + * @throws NullPointerException if the given config document, list type or layout names is null. + */ + private static void convertGlowingInConfig( + @NonNull Document.Mutable config, + @NonNull Type listDocumentType, + @NonNull List layoutNames + ) { + for (var layoutName : layoutNames) { + var holder = config.readMutableDocument(layoutName, null); + if (holder != null) { + List layouts = holder.readObject("signLayouts", listDocumentType); + for (var index = 0; index < layouts.size(); index++) { + var layout = layouts.get(index).mutableCopy(); + if (layout.contains("glowingColor")) { + var glowingColor = layout.getString("glowingColor"); + if (glowingColor != null) { + // glowing color was set, enable text color and glowing + layout.append("textColor", glowingColor); + layout.append("textGlowing", true); + } else { + // glowing color was not set, no need to enable text color or glowing + layout.appendNull("textColor"); + layout.append("textGlowing", false); + } + + // remove old glowing color property, update document + layout.remove("glowingColor"); + layouts.set(index, layout); + } + } + + // update the sign layouts with the modified variant in the holder document and then in the original config + holder.append("signLayouts", layouts); + config.append(layoutName, holder); + } + } } // convert of old configuration file diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitCompatibility.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitCompatibility.java index b964485d39..5d10791a12 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitCompatibility.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitCompatibility.java @@ -284,23 +284,40 @@ private static void logExceptionMessage(@NonNull String baseMessage, @Nullable S } /** - * Enables the glowing effect for the given signs if the layout has a glowing color defined. + * Applies the text color defined in the given layout to the given sign. Falls back to black if not defined. + * + * @param sign the sign to apply the text color to. + * @param layout the layout to get the text color from. + * @throws NullPointerException if the given sign or layout is null. + */ + public static void signTextColor(@NonNull org.bukkit.block.Sign sign, @NonNull SignLayout layout) { + if (SIGN_SET_TEXT_COLOR != null) { + try { + var textColor = layout.textColor(); + var dyeColor = switch (textColor) { + case String string -> Enums.getIfPresent(DyeColor.class, StringUtil.toUpper(string)).or(DyeColor.BLACK); + case null -> DyeColor.BLACK; + }; + SIGN_SET_TEXT_COLOR.apply(sign, dyeColor); + } catch (Throwable throwable) { + logExceptionMessage("Unable to set sign text color: {}", throwable.getMessage()); + } + } + } + + /** + * Enables the glowing effect for the given signs if the given layout has that feature enabled. * * @param sign the sign to enable the glowing effect for. * @param layout the layout to resolve the glowing effect from. * @throws NullPointerException if the given target sign or sign layout is null. */ public static void signGlowing(@NonNull org.bukkit.block.Sign sign, @NonNull SignLayout layout) { - var glowingColor = layout.glowingColor(); - if (SIGN_SET_GLOWING != null && SIGN_SET_TEXT_COLOR != null && glowingColor != null) { + if (SIGN_SET_GLOWING != null) { try { - var dyeColor = Enums.getIfPresent(DyeColor.class, StringUtil.toUpper(glowingColor)).orNull(); - if (dyeColor != null) { - SIGN_SET_GLOWING.apply(sign, Boolean.TRUE); - SIGN_SET_TEXT_COLOR.apply(sign, dyeColor); - } + SIGN_SET_GLOWING.apply(sign, layout.textGlowing()); } catch (Throwable throwable) { - logExceptionMessage("Unable to sign glowing: {}", throwable.getMessage()); + logExceptionMessage("Unable to set sign glowing: {}", throwable.getMessage()); } } } diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java index 47f2f6bb94..52a08ec1d1 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java @@ -77,7 +77,6 @@ public boolean needsUpdates() { // check if the associated chunk is loaded var chunkX = NumberConversions.floor(location.getX()) >> 4; var chunkZ = NumberConversions.floor(location.getZ()) >> 4; - return location.getWorld().isChunkLoaded(chunkX, chunkZ); } @@ -90,11 +89,11 @@ public void updateSign(@NonNull SignLayout layout) { return; } - // get the block at the given location var state = location.getBlock().getState(); if (state instanceof org.bukkit.block.Sign sign) { - // set the glowing status if needed + // set the text color and glowing stated BukkitCompatibility.signGlowing(sign, layout); + BukkitCompatibility.signTextColor(sign, layout); // set the sign lines this.changeSignLines(layout, (line, text) -> BukkitCompatibility.signLine(sign, line, text)); diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java index 4871462270..c7d983dce8 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java @@ -16,20 +16,23 @@ package eu.cloudnetservice.modules.signs.impl.platform.minestom; +import com.google.common.base.Enums; import eu.cloudnetservice.driver.registry.ServiceRegistry; import eu.cloudnetservice.driver.service.ServiceInfoSnapshot; -import eu.cloudnetservice.ext.adventure.AdventureTextFormatLookup; import eu.cloudnetservice.ext.component.ComponentFormats; import eu.cloudnetservice.modules.signs.Sign; import eu.cloudnetservice.modules.signs.configuration.SignLayout; import eu.cloudnetservice.modules.signs.impl.platform.PlatformSign; import eu.cloudnetservice.modules.signs.impl.platform.minestom.event.MinestomCloudSignInteractEvent; +import eu.cloudnetservice.utils.base.StringUtil; import io.vavr.Tuple2; import java.util.UUID; import lombok.NonNull; import net.kyori.adventure.nbt.CompoundBinaryTag; -import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.nbt.ListBinaryTag; +import net.kyori.adventure.nbt.StringBinaryTag; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.minestom.server.color.DyeColor; import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; import net.minestom.server.event.GlobalEventHandler; @@ -86,27 +89,35 @@ public boolean needsUpdates() { public void updateSign(@NonNull SignLayout layout) { var location = this.signLocation(); if (location != null) { - - // construct the sign data in this binary compound - var compound = CompoundBinaryTag.builder(); - - // set the sign glowing if requested - var glowingColor = layout.glowingColor(); - if (glowingColor != null && glowingColor.length() == 1) { - var color = AdventureTextFormatLookup.findColor(glowingColor.charAt(0)); - - compound.putBoolean("GlowingText", color != null); - compound.putString("Color", color == null ? NamedTextColor.WHITE.toString() : color.toString()); - } - - // set the sign lines - this.changeSignLines(layout, (index, line) -> compound.putString("Text" + (index + 1), line)); + // set the glowing state + var textCompound = CompoundBinaryTag.builder(); + textCompound.putBoolean("has_glowing_text", layout.textGlowing()); + + // set the text color + var textColor = layout.textColor(); + var dyeColor = switch (textColor) { + case String string -> Enums.getIfPresent(DyeColor.class, StringUtil.toUpper(string)).or(DyeColor.BLACK); + case null -> DyeColor.BLACK; + }; + var serializedColor = DyeColor.NBT_TYPE.write(dyeColor); + textCompound.put("color", serializedColor); + + // set the sign lines - they are provided as legacy text components and need to be converted to JSON + var linesCompound = ListBinaryTag.builder(); + this.changeSignLines(layout, (_, line) -> linesCompound.add(StringBinaryTag.stringBinaryTag(line))); + textCompound.put("messages", linesCompound.build()); + + // build the final sign compound + var signCompound = CompoundBinaryTag.builder(); + signCompound.putBoolean("is_waxed", false); + signCompound.put("front_text", textCompound.build()); + signCompound.put("back_text", textCompound.build()); // set the block at the position var block = location._2().getBlock(location._1()); location._2().setBlock( location._1(), - block.withHandler(MinestomSignBlockHandler.SIGN_BLOCK_HANDLER).withNbt(compound.build())); + block.withHandler(MinestomSignBlockHandler.SIGN_BLOCK_HANDLER).withNbt(signCompound.build())); } } diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignBlockHandler.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignBlockHandler.java index c0e2a66742..5d7daaebfa 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignBlockHandler.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignBlockHandler.java @@ -26,26 +26,29 @@ final class MinestomSignBlockHandler implements BlockHandler { public static final MinestomSignBlockHandler SIGN_BLOCK_HANDLER = new MinestomSignBlockHandler(); - private static final List> ENTITY_TAGS = List.of( - Tag.Byte("GlowingText"), - Tag.String("Color"), - Tag.String("Text1"), - Tag.String("Text2"), - Tag.String("Text3"), - Tag.String("Text4")); private static final Key SIGN_NAMESPACE = Key.key("minecraft", "sign"); + private static final List> SIGN_ENTITY_TAGS = List.of( + Tag.Byte("is_waxed"), + Tag.NBT("front_text"), + Tag.NBT("back_text")); private MinestomSignBlockHandler() { } + /** + * {@inheritDoc} + */ @Override - public @NonNull Collection> getBlockEntityTags() { - return ENTITY_TAGS; + public @NonNull Key getKey() { + return SIGN_NAMESPACE; } + /** + * {@inheritDoc} + */ @Override - public @NonNull Key getKey() { - return SIGN_NAMESPACE; + public @NonNull Collection> getBlockEntityTags() { + return SIGN_ENTITY_TAGS; } } diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/functionality/SignsCommand.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/functionality/SignsCommand.java index f9e250b5f0..dc1a494d53 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/functionality/SignsCommand.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/functionality/SignsCommand.java @@ -40,6 +40,7 @@ @Singleton public class SignsCommand extends Command { + private static final ArgumentLiteral CREATE_LITERAL = new ArgumentLiteral("create"); private static final ArgumentLiteral REMOVE_LITERAL = new ArgumentLiteral("remove"); private static final ArgumentLiteral REMOVE_ALL_LITERAL = new ArgumentLiteral("removeAll"); private static final ArgumentLiteral CLEANUP_LITERAL = new ArgumentLiteral("cleanup"); @@ -58,18 +59,16 @@ public SignsCommand( @NonNull MinestomBridgeManagement bridgeManagement ) { super("cloudsign", "cs", "signs", "cloudsigns"); + this.signManagement = signManagement; - this.world = new ArgumentString("world"); this.template = this.createTemplatePathArgument(i18n); this.targetGroup = this.createTargetGroupArgument(i18n, groupProvider); - this.signManagement = signManagement; - - var createLiteral = new ArgumentLiteral("create"); + this.world = new ArgumentString("world").setDefaultValue(() -> null); CommandCondition defaultCondition = (sender, _) -> sender instanceof Player player && bridgeManagement.permissionFunction().apply(player, "cloudnet.command.cloudsign"); - this.addConditionalSyntax(defaultCondition, this::handleCreate, createLiteral, this.targetGroup, this.template); + this.addConditionalSyntax(defaultCondition, this::handleCreate, CREATE_LITERAL, this.targetGroup, this.template); this.addConditionalSyntax(defaultCondition, this::handleRemove, REMOVE_LITERAL); this.addConditionalSyntax(defaultCondition, this::handleRemoveAll, REMOVE_ALL_LITERAL); this.addConditionalSyntax(defaultCondition, this::handleCleanup, CLEANUP_LITERAL, this.world); @@ -79,7 +78,10 @@ public SignsCommand( private @NonNull Argument createTemplatePathArgument(@NonNull @Service I18n i18n) { return new ArgumentString("templatePath") { @Override - public @NonNull String parse(@NonNull CommandSender sender, @NonNull String input) throws ArgumentSyntaxException { + public @NonNull String parse( + @NonNull CommandSender sender, + @NonNull String input + ) throws ArgumentSyntaxException { var template = ServiceTemplate.parse(input); if (template == null) { throw new ArgumentSyntaxException(i18n.translate("command-template-not-valid"), input, -1); @@ -206,8 +208,8 @@ private void handleRemoveAll(@NonNull CommandSender sender, @NonNull CommandCont } private void handleCleanup(@NonNull CommandSender sender, @NonNull CommandContext context) { - var world = context.getOrDefault(this.world, ((Player) sender).getInstance().getUniqueId().toString()); // removes all signs on which location is not a sign anymore + var world = context.getOrDefault(this.world, ((Player) sender).getInstance().getUniqueId().toString()); var removed = this.signManagement.removeMissingSigns(world); SignsConfiguration.sendMessage( "command-cloudsign-cleanup-success", diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/nukkit/NukkitPlatformSign.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/nukkit/NukkitPlatformSign.java index 77552ee1b1..b73b143848 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/nukkit/NukkitPlatformSign.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/nukkit/NukkitPlatformSign.java @@ -24,8 +24,10 @@ import cn.nukkit.level.Location; import cn.nukkit.math.BlockFace; import cn.nukkit.plugin.PluginManager; +import cn.nukkit.utils.DyeColor; import cn.nukkit.utils.Faceable; import cn.nukkit.utils.TextFormat; +import com.google.common.base.Enums; import com.google.common.primitives.Ints; import eu.cloudnetservice.driver.registry.ServiceRegistry; import eu.cloudnetservice.driver.service.ServiceInfoSnapshot; @@ -33,6 +35,7 @@ import eu.cloudnetservice.modules.signs.configuration.SignLayout; import eu.cloudnetservice.modules.signs.impl.platform.PlatformSign; import eu.cloudnetservice.modules.signs.impl.platform.nukkit.event.NukkitCloudSignInteractEvent; +import eu.cloudnetservice.utils.base.StringUtil; import java.util.Arrays; import lombok.NonNull; import org.jetbrains.annotations.Nullable; @@ -94,8 +97,16 @@ public void updateSign(@NonNull SignLayout layout) { // get the block at the given location var blockEntity = location.getLevel().getBlockEntity(location); if (blockEntity instanceof BlockEntitySign sign) { - // set the glowing status if needed - sign.setGlowing(layout.glowingColor() != null); + // set the glowing state + sign.setGlowing(layout.textGlowing()); + + // set the sign text color + var textColor = layout.textColor(); + var dyeColor = switch (textColor) { + case String string -> Enums.getIfPresent(DyeColor.class, StringUtil.toUpper(string)).or(DyeColor.BLACK); + case null -> DyeColor.BLACK; + }; + sign.setColor(dyeColor.getColor()); // remove all old sign lines from the lines buffer // this is not thread safe at all, but updates to the sign should only be made from the server primary thread diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/sponge/SpongePlatformSign.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/sponge/SpongePlatformSign.java index b25a9a9155..1ace134e16 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/sponge/SpongePlatformSign.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/sponge/SpongePlatformSign.java @@ -98,8 +98,9 @@ public void updateSign(@NonNull SignLayout layout) { // get the block at the given location var entity = location.blockEntity().orElse(null); if (entity instanceof org.spongepowered.api.block.entity.Sign sign) { - // set the glowing status if needed - sign.glowingText().set(layout.glowingColor() != null); + // set the glowing state + sign.glowingText().set(layout.textGlowing()); + // TODO: support text color // set the sign lines List lines = new ArrayList<>(4); From 6b319692b690729762f7d82e475dbea522784465 Mon Sep 17 00:00:00 2001 From: Pasqual Koschmieder Date: Sun, 29 Jun 2025 09:45:40 +0200 Subject: [PATCH 2/3] fix typo --- .../modules/signs/impl/platform/bukkit/BukkitPlatformSign.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java index 52a08ec1d1..03deda927e 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/bukkit/BukkitPlatformSign.java @@ -91,7 +91,7 @@ public void updateSign(@NonNull SignLayout layout) { var state = location.getBlock().getState(); if (state instanceof org.bukkit.block.Sign sign) { - // set the text color and glowing stated + // set the text color and glowing state BukkitCompatibility.signGlowing(sign, layout); BukkitCompatibility.signTextColor(sign, layout); From a13b1945a5e334553e3355264569f8d30db18eee Mon Sep 17 00:00:00 2001 From: Pasqual Koschmieder Date: Sun, 29 Jun 2025 16:54:04 +0200 Subject: [PATCH 3/3] adapt to minestom update changes --- .../platform/minestom/MinestomPlatformSign.java | 15 +++++++++------ .../platform/minestom/MinestomSignManagement.java | 5 +++-- .../event/MinestomCloudSignInteractEvent.java | 6 +++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java index c7d983dce8..b403f8fa0c 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomPlatformSign.java @@ -28,10 +28,11 @@ import io.vavr.Tuple2; import java.util.UUID; import lombok.NonNull; +import net.kyori.adventure.nbt.BinaryTag; import net.kyori.adventure.nbt.CompoundBinaryTag; import net.kyori.adventure.nbt.ListBinaryTag; -import net.kyori.adventure.nbt.StringBinaryTag; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.minestom.server.adventure.serializer.nbt.NbtComponentSerializer; +import net.minestom.server.codec.Transcoder; import net.minestom.server.color.DyeColor; import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; @@ -40,7 +41,7 @@ import net.minestom.server.instance.InstanceManager; import org.jetbrains.annotations.Nullable; -public class MinestomPlatformSign extends PlatformSign { +public class MinestomPlatformSign extends PlatformSign { private final GlobalEventHandler eventHandler; private final InstanceManager instanceManager; @@ -55,7 +56,7 @@ public MinestomPlatformSign( ) { super(base, serviceRegistry, input -> { var coloredComponent = ComponentFormats.BUNGEE_TO_ADVENTURE.convert(input); - return GsonComponentSerializer.gson().serialize(coloredComponent); + return NbtComponentSerializer.nbt().serialize(coloredComponent); }); this.eventHandler = eventHandler; @@ -99,12 +100,14 @@ public void updateSign(@NonNull SignLayout layout) { case String string -> Enums.getIfPresent(DyeColor.class, StringUtil.toUpper(string)).or(DyeColor.BLACK); case null -> DyeColor.BLACK; }; - var serializedColor = DyeColor.NBT_TYPE.write(dyeColor); + var serializedColor = DyeColor.CODEC + .encode(Transcoder.NBT, dyeColor) + .orElseThrow("could not transcode dye color " + dyeColor + " to nbt"); textCompound.put("color", serializedColor); // set the sign lines - they are provided as legacy text components and need to be converted to JSON var linesCompound = ListBinaryTag.builder(); - this.changeSignLines(layout, (_, line) -> linesCompound.add(StringBinaryTag.stringBinaryTag(line))); + this.changeSignLines(layout, (_, line) -> linesCompound.add(line)); textCompound.put("messages", linesCompound.build()); // build the final sign compound diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignManagement.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignManagement.java index 0b3fbc76ee..603a90771a 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignManagement.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/MinestomSignManagement.java @@ -35,6 +35,7 @@ import jakarta.inject.Singleton; import java.util.concurrent.ScheduledExecutorService; import lombok.NonNull; +import net.kyori.adventure.nbt.BinaryTag; import net.minestom.server.ServerFlag; import net.minestom.server.coordinate.Point; import net.minestom.server.entity.Player; @@ -51,7 +52,7 @@ InternalSignManagement.class, SignManagement.class }) -public class MinestomSignManagement extends PlatformSignManagement, String> { +public class MinestomSignManagement extends PlatformSignManagement, BinaryTag> { private final ServiceRegistry serviceRegistry; private final GlobalEventHandler eventHandler; @@ -135,7 +136,7 @@ protected void startKnockbackTask() { } @Override - protected @NonNull PlatformSign createPlatformSign(@NonNull Sign base) { + protected @NonNull PlatformSign createPlatformSign(@NonNull Sign base) { return new MinestomPlatformSign(base, this.serviceRegistry, this.eventHandler, this.instanceManager); } } diff --git a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/event/MinestomCloudSignInteractEvent.java b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/event/MinestomCloudSignInteractEvent.java index fac17bb8b5..49a7e0c6e6 100644 --- a/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/event/MinestomCloudSignInteractEvent.java +++ b/modules/signs/impl/src/main/java/eu/cloudnetservice/modules/signs/impl/platform/minestom/event/MinestomCloudSignInteractEvent.java @@ -26,12 +26,12 @@ public class MinestomCloudSignInteractEvent implements CancellableEvent { private final Player player; - private final PlatformSign sign; + private final PlatformSign sign; private boolean cancelled; private ServiceInfoSnapshot target; - public MinestomCloudSignInteractEvent(@NonNull Player player, @NonNull PlatformSign sign) { + public MinestomCloudSignInteractEvent(@NonNull Player player, @NonNull PlatformSign sign) { this.player = player; this.sign = sign; this.target = sign.currentTarget(); @@ -41,7 +41,7 @@ public MinestomCloudSignInteractEvent(@NonNull Player player, @NonNull PlatformS return this.player; } - public @NonNull PlatformSign clickedSign() { + public @NonNull PlatformSign clickedSign() { return this.sign; }