Skip to content

Commit 94170b5

Browse files
authored
feat: added lore command (#5)
1 parent d5165e1 commit 94170b5

File tree

6 files changed

+293
-4
lines changed

6 files changed

+293
-4
lines changed

zip-plugin/src/main/java/net/imprex/zip/command/BackpackCommand.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public BackpackCommand(BackpackPlugin plugin) {
3333
this.registerSubCommand(new LinkCommand(plugin));
3434
this.registerSubCommand(new PickupCommand(plugin));
3535
this.registerSubCommand(new TypeCommand(plugin));
36+
this.registerSubCommand(new LoreCommand(plugin));
3637

3738
this.buildHelpMessage();
3839
}
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
package net.imprex.zip.command;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.Locale;
6+
7+
import org.bukkit.command.CommandSender;
8+
import org.bukkit.entity.Player;
9+
import org.bukkit.inventory.ItemStack;
10+
import org.bukkit.inventory.PlayerInventory;
11+
import org.bukkit.inventory.meta.ItemMeta;
12+
13+
import net.imprex.zip.BackpackPlugin;
14+
import net.imprex.zip.config.GeneralConfig;
15+
import net.imprex.zip.config.MessageKey;
16+
import net.md_5.bungee.api.ChatColor;
17+
import net.md_5.bungee.api.chat.ClickEvent;
18+
import net.md_5.bungee.api.chat.HoverEvent;
19+
import net.md_5.bungee.api.chat.TextComponent;
20+
import net.md_5.bungee.api.chat.hover.content.Text;
21+
22+
public class LoreCommand extends BackpackSubCommand {
23+
24+
private final GeneralConfig generalConfig;
25+
26+
private final String syntaxMessage;
27+
28+
public LoreCommand(BackpackPlugin plugin) {
29+
super(plugin, MessageKey.CommandHelpLore, "zeroinventoryproblems.lore", "lore");
30+
this.generalConfig = plugin.getBackpackConfig().general();
31+
32+
StringBuilder stringBuilder = new StringBuilder();
33+
stringBuilder.append(this.messageConfig.getWithoutPrefix(MessageKey.CommandHelpStart));
34+
stringBuilder.append("\n");
35+
stringBuilder.append(this.messageConfig.getWithoutPrefix(MessageKey.CommandHelpLoreSyntax));
36+
stringBuilder.append("\n");
37+
stringBuilder.append(this.messageConfig.getWithoutPrefix(MessageKey.CommandHelpEnd));
38+
this.syntaxMessage = stringBuilder.toString();
39+
}
40+
41+
@Override
42+
public void onCommand(CommandSender sender, String[] args) {
43+
Player player = this.isPlayer(sender);
44+
if (player == null) {
45+
return;
46+
}
47+
48+
if (args.length == 0) {
49+
sender.sendMessage(this.syntaxMessage);
50+
return;
51+
}
52+
53+
PlayerInventory playerInventory = player.getInventory();
54+
ItemStack item = playerInventory.getItemInMainHand();
55+
if (item == null || !this.backpackHandler.isBackpack(item)) {
56+
this.messageConfig.send(sender, MessageKey.YouNeedToHoldABackpackInYourHand);
57+
return;
58+
}
59+
60+
ItemMeta meta = item.getItemMeta();
61+
List<String> lore = meta.getLore();
62+
63+
boolean apply = switch (args[0]) {
64+
case "add", "create" -> this.handleAdd(sender, Arrays.copyOfRange(args, 1, args.length), lore);
65+
case "edit", "change" -> this.handleChange(sender, Arrays.copyOfRange(args, 1, args.length), lore);
66+
case "del", "delete" -> this.handleDelete(sender, Arrays.copyOfRange(args, 1, args.length), lore);
67+
case "list" -> this.handleList(sender, args, lore);
68+
default -> {
69+
sender.sendMessage(this.syntaxMessage);
70+
yield false;
71+
}
72+
};
73+
74+
if (apply) {
75+
meta.setLore(lore);
76+
item.setItemMeta(meta);
77+
} else {
78+
79+
}
80+
}
81+
82+
public boolean handleAdd(CommandSender sender, String[] args, List<String> lore) {
83+
if (args.length < 1) {
84+
sender.sendMessage(this.syntaxMessage);
85+
return false;
86+
}
87+
88+
if (lore.size() + 1 > this.generalConfig.maxLoreCount) {
89+
this.messageConfig.send(sender, MessageKey.MaxLoreCountReached, this.generalConfig.maxLoreCount);
90+
return false;
91+
}
92+
93+
String message = String.join(" ", args);
94+
if (!message.startsWith("&")) {
95+
message = "&r&7" + message;
96+
}
97+
message = ChatColor.translateAlternateColorCodes('&', message);
98+
lore.add(message);
99+
this.messageConfig.send(sender, MessageKey.LoreLineCreate, lore.size());
100+
return true;
101+
}
102+
103+
public boolean handleChange(CommandSender sender, String[] args, List<String> lore) {
104+
if (args.length < 2) {
105+
sender.sendMessage(this.syntaxMessage);
106+
return false;
107+
}
108+
109+
int line = this.readNumber(sender, args[0], 1, lore.size());
110+
if (line < 1) {
111+
return false;
112+
}
113+
114+
String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
115+
if (!message.startsWith("&")) {
116+
message = "&r&7" + message;
117+
}
118+
message = ChatColor.translateAlternateColorCodes('&', message);
119+
lore.set(line - 1, message);
120+
this.messageConfig.send(sender, MessageKey.LoreLineChange, line);
121+
return true;
122+
}
123+
124+
public boolean handleDelete(CommandSender sender, String[] args, List<String> lore) {
125+
if (args.length < 1) {
126+
sender.sendMessage(this.syntaxMessage);
127+
return false;
128+
}
129+
130+
int line = this.readNumber(sender, args[0], 1, lore.size());
131+
if (line < 1) {
132+
return false;
133+
}
134+
135+
lore.remove(line - 1);
136+
this.messageConfig.send(sender, MessageKey.LoreLineDelete, line);
137+
return true;
138+
}
139+
140+
public boolean handleList(CommandSender sender, String[] args, List<String> lore) {
141+
TextComponent component = new TextComponent();
142+
component.addExtra(this.messageConfig.getWithoutPrefix(MessageKey.CommandLoreStart));
143+
component.addExtra("\n");
144+
145+
for (int line = 1; line < lore.size() + 1; line++) {
146+
String entry = lore.get(line - 1);
147+
String messageContent = this.messageConfig.getWithoutPrefix(MessageKey.CommandLoreContent, line, entry);
148+
String messageEdit = this.messageConfig.getWithoutPrefix(MessageKey.CommandLoreButtonEdit);
149+
String messageEditHover = this.messageConfig.getWithoutPrefix(MessageKey.CommandLoreButtonEditHover);
150+
String messageDelete = this.messageConfig.getWithoutPrefix(MessageKey.CommandLoreButtonDelete);
151+
String messageDeleteHover = this.messageConfig.getWithoutPrefix(MessageKey.CommandLoreButtonDeleteHover);
152+
153+
TextComponent content = new TextComponent(messageContent);
154+
content.addExtra("\n");
155+
156+
String editSuggestEntry = entry.replace("§", "&");
157+
TextComponent editButton = new TextComponent(messageEdit);
158+
editButton.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(messageEditHover)));
159+
editButton.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, String.format("/zip lore edit %d %s", line, editSuggestEntry)));
160+
161+
TextComponent deleteButton = new TextComponent(messageDelete);
162+
deleteButton.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(messageDeleteHover)));
163+
deleteButton.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, String.format("/zip lore delete %d", line)));
164+
165+
editButton.addExtra(new TextComponent(" "));
166+
editButton.addExtra(deleteButton);
167+
168+
content.addExtra(" ");
169+
content.addExtra(editButton);
170+
171+
component.addExtra(content);
172+
component.addExtra("\n");
173+
}
174+
175+
component.addExtra(this.messageConfig.getWithoutPrefix(MessageKey.CommandLoreEnd));
176+
sender.spigot().sendMessage(component);
177+
return false;
178+
}
179+
180+
public int readNumber(CommandSender sender, String argument, int min, int max) {
181+
int line;
182+
try {
183+
line = Integer.valueOf(argument);
184+
} catch (NumberFormatException e) {
185+
this.messageConfig.send(sender, MessageKey.PleaseEnterANumber);
186+
return -1;
187+
}
188+
189+
if (line < min || line > max) {
190+
this.messageConfig.send(sender, MessageKey.EnterANumberBetweenArgsAndArgs, min, max);
191+
return -1;
192+
}
193+
194+
return line;
195+
}
196+
197+
@Override
198+
public void onTabComplete(CommandSender sender, String[] args, List<String> result) {
199+
if (sender instanceof Player player) {
200+
if (args.length == 0) {
201+
result.add("add");
202+
result.add("edit");
203+
result.add("delete");
204+
result.add("list");
205+
} else if (args.length == 1) {
206+
String subCommand = args[0].toLowerCase(Locale.ROOT);
207+
if ("add".startsWith(subCommand)) {
208+
result.add("add");
209+
}
210+
if ("edit".startsWith(subCommand)) {
211+
result.add("edit");
212+
}
213+
if ("delete".startsWith(subCommand)) {
214+
result.add("delete");
215+
}
216+
if ("list".startsWith(subCommand)) {
217+
result.add("list");
218+
}
219+
} else if (args.length == 2) {
220+
String subCommand = args[0].toLowerCase(Locale.ROOT);
221+
if (!("edit".startsWith(subCommand) || "delete".startsWith(subCommand))) {
222+
return;
223+
}
224+
225+
PlayerInventory playerInventory = player.getInventory();
226+
ItemStack item = playerInventory.getItemInMainHand();
227+
if (item == null || !this.backpackHandler.isBackpack(item)) {
228+
return;
229+
}
230+
231+
String value = args[1];
232+
ItemMeta meta = item.getItemMeta();
233+
for (int line = 1; line < meta.getLore().size() + 1; line++) {
234+
String lineAsString = String.valueOf(line);
235+
if (lineAsString.startsWith(value)) {
236+
result.add(lineAsString);
237+
}
238+
}
239+
}
240+
}
241+
}
242+
}

zip-plugin/src/main/java/net/imprex/zip/config/GeneralConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public class GeneralConfig {
1010

1111
public String locale;
1212

13+
public int maxLoreCount;
14+
1315
public GeneralConfig(ConfigurationSection config) {
1416
if (config == null) {
1517
throw new IllegalArgumentException("Config section general was not found");
@@ -32,5 +34,11 @@ public GeneralConfig(ConfigurationSection config) {
3234
} else {
3335
throw new IllegalArgumentException("Config section general is missing locale value");
3436
}
37+
38+
if (config.contains("maxLoreCount") && config.isInt("maxLoreCount")) {
39+
this.maxLoreCount = config.getInt("maxLoreCount");
40+
} else {
41+
this.maxLoreCount = 10;
42+
}
3543
}
3644
}

zip-plugin/src/main/java/net/imprex/zip/config/MessageKey.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,26 @@ public enum MessageKey {
1414
CommandHelpLink("commandHelpLink", "§8/§7zip §elink §7<§ecancel§7> §8| §7Link multiple backpacks or cancel the request§8."),
1515
CommandHelpGive("commandHelpGive", "§8/§7zip §egive §7[§etype§7] §7<§eplayer§7> §8| §7Give yourself a backpack§8."),
1616
CommandHelpType("commandHelpType", "§8/§7zip §etype §8| §7Get a list of all backpacks§8."),
17+
CommandHelpLore("commandHelpLore", "§8/§7zip §elore §8| §7Write a custom lore§8."),
1718
CommandHelpEnd("commandHelpEnd", "§8[]§7========== §eZeroInventoryProblems §7==========§8[]"),
1819
CommandTypeStart("commandTypeStart", "§8[]§7========== §eZeroInventoryProblems Types §7==========§8[]"),
1920
CommandTypeContent("commandTypeContent", " §8-§e{0}"),
2021
CommandTypeButtonGive("commandTypeButtonGive", "§7[§eGive§7]"),
2122
CommandTypeButtonGiveHover("commandTypeButtonGiveHover", "§eClick here to give yourself a §8\"§e{0}§8\" backpack"),
2223
CommandTypeEnd("commandTypeEnd", "§8[]§7========== §eZeroInventoryProblems Types §7==========§8[]"),
24+
CommandHelpLoreSyntax("commandHelpLoreSyntax", """
25+
§8/§7zip §elore add §7<§eMessage§7> §8| §7Add a lore§8.
26+
§8/§7zip §elore change §7<§eLine§7> §7<§eMessage§7> §8| §7Change a line§8.
27+
§8/§7zip §elore delete §7<§eLine§7> §8| §7Delete a line§8.
28+
§8/§7zip §elore list §8| §7List of all lore lines§8.
29+
"""),
30+
CommandLoreStart("commandLoreStart", "§8[]§7========== §eZeroInventoryProblems Lore §7==========§8[]"),
31+
CommandLoreContent("commandLoreContent", " §8{0}: §e{1}"),
32+
CommandLoreButtonEdit("commandLoreButtonEdit", "§7[§eEdit§7]"),
33+
CommandLoreButtonEditHover("commandLoreButtonEditHover", "§eClick here to edit this line"),
34+
CommandLoreButtonDelete("commandLoreButtonDelete", "§7[§eDelete§7]"),
35+
CommandLoreButtonDeleteHover("commandLoreButtonDeleteHover", "§eClick here to delete this line"),
36+
CommandLoreEnd("commandLoreEnd", "§8[]§7========== §eZeroInventoryProblems Lore §7==========§8[]"),
2337
NoOnlinePlayerWasFound("noOnlinePlayerWasFound", "No online player with the name §8\"§e{0}§8} §7was found"),
2438
PleaseEnterABackpackType("pleaseEnterABackpackType", "Please enter a backpack type §8(small/medium/big)"),
2539
BackpackTypeWasNotFound("backpackTypeWasNotFound", "Backpack type §8\"§e{0}§8\" §7was not found"),
@@ -39,7 +53,13 @@ public enum MessageKey {
3953
YouNeedToLinkABackpackFirst("youNeedToLinkABackpackFirst", "You need to link a backpack at first"),
4054
YourBackpackLinkRequestWasCancelled("yourBackpackLinkRequestWasCancelled", "Your backpack link request was cancelled"),
4155
BothBackpacksNeedToBeTheSameType("bothBackpacksNeedToBeTheSameType", "Both Backpacks need to be the same type"),
42-
ThisBackpackIsAlreadyLinkedThoThat("thisBackpackIsAlreadyLinkedThoThat", "This backpack is already linked to that backpack");
56+
ThisBackpackIsAlreadyLinkedThoThat("thisBackpackIsAlreadyLinkedThoThat", "This backpack is already linked to that backpack"),
57+
PleaseEnterANumber("pleaseEnterANumber", "Please enter a number"),
58+
EnterANumberBetweenArgsAndArgs("enterANumberBetweenArgsAndArgs", "Please enter a number between {0} and {1}"),
59+
LoreLineCreate("loreLineCreate", "The lore line {0} was added"),
60+
LoreLineChange("loreLineChange", "The lore line {0} was changed"),
61+
LoreLineDelete("loreLineDelete", "The lore line {0} was deleted"),
62+
MaxLoreCountReached("maxLoreCountReached", "You have reached the max lore count of {0}");
4363

4464
public static MessageKey findByKey(String key) {
4565
for (MessageKey messageKey : values()) {

zip-plugin/src/main/resources/lang/en_US.yml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,21 @@ commandHelpPickup: "&8/&7zip &epickup &8| &7Pickup inaccessible items&8."
1010
commandHelpLink: "&8/&7zip &elink &7<&ecancel&7> &8| &7Link multiple backpacks or cancel the request&8."
1111
commandHelpGive: "&8/&7zip &egive &7[&etype&7] &7<&eplayer&7> &8| &7Give yourself a backpack&8."
1212
commandHelpType: "&8/&7zip &etype &8| &7Get a list of all backpacks&8."
13+
commandHelpLore: "&8/&7zip &elore &8| &7Write a custom lore&8."
1314
commandHelpEnd: "&8[]&7========== &eZeroInventoryProblems &7==========&8[]"
1415
commandTypeStart: "&8[]&7========== &eZeroInventoryProblems Types &7==========&8[]"
1516
commandTypeContent: " &8-&e{0}"
1617
commandTypeButtonGive: "&7[&eGive&7]"
17-
commandTypeButtonGiveHover: "&eClick here to give yourself a &8\"&e{0}&8\" §ebackpack"
18+
commandTypeButtonGiveHover: "&eClick here to give yourself a &8\"&e{0}&8\" &ebackpack"
1819
commandTypeEnd: "&8[]&7========== &eZeroInventoryProblems Types &7==========&8[]"
20+
commandHelpLoreSyntax: "&8/&7zip &elore add &7<&eMessage&7> &8| &7Add a lore&8.\n&8/&7zip &elore change &7<&eLine&7> &7<&eMessage&7> &8| &7Change a line&8.\n&8/&7zip &elore delete &7<&eLine&7> &8| &7Delete a line&8.\n&8/&7zip &elore list &8| &7List of all lore lines&8."
21+
commandLoreStart: "&8[]&7========== &eZeroInventoryProblems Lore &7==========&8[]"
22+
commandLoreContent: " &8{0}: &e{1}"
23+
commandLoreButtonEdit: "&7[&eEdit&7]"
24+
commandLoreButtonEditHover: "&eClick here to edit this line"
25+
commandLoreButtonDelete: "&7[&eDelete&7]"
26+
commandLoreButtonDeleteHover: "&eClick here to delete this line"
27+
commandLoreEnd: "&8[]&7========== &eZeroInventoryProblems Lore &7==========&8[]"
1928
noOnlinePlayerWasFound: "No online player with the name &8\"&e{0}&8} &7was found"
2029
pleaseEnterABackpackType: "Please enter a backpack type &8(small/medium/big)"
2130
backpackTypeWasNotFound: "Backpack type &8\"&e{0}&8\" &7was not found"
@@ -35,4 +44,10 @@ yourBackpackIsNowLinked: "Your backpack is now linked"
3544
youNeedToLinkABackpackFirst: "You need to link a backpack at first"
3645
yourBackpackLinkRequestWasCancelled: "Your backpack link request was cancelled"
3746
bothBackpacksNeedToBeTheSameType: "Both Backpacks need to be the same type"
38-
thisBackpackIsAlreadyLinkedThoThat: "This backpack is already linked to that backpack"
47+
thisBackpackIsAlreadyLinkedThoThat: "This backpack is already linked to that backpack"
48+
pleaseEnterANumber: "Please enter a number"
49+
enterANumberBetweenArgsAndArgs: "Please enter a number between {0} and {1}"
50+
loreLineCreate: "The lore line {0} was added"
51+
loreLineChange: "The lore line {0} was changed"
52+
loreLineDelete: "The lore line {0} was deleted"
53+
maxLoreCountReached: "You have reached the max lore count of {0}"

zip-plugin/src/main/resources/plugin.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,7 @@ permissions:
3030
description: Give yourself or other player backpacks
3131
zeroinventoryproblems.type:
3232
default: op
33-
description: A list of all backpack types
33+
description: A list of all backpack types
34+
zeroinventoryproblems.lore:
35+
default: op
36+
description: Change the lore of your current backpack

0 commit comments

Comments
 (0)