33#include <boost/dynamic_bitset.hpp>
39 if (passenger->
GetMap() != map)
80 if (
Vehicle* vehicle = unit->GetVehicleKit())
81 vehicle->RelocatePassengers();
86 _currentPathLeg(0), _pathProgress(0), _delayedAddModel(false)
106 TC_LOG_ERROR(
"entities.transport",
"Transport (GUID: {}) not created. Suggested coordinates isn't valid (X: {} Y: {})",
111 _Create(ObjectGuid::Create<HighGuid::Transport>(guidlow));
116 TC_LOG_ERROR(
"sql.sql",
"Transport not created: entry in `gameobject_template` not found, entry: {}", entry);
126 TC_LOG_ERROR(
"sql.sql",
"Transport {} (name: {}) will not be created, missing `transport_template` entry.", entry, goinfo->
name);
154 Relocate(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), position->GetOrientation());
181 TC_LOG_ERROR(
"entities.transport",
"Could not initialize GameObjectAI for Transport");
204 if (eventToTriggerIndex != boost::dynamic_bitset<uint8>::npos)
213 ++eventToTriggerIndex;
246 UpdatePosition(newPosition->GetPositionX(), newPosition->GetPositionY(), newPosition->GetPositionZ(), newPosition->GetOrientation());
304 plr->SetFallInformation(0, plr->GetPositionZ());
352 sScriptMgr->OnAddCreaturePassenger(
this, creature);
453 summon =
new TempSummon(properties, summoner,
false);
456 summon =
new Guardian(properties, summoner,
false);
459 summon =
new Puppet(properties, summoner);
462 summon =
new Totem(properties, summoner);
465 summon =
new Minion(properties, summoner,
false);
479 phaseShiftOwner = summoner;
557 for (
auto const& [cellId, guids] : *cells)
597 if (oldMapId != newMapId)
614 if (veh->GetTransport() ==
this)
633 if (ref.GetSource()->GetTransport() !=
this && ref.GetSource()->InSamePhase(
this))
637 ref.GetSource()->m_visibleTransports.insert(
GetGUID());
640 ref.GetSource()->SendDirectMessage(&packet);
653 if (ref.GetSource()->GetTransport() !=
this && ref.GetSource()->m_visibleTransports.count(
GetGUID()))
655 ref.GetSource()->SendDirectMessage(&packet);
656 ref.GetSource()->m_visibleTransports.erase(
GetGUID());
666 float destX, destY, destZ, destO;
667 obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
669 switch (obj->GetTypeId())
677 obj->AddObjectToRemoveList();
697 if (playerReference.GetSource()->InSamePhase(
this))
705 std::stringstream sstr;
std::unordered_map< Player *, UpdateData > UpdateDataMapType
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
std::unordered_map< uint32, CellObjectGuids > CellObjectGuidsMap
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ TELE_TO_NOT_LEAVE_TRANSPORT
@ GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT
@ SUMMON_CATEGORY_POSSESSED_VEHICLE
@ SUMMON_CATEGORY_VEHICLE
@ UNIT_STATE_IGNORE_PATHFINDING
ObjectGuid const & GetGUID() const
void BuildUpdateChangesMask()
void _Create(ObjectGuid const &guid)
CreateObjectBits m_updateFlag
void ClearUpdateMask(bool remove)
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const
void BuildOutOfRangeUpdateBlock(UpdateData *data) const
void BuildFieldsUpdate(Player *player, UpdateDataMapType &data_map) const
void SetHomePosition(float x, float y, float z, float o)
static Creature * CreateCreatureFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap=true, bool allowDuplicate=false)
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 entry, Position const &pos, CreatureData const *data, uint32 vehId, bool dynamic=false)
void SetTransportHomePosition(float x, float y, float z, float o)
virtual void UpdateAI(uint32)
void SetLocalRotationAngles(float z_rot, float y_rot, float x_rot)
void SetGoState(GOState state)
GameObjectTemplate const * GetGOInfo() const
GOState GetGoState() const
std::string GetDebugInfo() const override
Position m_stationaryPosition
void ReplaceAllFlags(GameObjectFlags flags)
void RemoveFromWorld() override
void SetGoAnimProgress(uint8 animprogress)
static GameObject * CreateGameObjectFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap=true)
GameObjectAI * AI() const
void SetGoType(GameobjectTypes type)
void SetLocalRotation(float qx, float qy, float qz, float qw)
GameObjectTemplateAddon const * m_goTemplateAddon
void UpdateModelPosition()
void RelocateStationaryPosition(float x, float y, float z, float o)
void SetDisplayId(uint32 displayid)
GameObjectTemplate const * m_goInfo
void CleanupsBeforeDelete(bool finalCleanup=true) override
void AddToWorld() override
GameObjectOverride const * GetGameObjectOverride() const
void SetParentRotation(QuaternionData const &rotation)
std::unique_ptr< GameObjectModel > m_model
void SetFaction(uint32 faction) override
void DynamicObjectRelocation(DynamicObject *go, float x, float y, float z, float orientation)
void GameObjectRelocation(GameObject *go, float x, float y, float z, float orientation, bool respawnRelocationOnFail=true)
void CreatureRelocation(Creature *creature, float x, float y, float z, float ang, bool respawnRelocationOnFail=true)
ObjectGuid::LowType GenerateLowGuid()
void AreaTriggerRelocation(AreaTrigger *at, float x, float y, float z, float orientation)
time_t GetGORespawnTime(ObjectGuid::LowType spawnId) const
time_t GetCreatureRespawnTime(ObjectGuid::LowType spawnId) const
void InsertGameObjectModel(GameObjectModel const &model)
bool IsGridLoaded(uint32 gridId) const
PlayerList const & GetPlayers() const
void PlayerRelocation(Player *, float x, float y, float z, float orientation)
std::string ToString() const
void SetDynamicFlag(uint32 flag)
DynamicObject * ToDynObject()
AreaTrigger * ToAreaTrigger()
GameObject * ToGameObject()
void RemoveDynamicFlag(uint32 flag)
void SetEntry(uint32 entry)
virtual void SetObjectScale(float scale)
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
static void InitDbVisibleMapId(PhaseShift &phaseShift, int32 visibleMapId)
static void InitDbPhaseShift(PhaseShift &phaseShift, uint8 phaseUseFlags, uint16 phaseId, uint32 phaseGroupId)
void SetFallInformation(uint32 time, float z)
bool IsBeingTeleported() const
virtual void InitStats(WorldObject *summoner, Milliseconds duration)
void SetTempSummonType(TempSummonType type)
virtual void InitSummon(WorldObject *summoner)
void UpdatePassengerPosition(Map *map, WorldObject *passenger, Position const &position, bool setHomePosition)
virtual Position GetPositionWithOffset(Position const &offset) const =0
This method transforms supplied transport offsets into global coordinates.
void UpdatePosition(float x, float y, float z, float o)
TransportMovementState _movementState
void SetPeriod(uint32 period)
uint32 GetTransportPeriod() const
Position GetPositionWithOffset(Position const &offset) const override
This method transforms supplied transport offsets into global coordinates.
void LoadStaticPassengers()
Needed when transport moves from inactive to active grid.
Optional< uint32 > _requestStopTimestamp
void Update(uint32 diff) override
void BuildUpdate(UpdateDataMapType &data_map) override
void EnableMovement(bool enabled)
bool TeleportTransport(uint32 oldMapId, uint32 newMapId, float x, float y, float z, float o)
bool Create(ObjectGuid::LowType guidlow, uint32 entry, float x, float y, float z, float ang)
void UnloadStaticPassengers()
Needed when transport enters inactive grid.
std::string GetDebugInfo() const override
void AddPassenger(WorldObject *passenger, Position const &offset) override
PassengerSet _staticPassengers
TimeTracker _positionChangeTimer
Creature * CreateNPCPassenger(ObjectGuid::LowType guid, CreatureData const *data)
void UpdatePassengerPositions(PassengerSet const &passengers)
ObjectGuid GetTransportGUID() const override
int32 GetMapIdForSpawning() const override
GameObject * CreateGOPassenger(ObjectGuid::LowType guid, GameObjectData const *data)
std::set< WorldObject * > PassengerSet
uint32 GetExpectedMapId() const
Returns id of the map that transport is expected to be on, according to current path progress.
TempSummon * SummonPassenger(uint32 entry, Position const &pos, TempSummonType summonType, SummonPropertiesEntry const *properties=nullptr, Milliseconds duration=0ms, Unit *summoner=nullptr, uint32 spellId=0, uint32 vehId=0)
Temporarily summons a creature as passenger on this transport.
TransportTemplate const * _transportInfo
std::unique_ptr< boost::dynamic_bitset< uint8 > > _eventsToTrigger
void TeleportPassengersAndHideTransport(uint32 newMapid)
void CleanupsBeforeDelete(bool finalCleanup=true) override
Transport * RemovePassenger(WorldObject *passenger) override
Unit * GetVehicleBase() const
void SetCreatedBySpell(int32 spellId)
void AddUnitState(uint32 f)
bool BuildPacket(WorldPacket *packet)
constexpr WorldLocation()
constexpr uint32 GetMapId() const
PhaseShift & GetPhaseShift()
std::string const & GetName() const
void AddObjectToRemoveList()
void SetName(std::string newname)
MovementInfo m_movementInfo
void SetTransport(TransportBase *t)
TC_GAME_API void Trigger(uint32 gameEventId, WorldObject *source, WorldObject *target)
bool DiffGrid(Cell const &cell) const
struct GameObjectTemplate::@197::@214 moTransport
struct MovementInfo::TransportInfo transport
constexpr void SetOrientation(float orientation)
constexpr float GetPositionX() const
constexpr float GetPositionY() const
constexpr void GetPosition(float &x, float &y) const
bool IsPositionValid() const
constexpr void Relocate(float x, float y)
constexpr float GetPositionZ() const
EnumFlag< SummonPropertiesFlags > GetFlags() const
uint32 GetNextPauseWaypointTimestamp(uint32 time) const
Optional< Position > ComputePosition(uint32 time, TransportMovementState *moveState, size_t *legIndex) const
std::vector< TransportPathEvent > Events
TransportPathLeg const * GetLegForTime(uint32 time) const
std::vector< TransportPathLeg > PathLegs