diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 29a826f0e..ff51fcfb7 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -256,9 +256,9 @@ bool Client::Process() { * Used in aggro checks */ if (mob_close_scan_timer.Check()) { - entity_list.ScanCloseMobs(close_mobs, this); + entity_list.ScanCloseMobs(close_mobs, this, true); } - + bool may_use_attacks = false; /* Things which prevent us from attacking: @@ -757,7 +757,7 @@ void Client::BulkSendInventoryItems() if (ob.tellp() == last_pos) LogInventory("Serialization failed on item slot [{}] during BulkSendInventoryItems. Item skipped", slot_id); - + last_pos = ob.tellp(); } @@ -836,7 +836,7 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) { else { cur_fac_level = GetModCharacterFactionLevel(fac); } - + if (cur_fac_level < ml.faction_required) continue; @@ -1170,7 +1170,7 @@ void Client::OPMoveCoin(const EQApplicationPacket* app) { return; } - + // could just do a range, but this is clearer and explicit if ( diff --git a/zone/entity.cpp b/zone/entity.cpp index 5637777d6..b00735e4a 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -2716,18 +2716,22 @@ void EntityList::ScanCloseMobs( } float distance = DistanceSquared(scanning_mob->GetPosition(), mob->GetPosition()); - if (distance <= scan_range) { + if (distance <= scan_range || mob->GetAggroRange() >= scan_range) { close_mobs.insert(std::pair(mob->GetID(), mob)); if (add_self_to_other_lists) { - mob->close_mobs.insert(std::pair(scanning_mob->GetID(), scanning_mob)); - } - } - else if (mob->GetAggroRange() >= scan_range) { - close_mobs.insert(std::pair(mob->GetID(), mob)); + bool has_mob = false; - if (add_self_to_other_lists) { - mob->close_mobs.insert(std::pair(scanning_mob->GetID(), scanning_mob)); + for (auto &cm: mob->close_mobs) { + if (scanning_mob->GetID() == cm.first) { + has_mob = true; + break; + } + } + + if (!has_mob) { + mob->close_mobs.insert(std::pair(scanning_mob->GetID(), scanning_mob)); + } } } }