diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 0db064434..44776dc46 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2173,15 +2173,6 @@ bool GameObject::IsInRange(float x, float y, float z, float radius) const && dz < (info->maxZ * scale) + radius && dz > (info->minZ * scale) - radius; } -void GameObject::SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/, bool includeMargin, Player const* skipped_rcvr) const -{ - dist += GetObjectSize(); - if (includeMargin) - dist += VISIBILITY_COMPENSATION * 2.0f; // pussywizard: to ensure everyone receives all important packets - Acore::MessageDistDeliverer notifier(this, data, dist, false, skipped_rcvr); - Cell::VisitWorldObjects(this, notifier, dist); -} - void GameObject::EventInform(uint32 eventId) { if (!eventId) diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index ed47aa084..678052b14 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -289,8 +289,6 @@ public: void SendCustomAnim(uint32 anim); [[nodiscard]] bool IsInRange(float x, float y, float z, float radius) const; - void SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/, bool includeMargin = false, Player const* skipped_rcvr = nullptr) const override; // pussywizard! - void ModifyHealth(int32 change, Unit* attackerOrHealer = nullptr, uint32 spellId = 0); void SetDestructibleBuildingModifyState(bool allow) { m_allowModifyDestructibleBuilding = allow; } // sets GameObject type 33 destruction flags and optionally default health for that state diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 5f505655d..e6b60ffca 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2077,15 +2077,24 @@ void Unit::BuildHeartBeatMsg(WorldPacket* data) const BuildMovementPacket(data); } -void WorldObject::SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/, bool includeMargin, Player const* skipped_rcvr) const +void WorldObject::SendMessageToSet(WorldPacket const* data, bool self) const { - dist += GetObjectSize(); - if (includeMargin) - dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets - Acore::MessageDistDeliverer notifier(this, data, dist, false, skipped_rcvr); + if (IsInWorld()) + SendMessageToSetInRange(data, GetVisibilityRange(), self); +} + +void WorldObject::SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/) const +{ + Acore::MessageDistDeliverer notifier(this, data, dist); Cell::VisitWorldObjects(this, notifier, dist); } +void WorldObject::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const +{ + Acore::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr); + Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); +} + void WorldObject::SendObjectDeSpawnAnim(ObjectGuid guid) { WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index f9a9ac69c..6dd7f0d7f 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -479,9 +479,9 @@ public: virtual void CleanupsBeforeDelete(bool finalCleanup = true); // used in destructor or explicitly before mass creature delete to remove cross-references to already deleted units - virtual void SendMessageToSet(WorldPacket const* data, bool self) const { if (IsInWorld()) SendMessageToSetInRange(data, GetVisibilityRange(), self, true); } // pussywizard! - virtual void SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/, bool includeMargin = false, Player const* skipped_rcvr = nullptr) const; // pussywizard! - virtual void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const { if (IsInWorld()) SendMessageToSetInRange(data, GetVisibilityRange(), false, true, skipped_rcvr); } // pussywizard! + virtual void SendMessageToSet(WorldPacket const* data, bool self) const; + virtual void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self) const; + virtual void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const; virtual uint8 getLevelForTarget(WorldObject const* /*target*/) const { return 1; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 89ce0d76d..aeec7a934 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5610,25 +5610,40 @@ void Player::SaveRecallPosition() m_recallO = GetOrientation(); } -void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool includeMargin, Player const* skipped_rcvr) const +void Player::SendMessageToSet(WorldPacket const* data, bool self) const +{ + SendMessageToSetInRange(data, GetVisibilityRange(), self); +} + +void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self) const { if (self) - GetSession()->SendPacket(data); + SendDirectMessage(data); + + Acore::MessageDistDeliverer notifier(this, data, dist); + Cell::VisitWorldObjects(this, notifier, dist); +} + +void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool includeMargin, bool ownTeamOnly, bool required3dDist) const +{ + if (self) + SendDirectMessage(data); dist += GetObjectSize(); if (includeMargin) dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets - Acore::MessageDistDeliverer notifier(this, data, dist, false, skipped_rcvr); + + Acore::MessageDistDeliverer notifier(this, data, dist, ownTeamOnly, nullptr, required3dDist); Cell::VisitWorldObjects(this, notifier, dist); } -void Player::SendMessageToSetInRange_OwnTeam(WorldPacket const* data, float dist, bool self) const +void Player::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const { - if (self) - GetSession()->SendPacket(data); + if (skipped_rcvr != this) + SendDirectMessage(data); - Acore::MessageDistDeliverer notifier(this, data, dist, true); - Cell::VisitWorldObjects(this, notifier, dist); + Acore::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr); + Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); } void Player::SendDirectMessage(WorldPacket const* data) const @@ -9289,7 +9304,7 @@ void Player::Say(std::string_view text, Language language, WorldObject const* /* WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text); - SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true); + SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true, false, false, true); } void Player::Say(uint32 textId, WorldObject const* target /*= nullptr*/) @@ -9310,7 +9325,7 @@ void Player::Yell(std::string_view text, Language language, WorldObject const* / WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text); - SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true); + SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true, false, false, true); } void Player::Yell(uint32 textId, WorldObject const* target /*= nullptr*/) @@ -9332,14 +9347,7 @@ void Player::TextEmote(std::string_view text, WorldObject const* /*= nullptr*/, WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_EMOTE, LANG_UNIVERSAL, this, this, _text); - if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE)) - { - SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true); - } - else - { - SendMessageToSetInRange_OwnTeam(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true); - } + SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, false, !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE), true); } void Player::TextEmote(uint32 textId, WorldObject const* target /*= nullptr*/, bool /*isBossEmote = false*/) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 59d394947..5e8eda233 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2000,11 +2000,10 @@ public: void ProcessTerrainStatusUpdate() override; - void SendMessageToSet(WorldPacket const* data, bool self) const override { SendMessageToSetInRange(data, GetVisibilityRange(), self, true); } // pussywizard! - void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool includeMargin = false, Player const* skipped_rcvr = nullptr) const override; // pussywizard! - void SendMessageToSetInRange_OwnTeam(WorldPacket const* data, float dist, bool self) const; // pussywizard! param includeMargin not needed here - void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const override { SendMessageToSetInRange(data, GetVisibilityRange(), skipped_rcvr != this, true, skipped_rcvr); } // pussywizard! - + void SendMessageToSet(WorldPacket const* data, bool self) const override; + void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self) const override; + void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool includeMargin, bool ownTeamOnly, bool required3dDist = false) const; + void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const override; void SendTeleportAckPacket(); [[nodiscard]] Corpse* GetCorpse() const; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index db2ad0a67..42661e934 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -217,8 +217,14 @@ void MessageDistDeliverer::Visit(PlayerMapType& m) if (!target->InSamePhase(i_phaseMask)) continue; - if (target->GetExactDist2dSq(i_source) > i_distSq) - continue; + if (required3dDist) + { + if (target->GetExactDistSq(i_source) > i_distSq) + continue; + } + else + if (target->GetExactDist2dSq(i_source) > i_distSq) + continue; // Send packet to all who are sharing the player's vision if (target->HasSharedVision()) @@ -242,8 +248,14 @@ void MessageDistDeliverer::Visit(CreatureMapType& m) if (!target->HasSharedVision() || !target->InSamePhase(i_phaseMask)) continue; - if (target->GetExactDist2dSq(i_source) > i_distSq) - continue; + if (required3dDist) + { + if (target->GetExactDistSq(i_source) > i_distSq) + continue; + } + else + if (target->GetExactDist2dSq(i_source) > i_distSq) + continue; // Send packet to all who are sharing the creature's vision SharedVisionList::const_iterator i = target->GetSharedVisionList().begin(); @@ -265,8 +277,14 @@ void MessageDistDeliverer::Visit(DynamicObjectMapType& m) if (!target->IsViewpoint()) continue; - if (target->GetExactDist2dSq(i_source) > i_distSq) - continue; + if (required3dDist) + { + if (target->GetExactDistSq(i_source) > i_distSq) + continue; + } + else + if (target->GetExactDist2dSq(i_source) > i_distSq) + continue; // Send packet back to the caster if the caster has vision of dynamic object Player* caster = (Player*)target->GetCaster(); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index e06b9091f..97189e16c 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -102,10 +102,11 @@ namespace Acore float i_distSq; TeamId teamId; Player const* skipped_receiver; - MessageDistDeliverer(WorldObject const* src, WorldPacket const* msg, float dist, bool own_team_only = false, Player const* skipped = nullptr) + bool required3dDist; + MessageDistDeliverer(WorldObject const* src, WorldPacket const* msg, float dist, bool own_team_only = false, Player const* skipped = nullptr, bool req3dDist = false) : i_source(src), i_message(msg), i_phaseMask(src->GetPhaseMask()), i_distSq(dist * dist) , teamId((own_team_only && src->GetTypeId() == TYPEID_PLAYER) ? src->ToPlayer()->GetTeamId() : TEAM_NEUTRAL) - , skipped_receiver(skipped) + , skipped_receiver(skipped), required3dDist(req3dDist) { } void Visit(PlayerMapType& m); diff --git a/src/server/game/Time/UpdateTime.cpp b/src/server/game/Time/UpdateTime.cpp index 182323ab0..3c4886376 100644 --- a/src/server/game/Time/UpdateTime.cpp +++ b/src/server/game/Time/UpdateTime.cpp @@ -165,11 +165,11 @@ void WorldUpdateTime::RecordUpdateTime(Milliseconds gameTimeMs, uint32 diff, uin { if (GetMSTimeDiff(_lastRecordTime, gameTimeMs) > _recordUpdateTimeInverval) { - LOG_INFO("time.update", "Update time diff: {} with {} players online", GetLastUpdateTime(), sessionCount); + LOG_INFO("time.update", "Update time diff: {}ms with {} players online", GetLastUpdateTime(), sessionCount); LOG_INFO("time.update", "Last {} diffs summary:", GetDatasetSize()); - LOG_INFO("time.update", "|- Mean: {}", GetAverageUpdateTime()); - LOG_INFO("time.update", "|- Median: {}", GetPercentile(50)); - LOG_INFO("time.update", "|- Percentiles (95, 99, max): {}, {}, {}", GetPercentile(95), GetPercentile(99), GetPercentile(100)); + LOG_INFO("time.update", "|- Mean: {}ms", GetAverageUpdateTime()); + LOG_INFO("time.update", "|- Median: {}ms", GetPercentile(50)); + LOG_INFO("time.update", "|- Percentiles (95, 99, max): {}ms, {}ms, {}ms", GetPercentile(95), GetPercentile(99), GetPercentile(100)); _lastRecordTime = gameTimeMs; } }