diff --git a/common/shareddb.h b/common/shareddb.h index fc8c8c00a..13548c0d3 100644 --- a/common/shareddb.h +++ b/common/shareddb.h @@ -29,6 +29,7 @@ #include "base_data.h" #include "fixed_memory_hash_set.h" #include "fixed_memory_variable_hash_set.h" +#include "say_link.h" #include #include @@ -189,6 +190,14 @@ public: void LoadBaseData(void *data, int max_level); const BaseDataStruct *GetBaseData(int lvl, int cl); + std::string CreateItemLink(uint32 item_id) { + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); + const EQ::ItemData *item = GetItem(item_id); + linker.SetItemData(item); + return linker.GenerateLink(); + } + protected: std::unique_ptr skill_caps_mmf; diff --git a/zone/loottables.cpp b/zone/loottables.cpp index 0f8bd0ab6..ea563de38 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -132,7 +132,8 @@ void ZoneDatabase::AddLootDropToNPC(NPC *npc, uint32 lootdrop_id, ItemList *item for (uint32 i = 0; i < loot_drop->NumEntries; ++i) { 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->MeetsLevelRequirements(loot_drop->Entries[i])) { + if (zone->random.Real(0.0, 100.0) <= loot_drop->Entries[i].chance && + npc->MeetsLootDropLevelRequirements(loot_drop->Entries[i])) { const EQ::ItemData *database_item = GetItem(loot_drop->Entries[i].item_id); npc->AddLootDrop( database_item, @@ -176,7 +177,7 @@ 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->MeetsLevelRequirements(loot_drop->Entries[j])) { + if (roll < loot_drop->Entries[j].chance && npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) { npc->AddLootDrop( db_item, item_list, @@ -212,7 +213,7 @@ 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->MeetsLevelRequirements(loot_drop->Entries[j])) { + if (roll < loot_drop->Entries[j].chance && npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) { npc->AddLootDrop( db_item, item_list, @@ -249,13 +250,27 @@ void ZoneDatabase::AddLootDropToNPC(NPC *npc, uint32 lootdrop_id, ItemList *item // npc->SendAppearancePacket(AT_Light, npc->GetActiveLightValue()); } -bool NPC::MeetsLevelRequirements(LootDropEntries_Struct loot_drop) +bool NPC::MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop) { 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) + ); 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) + ); return false; } diff --git a/zone/npc.h b/zone/npc.h index 4ea8b6ecd..f0b9871bd 100644 --- a/zone/npc.h +++ b/zone/npc.h @@ -306,7 +306,7 @@ public: uint32 aug6 = 0 ); - bool MeetsLevelRequirements(LootDropEntries_Struct loot_drop); + bool MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop); virtual void DoClassAttacks(Mob *target); void CheckSignal();