fix(Core/Entities): Improve interactions between taxis and players regarding PvP flag. (#23681)

This commit is contained in:
Benjamin Jackson
2025-11-15 03:21:22 -05:00
committed by GitHub
parent 6b9a8df5dc
commit c552158e99
4 changed files with 10 additions and 15 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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)
{

View File

@@ -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);