diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 109 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/VehicleDefines.h | 4 |
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; |