TrinityCore
Transport.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "Transport.h"
19#include "Cell.h"
20#include "CellImpl.h"
21#include "Common.h"
22#include "DB2Stores.h"
23#include "GameEventSender.h"
24#include "GameObjectAI.h"
25#include "GameTime.h"
26#include "Log.h"
27#include "ObjectMgr.h"
28#include "PhasingHandler.h"
29#include "Player.h"
30#include "ScriptMgr.h"
31#include "Spline.h"
32#include "Totem.h"
33#include "UpdateData.h"
34#include "Vehicle.h"
35#include <boost/dynamic_bitset.hpp>
36#include <G3D/Vector3.h>
37#include <sstream>
38
39void TransportBase::UpdatePassengerPosition(Map* map, WorldObject* passenger, float x, float y, float z, float o, bool setHomePosition)
40{
41 // transport teleported but passenger not yet (can happen for players)
42 if (passenger->GetMap() != map)
43 return;
44
45 // Do not use Unit::UpdatePosition here, we don't want to remove auras
46 // as if regular movement occurred
47 switch (passenger->GetTypeId())
48 {
49 case TYPEID_UNIT:
50 {
51 Creature* creature = passenger->ToCreature();
52 map->CreatureRelocation(creature, x, y, z, o, false);
53 if (setHomePosition)
54 {
55 creature->GetTransportHomePosition(x, y, z, o);
56 CalculatePassengerPosition(x, y, z, &o);
57 creature->SetHomePosition(x, y, z, o);
58 }
59 break;
60 }
61 case TYPEID_PLAYER:
62 //relocate only passengers in world and skip any player that might be still logging in/teleporting
63 if (passenger->IsInWorld() && !passenger->ToPlayer()->IsBeingTeleported())
64 {
65 map->PlayerRelocation(passenger->ToPlayer(), x, y, z, o);
66 passenger->ToPlayer()->SetFallInformation(0, passenger->GetPositionZ());
67 }
68 break;
70 map->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false);
71 passenger->ToGameObject()->RelocateStationaryPosition(x, y, z, o);
72 break;
74 map->DynamicObjectRelocation(passenger->ToDynObject(), x, y, z, o);
75 break;
77 map->AreaTriggerRelocation(passenger->ToAreaTrigger(), x, y, z, o);
78 break;
79 default:
80 break;
81 }
82
83 if (Unit* unit = passenger->ToUnit())
84 if (Vehicle* vehicle = unit->GetVehicleKit())
85 vehicle->RelocatePassengers();
86}
87
89 _transportInfo(nullptr), _movementState(TransportMovementState::Moving), _eventsToTrigger(std::make_unique<boost::dynamic_bitset<uint8>>()),
90 _currentPathLeg(0), _pathProgress(0), _delayedAddModel(false)
91{
95}
96
98{
99 ASSERT(_passengers.empty());
101}
102
103bool Transport::Create(ObjectGuid::LowType guidlow, uint32 entry, float x, float y, float z, float ang)
104{
105 Relocate(x, y, z, ang);
106
107 if (!IsPositionValid())
108 {
109 TC_LOG_ERROR("entities.transport", "Transport (GUID: {}) not created. Suggested coordinates isn't valid (X: {} Y: {})",
110 guidlow, x, y);
111 return false;
112 }
113
114 Object::_Create(ObjectGuid::Create<HighGuid::Transport>(guidlow));
115
116 GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry);
117 if (!goinfo)
118 {
119 TC_LOG_ERROR("sql.sql", "Transport not created: entry in `gameobject_template` not found, entry: {}", entry);
120 return false;
121 }
122
123 m_goInfo = goinfo;
124 m_goTemplateAddon = sObjectMgr->GetGameObjectTemplateAddon(entry);
125
126 TransportTemplate const* tInfo = sTransportMgr->GetTransportTemplate(entry);
127 if (!tInfo)
128 {
129 TC_LOG_ERROR("sql.sql", "Transport {} (name: {}) will not be created, missing `transport_template` entry.", entry, goinfo->name);
130 return false;
131 }
132
133 _transportInfo = tInfo;
134 _eventsToTrigger->resize(tInfo->Events.size(), true);
135
136 if (GameObjectOverride const* goOverride = GetGameObjectOverride())
137 {
138 SetFaction(goOverride->Faction);
139 ReplaceAllFlags(GameObjectFlags(goOverride->Flags));
140 }
141
142 _pathProgress = !goinfo->moTransport.allowstopping ? getMSTime() /*might be called before world update loop begins, don't use GameTime*/ % tInfo->TotalPathTime : 0;
144 SetObjectScale(goinfo->size);
145 SetPeriod(tInfo->TotalPathTime);
146 SetEntry(goinfo->entry);
147 SetDisplayId(goinfo->displayId);
152 SetName(goinfo->name);
153 SetLocalRotation(0.0f, 0.0f, 0.0f, 1.0f);
155
156 size_t legIndex;
157 if (Optional<Position> position = _transportInfo->ComputePosition(_pathProgress, nullptr, &legIndex))
158 {
159 Relocate(position->GetPositionX(), position->GetPositionY(), position->GetPositionZ(), position->GetOrientation());
160 _currentPathLeg = legIndex;
161 }
162
163 CreateModel();
164 return true;
165}
166
167void Transport::CleanupsBeforeDelete(bool finalCleanup /*= true*/)
168{
170 while (!_passengers.empty())
171 {
172 WorldObject* obj = *_passengers.begin();
173 RemovePassenger(obj);
174 }
175
177}
178
180{
181 constexpr Milliseconds positionUpdateDelay = 200ms;
182
183 if (AI())
184 AI()->UpdateAI(diff);
185 else if (!AIM_Initialize())
186 TC_LOG_ERROR("entities.transport", "Could not initialize GameObjectAI for Transport");
187
188 sScriptMgr->OnTransportUpdate(this, diff);
189
191
193 if (!GetGOInfo()->moTransport.allowstopping)
196 _pathProgress += diff;
197 else
199
200 if (_pathProgress / GetTransportPeriod() != cycleId)
201 {
202 // reset cycle
203 _eventsToTrigger->set();
204 }
205
207
209
210 size_t eventToTriggerIndex = _eventsToTrigger->find_first();
211 if (eventToTriggerIndex != boost::dynamic_bitset<uint8>::npos)
212 {
213 while (eventToTriggerIndex < _transportInfo->Events.size() && _transportInfo->Events[eventToTriggerIndex].Timestamp < timer)
214 {
215 if (TransportPathLeg const* leg = _transportInfo->GetLegForTime(_transportInfo->Events[eventToTriggerIndex].Timestamp))
216 if (leg->MapId == GetMapId())
217 GameEvents::Trigger(_transportInfo->Events[eventToTriggerIndex].EventId, this, this);
218
219 _eventsToTrigger->set(eventToTriggerIndex, false);
220 ++eventToTriggerIndex;
221 }
222 }
223
224 TransportMovementState moveState;
225 size_t legIndex;
226 if (Optional<Position> newPosition = _transportInfo->ComputePosition(timer, &moveState, &legIndex))
227 {
229 _movementState = moveState;
230
231 if (justStopped)
232 {
234 {
237 }
238 }
239
240 if (legIndex != _currentPathLeg)
241 {
243 _currentPathLeg = legIndex;
244 TeleportTransport(oldMapId, _transportInfo->PathLegs[legIndex].MapId, newPosition->GetPositionX(), newPosition->GetPositionY(), newPosition->GetPositionZ(), newPosition->GetOrientation());
245 return;
246 }
247
248 // set position
250 {
251 _positionChangeTimer.Reset(positionUpdateDelay);
253 UpdatePosition(newPosition->GetPositionX(), newPosition->GetPositionY(), newPosition->GetPositionZ(), newPosition->GetOrientation());
254 else
255 {
256 /* There are four possible scenarios that trigger loading/unloading passengers:
257 1. transport moves from inactive to active grid
258 2. the grid that transport is currently in becomes active
259 3. transport moves from active to inactive grid
260 4. the grid that transport is currently in unloads
261 */
262 bool gridActive = GetMap()->IsGridLoaded(GetPositionX(), GetPositionY());
263
264 if (_staticPassengers.empty() && gridActive) // 2.
266 else if (!_staticPassengers.empty() && !gridActive)
267 // 4. - if transports stopped on grid edge, some passengers can remain in active grids
268 // unload all static passengers otherwise passengers won't load correctly when the grid that transport is currently in becomes active
270 }
271 }
272 }
273
274 // Add model to map after we are fully done with moving maps
276 {
277 _delayedAddModel = false;
278 if (m_model)
280 }
281}
282
284{
285 if (!IsInWorld())
286 return;
287
288 if (_passengers.insert(passenger).second)
289 {
290 passenger->SetTransport(this);
291 passenger->m_movementInfo.transport.guid = GetGUID();
292 TC_LOG_DEBUG("entities.transport", "Object {} boarded transport {}.", passenger->GetName(), GetName());
293
294 if (Player* plr = passenger->ToPlayer())
295 sScriptMgr->OnAddPassenger(this, plr);
296 }
297}
298
300{
301 if (_passengers.erase(passenger) || _staticPassengers.erase(passenger)) // static passenger can remove itself in case of grid unload
302 {
303 passenger->SetTransport(nullptr);
304 passenger->m_movementInfo.transport.Reset();
305 TC_LOG_DEBUG("entities.transport", "Object {} removed from transport {}.", passenger->GetName(), GetName());
306
307 if (Player* plr = passenger->ToPlayer())
308 {
309 sScriptMgr->OnRemovePassenger(this, plr);
310 plr->SetFallInformation(0, plr->GetPositionZ());
311 }
312 }
313
314 return this;
315}
316
318{
319 Map* map = GetMap();
320 if (map->GetCreatureRespawnTime(guid))
321 return nullptr;
322
323 Creature* creature = Creature::CreateCreatureFromDB(guid, map, false, true);
324 if (!creature)
325 return nullptr;
326
327 ASSERT(data);
328
329 float x, y, z, o;
330 data->spawnPoint.GetPosition(x, y, z, o);
331
332 creature->SetTransport(this);
333 creature->m_movementInfo.transport.guid = GetGUID();
334 creature->m_movementInfo.transport.pos.Relocate(x, y, z, o);
335 creature->m_movementInfo.transport.seat = -1;
336 CalculatePassengerPosition(x, y, z, &o);
337 creature->Relocate(x, y, z, o);
338 creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation());
340
344
345 if (!creature->IsPositionValid())
346 {
347 TC_LOG_ERROR("entities.transport", "Passenger {} not created. Suggested coordinates aren't valid (X: {} Y: {})", creature->GetGUID().ToString(), creature->GetPositionX(), creature->GetPositionY());
348 delete creature;
349 return nullptr;
350 }
351
354
355 if (!map->AddToMap(creature))
356 {
357 delete creature;
358 return nullptr;
359 }
360
361 _staticPassengers.insert(creature);
362 sScriptMgr->OnAddCreaturePassenger(this, creature);
363 return creature;
364}
365
367{
368 Map* map = GetMap();
369 if (map->GetGORespawnTime(guid))
370 return nullptr;
371
372 GameObject* go = GameObject::CreateGameObjectFromDB(guid, map, false);
373 if (!go)
374 return nullptr;
375
376 ASSERT(data);
377
378 float x, y, z, o;
379 data->spawnPoint.GetPosition(x, y, z, o);
380
381 go->SetTransport(this);
383 go->m_movementInfo.transport.pos.Relocate(x, y, z, o);
385 CalculatePassengerPosition(x, y, z, &o);
386 go->Relocate(x, y, z, o);
387 go->RelocateStationaryPosition(x, y, z, o);
388
389 if (!go->IsPositionValid())
390 {
391 TC_LOG_ERROR("entities.transport", "Passenger {} not created. Suggested coordinates aren't valid (X: {} Y: {})", go->GetGUID().ToString(), go->GetPositionX(), go->GetPositionY());
392 delete go;
393 return nullptr;
394 }
395
398
399 if (!map->AddToMap(go))
400 {
401 delete go;
402 return nullptr;
403 }
404
405 _staticPassengers.insert(go);
406 return go;
407}
408
409TempSummon* Transport::SummonPassenger(uint32 entry, Position const& pos, TempSummonType summonType, SummonPropertiesEntry const* properties /*= nullptr*/, Milliseconds duration /*= 0ms*/, Unit* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
410{
411 Map* map = FindMap();
412 if (!map)
413 return nullptr;
414
416 if (properties)
417 {
418 switch (properties->Control)
419 {
421 mask = UNIT_MASK_GUARDIAN;
422 break;
424 mask = UNIT_MASK_PUPPET;
425 break;
427 mask = UNIT_MASK_MINION;
428 break;
432 {
433 switch (SummonTitle(properties->Title))
434 {
438 mask = UNIT_MASK_GUARDIAN;
439 break;
442 mask = UNIT_MASK_TOTEM;
443 break;
446 mask = UNIT_MASK_SUMMON;
447 break;
449 mask = UNIT_MASK_MINION;
450 break;
451 default:
452 if (properties->GetFlags().HasFlag(SummonPropertiesFlags::JoinSummonerSpawnGroup)) // Mirror Image, Summon Gargoyle
453 mask = UNIT_MASK_GUARDIAN;
454 break;
455 }
456 break;
457 }
458 default:
459 return nullptr;
460 }
461 }
462
463 TempSummon* summon = nullptr;
464 switch (mask)
465 {
466 case UNIT_MASK_SUMMON:
467 summon = new TempSummon(properties, summoner, false);
468 break;
470 summon = new Guardian(properties, summoner, false);
471 break;
472 case UNIT_MASK_PUPPET:
473 summon = new Puppet(properties, summoner);
474 break;
475 case UNIT_MASK_TOTEM:
476 summon = new Totem(properties, summoner);
477 break;
478 case UNIT_MASK_MINION:
479 summon = new Minion(properties, summoner, false);
480 break;
481 }
482
483 float x, y, z, o;
484 pos.GetPosition(x, y, z, o);
485 CalculatePassengerPosition(x, y, z, &o);
486
487 if (!summon->Create(map->GenerateLowGuid<HighGuid::Creature>(), map, entry, { x, y, z, o }, nullptr, vehId))
488 {
489 delete summon;
490 return nullptr;
491 }
492
493 WorldObject* phaseShiftOwner = this;
494 if (summoner && !(properties && properties->GetFlags().HasFlag(SummonPropertiesFlags::IgnoreSummonerPhase)))
495 phaseShiftOwner = summoner;
496
497 if (phaseShiftOwner)
498 PhasingHandler::InheritPhaseShift(summon, phaseShiftOwner);
499
500 summon->SetCreatedBySpell(spellId);
501
502 summon->SetTransport(this);
505 summon->Relocate(x, y, z, o);
506 summon->SetHomePosition(x, y, z, o);
507 summon->SetTransportHomePosition(pos);
508
512
513 summon->InitStats(summoner, duration);
514
515 if (!map->AddToMap<Creature>(summon))
516 {
517 delete summon;
518 return nullptr;
519 }
520
521 _staticPassengers.insert(summon);
522
523 summon->InitSummon(summoner);
524 summon->SetTempSummonType(summonType);
525
526 return summon;
527}
528
530{
532}
533
534void Transport::UpdatePosition(float x, float y, float z, float o)
535{
536 sScriptMgr->OnRelocate(this, GetMapId(), x, y, z);
537
538 bool newActive = GetMap()->IsGridLoaded(x, y);
539 Cell oldCell(GetPositionX(), GetPositionY());
540
541 Relocate(x, y, z, o);
544
546
547 /* There are four possible scenarios that trigger loading/unloading passengers:
548 1. transport moves from inactive to active grid
549 2. the grid that transport is currently in becomes active
550 3. transport moves from active to inactive grid
551 4. the grid that transport is currently in unloads
552 */
553 if (_staticPassengers.empty() && newActive) // 1.
555 else if (!_staticPassengers.empty() && !newActive && oldCell.DiffGrid(Cell(GetPositionX(), GetPositionY()))) // 3.
557 else
559 // 4. is handed by grid unload
560}
561
563{
565 if (!mapId)
566 return;
567
568 CellObjectGuidsMap const* cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetDifficultyID());
569 if (!cells)
570 return;
571
572 for (auto const& [cellId, guids] : *cells)
573 {
574 // GameObjects on transport
575 for (ObjectGuid::LowType spawnId : guids.gameobjects)
576 CreateGOPassenger(spawnId, sObjectMgr->GetGameObjectData(spawnId));
577
578 // Creatures on transport
579 for (ObjectGuid::LowType spawnId : guids.creatures)
580 CreateNPCPassenger(spawnId, sObjectMgr->GetCreatureData(spawnId));
581 }
582}
583
585{
586 while (!_staticPassengers.empty())
587 {
588 WorldObject* obj = *_staticPassengers.begin();
589 obj->AddObjectToRemoveList(); // also removes from _staticPassengers
590 }
591}
592
594{
595 if (!GetGOInfo()->moTransport.allowstopping)
596 return;
597
598 if (!enabled)
599 {
601 }
602 else
603 {
604 _requestStopTimestamp.reset();
607 }
608}
609
610bool Transport::TeleportTransport(uint32 oldMapId, uint32 newMapId, float x, float y, float z, float o)
611{
612 if (oldMapId != newMapId)
613 {
615 TeleportPassengersAndHideTransport(newMapId, x, y, z, o);
616 return true;
617 }
618 else
619 {
620 UpdatePosition(x, y, z, o);
621
622 // Teleport players, they need to know it
623 for (PassengerSet::iterator itr = _passengers.begin(); itr != _passengers.end(); ++itr)
624 {
625 if ((*itr)->GetTypeId() == TYPEID_PLAYER)
626 {
627 // will be relocated in UpdatePosition of the vehicle
628 if (Unit* veh = (*itr)->ToUnit()->GetVehicleBase())
629 if (veh->GetTransport() == this)
630 continue;
631
632 float destX, destY, destZ, destO;
633 (*itr)->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
634 TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o);
635
636 (*itr)->ToUnit()->NearTeleportTo(destX, destY, destZ, destO);
637 }
638 }
639
640 return false;
641 }
642}
643
644void Transport::TeleportPassengersAndHideTransport(uint32 newMapid, float x, float y, float z, float o)
645{
646 if (newMapid == GetMapId())
647 {
648 AddToWorld();
649
650 for (MapReference const& ref : GetMap()->GetPlayers())
651 {
652 if (ref.GetSource()->GetTransport() != this && ref.GetSource()->InSamePhase(this))
653 {
654 UpdateData data(GetMap()->GetId());
655 BuildCreateUpdateBlockForPlayer(&data, ref.GetSource());
656 ref.GetSource()->m_visibleTransports.insert(GetGUID());
657 WorldPacket packet;
658 data.BuildPacket(&packet);
659 ref.GetSource()->SendDirectMessage(&packet);
660 }
661 }
662 }
663 else
664 {
665 UpdateData data(GetMap()->GetId());
667
668 WorldPacket packet;
669 data.BuildPacket(&packet);
670 for (MapReference const& ref : GetMap()->GetPlayers())
671 {
672 if (ref.GetSource()->GetTransport() != this && ref.GetSource()->m_visibleTransports.count(GetGUID()))
673 {
674 ref.GetSource()->SendDirectMessage(&packet);
675 ref.GetSource()->m_visibleTransports.erase(GetGUID());
676 }
677 }
678
680 }
681
682 PassengerSet passengersToTeleport = _passengers;
683 for (WorldObject* obj : passengersToTeleport)
684 {
685 float destX, destY, destZ, destO;
686 obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO);
687 TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o);
688
689 switch (obj->GetTypeId())
690 {
691 case TYPEID_PLAYER:
692 if (!obj->ToPlayer()->TeleportTo(newMapid, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT))
693 RemovePassenger(obj);
694 break;
697 obj->AddObjectToRemoveList();
698 break;
699 default:
700 RemovePassenger(obj);
701 break;
702 }
703 }
704}
705
707{
708 for (WorldObject* passenger : passengers)
709 {
710 float x, y, z, o;
711 passenger->m_movementInfo.transport.pos.GetPosition(x, y, z, o);
712 CalculatePassengerPosition(x, y, z, &o);
713 UpdatePassengerPosition(GetMap(), passenger, x, y, z, o, true);
714 }
715}
716
718{
719 Map::PlayerList const& players = GetMap()->GetPlayers();
720 if (players.isEmpty())
721 return;
722
723 for (MapReference const& playerReference : players)
724 if (playerReference.GetSource()->InSamePhase(this))
725 BuildFieldsUpdate(playerReference.GetSource(), data_map);
726
727 ClearUpdateMask(true);
728}
729
730std::string Transport::GetDebugInfo() const
731{
732 std::stringstream sstr;
733 sstr << GameObject::GetDebugInfo();
734 return sstr.str();
735}
736
738{
740}
#define sDB2Manager
Definition: DB2Stores.h:538
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
#define ASSERT
Definition: Errors.h:68
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
TempSummonType
Definition: ObjectDefines.h:62
@ TYPEID_AREATRIGGER
Definition: ObjectGuid.h:46
@ TYPEID_DYNAMICOBJECT
Definition: ObjectGuid.h:44
@ TYPEID_GAMEOBJECT
Definition: ObjectGuid.h:43
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
std::unordered_map< uint32, CellObjectGuids > CellObjectGuidsMap
Definition: ObjectMgr.h:485
#define sObjectMgr
Definition: ObjectMgr.h:1946
std::unordered_map< Player *, UpdateData > UpdateDataMapType
Definition: Object.h:79
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:803
#define sScriptMgr
Definition: ScriptMgr.h:1418
@ GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT
SummonTitle
@ GO_DYNFLAG_LO_STOPPED
GameObjectFlags
@ GO_STATE_READY
@ GO_STATE_ACTIVE
@ SUMMON_CATEGORY_PET
@ SUMMON_CATEGORY_VEHICLE
@ SUMMON_CATEGORY_ALLY
@ SUMMON_CATEGORY_PUPPET
@ SUMMON_CATEGORY_WILD
@ SUMMON_CATEGORY_UNK
uint32 getMSTime()
Definition: Timer.h:33
TransportMovementState
Definition: TransportMgr.h:44
#define sTransportMgr
Definition: TransportMgr.h:183
@ UNIT_MASK_PUPPET
Definition: Unit.h:356
@ UNIT_MASK_TOTEM
Definition: Unit.h:353
@ UNIT_MASK_SUMMON
Definition: Unit.h:350
@ UNIT_MASK_GUARDIAN
Definition: Unit.h:352
@ UNIT_MASK_MINION
Definition: Unit.h:351
@ UNIT_STATE_IGNORE_PATHFINDING
Definition: Unit.h:283
void SetHomePosition(float x, float y, float z, float o)
Definition: Creature.h:371
static Creature * CreateCreatureFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition: Creature.cpp:1199
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:378
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 entry, Position const &pos, CreatureData const *data, uint32 vehId, bool dynamic=false)
Definition: Creature.cpp:1071
void SetTransportHomePosition(float x, float y, float z, float o)
Definition: Creature.h:376
virtual void UpdateAI(uint32)
Definition: GameObjectAI.h:59
void SetGoState(GOState state)
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:202
void CreateModel()
GOState GetGoState() const
Definition: GameObject.h:281
std::string GetDebugInfo() const override
Position m_stationaryPosition
Definition: GameObject.h:489
void ReplaceAllFlags(GameObjectFlags flags)
Definition: GameObject.h:276
void RemoveFromWorld() override
Definition: GameObject.cpp:931
void SetGoAnimProgress(uint8 animprogress)
Definition: GameObject.h:288
static GameObject * CreateGameObjectFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap=true)
GameObjectAI * AI() const
Definition: GameObject.h:378
void SetGoType(GameobjectTypes type)
Definition: GameObject.h:280
void SetLocalRotation(float qx, float qy, float qz, float qw)
GameObjectTemplateAddon const * m_goTemplateAddon
Definition: GameObject.h:480
bool AIM_Initialize()
Definition: GameObject.cpp:858
GameObjectModel * m_model
Definition: GameObject.h:391
UF::UpdateField< UF::GameObjectData, 0, TYPEID_GAMEOBJECT > m_gameObjectData
Definition: GameObject.h:451
void UpdateModelPosition()
void SetPathProgressForClient(float progress)
void RelocateStationaryPosition(float x, float y, float z, float o)
Definition: GameObject.h:405
void SetDisplayId(uint32 displayid)
GameObjectTemplate const * m_goInfo
Definition: GameObject.h:479
void ClearUpdateMask(bool remove) override
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition: GameObject.cpp:876
void AddToWorld() override
Definition: GameObject.cpp:904
GameObjectOverride const * GetGameObjectOverride() const
void SetParentRotation(QuaternionData const &rotation)
void SetFaction(uint32 faction) override
Definition: GameObject.h:389
bool isEmpty() const
Definition: LinkedList.h:110
Definition: Map.h:189
void DynamicObjectRelocation(DynamicObject *go, float x, float y, float z, float orientation)
Definition: Map.cpp:1141
void GameObjectRelocation(GameObject *go, float x, float y, float z, float orientation, bool respawnRelocationOnFail=true)
Definition: Map.cpp:1112
void CreatureRelocation(Creature *creature, float x, float y, float z, float ang, bool respawnRelocationOnFail=true)
Definition: Map.cpp:1080
bool AddToMap(T *)
Definition: Map.cpp:550
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:519
void AreaTriggerRelocation(AreaTrigger *at, float x, float y, float z, float orientation)
Definition: Map.cpp:1171
time_t GetGORespawnTime(ObjectGuid::LowType spawnId) const
Definition: Map.h:486
time_t GetCreatureRespawnTime(ObjectGuid::LowType spawnId) const
Definition: Map.h:485
void InsertGameObjectModel(GameObjectModel const &model)
Definition: Map.h:463
bool IsGridLoaded(uint32 gridId) const
Definition: Map.h:239
PlayerList const & GetPlayers() const
Definition: Map.h:367
void PlayerRelocation(Player *, float x, float y, float z, float orientation)
Definition: Map.cpp:1053
std::string ToString() const
Definition: ObjectGuid.cpp:554
uint64 LowType
Definition: ObjectGuid.h:278
void SetDynamicFlag(uint32 flag)
Definition: Object.h:169
void BuildFieldsUpdate(Player *, UpdateDataMapType &) const
Definition: Object.cpp:802
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static Unit * ToUnit(Object *o)
Definition: Object.h:225
static GameObject * ToGameObject(Object *o)
Definition: Object.h:231
ObjectGuid const & GetGUID() const
Definition: Object.h:160
bool IsInWorld() const
Definition: Object.h:154
TypeID GetTypeId() const
Definition: Object.h:173
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const
Definition: Object.cpp:137
CreateObjectBits m_updateFlag
Definition: Object.h:404
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
Definition: Object.h:287
UF::UpdateFieldHolder m_values
Definition: Object.h:266
void RemoveDynamicFlag(uint32 flag)
Definition: Object.h:170
void _Create(ObjectGuid const &guid)
Definition: Object.cpp:101
static AreaTrigger * ToAreaTrigger(Object *o)
Definition: Object.h:249
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void BuildOutOfRangeUpdateBlock(UpdateData *data) const
Definition: Object.cpp:220
void SetEntry(uint32 entry)
Definition: Object.h:162
virtual void SetObjectScale(float scale)
Definition: Object.h:165
static DynamicObject * ToDynObject(Object *o)
Definition: Object.h:243
static Player * ToPlayer(Object *o)
Definition: Object.h:213
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)
Definition: Player.cpp:26672
bool IsBeingTeleported() const
Definition: Player.h:2219
virtual void InitStats(WorldObject *summoner, Milliseconds duration)
void SetTempSummonType(TempSummonType type)
virtual void InitSummon(WorldObject *summoner)
virtual void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const =0
This method transforms supplied transport offsets into global coordinates.
void UpdatePassengerPosition(Map *map, WorldObject *passenger, float x, float y, float z, float o, bool setHomePosition)
Definition: Transport.cpp:39
void UpdatePosition(float x, float y, float z, float o)
Definition: Transport.cpp:534
TransportMovementState _movementState
Definition: Transport.h:116
void SetPeriod(uint32 period)
Definition: Transport.h:90
uint32 GetTransportPeriod() const
Definition: Transport.h:89
void TeleportPassengersAndHideTransport(uint32 newMapid, float x, float y, float z, float o)
Definition: Transport.cpp:644
void LoadStaticPassengers()
Needed when transport moves from inactive to active grid.
Definition: Transport.cpp:562
void AddPassenger(WorldObject *passenger) override
Definition: Transport.cpp:283
Optional< uint32 > _requestStopTimestamp
Definition: Transport.h:119
void Update(uint32 diff) override
Definition: Transport.cpp:179
void BuildUpdate(UpdateDataMapType &data_map) override
Definition: Transport.cpp:717
void EnableMovement(bool enabled)
Definition: Transport.cpp:593
bool TeleportTransport(uint32 oldMapId, uint32 newMapId, float x, float y, float z, float o)
Definition: Transport.cpp:610
bool Create(ObjectGuid::LowType guidlow, uint32 entry, float x, float y, float z, float ang)
Definition: Transport.cpp:103
void UnloadStaticPassengers()
Needed when transport enters inactive grid.
Definition: Transport.cpp:584
std::string GetDebugInfo() const override
Definition: Transport.cpp:730
uint32 _pathProgress
Definition: Transport.h:120
PassengerSet _staticPassengers
Definition: Transport.h:124
bool _delayedAddModel
Definition: Transport.h:126
size_t _currentPathLeg
Definition: Transport.h:118
TimeTracker _positionChangeTimer
Definition: Transport.h:121
Creature * CreateNPCPassenger(ObjectGuid::LowType guid, CreatureData const *data)
Definition: Transport.cpp:317
void UpdatePassengerPositions(PassengerSet const &passengers)
Definition: Transport.cpp:706
int32 GetMapIdForSpawning() const override
Definition: Transport.cpp:529
GameObject * CreateGOPassenger(ObjectGuid::LowType guid, GameObjectData const *data)
Definition: Transport.cpp:366
std::set< WorldObject * > PassengerSet
Definition: Transport.h:35
uint32 GetExpectedMapId() const
Returns id of the map that transport is expected to be on, according to current path progress.
Definition: Transport.cpp:737
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.
Definition: Transport.cpp:409
TransportTemplate const * _transportInfo
Definition: Transport.h:115
std::unique_ptr< boost::dynamic_bitset< uint8 > > _eventsToTrigger
Definition: Transport.h:117
PassengerSet _passengers
Definition: Transport.h:123
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:76
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition: Transport.cpp:167
Transport * RemovePassenger(WorldObject *passenger) override
Definition: Transport.cpp:299
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
Definition: UpdateField.h:683
Definition: Unit.h:627
Unit * GetVehicleBase() const
Definition: Unit.cpp:11480
void SetCreatedBySpell(int32 spellId)
Definition: Unit.h:847
void AddUnitState(uint32 f)
Definition: Unit.h:731
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:40
constexpr uint32 GetMapId() const
Definition: Position.h:201
Map * GetMap() const
Definition: Object.h:624
Map * FindMap() const
Definition: Object.h:625
PhaseShift & GetPhaseShift()
Definition: Object.h:523
std::string const & GetName() const
Definition: Object.h:555
void AddObjectToRemoveList()
Definition: Object.cpp:1824
void SetName(std::string newname)
Definition: Object.h:556
MovementInfo m_movementInfo
Definition: Object.h:761
void SetTransport(TransportBase *t)
Definition: Object.h:759
TC_GAME_API uint32 GetId(std::string_view username)
TC_GAME_API void Trigger(uint32 gameEventId, WorldObject *source, WorldObject *target)
uint32 GetGameTimeMS()
Definition: GameTime.cpp:49
TC_GAME_API HashMapHolder< Player >::MapType const & GetPlayers()
STL namespace.
Definition: Cell.h:47
bool DiffGrid(Cell const &cell) const
Definition: Cell.h:65
bool Rotation
Definition: Object.h:93
bool Stationary
Definition: Object.h:88
bool ServerTime
Definition: Object.h:90
struct GameObjectTemplate::@213::@230 moTransport
struct MovementInfo::TransportInfo transport
constexpr void SetOrientation(float orientation)
Definition: Position.h:71
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
bool IsPositionValid() const
Definition: Position.cpp:42
constexpr void Relocate(float x, float y)
Definition: Position.h:63
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
uint8 phaseUseFlags
Definition: SpawnData.h:106
uint32 phaseId
Definition: SpawnData.h:107
Position spawnPoint
Definition: SpawnData.h:105
int32 terrainSwapMap
Definition: SpawnData.h:109
uint32 phaseGroup
Definition: SpawnData.h:108
EnumFlag< SummonPropertiesFlags > GetFlags() const
void Update(int32 diff)
Definition: Timer.h:121
bool Passed() const
Definition: Timer.h:131
void Reset(int32 expiry)
Definition: Timer.h:136
uint32 GetNextPauseWaypointTimestamp(uint32 time) const
Optional< Position > ComputePosition(uint32 time, TransportMovementState *moveState, size_t *legIndex) const
std::vector< TransportPathEvent > Events
Definition: TransportMgr.h:97
TransportPathLeg const * GetLegForTime(uint32 time) const
std::vector< TransportPathLeg > PathLegs
Definition: TransportMgr.h:96
UpdateField< uint32, 0, 7 > SpawnTrackingStateAnimID