diff --git a/zone/client.cpp b/zone/client.cpp index ff090b443..d52c0888d 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -9883,13 +9883,14 @@ void Client::SendDzCompassUpdate() QueuePacket(outapp.get()); } -void Client::GoToDzSafeReturnOrBind(const DynamicZoneLocation& safereturn) +void Client::GoToDzSafeReturnOrBind(const DynamicZone& dynamic_zone) { + auto safereturn = dynamic_zone.GetSafeReturnLocation(); LogDynamicZonesDetail( "Sending character [{}] to safereturn zone [{}] or bind", CharacterID(), safereturn.zone_id ); - if (safereturn.zone_id == 0) + if (!dynamic_zone.IsValid() || safereturn.zone_id == 0) { GoToBind(); } diff --git a/zone/client.h b/zone/client.h index e5f9ee615..716a94332 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1145,7 +1145,7 @@ public: void DzListTimers(); void SetDzRemovalTimer(bool enable_timer); void SendDzCompassUpdate(); - void GoToDzSafeReturnOrBind(const DynamicZoneLocation& safereturn); + void GoToDzSafeReturnOrBind(const DynamicZone& dynamic_zone); void MovePCDynamicZone(uint32 zone_id); void MovePCDynamicZone(const std::string& zone_name); diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 144bce500..929b4006f 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -164,8 +164,7 @@ bool Client::Process() { if (dynamiczone_removal_timer.Check() && zone && zone->GetInstanceID() != 0) { dynamiczone_removal_timer.Disable(); - DynamicZone dz = DynamicZone::LoadDzFromDatabase(zone->GetInstanceID()); - GoToDzSafeReturnOrBind(dz.GetSafeReturnLocation()); + GoToDzSafeReturnOrBind(zone->GetDynamicZone()); } if (linkdead_timer.Check()) { diff --git a/zone/entity.cpp b/zone/entity.cpp index 02c901689..1ad03eea0 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -5208,7 +5208,7 @@ void EntityList::GateAllClientsToSafeReturn() DynamicZone dz; if (zone) { - dz = DynamicZone::LoadDzFromDatabase(zone->GetInstanceID()); + dz = zone->GetDynamicZone(); LogDynamicZones( "Sending all clients in zone: [{}] instance: [{}] to dz safereturn or bind", @@ -5221,7 +5221,7 @@ void EntityList::GateAllClientsToSafeReturn() if (client_list_iter.second) { // falls back to gating clients to bind if dz invalid - client_list_iter.second->GoToDzSafeReturnOrBind(dz.GetSafeReturnLocation()); + client_list_iter.second->GoToDzSafeReturnOrBind(dz); } } } diff --git a/zone/zone.cpp b/zone/zone.cpp index 0630dff50..34ad7f79b 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -2714,3 +2714,21 @@ bool Zone::IsZone(uint32 zone_id, uint16 instance_id) const { return (zoneid == zone_id && instanceid == instance_id); } + +DynamicZone Zone::GetDynamicZone() +{ + if (GetInstanceID() == 0) + { + return {}; // invalid + } + + auto expedition = Expedition::FindCachedExpeditionByInstanceID(GetInstanceID()); + if (expedition) + { + return expedition->GetDynamicZone(); + } + + // todo: tasks, missions, and quests with an associated dz for this instance id + + return {}; // invalid +} diff --git a/zone/zone.h b/zone/zone.h index 32a98722f..31c0f16ee 100755 --- a/zone/zone.h +++ b/zone/zone.h @@ -33,6 +33,7 @@ #include "spawn2.h" #include "spawngroup.h" #include "aa_ability.h" +#include "dynamiczone.h" #include "pathfinder_interface.h" #include "global_loot_manager.h" @@ -177,6 +178,7 @@ public: void DumpMerchantList(uint32 npcid); int SaveTempItem(uint32 merchantid, uint32 npcid, uint32 item, int32 charges, bool sold = false); int32 MobsAggroCount() { return aggroedmobs; } + DynamicZone GetDynamicZone(); IPathfinder *pathing; LinkedList NPCEmoteList;