diff --git a/common/zone_store.cpp b/common/zone_store.cpp index 23a59c31e..1660c105d 100644 --- a/common/zone_store.cpp +++ b/common/zone_store.cpp @@ -679,7 +679,7 @@ int ZoneStore::GetZoneNPCMaximumAggroDistance(uint32 zone_id, int version) uint32 ZoneStore::GetZoneMaximumMovementUpdateRange(uint32 zone_id, int version) { const auto& z = GetZoneVersionWithFallback(zone_id, version); - return z ? z->max_movement_update_range : DEFAULT_ZONE_MAX_MOVEMENT_UPDATE_RANGE; + return z ? z->npc_update_range : DEFAULT_ZONE_MAX_MOVEMENT_UPDATE_RANGE; } int8 ZoneStore::GetZoneMinimumExpansion(uint32 zone_id, int version) diff --git a/zone/effects.cpp b/zone/effects.cpp index 7329ce2f0..4700af3ab 100644 --- a/zone/effects.cpp +++ b/zone/effects.cpp @@ -1122,7 +1122,7 @@ void EntityList::AESpell( LogAoeCast( "Close scan distance [{}] cast distance [{}]", - zone->GetMaxUpdateRange(), + zone->GetMaxNpcUpdateRange(), distance ); diff --git a/zone/entity.cpp b/zone/entity.cpp index 1716cfef9..c401ed1bd 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -1733,7 +1733,7 @@ void EntityList::QueueCloseClients( } if (distance <= 0) { - distance = zone->GetMaxUpdateRange(); + distance = zone->GetMaxClientUpdateRange(); } float distance_squared = distance * distance; @@ -2940,7 +2940,7 @@ void EntityList::ScanCloseMobs(Mob *scanning_mob) g_scan_bench_timer.reset(); - float scan_range = zone->GetMaxUpdateRange(); + float scan_range = std::max(zone->GetMaxNpcUpdateRange(), zone->GetMaxClientUpdateRange()); // Reserve memory in m_close_mobs to avoid frequent re-allocations if not already reserved. // Assuming mob_list.size() as an upper bound for reservation. @@ -2948,7 +2948,7 @@ void EntityList::ScanCloseMobs(Mob *scanning_mob) scanning_mob->m_close_mobs.reserve(mob_list.size()); } - scanning_mob->m_close_mobs.clear(); + scanning_mob->m_close_mobs.clear(); for (auto &e : mob_list) { auto mob = e.second; @@ -3002,7 +3002,7 @@ void EntityList::UpdateVisibility(Mob *scanning_mob) { int8_t scanning_visibility = (it_scanning_visible != scanning_mob->m_can_see_mob.end()) ? it_scanning_visible->second : 0; - if (scanning_mob->CalculateDistance(mob) <= zone->GetMaxUpdateRange()) { + if (scanning_mob->CalculateDistance(mob) <= mob->GetUpdateRange()) { if (scanning_visibility != STATE_VISIBLE) { // Become visible if (scanning_mob->IsClient()) { scanning_mob->CastToClient()->SetVisibility(mob, true); @@ -5815,7 +5815,7 @@ void EntityList::ReloadMerchants() { */ std::unordered_map &EntityList::GetCloseMobList(Mob *mob, float distance) { - if (distance <= zone->GetMaxUpdateRange()) { + if (distance <= zone->GetMaxNpcUpdateRange()) { return mob->m_close_mobs; } diff --git a/zone/mob.cpp b/zone/mob.cpp index cfca945fd..aee064e8a 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -8617,17 +8617,21 @@ std::unordered_map &Mob::GetCloseMobList(float distance) void Mob::ClearDataBucketCache() { if (IsOfClientBot()) { - uint64 id = 0; + uint64 id = 0; DataBucketLoadType::Type t{}; if (IsBot()) { id = CastToBot()->GetBotID(); - t = DataBucketLoadType::Bot; + t = DataBucketLoadType::Bot; } else if (IsClient()) { id = CastToClient()->CharacterID(); - t = DataBucketLoadType::Client; + t = DataBucketLoadType::Client; } DataBucket::DeleteFromCache(id, t); } } + +float Mob::GetUpdateRange() { + return IsClient() ? zone->GetMaxClientUpdateRange() : zone->GetMaxNpcUpdateRange(); +} diff --git a/zone/mob.h b/zone/mob.h index 2e20ef710..892696e52 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -1493,6 +1493,7 @@ public: std::unordered_map &GetCloseMobList(float distance = 0.0f); void CheckScanCloseMobsMovingTimer(); + float GetUpdateRange(); void ClearDataBucketCache(); diff --git a/zone/mob_movement_manager.cpp b/zone/mob_movement_manager.cpp index 3edfd27ab..92f81b9c9 100644 --- a/zone/mob_movement_manager.cpp +++ b/zone/mob_movement_manager.cpp @@ -859,7 +859,7 @@ void MobMovementManager::SendCommandToClients( } else { float short_range = RuleR(Pathing, ShortMovementUpdateRange); - float long_range = zone->GetMaxUpdateRange(); + float long_range = zone->GetMaxNpcUpdateRange(); for (auto &c : _impl->Clients) { if (single_client && c != single_client) { diff --git a/zone/zone.cpp b/zone/zone.cpp index e6438d96b..6bc7cccfb 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -1373,17 +1373,18 @@ bool Zone::LoadZoneCFG(const char* filename, uint16 instance_version) newzone_data.suspend_buffs = z->suspendbuffs; // local attributes - can_bind = z->canbind != 0; - is_city = z->canbind == 2; - can_combat = z->cancombat != 0; - can_levitate = z->canlevitate != 0; - can_castoutdoor = z->castoutdoor != 0; - is_hotzone = z->hotzone != 0; - max_movement_update_range = z->max_movement_update_range; - default_ruleset = z->ruleset; - allow_mercs = true; - m_graveyard_id = z->graveyard_id; - m_max_clients = z->maxclients; + can_bind = z->canbind != 0; + is_city = z->canbind == 2; + can_combat = z->cancombat != 0; + can_levitate = z->canlevitate != 0; + can_castoutdoor = z->castoutdoor != 0; + is_hotzone = z->hotzone != 0; + m_npc_update_range = z->npc_update_range; + m_client_update_range = z->client_update_range; + default_ruleset = z->ruleset; + allow_mercs = true; + m_graveyard_id = z->graveyard_id; + m_max_clients = z->maxclients; SetIdleWhenEmpty(z->idle_when_empty); SetSecondsBeforeIdle(z->seconds_before_idle); diff --git a/zone/zone.h b/zone/zone.h index c38126cb9..9a6924279 100755 --- a/zone/zone.h +++ b/zone/zone.h @@ -414,7 +414,8 @@ public: SendDiscordMessage(webhook_id, message_prefix + Discord::FormatDiscordMessage(log_category, message)); }; - double GetMaxUpdateRange() const { return max_movement_update_range; } + double GetMaxNpcUpdateRange() const { return m_npc_update_range; } + double GetMaxClientUpdateRange() const { return m_client_update_range; } void SetIsHotzone(bool is_hotzone); @@ -466,7 +467,8 @@ private: bool staticzone; bool zone_has_current_time; bool quest_hot_reload_queued; - double max_movement_update_range; + double m_npc_update_range; + double m_client_update_range; char *long_name; char *map_name; char *short_name;