|
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