From d3c4f7793196c529539a6cd599e6443b1e31d93e Mon Sep 17 00:00:00 2001 From: akastijn Date: Sun, 5 Apr 2026 16:14:12 +0200 Subject: [PATCH] Fix getting too many/few prizes --- .../alttd/easter/gui/TurnInGuiManager.java | 26 ++++++++++--------- .../alttd/easter/npc/RabbitNpcManager.java | 21 +++++++++------ 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/alttd/easter/gui/TurnInGuiManager.java b/src/main/java/com/alttd/easter/gui/TurnInGuiManager.java index 4d5de89..441616e 100644 --- a/src/main/java/com/alttd/easter/gui/TurnInGuiManager.java +++ b/src/main/java/com/alttd/easter/gui/TurnInGuiManager.java @@ -1,9 +1,12 @@ package com.alttd.easter.gui; +import com.alttd.easter.config.Config; import com.alttd.easter.config.Messages; import com.alttd.easter.data.DataManager; import com.alttd.easter.egg.EggType; import com.alttd.easter.util.ItemUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -25,14 +28,8 @@ public class TurnInGuiManager implements Listener { this.dataManager = dataManager; } - private String title() { - // crude strip of minimessage tags for inventory title - String mm = Messages.RABBIT.GUI_TITLE; - String plain = mm.replaceAll("<[^>]+>", ""); - if (plain.isBlank()) { - plain = "Turn in Eggs"; - } - return plain; + private Component title() { + return MiniMessage.miniMessage().deserialize(Messages.RABBIT.GUI_TITLE); } public void open(Player player) { @@ -98,7 +95,9 @@ public class TurnInGuiManager implements Listener { player.sendRichMessage(Messages.RABBIT.NO_EGGS); return; } - dataManager.addEggs(player.getUniqueId(), submitted); + // determine how many new unique egg types were added so we can award correct number of prizes + int prevTotal = dataManager.getPlayerEggs(player.getUniqueId()).size(); + int newlyAdded = dataManager.addEggs(player.getUniqueId(), submitted); dataManager.save(); // Dialog formatting for submission summary List colors = submitted.stream().map(ItemUtils::colorName).toList(); @@ -118,9 +117,12 @@ public class TurnInGuiManager implements Listener { Placeholder.parsed("egg3", c3) ); } - int total = dataManager.getPlayerEggs(player.getUniqueId()).size(); - if (total % 4 == 0) { - var prize = com.alttd.easter.config.Config.PRIZES.getRandomPrize(); + int newTotal = prevTotal + newlyAdded; + int prevMilestones = prevTotal / 4; + int newMilestones = newTotal / 4; + int prizesToGive = Math.max(0, newMilestones - prevMilestones); + for (int i = 0; i < prizesToGive; i++) { + var prize = Config.PRIZES.getRandomPrize(); if (prize != null) { player.getInventory().addItem(prize); } diff --git a/src/main/java/com/alttd/easter/npc/RabbitNpcManager.java b/src/main/java/com/alttd/easter/npc/RabbitNpcManager.java index 56116fc..c548dd4 100644 --- a/src/main/java/com/alttd/easter/npc/RabbitNpcManager.java +++ b/src/main/java/com/alttd/easter/npc/RabbitNpcManager.java @@ -4,13 +4,11 @@ import com.alttd.easter.config.Config; import com.alttd.easter.config.Messages; import com.alttd.easter.gui.TurnInGuiManager; import com.alttd.easter.util.Keys; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.entity.Rabbit; +import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -37,8 +35,8 @@ public class RabbitNpcManager implements Listener { private void spawnOrFindRabbit() { // Find existing rabbit with tag, else spawn new at config location for (World world : Bukkit.getWorlds()) { - for (Entity e : world.getEntitiesByClass(Rabbit.class)) { - if (e.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) { + for (Entity entity : world.getEntitiesByClass(Rabbit.class)) { + if (entity.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) { return; } } @@ -49,13 +47,20 @@ public class RabbitNpcManager implements Listener { } Rabbit rabbit = (Rabbit) loc.getWorld().spawnEntity(loc, EntityType.RABBIT); rabbit.setCustomNameVisible(true); - rabbit.customName(net.kyori.adventure.text.Component.text("Easter Bunny")); + rabbit.setInvulnerable(true); + rabbit.setSilent(true); + rabbit.setGlowing(true); + rabbit.setGravity(false); + rabbit.setAI(false); + rabbit.customName(Component.text("Easter Bunny")); rabbit.getPersistentDataContainer().set(Keys.RABBIT_NPC, PersistentDataType.BYTE, (byte) 1); } @EventHandler public void onInteract(PlayerInteractAtEntityEvent event) { - if (!(event.getRightClicked() instanceof Rabbit) && !(event.getRightClicked() instanceof org.bukkit.entity.LivingEntity le && le.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE))) { + if (!(event.getRightClicked() instanceof Rabbit) + && !(event.getRightClicked() instanceof LivingEntity livingEntity + && livingEntity.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE))) { return; } event.setCancelled(true);