From 8d05658214de86b061cb360ff492a38a8cd02c46 Mon Sep 17 00:00:00 2001 From: akastijn Date: Mon, 6 Jul 2026 00:04:53 +0200 Subject: [PATCH] Introduce `LootItem` record and refactor loot handling logic to support material-specific max amounts --- .../alttd/hunger_games/config/LootItems.java | 34 ++++++++++++++++--- .../hunger_games/data_objects/LootItem.java | 6 ++++ .../hunger_games/services/LootService.java | 12 +++++-- .../alttd/hunger_games/services/Round.java | 2 +- 4 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/alttd/hunger_games/data_objects/LootItem.java diff --git a/src/main/java/com/alttd/hunger_games/config/LootItems.java b/src/main/java/com/alttd/hunger_games/config/LootItems.java index 2bb5754..ee0de61 100644 --- a/src/main/java/com/alttd/hunger_games/config/LootItems.java +++ b/src/main/java/com/alttd/hunger_games/config/LootItems.java @@ -1,12 +1,16 @@ package com.alttd.hunger_games.config; +import com.alttd.hunger_games.data_objects.LootItem; import com.alttd.hunger_games.data_objects.RARITY; +import lombok.extern.slf4j.Slf4j; import org.bukkit.Material; import java.io.File; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; +@Slf4j public class LootItems extends AbstractConfig { static LootItems config; @@ -27,18 +31,40 @@ public class LootItems extends AbstractConfig { public static class ITEMS { private static final String prefix = "items."; - private static final HashMap> ITEMS = new HashMap<>(); + private static final HashMap> ITEMS = new HashMap<>(); - public static List get(RARITY rarity) { + public static List get(RARITY rarity) { return ITEMS.get(rarity); } @SuppressWarnings("unused") private static void load() { for (RARITY rarity : RARITY.values()) { - List materialNameList = ITEMS.getOrDefault(rarity, List.of()).stream().map(Material::name).toList(); + List currentItems = ITEMS.getOrDefault(rarity, List.of()); + List materialNameList = currentItems.stream() + .map(item -> item.material().name() + (item.maxAmount() > 1 ? ":" + item.maxAmount() : "")) + .toList(); List materialList = config.getList(prefix, rarity.getConfigName(), materialNameList); - ITEMS.put(rarity, materialList.stream().map(Material::getMaterial).toList()); + + List lootItems = new ArrayList<>(); + for (String entry : materialList) { + String[] split = entry.split(":"); + Material material = Material.getMaterial(split[0].toUpperCase()); + if (material == null) { + log.warn("Invalid material found in loot-items.yml: {}", split[0]); + continue; + } + int maxAmount = 1; + if (split.length > 1) { + try { + maxAmount = Integer.parseInt(split[1]); + } catch (NumberFormatException ignored) { + log.error("Invalid max amount found in loot-items.yml: {}", split[1]); + } + } + lootItems.add(new LootItem(material, maxAmount)); + } + ITEMS.put(rarity, lootItems); } } } diff --git a/src/main/java/com/alttd/hunger_games/data_objects/LootItem.java b/src/main/java/com/alttd/hunger_games/data_objects/LootItem.java new file mode 100644 index 0000000..4be188b --- /dev/null +++ b/src/main/java/com/alttd/hunger_games/data_objects/LootItem.java @@ -0,0 +1,6 @@ +package com.alttd.hunger_games.data_objects; + +import org.bukkit.Material; + +public record LootItem(Material material, int maxAmount) { +} diff --git a/src/main/java/com/alttd/hunger_games/services/LootService.java b/src/main/java/com/alttd/hunger_games/services/LootService.java index 094735e..cca9738 100644 --- a/src/main/java/com/alttd/hunger_games/services/LootService.java +++ b/src/main/java/com/alttd/hunger_games/services/LootService.java @@ -1,6 +1,7 @@ package com.alttd.hunger_games.services; import com.alttd.hunger_games.config.LootItems; +import com.alttd.hunger_games.data_objects.LootItem; import com.alttd.hunger_games.data_objects.RARITY; import lombok.extern.slf4j.Slf4j; import net.kyori.adventure.text.Component; @@ -38,15 +39,20 @@ public class LootService { for (int i = 0; i < itemCount; i++) { int slot = random.nextInt(27); RARITY rarity = decideRarity(); - List possibleItems = LootItems.ITEMS.get(rarity); + List possibleItems = LootItems.ITEMS.get(rarity); if (possibleItems == null || possibleItems.isEmpty()) { log.warn("No items found for rarity: {}", rarity); continue; } - Material material = possibleItems.get(random.nextInt(possibleItems.size())); - inventory.setItem(slot, new ItemStack(material)); + LootItem lootItem = possibleItems.get(random.nextInt(possibleItems.size())); + if (lootItem == null || lootItem.material() == null) { + log.warn("LootItem or material is null for rarity: {}", rarity); + continue; + } + int amount = lootItem.maxAmount() > 1 ? random.nextInt(lootItem.maxAmount()) + 1 : 1; + inventory.setItem(slot, new ItemStack(lootItem.material(), amount)); } return inventory; diff --git a/src/main/java/com/alttd/hunger_games/services/Round.java b/src/main/java/com/alttd/hunger_games/services/Round.java index 8708c81..951e8d3 100644 --- a/src/main/java/com/alttd/hunger_games/services/Round.java +++ b/src/main/java/com/alttd/hunger_games/services/Round.java @@ -91,7 +91,7 @@ public class Round { startCountdown(Config.ROUND.SAFE_PHASE, () -> { nextStage(); // SAFE_PHASE -> KILL_PHASE GameStageHandler.broadcastMessage(Messages.GAME.NEXT_STATE.replace("", roundState.getHumanReadableName())); - startCountdown(Config.ROUND.KILL_PHASE, () -> scheduleNextStage(0)); + scheduleNextStage(0); }); }); }