diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 5 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 1 |
6 files changed, 33 insertions, 29 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9f6b5f76cb4..aad567e942f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3263,7 +3263,7 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) if (aura->IsRemoved()) return; - aura->SetIsSingleTarget(caster && aura->GetSpellInfo()->IsSingleTarget()); + aura->SetIsSingleTarget(caster && (aura->GetSpellInfo()->IsSingleTarget() || aura->HasEffectType(SPELL_AURA_CONTROL_VEHICLE))); if (aura->IsSingleTarget()) { ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID())); @@ -3274,7 +3274,7 @@ void Unit::_AddAura(UnitAura* aura, Unit* caster) for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();) { if ((*itr) != aura && - (*itr)->GetSpellInfo()->IsSingleTargetWith(aura->GetSpellInfo())) + (*itr)->IsSingleTargetWith(aura)) { (*itr)->Remove(); itr = scAuras.begin(); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index fa3203159ba..c2eb526f3a3 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -803,6 +803,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) ASSERT(Target->GetBase()->HasAuraTypeWithCaster(SPELL_AURA_CONTROL_VEHICLE, Passenger->GetGUID())); Target->RemovePendingEventsForSeat(Seat->first); + Target->RemovePendingEventsForPassenger(Passenger); Passenger->SetVehicle(Target); Seat->second.Passenger = Passenger->GetGUID(); @@ -835,7 +836,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) player->UnsummonPetTemporaryIfAny(); } - if (Seat->second.SeatInfo->m_flags && !(Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_ALLOW_TURNING)) + if (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_HIDE_PASSENGER) Passenger->AddUnitState(UNIT_STATE_ONVEHICLE); Passenger->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 7e6f1d1b402..32ccaf028ad 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -937,6 +937,31 @@ bool Aura::CanBeSentToClient() const return !IsPassive() || GetSpellInfo()->HasAreaAuraEffect() || HasEffectType(SPELL_AURA_ABILITY_IGNORE_AURASTATE); } +bool Aura::IsSingleTargetWith(Aura const* aura) const +{ + // Same spell? + if (GetSpellInfo()->IsRankOf(aura->GetSpellInfo())) + return true; + + SpellSpecificType spec = GetSpellInfo()->GetSpellSpecific(); + // spell with single target specific types + switch (spec) + { + case SPELL_SPECIFIC_JUDGEMENT: + case SPELL_SPECIFIC_MAGE_POLYMORPH: + if (aura->GetSpellInfo()->GetSpellSpecific() == spec) + return true; + break; + default: + break; + } + + if (HasEffectType(SPELL_AURA_CONTROL_VEHICLE) && aura->HasEffectType(SPELL_AURA_CONTROL_VEHICLE)) + return true; + + return false; +} + void Aura::UnregisterSingleTarget() { ASSERT(m_isSingleTarget); @@ -1890,7 +1915,7 @@ bool Aura::CanStackWith(Aura const* existingAura) const if (!veh->GetAvailableSeatCount()) return false; // No empty seat available - return !sameCaster; // Empty seat available (skip rest) and different caster + return true; // Empty seat available (skip rest) } // spell of same spell rank chain diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 73832a632c3..56927a09ae6 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -165,8 +165,9 @@ class Aura bool IsRemoved() const { return m_isRemoved; } bool CanBeSentToClient() const; // Single cast aura helpers - bool IsSingleTarget() const {return m_isSingleTarget;} - void SetIsSingleTarget(bool val) { m_isSingleTarget = val;} + bool IsSingleTarget() const {return m_isSingleTarget; } + bool IsSingleTargetWith(Aura const* aura) const; + void SetIsSingleTarget(bool val) { m_isSingleTarget = val; } void UnregisterSingleTarget(); int32 CalcDispelChance(Unit* auraTarget, bool offensive) const; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 5225ff77e95..c813f9bbd27 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1212,28 +1212,6 @@ bool SpellInfo::IsSingleTarget() const return false; } -bool SpellInfo::IsSingleTargetWith(SpellInfo const* spellInfo) const -{ - // Same spell? - if (IsRankOf(spellInfo)) - return true; - - SpellSpecificType spec = GetSpellSpecific(); - // spell with single target specific types - switch (spec) - { - case SPELL_SPECIFIC_JUDGEMENT: - case SPELL_SPECIFIC_MAGE_POLYMORPH: - if (spellInfo->GetSpellSpecific() == spec) - return true; - break; - default: - break; - } - - return false; -} - bool SpellInfo::IsAuraExclusiveBySpecificWith(SpellInfo const* spellInfo) const { SpellSpecificType spellSpec1 = GetSpellSpecific(); diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 3e6ba0023b1..6d0778087ce 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -413,7 +413,6 @@ public: bool CanDispelAura(SpellInfo const* aura) const; bool IsSingleTarget() const; - bool IsSingleTargetWith(SpellInfo const* spellInfo) const; bool IsAuraExclusiveBySpecificWith(SpellInfo const* spellInfo) const; bool IsAuraExclusiveBySpecificPerCasterWith(SpellInfo const* spellInfo) const; |