diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 64512ade5..4a9d556b9 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -58,16 +58,10 @@ void Mob::CalcBonuses() void NPC::CalcBonuses() { memset(&itembonuses, 0, sizeof(StatBonuses)); - if (RuleB(NPC, UseItemBonusesForNonPets)) { - memset(&itembonuses, 0, sizeof(StatBonuses)); + + if (GetOwner() || RuleB(NPC, UseItemBonusesForNonPets)) { CalcItemBonuses(&itembonuses); } - else { - if (GetOwner()) { - memset(&itembonuses, 0, sizeof(StatBonuses)); - CalcItemBonuses(&itembonuses); - } - } // This has to happen last, so we actually take the item bonuses into account. Mob::CalcBonuses(); @@ -268,7 +262,7 @@ void Mob::AddItemBonuses(const EQ::ItemInstance* inst, StatBonuses* b, bool is_a return; } - if (!is_tribute && !inst->IsEquipable(GetBaseRace(), GetClass())) { + if (IsClient() && !is_tribute && !inst->IsEquipable(GetBaseRace(), GetClass())) { if (item->ItemType != EQ::item::ItemTypeFood && item->ItemType != EQ::item::ItemTypeDrink) { return; } @@ -276,14 +270,14 @@ void Mob::AddItemBonuses(const EQ::ItemInstance* inst, StatBonuses* b, bool is_a const auto current_level = GetLevel(); - if (current_level < inst->GetItemRequiredLevel(true)) { + if (IsClient() && current_level < inst->GetItemRequiredLevel(true)) { return; } if (!is_ammo_item) { const auto recommended_level = is_augment ? recommended_level_override : inst->GetItemRecommendedLevel(true); - if (current_level >= recommended_level) { + if (IsNPC() || current_level >= recommended_level) { b->HP += item->HP; b->Mana += item->Mana; b->Endurance += item->Endur; diff --git a/zone/loottables.cpp b/zone/loottables.cpp index 70c15dc26..2df0b258f 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -361,11 +361,12 @@ void NPC::AddLootDrop( SetArrowEquipped(true); } + bool found = false; // track if we found an empty slot we fit into + if (loot_drop.equip_item > 0) { uint8 eslot = 0xFF; char newid[20]; const EQ::ItemData* compitem = nullptr; - bool found = false; // track if we found an empty slot we fit into int32 foundslot = -1; // for multi-slot items // Equip rules are as follows: @@ -500,7 +501,6 @@ void NPC::AddLootDrop( } if (found) { - CalcBonuses(); // This is less than ideal for bulk adding of items item->equip_slot = foundslot; } } @@ -510,6 +510,10 @@ void NPC::AddLootDrop( } else safe_delete(item); + if (found) { + CalcBonuses(); + } + if (IsRecordLootStats()) { m_rolled_items.emplace_back(item->item_id); }