diff --git a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/HologramType.java b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/HologramType.java index a004de3c..24c53a59 100644 --- a/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/HologramType.java +++ b/plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/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", "moveLineUp", "moveLineDown", "updatetextinterval")), ITEM(List.of("item")), BLOCK(List.of("block")); diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java index 88922c2f..5102750c 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java @@ -41,6 +41,9 @@ public final class HologramCMD extends Command { <%primary_color%>- /hologram edit insertBefore - Inserts a line before another <%primary_color%>- /hologram edit insertAfter - Inserts a line after another <%primary_color%>- /hologram edit setLine - Edits the line + <%primary_color%>- /hologram edit swapLines - Swaps two lines + <%primary_color%>- /hologram edit moveLineUp - Moves a line up one position + <%primary_color%>- /hologram edit moveLineDown - Moves a line down one position <%primary_color%>- /hologram edit position - Teleports the hologram to you <%primary_color%>- /hologram edit moveTo [yaw] [pitch] - Teleports the hologram to the coordinates <%primary_color%>- /hologram edit rotate - Rotates the hologram diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/MoveDownCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/MoveDownCMD.java new file mode 100644 index 00000000..b637e156 --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/MoveDownCMD.java @@ -0,0 +1,73 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.hologram; + +import com.fancyinnovations.fancyholograms.api.data.TextHologramData; +import com.fancyinnovations.fancyholograms.api.events.HologramUpdateEvent; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.commands.HologramCMD; +import com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions.MoveLineDownSuggestion; +import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin; +import de.oliver.fancylib.MessageHelper; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.SuggestWith; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +import java.util.ArrayList; +import java.util.List; + +public final class MoveDownCMD { + + public static final MoveDownCMD INSTANCE = new MoveDownCMD(); + + private MoveDownCMD() { + } + + @Command("hologram-new edit moveLineDown ") + @Description("Moves a line down by one position") + @CommandPermission("fancyholograms.hologram.edit.move_line") + public void moveLineDown( + final @NotNull BukkitCommandActor actor, + final @NotNull Hologram hologram, + final @NotNull @SuggestWith(MoveLineDownSuggestion.class) int line + ) { + if (!(hologram.getData() instanceof TextHologramData textData)) { + MessageHelper.error(actor.sender(), "This command can only be used on text holograms"); + return; + } + + List text = textData.getText(); + + if (line < 1 || line > text.size()) { + MessageHelper.error(actor.sender(), "Line number is out of range (1-" + text.size() + ")"); + return; + } + + if (line == text.size()) { + MessageHelper.warning(actor.sender(), "The last line cannot be moved down"); + return; + } + + final var copied = textData.copy(textData.getName()); + List newText = new ArrayList<>(text); + + String temp = newText.get(line - 1); + newText.set(line - 1, newText.get(line)); + newText.set(line, temp); + + copied.setText(newText); + + if (!HologramCMD.callModificationEvent(hologram, actor.sender(), copied, HologramUpdateEvent.HologramModification.TEXT)) { + return; + } + + textData.setText(newText); + + if (FancyHologramsPlugin.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHologramsPlugin.get().getStorage().save(hologram.getData()); + } + + MessageHelper.success(actor.sender(), "Moved line " + line + " down to position " + (line + 1)); + } +} \ No newline at end of file diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/MoveUpCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/MoveUpCMD.java new file mode 100644 index 00000000..be95c5ac --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/MoveUpCMD.java @@ -0,0 +1,73 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.hologram; + +import com.fancyinnovations.fancyholograms.api.data.TextHologramData; +import com.fancyinnovations.fancyholograms.api.events.HologramUpdateEvent; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.commands.HologramCMD; +import com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions.MoveLineUpSuggestion; +import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin; +import de.oliver.fancylib.MessageHelper; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.SuggestWith; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +import java.util.ArrayList; +import java.util.List; + +public final class MoveUpCMD { + + public static final MoveUpCMD INSTANCE = new MoveUpCMD(); + + private MoveUpCMD() { + } + + @Command("hologram-new edit moveLineUp ") + @Description("Moves a line up by one position") + @CommandPermission("fancyholograms.hologram.edit.move_line") + public void moveLineUp( + final @NotNull BukkitCommandActor actor, + final @NotNull Hologram hologram, + final @NotNull @SuggestWith(MoveLineUpSuggestion.class) int line + ) { + if (!(hologram.getData() instanceof TextHologramData textData)) { + MessageHelper.error(actor.sender(), "This command can only be used on text holograms"); + return; + } + + List text = textData.getText(); + + if (line < 1 || line > text.size()) { + MessageHelper.error(actor.sender(), "Line number is out of range (1-" + text.size() + ")"); + return; + } + + if (line == 1) { + MessageHelper.warning(actor.sender(), "Line 1 cannot be moved up"); + return; + } + + final var copied = textData.copy(textData.getName()); + List newText = new ArrayList<>(text); + + String temp = newText.get(line - 1); + newText.set(line - 1, newText.get(line - 2)); + newText.set(line - 2, temp); + + copied.setText(newText); + + if (!HologramCMD.callModificationEvent(hologram, actor.sender(), copied, HologramUpdateEvent.HologramModification.TEXT)) { + return; + } + + textData.setText(newText); + + if (FancyHologramsPlugin.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHologramsPlugin.get().getStorage().save(hologram.getData()); + } + + MessageHelper.success(actor.sender(), "Moved line " + line + " up to position " + (line - 1)); + } +} \ No newline at end of file diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/SwapLinesCMD.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/SwapLinesCMD.java new file mode 100644 index 00000000..533026cf --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/hologram/SwapLinesCMD.java @@ -0,0 +1,79 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.hologram; + +import com.fancyinnovations.fancyholograms.api.data.TextHologramData; +import com.fancyinnovations.fancyholograms.api.events.HologramUpdateEvent; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import com.fancyinnovations.fancyholograms.commands.HologramCMD; +import com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions.SwapLinesSuggestion; +import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin; +import de.oliver.fancylib.MessageHelper; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.SuggestWith; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +import java.util.ArrayList; +import java.util.List; + +public final class SwapLinesCMD { + + public static final SwapLinesCMD INSTANCE = new SwapLinesCMD(); + + private SwapLinesCMD() { + } + + @Command("hologram-new edit swapLines ") + @Description("Swaps two lines") + @CommandPermission("fancyholograms.hologram.edit.swap_lines") + public void swapLines( + final @NotNull BukkitCommandActor actor, + final @NotNull Hologram hologram, + final @NotNull @SuggestWith(SwapLinesSuggestion.class) int line1, + final @NotNull @SuggestWith(SwapLinesSuggestion.class) int line2 + ) { + if (!(hologram.getData() instanceof TextHologramData textData)) { + MessageHelper.error(actor.sender(), "This command can only be used on text holograms"); + return; + } + + List text = textData.getText(); + + if (line1 < 1 || line1 > text.size()) { + MessageHelper.error(actor.sender(), "First line number is out of range (1-" + text.size() + ")"); + return; + } + + if (line2 < 1 || line2 > text.size()) { + MessageHelper.error(actor.sender(), "Second line number is out of range (1-" + text.size() + ")"); + return; + } + + if (line1 == line2) { + MessageHelper.warning(actor.sender(), "Cannot swap a line with itself"); + return; + } + + final var copied = textData.copy(textData.getName()); + List newText = new ArrayList<>(text); + + String temp = newText.get(line1 - 1); + newText.set(line1 - 1, newText.get(line2 - 1)); + newText.set(line2 - 1, temp); + + copied.setText(newText); + + if (!HologramCMD.callModificationEvent(hologram, actor.sender(), copied, HologramUpdateEvent.HologramModification.TEXT)) { + return; + } + + textData.setText(newText); + + if (FancyHologramsPlugin.get().getHologramConfiguration().isSaveOnChangedEnabled()) { + FancyHologramsPlugin.get().getStorage().save(hologram.getData()); + } + + MessageHelper.success(actor.sender(), "Swapped line " + line1 + " with line " + line2); + } +} \ No newline at end of file diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/MoveLineDownSuggestion.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/MoveLineDownSuggestion.java new file mode 100644 index 00000000..b254e9a4 --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/MoveLineDownSuggestion.java @@ -0,0 +1,27 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions; + +import com.fancyinnovations.fancyholograms.api.data.TextHologramData; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Collection; +import java.util.List; +import java.util.stream.IntStream; + +public class MoveLineDownSuggestion implements SuggestionProvider { + + @Override + public @NotNull Collection getSuggestions(@NotNull ExecutionContext context) { + Hologram hologram = context.getResolvedArgumentOrNull(Hologram.class); + if (hologram == null || !(hologram.getData() instanceof TextHologramData textData)) { + return List.of(); + } + + return IntStream.range(1, textData.getText().size()) + .mapToObj(Integer::toString) + .toList(); + } +} \ No newline at end of file diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/MoveLineUpSuggestion.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/MoveLineUpSuggestion.java new file mode 100644 index 00000000..b2b6e89f --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/MoveLineUpSuggestion.java @@ -0,0 +1,27 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions; + +import com.fancyinnovations.fancyholograms.api.data.TextHologramData; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Collection; +import java.util.List; +import java.util.stream.IntStream; + +public class MoveLineUpSuggestion implements SuggestionProvider { + + @Override + public @NotNull Collection getSuggestions(@NotNull ExecutionContext context) { + Hologram hologram = context.getResolvedArgumentOrNull(Hologram.class); + if (hologram == null || !(hologram.getData() instanceof TextHologramData textData)) { + return List.of(); + } + + return IntStream.range(2, textData.getText().size() + 1) + .mapToObj(Integer::toString) + .toList(); + } +} \ No newline at end of file diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/SwapLinesSuggestion.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/SwapLinesSuggestion.java new file mode 100644 index 00000000..fb0d8537 --- /dev/null +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/lampCommands/suggestions/SwapLinesSuggestion.java @@ -0,0 +1,27 @@ +package com.fancyinnovations.fancyholograms.commands.lampCommands.suggestions; + +import com.fancyinnovations.fancyholograms.api.data.TextHologramData; +import com.fancyinnovations.fancyholograms.api.hologram.Hologram; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; + +import java.util.Collection; +import java.util.List; +import java.util.stream.IntStream; + +public class SwapLinesSuggestion implements SuggestionProvider { + + @Override + public @NotNull Collection getSuggestions(@NotNull ExecutionContext context) { + Hologram hologram = context.getResolvedArgumentOrNull(Hologram.class); + if (hologram == null || !(hologram.getData() instanceof TextHologramData textData)) { + return List.of(); + } + + return IntStream.range(1, textData.getText().size() + 1) + .mapToObj(Integer::toString) + .toList(); + } +} \ No newline at end of file diff --git a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java index ac309d09..ed610aeb 100644 --- a/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java +++ b/plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/main/FancyHologramsPlugin.java @@ -11,6 +11,9 @@ import com.fancyinnovations.fancyholograms.commands.FancyHologramsTestCMD; import com.fancyinnovations.fancyholograms.commands.HologramCMD; import com.fancyinnovations.fancyholograms.commands.lampCommands.fancyholograms.ConfigCMD; +import com.fancyinnovations.fancyholograms.commands.lampCommands.hologram.MoveDownCMD; +import com.fancyinnovations.fancyholograms.commands.lampCommands.hologram.MoveUpCMD; +import com.fancyinnovations.fancyholograms.commands.lampCommands.hologram.SwapLinesCMD; import com.fancyinnovations.fancyholograms.commands.lampCommands.hologram.TraitCMD; import com.fancyinnovations.fancyholograms.commands.lampCommands.types.HologramCommandType; import com.fancyinnovations.fancyholograms.commands.lampCommands.types.TraitCommandType; @@ -305,6 +308,9 @@ private void registerLampCommands() { // hologram commands lamp.register(TraitCMD.INSTANCE); + lamp.register(MoveUpCMD.INSTANCE); + lamp.register(MoveDownCMD.INSTANCE); + lamp.register(SwapLinesCMD.INSTANCE); } private void registerListeners() {