aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-22 16:38:33 +0200
committerShauren <shauren.trinity@gmail.com>2022-05-22 16:38:33 +0200
commit00bc0cea8080acb056fd26da2a7eeb9fe9f51df9 (patch)
tree8ebab32876c08f3724fec3aeae1285fac51b0cbd
parentc13d26e1fa40ac8d40e1b4f7c72e4c1ef3f6c5e8 (diff)
Core/Transports: Extracted transport and vehicle passenger relocation to shared function
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp109
-rw-r--r--src/server/game/Entities/Transport/Transport.h2
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp4
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h4
4 files changed, 65 insertions, 54 deletions
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index b61722ab83d..73e7e610e67 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -34,6 +34,61 @@
#include <G3D/Vector3.h>
#include <sstream>
+void TransportBase::UpdatePassengerPosition(Map* map, WorldObject* passenger, float x, float y, float z, float o, bool setHomePosition)
+{
+ // transport teleported but passenger not yet (can happen for players)
+ if (passenger->GetMap() != map)
+ return;
+
+ // if passenger is on vehicle we have to assume the vehicle is also on transport
+ // and its the vehicle that will be updating its passengers
+ if (Unit* unit = passenger->ToUnit())
+ if (unit->GetVehicle())
+ return;
+
+ // Do not use Unit::UpdatePosition here, we don't want to remove auras
+ // as if regular movement occurred
+ switch (passenger->GetTypeId())
+ {
+ case TYPEID_UNIT:
+ {
+ Creature* creature = passenger->ToCreature();
+ map->CreatureRelocation(creature, x, y, z, o, false);
+ if (setHomePosition)
+ {
+ creature->GetTransportHomePosition(x, y, z, o);
+ CalculatePassengerPosition(x, y, z, &o);
+ creature->SetHomePosition(x, y, z, o);
+ }
+ break;
+ }
+ case TYPEID_PLAYER:
+ //relocate only passengers in world and skip any player that might be still logging in/teleporting
+ if (passenger->IsInWorld() && !passenger->ToPlayer()->IsBeingTeleported())
+ {
+ map->PlayerRelocation(passenger->ToPlayer(), x, y, z, o);
+ passenger->ToPlayer()->SetFallInformation(0, passenger->GetPositionZ());
+ }
+ break;
+ case TYPEID_GAMEOBJECT:
+ map->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false);
+ passenger->ToGameObject()->RelocateStationaryPosition(x, y, z, o);
+ break;
+ case TYPEID_DYNAMICOBJECT:
+ map->DynamicObjectRelocation(passenger->ToDynObject(), x, y, z, o);
+ break;
+ case TYPEID_AREATRIGGER:
+ map->AreaTriggerRelocation(passenger->ToAreaTrigger(), x, y, z, o);
+ break;
+ default:
+ break;
+ }
+
+ if (Unit* unit = passenger->ToUnit())
+ if (Vehicle* vehicle = unit->GetVehicleKit())
+ vehicle->RelocatePassengers();
+}
+
Transport::Transport() : GameObject(),
_transportInfo(nullptr), _isMoving(true), _pendingStop(false),
_triggeredArrivalEvent(false), _triggeredDepartureEvent(false),
@@ -696,62 +751,14 @@ void Transport::DelayedTeleportTransport()
GetMap()->AddToMap<Transport>(this);
}
-void Transport::UpdatePassengerPositions(PassengerSet& passengers)
+void Transport::UpdatePassengerPositions(PassengerSet const& passengers)
{
- for (PassengerSet::iterator itr = passengers.begin(); itr != passengers.end(); ++itr)
+ for (WorldObject* passenger : passengers)
{
- WorldObject* passenger = *itr;
- // transport teleported but passenger not yet (can happen for players)
- if (passenger->GetMap() != GetMap())
- continue;
-
- // if passenger is on vehicle we have to assume the vehicle is also on transport
- // and its the vehicle that will be updating its passengers
- if (Unit* unit = passenger->ToUnit())
- if (unit->GetVehicle())
- continue;
-
- // Do not use Unit::UpdatePosition here, we don't want to remove auras
- // as if regular movement occurred
float x, y, z, o;
passenger->m_movementInfo.transport.pos.GetPosition(x, y, z, o);
CalculatePassengerPosition(x, y, z, &o);
- switch (passenger->GetTypeId())
- {
- case TYPEID_UNIT:
- {
- Creature* creature = passenger->ToCreature();
- GetMap()->CreatureRelocation(creature, x, y, z, o, false);
- creature->GetTransportHomePosition(x, y, z, o);
- CalculatePassengerPosition(x, y, z, &o);
- creature->SetHomePosition(x, y, z, o);
- break;
- }
- case TYPEID_PLAYER:
- //relocate only passengers in world and skip any player that might be still logging in/teleporting
- if (passenger->IsInWorld() && !passenger->ToPlayer()->IsBeingTeleported())
- {
- GetMap()->PlayerRelocation(passenger->ToPlayer(), x, y, z, o);
- passenger->ToPlayer()->SetFallInformation(0, passenger->GetPositionZ());
- }
- break;
- case TYPEID_GAMEOBJECT:
- GetMap()->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false);
- passenger->ToGameObject()->RelocateStationaryPosition(x, y, z, o);
- break;
- case TYPEID_DYNAMICOBJECT:
- GetMap()->DynamicObjectRelocation(passenger->ToDynObject(), x, y, z, o);
- break;
- case TYPEID_AREATRIGGER:
- GetMap()->AreaTriggerRelocation(passenger->ToAreaTrigger(), x, y, z, o);
- break;
- default:
- break;
- }
-
- if (Unit* unit = passenger->ToUnit())
- if (Vehicle* vehicle = unit->GetVehicleKit())
- vehicle->RelocatePassengers();
+ UpdatePassengerPosition(GetMap(), passenger, x, y, z, o, true);
}
}
diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index 5ab4adee156..0433cacebcd 100644
--- a/src/server/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
@@ -107,7 +107,7 @@ class TC_GAME_API Transport : public GameObject, public TransportBase
float CalculateSegmentPos(float perc);
bool TeleportTransport(uint32 newMapid, float x, float y, float z, float o);
void DelayedTeleportTransport();
- void UpdatePassengerPositions(PassengerSet& passengers);
+ void UpdatePassengerPositions(PassengerSet const& passengers);
void DoEventIfAny(KeyFrame const& node, bool departure);
//! Helpers to know if stop frame was reached
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 26c5fc949c0..4279d472dc5 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -568,8 +568,8 @@ void Vehicle::RelocatePassengers()
}
}
- for (auto const& pair : seatRelocation)
- pair.first->UpdatePosition(pair.second);
+ for (auto const& [passenger, position] : seatRelocation)
+ UpdatePassengerPosition(_me->GetMap(), passenger, position.GetPositionX(), position.GetPositionY(), position.GetPositionZ(), position.GetOrientation(), false);
}
/**
diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h
index 5d0205e8698..9d1e84bfb79 100644
--- a/src/server/game/Entities/Vehicle/VehicleDefines.h
+++ b/src/server/game/Entities/Vehicle/VehicleDefines.h
@@ -23,6 +23,8 @@
#include <vector>
#include <map>
+class Map;
+class WorldObject;
struct VehicleSeatEntry;
enum PowerType
@@ -161,6 +163,8 @@ public:
/// This method transforms supplied global coordinates into local offsets
virtual void CalculatePassengerOffset(float& x, float& y, float& z, float* o = nullptr) const = 0;
+ void UpdatePassengerPosition(Map* map, WorldObject* passenger, float x, float y, float z, float o, bool setHomePosition);
+
static void CalculatePassengerPosition(float& x, float& y, float& z, float* o, float transX, float transY, float transZ, float transO)
{
float inx = x, iny = y, inz = z;