Core/Units: deprecate CREATURE_FLAG_EXTRA_NO_COMBAT and use CREATURE_STATIC_FLAG_IGNORE_COMBAT to turn creatures passive

This commit is contained in:
Ovahlord committed 2025-03-15 14:27:16 +01:00
1 parent 4127d2595b
commit 6eb73788f4
7 files changed
+40 -22

No files matched your search

+1 -1
View File
@@ -118,7 +118,7 @@ void CreatureAI::MoveInLineOfSight(Unit* who)
if (me->IsEngaged())
return;
if (me->HasReactState(REACT_AGGRESSIVE) && !me->IsIgnoringCombat() && me->CanStartAttack(who, false))
if (me->HasReactState(REACT_AGGRESSIVE) && me->CanStartAttack(who, false))
me->EngageWithTarget(who);
}
@@ -656,9 +656,6 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/,
}
if (cInfo->flags_extra & CREATURE_FLAG_EXTRA_NO_COMBAT)
SetIgnoringCombat(true);
InitializeMovementCapabilities();
LoadCreaturesAddon();
@@ -1164,7 +1161,7 @@ bool Creature::SetCanFly(bool enable)
void Creature::InitializeReactState()
{
if (IsTotem() || IsTrigger() || IsCritter() || IsSpiritService())
if (IsTotem() || IsTrigger() || IsCritter() || IsSpiritService() || _staticFlags.HasFlag(CREATURE_STATIC_FLAG_IGNORE_COMBAT))
SetReactState(REACT_PASSIVE);
/*
else if (IsCivilian())
@@ -49,7 +49,7 @@ enum CreatureFlagsExtra : uint32
CREATURE_FLAG_EXTRA_GHOST_VISIBILITY = 0x00000400, // creature will be only visible for dead players
CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK = 0x00000800, // creature will use offhand attacks
CREATURE_FLAG_EXTRA_NO_SELL_VENDOR = 0x00001000, // players can't sell items to this vendor
CREATURE_FLAG_EXTRA_NO_COMBAT = 0x00002000, // creature is not allowed to enter combat
CREATURE_FLAG_EXTRA_UNUSED_13 = 0x00002000,
CREATURE_FLAG_EXTRA_WORLDEVENT = 0x00004000, // custom flag for world event creatures (left room for merging)
CREATURE_FLAG_EXTRA_GUARD = 0x00008000, // Creature is guard
CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH = 0x00010000, // creature ignores feign death
+1 -2
View File
@@ -305,8 +305,7 @@ Unit::Unit(bool isWorldObject) :
m_charmer(nullptr), m_charmed(nullptr),
i_motionMaster(std::make_unique<MotionMaster>(this)), m_vehicle(nullptr),
m_unitTypeMask(UNIT_MASK_NONE), m_isEngaged(false), m_combatManager(this), m_threatManager(this),
i_AI(nullptr), m_aiLocked(false), m_spellHistory(std::make_unique<SpellHistory>(this)),
_isIgnoringCombat(false)
i_AI(nullptr), m_aiLocked(false), m_spellHistory(std::make_unique<SpellHistory>(this))
{
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
-7
View File
@@ -1765,11 +1765,6 @@ 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; }
// Queues up a spell cast request that has been received via packet and processes it whenever possible.
void RequestSpellCast(std::unique_ptr<PendingSpellCastRequest> castRequest, SpellInfo const* spellInfo);
void CancelPendingCastRequest();
@@ -1931,8 +1926,6 @@ class TC_GAME_API Unit : public WorldObject
std::array<std::unordered_set<AbstractPursuer*>, AsUnderlyingType(PursuingType::Max)> _unitsPursuingMe;
bool _isIgnoringCombat;
std::unique_ptr<PendingSpellCastRequest> _pendingSpellCastRequest;
void ProcessPendingSpellCastRequest();
void ProcessItemCast(PendingSpellCastRequest const& castRequest, SpellCastTargets const& targets);
+25 -5
View File
@@ -2564,7 +2564,7 @@ void Spell::TargetInfo::PreprocessTarget(Spell* spell)
if (spell->m_originalCaster->IsFriendlyTo(unit))
return false;
if (spell->m_originalCaster->IsIgnoringCombat() || !spell->m_spellInfo->CausesInitialThreat())
if ((spell->m_originalCaster->IsCreature() && spell->m_originalCaster->ToCreature()->HasReactState(REACT_PASSIVE)) || !spell->m_spellInfo->CausesInitialThreat())
return false;
return true;
@@ -2829,13 +2829,33 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell)
spell->m_needComboPoints = false;
// _spellHitTarget can be null if spell is missed in DoSpellHitOnUnit
if (MissCondition != SPELL_MISS_EVADE && _spellHitTarget && !spell->m_caster->IsFriendlyTo(unit) && (!spell->IsPositive() || spell->m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL)))
bool setInCombat = [&]()
{
if (MissCondition == SPELL_MISS_EVADE)
return false;
if (!_spellHitTarget)
return false;
if (spell->IsPositive() && !spell->m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
return false;
if (spell->m_caster->IsFriendlyTo(unit))
return false;
if ((spell->m_caster->IsCreature() && spell->m_caster->ToCreature()->HasReactState(REACT_PASSIVE)) || !spell->m_spellInfo->CausesInitialThreat())
return false;
return true;
}();
if (setInCombat)
{
if (Unit* unitCaster = spell->m_caster->ToUnit())
{
if (!unitCaster->IsCreature() || !unitCaster->ToCreature()->IsTrigger())
if (!unitCaster->IsCreature())
{
unitCaster->AtTargetAttacked(unit, spell->m_spellInfo->CausesInitialThreat() && !unitCaster->IsIgnoringCombat());
unitCaster->AtTargetAttacked(unit, true);
if (spell->m_spellInfo->HasAttribute(SPELL_ATTR6_TAPS_IMMEDIATELY))
if (Creature* targetCreature = unit->ToCreature())
@@ -8092,7 +8112,7 @@ void Spell::PreprocessSpellLaunch(TargetInfo& targetInfo)
if (m_originalCaster->IsFriendlyTo(targetUnit))
return false;
if (m_originalCaster->IsIgnoringCombat() || !m_spellInfo->CausesInitialThreat())
if ((m_originalCaster->IsCreature() && m_originalCaster->ToCreature()->HasReactState(REACT_PASSIVE)) || !m_spellInfo->CausesInitialThreat())
return false;
return true;
+11 -2
View File
@@ -203,19 +203,28 @@ EnumName<CreatureFlagsExtra> const flagsExtra[] =
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_TRIGGER),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_TAUNT),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_9),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_GHOST_VISIBILITY),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_SELL_VENDOR),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_COMBAT),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_13),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_WORLDEVENT),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_GUARD),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_CRIT),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_SKILLGAIN),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_TAUNT_DIMINISH),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_ALL_DIMINISH),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_22),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_23),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_24),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_25),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_26),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_27),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_DUNGEON_BOSS),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK),
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK)
CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_UNUSED_31)
};
uint32 const FLAGS_EXTRA_COUNT = std::extent<decltype(flagsExtra)>::value;