From e677461c5d33e97e9a8d5b134a65b80ef7ba23c9 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Thu, 23 Jul 2020 13:33:46 +0200 Subject: [PATCH] Core/Combat: more cleanups and converted threat packets back to packet class --- src/server/game/AI/CoreAI/PetAI.cpp | 5 -- src/server/game/AI/CreatureAI.cpp | 12 ++--- src/server/game/Combat/ThreatManager.cpp | 66 ++++++++++++++++-------- src/server/game/Entities/Unit/Unit.cpp | 2 +- 4 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index d92b5130d6..8123773114 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -251,11 +251,6 @@ void PetAI::UpdateAI(uint32 diff) for (TargetSpellList::const_iterator itr = targetSpellStore.begin(); itr != targetSpellStore.end(); ++itr) delete itr->second; } - - // Update speed as needed to prevent dropping too far behind and despawning - me->UpdateSpeed(MOVE_RUN); - me->UpdateSpeed(MOVE_WALK); - me->UpdateSpeed(MOVE_FLIGHT); } void PetAI::UpdateAllies() diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index f2f00a9d7f..f7ef6b04ab 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -64,9 +64,6 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/) if (!creature) creature = me; - if (!creature->CanHaveThreatList()) - return; - Map* map = creature->GetMap(); if (!map->IsDungeon()) //use IsDungeon instead of Instanceable, in case battlegrounds will be instantiated { @@ -74,22 +71,25 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/) return; } - Map::PlayerList const& playerList = map->GetPlayers(); - if (playerList.isEmpty()) + if (!map->HavePlayers()) return; - for (auto const& ref : playerList) + for (MapReference const& ref : map->GetPlayers()) + { if (Player* player = ref.GetSource()) { if (!player->IsAlive() || !CombatManager::CanBeginCombat(creature, player)) continue; creature->EngageWithTarget(player); + for (Unit* pet : player->m_Controlled) creature->EngageWithTarget(pet); + if (Unit* vehicle = player->GetVehicleBase()) creature->EngageWithTarget(vehicle); } + } } // scripts does not take care about MoveInLineOfSight loops diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 19d67e768b..c18b17d355 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -28,6 +28,7 @@ #include "SpellAuraEffects.h" #include "SpellInfo.h" #include "SpellMgr.h" +#include "CombatPackets.h" #include "ObjectAccessor.h" #include "WorldPacket.h" #include @@ -746,38 +747,61 @@ void ThreatManager::UnregisterRedirectThreat(uint32 spellId, ObjectGuid const& v void ThreatManager::SendClearAllThreatToClients() const { - WorldPacket data(SMSG_THREAT_CLEAR, 8); - data << _owner->GetPackGUID(); - _owner->SendMessageToSet(&data, false); + WorldPackets::Combat::ThreatClear packet; + packet.UnitGUID = _owner->GetGUID(); + _owner->SendMessageToSet(packet.Write(), false); } void ThreatManager::SendRemoveToClients(Unit const* victim) const { - WorldPacket data(SMSG_THREAT_REMOVE, 16); - data << _owner->GetPackGUID(); - data << victim->GetPackGUID(); - _owner->SendMessageToSet(&data, false); + WorldPackets::Combat::ThreatRemove packet; + packet.UnitGUID = _owner->GetGUID(); + packet.AboutGUID = victim->GetGUID(); + _owner->SendMessageToSet(packet.Write(), false); } void ThreatManager::SendThreatListToClients(bool newHighest) const { - WorldPacket data(newHighest ? SMSG_HIGHEST_THREAT_UPDATE : SMSG_THREAT_UPDATE, (_sortedThreatList.size() + 2) * 8); // guess - data << _owner->GetPackGUID(); - if (newHighest) - data << _currentVictimRef->GetVictim()->GetPackGUID(); - size_t countPos = data.wpos(); - data << uint32(0); // placeholder - uint32 count = 0; + uint32 availableReferences = 0; for (ThreatReference const* ref : _sortedThreatList) + if (ref->IsAvailable()) + ++availableReferences; + + if (newHighest) { - if (!ref->IsAvailable()) - continue; - data << ref->GetVictim()->GetPackGUID(); - data << uint32(ref->GetThreat() * 100); - ++count; + WorldPackets::Combat::HighestThreatUpdate packet; + packet.UnitGUID = _owner->GetGUID(); + packet.HighestThreatGUID = _currentVictimRef->GetVictim()->GetGUID(); + packet.ThreatList.reserve(availableReferences); + for (ThreatReference const* ref : _sortedThreatList) + { + if (!ref->IsAvailable()) + continue; + + WorldPackets::Combat::ThreatInfo info; + info.UnitGUID = ref->GetVictim()->GetGUID(); + info.Threat = uint32(ref->GetThreat()); + packet.ThreatList.push_back(info); + } + _owner->SendMessageToSet(packet.Write(), false); + } + else + { + WorldPackets::Combat::ThreatUpdate packet; + packet.UnitGUID = _owner->GetGUID(); + packet.ThreatList.reserve(availableReferences); + for (ThreatReference const* ref : _sortedThreatList) + { + if (!ref->IsAvailable()) + continue; + + WorldPackets::Combat::ThreatInfo info; + info.UnitGUID = ref->GetVictim()->GetGUID(); + info.Threat = uint32(ref->GetThreat()); + packet.ThreatList.push_back(info); + } + _owner->SendMessageToSet(packet.Write(), false); } - data.put(countPos, count); - _owner->SendMessageToSet(&data, false); } void ThreatManager::PutThreatListRef(ObjectGuid const& guid, ThreatReference* ref) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ba7f5aae34..8f0cb29de7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5746,7 +5746,7 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) //if (GetTypeId() == TYPEID_UNIT) // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ()); - if (creature && !IsPet()) + if (creature && !IsControlledByPlayer()) { EngageWithTarget(victim); // ensure that anything we're attacking has threat