aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWyrserth <43747507+Wyrserth@users.noreply.github.com>2019-05-30 17:35:18 +0200
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-05-30 17:35:18 +0200
commit88c6c61b95ac2b2f911b519136770479d31de27d (patch)
treec2603284d4aef83093f9b5e6916cfdbc00b35efb /src
parent7b8f294c024230451f82ff67150e11fc31b61293 (diff)
Core/Script: add script hook to allow overriding of a vehicle passenger's exit position (#23322)
* Core/Script: add script hook to allow overriding of a vehicle passenger's exit position. * Allow to change orientation, and fix nopch. * Keep original orientation, thanks jackpoz! * Update Unit.cpp Code cleanup * Update Unit.cpp
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp21
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp5
-rw-r--r--src/server/game/Scripting/ScriptMgr.h5
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;