mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Transports: Extracted transport and vehicle passenger relocation to shared function
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user