From 3254ec7e3e8a8bae33a8f50698f86cdc9ef976d8 Mon Sep 17 00:00:00 2001 From: Justin <33465177+BitByLogics@users.noreply.github.com> Date: Fri, 13 Jun 2025 07:16:24 -0400 Subject: [PATCH] Add new hologram commands: swapLines, moveUp, moveDown --- .../api/hologram/HologramType.java | 2 +- .../fancyholograms/commands/HologramCMD.java | 28 +++++- .../commands/hologram/MoveDownCMD.java | 77 ++++++++++++++++ .../commands/hologram/MoveUpCMD.java | 77 ++++++++++++++++ .../commands/hologram/SwapLinesCMD.java | 90 +++++++++++++++++++ .../oliver/fancyholograms/util/Constants.java | 3 + 6 files changed, 275 insertions(+), 2 deletions(-) create mode 100644 plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveDownCMD.java create mode 100644 plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveUpCMD.java create mode 100644 plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/SwapLinesCMD.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 432fcdd8..3b524290 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", "textshadow", "textalignment", "seethrough", "setline", "removeline", "addline", "insertbefore", "insertafter", "swaplines", "moveup", "movedown", "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 6e0821a3..4a72f636 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 @@ -206,10 +206,18 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, @No } case "brightness" -> Stream.of("block", "sky"); case "textalignment" -> Arrays.stream(TextDisplay.TextAlignment.values()).map(Enum::name); - case "setline", "removeline" -> { + case "setline", "removeline", "swaplines" -> { TextHologramData textData = (TextHologramData) hologram.getData(); yield IntStream.range(1, textData.getText().size() + 1).mapToObj(Integer::toString); } + case "moveup" -> { + TextHologramData textData = (TextHologramData) hologram.getData(); + yield IntStream.range(2, textData.getText().size() + 1).mapToObj(Integer::toString); + } + case "movedown" -> { + TextHologramData textData = (TextHologramData) hologram.getData(); + yield IntStream.range(1, textData.getText().size()).mapToObj(Integer::toString); + } case "linkwithnpc" -> { if (!PluginUtils.isFancyNpcsEnabled()) { yield Stream.empty(); @@ -229,6 +237,21 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, @No } } + if(args.length == 5) { + final var suggestions = switch (args[2].toLowerCase(Locale.ROOT)) { + case "swaplines" -> { + TextHologramData textData = (TextHologramData) hologram.getData(); + yield IntStream.range(1, textData.getText().size() + 1).mapToObj(Integer::toString); + } + + default -> null; + }; + + if (suggestions != null) { + return suggestions.filter(input -> input.toLowerCase().startsWith(args[3].toLowerCase(Locale.ROOT))).toList(); + } + } + // /holo edit [hologram] setline [number] {tab:line_text} if (args[2].equalsIgnoreCase("setline")) { TextHologramData textData = (TextHologramData) hologram.getData(); @@ -336,6 +359,9 @@ private boolean edit(@NotNull final CommandSender player, @NotNull final Hologra case "removeline" -> new RemoveLineCMD().run(player, hologram, args); case "insertbefore" -> new InsertBeforeCMD().run(player, hologram, args); case "insertafter" -> new InsertAfterCMD().run(player, hologram, args); + case "swaplines" -> new SwapLinesCMD().run(player, hologram, args); + case "moveup" -> new MoveUpCMD().run(player, hologram, args); + case "movedown" -> new MoveDownCMD().run(player, hologram, args); case "textshadow" -> new TextShadowCMD().run(player, hologram, args); case "textalignment" -> new TextAlignmentCMD().run(player, hologram, args); case "seethrough" -> new SeeThroughCMD().run(player, hologram, args); diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveDownCMD.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveDownCMD.java new file mode 100644 index 00000000..de4fbd84 --- /dev/null +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveDownCMD.java @@ -0,0 +1,77 @@ +package de.oliver.fancyholograms.commands.hologram; + +import com.google.common.primitives.Ints; +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.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class MoveDownCMD implements Subcommand { + + @Override + public List tabcompletion(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + return null; + } + + @Override + public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + if (!player.hasPermission("fancyholograms.hologram.edit.line.movedown")) { + MessageHelper.error(player, "You don't have the required permission to move lines down"); + return false; + } + + if (!(hologram.getData() instanceof TextHologramData textData)) { + MessageHelper.error(player, "This command can only be used on text holograms"); + return false; + } + + if (args.length < 4) { + MessageHelper.error(player, "Wrong usage: /hologram help"); + return false; + } + + final var parsedIndex = Ints.tryParse(args[3]); + final var lines = new ArrayList<>(textData.getText()); + + if (parsedIndex == null || parsedIndex < 0 || parsedIndex > lines.size()) { + MessageHelper.error(player, "Invalid line index"); + return false; + } + + final var index = parsedIndex - 1; + + if(index < 0 || index + 1 > lines.size() - 1) { + MessageHelper.error(player, "Invalid line index"); + return false; + } + + String temp = lines.get(index); + lines.set(index, lines.get(index + 1)); + lines.set(index + 1, temp); + + final var copied = textData.copy(textData.getName()); + copied.setText(lines); + + if (!HologramCMD.callModificationEvent(hologram, player, copied, HologramUpdateEvent.HologramModification.TEXT)) { + return false; + } + + textData.setText(copied.getText()); + + if (FancyHolograms.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHolograms.get().getHologramStorage().save(hologram); + } + + MessageHelper.success(player, "Moved line " + parsedIndex + " down"); + return true; + } +} diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveUpCMD.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveUpCMD.java new file mode 100644 index 00000000..e482d5e5 --- /dev/null +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/MoveUpCMD.java @@ -0,0 +1,77 @@ +package de.oliver.fancyholograms.commands.hologram; + +import com.google.common.primitives.Ints; +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.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class MoveUpCMD implements Subcommand { + + @Override + public List tabcompletion(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + return null; + } + + @Override + public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + if (!player.hasPermission("fancyholograms.hologram.edit.line.moveup")) { + MessageHelper.error(player, "You don't have the required permission to move lines up"); + return false; + } + + if (!(hologram.getData() instanceof TextHologramData textData)) { + MessageHelper.error(player, "This command can only be used on text holograms"); + return false; + } + + if (args.length < 4) { + MessageHelper.error(player, "Wrong usage: /hologram help"); + return false; + } + + final var parsedIndex = Ints.tryParse(args[3]); + + if (parsedIndex == null || parsedIndex <= 0) { + MessageHelper.error(player, "Invalid line index"); + return false; + } + + final var index = parsedIndex - 1; + final var lines = new ArrayList<>(textData.getText()); + + if (index >= lines.size() || index - 1 < 0) { + MessageHelper.error(player, "Invalid line index"); + return false; + } + + String temp = lines.get(index); + lines.set(index, lines.get(index - 1)); + lines.set(index - 1, temp); + + final var copied = textData.copy(textData.getName()); + copied.setText(lines); + + if (!HologramCMD.callModificationEvent(hologram, player, copied, HologramUpdateEvent.HologramModification.TEXT)) { + return false; + } + + textData.setText(copied.getText()); + + if (FancyHolograms.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHolograms.get().getHologramStorage().save(hologram); + } + + MessageHelper.success(player, "Moved line " + parsedIndex + " up"); + return true; + } +} diff --git a/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/SwapLinesCMD.java b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/SwapLinesCMD.java new file mode 100644 index 00000000..f18e467c --- /dev/null +++ b/plugins/fancyholograms-v2/src/main/java/de/oliver/fancyholograms/commands/hologram/SwapLinesCMD.java @@ -0,0 +1,90 @@ +package de.oliver.fancyholograms.commands.hologram; + +import com.google.common.primitives.Ints; +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.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class SwapLinesCMD implements Subcommand { + + @Override + public List tabcompletion(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + return null; + } + + @Override + public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) { + if (!(player.hasPermission("fancyholograms.hologram.edit.line.swap"))) { + MessageHelper.error(player, "You don't have the required permission to swap lines on this hologram"); + return false; + } + + if (!(hologram.getData() instanceof TextHologramData textData)) { + MessageHelper.error(player, "This command can only be used on text holograms"); + return false; + } + + if (args.length < 5) { + MessageHelper.error(player, "Wrong usage: /hologram help"); + return false; + } + + final var parsedIndex1 = Ints.tryParse(args[3]); + final var parsedIndex2 = Ints.tryParse(args[4]); + + if (parsedIndex1 == null || parsedIndex2 == null) { + MessageHelper.error(player, "Could not parse one or both line numbers"); + return false; + } + + final var lines = new ArrayList<>(textData.getText()); + + if (parsedIndex1 < 0 || parsedIndex1 > lines.size() || parsedIndex2 < 0 || parsedIndex2 > lines.size()) { + MessageHelper.error(player, "Invalid line index"); + return false; + } + + final var index1 = parsedIndex1 - 1; + final var index2 = parsedIndex2 - 1; + + if(index1 == index2) { + MessageHelper.error(player, "Cannot swap a line with itself"); + return false; + } + + if(index1 < 0 || index2 < 0) { + MessageHelper.error(player, "Invalid line index"); + return false; + } + + String tempLine = lines.get(index1); + lines.set(index1, lines.get(index2)); + lines.set(index2, tempLine); + + final var copied = textData.copy(textData.getName()); + copied.setText(lines); + + if (!HologramCMD.callModificationEvent(hologram, player, copied, HologramUpdateEvent.HologramModification.TEXT)) { + return false; + } + + textData.setText(copied.getText()); + + if (FancyHolograms.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHolograms.get().getHologramStorage().save(hologram); + } + + MessageHelper.success(player, "Swapped lines " + parsedIndex1 + " and " + parsedIndex2); + 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 6e62d967..a96f1d8e 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 @@ -26,6 +26,9 @@ public enum Constants { <%primary_color%>- /hologram edit removeLine - Removes a line at the bottom <%primary_color%>- /hologram edit insertBefore - Inserts a line before another <%primary_color%>- /hologram edit insertAfter - Inserts a line after another + <%primary_color%>- /hologram edit swapLines - Swap line positions + <%primary_color%>- /hologram edit moveUp - Move a line up + <%primary_color%>- /hologram edit moveDown - Move a line down <%primary_color%>- /hologram edit setLine - Edits the line <%primary_color%>- /hologram edit position - Teleports the hologram to you <%primary_color%>- /hologram edit moveTo [yaw] [pitch] - Teleports the hologram to the coordinates