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 4b22c1f..6ef7ae8 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 @@ -2,27 +2,60 @@ 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) { + 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 { - player.getAdvancementProgress(Objects.requireNonNull(Bukkit.getAdvancement(Objects.requireNonNull(NamespacedKey.fromString("custom_advancements:craftattack/" + advancementName))))).awardCriteria("criteria"); + NamespacedKey namespacedKey = Objects.requireNonNull(NamespacedKey.fromString("custom_advancements:craftattack/" + advancementName)); + Advancement advancement = Objects.requireNonNull(Bukkit.getAdvancement(namespacedKey)); + player.getAdvancementProgress(advancement).awardCriteria("criteria"); } catch (Exception e) { Main.logger().info("Custom Advancements Datapack not found!"); } } + 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())); + } + + public 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/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/CustomAdvancementsDamageEntityListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/CustomAdvancementsListener.java similarity index 64% rename from src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java rename to src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/CustomAdvancementsListener.java index 6c1aa7e..0389bda 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/CustomAdvancementsDamageEntityListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/customAdvancements/listener/CustomAdvancementsListener.java @@ -1,6 +1,8 @@ -package eu.mhsl.craftattack.spawn.appliances.customAdvancements; +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; @@ -10,7 +12,7 @@ import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.inventory.ItemStack; -public class CustomAdvancementsDamageEntityListener extends ApplianceListener { +public class CustomAdvancementsListener extends ApplianceListener { @EventHandler public void onEntityDamageEntity(EntityDamageByEntityEvent event) { if(!(event.getEntity() instanceof Player damaged)) return; @@ -18,7 +20,7 @@ public class CustomAdvancementsDamageEntityListener extends ApplianceListener 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/projectStart/ProjectStart.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/ProjectStart.java index e12abce..6cdc0dd 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/ProjectStart.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/projectStart/ProjectStart.java @@ -1,7 +1,10 @@ package eu.mhsl.craftattack.spawn.appliances.projectStart; +import eu.mhsl.craftattack.spawn.Main; 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.projectStart.command.ProjectStartCancelCommand; import eu.mhsl.craftattack.spawn.appliances.projectStart.command.ProjectStartCommand; import eu.mhsl.craftattack.spawn.appliances.projectStart.command.ProjectStartResetCommand; @@ -140,6 +143,10 @@ public class ProjectStart extends Appliance { ) ); + Bukkit.getOnlinePlayers().forEach( + player -> Main.instance().getAppliance(CustomAdvancements.class).grantAdvancement(Advancements.start, player.getUniqueId()) + ); + blockCycle.reset(); }