2
2
3
3
import java .util .Collections ;
4
4
import java .util .Map ;
5
+ import java .util .Map .Entry ;
6
+ import java .util .Optional ;
5
7
import java .util .UUID ;
6
8
import java .util .stream .Collectors ;
7
9
8
10
import org .bukkit .World ;
11
+ import org .eclipse .jdt .annotation .Nullable ;
9
12
10
13
import world .bentobox .bentobox .BentoBox ;
11
14
import world .bentobox .bentobox .api .addons .GameModeAddon ;
18
21
19
22
/**
20
23
* Handles Level placeholders
24
+ *
21
25
* @author tastybento
22
26
*
23
27
*/
@@ -27,150 +31,180 @@ public class PlaceholderManager {
27
31
private final BentoBox plugin ;
28
32
29
33
public PlaceholderManager (Level addon ) {
30
- this .addon = addon ;
31
- this .plugin = addon .getPlugin ();
34
+ this .addon = addon ;
35
+ this .plugin = addon .getPlugin ();
32
36
}
33
-
37
+
34
38
protected void registerPlaceholders (GameModeAddon gm ) {
35
- if (plugin .getPlaceholdersManager () == null ) return ;
36
- PlaceholdersManager bpm = plugin .getPlaceholdersManager ();
37
- // Island Level
38
- bpm .registerPlaceholder (addon ,
39
- gm .getDescription ().getName ().toLowerCase () + "_island_level" ,
40
- user -> addon .getManager ().getIslandLevelString (gm .getOverWorld (), user .getUniqueId ()));
41
- bpm .registerPlaceholder (addon ,
42
- gm .getDescription ().getName ().toLowerCase () + "_island_level_raw" ,
43
- user -> String .valueOf (addon .getManager ().getIslandLevel (gm .getOverWorld (), user .getUniqueId ())));
44
- bpm .registerPlaceholder (addon ,
45
- gm .getDescription ().getName ().toLowerCase () + "_island_total_points" ,
46
- user -> {
47
- IslandLevels data = addon .getManager ().getLevelsData (addon .getIslands ().getIsland (gm .getOverWorld (), user ));
48
- return data .getTotalPoints ()+"" ;
49
- });
50
-
51
- bpm .registerPlaceholder (addon ,
52
- gm .getDescription ().getName ().toLowerCase () + "_points_to_next_level" ,
53
- user -> addon .getManager ().getPointsToNextString (gm .getOverWorld (), user .getUniqueId ()));
54
- bpm .registerPlaceholder (addon ,
55
- gm .getDescription ().getName ().toLowerCase () + "_island_level_max" ,
56
- user -> String .valueOf (addon .getManager ().getIslandMaxLevel (gm .getOverWorld (), user .getUniqueId ())));
57
-
58
- // Visited Island Level
59
- bpm .registerPlaceholder (addon ,
60
- gm .getDescription ().getName ().toLowerCase () + "_visited_island_level" , user -> getVisitedIslandLevel (gm , user ));
61
-
62
- // Register Top Ten Placeholders
63
- for (int i = 1 ; i < 11 ; i ++) {
64
- final int rank = i ;
65
- // Name
66
- bpm .registerPlaceholder (addon ,
67
- gm .getDescription ().getName ().toLowerCase () + "_top_name_" + i , u -> getRankName (gm .getOverWorld (), rank ));
68
- // Island Name
69
- bpm .registerPlaceholder (addon ,
70
- gm .getDescription ().getName ().toLowerCase () + "_top_island_name_" + i , u -> getRankIslandName (gm .getOverWorld (), rank ));
71
- // Members
72
- bpm .registerPlaceholder (addon ,
73
- gm .getDescription ().getName ().toLowerCase () + "_top_members_" + i , u -> getRankMembers (gm .getOverWorld (), rank ));
74
- // Level
75
- bpm .registerPlaceholder (addon ,
76
- gm .getDescription ().getName ().toLowerCase () + "_top_value_" + i , u -> getRankLevel (gm .getOverWorld (), rank ));
77
- }
78
-
79
- // Personal rank
80
- bpm .registerPlaceholder (addon ,
81
- gm .getDescription ().getName ().toLowerCase () + "_rank_value" , u -> getRankValue (gm .getOverWorld (), u ));
39
+ if (plugin .getPlaceholdersManager () == null )
40
+ return ;
41
+ PlaceholdersManager bpm = plugin .getPlaceholdersManager ();
42
+ // Island Level
43
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_island_level" ,
44
+ user -> addon .getManager ().getIslandLevelString (gm .getOverWorld (), user .getUniqueId ()));
45
+ // Unformatted island level
46
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_island_level_raw" ,
47
+ user -> String .valueOf (addon .getManager ().getIslandLevel (gm .getOverWorld (), user .getUniqueId ())));
48
+ // Total number of points counted before applying level formula
49
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_island_total_points" , user -> {
50
+ IslandLevels data = addon .getManager ().getLevelsData (addon .getIslands ().getIsland (gm .getOverWorld (), user ));
51
+ return data .getTotalPoints () + "" ;
52
+ });
53
+ // Points to the next level for player
54
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_points_to_next_level" ,
55
+ user -> addon .getManager ().getPointsToNextString (gm .getOverWorld (), user .getUniqueId ()));
56
+ // Maximum level this island has ever been. Current level maybe lower.
57
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_island_level_max" ,
58
+ user -> String .valueOf (addon .getManager ().getIslandMaxLevel (gm .getOverWorld (), user .getUniqueId ())));
59
+
60
+ // Visited Island Level
61
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_visited_island_level" ,
62
+ user -> getVisitedIslandLevel (gm , user ));
63
+
64
+ // Register Top Ten Placeholders
65
+ for (int i = 1 ; i < 11 ; i ++) {
66
+ final int rank = i ;
67
+ // Name
68
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_name_" + i ,
69
+ u -> getRankName (gm .getOverWorld (), rank ));
70
+ // Island Name
71
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_island_name_" + i ,
72
+ u -> getRankIslandName (gm .getOverWorld (), rank ));
73
+ // Members
74
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_members_" + i ,
75
+ u -> getRankMembers (gm .getOverWorld (), rank ));
76
+ // Level
77
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_value_" + i ,
78
+ u -> getRankLevel (gm .getOverWorld (), rank ));
79
+ // Weighted Level (Level / number of members)
80
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_weighted_value_" + i ,
81
+ u -> getWeightedRankLevel (gm .getOverWorld (), rank ));
82
+ }
83
+
84
+ // Personal rank
85
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_rank_value" ,
86
+ u -> getRankValue (gm .getOverWorld (), u ));
82
87
}
83
88
84
89
/**
85
- * Get the name of the player who holds the rank in this world
90
+ * Get the name of the owner of the island who holds the rank in this world.
91
+ *
86
92
* @param world world
87
- * @param rank rank 1 to 10
93
+ * @param rank rank 1 to 10
88
94
* @return rank name
89
95
*/
90
96
String getRankName (World world , int rank ) {
91
- if (rank < 1 ) rank = 1 ;
92
- if (rank > Level .TEN ) rank = Level .TEN ;
93
- return addon .getPlayers ().getName (addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L ).findFirst ().orElse (null ));
97
+ // Ensure rank is within bounds
98
+ rank = Math .max (1 , Math .min (rank , Level .TEN ));
99
+ @ Nullable
100
+ UUID owner = addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L )
101
+ .findFirst ().flatMap (addon .getIslands ()::getIslandById ).map (Island ::getOwner ).orElse (null );
102
+
103
+ return addon .getPlayers ().getName (owner );
94
104
}
95
105
96
106
/**
97
107
* Get the island name for this rank
108
+ *
98
109
* @param world world
99
- * @param rank rank 1 to 10
110
+ * @param rank rank 1 to 10
100
111
* @return name of island or nothing if there isn't one
101
112
*/
102
113
String getRankIslandName (World world , int rank ) {
103
- if (rank < 1 ) rank = 1 ;
104
- if (rank > Level .TEN ) rank = Level .TEN ;
105
- UUID owner = addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L ).findFirst ().orElse (null );
106
- if (owner != null ) {
107
- Island island = addon .getIslands ().getIsland (world , owner );
108
- if (island != null ) {
109
- return island .getName () == null ? "" : island .getName ();
110
- }
111
- }
112
- return "" ;
114
+ // Ensure rank is within bounds
115
+ rank = Math .max (1 , Math .min (rank , Level .TEN ));
116
+ return addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L ).findFirst ()
117
+ .flatMap (addon .getIslands ()::getIslandById ).map (Island ::getName ).orElse ("" );
113
118
}
114
119
115
120
/**
116
121
* Gets a comma separated string of island member names
122
+ *
117
123
* @param world world
118
- * @param rank rank to request
124
+ * @param rank rank to request
119
125
* @return comma separated string of island member names
120
126
*/
121
127
String getRankMembers (World world , int rank ) {
122
- if (rank < 1 ) rank = 1 ;
123
- if (rank > Level .TEN ) rank = Level .TEN ;
124
- UUID owner = addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L ).findFirst ().orElse (null );
125
- if (owner != null ) {
126
- Island island = addon .getIslands ().getIsland (world , owner );
127
- if (island != null ) {
128
- // Sort members by rank
129
- return island .getMembers ().entrySet ().stream ()
130
- .filter (e -> e .getValue () >= RanksManager .MEMBER_RANK )
131
- .sorted (Collections .reverseOrder (Map .Entry .comparingByValue ()))
132
- .map (Map .Entry ::getKey )
133
- .map (addon .getPlayers ()::getName )
134
- .collect (Collectors .joining ("," ));
135
- }
136
- }
137
- return "" ;
128
+ // Ensure rank is within bounds
129
+ rank = Math .max (1 , Math .min (rank , Level .TEN ));
130
+ Optional <Island > island = addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L )
131
+ .limit (1L ).findFirst ().flatMap (addon .getIslands ()::getIslandById );
132
+
133
+ if (island .isPresent ()) {
134
+ // Sort members by rank
135
+ return island .get ().getMembers ().entrySet ().stream ().filter (e -> e .getValue () >= RanksManager .MEMBER_RANK )
136
+ .sorted (Collections .reverseOrder (Map .Entry .comparingByValue ())).map (Map .Entry ::getKey )
137
+ .map (addon .getPlayers ()::getName ).collect (Collectors .joining ("," ));
138
+ }
139
+ return "" ;
140
+ }
141
+
142
+ /**
143
+ * Gets the weighted level, which is the level / number of players
144
+ *
145
+ * @param world world
146
+ * @param rank level
147
+ * @return weighted level
148
+ */
149
+ String getWeightedRankLevel (World world , int rank ) {
150
+ // Ensure rank is within bounds
151
+ rank = Math .max (1 , Math .min (rank , Level .TEN ));
152
+
153
+ // Retrieve the top ten entries
154
+ Map <String , Long > topTen = addon .getManager ().getTopTen (world , Level .TEN );
155
+ if (topTen .isEmpty ()) {
156
+ return "" ;
157
+ }
158
+
159
+ // Find the entry corresponding to the rank
160
+ Entry <String , Long > entry = topTen .entrySet ().stream ().skip (rank - 1 ).findFirst ().orElse (null );
161
+ if (entry == null ) {
162
+ return "" ;
163
+ }
164
+
165
+ // Calculate the score
166
+ Island island = addon .getIslands ().getIslandById (entry .getKey ()).orElse (null );
167
+ if (island == null || island .getMemberSet ().isEmpty ()) {
168
+ return "" ;
169
+ }
170
+
171
+ double score = (double ) entry .getValue () / island .getMemberSet ().size ();
172
+
173
+ // Format and return the level
174
+ return addon .getManager ().formatLevel ((long ) score );
175
+
138
176
}
139
177
140
178
String getRankLevel (World world , int rank ) {
141
- if (rank < 1 ) rank = 1 ;
142
- if (rank > Level .TEN ) rank = Level .TEN ;
143
- return addon .getManager ()
144
- .formatLevel (addon .getManager ()
145
- .getTopTen (world , Level .TEN )
146
- .values ()
147
- .stream ()
148
- .skip (rank - 1L )
149
- .limit (1L )
150
- .findFirst ()
151
- .orElse (null ));
179
+ // Ensure rank is within bounds
180
+ rank = Math .max (1 , Math .min (rank , Level .TEN ));
181
+ return addon .getManager ().formatLevel (addon .getManager ().getTopTen (world , Level .TEN ).values ().stream ()
182
+ .skip (rank - 1L ).limit (1L ).findFirst ().orElse (null ));
152
183
}
153
-
184
+
154
185
/**
155
186
* Return the rank of the player in a world
187
+ *
156
188
* @param world world
157
- * @param user player
189
+ * @param user player
158
190
* @return rank where 1 is the top rank.
159
191
*/
160
192
private String getRankValue (World world , User user ) {
161
- if (user == null ) {
162
- return "" ;
163
- }
164
- // Get the island level for this user
165
- long level = addon .getManager ().getIslandLevel (world , user .getUniqueId ());
166
- return String .valueOf (addon .getManager ().getTopTenLists ().getOrDefault (world , new TopTenData (world )).getTopTen ().values ().stream ().filter (l -> l > level ).count () + 1 );
193
+ if (user == null ) {
194
+ return "" ;
195
+ }
196
+ // Get the island level for this user
197
+ long level = addon .getManager ().getIslandLevel (world , user .getUniqueId ());
198
+ return String .valueOf (addon .getManager ().getTopTenLists ().getOrDefault (world , new TopTenData (world )).getTopTen ()
199
+ .values ().stream ().filter (l -> l > level ).count () + 1 );
167
200
}
168
201
169
202
String getVisitedIslandLevel (GameModeAddon gm , User user ) {
170
- if (user == null || !gm .inWorld (user .getWorld ())) return "" ;
171
- return addon .getIslands ().getIslandAt (user .getLocation ())
172
- .map (island -> addon .getManager ().getIslandLevelString (gm .getOverWorld (), island .getOwner ()))
173
- .orElse ("0" );
203
+ if (user == null || !gm .inWorld (user .getWorld ()))
204
+ return "" ;
205
+ return addon .getIslands ().getIslandAt (user .getLocation ())
206
+ .map (island -> addon .getManager ().getIslandLevelString (gm .getOverWorld (), island .getOwner ()))
207
+ .orElse ("0" );
174
208
}
175
209
176
210
}
0 commit comments