Skip to content

Commit e5944b9

Browse files
committed
Added more line commands, suggested here: #49
1 parent 969618d commit e5944b9

File tree

5 files changed

+303
-1
lines changed

5 files changed

+303
-1
lines changed

plugins/fancyholograms/fh-api/src/main/java/com/fancyinnovations/fancyholograms/api/hologram/HologramType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.util.List;
55

66
public enum HologramType {
7-
TEXT(Arrays.asList("background", "textshadow", "textalignment", "opacity", "seethrough", "setline", "removeline", "addline", "insertbefore", "insertafter", "updatetextinterval")),
7+
TEXT(Arrays.asList("background", "textshadow", "textalignment", "opacity", "seethrough", "setline", "removeline", "addline", "insertbefore", "insertafter", "swap_lines", "move_line_up", "move_line_down", "updatetextinterval")),
88
ITEM(List.of("item")),
99
BLOCK(Arrays.asList("block", "blockstate"));
1010

plugins/fancyholograms/src/main/java/com/fancyinnovations/fancyholograms/commands/HologramCMD.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public final class HologramCMD extends Command {
4141
<%primary_color%>- /hologram edit <hologram> insertBefore <line number> <text ...> <dark_gray>- <white>Inserts a line before another
4242
<%primary_color%>- /hologram edit <hologram> insertAfter <line number> <text ...> <dark_gray>- <white>Inserts a line after another
4343
<%primary_color%>- /hologram edit <hologram> setLine <line number> <text ...> <dark_gray>- <white>Edits the line
44+
<%primary_color%>- /hologram edit <hologram> swap_lines <first> <second> <dark_gray>- <white>Swaps two lines
45+
<%primary_color%>- /hologram edit <hologram> move_line_up <line> <dark_gray>- <white>Moves a line up one position
46+
<%primary_color%>- /hologram edit <hologram> move_line_down <line> <dark_gray>- <white>Moves a line down one position
4447
<%primary_color%>- /hologram edit <hologram> position <dark_gray>- <white>Teleports the hologram to you
4548
<%primary_color%>- /hologram edit <hologram> moveTo <x> <y> <z> [yaw] [pitch] <dark_gray>- <white>Teleports the hologram to the coordinates
4649
<%primary_color%>- /hologram edit <hologram> rotate <degrees> <dark_gray>- <white>Rotates the hologram
@@ -248,6 +251,24 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, @No
248251
TextHologramData textData = (TextHologramData) hologram.getData();
249252
yield IntStream.range(1, textData.getText().size() + 1).mapToObj(Integer::toString);
250253
}
254+
case "move_line_up" -> {
255+
TextHologramData textData = (TextHologramData) hologram.getData();
256+
// cant move line 1 up
257+
yield IntStream.range(2, textData.getText().size() + 1).mapToObj(Integer::toString);
258+
}
259+
case "move_line_down" -> {
260+
TextHologramData textData = (TextHologramData) hologram.getData();
261+
// cant move last line down
262+
yield IntStream.range(1, textData.getText().size()).mapToObj(Integer::toString);
263+
}
264+
case "swap_lines" -> {
265+
TextHologramData textData = (TextHologramData) hologram.getData();
266+
if (args.length == 4) {
267+
yield IntStream.range(1, textData.getText().size() + 1).mapToObj(Integer::toString);
268+
} else {
269+
yield Stream.<String>empty();
270+
}
271+
}
251272
case "linkwithnpc" -> {
252273
if (!PluginUtils.isFancyNpcsEnabled()) {
253274
yield Stream.<String>empty();
@@ -280,6 +301,21 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String label, @No
280301
return List.of(textData.getText().get(index - 1));
281302
}
282303

304+
// /holo edit [hologram] swap_lines [first] {tab:second_line}
305+
if (args.length == 5 && args[2].equalsIgnoreCase("swap_lines")) {
306+
TextHologramData textData = (TextHologramData) hologram.getData();
307+
308+
final var firstLine = Ints.tryParse(args[3]);
309+
if (firstLine == null || firstLine < 1 || firstLine > textData.getText().size()) {
310+
return Collections.emptyList();
311+
}
312+
313+
return IntStream.range(1, textData.getText().size() + 1)
314+
.filter(i -> i != firstLine)
315+
.mapToObj(Integer::toString)
316+
.toList();
317+
}
318+
283319
// /holo edit [hologram] moveto {tab:x} {tab:y} {tab:z}
284320
if (args[2].equalsIgnoreCase("moveto")) {
285321
if (!(sender instanceof Player player)) {
@@ -376,6 +412,9 @@ private boolean edit(@NotNull final CommandSender player, @NotNull final Hologra
376412
case "removeline" -> new RemoveLineCMD().run(player, hologram, args);
377413
case "insertbefore" -> new InsertBeforeCMD().run(player, hologram, args);
378414
case "insertafter" -> new InsertAfterCMD().run(player, hologram, args);
415+
case "swap_lines" -> new SwapLinesCMD().run(player, hologram, args);
416+
case "move_line_up" -> new MoveUpCMD().run(player, hologram, args);
417+
case "move_line_down" -> new MoveDownCMD().run(player, hologram, args);
379418
case "textshadow" -> new TextShadowCMD().run(player, hologram, args);
380419
case "textalignment" -> new TextAlignmentCMD().run(player, hologram, args);
381420
case "opacity" -> new OpacityCMD().run(player, hologram, args);
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.fancyinnovations.fancyholograms.commands.hologram;
2+
3+
import com.fancyinnovations.fancyholograms.api.data.TextHologramData;
4+
import com.fancyinnovations.fancyholograms.api.events.HologramUpdateEvent;
5+
import com.fancyinnovations.fancyholograms.api.hologram.Hologram;
6+
import com.fancyinnovations.fancyholograms.commands.HologramCMD;
7+
import com.fancyinnovations.fancyholograms.commands.Subcommand;
8+
import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin;
9+
import com.fancyinnovations.fancyholograms.util.NumberHelper;
10+
import de.oliver.fancylib.MessageHelper;
11+
import org.bukkit.command.CommandSender;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class MoveDownCMD implements Subcommand {
19+
20+
@Override
21+
public List<String> tabcompletion(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) {
22+
return null;
23+
}
24+
25+
@Override
26+
public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) {
27+
28+
if (!(player.hasPermission("fancyholograms.hologram.edit.move_line"))) {
29+
MessageHelper.error(player, "You don't have the required permission to move lines");
30+
return false;
31+
}
32+
33+
if (!(hologram.getData() instanceof TextHologramData textData)) {
34+
MessageHelper.error(player, "This command can only be used on text holograms");
35+
return false;
36+
}
37+
38+
if (args.length < 4) {
39+
MessageHelper.error(player, "Usage: /hologram edit <name> move_line_down <line>");
40+
return false;
41+
}
42+
43+
final var lineNumber = NumberHelper.parseInt(args[3]);
44+
45+
if (lineNumber.isEmpty()) {
46+
MessageHelper.error(player, "Invalid line number");
47+
return false;
48+
}
49+
50+
int line = lineNumber.get();
51+
List<String> text = textData.getText();
52+
53+
if (line < 1 || line > text.size()) {
54+
MessageHelper.error(player, "Line number is out of range (1-" + text.size() + ")");
55+
return false;
56+
}
57+
58+
if (line == text.size()) {
59+
MessageHelper.warning(player, "The last line cannot be moved down");
60+
return false;
61+
}
62+
63+
final var copied = textData.copy(textData.getName());
64+
List<String> newText = new ArrayList<>(text);
65+
66+
String temp = newText.get(line - 1);
67+
newText.set(line - 1, newText.get(line));
68+
newText.set(line, temp);
69+
70+
copied.setText(newText);
71+
72+
if (!HologramCMD.callModificationEvent(hologram, player, copied, HologramUpdateEvent.HologramModification.TEXT)) {
73+
return false;
74+
}
75+
76+
textData.setText(newText);
77+
78+
if (FancyHologramsPlugin.get().getHologramConfiguration().isSaveOnChangedEnabled()) {
79+
FancyHologramsPlugin.get().getStorage().save(hologram.getData());
80+
}
81+
82+
MessageHelper.success(player, "Moved line " + line + " down to position " + (line + 1));
83+
return true;
84+
}
85+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.fancyinnovations.fancyholograms.commands.hologram;
2+
3+
import com.fancyinnovations.fancyholograms.api.data.TextHologramData;
4+
import com.fancyinnovations.fancyholograms.api.events.HologramUpdateEvent;
5+
import com.fancyinnovations.fancyholograms.api.hologram.Hologram;
6+
import com.fancyinnovations.fancyholograms.commands.HologramCMD;
7+
import com.fancyinnovations.fancyholograms.commands.Subcommand;
8+
import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin;
9+
import com.fancyinnovations.fancyholograms.util.NumberHelper;
10+
import de.oliver.fancylib.MessageHelper;
11+
import org.bukkit.command.CommandSender;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class MoveUpCMD implements Subcommand {
19+
20+
@Override
21+
public List<String> tabcompletion(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) {
22+
return null;
23+
}
24+
25+
@Override
26+
public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) {
27+
28+
if (!(player.hasPermission("fancyholograms.hologram.edit.move_line"))) {
29+
MessageHelper.error(player, "You don't have the required permission to move lines");
30+
return false;
31+
}
32+
33+
if (!(hologram.getData() instanceof TextHologramData textData)) {
34+
MessageHelper.error(player, "This command can only be used on text holograms");
35+
return false;
36+
}
37+
38+
if (args.length < 4) {
39+
MessageHelper.error(player, "Usage: /hologram edit <name> move_line_up <line>");
40+
return false;
41+
}
42+
43+
final var lineNumber = NumberHelper.parseInt(args[3]);
44+
45+
if (lineNumber.isEmpty()) {
46+
MessageHelper.error(player, "Invalid line number");
47+
return false;
48+
}
49+
50+
int line = lineNumber.get();
51+
List<String> text = textData.getText();
52+
53+
if (line < 1 || line > text.size()) {
54+
MessageHelper.error(player, "Line number is out of range (1-" + text.size() + ")");
55+
return false;
56+
}
57+
58+
if (line == 1) {
59+
MessageHelper.warning(player, "Line 1 cannot be moved up");
60+
return false;
61+
}
62+
63+
final var copied = textData.copy(textData.getName());
64+
List<String> newText = new ArrayList<>(text);
65+
66+
String temp = newText.get(line - 1);
67+
newText.set(line - 1, newText.get(line - 2));
68+
newText.set(line - 2, temp);
69+
70+
copied.setText(newText);
71+
72+
if (!HologramCMD.callModificationEvent(hologram, player, copied, HologramUpdateEvent.HologramModification.TEXT)) {
73+
return false;
74+
}
75+
76+
textData.setText(newText);
77+
78+
if (FancyHologramsPlugin.get().getHologramConfiguration().isSaveOnChangedEnabled()) {
79+
FancyHologramsPlugin.get().getStorage().save(hologram.getData());
80+
}
81+
82+
MessageHelper.success(player, "Moved line " + line + " up to position " + (line - 1));
83+
return true;
84+
}
85+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.fancyinnovations.fancyholograms.commands.hologram;
2+
3+
import com.fancyinnovations.fancyholograms.api.data.TextHologramData;
4+
import com.fancyinnovations.fancyholograms.api.events.HologramUpdateEvent;
5+
import com.fancyinnovations.fancyholograms.api.hologram.Hologram;
6+
import com.fancyinnovations.fancyholograms.commands.HologramCMD;
7+
import com.fancyinnovations.fancyholograms.commands.Subcommand;
8+
import com.fancyinnovations.fancyholograms.main.FancyHologramsPlugin;
9+
import com.fancyinnovations.fancyholograms.util.NumberHelper;
10+
import de.oliver.fancylib.MessageHelper;
11+
import org.bukkit.command.CommandSender;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class SwapLinesCMD implements Subcommand {
19+
20+
@Override
21+
public List<String> tabcompletion(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) {
22+
return null;
23+
}
24+
25+
@Override
26+
public boolean run(@NotNull CommandSender player, @Nullable Hologram hologram, @NotNull String[] args) {
27+
28+
if (!(player.hasPermission("fancyholograms.hologram.edit.swap_lines"))) {
29+
MessageHelper.error(player, "You don't have the required permission to swap lines");
30+
return false;
31+
}
32+
33+
if (!(hologram.getData() instanceof TextHologramData textData)) {
34+
MessageHelper.error(player, "This command can only be used on text holograms");
35+
return false;
36+
}
37+
38+
if (args.length < 5) {
39+
MessageHelper.error(player, "Usage: /hologram edit <name> swap_lines <first> <second>");
40+
return false;
41+
}
42+
43+
final var firstLine = NumberHelper.parseInt(args[3]);
44+
final var secondLine = NumberHelper.parseInt(args[4]);
45+
46+
if (firstLine.isEmpty() || secondLine.isEmpty()) {
47+
MessageHelper.error(player, "Invalid line numbers");
48+
return false;
49+
}
50+
51+
int first = firstLine.get();
52+
int second = secondLine.get();
53+
54+
List<String> text = textData.getText();
55+
56+
if (first < 1 || first > text.size()) {
57+
MessageHelper.error(player, "First line number is out of range (1-" + text.size() + ")");
58+
return false;
59+
}
60+
61+
if (second < 1 || second > text.size()) {
62+
MessageHelper.error(player, "Second line number is out of range (1-" + text.size() + ")");
63+
return false;
64+
}
65+
66+
if (first == second) {
67+
MessageHelper.warning(player, "Cannot swap a line with itself");
68+
return false;
69+
}
70+
71+
final var copied = textData.copy(textData.getName());
72+
List<String> newText = new ArrayList<>(text);
73+
74+
String temp = newText.get(first - 1);
75+
newText.set(first - 1, newText.get(second - 1));
76+
newText.set(second - 1, temp);
77+
78+
copied.setText(newText);
79+
80+
if (!HologramCMD.callModificationEvent(hologram, player, copied, HologramUpdateEvent.HologramModification.TEXT)) {
81+
return false;
82+
}
83+
84+
textData.setText(newText);
85+
86+
if (FancyHologramsPlugin.get().getHologramConfiguration().isSaveOnChangedEnabled()) {
87+
FancyHologramsPlugin.get().getStorage().save(hologram.getData());
88+
}
89+
90+
MessageHelper.success(player, "Swapped line " + first + " with line " + second);
91+
return true;
92+
}
93+
}

0 commit comments

Comments
 (0)