aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent_Michael <Vincent_Michael@gmx.de>2013-03-13 23:20:04 +0100
committerVincent_Michael <Vincent_Michael@gmx.de>2013-03-13 23:20:04 +0100
commit556694b40b5a605990e4a4c944e67ff72f4362ce (patch)
treefb7a5d6df4592986d228069d3b312bf59ed3fb38 /src
parent0b445a99063c0d418c1b48026c736d606a6e9e46 (diff)
parentc47dceebff736ae37873aa220f989fdb00675030 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp6
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp26
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp5
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp11
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()