From 62253cc016c0f3ee2d980d2ab316933a57faef40 Mon Sep 17 00:00:00 2001 From: Paul Coene Date: Sun, 24 Oct 2021 17:17:42 -0400 Subject: [PATCH] [Bug Fix] Edge cases where min_drop 1 not honored with valid choices (#1617) * [Bug Fix] Edge cases where min_drop 1 not honored with valid choices * Forgot header file change. * Remove verbose option from MeetsLootDropLevelRequirements per @akka * Fix spacing * Restore verbose mode after further consideration * Remove logging on counting of valid items Co-authored-by: Noudess --- zone/loottables.cpp | 56 ++++++++++++++++++++++++++------------------- zone/npc.h | 2 +- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/zone/loottables.cpp b/zone/loottables.cpp index b4e0f00f0..4bcfc81e2 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -133,7 +133,7 @@ void ZoneDatabase::AddLootDropToNPC(NPC *npc, uint32 lootdrop_id, ItemList *item int charges = loot_drop->Entries[i].multiplier; for (int j = 0; j < charges; ++j) { if (zone->random.Real(0.0, 100.0) <= loot_drop->Entries[i].chance && - npc->MeetsLootDropLevelRequirements(loot_drop->Entries[i])) { + npc->MeetsLootDropLevelRequirements(loot_drop->Entries[i], true)) { const EQ::ItemData *database_item = GetItem(loot_drop->Entries[i].item_id); npc->AddLootDrop( database_item, @@ -155,29 +155,29 @@ void ZoneDatabase::AddLootDropToNPC(NPC *npc, uint32 lootdrop_id, ItemList *item } float roll_t = 0.0f; - float roll_t_min = 0.0f; bool active_item_list = false; for (uint32 i = 0; i < loot_drop->NumEntries; ++i) { const EQ::ItemData *db_item = GetItem(loot_drop->Entries[i].item_id); - if (db_item) { + if (db_item && npc->MeetsLootDropLevelRequirements(loot_drop->Entries[i])) { roll_t += loot_drop->Entries[i].chance; active_item_list = true; } } - roll_t_min = roll_t; - roll_t = EQ::ClampLower(roll_t, 100.0f); - if (!active_item_list) { return; } for (int i = 0; i < mindrop; ++i) { - float roll = (float) zone->random.Real(0.0, roll_t_min); + float roll = (float) zone->random.Real(0.0, roll_t); for (uint32 j = 0; j < loot_drop->NumEntries; ++j) { const EQ::ItemData *db_item = GetItem(loot_drop->Entries[j].item_id); if (db_item) { - if (roll < loot_drop->Entries[j].chance && npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) { + // if it doesn't meet the requirements do nothing + if (!npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) + continue; + + if (roll < loot_drop->Entries[j].chance) { npc->AddLootDrop( db_item, item_list, @@ -213,7 +213,11 @@ void ZoneDatabase::AddLootDropToNPC(NPC *npc, uint32 lootdrop_id, ItemList *item for (uint32 j = 0; j < loot_drop->NumEntries; ++j) { const EQ::ItemData *db_item = GetItem(loot_drop->Entries[j].item_id); if (db_item) { - if (roll < loot_drop->Entries[j].chance && npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) { + // if it doesn't meet the requirements do nothing + if (!npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) + continue; + + if (roll < loot_drop->Entries[j].chance) { npc->AddLootDrop( db_item, item_list, @@ -250,27 +254,31 @@ void ZoneDatabase::AddLootDropToNPC(NPC *npc, uint32 lootdrop_id, ItemList *item // npc->SendAppearancePacket(AT_Light, npc->GetActiveLightValue()); } -bool NPC::MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop) +bool NPC::MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop, bool verbose) { if (loot_drop.npc_min_level > 0 && GetLevel() < loot_drop.npc_min_level) { - LogLootDetail( - "NPC [{}] does not meet loot_drop level requirements (min_level) level [{}] current [{}] for item [{}]", - GetCleanName(), - loot_drop.npc_min_level, - GetLevel(), - database.CreateItemLink(loot_drop.item_id) - ); + if (verbose) { + LogLootDetail( + "NPC [{}] does not meet loot_drop level requirements (min_level) level [{}] current [{}] for item [{}]", + GetCleanName(), + loot_drop.npc_min_level, + GetLevel(), + database.CreateItemLink(loot_drop.item_id) + ); + } return false; } if (loot_drop.npc_max_level > 0 && GetLevel() > loot_drop.npc_max_level) { - LogLootDetail( - "NPC [{}] does not meet loot_drop level requirements (max_level) level [{}] current [{}] for item [{}]", - GetCleanName(), - loot_drop.npc_max_level, - GetLevel(), - database.CreateItemLink(loot_drop.item_id) - ); + if (verbose) { + LogLootDetail( + "NPC [{}] does not meet loot_drop level requirements (max_level) level [{}] current [{}] for item [{}]", + GetCleanName(), + loot_drop.npc_max_level, + GetLevel(), + database.CreateItemLink(loot_drop.item_id) + ); + } return false; } diff --git a/zone/npc.h b/zone/npc.h index af07b396c..2c43b79c1 100644 --- a/zone/npc.h +++ b/zone/npc.h @@ -314,7 +314,7 @@ public: uint32 aug6 = 0 ); - bool MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop); + bool MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop, bool verbose=false); virtual void DoClassAttacks(Mob *target); void CheckSignal();