2
2
3
3
import java .util .Collections ;
4
4
import java .util .Map ;
5
- import java .util .Map .Entry ;
6
5
import java .util .Optional ;
7
6
import java .util .UUID ;
8
7
import java .util .stream .Collectors ;
@@ -66,19 +65,29 @@ protected void registerPlaceholders(GameModeAddon gm) {
66
65
final int rank = i ;
67
66
// Name
68
67
bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_name_" + i ,
69
- u -> getRankName (gm .getOverWorld (), rank ));
68
+ u -> getRankName (gm .getOverWorld (), rank , false ));
70
69
// Island Name
71
70
bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_island_name_" + i ,
72
- u -> getRankIslandName (gm .getOverWorld (), rank ));
71
+ u -> getRankIslandName (gm .getOverWorld (), rank , false ));
73
72
// Members
74
73
bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_members_" + i ,
75
- u -> getRankMembers (gm .getOverWorld (), rank ));
74
+ u -> getRankMembers (gm .getOverWorld (), rank , false ));
76
75
// Level
77
76
bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_value_" + i ,
78
- u -> getRankLevel (gm .getOverWorld (), rank ));
77
+ u -> getRankLevel (gm .getOverWorld (), rank , false ));
78
+ // Weighted Level Name (Level / number of members)
79
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_weighted_name_" + i ,
80
+ u -> getRankName (gm .getOverWorld (), rank , true ));
81
+ // Weighted Island Name
82
+ bpm .registerPlaceholder (addon ,
83
+ gm .getDescription ().getName ().toLowerCase () + "_top_weighted_island_name_" + i ,
84
+ u -> getRankIslandName (gm .getOverWorld (), rank , true ));
85
+ // Weighted Members
86
+ bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_weighted_members_" + i ,
87
+ u -> getRankMembers (gm .getOverWorld (), rank , true ));
79
88
// Weighted Level (Level / number of members)
80
89
bpm .registerPlaceholder (addon , gm .getDescription ().getName ().toLowerCase () + "_top_weighted_value_" + i ,
81
- u -> getWeightedRankLevel (gm .getOverWorld (), rank ));
90
+ u -> getRankLevel (gm .getOverWorld (), rank , true ));
82
91
}
83
92
84
93
// Personal rank
@@ -89,13 +98,18 @@ protected void registerPlaceholders(GameModeAddon gm) {
89
98
/**
90
99
* Get the name of the owner of the island who holds the rank in this world.
91
100
*
92
- * @param world world
93
- * @param rank rank 1 to 10
101
+ * @param world world
102
+ * @param rank rank 1 to 10
103
+ * @param weighted if true, then the weighted rank name is returned
94
104
* @return rank name
95
105
*/
96
- String getRankName (World world , int rank ) {
106
+ String getRankName (World world , int rank , boolean weighted ) {
97
107
// Ensure rank is within bounds
98
108
rank = Math .max (1 , Math .min (rank , Level .TEN ));
109
+ if (weighted ) {
110
+ return addon .getManager ().getWeightedTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L )
111
+ .findFirst ().map (Island ::getOwner ).map (addon .getPlayers ()::getName ).orElse ("" );
112
+ }
99
113
@ Nullable
100
114
UUID owner = addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L )
101
115
.findFirst ().flatMap (addon .getIslands ()::getIslandById ).map (Island ::getOwner ).orElse (null );
@@ -106,27 +120,42 @@ String getRankName(World world, int rank) {
106
120
/**
107
121
* Get the island name for this rank
108
122
*
109
- * @param world world
110
- * @param rank rank 1 to 10
123
+ * @param world world
124
+ * @param rank rank 1 to 10
125
+ * @param weighted if true, then the weighted rank name is returned
111
126
* @return name of island or nothing if there isn't one
112
127
*/
113
- String getRankIslandName (World world , int rank ) {
128
+ String getRankIslandName (World world , int rank , boolean weighted ) {
114
129
// Ensure rank is within bounds
115
130
rank = Math .max (1 , Math .min (rank , Level .TEN ));
131
+ if (weighted ) {
132
+ return addon .getManager ().getWeightedTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L )
133
+ .findFirst ().map (Island ::getName ).orElse ("" );
134
+ }
116
135
return addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L ).findFirst ()
117
136
.flatMap (addon .getIslands ()::getIslandById ).map (Island ::getName ).orElse ("" );
118
137
}
119
138
120
139
/**
121
140
* Gets a comma separated string of island member names
122
141
*
123
- * @param world world
124
- * @param rank rank to request
142
+ * @param world world
143
+ * @param rank rank to request
144
+ * @param weighted if true, then the weighted rank name is returned
125
145
* @return comma separated string of island member names
126
146
*/
127
- String getRankMembers (World world , int rank ) {
147
+ String getRankMembers (World world , int rank , boolean weighted ) {
128
148
// Ensure rank is within bounds
129
149
rank = Math .max (1 , Math .min (rank , Level .TEN ));
150
+ if (weighted ) {
151
+ return addon .getManager ().getWeightedTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L ).limit (1L )
152
+ .findFirst ()
153
+ .map (is -> is .getMembers ().entrySet ().stream ().filter (e -> e .getValue () >= RanksManager .MEMBER_RANK )
154
+ .sorted (Collections .reverseOrder (Map .Entry .comparingByValue ())).map (Map .Entry ::getKey )
155
+ .map (addon .getPlayers ()::getName ).collect (Collectors .joining ("," )))
156
+ .orElse ("" );
157
+ }
158
+
130
159
Optional <Island > island = addon .getManager ().getTopTen (world , Level .TEN ).keySet ().stream ().skip (rank - 1L )
131
160
.limit (1L ).findFirst ().flatMap (addon .getIslands ()::getIslandById );
132
161
@@ -140,44 +169,20 @@ String getRankMembers(World world, int rank) {
140
169
}
141
170
142
171
/**
143
- * Gets the weighted level, which is the level / number of players
172
+ * Get the level for the rank requested
144
173
*
145
- * @param world world
146
- * @param rank level
147
- * @return weighted level
174
+ * @param world world
175
+ * @param rank rank wanted
176
+ * @param weighted true if weighted (level/number of team members)
177
+ * @return level for the rank requested
148
178
*/
149
- String getWeightedRankLevel (World world , int rank ) {
179
+ String getRankLevel (World world , int rank , boolean weighted ) {
150
180
// Ensure rank is within bounds
151
181
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 "" ;
182
+ if (weighted ) {
183
+ return addon .getManager ().formatLevel (addon .getManager ().getWeightedTopTen (world , Level .TEN ).values ()
184
+ .stream ().skip (rank - 1L ).limit (1L ).findFirst ().orElse (null ));
157
185
}
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
-
176
- }
177
-
178
- String getRankLevel (World world , int rank ) {
179
- // Ensure rank is within bounds
180
- rank = Math .max (1 , Math .min (rank , Level .TEN ));
181
186
return addon .getManager ().formatLevel (addon .getManager ().getTopTen (world , Level .TEN ).values ().stream ()
182
187
.skip (rank - 1L ).limit (1L ).findFirst ().orElse (null ));
183
188
}
0 commit comments