diff options
| author | Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> | 2025-11-15 03:21:22 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-15 05:21:22 -0300 |
| commit | c552158e9916f962a647e41b5f9e66efee538803 (patch) | |
| tree | 06864cca6fc625a4f6e220b47f8a780f5e7a740a /src | |
| parent | 6b9a8df5dc360106cca85b1b555bbe150f44ed92 (diff) | |
fix(Core/Entities): Improve interactions between taxis and players regarding PvP flag. (#23681)
Diffstat (limited to 'src')
4 files changed, 10 insertions, 15 deletions
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 8d0804f3bc..f21e93230e 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -83,29 +83,19 @@ WorldObject* CreatureAI::GetSummoner() const inline bool IsValidCombatTarget(Creature* source, Player* target) { if (target->IsGameMaster()) - { return false; - } if (!source->IsInWorld() || !target->IsInWorld()) - { return false; - } if (!source->IsAlive() || !target->IsAlive()) - { return false; - } if (!source->InSamePhase(target)) - { return false; - } - if (source->HasUnitState(UNIT_STATE_IN_FLIGHT) || target->HasUnitState(UNIT_STATE_IN_FLIGHT)) - { + if (source->IsInFlight() || target->IsInFlight()) return false; - } return true; } diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index c0f2105a6e..2913f66238 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -1439,6 +1439,9 @@ void Player::UpdatePvPState() if (pvpInfo.IsHostile) // in hostile area { + if (IsInFlight()) // on taxi + return; + if (!IsPvP() || pvpInfo.EndTimer != 0) UpdatePvP(true, true); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8883081ae9..31da399db5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1864,7 +1864,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) auto canTakeMeleeDamage = [&]() { - return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks()); + return victim->IsAlive() && !victim->IsInFlight() && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks()); }; if (!canTakeMeleeDamage()) @@ -18196,10 +18196,8 @@ void Unit::SetControlled(bool apply, UnitState state, Unit* source /*= nullptr*/ void Unit::SetStunned(bool apply) { - if (HasUnitState(UNIT_STATE_IN_FLIGHT)) - { + if (IsInFlight()) return; - } if (apply) { diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 9ee245b924..47d72798e3 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -418,6 +418,7 @@ void FlightPathMovementGenerator::DoFinalize(Player* player) player->m_taxi.ClearTaxiDestinations(); player->Dismount(); player->RemoveUnitFlag(UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); + player->UpdatePvPState(); // to account for cases such as flying into a PvP territory, as it does not flag on the way in if (player->m_taxi.empty()) { @@ -447,6 +448,9 @@ void FlightPathMovementGenerator::DoReset(Player* player) return; } + if (player->pvpInfo.EndTimer) + player->UpdatePvP(false, true); // PvP flag timer immediately ends when starting taxi + player->getHostileRefMgr().setOnlineOfflineState(false); player->AddUnitState(UNIT_STATE_IN_FLIGHT); player->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT); |
