Skip to content

Commit c8c0d22

Browse files
Merge pull request #1 from ADHDMC/gui
Merge Initial Working GUI Changes
2 parents 05fcf7f + db2942a commit c8c0d22

File tree

8 files changed

+245
-19
lines changed

8 files changed

+245
-19
lines changed

Diff for: README.md

+19-7
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,30 @@ A plugin aiming to allow for simple player-selected prefixes that can be used in
1111
>
1212
> Documentation is made for existing versions, more for our sake.
1313
14-
## Requirements
14+
# Requirements
1515

1616
- Paper-based Server (ie: [PurpurMC](https://purpurmc.org/))
1717
- This plugin takes advantage of Mini-Message from Paper.
1818
- [PlaceholderAPI Plugin](https://github.com/PlaceholderAPI/PlaceholderAPI)
1919

20-
## Features
20+
# Features
2121

22+
- Does not interact with any other plugins directly.
23+
- The plugin uses and hold prefixes in a placeholder, it will not affect permission groups.
24+
- Supports PlaceholderAPI Placeholders.
25+
- Supports Mini-Message formatting.
26+
- Supports multiple types of requirements: PERMISSION, STATISTIC, ADVANCEMENT, COMPARE_INT
2227

23-
24-
## Placeholders, Commands, and Permissions
28+
# Placeholders, Commands, and Permissions
2529

2630
`%sp_prefix%`
2731
> Placeholder for the prefix. Use this in your chat plugin.
2832
>
2933
> Example Usage: `%sp_prefix% %player_displayname% » {message}`
3034
35+
`/sp gui`
36+
> Opens a generated GUI that organizes the prefixes by prefix-id.
37+
3138
`/sp reset`
3239
> Resets your prefix.
3340
@@ -37,7 +44,7 @@ A plugin aiming to allow for simple player-selected prefixes that can be used in
3744
`/sp reload`
3845
> Reloads the plugin.
3946
40-
## Configuration
47+
# Configuration
4148

4249
```yml
4350
saving-type: "file"
@@ -59,14 +66,14 @@ prefix-id:
5966
- "compare_int %placeholder% < 1"
6067
```
6168
62-
### Configuration Settings
69+
## Configuration Settings
6370
6471
| Setting | Description | Valid Values |
6572
|----------------|---------------------------------------------|---------------|
6673
| saving-type | What type of saving system should this use? | `PDC`, `FILE` |
6774
| default-prefix | Fallback prefix, supports Placeholders. | String |
6875

69-
#### Saving Types
76+
### Saving Types
7077

7178
These are the current implementations of the saving types...
7279

@@ -181,6 +188,11 @@ Format: `compare_int <placeholder> <operator> <value>`
181188
>
182189
> <u>Example</u>: `compare_int %player_absorption% > 0` (Player has absorption value greater than 0).
183190

191+
<u>**Unimplemented**</u>
192+
193+
- Compare String, Case Sensitive
194+
- Compare String, Case Insensitive
195+
184196
## WIP Features
185197

186198
- Chest GUI

Diff for: src/main/java/adhdmc/simpleprefixes/SimplePrefixes.java

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,39 @@
11
package adhdmc.simpleprefixes;
22

33
import adhdmc.simpleprefixes.command.CommandHandler;
4-
import adhdmc.simpleprefixes.command.subcommand.InfoCommand;
5-
import adhdmc.simpleprefixes.command.subcommand.ReloadCommand;
6-
import adhdmc.simpleprefixes.command.subcommand.ResetCommand;
7-
import adhdmc.simpleprefixes.command.subcommand.SetCommand;
4+
import adhdmc.simpleprefixes.command.subcommand.*;
85
import adhdmc.simpleprefixes.config.Config;
96
import adhdmc.simpleprefixes.dependency.PAPIExpansion;
7+
import adhdmc.simpleprefixes.gui.chest.listener.PrefixMenuListener;
108
import adhdmc.simpleprefixes.util.Prefix;
119
import adhdmc.simpleprefixes.util.PrefixUtil;
1210
import net.kyori.adventure.text.minimessage.MiniMessage;
11+
import org.bukkit.Bukkit;
1312
import org.bukkit.plugin.Plugin;
1413
import org.bukkit.plugin.java.JavaPlugin;
1514

15+
import java.util.logging.Logger;
16+
1617
public final class SimplePrefixes extends JavaPlugin {
1718

1819
private static Plugin plugin;
1920
private static MiniMessage miniMessage;
21+
private static Logger logger;
2022

2123
@Override
2224
public void onEnable() {
2325
plugin = this;
2426
miniMessage = MiniMessage.miniMessage();
27+
logger = getPlugin().getLogger();
28+
logger.info("SimplePrefixes has set up plugin, mini-message, and logger.");
2529
configSetup();
30+
logger.info("SimplePrefixes has passed the config setup.");
2631
new PAPIExpansion(this).register();
32+
logger.info("SimplePrefixes has registered the PAPI Extension.");
2733
registerCommands();
34+
logger.info("SimplePrefixes has registered the commands.");
35+
Bukkit.getPluginManager().registerEvents(new PrefixMenuListener(), this);
36+
logger.info("SimplePrefixes has registered the event.");
2837
}
2938

3039
@Override
@@ -35,6 +44,11 @@ public void onDisable() {
3544
public static Plugin getPlugin() { return plugin; }
3645
public static MiniMessage getMiniMessage() { return miniMessage; }
3746

47+
public static Logger getPrefixLogger() {
48+
return logger;
49+
}
50+
51+
3852
public static void configSetup() {
3953
plugin.saveDefaultConfig();
4054
Config.loadConfig();
@@ -46,6 +60,7 @@ private void registerCommands() {
4660
this.getCommand("simpleprefix").setExecutor(new CommandHandler());
4761
CommandHandler.subcommandList.clear();
4862
CommandHandler.subcommandList.put("set", new SetCommand());
63+
CommandHandler.subcommandList.put("gui", new GuiCommand());
4964
CommandHandler.subcommandList.put("info", new InfoCommand());
5065
CommandHandler.subcommandList.put("reset", new ResetCommand());
5166
CommandHandler.subcommandList.put("reload", new ReloadCommand());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package adhdmc.simpleprefixes.command.subcommand;
2+
3+
import adhdmc.simpleprefixes.command.SubCommand;
4+
import adhdmc.simpleprefixes.gui.chest.PrefixMenu;
5+
import org.bukkit.command.CommandSender;
6+
import org.bukkit.entity.Player;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
public class GuiCommand extends SubCommand {
12+
public GuiCommand() {
13+
super("gui", "Opens the GUI menu for prefixes!", "/sp gui");
14+
}
15+
16+
@Override
17+
public void execute(CommandSender sender, String[] args) {
18+
if (!(sender instanceof Player player)) {
19+
// TODO: Configurable message, message enum.
20+
sender.sendRichMessage("<red>PLACEHOLDER: YOU ARE NOT A PLAYER");
21+
return;
22+
}
23+
player.openInventory(PrefixMenu.getInstance().generatePrefixMenu(player, 1));
24+
}
25+
26+
@Override
27+
public List<String> getSubcommandArguments(CommandSender sender, String[] args) {
28+
return new ArrayList<>();
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package adhdmc.simpleprefixes.gui.chest;
22

3+
import adhdmc.simpleprefixes.SimplePrefixes;
34
import adhdmc.simpleprefixes.util.Prefix;
4-
import adhdmc.simpleprefixes.util.PrefixUtil;
55
import adhdmc.simpleprefixes.util.RequirementUtil;
6+
import me.clip.placeholderapi.PlaceholderAPI;
7+
import net.kyori.adventure.text.Component;
8+
import net.kyori.adventure.text.minimessage.MiniMessage;
69
import org.bukkit.Bukkit;
7-
import org.bukkit.configuration.ConfigurationSection;
10+
import org.bukkit.Material;
11+
import org.bukkit.NamespacedKey;
812
import org.bukkit.entity.Player;
9-
import org.bukkit.event.inventory.InventoryType;
1013
import org.bukkit.inventory.Inventory;
14+
import org.bukkit.inventory.ItemStack;
15+
import org.bukkit.inventory.meta.ItemMeta;
16+
import org.bukkit.persistence.PersistentDataContainer;
17+
import org.bukkit.persistence.PersistentDataType;
1118

1219
import java.util.ArrayList;
1320
import java.util.Collections;
@@ -16,6 +23,12 @@
1623
public class PrefixMenu {
1724

1825
private static PrefixMenu instance;
26+
public static final NamespacedKey nskPrefixId = new NamespacedKey(SimplePrefixes.getPlugin(), "prefix_id");
27+
public static final NamespacedKey nskUnlocked = new NamespacedKey(SimplePrefixes.getPlugin(), "prefix_unlocked");
28+
public static final NamespacedKey nskPrefixMenu = new NamespacedKey(SimplePrefixes.getPlugin(), "prefix_menu");
29+
public static final NamespacedKey nskPage = new NamespacedKey(SimplePrefixes.getPlugin(), "prefix_page");
30+
private final int PER_PAGE = 45;
31+
private final MiniMessage mini = SimplePrefixes.getMiniMessage();
1932

2033
private PrefixMenu() {}
2134

@@ -25,21 +38,84 @@ public static PrefixMenu getInstance() {
2538
}
2639

2740
public Inventory generatePrefixMenu(Player p, int page) {
28-
Inventory inv = Bukkit.createInventory(null, 56);
29-
return null;
41+
Inventory inv = Bukkit.createInventory(null, 54);
42+
List<String> prefixes = getPlayerPrefixOptions(p);
43+
inv.setItem(0, generatePageArrowItem(page, prefixes.size(), false));
44+
inv.setItem(4, generateHeaderItem());
45+
inv.setItem(8, generatePageArrowItem(page, prefixes.size(), true));
46+
47+
int start = (page - 1) * PER_PAGE;
48+
int end = Math.min((page * PER_PAGE), prefixes.size());
49+
int itemIndex = 9;
50+
51+
for (int i = start; i < end; i++) {
52+
ItemStack item = generatePrefixItem(p, Prefix.getPrefix(prefixes.get(i)));
53+
inv.setItem(itemIndex++, item);
54+
}
55+
56+
return inv;
3057
}
3158

32-
public List<String> getPlayerPrefixOptions(Player p) {
59+
private List<String> getPlayerPrefixOptions(Player p) {
3360
RequirementUtil reqUtil = RequirementUtil.getInstance();
3461
List<String> prefixes = new ArrayList<>(Prefix.getPrefixes().keySet());
3562
List<String> prefixesToRemove = new ArrayList<>();
3663
for (String prefixId : prefixes) {
3764
Prefix prefix = Prefix.getPrefix(prefixId);
38-
if (!prefix.showWhenLocked && reqUtil.isEarnedPrefix(p, prefix)) prefixesToRemove.add(prefixId);
65+
if (!prefix.showWhenLocked && !reqUtil.isEarnedPrefix(p, prefix)) prefixesToRemove.add(prefixId);
3966
}
4067
prefixes.removeAll(prefixesToRemove);
4168
Collections.sort(prefixes);
4269
return prefixes;
4370
}
4471

72+
// TODO: Everything within this section should be configurable.
73+
private ItemStack generatePrefixItem(Player player, Prefix prefix) {
74+
boolean unlocked = RequirementUtil.getInstance().isEarnedPrefix(player, prefix);
75+
ItemStack item = (unlocked) ? new ItemStack(Material.NAME_TAG) : new ItemStack(Material.BARRIER);
76+
ItemMeta meta = item.getItemMeta();
77+
assert prefix.displayName != null;
78+
assert prefix.prefix != null;
79+
String papiDisplayName = "<!i><white>" + PlaceholderAPI.setPlaceholders(player, prefix.displayName);
80+
String papiPrefix = "<!i><white>" + PlaceholderAPI.setPlaceholders(player, prefix.prefix);
81+
String unlockedLore = "<!i><white>" + (unlocked ? "<aqua><bold>✔ UNLOCKED" : "<red><bold>✗ LOCKED");
82+
meta.displayName(mini.deserialize(papiDisplayName));
83+
List<Component> lore = new ArrayList<>();
84+
lore.add(mini.deserialize(papiPrefix));
85+
lore.add(mini.deserialize(""));
86+
lore.add(mini.deserialize(unlockedLore));
87+
for (String line : prefix.description) {
88+
String papiLine = "<!i><white>" + PlaceholderAPI.setPlaceholders(player, line);
89+
lore.add(mini.deserialize(papiLine));
90+
}
91+
meta.lore(lore);
92+
PersistentDataContainer pdc = meta.getPersistentDataContainer();
93+
pdc.set(nskPrefixId, PersistentDataType.STRING, prefix.prefixId);
94+
if (unlocked) pdc.set(nskUnlocked, PersistentDataType.BYTE, (byte) 1);
95+
item.setItemMeta(meta);
96+
return item;
97+
}
98+
99+
private ItemStack generatePageArrowItem(int page, int prefixes, boolean forward) {
100+
if (!forward && page == 1) return null;
101+
boolean lastPage = prefixes - (page * PER_PAGE) <= 0;
102+
if (forward && lastPage) return null;
103+
ItemStack item = new ItemStack(Material.ARROW);
104+
ItemMeta meta = item.getItemMeta();
105+
String displayName = forward ? "<bold>Next Page >>" : "<bold><< Prev Page";
106+
int toPage = forward ? page+1 : page-1;
107+
meta.getPersistentDataContainer().set(nskPage, PersistentDataType.INTEGER, toPage);
108+
meta.displayName(mini.deserialize(displayName));
109+
item.setItemMeta(meta);
110+
return item;
111+
}
112+
113+
private ItemStack generateHeaderItem() {
114+
ItemStack item = new ItemStack(Material.ENDER_EYE);
115+
ItemMeta meta = item.getItemMeta();
116+
meta.getPersistentDataContainer().set(nskPrefixMenu, PersistentDataType.BYTE, (byte) 1);
117+
item.setItemMeta(meta);
118+
return item;
119+
}
120+
45121
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package adhdmc.simpleprefixes.gui.chest.listener;
2+
3+
import adhdmc.simpleprefixes.gui.chest.PrefixMenu;
4+
import adhdmc.simpleprefixes.util.PrefixUtil;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.event.EventHandler;
7+
import org.bukkit.event.Listener;
8+
import org.bukkit.event.inventory.InventoryClickEvent;
9+
import org.bukkit.event.inventory.InventoryDragEvent;
10+
import org.bukkit.event.inventory.InventoryType;
11+
import org.bukkit.inventory.Inventory;
12+
import org.bukkit.inventory.ItemStack;
13+
import org.bukkit.persistence.PersistentDataContainer;
14+
import org.bukkit.persistence.PersistentDataType;
15+
16+
public class PrefixMenuListener implements Listener {
17+
18+
@EventHandler
19+
public void onInventoryClick(InventoryClickEvent event) {
20+
Inventory inventory = event.getInventory();
21+
if (!isPrefixMenu(inventory)) return;
22+
if (!(event.getWhoClicked() instanceof Player player)) return;
23+
ItemStack item = event.getCurrentItem();
24+
if (item == null) return;
25+
event.setCancelled(true);
26+
evalSelection(event.getCurrentItem(), player);
27+
}
28+
29+
@EventHandler
30+
public void onInventoryDrag(InventoryDragEvent event) {
31+
Inventory inventory = event.getInventory();
32+
if (!isPrefixMenu(inventory)) return;
33+
event.setCancelled(true);
34+
}
35+
36+
private boolean isPrefixMenu(Inventory inv) {
37+
if (inv.getType() != InventoryType.CHEST) { return false; }
38+
ItemStack item = inv.getItem(4);
39+
if (item == null) return false;
40+
return item.getItemMeta().getPersistentDataContainer().has(PrefixMenu.nskPrefixMenu);
41+
}
42+
43+
private void evalSelection(ItemStack item, Player p) {
44+
if (item == null) return;
45+
Integer newPage = item.getItemMeta().getPersistentDataContainer().get(PrefixMenu.nskPage, PersistentDataType.INTEGER);
46+
if (newPage != null) {
47+
Inventory newMenu = PrefixMenu.getInstance().generatePrefixMenu(p, newPage);
48+
p.openInventory(newMenu);
49+
return;
50+
}
51+
PersistentDataContainer pdc = item.getItemMeta().getPersistentDataContainer();
52+
String prefixId = pdc.get(PrefixMenu.nskPrefixId, PersistentDataType.STRING);
53+
if (prefixId == null) return;
54+
if (pdc.has(PrefixMenu.nskUnlocked)) PrefixUtil.getInstance().setPrefix(p, prefixId);
55+
}
56+
}

Diff for: src/main/java/adhdmc/simpleprefixes/util/Debug.java

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package adhdmc.simpleprefixes.util;
2+
3+
import adhdmc.simpleprefixes.SimplePrefixes;
4+
import org.bukkit.configuration.file.FileConfiguration;
5+
6+
import java.util.logging.Logger;
7+
8+
public class Debug {
9+
private static final Logger logger = SimplePrefixes.getPrefixLogger();
10+
11+
public static void debugLvl1(String message){
12+
FileConfiguration config = SimplePrefixes.getPlugin().getConfig();
13+
if (config.getInt("debug-level") == 1 ||config.getInt("debug-level") == 4) {
14+
logger.info(message);
15+
}
16+
}
17+
18+
public static void debugLvl2(String message){
19+
FileConfiguration config = SimplePrefixes.getPlugin().getConfig();
20+
if (config.getInt("debug-level") == 2 ||config.getInt("debug-level") == 4) {
21+
logger.info(message);
22+
}
23+
}
24+
25+
public static void debugLvl3(String message){
26+
FileConfiguration config = SimplePrefixes.getPlugin().getConfig();
27+
if (config.getInt("debug-level") == 3 ||config.getInt("debug-level") == 4) {
28+
logger.info(message);
29+
}
30+
}
31+
}

Diff for: src/main/java/adhdmc/simpleprefixes/util/Prefix.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ public static void populatePrefixes() {
3434
Set<String> prefixIds = SimplePrefixes.getPlugin().getConfig().getKeys(false);
3535
prefixIds.remove("saving-type");
3636
prefixIds.remove("default-prefix");
37-
for (String key : prefixIds) prefixes.put(key, new Prefix(key));
37+
prefixIds.remove("debug-level");
38+
for (String key : prefixIds) {
39+
SimplePrefixes.getPrefixLogger().info("Generating Prefix: " + key);
40+
prefixes.put(key, new Prefix(key));
41+
}
3842
}
3943

4044
public static Map<String, Prefix> getPrefixes() { return Collections.unmodifiableMap(prefixes); }

0 commit comments

Comments
 (0)