diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/Advancements.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/Advancements.java new file mode 100644 index 0000000..85682de --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/Advancements.java @@ -0,0 +1,11 @@ +package eu.mhsl.craftattack.spawn.appliances.customAdvancements; + +public class Advancements { + public static String searchTrouble = "search_trouble"; + public static String fleischerchest = "fleischerchest"; + public static String craftPixelblock = "craft_pixelblock"; + public static String usePixelblock = "use_pixelblock"; + public static String start = "start"; + public static String winner = "winner"; + public static String participateEvent = "participate_event"; +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java index 9a92105..1dc82d2 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancements.java @@ -1,23 +1,62 @@ package eu.mhsl.craftattack.spawn.appliances.customAdvancements; +import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliances.customAdvancements.listener.ApplyPendingAdvancementsListener; +import eu.mhsl.craftattack.spawn.appliances.customAdvancements.listener.CustomAdvancementsListener; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; +import org.bukkit.advancement.Advancement; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.UUID; public class CustomAdvancements extends Appliance { - public void grantAdvancement(String advancementName, Player player) { - player.getAdvancementProgress(Objects.requireNonNull(Bukkit.getAdvancement(Objects.requireNonNull(NamespacedKey.fromString("custom_advancements:craftattack/" + advancementName))))).awardCriteria("criteria"); + record PendingAdvancement(UUID receiver, String advancement) { + } + + private final List pendingAdvancements = new ArrayList<>(); + + public void grantAdvancement(String advancementName, UUID playerUUID) { + Player player = Bukkit.getPlayer(playerUUID); + if(player == null) { + addPendingAdvancement(playerUUID, advancementName); + return; + } + + try { + NamespacedKey namespacedKey = Objects.requireNonNull(NamespacedKey.fromString("custom_advancements:craftattack/" + advancementName), "NamespacedKey is invalid!"); + Advancement advancement = Objects.requireNonNull(Bukkit.getAdvancement(namespacedKey), "The advancement does not exist!"); + player.getAdvancementProgress(advancement).awardCriteria("criteria"); + } catch (Exception e) { + Main.logger().info("Advancement " + advancementName + " not found! (is Custom Advancements data pack loaded?)"); + throw e; + } + } + + public void applyPendingAdvancements(Player player) { + if(this.pendingAdvancements.isEmpty()) return; + List grantedAdvancements = pendingAdvancements.stream() + .filter(pendingAdvancement -> pendingAdvancement.receiver.equals(player.getUniqueId())).toList(); + this.pendingAdvancements.removeAll(grantedAdvancements); + grantedAdvancements.forEach(pendingAdvancement -> grantAdvancement(pendingAdvancement.advancement(), player.getUniqueId())); + } + + private void addPendingAdvancement(UUID receiver, String advancement) { + pendingAdvancements.add(new PendingAdvancement(receiver, advancement)); } @Override @NotNull protected List listeners() { - return List.of(new CustomAdvancementsDamageEntityListener()); + return List.of( + new CustomAdvancementsListener(), + new ApplyPendingAdvancementsListener() + ); } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java deleted file mode 100644 index 047d34a..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java +++ /dev/null @@ -1,19 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.customAdvancements; - -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.EntityDamageByEntityEvent; - -public class CustomAdvancementsDamageEntityListener extends ApplianceListener { - @EventHandler - public void onEntityDamageEntity(EntityDamageByEntityEvent event) { - if(!(event.getEntity() instanceof Player damaged)) return; - if(!(event.getDamager() instanceof Player damager)) return; - if(!damager.getInventory().getItemInMainHand().getType().equals(Material.AIR)) return; - if(!damaged.hasPermission("admin")) return; - - getAppliance().grantAdvancement("search_trouble", damager); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/ApplyPendingAdvancementsListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/ApplyPendingAdvancementsListener.java new file mode 100644 index 0000000..4390fdf --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/ApplyPendingAdvancementsListener.java @@ -0,0 +1,13 @@ +package eu.mhsl.craftattack.spawn.appliances.customAdvancements.listener; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.appliances.customAdvancements.CustomAdvancements; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +public class ApplyPendingAdvancementsListener extends ApplianceListener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + getAppliance().applyPendingAdvancements(event.getPlayer()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/CustomAdvancementsListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/CustomAdvancementsListener.java new file mode 100644 index 0000000..ace859e --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/CustomAdvancementsListener.java @@ -0,0 +1,48 @@ +package eu.mhsl.craftattack.spawn.appliances.customAdvancements.listener; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.appliances.customAdvancements.Advancements; +import eu.mhsl.craftattack.spawn.appliances.customAdvancements.CustomAdvancements; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.inventory.ItemStack; + +public class CustomAdvancementsListener extends ApplianceListener { + @EventHandler + public void onEntityDamageEntity(EntityDamageByEntityEvent event) { + if(!(event.getEntity() instanceof Player damaged)) return; + if(!(event.getDamager() instanceof Player damager)) return; + if(!damager.getInventory().getItemInMainHand().getType().equals(Material.AIR)) return; + if(!damaged.hasPermission("admin")) return; + + getAppliance().grantAdvancement(Advancements.searchTrouble, damager.getUniqueId()); + } + + @EventHandler + public void onCraftItem(CraftItemEvent event) { + ItemStack result = event.getInventory().getResult(); + if(result == null) return; + if(!(event.getView().getPlayer() instanceof Player player)) return; + + if(result.getType() == Material.RED_SHULKER_BOX) { + getAppliance().grantAdvancement(Advancements.fleischerchest, player.getUniqueId()); + return; + } + + if(result.getItemMeta().itemName().equals(Component.text("98fdf0ae-c3ab-4ef7-ae25-efd518d600de"))) { + getAppliance().grantAdvancement(Advancements.craftPixelblock, player.getUniqueId()); + } + } + + @EventHandler + public void onChangeWorld(PlayerChangedWorldEvent event) { + if(!event.getPlayer().getWorld().getName().startsWith("plugins/PixelBlocks/worlds")) return; + + getAppliance().grantAdvancement(Advancements.usePixelblock, event.getPlayer().getUniqueId()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java index 4609f06..a25e690 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java @@ -5,6 +5,8 @@ import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.api.HttpServer; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.customAdvancements.Advancements; +import eu.mhsl.craftattack.spawn.appliances.customAdvancements.CustomAdvancements; import eu.mhsl.craftattack.spawn.appliances.event.command.*; import eu.mhsl.craftattack.spawn.appliances.event.listener.ApplyPendingRewardsListener; import eu.mhsl.craftattack.spawn.util.IteratorUtil; @@ -172,12 +174,19 @@ public class Event extends Appliance { memorialItem.setItemMeta(meta); Reward memorial = new Reward(uuid, memorialItem); + Main.instance().getAppliance(CustomAdvancements.class).grantAdvancement(Advancements.participateEvent, uuid); + if(Bukkit.getPlayer(uuid) == null) { pendingRewards.add(memorial); return; } giveReward(memorial); }); + + rewardConfiguration.rewards.keySet().stream() + .max(Comparator.comparing(rewardConfiguration.rewards::get)) + .ifPresent(uuid -> Main.instance().getAppliance(CustomAdvancements.class) + .grantAdvancement(Advancements.winner, uuid)); } private void giveReward(Reward reward) { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java index 964bb90..833ea6f 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/fleischerchest/FleischerchestCraftItemListener.java @@ -11,8 +11,8 @@ public class FleischerchestCraftItemListener extends ApplianceListener Main.instance().getAppliance(CustomAdvancements.class).grantAdvancement(Advancements.start, player.getUniqueId()) + ); + blockCycle.reset(); }