AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
MotionTransport Class Reference

#include "Transport.h"

Inheritance diagram for MotionTransport:
Transport GameObject TransportBase WorldObject GridObject< GameObject > MovableMapObject UpdatableMapObject Object WorldLocation Position

Public Member Functions

 ~MotionTransport () override
 
bool CreateMoTrans (ObjectGuid::LowType guidlow, uint32 entry, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void Update (uint32 diff) override
 
void DelayedUpdate (uint32 diff) override
 
void UpdatePosition (float x, float y, float z, float o)
 
void AddPassenger (WorldObject *passenger, bool withAll=false) override
 
void RemovePassenger (WorldObject *passenger, bool withAll=false) override
 
CreatureCreateNPCPassenger (ObjectGuid::LowType guid, CreatureData const *data)
 
GameObjectCreateGOPassenger (ObjectGuid::LowType guid, GameObjectData const *data)
 
void LoadStaticPassengers ()
 
PassengerSet const & GetStaticPassengers () const
 
void UnloadStaticPassengers ()
 
void UnloadNonStaticPassengers ()
 
void SetPassengersLoaded (bool loaded)
 
bool PassengersLoaded () const
 
KeyFrameVec const & GetKeyFrames () const
 
void EnableMovement (bool enabled)
 
TransportTemplate const * GetTransportTemplate () const
 
uint32 GetPeriod () const
 
void SetPeriod (uint32 period)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Transport
 Transport ()
 
void CalculatePassengerPosition (float &x, float &y, float &z, float *o=nullptr) const override
 This method transforms supplied transport offsets into global coordinates.
 
void CalculatePassengerOffset (float &x, float &y, float &z, float *o=nullptr) const override
 This method transforms supplied global coordinates into local offsets.
 
PassengerSet const & GetPassengers () const
 
uint32 GetPathProgress () const
 
void SetPathProgress (uint32 val)
 
- Public Member Functions inherited from GameObject
 GameObject ()
 
 ~GameObject () override
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
virtual bool Create (ObjectGuid::LowType guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, G3D::Quat const &rotation, uint32 animprogress, GOState go_state, uint32 artKit=0)
 
GameObjectTemplate const * GetGOInfo () const
 
GameObjectTemplateAddon const * GetTemplateAddon () const
 
GameObjectData const * GetGameObjectData () const
 
GameObjectValue const * GetGOValue () const
 
bool IsTransport () const
 
bool IsDestructibleBuilding () const
 
ObjectGuid::LowType GetSpawnId () const
 
void SetWorldRotationAngles (float z_rot, float y_rot, float x_rot)
 
void SetWorldRotation (G3D::Quat const &rot)
 
void SetTransportPathRotation (float qx, float qy, float qz, float qw)
 
G3D::Quat const & GetWorldRotation () const
 
int64 GetPackedWorldRotation () const
 
G3D::Quat GetFinalWorldRotation () const
 
std::string const & GetNameForLocaleIdx (LocaleConstant locale_idx) const override
 
void SaveToDB (bool saveAddon=false)
 
void SaveToDB (uint32 mapid, uint8 spawnMask, uint32 phaseMask, bool saveAddon=false)
 
virtual bool LoadFromDB (ObjectGuid::LowType guid, Map *map)
 
virtual bool LoadGameObjectFromDB (ObjectGuid::LowType guid, Map *map, bool addToMap=true)
 
bool IsRespawnCompatibilityMode () const
 
void DeleteFromDB ()
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetOwnerGUID () const
 
UnitGetOwner () const
 
void SetSpellId (uint32 id)
 
uint32 GetSpellId () const
 
time_t GetRespawnTime () const
 
time_t GetRespawnTimeEx () const
 
void SetRespawnTime (int32 respawn)
 
void SetRespawnDelay (int32 respawn)
 
void Respawn ()
 
bool isSpawned () const
 
bool isSpawnedByDefault () const
 
void SetSpawnedByDefault (bool b)
 
uint32 GetRespawnDelay () const
 
void Refresh ()
 
void DespawnOrUnsummon (Milliseconds delay=0ms, Seconds forcedRespawnTime=0s)
 
void Delete ()
 
void GetFishLoot (Loot *fishLoot, Player *lootOwner, bool junk=false)
 
GameobjectTypes GetGoType () const
 
void SetGoType (GameobjectTypes type)
 
GOState GetGoState () const
 
void SetGoState (GOState state)
 
uint8 GetGoArtKit () const
 
void SetGoArtKit (uint8 artkit)
 
uint8 GetGoAnimProgress () const
 
void SetGoAnimProgress (uint8 animprogress)
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void EnableCollision (bool enable)
 
GameObjectFlags GetGameObjectFlags () const
 
bool HasGameObjectFlag (GameObjectFlags flags) const
 
void SetGameObjectFlag (GameObjectFlags flags)
 
void RemoveGameObjectFlag (GameObjectFlags flags)
 
void ReplaceAllGameObjectFlags (GameObjectFlags flags)
 
void Use (Unit *user)
 
LootState getLootState () const
 
void SetLootState (LootState s, Unit *unit=nullptr)
 
uint16 GetLootMode () const
 
bool HasLootMode (uint16 lootMode) const
 
void SetLootMode (uint16 lootMode)
 
void AddLootMode (uint16 lootMode)
 
void RemoveLootMode (uint16 lootMode)
 
void ResetLootMode ()
 
void AddToSkillupList (ObjectGuid const &playerGuid)
 
bool IsInSkillupList (ObjectGuid const &playerGuid) const
 
void AddUniqueUse (Player *player)
 
void AddUse ()
 
uint32 GetUseCount () const
 
uint32 GetUniqueUseCount () const
 
void SaveRespawnTime () override
 
void SaveRespawnTime (uint32 forceDelay)
 
PlayerGetLootRecipient () const
 
GroupGetLootRecipientGroup () const
 
void SetLootRecipient (Creature *creature)
 
void SetLootRecipient (Map *map)
 
bool IsLootAllowedFor (Player const *player) const
 
bool HasLootRecipient () const
 
void SetLootGenerationTime ()
 
uint32 GetLootGenerationTime () const
 
GameObjectGetLinkedTrap ()
 
void SetLinkedTrap (GameObject *linkedTrap)
 
bool hasQuest (uint32 quest_id) const override
 
bool hasInvolvedQuest (uint32 quest_id) const override
 
bool ActivateToQuest (Player *target) const
 
void UseDoorOrButton (uint32 time_to_restore=0, bool alternative=false, Unit *user=nullptr)
 
void ResetDoorOrButton ()
 
void TriggeringLinkedGameObject (uint32 trapEntry, Unit *target)
 
bool IsNeverVisible () const override
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 
bool IsInvisibleDueToDespawn () const override
 
uint8 getLevelForTarget (WorldObject const *target) const override
 
GameObjectLookupFishingHoleAround (float range)
 
void CastSpell (Unit *target, uint32 spell)
 
void SendCustomAnim (uint32 anim)
 
bool IsInRange2d (float x, float y, float radius) const
 
bool IsInRange3d (float x, float y, float z, float radius) const
 
void ModifyHealth (int32 change, Unit *attackerOrHealer=nullptr, uint32 spellId=0)
 
void SetDestructibleBuildingModifyState (bool allow)
 
void SetDestructibleState (GameObjectDestructibleState state, Player *eventInvoker=nullptr, bool setHealth=false)
 
GameObjectDestructibleState GetDestructibleState () const
 
void EventInform (uint32 eventId)
 
virtual uint32 GetScriptId () const
 
GameObjectAIAI () const
 
std::string const & GetAIName () const
 
void SetDisplayId (uint32 displayid)
 
uint32 GetDisplayId () const
 
void GetRespawnPosition (float &x, float &y, float &z, float *ori=nullptr) const
 
void SetPosition (float x, float y, float z, float o)
 
void SetPosition (Position const &pos)
 
bool IsStaticTransport () const
 
bool IsMotionTransport () const
 
TransportToTransport ()
 
Transport const * ToTransport () const
 
StaticTransportToStaticTransport ()
 
StaticTransport const * ToStaticTransport () const
 
MotionTransportToMotionTransport ()
 
MotionTransport const * ToMotionTransport () const
 
float GetStationaryX () const override
 
float GetStationaryY () const override
 
float GetStationaryZ () const override
 
float GetStationaryO () const override
 
float GetInteractionDistance () const
 
void UpdateModelPosition ()
 
bool IsAtInteractDistance (Position const &pos, float radius) const
 
bool IsAtInteractDistance (Player const *player, SpellInfo const *spell=nullptr) const
 
bool IsWithinDistInMap (Player const *player) const
 
SpellInfo const * GetSpellForLock (Player const *player) const
 
bool ValidateGameobjectType () const
 
bool IsInstanceGameobject () const
 
uint8 GameobjectStateToInt (GOState *state) const
 
bool IsAllowedToSaveToDB () const
 
void AllowSaveToDB (bool enable)
 
void SaveStateToDB ()
 
bool IsUpdateNeeded () override
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (Position const &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (Position const &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (Position const &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (Position const *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (Position const *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
template<typename Worker >
void DoForAllVisiblePlayers (Worker &&worker)
 
template<typename Worker >
void DoForAllVisibleWorldObjects (Worker &&worker)
 
void DestroyForVisiblePlayers ()
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
float GetLeewayBonusRange (Unit const *target) const
 
float GetLeewayBonusRadius () const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, Position const &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
void SummonGameObjectGroup (uint8 group, std::list< GameObject * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
VisibilityDistanceType GetVisibilityOverrideType () const
 
bool IsVisibilityOverridden () const
 
bool IsZoneWideVisible () const
 
bool IsFarVisible () const
 
float GetVisibilityOverrideDistance () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
ObjectVisibilityContainerGetObjectVisibilityContainer ()
 
ObjectVisibilityContainer const & GetObjectVisibilityContainer () const
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (WorldLocation const &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (Position const &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (Position const &pos)
 
void Relocate (Position const *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (Position const &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (Position const &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (Position const *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (Position const *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (Position const *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (Position const *pos, float dist) const
 
bool IsWithinBox (Position const &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, Position const *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
bool HasInLine (Position const *pos, float objSize, float width) const
 
std::string ToString () const
 
- Public Member Functions inherited from GridObject< GameObject >
bool IsInGrid () const
 
void AddToGrid (GridRefMgr< GameObject > &m)
 
void RemoveFromGrid ()
 

Private Member Functions

 MotionTransport ()
 
void MoveToNextWaypoint ()
 
float CalculateSegmentPos (float perc)
 
bool TeleportTransport (uint32 newMapid, float x, float y, float z, float o)
 
void DelayedTeleportTransport ()
 
void UpdatePassengerPositions (PassengerSet &passengers)
 
void DoEventIfAny (KeyFrame const &node, bool departure)
 
uint32 HandleFirstDepartureSync (uint32 diff)
 
bool IsMoving () const
 Helpers to know if stop frame was reached.
 
void SetMoving (bool val)
 

Private Attributes

TransportTemplate const * _transportInfo
 
KeyFrameVec::const_iterator _currentFrame
 
KeyFrameVec::const_iterator _nextFrame
 
TimeTrackerSmall _positionChangeTimer
 
bool _isMoving
 
bool _pendingStop
 
bool _triggeredArrivalEvent
 These are needed to properly control events triggering only once for each frame.
 
bool _triggeredDepartureEvent
 
PassengerSet _staticPassengers
 
std::mutex Lock
 
bool _passengersLoaded
 
bool _delayedTeleport
 
bool _requiresFirstDepartureSync
 
std::chrono::system_clock::time_point _firstDepartureTime
 

Friends

MotionTransportTransportMgr::CreateTransport (uint32, ObjectGuid::LowType, Map *)
 

Additional Inherited Members

- Public Types inherited from Transport
typedef std::set< WorldObject * > PassengerSet
 
- Public Types inherited from UpdatableMapObject
enum  UpdateState : uint8 {
  NotUpdating ,
  PendingAdd ,
  Updating
}
 
- Static Public Member Functions inherited from GameObject
static void SetGoArtKit (uint8 artkit, GameObject *go, ObjectGuid::LowType lowguid=0)
 
- Static Public Member Functions inherited from WorldObject
static float GetLeewayBonusRangeForTargets (Player const *player, Unit const *target)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 
- Public Attributes inherited from GameObject
Loot loot
 
uint32 m_groupLootTimer
 
uint32 lootingGroupLowGUID
 
GameObjectModelm_model
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ALEEventProcessor * ALEEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 
- Static Public Attributes inherited from GameObject
static std::unordered_map< int, goEventFlaggameObjectToEventFlag = { }
 
- Protected Types inherited from GameObject
typedef std::map< uint32, ObjectGuidChairSlotAndUser
 
- Protected Member Functions inherited from GameObject
bool AIM_Initialize ()
 
GameObjectModelCreateModel ()
 
void UpdateModel ()
 
- Protected Member Functions inherited from WorldObject
 WorldObject ()
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
void _Create (ObjectGuid guid)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 
- Protected Member Functions inherited from MovableMapObject
 MovableMapObject ()=default
 
Cell const & GetCurrentCell () const
 
- Protected Member Functions inherited from UpdatableMapObject
 UpdatableMapObject ()
 
- Protected Member Functions inherited from TransportBase
 TransportBase ()=default
 
virtual ~TransportBase ()=default
 
- Static Protected Member Functions inherited from TransportBase
static void CalculatePassengerPosition (float &x, float &y, float &z, float *o, float transX, float transY, float transZ, float transO)
 
static void CalculatePassengerOffset (float &x, float &y, float &z, float *o, float transX, float transY, float transZ, float transO)
 
- Protected Attributes inherited from Transport
PassengerSet _passengers
 
- Protected Attributes inherited from GameObject
bool _respawnCompatibilityMode {true}
 
uint32 m_spellId
 
time_t m_respawnTime
 
uint32 m_respawnDelayTime
 
uint32 m_despawnDelay
 
Seconds m_despawnRespawnTime
 
Seconds m_restockTime
 
LootState m_lootState
 
bool m_spawnedByDefault
 
uint32 m_cooldownTime
 
std::unordered_map< ObjectGuid, int32m_SkillupList
 
ObjectGuid m_ritualOwnerGUID
 
GuidSet m_unique_users
 
uint32 m_usetimes
 
ChairSlotAndUser ChairListSlots
 
ObjectGuid::LowType m_spawnId
 For new or temporary gameobjects is 0 for saved it is lowguid.
 
GameObjectTemplate const * m_goInfo
 
GameObjectData const * m_goData
 
GameObjectValue m_goValue
 
bool m_allowModifyDestructibleBuilding
 
int64 m_packedRotation
 
G3D::Quat WorldRotation
 
Position m_stationaryPosition
 
ObjectGuid m_lootRecipient
 
ObjectGuid::LowType m_lootRecipientGroup
 
uint16 m_LootMode
 
uint32 m_lootGenerationTime
 
ObjectGuid m_linkedTrap
 
ObjectGuid _lootStateUnitGUID
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
VisibilityDistanceType _visibilityDistanceOverrideType
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Detailed Description

Constructor & Destructor Documentation

◆ MotionTransport()

MotionTransport::MotionTransport ( )
private
55 _requiresFirstDepartureSync(false), _firstDepartureTime(transportStartDate)
56{
58}
@ UPDATEFLAG_ROTATION
Definition UpdateData.h:48
@ UPDATEFLAG_LOWGUID
Definition UpdateData.h:43
@ UPDATEFLAG_TRANSPORT
Definition UpdateData.h:40
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:45
bool _triggeredArrivalEvent
These are needed to properly control events triggering only once for each frame.
Definition Transport.h:107
bool _delayedTeleport
Definition Transport.h:113
std::chrono::system_clock::time_point _firstDepartureTime
Definition Transport.h:116
bool _isMoving
Definition Transport.h:103
bool _pendingStop
Definition Transport.h:104
TransportTemplate const * _transportInfo
Definition Transport.h:99
bool _passengersLoaded
Definition Transport.h:112
bool _triggeredDepartureEvent
Definition Transport.h:108
bool _requiresFirstDepartureSync
Definition Transport.h:115
uint16 m_updateFlag
Definition Object.h:256
Transport()
Definition Transport.h:32

References Object::m_updateFlag, UPDATEFLAG_LOWGUID, UPDATEFLAG_ROTATION, UPDATEFLAG_STATIONARY_POSITION, and UPDATEFLAG_TRANSPORT.

◆ ~MotionTransport()

MotionTransport::~MotionTransport ( )
override
61{
63
64 ASSERT(_passengers.empty());
66}
#define ASSERT
Definition Errors.h:68
static void Remove(T *o)
Definition ObjectAccessor.cpp:45
void UnloadStaticPassengers()
Definition Transport.cpp:537
PassengerSet _passengers
Definition Transport.h:47

References Transport::_passengers, ASSERT, HashMapHolder< T >::Remove(), and UnloadStaticPassengers().

Member Function Documentation

◆ AddPassenger()

void MotionTransport::AddPassenger ( WorldObject passenger,
bool  withAll = false 
)
overridevirtual

Implements Transport.

350{
351 std::lock_guard<std::mutex> guard(Lock);
352 if (_passengers.insert(passenger).second)
353 {
354 if (Player* plr = passenger->ToPlayer())
355 sScriptMgr->OnAddPassenger(ToTransport(), plr);
356
357 if (withAll)
358 {
359 if (Transport* t = passenger->GetTransport()) // SHOULD NEVER HAPPEN
360 t->RemovePassenger(passenger, false);
361
362 float x, y, z, o;
363 passenger->GetPosition(x, y, z, o);
364 CalculatePassengerOffset(x, y, z, &o);
365
366 passenger->SetTransport(this);
368 passenger->m_movementInfo.transport.guid = GetGUID();
369 passenger->m_movementInfo.transport.pos.Relocate(x, y, z, o);
370 if (passenger->ToUnit())
371 {
373 }
374 }
375 }
376}
#define sScriptMgr
Definition ScriptMgr.h:743
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:381
@ UNIT_STATE_IGNORE_PATHFINDING
Definition UnitDefines.h:200
Transport * ToTransport()
Definition GameObject.h:322
std::mutex Lock
Definition Transport.h:111
Player * ToPlayer()
Definition Object.h:202
ObjectGuid GetGUID() const
Definition Object.h:115
Unit * ToUnit()
Definition Object.h:210
Definition Player.h:1086
Definition Transport.h:30
void CalculatePassengerOffset(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied global coordinates into local offsets.
Definition Transport.h:34
void AddUnitState(uint32 f)
Definition Unit.h:736
void SetTransport(Transport *t)
Definition Object.h:702
Transport * GetTransport() const
Definition Object.h:694
MovementInfo m_movementInfo
Definition Object.h:704
ObjectGuid guid
Definition Object.h:309
Position pos
Definition Object.h:310
uint32 flags
Definition Object.h:292
struct MovementInfo::TransportInfo transport
void GetPosition(float &x, float &y) const
Definition Position.h:126
void Relocate(float x, float y)
Definition Position.h:77

References Transport::_passengers, Unit::AddUnitState(), Transport::CalculatePassengerOffset(), MovementInfo::flags, Object::GetGUID(), Position::GetPosition(), WorldObject::GetTransport(), MovementInfo::TransportInfo::guid, Lock, WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::TransportInfo::pos, Position::Relocate(), WorldObject::SetTransport(), sScriptMgr, Object::ToPlayer(), GameObject::ToTransport(), Object::ToUnit(), MovementInfo::transport, and UNIT_STATE_IGNORE_PATHFINDING.

Referenced by Battleground::AddCreature(), DelayedTeleportTransport(), go_commandscript::DoTeleportToTransport(), and PassengerController::SummonCreatures().

◆ BuildUpdate()

void MotionTransport::BuildUpdate ( UpdateDataMapType data_map)
overridevirtual

Reimplemented from Object.

205{
206 Map::PlayerList const& players = GetMap()->GetPlayers();
207 if (players.IsEmpty())
208 return;
209
210 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
211 BuildFieldsUpdate(itr->GetSource(), data_map);
212
213 ClearUpdateMask(true);
214}
Definition LinkedList.h:139
bool IsEmpty() const
Definition LinkedList.h:97
Definition MapRefMgr.h:26
iterator begin()
Definition MapRefMgr.h:36
iterator end()
Definition MapRefMgr.h:37
PlayerList const & GetPlayers() const
Definition Map.h:335
void BuildFieldsUpdate(Player *, UpdateDataMapType &)
Definition Object.cpp:538
void ClearUpdateMask(bool remove)
Definition Object.cpp:526
Map * GetMap() const
Definition Object.h:631

References MapRefMgr::begin(), Object::BuildFieldsUpdate(), Object::ClearUpdateMask(), MapRefMgr::end(), WorldObject::GetMap(), Map::GetPlayers(), and LinkedListHead::IsEmpty().

◆ CalculateSegmentPos()

float MotionTransport::CalculateSegmentPos ( float  perc)
private
582{
583 KeyFrame const& frame = *_currentFrame;
584 const float speed = float(m_goInfo->moTransport.moveSpeed);
585 const float accel = float(m_goInfo->moTransport.accelRate);
586 float timeSinceStop = frame.TimeFrom + (now - (1.0f / IN_MILLISECONDS) * frame.DepartureTime);
587 float timeUntilStop = frame.TimeTo - (now - (1.0f / IN_MILLISECONDS) * frame.DepartureTime);
588 float segmentPos, dist;
589 float accelTime = _transportInfo->accelTime;
590 float accelDist = _transportInfo->accelDist;
591 // calculate from nearest stop, less confusing calculation...
592 if (timeSinceStop < timeUntilStop)
593 {
594 if (timeSinceStop < accelTime)
595 dist = 0.5f * accel * timeSinceStop * timeSinceStop;
596 else
597 dist = accelDist + (timeSinceStop - accelTime) * speed;
598 segmentPos = dist - frame.DistSinceStop;
599 }
600 else
601 {
602 if (timeUntilStop < _transportInfo->accelTime)
603 dist = 0.5f * accel * timeUntilStop * timeUntilStop;
604 else
605 dist = accelDist + (timeUntilStop - accelTime) * speed;
606 segmentPos = frame.DistUntilStop - dist;
607 }
608
609 return segmentPos / frame.NextDistFromPrev;
610}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
GameObjectTemplate const * m_goInfo
Definition GameObject.h:394
KeyFrameVec::const_iterator _currentFrame
Definition Transport.h:100
uint32 moveSpeed
Definition GameObjectData.h:218
struct GameObjectTemplate::@236::@251 moTransport
uint32 accelRate
Definition GameObjectData.h:219
Definition TransportMgr.h:42
float DistUntilStop
Definition TransportMgr.h:53
float NextDistFromPrev
Definition TransportMgr.h:63
float DistSinceStop
Definition TransportMgr.h:52
uint32 DepartureTime
Definition TransportMgr.h:59
float TimeFrom
Definition TransportMgr.h:55
float TimeTo
Definition TransportMgr.h:56
float accelDist
Definition TransportMgr.h:80
float accelTime
Definition TransportMgr.h:79

References _currentFrame, _transportInfo, TransportTemplate::accelDist, GameObjectTemplate::accelRate, TransportTemplate::accelTime, KeyFrame::DepartureTime, KeyFrame::DistSinceStop, KeyFrame::DistUntilStop, IN_MILLISECONDS, GameObject::m_goInfo, GameObjectTemplate::moTransport, GameObjectTemplate::moveSpeed, KeyFrame::NextDistFromPrev, KeyFrame::TimeFrom, and KeyFrame::TimeTo.

Referenced by Update().

◆ CleanupsBeforeDelete()

void MotionTransport::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from GameObject.

190{
192 while (!_passengers.empty())
193 {
194 WorldObject* obj = *_passengers.begin();
195 RemovePassenger(obj);
196 obj->SetTransport(nullptr);
199 }
200
202}
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition GameObject.cpp:120
void RemovePassenger(WorldObject *passenger, bool withAll=false) override
Definition Transport.cpp:378
Definition Object.h:476
void Reset()
Definition Object.h:300
void RemoveMovementFlag(uint32 flag)
Definition Object.h:346

References Transport::_passengers, GameObject::CleanupsBeforeDelete(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), MovementInfo::transport, and UnloadStaticPassengers().

◆ CreateGOPassenger()

GameObject * MotionTransport::CreateGOPassenger ( ObjectGuid::LowType  guid,
GameObjectData const *  data 
)
455{
456 Map* map = GetMap();
457 if (map->GetGORespawnTime(guid))
458 return nullptr;
459
460 GameObject* go = new GameObject();
461 ASSERT(!sObjectMgr->IsGameObjectStaticTransport(data->id));
462
463 if (!go->LoadGameObjectFromDB(guid, map, false))
464 {
465 delete go;
466 return nullptr;
467 }
468
469 float x = data->posX;
470 float y = data->posY;
471 float z = data->posZ;
472 float o = data->orientation;
473
474 go->SetTransport(this);
476 go->m_movementInfo.transport.pos.Relocate(x, y, z, o);
477 CalculatePassengerPosition(x, y, z, &o);
478 go->Relocate(x, y, z, o);
479
480 if (!go->IsPositionValid())
481 {
482 LOG_ERROR("entities.transport", "GameObject ({}) not created. Suggested coordinates aren't valid (X: {} Y: {})",
483 go->GetGUID().ToString(), go->GetPositionX(), go->GetPositionY());
484 delete go;
485 return nullptr;
486 }
487
488 if (!map->AddToMap(go))
489 {
490 delete go;
491 return nullptr;
492 }
493
494 _staticPassengers.insert(go);
495 return go;
496}
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sObjectMgr
Definition ObjectMgr.h:1730
Definition GameObject.h:120
GameObject()
Definition GameObject.cpp:57
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1102
Definition Map.h:168
time_t GetGORespawnTime(ObjectGuid::LowType dbGuid) const
Definition Map.h:425
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:307
PassengerSet _staticPassengers
Definition Transport.h:110
std::string ToString() const
Definition ObjectGuid.cpp:48
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied transport offsets into global coordinates.
Definition Transport.h:33
bool IsPositionValid() const
Definition Position.cpp:183
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122

References _staticPassengers, Map::AddToMap(), ASSERT, Transport::CalculatePassengerPosition(), GameObject::GameObject(), Map::GetGORespawnTime(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetMap(), Position::GetPositionX(), Position::GetPositionY(), MovementInfo::TransportInfo::guid, GameObjectData::id, Position::IsPositionValid(), GameObject::LoadGameObjectFromDB(), LOG_ERROR, WorldObject::m_movementInfo, SpawnData::orientation, MovementInfo::TransportInfo::pos, SpawnData::posX, SpawnData::posY, SpawnData::posZ, Position::Relocate(), WorldObject::SetTransport(), sObjectMgr, ObjectGuid::ToString(), and MovementInfo::transport.

Referenced by LoadStaticPassengers().

◆ CreateMoTrans()

bool MotionTransport::CreateMoTrans ( ObjectGuid::LowType  guidlow,
uint32  entry,
uint32  mapid,
float  x,
float  y,
float  z,
float  ang,
uint32  animprogress 
)
69{
70 Relocate(x, y, z, ang);
71
72 if (!IsPositionValid())
73 {
74 LOG_ERROR("entities.transport", "Transport (GUID: {}) not created. Suggested coordinates isn't valid (X: {} Y: {})",
75 guidlow, x, y);
76 return false;
77 }
78
80
81 GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
82
83 if (!goinfo)
84 {
85 LOG_ERROR("entities.transport", "Transport not created: entry in `gameobject_template` not found, guidlow: {} map: {} (X: {} Y: {} Z: {}) ang: {}", guidlow, mapid, x, y, z, ang);
86 return false;
87 }
88
89 m_goInfo = goinfo;
90
91 TransportTemplate const* tInfo = sTransportMgr->GetTransportTemplate(entry);
92 if (!tInfo)
93 {
94 LOG_ERROR("entities.transport", "Transport {} (name: {}) will not be created, missing `transport_template` entry.", entry, goinfo->name);
95 return false;
96 }
97
98 _transportInfo = tInfo;
99
100 // Enable transport sync only in cluster mode and for transport with several maps.
101 if (sConfigMgr->GetOption<bool>("Cluster.Enabled", false) && tInfo->mapsUsed.size() > 1)
102 {
104 this->SetPhaseMask(2, true);
105 }
106
107 // initialize waypoints
108 _nextFrame = tInfo->keyFrames.begin();
112
113 if (GameObjectTemplateAddon const* addon = GetTemplateAddon())
114 {
115 SetUInt32Value(GAMEOBJECT_FACTION, addon->faction);
117 }
118
119 SetObjectScale(goinfo->size);
121 SetPeriod(tInfo->pathTime);
122 SetEntry(goinfo->entry);
123 SetDisplayId(goinfo->displayId);
126 SetGoAnimProgress(animprogress);
127 SetName(goinfo->name);
128
129 // pussywizard: no WorldRotation for MotionTransports
130 SetWorldRotation(G3D::Quat());
131 // pussywizard: no PathRotation for MotionTransports
132 SetTransportPathRotation(0.0f, 0.0f, 0.0f, 1.0f);
133
135
136 return true;
137}
@ GO_STATE_READY
Definition GameObjectData.h:709
@ GO_STATE_ACTIVE
Definition GameObjectData.h:708
@ GAMEOBJECT_TYPE_MO_TRANSPORT
Definition SharedDefines.h:1579
GameObjectFlags
Definition SharedDefines.h:1606
#define sTransportMgr
Definition TransportMgr.h:165
@ GAMEOBJECT_FACTION
Definition UpdateFields.h:402
void SetGoState(GOState state)
Definition GameObject.cpp:2503
void SetTransportPathRotation(float qx, float qy, float qz, float qw)
Definition GameObject.cpp:2273
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition GameObject.cpp:2622
void SetGoAnimProgress(uint8 animprogress)
Definition GameObject.h:210
GameObjectModel * CreateModel()
Definition GameObject.cpp:2983
void SetGoType(GameobjectTypes type)
Definition GameObject.h:204
GameObjectModel * m_model
Definition GameObject.h:313
GameObjectTemplateAddon const * GetTemplateAddon() const
Definition GameObject.cpp:906
void SetDisplayId(uint32 displayid)
Definition GameObject.cpp:2616
void ReplaceAllGameObjectFlags(GameObjectFlags flags)
Definition GameObject.h:220
void SetWorldRotation(G3D::Quat const &rot)
Definition GameObject.cpp:2261
void SetPeriod(uint32 period)
Definition Transport.h:82
KeyFrameVec::const_iterator _nextFrame
Definition Transport.h:101
void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
Definition Object.cpp:123
void SetEntry(uint32 entry)
Definition Object.h:118
virtual void SetObjectScale(float scale)
Definition Object.h:121
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:643
void SetPathProgress(uint32 val)
Definition Transport.h:44
void SetName(std::string const &newname)
Definition Object.h:530
#define sConfigMgr
Definition Config.h:93
Definition GameObjectData.h:667
Definition GameObjectData.h:32
uint32 entry
Definition GameObjectData.h:33
uint32 canBeStopped
Definition GameObjectData.h:225
std::string name
Definition GameObjectData.h:36
float size
Definition GameObjectData.h:40
uint32 displayId
Definition GameObjectData.h:35
Definition TransportMgr.h:71
std::set< uint32 > mapsUsed
Definition TransportMgr.h:75
uint32 pathTime
Definition TransportMgr.h:77
KeyFrameVec keyFrames
Definition TransportMgr.h:78

References Object::_Create(), _currentFrame, _nextFrame, _requiresFirstDepartureSync, _transportInfo, _triggeredArrivalEvent, _triggeredDepartureEvent, GameObjectTemplate::canBeStopped, GameObject::CreateModel(), GameObjectTemplate::displayId, GameObjectTemplate::entry, GAMEOBJECT_FACTION, GAMEOBJECT_TYPE_MO_TRANSPORT, GameObject::GetTemplateAddon(), GO_STATE_ACTIVE, GO_STATE_READY, Position::IsPositionValid(), TransportTemplate::keyFrames, LOG_ERROR, GameObject::m_goInfo, GameObject::m_model, TransportTemplate::mapsUsed, Mo_Transport, GameObjectTemplate::moTransport, GameObjectTemplate::name, TransportTemplate::pathTime, Position::Relocate(), GameObject::ReplaceAllGameObjectFlags(), sConfigMgr, GameObject::SetDisplayId(), Object::SetEntry(), GameObject::SetGoAnimProgress(), GameObject::SetGoState(), GameObject::SetGoType(), WorldObject::SetName(), Object::SetObjectScale(), Transport::SetPathProgress(), SetPeriod(), GameObject::SetPhaseMask(), GameObject::SetTransportPathRotation(), Object::SetUInt32Value(), GameObject::SetWorldRotation(), GameObjectTemplate::size, sObjectMgr, and sTransportMgr.

Referenced by TransportMgr::CreateTransport().

◆ CreateNPCPassenger()

Creature * MotionTransport::CreateNPCPassenger ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)

@HACK - transport models are not added to map's dynamic LoS calculations because the current GameObjectModel cannot be moved without recreating

404{
405 Map* map = GetMap();
406 if (map->GetCreatureRespawnTime(guid))
407 return nullptr;
408
409 Creature* creature = new Creature();
410
411 if (!creature->LoadCreatureFromDB(guid, map, false))
412 {
413 delete creature;
414 return nullptr;
415 }
416
417 float x = data->posX;
418 float y = data->posY;
419 float z = data->posZ;
420 float o = data->orientation;
421
422 creature->SetTransport(this);
424 creature->m_movementInfo.transport.guid = GetGUID();
425 creature->m_movementInfo.transport.pos.Relocate(x, y, z, o);
426 CalculatePassengerPosition(x, y, z, &o);
427 creature->Relocate(x, y, z, o);
428 creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation());
430
434
435 if (!creature->IsPositionValid())
436 {
437 LOG_ERROR("entities.transport", "Creature ({}) not created. Suggested coordinates aren't valid (X: {} Y: {})",
438 creature->GetGUID().ToString(), creature->GetPositionX(), creature->GetPositionY());
439 delete creature;
440 return nullptr;
441 }
442
443 if (!map->AddToMap(creature))
444 {
445 delete creature;
446 return nullptr;
447 }
448
449 _staticPassengers.insert(creature);
450 sScriptMgr->OnAddCreaturePassenger(this, creature);
451 return creature;
452}
Definition Creature.h:47
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:347
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1677
void SetTransportHomePosition(float x, float y, float z, float o)
Definition Creature.h:352
time_t GetCreatureRespawnTime(ObjectGuid::LowType dbGuid) const
Definition Map.h:416
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:773
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124

References _staticPassengers, Map::AddToMap(), Unit::AddUnitMovementFlag(), Unit::AddUnitState(), Transport::CalculatePassengerPosition(), Map::GetCreatureRespawnTime(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), MovementInfo::TransportInfo::guid, Position::IsPositionValid(), Creature::LoadCreatureFromDB(), LOG_ERROR, WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, SpawnData::orientation, MovementInfo::TransportInfo::pos, SpawnData::posX, SpawnData::posY, SpawnData::posZ, Position::Relocate(), Creature::SetHomePosition(), WorldObject::SetTransport(), Creature::SetTransportHomePosition(), sScriptMgr, ObjectGuid::ToString(), MovementInfo::transport, and UNIT_STATE_IGNORE_PATHFINDING.

Referenced by LoadStaticPassengers().

◆ DelayedTeleportTransport()

void MotionTransport::DelayedTeleportTransport ( )
private
643{
644 if (!_delayedTeleport)
645 return;
646
647 _delayedTeleport = false;
648
649 uint32 newMapId = _nextFrame->Node->mapid;
650 float x = _nextFrame->Node->x,
651 y = _nextFrame->Node->y,
652 z = _nextFrame->Node->z,
653 o = _nextFrame->InitialOrientation;
654
655 PassengerSet _passengersCopy = _passengers;
656 for (PassengerSet::iterator itr = _passengersCopy.begin(); itr != _passengersCopy.end(); )
657 {
658 WorldObject* obj = (*itr++);
659
660 if (_passengers.find(obj) == _passengers.end())
661 continue;
662
663 switch (obj->GetTypeId())
664 {
665 case TYPEID_UNIT:
666 _passengers.erase(obj);
667 if (!obj->ToCreature()->IsPet())
669 break;
671 _passengers.erase(obj);
672 obj->ToGameObject()->Delete();
673 break;
675 _passengers.erase(obj);
676 if (Unit* caster = obj->ToDynObject()->GetCaster())
677 if (Spell* s = caster->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
678 if (obj->ToDynObject()->GetSpellId() == s->GetSpellInfo()->Id)
679 {
680 s->SendChannelUpdate(0);
681 s->SendInterrupted(0);
682 caster->RemoveOwnedAura(s->GetSpellInfo()->Id, caster->GetGUID());
683 }
685 break;
686 case TYPEID_PLAYER:
687 {
688 float destX, destY, destZ, destO;
689 obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
690 TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o);
691
692 Player* player = obj->ToPlayer();
693 // Vehicle passengers are dropped in the middle of nowhere, so lets try to eject them, add to the transport and teleport
694 // this needs to be revisited to properly restore vehicles with passengers after transport teleportation
695 if (player->IsVehicle())
696 if (Vehicle* vehicleKit = player->GetVehicleKit())
697 for (SeatMap::iterator itr = vehicleKit->Seats.begin(); itr != vehicleKit->Seats.end(); ++itr)
698 if (Player* passenger = ObjectAccessor::GetPlayer(*player, itr->second.Passenger.Guid))
699 {
700 passenger->ExitVehicle();
701 AddPassenger(passenger, true);
702 if (!passenger->TeleportTo(newMapId, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT))
703 _passengers.erase(passenger);
704 }
705
706 if (!player->TeleportTo(newMapId, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT))
707 _passengers.erase(obj);
708 }
709 break;
710 default:
711 break;
712 }
713 }
714
715 Map* newMap = sMapMgr->CreateBaseMap(newMapId);
716 GetMap()->RemoveFromMap<Transport>(this, false);
717 newMap->LoadGrid(x, y); // xinef: load before adding passengers to new map
718 SetMap(newMap);
719
720 Relocate(x, y, z, o);
721 GetMap()->AddToMap<Transport>(this);
722
724}
std::uint32_t uint32
Definition Define.h:107
#define sMapMgr
Definition MapMgr.h:220
@ TYPEID_DYNAMICOBJECT
Definition ObjectGuid.h:41
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:40
@ TYPEID_UNIT
Definition ObjectGuid.h:38
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:816
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:558
void DespawnOrUnsummon(Milliseconds msTimeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
Definition Creature.cpp:2199
Unit * GetCaster() const
Definition DynamicObject.h:55
uint32 GetSpellId() const
Definition DynamicObject.h:58
void Delete()
Definition GameObject.cpp:976
void LoadGrid(float x, float y)
Definition Map.cpp:216
void RemoveFromMap(T *, bool)
Definition Map.cpp:745
void AddPassenger(WorldObject *passenger, bool withAll=false) override
Definition Transport.cpp:349
void LoadStaticPassengers()
Definition Transport.cpp:498
DynamicObject * ToDynObject()
Definition Object.h:222
TypeID GetTypeId() const
Definition Object.h:129
GameObject * ToGameObject()
Definition Object.h:214
Creature * ToCreature()
Definition Object.h:206
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1399
Definition Spell.h:298
virtual void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const =0
This method transforms supplied transport offsets into global coordinates.
std::set< WorldObject * > PassengerSet
Definition Transport.h:36
Definition Unit.h:665
bool IsVehicle() const
Definition Unit.h:801
bool IsPet() const
Definition Unit.h:798
Vehicle * GetVehicleKit() const
Definition Unit.h:1925
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:15705
Definition Vehicle.h:28
virtual void SetMap(Map *map)
Definition Object.cpp:2191
void AddObjectToRemoveList()
Definition Object.cpp:2227
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:244

References _delayedTeleport, _nextFrame, Transport::_passengers, WorldObject::AddObjectToRemoveList(), AddPassenger(), Map::AddToMap(), TransportBase::CalculatePassengerPosition(), CURRENT_CHANNELED_SPELL, GameObject::Delete(), Creature::DespawnOrUnsummon(), Unit::ExitVehicle(), DynamicObject::GetCaster(), WorldObject::GetMap(), ObjectAccessor::GetPlayer(), Position::GetPosition(), DynamicObject::GetSpellId(), Object::GetTypeId(), Unit::GetVehicleKit(), Unit::IsPet(), Unit::IsVehicle(), Map::LoadGrid(), LoadStaticPassengers(), WorldObject::m_movementInfo, MovementInfo::TransportInfo::pos, Position::Relocate(), Map::RemoveFromMap(), WorldObject::SetMap(), sMapMgr, TELE_TO_NOT_LEAVE_TRANSPORT, Player::TeleportTo(), Object::ToCreature(), Object::ToDynObject(), Object::ToGameObject(), Object::ToPlayer(), MovementInfo::transport, TYPEID_DYNAMICOBJECT, TYPEID_GAMEOBJECT, TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by DelayedUpdate().

◆ DelayedUpdate()

void MotionTransport::DelayedUpdate ( uint32  diff)
overridevirtual

Reimplemented from Transport.

326{
327 if (GetKeyFrames().size() <= 1)
328 return;
329
331}
KeyFrameVec const & GetKeyFrames() const
Definition Transport.h:77
void DelayedTeleportTransport()
Definition Transport.cpp:642

References DelayedTeleportTransport(), and GetKeyFrames().

◆ DoEventIfAny()

void MotionTransport::DoEventIfAny ( KeyFrame const &  node,
bool  departure 
)
private
778{
779 if (uint32 eventid = departure ? node.Node->departureEventID : node.Node->arrivalEventID)
780 {
781 //LOG_DEBUG("maps.script", "Taxi {} event {} of node {} of {} path", departure ? "departure" : "arrival", eventid, node.Node->index, GetName());
782 GetMap()->ScriptsStart(sEventScripts, eventid, this, this);
783 EventInform(eventid);
784 }
785}
ScriptMapMap sEventScripts
Definition ObjectMgr.cpp:61
void EventInform(uint32 eventId)
Definition GameObject.cpp:2208
void ScriptsStart(std::map< uint32, std::multimap< uint32, ScriptInfo > > const &scripts, uint32 id, Object *source, Object *target)
Put scripts in the execution queue.
Definition MapScripts.cpp:31

References TaxiPathNodeEntry::arrivalEventID, TaxiPathNodeEntry::departureEventID, GameObject::EventInform(), WorldObject::GetMap(), KeyFrame::Node, Map::ScriptsStart(), and sEventScripts.

Referenced by Update().

◆ EnableMovement()

◆ GetDebugInfo()

std::string MotionTransport::GetDebugInfo ( ) const
overridevirtual

Reimplemented from GameObject.

1168{
1169 std::stringstream sstr;
1170 sstr << GameObject::GetDebugInfo();
1171 return sstr.str();
1172}
std::string GetDebugInfo() const override
Definition GameObject.cpp:3114

References GameObject::GetDebugInfo().

◆ GetKeyFrames()

KeyFrameVec const & MotionTransport::GetKeyFrames ( ) const
inline

◆ GetPeriod()

uint32 MotionTransport::GetPeriod ( ) const
inline
@ GAMEOBJECT_LEVEL
Definition UpdateFields.h:403
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:298

References GAMEOBJECT_LEVEL, and Object::GetUInt32Value().

Referenced by GetWestguardZeppelinState(), and Update().

◆ GetStaticPassengers()

PassengerSet const & MotionTransport::GetStaticPassengers ( ) const
inline
71{ return _staticPassengers; }

References _staticPassengers.

◆ GetTransportTemplate()

TransportTemplate const * MotionTransport::GetTransportTemplate ( ) const
inline
79{ return _transportInfo; }

References _transportInfo.

◆ HandleFirstDepartureSync()

uint32 MotionTransport::HandleFirstDepartureSync ( uint32  diff)
private
142{
144 return diff;
145
146 if (_firstDepartureTime == transportStartDate)
147 {
148 _firstDepartureTime = calculateNextDepartureTime(_transportInfo->pathTime);
149 return diff;
150 }
151
152 // Making system call for current time to be more accurate.
153 // Shouldn't be an issue since it runs only before the very first departure.
154 int32 millLeftToDeparture = std::chrono::duration_cast<std::chrono::milliseconds>(_firstDepartureTime - std::chrono::system_clock::now()).count();
155 if (millLeftToDeparture > 0)
156 return diff;
157
158 // At this point we are ready for first departure.
160 this->SetPhaseMask(1, true);
161
162 // Players don't know about transport because it was in a different phase.
163 // We need to notify players that object exists before departure.
164 Map::PlayerList const& players = this->GetMap()->GetPlayers();
165 if (!players.IsEmpty())
166 {
167 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
168 {
169 if (Player* player = i->GetSource())
170 {
171 // Same phase filter as Map::SendInitTransports: players outside
172 // the transport's phase must not get a create-block for it.
173 if (!player->InSamePhase(this))
174 continue;
175
176 UpdateData transData;
177 this->BuildCreateUpdateBlockForPlayer(&transData, player);
178
179 WorldPacket packet;
180 transData.BuildPacket(packet);
181 player->SendDirectMessage(&packet);
182 }
183 }
184 }
185
186 return millLeftToDeparture * -1;
187}
std::int32_t int32
Definition Define.h:103
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:182
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48
Definition WorldPacket.h:26

References _firstDepartureTime, _requiresFirstDepartureSync, _transportInfo, MapRefMgr::begin(), Object::BuildCreateUpdateBlockForPlayer(), UpdateData::BuildPacket(), MapRefMgr::end(), WorldObject::GetMap(), Map::GetPlayers(), LinkedListHead::IsEmpty(), TransportTemplate::pathTime, and GameObject::SetPhaseMask().

Referenced by Update().

◆ IsMoving()

bool MotionTransport::IsMoving ( ) const
inlineprivate

Helpers to know if stop frame was reached.

96{ return _isMoving; }

References _isMoving.

Referenced by Update().

◆ LoadStaticPassengers()

void MotionTransport::LoadStaticPassengers ( )
499{
500 if (PassengersLoaded())
501 return;
503 if (uint32 mapId = GetGOInfo()->moTransport.mapID)
504 {
505 CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetSpawnMode());
506 CellGuidSet::const_iterator guidEnd;
507 for (CellObjectGuidsMap::const_iterator cellItr = cells.begin(); cellItr != cells.end(); ++cellItr)
508 {
509 // Creatures on transport
510 guidEnd = cellItr->second.creatures.end();
511 for (CellGuidSet::const_iterator guidItr = cellItr->second.creatures.begin(); guidItr != guidEnd; ++guidItr)
512 {
513 CreatureData const* data = sObjectMgr->GetCreatureData(*guidItr);
514
515 // Pooled spawns are in the grid data but managed by the pool system, never as static passengers
516 if (data && data->poolId)
517 continue;
518
519 CreateNPCPassenger(*guidItr, data);
520 }
521
522 // GameObjects on transport
523 guidEnd = cellItr->second.gameobjects.end();
524 for (CellGuidSet::const_iterator guidItr = cellItr->second.gameobjects.begin(); guidItr != guidEnd; ++guidItr)
525 {
526 GameObjectData const* data = sObjectMgr->GetGameObjectData(*guidItr);
527
528 if (data && data->poolId)
529 continue;
530
531 CreateGOPassenger(*guidItr, data);
532 }
533 }
534 }
535}
std::unordered_map< uint32, CellObjectGuids > CellObjectGuidsMap
Definition ObjectMgr.h:486
bool PassengersLoaded() const
Definition Transport.h:75
Creature * CreateNPCPassenger(ObjectGuid::LowType guid, CreatureData const *data)
Definition Transport.cpp:403
GameObject * CreateGOPassenger(ObjectGuid::LowType guid, GameObjectData const *data)
Definition Transport.cpp:454
void SetPassengersLoaded(bool loaded)
Definition Transport.h:74
Definition CreatureData.h:370
Definition GameObjectData.h:715
uint32 mapID
Definition GameObjectData.h:223
uint32 poolId
Definition SpawnData.h:79

References CreateGOPassenger(), CreateNPCPassenger(), GameObject::GetGOInfo(), WorldObject::GetMap(), GameObjectTemplate::mapID, PassengersLoaded(), SpawnData::poolId, SetPassengersLoaded(), and sObjectMgr.

Referenced by DelayedTeleportTransport(), Update(), and UpdatePosition().

◆ MoveToNextWaypoint()

void MotionTransport::MoveToNextWaypoint ( )
private
570{
571 // Clear events flagging
574
575 // Set frames
577 if (_nextFrame == GetKeyFrames().end())
578 _nextFrame = GetKeyFrames().begin();
579}

References _currentFrame, _nextFrame, _triggeredArrivalEvent, _triggeredDepartureEvent, and GetKeyFrames().

Referenced by Update().

◆ PassengersLoaded()

bool MotionTransport::PassengersLoaded ( ) const
inline
75{ return _passengersLoaded; }

References _passengersLoaded.

Referenced by LoadStaticPassengers().

◆ RemovePassenger()

void MotionTransport::RemovePassenger ( WorldObject passenger,
bool  withAll = false 
)
overridevirtual

Implements Transport.

379{
380 std::lock_guard<std::mutex> guard(Lock);
381 if (_passengers.erase(passenger) || _staticPassengers.erase(passenger))
382 {
383 if (Player* plr = passenger->ToPlayer())
384 {
385 sScriptMgr->OnRemovePassenger(ToTransport(), plr);
386 plr->SetFallInformation(GameTime::GetGameTime().count(), plr->GetPositionZ());
387 }
388
389 if (withAll)
390 {
391 passenger->SetTransport(nullptr);
392 passenger->m_movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
393 passenger->m_movementInfo.transport.guid.Clear();
394 passenger->m_movementInfo.transport.pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
395 if (passenger->ToUnit())
396 {
398 }
399 }
400 }
401}
void Clear()
Definition ObjectGuid.h:141
void ClearUnitState(uint32 f)
Definition Unit.h:738
Seconds GetGameTime()
Definition GameTime.cpp:38

References Transport::_passengers, _staticPassengers, ObjectGuid::Clear(), Unit::ClearUnitState(), MovementInfo::flags, GameTime::GetGameTime(), MovementInfo::TransportInfo::guid, Lock, WorldObject::m_movementInfo, MovementInfo::TransportInfo::pos, Position::Relocate(), WorldObject::SetTransport(), sScriptMgr, Object::ToPlayer(), GameObject::ToTransport(), Object::ToUnit(), MovementInfo::transport, and UNIT_STATE_IGNORE_PATHFINDING.

Referenced by CleanupsBeforeDelete().

◆ SetMoving()

void MotionTransport::SetMoving ( bool  val)
inlineprivate
97{ _isMoving = val; }

References _isMoving.

Referenced by Update().

◆ SetPassengersLoaded()

void MotionTransport::SetPassengersLoaded ( bool  loaded)
inline

◆ SetPeriod()

void MotionTransport::SetPeriod ( uint32  period)
inline

◆ TeleportTransport()

bool MotionTransport::TeleportTransport ( uint32  newMapid,
float  x,
float  y,
float  z,
float  o 
)
private
613{
614 Map const* oldMap = GetMap();
615
616 if (oldMap->GetId() != newMapid)
617 {
618 _delayedTeleport = true;
620 return true;
621 }
622 else
623 {
624 // Teleport players, they need to know it
625 for (PassengerSet::iterator itr = _passengers.begin(); itr != _passengers.end(); ++itr)
626 {
627 if ((*itr)->IsPlayer())
628 {
629 float destX, destY, destZ, destO;
630 (*itr)->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
631 TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o);
632
633 (*itr)->ToUnit()->NearTeleportTo(destX, destY, destZ, destO);
634 }
635 }
636
637 UpdatePosition(x, y, z, o);
638 return false;
639 }
640}
uint32 GetId() const
Definition Map.h:234
void UpdatePosition(float x, float y, float z, float o)
Definition Transport.cpp:333

References _delayedTeleport, Transport::_passengers, TransportBase::CalculatePassengerPosition(), Map::GetId(), WorldObject::GetMap(), UnloadStaticPassengers(), and UpdatePosition().

Referenced by Update().

◆ UnloadNonStaticPassengers()

void MotionTransport::UnloadNonStaticPassengers ( )
548{
549 for (PassengerSet::iterator itr = _passengers.begin(); itr != _passengers.end(); )
550 {
551 if ((*itr)->IsPlayer())
552 {
553 ++itr;
554 continue;
555 }
556 PassengerSet::iterator itr2 = itr++;
557 (*itr2)->AddObjectToRemoveList();
558 }
559}

References Transport::_passengers.

Referenced by ResetEncounterEvent::Execute().

◆ UnloadStaticPassengers()

void MotionTransport::UnloadStaticPassengers ( )
538{
539 SetPassengersLoaded(false);
540 while (!_staticPassengers.empty())
541 {
542 WorldObject* obj = *_staticPassengers.begin();
543 obj->AddObjectToRemoveList(); // also removes from _staticPassengers
544 }
545}

References _staticPassengers, WorldObject::AddObjectToRemoveList(), and SetPassengersLoaded().

Referenced by CleanupsBeforeDelete(), TeleportTransport(), and ~MotionTransport().

◆ Update()

void MotionTransport::Update ( uint32  diff)
overridevirtual

Reimplemented from GameObject.

217{
219 {
220 diff = HandleFirstDepartureSync(diff);
222 return;
223 }
224
225 uint32 const positionUpdateDelay = 1;
226
227 if (AI())
228 AI()->UpdateAI(diff);
229 else if (!AIM_Initialize())
230 LOG_ERROR("entities.transport", "Could not initialize GameObjectAI for Transport");
231
232 if (GetKeyFrames().size() <= 1)
233 return;
234
235 if (IsMoving() || !_pendingStop)
237
238 uint32 timer = GetPathProgress() % GetPeriod();
239
240 // Set current waypoint
241 // Desired outcome: _currentFrame->DepartureTime < timer < _nextFrame->ArriveTime
242 // ... arrive | ... delay ... | departure
243 // event / event /
244 for (;;)
245 {
246 if (timer >= _currentFrame->ArriveTime)
247 {
249 {
252 }
253
254 if (timer < _currentFrame->DepartureTime)
255 {
256 SetMoving(false);
258 {
263 }
264 break; // its a stop frame and we are waiting
265 }
266 }
267
268 if (timer >= _currentFrame->DepartureTime && !_triggeredDepartureEvent)
269 {
270 DoEventIfAny(*_currentFrame, true); // departure event
272 }
273
274 // not waiting anymore
275 SetMoving(true);
276
277 // Enable movement
278 if (GetGOInfo()->moTransport.canBeStopped)
280
281 if (timer >= _currentFrame->DepartureTime && timer < _currentFrame->NextArriveTime)
282 break; // found current waypoint
283
285
286 sScriptMgr->OnRelocate(this, _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z);
287
288 //LOG_DEBUG("entities.transport", "Transport {} ({}) moved to node {} {} {} {} {}", GetEntry(), GetName(), _currentFrame->Node->index, _currentFrame->Node->mapid, _currentFrame->Node->x, _currentFrame->Node->y, _currentFrame->Node->z);
289
290 // Departure event
291 if (_currentFrame->IsTeleportFrame())
292 if (TeleportTransport(_nextFrame->Node->mapid, _nextFrame->Node->x, _nextFrame->Node->y, _nextFrame->Node->z, _nextFrame->InitialOrientation))
293 return; // Update more in new map thread
294 }
295
296 // Set position
299 {
300 _positionChangeTimer.Reset(positionUpdateDelay);
301 if (IsMoving())
302 {
303 float t = CalculateSegmentPos(float(timer) * 0.001f);
304 G3D::Vector3 pos, dir;
305 _currentFrame->Spline->evaluate_percent(_currentFrame->Index, t, pos);
306 _currentFrame->Spline->evaluate_derivative(_currentFrame->Index, t, dir);
307 UpdatePosition(pos.x, pos.y, pos.z, NormalizeOrientation(std::atan2(dir.y, dir.x) + M_PI));
308 }
309 else
310 {
311 /* There are four possible scenarios that trigger loading/unloading passengers:
312 1. transport moves from inactive to active grid
313 2. the grid that transport is currently in becomes active
314 3. transport moves from active to inactive grid
315 4. the grid that transport is currently in unloads
316 */
317 if (_staticPassengers.empty() && GetMap()->IsGridLoaded(GetPositionX(), GetPositionY())) // 2.
319 }
320 }
321
322 sScriptMgr->OnTransportUpdate(this, diff);
323}
virtual void UpdateAI(uint32)
Definition GameObjectAI.h:41
GOState GetGoState() const
Definition GameObject.h:205
GameObjectAI * AI() const
Definition GameObject.h:307
bool AIM_Initialize()
Definition GameObject.cpp:101
bool IsMoving() const
Helpers to know if stop frame was reached.
Definition Transport.h:96
void MoveToNextWaypoint()
Definition Transport.cpp:569
float CalculateSegmentPos(float perc)
Definition Transport.cpp:581
uint32 GetPeriod() const
Definition Transport.h:81
TimeTrackerSmall _positionChangeTimer
Definition Transport.h:102
void DoEventIfAny(KeyFrame const &node, bool departure)
Definition Transport.cpp:777
void SetMoving(bool val)
Definition Transport.h:97
uint32 HandleFirstDepartureSync(uint32 diff)
Definition Transport.cpp:141
bool TeleportTransport(uint32 newMapid, float x, float y, float z, float o)
Definition Transport.cpp:612
uint32 GetPathProgress() const
Definition Transport.h:43
static float NormalizeOrientation(float o)
Definition Position.h:238
void Update(int32 diff)
Definition Timer.h:239
void Reset(int32 interval)
Definition Timer.h:249
bool Passed() const
Definition Timer.h:244

References _currentFrame, _nextFrame, _pendingStop, _positionChangeTimer, _requiresFirstDepartureSync, _staticPassengers, _triggeredArrivalEvent, _triggeredDepartureEvent, GameObject::AI(), GameObject::AIM_Initialize(), CalculateSegmentPos(), GameObjectTemplate::canBeStopped, DoEventIfAny(), GameObject::GetGOInfo(), GameObject::GetGoState(), GetKeyFrames(), WorldObject::GetMap(), Transport::GetPathProgress(), GetPeriod(), Position::GetPositionX(), Position::GetPositionY(), GO_STATE_ACTIVE, GO_STATE_READY, HandleFirstDepartureSync(), IsMoving(), LoadStaticPassengers(), LOG_ERROR, MoveToNextWaypoint(), Position::NormalizeOrientation(), TimeTrackerSmall::Passed(), TimeTrackerSmall::Reset(), GameObject::SetGoState(), SetMoving(), Transport::SetPathProgress(), sScriptMgr, TeleportTransport(), TimeTrackerSmall::Update(), GameObjectAI::UpdateAI(), and UpdatePosition().

◆ UpdatePassengerPositions()

void MotionTransport::UpdatePassengerPositions ( PassengerSet passengers)
private
727{
728 for (PassengerSet::iterator itr = passengers.begin(); itr != passengers.end(); ++itr)
729 {
730 WorldObject* passenger = *itr;
731 // transport teleported but passenger not yet (can happen for players)
732 if (passenger->GetMap() != GetMap())
733 continue;
734
735 // 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
736 if (Unit* unit = passenger->ToUnit())
737 if (unit->GetVehicle())
738 continue;
739
740 // Do not use Unit::UpdatePosition here, we don't want to remove auras as if regular movement occurred
741 float x, y, z, o;
742 passenger->m_movementInfo.transport.pos.GetPosition(x, y, z, o);
743 CalculatePassengerPosition(x, y, z, &o);
744
745 // check if position is valid
746 if (!Acore::IsValidMapCoord(x, y, z))
747 continue;
748
749 switch (passenger->GetTypeId())
750 {
751 case TYPEID_UNIT:
752 {
753 Creature* creature = passenger->ToCreature();
754 GetMap()->CreatureRelocation(creature, x, y, z, o);
755
756 creature->GetTransportHomePosition(x, y, z, o);
757 CalculatePassengerPosition(x, y, z, &o);
758 creature->SetHomePosition(x, y, z, o);
759 }
760 break;
761 case TYPEID_PLAYER:
762 if (passenger->IsInWorld())
763 GetMap()->PlayerRelocation(passenger->ToPlayer(), x, y, z, o);
764 break;
766 GetMap()->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o);
767 break;
769 GetMap()->DynamicObjectRelocation(passenger->ToDynObject(), x, y, z, o);
770 break;
771 default:
772 break;
773 }
774 }
775}
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:354
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition Map.cpp:804
void GameObjectRelocation(GameObject *go, float x, float y, float z, float o)
Definition Map.cpp:848
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition Map.cpp:826
void DynamicObjectRelocation(DynamicObject *go, float x, float y, float z, float o)
Definition Map.cpp:869
bool IsInWorld() const
Definition Object.h:109
bool IsValidMapCoord(float c)
Definition GridDefines.h:210

References Transport::CalculatePassengerPosition(), Map::CreatureRelocation(), Map::DynamicObjectRelocation(), Map::GameObjectRelocation(), WorldObject::GetMap(), Position::GetPosition(), Creature::GetTransportHomePosition(), Object::GetTypeId(), Object::IsInWorld(), Acore::IsValidMapCoord(), WorldObject::m_movementInfo, Map::PlayerRelocation(), MovementInfo::TransportInfo::pos, Creature::SetHomePosition(), Object::ToCreature(), Object::ToDynObject(), Object::ToGameObject(), Object::ToPlayer(), Object::ToUnit(), MovementInfo::transport, TYPEID_DYNAMICOBJECT, TYPEID_GAMEOBJECT, TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by UpdatePosition().

◆ UpdatePosition()

void MotionTransport::UpdatePosition ( float  x,
float  y,
float  z,
float  o 
)
334{
335 if (!GetMap()->IsGridLoaded(x, y)) // pussywizard: should not happen, but just in case
336 GetMap()->LoadGrid(x, y);
337
338 Relocate(x, y, z, o);
340
342
343 if (_staticPassengers.empty())
345 else
347}
void UpdateModelPosition()
Definition GameObject.cpp:2936
void UpdatePassengerPositions(PassengerSet &passengers)
Definition Transport.cpp:726

References Transport::_passengers, _staticPassengers, WorldObject::GetMap(), Map::LoadGrid(), LoadStaticPassengers(), Position::Relocate(), GameObject::UpdateModelPosition(), and UpdatePassengerPositions().

Referenced by TeleportTransport(), and Update().

Friends And Related Symbol Documentation

◆ TransportMgr::CreateTransport

Member Data Documentation

◆ _currentFrame

KeyFrameVec::const_iterator MotionTransport::_currentFrame
private

◆ _delayedTeleport

bool MotionTransport::_delayedTeleport
private

◆ _firstDepartureTime

std::chrono::system_clock::time_point MotionTransport::_firstDepartureTime
private

◆ _isMoving

bool MotionTransport::_isMoving
private

Referenced by IsMoving(), and SetMoving().

◆ _nextFrame

KeyFrameVec::const_iterator MotionTransport::_nextFrame
private

◆ _passengersLoaded

bool MotionTransport::_passengersLoaded
private

◆ _pendingStop

bool MotionTransport::_pendingStop
private

Referenced by EnableMovement(), and Update().

◆ _positionChangeTimer

TimeTrackerSmall MotionTransport::_positionChangeTimer
private

Referenced by Update().

◆ _requiresFirstDepartureSync

bool MotionTransport::_requiresFirstDepartureSync
private

◆ _staticPassengers

◆ _transportInfo

TransportTemplate const* MotionTransport::_transportInfo
private

◆ _triggeredArrivalEvent

bool MotionTransport::_triggeredArrivalEvent
private

These are needed to properly control events triggering only once for each frame.

Referenced by CreateMoTrans(), MoveToNextWaypoint(), and Update().

◆ _triggeredDepartureEvent

bool MotionTransport::_triggeredDepartureEvent
private

◆ Lock

std::mutex MotionTransport::Lock
mutableprivate

Referenced by AddPassenger(), and RemovePassenger().


The documentation for this class was generated from the following files: