From c363778324590088b33d5279d08015a8ecd3aa29 Mon Sep 17 00:00:00 2001 From: Justin <33465177+BitByLogics@users.noreply.github.com> Date: Mon, 16 Jun 2025 19:25:05 -0400 Subject: [PATCH 1/4] Use vanilla text display background color --- .../de/oliver/fancyholograms/api/data/TextHologramData.java | 2 +- .../java/de/oliver/fancyholograms/api/hologram/Hologram.java | 1 + .../oliver/fancyholograms/commands/hologram/BackgroundCMD.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java index 83f64213c..097044549 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java @@ -21,7 +21,7 @@ public class TextHologramData extends DisplayHologramData { public static final int DEFAULT_TEXT_UPDATE_INTERVAL = -1; private List text; - private Color background; + private Color background = Hologram.DEFAULT_BACKGROUND; private TextDisplay.TextAlignment textAlignment = DEFAULT_TEXT_ALIGNMENT; private boolean textShadow = DEFAULT_TEXT_SHADOW_STATE; private boolean seeThrough = DEFAULT_SEE_THROUGH; diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java index 48cacb90d..a8e51d47f 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/Hologram.java @@ -32,6 +32,7 @@ public abstract class Hologram { public static final int LINE_WIDTH = 1000; public static final Color TRANSPARENT = Color.fromARGB(0); + public static final Color DEFAULT_BACKGROUND = Color.fromARGB(64, 0, 0, 0); protected static final int MINIMUM_PROTOCOL_VERSION = 762; protected final @NotNull HologramData data; diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/BackgroundCMD.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/BackgroundCMD.java index 1c3a9f5fb..932652f3c 100644 --- a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/BackgroundCMD.java +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/BackgroundCMD.java @@ -42,7 +42,7 @@ public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @ final Color background; if (color.equals("reset") || color.equals("default")) { - background = null; + background = Hologram.DEFAULT_BACKGROUND; } else { if (color.equals("transparent")) { background = Hologram.TRANSPARENT; From fc90044a8ed2c2ecc133fb019dd413d60154c1ff Mon Sep 17 00:00:00 2001 From: Justin <33465177+BitByLogics@users.noreply.github.com> Date: Mon, 16 Jun 2025 19:25:15 -0400 Subject: [PATCH 2/4] Implement opacity command --- .../api/hologram/HologramType.java | 2 +- .../fancyholograms/commands/HologramCMD.java | 2 + .../commands/hologram/OpacityCMD.java | 80 +++++++++++++++++++ .../oliver/fancyholograms/util/Constants.java | 1 + 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java index 432fcdd82..0035be7d9 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/hologram/HologramType.java @@ -4,7 +4,7 @@ import java.util.List; public enum HologramType { - TEXT(Arrays.asList("background", "textshadow", "textalignment", "seethrough", "setline", "removeline", "addline", "insertbefore", "insertafter", "updatetextinterval")), + TEXT(Arrays.asList("background", "opacity", "textshadow", "textalignment", "seethrough", "setline", "removeline", "addline", "insertbefore", "insertafter", "updatetextinterval")), ITEM(List.of("item")), BLOCK(List.of("block")); diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/HologramCMD.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/HologramCMD.java index 6e0821a35..0b3e42600 100644 --- a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/HologramCMD.java +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/HologramCMD.java @@ -200,6 +200,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, @No yield colors.stream(); } + case "opacity" -> Stream.of("0", "0.25", "0.5", "0.75", "1"); case "textshadow" -> { TextHologramData textData = (TextHologramData) hologram.getData(); yield Stream.of(!textData.hasTextShadow()).map(Object::toString); @@ -331,6 +332,7 @@ private boolean edit(@NotNull final CommandSender player, @NotNull final Hologra // text data case "background" -> new BackgroundCMD().run(player, hologram, args); + case "opacity" -> new OpacityCMD().run(player, hologram, args); case "addline" -> new AddLineCMD().run(player, hologram, args); case "setline" -> new SetLineCMD().run(player, hologram, args); case "removeline" -> new RemoveLineCMD().run(player, hologram, args); diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java new file mode 100644 index 000000000..b0d45f234 --- /dev/null +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java @@ -0,0 +1,80 @@ +package de.oliver.fancyholograms.commands.hologram; + +import de.oliver.fancyholograms.FancyHolograms; +import de.oliver.fancyholograms.api.data.TextHologramData; +import de.oliver.fancyholograms.api.events.HologramUpdateEvent; +import de.oliver.fancyholograms.api.hologram.Hologram; +import de.oliver.fancyholograms.commands.HologramCMD; +import de.oliver.fancyholograms.commands.Subcommand; +import de.oliver.fancylib.MessageHelper; +import org.bukkit.Color; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class OpacityCMD implements Subcommand { + + @Override + public List tabcompletion(@NotNull CommandSender sender, @Nullable Hologram hologram, @NotNull String[] args) { + return null; + } + + @Override + public boolean run(@NotNull CommandSender sender, @Nullable Hologram hologram, @NotNull String[] args) { + if (!sender.hasPermission("fancyholograms.hologram.edit.opacity")) { + MessageHelper.error(sender, "You don't have the required permission to change the opacity of a hologram."); + return false; + } + + if (!(hologram.getData() instanceof TextHologramData textData)) { + MessageHelper.error(sender, "This command can only be used on text holograms."); + return false; + } + + if (args.length < 4) { + MessageHelper.error(sender, "Wrong usage: /hologram help"); + return false; + } + + float opacity; + + try { + opacity = Float.parseFloat(args[3]); + } catch (NumberFormatException e) { + MessageHelper.error(sender, "Opacity must be a number between 0 and 1."); + return false; + } + + if (opacity < 0 || opacity > 1) { + MessageHelper.error(sender, "Opacity must be between 0 and 1."); + return false; + } + + Color background = textData.getBackground(); + + int alpha = (int) (opacity * 255); + if (background.getAlpha() == alpha) { + MessageHelper.warning(sender, "This hologram already has this opacity."); + return false; + } + + Color updated = background.setAlpha(alpha); + final var copied = textData.copy(textData.getName()); + copied.setBackground(updated); + + if (!HologramCMD.callModificationEvent(hologram, sender, copied, HologramUpdateEvent.HologramModification.BACKGROUND)) { + return false; + } + + textData.setBackground(updated); + + if (FancyHolograms.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHolograms.get().getHologramStorage().save(hologram); + } + + MessageHelper.success(sender, "Changed hologram opacity to " + opacity); + return true; + } +} diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/util/Constants.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/util/Constants.java index 6e62d967e..00bb55be8 100644 --- a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/util/Constants.java +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/util/Constants.java @@ -33,6 +33,7 @@ public enum Constants { <%primary_color%>- /hologram edit scale - Changes the scale of the hologram <%primary_color%>- /hologram edit billboard - Changes the billboard of the hologram <%primary_color%>- /hologram edit background - Changes the background of the hologram + <%primary_color%>- /hologram edit opacity - Changes the background opacity of the hologram <%primary_color%>- /hologram edit textShadow - Enables/disables the text shadow <%primary_color%>- /hologram edit textAlignment - Sets the text alignment <%primary_color%>- /hologram edit seeThrough - Enables/disables whether the text can be seen through blocks From faaedcaaad4d1cd06fa70fee68aced47952c6e6b Mon Sep 17 00:00:00 2001 From: Justin <33465177+BitByLogics@users.noreply.github.com> Date: Mon, 16 Jun 2025 20:46:09 -0400 Subject: [PATCH 3/4] Fix alpha being lost on hologram loading --- .../de/oliver/fancyholograms/api/data/TextHologramData.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java index 097044549..0515d1354 100644 --- a/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java +++ b/plugins/fancyholograms-v2/api/src/main/java/de/oliver/fancyholograms/api/data/TextHologramData.java @@ -145,7 +145,7 @@ public boolean read(ConfigurationSection section, String name) { default -> TextDisplay.TextAlignment.CENTER; }; - background = null; + background = Hologram.DEFAULT_BACKGROUND; String backgroundStr = section.getString("background", null); if (backgroundStr != null) { if (backgroundStr.equalsIgnoreCase("transparent")) { @@ -172,13 +172,14 @@ public boolean write(ConfigurationSection section, String name) { section.set("update_text_interval", textUpdateInterval); final String color; + if (background == null) { color = null; } else if (background == Hologram.TRANSPARENT) { color = "transparent"; } else { NamedTextColor named = background.getAlpha() == 255 ? NamedTextColor.namedColor(background.asRGB()) : null; - color = named != null ? named.toString() : '#' + Integer.toHexString(background.asARGB()); + color = named != null ? named.toString() : '#' + String.format("%08X", background.asARGB()); } section.set("background", color); From 02a660cb19c01570b632fad386e8de09b25144bf Mon Sep 17 00:00:00 2001 From: Justin <33465177+BitByLogics@users.noreply.github.com> Date: Mon, 16 Jun 2025 20:46:43 -0400 Subject: [PATCH 4/4] Clamp alpha between 26 and 255 --- .../de/oliver/fancyholograms/commands/hologram/OpacityCMD.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java index b0d45f234..26085ad60 100644 --- a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/OpacityCMD.java @@ -54,7 +54,8 @@ public boolean run(@NotNull CommandSender sender, @Nullable Hologram hologram, @ Color background = textData.getBackground(); - int alpha = (int) (opacity * 255); + int alpha = opacity == 0 ? 0 : Math.round(opacity * (255 - 26) + 26); + if (background.getAlpha() == alpha) { MessageHelper.warning(sender, "This hologram already has this opacity."); return false;