|
31 | 31 | import java.util.Map;
|
32 | 32 | import java.util.Objects;
|
33 | 33 | import java.util.UUID;
|
| 34 | +import java.util.concurrent.CompletableFuture; |
34 | 35 | import java.util.stream.Collectors;
|
35 | 36 |
|
36 | 37 | import org.bukkit.Bukkit;
|
|
56 | 57 | *
|
57 | 58 | */
|
58 | 59 | public class Store {
|
| 60 | + private static final Material[] MAT = Material.values(); |
59 | 61 | private static final CharSequence THE_END = "_the_end";
|
60 | 62 | private static final CharSequence NETHER = "_nether";
|
61 | 63 | private final Database<InventoryStorage> database;
|
@@ -247,50 +249,56 @@ public void storeAndSave(Player player, World world) {
|
247 | 249 | store.setEnderChest(overworldName, contents);
|
248 | 250 | }
|
249 | 251 | if (addon.getSettings().isStatistics()) {
|
250 |
| - saveStats(store, player, overworldName); |
| 252 | + saveStats(store, player, overworldName).thenAccept(database::saveObjectAsync); |
| 253 | + return; |
251 | 254 | }
|
252 | 255 | database.saveObjectAsync(store);
|
253 | 256 | }
|
254 | 257 |
|
255 |
| - private void saveStats(InventoryStorage store, Player player, String worldName) { |
| 258 | + private CompletableFuture<InventoryStorage> saveStats(InventoryStorage store, Player player, String worldName) { |
| 259 | + CompletableFuture<InventoryStorage> result = new CompletableFuture<>(); |
256 | 260 | store.clearStats(worldName);
|
257 | 261 | // Statistics
|
258 |
| - Arrays.stream(Statistic.values()).forEach(s -> { |
259 |
| - Map<Material, Integer> map; |
260 |
| - Map<EntityType, Integer> entMap; |
261 |
| - switch (s.getType()) { |
262 |
| - case BLOCK -> { |
263 |
| - map = Arrays.stream(Material.values()).filter(Material::isBlock).filter(m -> !m.isLegacy()) |
264 |
| - .filter(m -> player.getStatistic(s, m) > 0) |
265 |
| - .collect(Collectors.toMap(k -> k, v -> player.getStatistic(s, v))); |
266 |
| - if (!map.isEmpty()) { |
267 |
| - store.getBlockStats(worldName).put(s, map); |
| 262 | + Bukkit.getScheduler().runTaskAsynchronously(addon.getPlugin(), () -> { |
| 263 | + Arrays.stream(Statistic.values()).forEach(s -> { |
| 264 | + Map<Material, Integer> map; |
| 265 | + Map<EntityType, Integer> entMap; |
| 266 | + switch (s.getType()) { |
| 267 | + case BLOCK -> { |
| 268 | + map = Arrays.stream(MAT).filter(Material::isBlock).filter(m -> !m.isLegacy()) |
| 269 | + .filter(m -> player.getStatistic(s, m) > 0) |
| 270 | + .collect(Collectors.toMap(k -> k, v -> player.getStatistic(s, v))); |
| 271 | + if (!map.isEmpty()) { |
| 272 | + store.getBlockStats(worldName).put(s, map); |
| 273 | + } |
268 | 274 | }
|
269 |
| - } |
270 |
| - case ITEM -> { |
271 |
| - map = Arrays.stream(Material.values()).filter(Material::isItem).filter(m -> !m.isLegacy()) |
272 |
| - .filter(m -> player.getStatistic(s, m) > 0) |
273 |
| - .collect(Collectors.toMap(k -> k, v -> player.getStatistic(s, v))); |
274 |
| - if (!map.isEmpty()) { |
275 |
| - store.getItemStats(worldName).put(s, map); |
| 275 | + case ITEM -> { |
| 276 | + map = Arrays.stream(MAT).filter(Material::isItem).filter(m -> !m.isLegacy()) |
| 277 | + .filter(m -> player.getStatistic(s, m) > 0) |
| 278 | + .collect(Collectors.toMap(k -> k, v -> player.getStatistic(s, v))); |
| 279 | + if (!map.isEmpty()) { |
| 280 | + store.getItemStats(worldName).put(s, map); |
| 281 | + } |
276 | 282 | }
|
277 |
| - } |
278 |
| - case ENTITY -> { |
279 |
| - entMap = Arrays.stream(EntityType.values()).filter(EntityType::isAlive) |
280 |
| - .filter(m -> player.getStatistic(s, m) > 0) |
281 |
| - .collect(Collectors.toMap(k -> k, v -> player.getStatistic(s, v))); |
282 |
| - if (!entMap.isEmpty()) { |
283 |
| - store.getEntityStats(worldName).put(s, entMap); |
| 283 | + case ENTITY -> { |
| 284 | + entMap = Arrays.stream(EntityType.values()).filter(EntityType::isAlive) |
| 285 | + .filter(m -> player.getStatistic(s, m) > 0) |
| 286 | + .collect(Collectors.toMap(k -> k, v -> player.getStatistic(s, v))); |
| 287 | + if (!entMap.isEmpty()) { |
| 288 | + store.getEntityStats(worldName).put(s, entMap); |
| 289 | + } |
284 | 290 | }
|
285 |
| - } |
286 |
| - case UNTYPED -> { |
287 |
| - int sc = player.getStatistic(s); |
288 |
| - if (sc > 0) { |
289 |
| - store.getUntypedStats(worldName).put(s, sc); |
| 291 | + case UNTYPED -> { |
| 292 | + int sc = player.getStatistic(s); |
| 293 | + if (sc > 0) { |
| 294 | + store.getUntypedStats(worldName).put(s, sc); |
| 295 | + } |
290 | 296 | }
|
291 |
| - } |
292 |
| - } |
| 297 | + } |
| 298 | + }); |
| 299 | + result.complete(store); |
293 | 300 | });
|
| 301 | + return result; |
294 | 302 |
|
295 | 303 | }
|
296 | 304 |
|
|
0 commit comments