diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 824928c71..12df5cb0e 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -5653,14 +5653,17 @@ void Client::Handle_OP_DzChooseZoneReply(const EQApplicationPacket *app) return; } - DynamicZone dz = DynamicZone::LoadDzFromDatabase(dzmsg->dz_instance_id); - DynamicZoneLocation loc = dz.GetZoneInLocation(); - ZoneMode zone_mode = ZoneMode::ZoneToSafeCoords; - if (dz.HasZoneInLocation()) + auto client_dzs = GetDynamicZones(); + auto it = std::find_if(client_dzs.begin(), client_dzs.end(), [&](const DynamicZoneInfo dz_info) { + return dz_info.dynamic_zone.IsSameDz(dzmsg->dz_zone_id, dzmsg->dz_instance_id); + }); + + if (it != client_dzs.end()) { - zone_mode = ZoneMode::ZoneSolicited; + DynamicZoneLocation loc = it->dynamic_zone.GetZoneInLocation(); + ZoneMode zone_mode = it->dynamic_zone.HasZoneInLocation() ? ZoneMode::ZoneSolicited : ZoneMode::ZoneToSafeCoords; + MovePC(dzmsg->dz_zone_id, dzmsg->dz_instance_id, loc.x, loc.y, loc.z, loc.heading, 0, zone_mode); } - MovePC(dzmsg->dz_zone_id, dzmsg->dz_instance_id, loc.x, loc.y, loc.z, loc.heading, 0, zone_mode); } void Client::Handle_OP_DzExpeditionInviteResponse(const EQApplicationPacket *app) diff --git a/zone/dynamiczone.cpp b/zone/dynamiczone.cpp index 17de013d8..64a28b8d2 100644 --- a/zone/dynamiczone.cpp +++ b/zone/dynamiczone.cpp @@ -513,6 +513,11 @@ bool DynamicZone::IsInstanceID(uint32_t instance_id) const return (GetInstanceID() != 0 && GetInstanceID() == instance_id); } +bool DynamicZone::IsSameDz(uint32_t zone_id, uint32_t instance_id) const +{ + return zone_id == m_zone_id && instance_id == m_instance_id; +} + uint32_t DynamicZone::GetSecondsRemaining() const { auto now = std::chrono::system_clock::now(); diff --git a/zone/dynamiczone.h b/zone/dynamiczone.h index 4d65b654e..693107840 100644 --- a/zone/dynamiczone.h +++ b/zone/dynamiczone.h @@ -71,6 +71,7 @@ public: uint16_t GetInstanceID() const { return static_cast(m_instance_id); }; uint32_t GetSecondsRemaining() const; uint16_t GetZoneID() const { return static_cast(m_zone_id); }; + uint32_t GetZoneIndex() const { return (m_instance_id << 16) | (m_zone_id & 0xffff); } uint32_t GetZoneVersion() const { return m_version; }; DynamicZoneType GetType() const { return m_type; } DynamicZoneLocation GetCompassLocation() const { return m_compass; } @@ -83,6 +84,7 @@ public: bool IsCurrentZoneDzInstance() const; bool IsInstanceID(uint32_t instance_id) const; bool IsValid() const { return m_instance_id != 0; } + bool IsSameDz(uint32_t zone_id, uint32_t instance_id) const; void LoadFromDatabase(uint32_t instance_id); void RemoveAllCharacters(bool enable_removal_timers = true); void RemoveCharacter(uint32_t character_id);