refactor(Core): Clean-up after FD (#8586)

This commit is contained in:
patou01
2021-11-28 07:04:14 +01:00
committed by GitHub
parent 1a27f606f1
commit 801a20fce2
10 changed files with 20 additions and 25 deletions
+4 -7
View File
@@ -57,9 +57,6 @@ bool PetAI::_needToStop()
if (owner->GetExactDist(me) >= (owner->GetVisibilityRange() - 10.0f)) if (owner->GetExactDist(me) >= (owner->GetVisibilityRange() - 10.0f))
return true; return true;
if (!me->_CanDetectFeignDeathOf(me->GetVictim()))
return true;
return !me->CanCreatureAttack(me->GetVictim()); return !me->CanCreatureAttack(me->GetVictim());
} }
@@ -472,7 +469,7 @@ Unit* PetAI::SelectNextTarget(bool allowAutoSelect) const
// Check pet attackers first so we don't drag a bunch of targets to the owner // Check pet attackers first so we don't drag a bunch of targets to the owner
if (Unit* myAttacker = me->getAttackerForHelper()) if (Unit* myAttacker = me->getAttackerForHelper())
if (!myAttacker->HasBreakableByDamageCrowdControlAura() && me->_CanDetectFeignDeathOf(myAttacker) && me->CanCreatureAttack(myAttacker)) if (!myAttacker->HasBreakableByDamageCrowdControlAura() && me->CanCreatureAttack(myAttacker))
return myAttacker; return myAttacker;
// Check pet's attackers first to prevent dragging mobs back to owner // Check pet's attackers first to prevent dragging mobs back to owner
@@ -482,7 +479,7 @@ Unit* PetAI::SelectNextTarget(bool allowAutoSelect) const
if (!tauntAuras.empty()) if (!tauntAuras.empty())
for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr) for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr)
if (Unit* caster = (*itr)->GetCaster()) if (Unit* caster = (*itr)->GetCaster())
if (me->_CanDetectFeignDeathOf(caster) && me->CanCreatureAttack(caster) && !caster->HasAuraTypeWithCaster(SPELL_AURA_IGNORED, me->GetGUID())) if (me->CanCreatureAttack(caster) && !caster->HasAuraTypeWithCaster(SPELL_AURA_IGNORED, me->GetGUID()))
return caster; return caster;
} }
@@ -493,13 +490,13 @@ Unit* PetAI::SelectNextTarget(bool allowAutoSelect) const
// Check owner attackers // Check owner attackers
if (Unit* ownerAttacker = owner->getAttackerForHelper()) if (Unit* ownerAttacker = owner->getAttackerForHelper())
if (!ownerAttacker->HasBreakableByDamageCrowdControlAura() && me->_CanDetectFeignDeathOf(ownerAttacker) && me->CanCreatureAttack(ownerAttacker)) if (!ownerAttacker->HasBreakableByDamageCrowdControlAura() && me->CanCreatureAttack(ownerAttacker))
return ownerAttacker; return ownerAttacker;
// Check owner victim // Check owner victim
// 3.0.2 - Pets now start attacking their owners victim in defensive mode as soon as the hunter does // 3.0.2 - Pets now start attacking their owners victim in defensive mode as soon as the hunter does
if (Unit* ownerVictim = owner->GetVictim()) if (Unit* ownerVictim = owner->GetVictim())
if (me->_CanDetectFeignDeathOf(ownerVictim) && me->CanCreatureAttack(ownerVictim)) if (me->CanCreatureAttack(ownerVictim))
return ownerVictim; return ownerVictim;
// Neither pet or owner had a target and aggressive pets can pick any target // Neither pet or owner had a target and aggressive pets can pick any target
+2 -2
View File
@@ -318,7 +318,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR
if (currentVictim) if (currentVictim)
{ {
Unit* cvUnit = currentVictim->getTarget(); Unit* cvUnit = currentVictim->getTarget();
if (!attacker->_CanDetectFeignDeathOf(cvUnit) || !attacker->CanCreatureAttack(cvUnit)) // pussywizard: if currentVictim is not valid => don't compare the threat with it, just take the highest threat valid target if (!attacker->CanCreatureAttack(cvUnit)) // pussywizard: if currentVictim is not valid => don't compare the threat with it, just take the highest threat valid target
currentVictim = nullptr; currentVictim = nullptr;
else if (cvUnit->IsImmunedToDamageOrSchool(attacker->GetMeleeDamageSchoolMask()) || cvUnit->HasNegativeAuraWithInterruptFlag(AURA_INTERRUPT_FLAG_TAKE_DAMAGE)) // pussywizard: no 10%/30% if currentVictim is immune to damage or has auras breakable by damage else if (cvUnit->IsImmunedToDamageOrSchool(attacker->GetMeleeDamageSchoolMask()) || cvUnit->HasNegativeAuraWithInterruptFlag(AURA_INTERRUPT_FLAG_TAKE_DAMAGE)) // pussywizard: no 10%/30% if currentVictim is immune to damage or has auras breakable by damage
currentVictim = nullptr; currentVictim = nullptr;
@@ -353,7 +353,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR
} }
// pussywizard: skip not valid targets // pussywizard: skip not valid targets
if (attacker->_CanDetectFeignDeathOf(target) && attacker->CanCreatureAttack(target)) if (attacker->CanCreatureAttack(target))
{ {
if (currentVictim) // pussywizard: if not nullptr then target must have 10%/30% more threat if (currentVictim) // pussywizard: if not nullptr then target must have 10%/30% more threat
{ {
@@ -2351,13 +2351,6 @@ bool Creature::_IsTargetAcceptable(const Unit* target) const
return false; return false;
} }
bool Creature::_CanDetectFeignDeathOf(const Unit* target) const
{
if (target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH))
return IsGuard();
return true;
}
void Creature::UpdateMoveInLineOfSightState() void Creature::UpdateMoveInLineOfSightState()
{ {
// xinef: pets, guardians and units with scripts / smartAI should be skipped // xinef: pets, guardians and units with scripts / smartAI should be skipped
@@ -2423,6 +2416,12 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const
return false; return false;
} }
// if victim is in FD and we can't see that
if (victim->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) && !CanIgnoreFeignDeath())
{
return false;
}
if (!GetCharmerOrOwnerGUID().IsPlayer()) if (!GetCharmerOrOwnerGUID().IsPlayer())
{ {
if (GetMap()->IsDungeon()) if (GetMap()->IsDungeon())
@@ -255,7 +255,6 @@ public:
bool CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction = true) const; bool CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction = true) const;
bool _IsTargetAcceptable(const Unit* target) const; bool _IsTargetAcceptable(const Unit* target) const;
bool CanIgnoreFeignDeath() const { return (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH) != 0; } bool CanIgnoreFeignDeath() const { return (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH) != 0; }
bool _CanDetectFeignDeathOf(const Unit* target) const; // pussywizard
// pussywizard: updated at faction change, disable move in line of sight if actual faction is not hostile to anyone // pussywizard: updated at faction change, disable move in line of sight if actual faction is not hostile to anyone
void UpdateMoveInLineOfSightState(); void UpdateMoveInLineOfSightState();
+2 -2
View File
@@ -13917,7 +13917,7 @@ Unit* Creature::SelectVictim()
if (!tauntAuras.empty()) if (!tauntAuras.empty())
for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr) for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr)
if (Unit* caster = (*itr)->GetCaster()) if (Unit* caster = (*itr)->GetCaster())
if (_CanDetectFeignDeathOf(caster) && CanCreatureAttack(caster) && !caster->HasAuraTypeWithCaster(SPELL_AURA_IGNORED, GetGUID())) if (CanCreatureAttack(caster) && !caster->HasAuraTypeWithCaster(SPELL_AURA_IGNORED, GetGUID()))
{ {
target = caster; target = caster;
break; break;
@@ -13950,7 +13950,7 @@ Unit* Creature::SelectVictim()
else else
return nullptr; return nullptr;
if (target && _CanDetectFeignDeathOf(target) && CanCreatureAttack(target)) if (target && CanCreatureAttack(target))
{ {
SetInFront(target); SetInFront(target);
return target; return target;
+1 -1
View File
@@ -581,7 +581,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe
// pussywizard (excluded charmed) // pussywizard (excluded charmed)
if (!pet->IsCharmed()) if (!pet->IsCharmed())
if (Creature* creaturePet = pet->ToCreature()) if (Creature* creaturePet = pet->ToCreature())
if (!creaturePet->_CanDetectFeignDeathOf(TargetUnit) || !creaturePet->CanCreatureAttack(TargetUnit)) if (!creaturePet->CanCreatureAttack(TargetUnit))
return; return;
// Not let attack through obstructions // Not let attack through obstructions
@@ -289,7 +289,7 @@ struct boss_twinemperorsAI : public ScriptedAI
if (!who || me->GetVictim()) if (!who || me->GetVictim())
return; return;
if (me->_CanDetectFeignDeathOf(who) && me->CanCreatureAttack(who)) if (me->CanCreatureAttack(who))
{ {
if (me->IsWithinDistInMap(who, PULL_RANGE, true, false) && me->GetDistanceZ(who) <= /*CREATURE_Z_ATTACK_RANGE*/7 /*there are stairs*/) if (me->IsWithinDistInMap(who, PULL_RANGE, true, false) && me->GetDistanceZ(who) <= /*CREATURE_Z_ATTACK_RANGE*/7 /*there are stairs*/)
{ {
@@ -150,7 +150,7 @@ public:
{ {
Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); Map::PlayerList const& playerList = me->GetMap()->GetPlayers();
for(Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) for(Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
if (me->GetDistance(itr->GetSource()) < 130.0f && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster() && me->CanCreatureAttack(itr->GetSource()) && me->_CanDetectFeignDeathOf(itr->GetSource())) if (me->GetDistance(itr->GetSource()) < 130.0f && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster() && me->CanCreatureAttack(itr->GetSource()))
return true; return true;
return false; return false;
@@ -474,7 +474,7 @@ public:
Map::PlayerList const& pl = me->GetMap()->GetPlayers(); Map::PlayerList const& pl = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr)
if (Player* p = itr->GetSource()) if (Player* p = itr->GetSource())
if (p != me->GetVictim() && summon->GetExactDist(p) < minrange && me->CanCreatureAttack(p) && me->_CanDetectFeignDeathOf(p)) if (p != me->GetVictim() && summon->GetExactDist(p) < minrange && me->CanCreatureAttack(p))
{ {
target = p; target = p;
minrange = summon->GetExactDist(p); minrange = summon->GetExactDist(p);
+2 -2
View File
@@ -61,7 +61,7 @@ struct npc_pet_shaman_earth_elemental : public ScriptedAI
if (!me->IsInCombat()) if (!me->IsInCombat())
if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself())
if (Unit* target = owner->GetSelectedUnit()) if (Unit* target = owner->GetSelectedUnit())
if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) if (me->CanCreatureAttack(target))
AttackStart(target); AttackStart(target);
_initAttack = false; _initAttack = false;
} }
@@ -109,7 +109,7 @@ struct npc_pet_shaman_fire_elemental : public ScriptedAI
if (!me->IsInCombat()) if (!me->IsInCombat())
if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself())
if (Unit* target = owner->GetSelectedUnit()) if (Unit* target = owner->GetSelectedUnit())
if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) if (me->CanCreatureAttack(target))
AttackStart(target); AttackStart(target);
_initAttack = false; _initAttack = false;
} }