diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 5 | ||||
-rw-r--r-- | src/server/scripts/Outland/zone_shadowmoon_valley.cpp | 11 |
7 files changed, 44 insertions, 11 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 02388fa57bf..99c1813b7e5 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1294,8 +1294,8 @@ bool Creature::CreateFromProto(uint32 guidlow, uint32 Entry, uint32 vehId, uint3 if (!UpdateEntry(Entry, team, data)) return false; - if (vehId && !CreateVehicleKit(vehId, Entry)) - vehId = 0; + if (vehId) + CreateVehicleKit(vehId, Entry); return true; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9215dc1aebe..3b50df73ed1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -26177,6 +26177,7 @@ void Player::ActivateSpec(uint8 spec) ClearComboPointHolders(); ClearAllReactives(); UnsummonAllTotems(); + ExitVehicle(); RemoveAllControlled(); /*RemoveAllAurasOnDeath(); if (GetPet()) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 84874625393..655fb41cc83 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11594,6 +11594,9 @@ void Unit::setDeathState(DeathState s) if (IsNonMeleeSpellCasted(false)) InterruptNonMeleeSpells(false); + ExitVehicle(); // Exit vehicle before calling RemoveAllControlled + // vehicles use special type of charm that is not removed by the next function + // triggering an assert UnsummonAllTotems(); RemoveAllControlled(); RemoveAllAurasOnDeath(); @@ -16292,7 +16295,10 @@ void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* a if (Player* player = ToPlayer()) { if (vehicle->GetBase()->GetTypeId() == TYPEID_PLAYER && player->isInCombat()) + { + vehicle->GetBase()->RemoveAura(const_cast<AuraApplication*>(aurApp)); return; + } } ASSERT(!m_vehicle); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 74173774391..0f4d0a94409 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -744,6 +744,31 @@ void Vehicle::RemovePendingEventsForSeat(int8 seatId) } } +/** + * @fn void Vehicle::RemovePendingEventsForSeat(uint8 seatId) + * + * @brief Removes any pending events for given passenger. Executed when vehicle control aura is removed while adding passenger is in progress + * + * @author Shauren + * @date 13-2-2013 + * + * @param passenger Unit that is supposed to enter the vehicle. + */ + +void Vehicle::RemovePendingEventsForPassenger(Unit* passenger) +{ + for (PendingJoinEventContainer::iterator itr = _pendingJoinEvents.begin(); itr != _pendingJoinEvents.end();) + { + if ((*itr)->Passenger == passenger) + { + (*itr)->to_Abort = true; + _pendingJoinEvents.erase(itr++); + } + else + ++itr; + } +} + VehicleJoinEvent::~VehicleJoinEvent() { if (Target) @@ -769,6 +794,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32) { ASSERT(Passenger->IsInWorld()); ASSERT(Target && Target->GetBase()->IsInWorld()); + ASSERT(Target->GetBase()->HasAuraTypeWithCaster(SPELL_AURA_CONTROL_VEHICLE, Passenger->GetGUID())); Target->RemovePendingEventsForSeat(Seat->first); diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 70b821de912..67975490ecc 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -71,6 +71,8 @@ class Vehicle : public TransportBase VehicleSeatEntry const* GetSeatForPassenger(Unit const* passenger) const; + void RemovePendingEventsForPassenger(Unit* passenger); + protected: friend class VehicleJoinEvent; uint32 UsableSeatNum; ///< Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index ca8008c352c..f9843a060c7 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2396,7 +2396,7 @@ void AuraEffect::HandleAuraModPacifyAndSilence(AuraApplication const* aurApp, ui Unit* target = aurApp->GetTarget(); // Vengeance of the Blue Flight (@todo REMOVE THIS!) - /// @workaround + /// @workaround if (m_spellInfo->Id == 45839) { if (apply) @@ -3010,6 +3010,9 @@ void AuraEffect::HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 m } else { + // Remove pending passengers before exiting vehicle - might cause an Uninstall + target->GetVehicleKit()->RemovePendingEventsForPassenger(caster); + if (GetId() == 53111) // Devour Humanoid { target->Kill(caster); diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 5a9fcba8fd4..b8f96e373f3 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -1891,16 +1891,11 @@ class spell_unlocking_zuluheds_chains : public SpellScriptLoader { PrepareSpellScript(spell_unlocking_zuluheds_chains_SpellScript); - bool Load() - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - void HandleAfterHit() { - Player* caster = GetCaster()->ToPlayer(); - if (caster->GetQuestStatus(QUEST_ZULUHED) == QUEST_STATUS_INCOMPLETE) - caster->KilledMonsterCredit(NPC_KARYNAKU, 0); + if (GetCaster()->GetTypeId() == TYPEID_PLAYER) + if (Creature* karynaku = GetCaster()->FindNearestCreature(NPC_KARYNAKU, 15.0f)) + GetCaster()->ToPlayer()->CastedCreatureOrGO(NPC_KARYNAKU, karynaku->GetGUID(), GetSpellInfo()->Id); } void Register() |