From 9340f8d9df72db110c0dc54ca402c5110bb812c8 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Wed, 29 Jul 2020 14:09:20 +0200 Subject: [PATCH] Core/Units: add new functionality for units to block or enable combat entirely via helper to reflect what CREATURE_DIFFICULTYFLAGS_IGNORE_COMBAT and client ai functions imply --- src/server/game/Combat/CombatManager.cpp | 9 +++------ src/server/game/Entities/Creature/Creature.cpp | 3 +++ src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/Entities/Unit/Unit.h | 7 +++++++ 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp index 800db97c05..02225f32b0 100644 --- a/src/server/game/Combat/CombatManager.cpp +++ b/src/server/game/Combat/CombatManager.cpp @@ -44,12 +44,9 @@ return false; if (a->HasUnitState(UNIT_STATE_IN_FLIGHT) || b->HasUnitState(UNIT_STATE_IN_FLIGHT)) return false; - if (Creature const* aCreature = a->ToCreature()) - if (aCreature->IsCombatDisallowed()) - return false; - if (Creature const* bCreature = b->ToCreature()) - if (bCreature->IsCombatDisallowed()) - return false; + // ... both units must not be ignoring combat + if (a->IsIgnoringCombat() || b->IsIgnoringCombat()) + return false; if (a->IsFriendlyTo(b) || b->IsFriendlyTo(a)) return false; Player const* playerA = a->GetCharmerOrOwnerPlayerOrPlayerItself(); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 344fca4d78..57188453a1 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -647,6 +647,9 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, if (GetMovementTemplate().IsRooted()) SetControlled(true, UNIT_STATE_ROOT); + if (cInfo->flags_extra & CREATURE_FLAG_EXTRA_NO_COMBAT) + SetIgnoringCombat(true); + UpdateMovementFlags(); LoadCreaturesAddon(); LoadTemplateImmunities(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 30ebeaa406..eedce7de7a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -328,7 +328,7 @@ Unit::Unit(bool isWorldObject) : m_removedAurasCount(0), i_motionMaster(new MotionMaster(this)), m_vehicle(nullptr), m_vehicleKit(nullptr), m_unitTypeMask(UNIT_MASK_NONE), m_Diminishing(), m_isEngaged(false), m_combatManager(this), m_threatManager(this), _lastDamagedTime(0), - m_spellHistory(new SpellHistory(this)) + m_spellHistory(new SpellHistory(this)), _isIgnoringCombat(false) { m_objectType |= TYPEMASK_UNIT; m_objectTypeId = TYPEID_UNIT; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index d9b63020a9..1cc8570946 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1922,6 +1922,11 @@ class TC_GAME_API Unit : public WorldObject float GetCollisionHeight() const override; + // returns if the unit is allowed to enter combat + bool IsIgnoringCombat() const { return _isIgnoringCombat; } + // enables/disables combat permission of this unit + void SetIgnoringCombat(bool apply) { _isIgnoringCombat = apply; } + protected: explicit Unit (bool isWorldObject); @@ -2063,6 +2068,8 @@ class TC_GAME_API Unit : public WorldObject FormationFollowerGUIDContainer _formationFollowers; std::array, AsUnderlyingType(PursuingType::Max)> _unitsPursuingMe; + + bool _isIgnoringCombat; }; namespace Trinity