diff options
| author | Gildor <gildor55@gmail.com> | 2020-04-12 15:28:01 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-01-01 15:05:01 +0100 |
| commit | 60e66621dae44cb832ebb0bdb5e168f9ab114ecb (patch) | |
| tree | cb6b64c580921ffca2af15e24e949415854542eb /src/server/game/Entities/Object | |
| parent | 2aa5f4e1b2f1bc0cd956127fc53cac680c9aaf67 (diff) | |
Core/Gameobjects: Improve stealth detection (#24417)
* Core/Gameobjects: Improve stealth detection
* fix warning: private field 'i_funit' is not used
* Code cleanup
* add comment
Co-authored-by: jackpoz <giacomopoz@gmail.com>
(cherry picked from commit 862097a63351e957fd4aa6cb82fe7d9edf4d3926)
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index ae18e8422d9..d64d6a77346 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1548,9 +1548,15 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) co if (distance < combatReach) return true; - if (!HasInArc(float(M_PI), obj)) + // Only check back for units, it does not make sense for gameobjects + if (unit && !HasInArc(float(M_PI), obj)) return false; + // Traps should detect stealth always + if (GameObject const* go = ToGameObject()) + if (go->GetGoType() == GAMEOBJECT_TYPE_TRAP) + return true; + GameObject const* go = obj->ToGameObject(); for (uint32 i = 0; i < TOTAL_STEALTH_TYPES; ++i) { @@ -2457,8 +2463,8 @@ ReputationRank WorldObject::GetReactionTo(WorldObject const* target) const return *repRank; } - Unit const* unit = ToUnit(); - Unit const* targetUnit = target->ToUnit(); + Unit const* unit = Coalesce<const Unit>(ToUnit(), selfPlayerOwner); + Unit const* targetUnit = Coalesce<const Unit>(target->ToUnit(), targetPlayerOwner); if (unit && unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED)) { if (targetUnit && targetUnit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED)) @@ -2813,7 +2819,7 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const if (IsFriendlyTo(target) || target->IsFriendlyTo(this)) return false; - Player const* playerAffectingAttacker = unit && unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr; + Player const* playerAffectingAttacker = unit && unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : ToGameObject() ? GetAffectingPlayer() : nullptr; Player const* playerAffectingTarget = unitTarget && unitTarget->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr; // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar) @@ -2854,14 +2860,14 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const // additional checks - only PvP case if (playerAffectingAttacker && playerAffectingTarget) { - if (unitTarget->IsPvP()) + if (playerAffectingTarget->IsPvP()) return true; - if (unit->IsFFAPvP() && unitTarget->IsFFAPvP()) + if (playerAffectingAttacker->IsFFAPvP() && playerAffectingTarget->IsFFAPvP()) return true; - return unit->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1) || - unitTarget->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1); + return playerAffectingAttacker->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1) || + playerAffectingTarget->HasPvpFlag(UNIT_BYTE2_FLAG_UNK1); } return true; |
