From a95fa2efc143f7eaa21e0cfaeb186c2e70e8fc8c Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 16 Mar 2023 00:25:21 +0100 Subject: [PATCH] Refactor LootInventory & LootManager --- src/main/java/server/loot/LootInventory.java | 16 ++-- src/main/java/server/loot/LootManager.java | 78 ++++++++------------ 2 files changed, 39 insertions(+), 55 deletions(-) diff --git a/src/main/java/server/loot/LootInventory.java b/src/main/java/server/loot/LootInventory.java index 4634a87e56..b3fe3010e9 100644 --- a/src/main/java/server/loot/LootInventory.java +++ b/src/main/java/server/loot/LootInventory.java @@ -30,13 +30,13 @@ import java.util.Map; /** * @author Ronan */ -public class LootInventory { - Map items = new HashMap<>(50); +class LootInventory { + private final Map items = new HashMap<>(50); - public LootInventory(Character from) { - for (InventoryType values : InventoryType.values()) { + LootInventory(Character from) { + for (InventoryType invType : InventoryType.values()) { - for (Item it : from.getInventory(values).list()) { + for (Item it : from.getInventory(invType).list()) { Integer itemQty = items.get(it.getItemId()); if (itemQty == null) { @@ -48,9 +48,9 @@ public class LootInventory { } } - public int hasItem(int itemid, int quantity) { - Integer itemQty = items.get(itemid); - return itemQty == null ? 0 : itemQty >= quantity ? 2 : itemQty > 0 ? 1 : 0; + boolean hasItem(int itemId, int quantity) { + Integer itemQty = items.get(itemId); + return itemQty != null && itemQty >= quantity; } } diff --git a/src/main/java/server/loot/LootManager.java b/src/main/java/server/loot/LootManager.java index 14b9ce87c4..a747cc41d8 100644 --- a/src/main/java/server/loot/LootManager.java +++ b/src/main/java/server/loot/LootManager.java @@ -24,7 +24,7 @@ import server.life.MonsterDropEntry; import server.life.MonsterInformationProvider; import server.quest.Quest; -import java.util.LinkedList; +import java.util.Collections; import java.util.List; /** @@ -32,66 +32,50 @@ import java.util.List; */ public class LootManager { - private static boolean isRelevantDrop(MonsterDropEntry dropEntry, List players, List playersInv) { - int qStartAmount = 0, qCompleteAmount = 0; - Quest quest = Quest.getInstance(dropEntry.questid); - if (quest != null) { - qStartAmount = quest.getStartItemAmountNeeded(dropEntry.itemId); - qCompleteAmount = quest.getCompleteItemAmountNeeded(dropEntry.itemId); + private static boolean isRelevantDrop(MonsterDropEntry dropEntry, List chrs, List inventories) { + if (dropEntry.questid <= 0) { + return true; } - //boolean restricted = ItemInformationProvider.getInstance().isPickupRestricted(dropEntry.itemId); - for (int i = 0; i < players.size(); i++) { - LootInventory chrInv = playersInv.get(i); + Quest quest = Quest.getInstance(dropEntry.questid); + int questStartAmount = quest.getStartItemAmountNeeded(dropEntry.itemId); + int questCompleteAmount = quest.getCompleteItemAmountNeeded(dropEntry.itemId); - if (dropEntry.questid > 0) { - int qItemAmount, chrQuestStatus = players.get(i).getQuestStatus(dropEntry.questid); - if (chrQuestStatus == 0) { - qItemAmount = qStartAmount; - } else if (chrQuestStatus != 1) { - continue; - } else { - qItemAmount = qCompleteAmount; - } + for (int i = 0; i < chrs.size(); i++) { - // thanks kvmba for noticing quest items with no required amount failing to be detected as such - - int qItemStatus = chrInv.hasItem(dropEntry.itemId, qItemAmount); - if (qItemStatus == 2) { - continue; - } /*else if (restricted && qItemStatus == 1) { // one-of-a-kind loots should be available everytime, thanks onechord for noticing - continue; - }*/ - } /*else if (restricted && chrInv.hasItem(dropEntry.itemId, 1) > 0) { // thanks Conrad, Legalize for noticing eligible loots not being available to drop for non-killer parties + int chrQuestStatus = chrs.get(i).getQuestStatus(dropEntry.questid); + final int questItemAmount; + if (chrQuestStatus == 0) { + questItemAmount = questStartAmount; + } else if (chrQuestStatus == 1) { + questItemAmount = questCompleteAmount; + } else { continue; - }*/ + } - return true; + LootInventory chrInv = inventories.get(i); + boolean hasQuestItems = chrInv.hasItem(dropEntry.itemId, questItemAmount); + if (!hasQuestItems) { + return true; + } } return false; } - public static List retrieveRelevantDrops(int monsterId, List players) { - List loots = MonsterInformationProvider.getInstance().retrieveEffectiveDrop(monsterId); - if (loots.isEmpty()) { - return loots; + public static List retrieveRelevantDrops(int monsterId, List chrs) { + List drops = MonsterInformationProvider.getInstance().retrieveEffectiveDrop(monsterId); + if (drops.isEmpty()) { + return Collections.emptyList(); } - List playersInv = new LinkedList<>(); - for (Character chr : players) { - LootInventory lootInv = new LootInventory(chr); - playersInv.add(lootInv); - } + List inventories = chrs.stream() + .map(LootInventory::new) + .toList(); - List effectiveLoot = new LinkedList<>(); - for (MonsterDropEntry mde : loots) { - if (isRelevantDrop(mde, players, playersInv)) { - effectiveLoot.add(mde); - } - } - - return effectiveLoot; + return drops.stream() + .filter(entry -> isRelevantDrop(entry, chrs, inventories)) + .toList(); } }