|
1 | 1 | package net.william278.husktowns;
|
2 | 2 |
|
3 | 3 | import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
| 4 | +import net.roxeez.advancement.AdvancementManager; |
| 5 | +import net.roxeez.advancement.display.BackgroundType; |
| 6 | +import net.roxeez.advancement.display.FrameType; |
| 7 | +import net.roxeez.advancement.trigger.TriggerType; |
4 | 8 | import net.william278.desertwell.Version;
|
| 9 | +import net.william278.husktowns.advancement.Advancement; |
5 | 10 | import net.william278.husktowns.claim.ClaimWorld;
|
6 | 11 | import net.william278.husktowns.claim.Position;
|
7 | 12 | import net.william278.husktowns.claim.World;
|
|
30 | 35 | import org.bstats.bukkit.Metrics;
|
31 | 36 | import org.bstats.charts.SimplePie;
|
32 | 37 | import org.bukkit.Bukkit;
|
| 38 | +import org.bukkit.Material; |
| 39 | +import org.bukkit.NamespacedKey; |
| 40 | +import org.bukkit.advancement.AdvancementProgress; |
33 | 41 | import org.bukkit.entity.Player;
|
34 | 42 | import org.bukkit.plugin.PluginDescriptionFile;
|
35 | 43 | import org.bukkit.plugin.PluginManager;
|
@@ -61,6 +69,7 @@ public final class BukkitHuskTowns extends JavaPlugin implements HuskTowns, Plug
|
61 | 69 | private Validator validator;
|
62 | 70 | private OperationHandler operationHandler;
|
63 | 71 | private SpecialTypes specialTypes;
|
| 72 | + private Advancement advancements; |
64 | 73 | private Map<UUID, Deque<Invite>> invites = new HashMap<>();
|
65 | 74 | private Map<UUID, Preferences> userPreferences = new HashMap<>();
|
66 | 75 | private Map<UUID, Visualizer> visualizers = new HashMap<>();
|
@@ -424,6 +433,71 @@ private void initializeMetrics() {
|
424 | 433 | }
|
425 | 434 | }
|
426 | 435 |
|
| 436 | + @Override |
| 437 | + public void awardAdvancement(@NotNull Advancement advancement, @NotNull OnlineUser user) { |
| 438 | + final NamespacedKey key = NamespacedKey.fromString(advancement.getKey(), this); |
| 439 | + if (key == null) { |
| 440 | + return; |
| 441 | + } |
| 442 | + |
| 443 | + final org.bukkit.advancement.Advancement bukkitAdvancement = Bukkit.getAdvancement(key); |
| 444 | + if (bukkitAdvancement == null) { |
| 445 | + return; |
| 446 | + } |
| 447 | + final AdvancementProgress progress = ((BukkitUser)user).getPlayer().getAdvancementProgress(bukkitAdvancement); |
| 448 | + if (progress.isDone()) { |
| 449 | + return; |
| 450 | + } |
| 451 | + getPlugin().runSync(() -> bukkitAdvancement.getCriteria().forEach(progress::awardCriteria)); |
| 452 | + } |
| 453 | + |
| 454 | + @Override |
| 455 | + public Optional<Advancement> getAdvancements() { |
| 456 | + return Optional.ofNullable(advancements); |
| 457 | + } |
| 458 | + |
| 459 | + @Override |
| 460 | + public void setAdvancements(@NotNull Advancement advancements) { |
| 461 | + this.advancements = advancements; |
| 462 | + |
| 463 | + this.runSync(() -> { |
| 464 | + final AdvancementManager manager = new AdvancementManager(this); |
| 465 | + registerAdvancement(advancements, manager, null); |
| 466 | + manager.createAll(true); |
| 467 | + }); |
| 468 | + } |
| 469 | + |
| 470 | + private void registerAdvancement(@NotNull Advancement advancement, @NotNull AdvancementManager manager, |
| 471 | + @Nullable net.roxeez.advancement.Advancement parent) { |
| 472 | + final NamespacedKey key = NamespacedKey.fromString(advancement.getKey(), this); |
| 473 | + if (key == null) { |
| 474 | + return; |
| 475 | + } |
| 476 | + |
| 477 | + final net.roxeez.advancement.Advancement bukkitAdvancement = new net.roxeez.advancement.Advancement(key); |
| 478 | + manager.register(((context) -> { |
| 479 | + bukkitAdvancement.setDisplay(display -> { |
| 480 | + display.setTitle(advancement.getTitle()); |
| 481 | + display.setDescription(advancement.getDescription()); |
| 482 | + display.setIcon(Optional.ofNullable(Material.matchMaterial(advancement.getIcon())).orElse(Material.STONE)); |
| 483 | + display.setBackground(BackgroundType.GRANITE); |
| 484 | + display.setToast(advancement.doSendNotification()); |
| 485 | + display.setAnnounce(advancement.doSendNotification()); |
| 486 | + display.setFrame(switch (advancement.getFrame()) { |
| 487 | + case TASK -> FrameType.TASK; |
| 488 | + case CHALLENGE -> FrameType.CHALLENGE; |
| 489 | + case GOAL -> FrameType.GOAL; |
| 490 | + }); |
| 491 | + }); |
| 492 | + if (parent != null) { |
| 493 | + bukkitAdvancement.setParent(parent.getKey()); |
| 494 | + } |
| 495 | + bukkitAdvancement.addCriteria("husktowns_completed", TriggerType.IMPOSSIBLE, (impossible -> {})); |
| 496 | + return bukkitAdvancement; |
| 497 | + })); |
| 498 | + advancement.getChildren().forEach(child -> registerAdvancement(child, manager, bukkitAdvancement)); |
| 499 | + } |
| 500 | + |
427 | 501 | @Override
|
428 | 502 | @NotNull
|
429 | 503 | public BukkitHuskTowns getPlugin() {
|
|
0 commit comments