diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.h | 5 |
3 files changed, 23 insertions, 8 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index fbd2f89d611..f14ff30d5b6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12579,13 +12579,6 @@ void Unit::_ExitVehicle(Position const* exitPosition) SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT - Position pos; - if (!exitPosition) // Exit position not specified - pos = vehicle->GetBase()->GetPosition(); // This should use passenger's current position, leaving it as it is now - // because we calculate positions incorrect (sometimes under map) - else - pos = *exitPosition; - AddUnitState(UNIT_STATE_MOVE); if (player) @@ -12597,6 +12590,18 @@ void Unit::_ExitVehicle(Position const* exitPosition) SendMessageToSet(&data, false); } + Position pos; + // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it + if (exitPosition) + pos = *exitPosition; + else + { + // Set exit position to vehicle position and use the current orientation + pos = vehicle->GetBase()->GetPosition(); + pos.SetOrientation(GetOrientation()); + sScriptMgr->ModifyVehiclePassengerExitPos(this, vehicle, pos); + } + float height = pos.GetPositionZ() + vehicle->GetBase()->GetCollisionHeight(); Movement::MoveSplineInit init(this); @@ -12606,7 +12611,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) init.SetFall(); init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), height, false); - init.SetFacing(GetOrientation()); + init.SetFacing(pos.GetOrientation()); init.SetTransportExit(); GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_EXIT, MOTION_PRIORITY_HIGHEST); diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 051592c7fd9..e29d0126586 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -2111,6 +2111,11 @@ void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& dama FOREACH_SCRIPT(UnitScript)->ModifySpellDamageTaken(target, attacker, damage); } +void ScriptMgr::ModifyVehiclePassengerExitPos(Unit* passenger, Vehicle* vehicle, Position& pos) +{ + FOREACH_SCRIPT(UnitScript)->ModifyVehiclePassengerExitPos(passenger, vehicle, pos); +} + SpellScriptLoader::SpellScriptLoader(char const* name) : ScriptObject(name) { diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 077bbddaf8f..b9677ff70b4 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -70,6 +70,7 @@ struct CreatureTemplate; struct CreatureData; struct ItemTemplate; struct MapEntry; +struct Position; enum BattlegroundTypeId : uint32; enum ContentLevels : uint8; @@ -407,6 +408,9 @@ class TC_GAME_API UnitScript : public ScriptObject // Called when Spell Damage is being Dealt virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/) { } + + // Called when an unit exits a vehicle + virtual void ModifyVehiclePassengerExitPos(Unit* /*passenger*/, Vehicle* /*vehicle*/, Position& /*pos*/) { } }; class TC_GAME_API CreatureScript : public ScriptObject @@ -1057,6 +1061,7 @@ class TC_GAME_API ScriptMgr void ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage); void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage); void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage); + void ModifyVehiclePassengerExitPos(Unit* passenger, Vehicle* vehicle, Position& pos); private: uint32 _scriptCount; |