1
1
package adhdmc .simpleprefixes .gui .chest ;
2
2
3
+ import adhdmc .simpleprefixes .SimplePrefixes ;
3
4
import adhdmc .simpleprefixes .util .Prefix ;
4
- import adhdmc .simpleprefixes .util .PrefixUtil ;
5
5
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 ;
6
9
import org .bukkit .Bukkit ;
7
- import org .bukkit .configuration .ConfigurationSection ;
10
+ import org .bukkit .Material ;
11
+ import org .bukkit .NamespacedKey ;
8
12
import org .bukkit .entity .Player ;
9
- import org .bukkit .event .inventory .InventoryType ;
10
13
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 ;
11
18
12
19
import java .util .ArrayList ;
13
20
import java .util .Collections ;
16
23
public class PrefixMenu {
17
24
18
25
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 ();
19
32
20
33
private PrefixMenu () {}
21
34
@@ -25,21 +38,84 @@ public static PrefixMenu getInstance() {
25
38
}
26
39
27
40
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 ;
30
57
}
31
58
32
- public List <String > getPlayerPrefixOptions (Player p ) {
59
+ private List <String > getPlayerPrefixOptions (Player p ) {
33
60
RequirementUtil reqUtil = RequirementUtil .getInstance ();
34
61
List <String > prefixes = new ArrayList <>(Prefix .getPrefixes ().keySet ());
35
62
List <String > prefixesToRemove = new ArrayList <>();
36
63
for (String prefixId : prefixes ) {
37
64
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 );
39
66
}
40
67
prefixes .removeAll (prefixesToRemove );
41
68
Collections .sort (prefixes );
42
69
return prefixes ;
43
70
}
44
71
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
+
45
121
}
0 commit comments