Fix getting too many/few prizes

This commit is contained in:
akastijn 2026-04-05 16:14:12 +02:00
parent 8b1b3c4b5a
commit d3c4f77931
2 changed files with 27 additions and 20 deletions

View File

@ -1,9 +1,12 @@
package com.alttd.easter.gui; package com.alttd.easter.gui;
import com.alttd.easter.config.Config;
import com.alttd.easter.config.Messages; import com.alttd.easter.config.Messages;
import com.alttd.easter.data.DataManager; import com.alttd.easter.data.DataManager;
import com.alttd.easter.egg.EggType; import com.alttd.easter.egg.EggType;
import com.alttd.easter.util.ItemUtils; 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 net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -25,14 +28,8 @@ public class TurnInGuiManager implements Listener {
this.dataManager = dataManager; this.dataManager = dataManager;
} }
private String title() { private Component title() {
// crude strip of minimessage tags for inventory title return MiniMessage.miniMessage().deserialize(Messages.RABBIT.GUI_TITLE);
String mm = Messages.RABBIT.GUI_TITLE;
String plain = mm.replaceAll("<[^>]+>", "");
if (plain.isBlank()) {
plain = "Turn in Eggs";
}
return plain;
} }
public void open(Player player) { public void open(Player player) {
@ -98,7 +95,9 @@ public class TurnInGuiManager implements Listener {
player.sendRichMessage(Messages.RABBIT.NO_EGGS); player.sendRichMessage(Messages.RABBIT.NO_EGGS);
return; 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(); dataManager.save();
// Dialog formatting for submission summary // Dialog formatting for submission summary
List<String> colors = submitted.stream().map(ItemUtils::colorName).toList(); List<String> colors = submitted.stream().map(ItemUtils::colorName).toList();
@ -118,9 +117,12 @@ public class TurnInGuiManager implements Listener {
Placeholder.parsed("egg3", c3) Placeholder.parsed("egg3", c3)
); );
} }
int total = dataManager.getPlayerEggs(player.getUniqueId()).size(); int newTotal = prevTotal + newlyAdded;
if (total % 4 == 0) { int prevMilestones = prevTotal / 4;
var prize = com.alttd.easter.config.Config.PRIZES.getRandomPrize(); 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) { if (prize != null) {
player.getInventory().addItem(prize); player.getInventory().addItem(prize);
} }

View File

@ -4,13 +4,11 @@ import com.alttd.easter.config.Config;
import com.alttd.easter.config.Messages; import com.alttd.easter.config.Messages;
import com.alttd.easter.gui.TurnInGuiManager; import com.alttd.easter.gui.TurnInGuiManager;
import com.alttd.easter.util.Keys; import com.alttd.easter.util.Keys;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Entity; import org.bukkit.entity.*;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Rabbit;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
@ -37,8 +35,8 @@ public class RabbitNpcManager implements Listener {
private void spawnOrFindRabbit() { private void spawnOrFindRabbit() {
// Find existing rabbit with tag, else spawn new at config location // Find existing rabbit with tag, else spawn new at config location
for (World world : Bukkit.getWorlds()) { for (World world : Bukkit.getWorlds()) {
for (Entity e : world.getEntitiesByClass(Rabbit.class)) { for (Entity entity : world.getEntitiesByClass(Rabbit.class)) {
if (e.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) { if (entity.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) {
return; return;
} }
} }
@ -49,13 +47,20 @@ public class RabbitNpcManager implements Listener {
} }
Rabbit rabbit = (Rabbit) loc.getWorld().spawnEntity(loc, EntityType.RABBIT); Rabbit rabbit = (Rabbit) loc.getWorld().spawnEntity(loc, EntityType.RABBIT);
rabbit.setCustomNameVisible(true); 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); rabbit.getPersistentDataContainer().set(Keys.RABBIT_NPC, PersistentDataType.BYTE, (byte) 1);
} }
@EventHandler @EventHandler
public void onInteract(PlayerInteractAtEntityEvent event) { 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; return;
} }
event.setCancelled(true); event.setCancelled(true);