aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp3
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp27
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h5
-rw-r--r--src/server/game/Spells/SpellInfo.cpp22
-rw-r--r--src/server/game/Spells/SpellInfo.h1
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;