diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 087a2f2d6..cf6a2ee10 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -57,9 +57,6 @@ bool PetAI::_needToStop() if (owner->GetExactDist(me) >= (owner->GetVisibilityRange() - 10.0f)) return true; - if (!me->_CanDetectFeignDeathOf(me->GetVictim())) - return true; - 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 if (Unit* myAttacker = me->getAttackerForHelper()) - if (!myAttacker->HasBreakableByDamageCrowdControlAura() && me->_CanDetectFeignDeathOf(myAttacker) && me->CanCreatureAttack(myAttacker)) + if (!myAttacker->HasBreakableByDamageCrowdControlAura() && me->CanCreatureAttack(myAttacker)) return myAttacker; // 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()) for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr) 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; } @@ -493,13 +490,13 @@ Unit* PetAI::SelectNextTarget(bool allowAutoSelect) const // Check owner attackers if (Unit* ownerAttacker = owner->getAttackerForHelper()) - if (!ownerAttacker->HasBreakableByDamageCrowdControlAura() && me->_CanDetectFeignDeathOf(ownerAttacker) && me->CanCreatureAttack(ownerAttacker)) + if (!ownerAttacker->HasBreakableByDamageCrowdControlAura() && me->CanCreatureAttack(ownerAttacker)) return ownerAttacker; // Check owner victim // 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 (me->_CanDetectFeignDeathOf(ownerVictim) && me->CanCreatureAttack(ownerVictim)) + if (me->CanCreatureAttack(ownerVictim)) return ownerVictim; // Neither pet or owner had a target and aggressive pets can pick any target diff --git a/src/server/game/Combat/ThreatMgr.cpp b/src/server/game/Combat/ThreatMgr.cpp index 81db04fa4..d381bb4cc 100644 --- a/src/server/game/Combat/ThreatMgr.cpp +++ b/src/server/game/Combat/ThreatMgr.cpp @@ -318,7 +318,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR if (currentVictim) { 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; 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; @@ -353,7 +353,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR } // 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 { diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index fc6efac2c..1f56a0c18 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2351,13 +2351,6 @@ bool Creature::_IsTargetAcceptable(const Unit* target) const 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() { // 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; } + // 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 (GetMap()->IsDungeon()) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 822903765..2410cd911 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -255,7 +255,6 @@ public: bool CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction = true) const; bool _IsTargetAcceptable(const Unit* target) const; 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 void UpdateMoveInLineOfSightState(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a117615da..66cd45196 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13917,7 +13917,7 @@ Unit* Creature::SelectVictim() if (!tauntAuras.empty()) for (Unit::AuraEffectList::const_reverse_iterator itr = tauntAuras.rbegin(); itr != tauntAuras.rend(); ++itr) 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; break; @@ -13950,7 +13950,7 @@ Unit* Creature::SelectVictim() else return nullptr; - if (target && _CanDetectFeignDeathOf(target) && CanCreatureAttack(target)) + if (target && CanCreatureAttack(target)) { SetInFront(target); return target; diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 57a3b3fbe..6567baff9 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -581,7 +581,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe // pussywizard (excluded charmed) if (!pet->IsCharmed()) if (Creature* creaturePet = pet->ToCreature()) - if (!creaturePet->_CanDetectFeignDeathOf(TargetUnit) || !creaturePet->CanCreatureAttack(TargetUnit)) + if (!creaturePet->CanCreatureAttack(TargetUnit)) return; // Not let attack through obstructions diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 467e89bb0..35af5666a 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -289,7 +289,7 @@ struct boss_twinemperorsAI : public ScriptedAI if (!who || me->GetVictim()) 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*/) { diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 0dcb909e6..e8573949c 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -150,7 +150,7 @@ public: { Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); 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 false; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 5a66b35a0..7e9e8a625 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -474,7 +474,7 @@ public: Map::PlayerList const& pl = me->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) 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; minrange = summon->GetExactDist(p); diff --git a/src/server/scripts/Pet/pet_shaman.cpp b/src/server/scripts/Pet/pet_shaman.cpp index 0e35ec68e..ebd2ce038 100644 --- a/src/server/scripts/Pet/pet_shaman.cpp +++ b/src/server/scripts/Pet/pet_shaman.cpp @@ -61,7 +61,7 @@ struct npc_pet_shaman_earth_elemental : public ScriptedAI if (!me->IsInCombat()) if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) if (Unit* target = owner->GetSelectedUnit()) - if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) + if (me->CanCreatureAttack(target)) AttackStart(target); _initAttack = false; } @@ -109,7 +109,7 @@ struct npc_pet_shaman_fire_elemental : public ScriptedAI if (!me->IsInCombat()) if (Player* owner = me->GetCharmerOrOwnerPlayerOrPlayerItself()) if (Unit* target = owner->GetSelectedUnit()) - if (me->_CanDetectFeignDeathOf(target) && me->CanCreatureAttack(target)) + if (me->CanCreatureAttack(target)) AttackStart(target); _initAttack = false; }