11package adhdmc .simpleprefixes .gui .chest ;
22
3+ import adhdmc .simpleprefixes .SimplePrefixes ;
34import adhdmc .simpleprefixes .util .Prefix ;
4- import adhdmc .simpleprefixes .util .PrefixUtil ;
55import 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 ;
69import org .bukkit .Bukkit ;
7- import org .bukkit .configuration .ConfigurationSection ;
10+ import org .bukkit .Material ;
11+ import org .bukkit .NamespacedKey ;
812import org .bukkit .entity .Player ;
9- import org .bukkit .event .inventory .InventoryType ;
1013import 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
1219import java .util .ArrayList ;
1320import java .util .Collections ;
1623public 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}
0 commit comments