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

#include "Vehicle.h"

Inheritance diagram for Vehicle:
TransportBase

Public Member Functions

void Install ()
 
void Uninstall ()
 
void Reset (bool evading=false)
 
void InstallAllAccessories (bool evading)
 
void ApplyAllImmunities ()
 
void InstallAccessory (uint32 entry, int8 seatId, bool minion, uint8 type, uint32 summonTime)
 
UnitGetBase () const
 May be called from scripts.
 
VehicleEntry const * GetVehicleInfo () const
 
uint32 GetCreatureEntry () const
 
bool HasEmptySeat (int8 seatId) const
 
UnitGetPassenger (int8 seatId) const
 
int8 GetNextEmptySeat (int8 seatId, bool next) const
 
uint8 GetAvailableSeatCount () const
 
bool AddPassenger (Unit *passenger, int8 seatId=-1)
 
void EjectPassenger (Unit *passenger, Unit *controller)
 
void RemovePassenger (Unit *passenger)
 
void RelocatePassengers ()
 
void RemoveAllPassengers ()
 
void Dismiss ()
 
bool IsVehicleInUse ()
 
void TeleportVehicle (float x, float y, float z, float ang)
 
VehicleSeatEntry const * GetSeatForPassenger (Unit const *passenger)
 
SeatMap::iterator GetSeatIteratorForPassenger (Unit *passenger)
 
virtual void CalculatePassengerPosition (float &x, float &y, float &z, float *o=nullptr) const =0
 This method transforms supplied transport offsets into global coordinates.
 
virtual void CalculatePassengerOffset (float &x, float &y, float &z, float *o=nullptr) const =0
 This method transforms supplied global coordinates into local offsets.
 

Public Attributes

SeatMap Seats
 

Protected Member Functions

 Vehicle (Unit *unit, VehicleEntry const *vehInfo, uint32 creatureEntry)
 
 ~Vehicle () override
 
- Protected Member Functions inherited from TransportBase
 TransportBase ()=default
 
virtual ~TransportBase ()=default
 

Private Types

enum  Status {
  STATUS_NONE ,
  STATUS_INSTALLED ,
  STATUS_UNINSTALLING
}
 

Private Member Functions

void InitMovementInfoForBase ()
 
void CalculatePassengerPosition (float &x, float &y, float &z, float *o) const override
 This method transforms supplied transport offsets into global coordinates.
 
void CalculatePassengerOffset (float &x, float &y, float &z, float *o) const override
 This method transforms supplied global coordinates into local offsets.
 

Private Attributes

Unit_me
 
VehicleEntry const * _vehicleInfo
 
uint32 _usableSeatNum
 
uint32 _creatureEntry
 
Status _status
 

Friends

bool Unit::CreateVehicleKit (uint32 id, uint32 creatureEntry)
 
void Unit::RemoveVehicleKit ()
 

Additional Inherited Members

- 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)
 

Detailed Description

Member Enumeration Documentation

◆ Status

enum Vehicle::Status
private
Enumerator
STATUS_NONE 
STATUS_INSTALLED 
STATUS_UNINSTALLING 
70 {
74 };
@ STATUS_INSTALLED
Definition: Vehicle.h:72
@ STATUS_UNINSTALLING
Definition: Vehicle.h:73
@ STATUS_NONE
Definition: Vehicle.h:71

Constructor & Destructor Documentation

◆ Vehicle()

Vehicle::Vehicle ( Unit unit,
VehicleEntry const *  vehInfo,
uint32  creatureEntry 
)
protected
31 :
32 _me(unit), _vehicleInfo(vehInfo), _usableSeatNum(0), _creatureEntry(creatureEntry), _status(STATUS_NONE)
33{
34 for (uint32 i = 0; i < MAX_VEHICLE_SEATS; ++i)
35 {
36 if (uint32 seatId = _vehicleInfo->m_seatID[i])
37 if (VehicleSeatEntry const* veSeat = sVehicleSeatStore.LookupEntry(seatId))
38 {
39 Seats.insert(std::make_pair(i, VehicleSeat(veSeat)));
40 if (veSeat->CanEnterOrExit())
42 }
43 }
44
45 // Ulduar demolisher
46 if (vehInfo->m_ID == 338)
48
50}
std::uint32_t uint32
Definition: Define.h:108
DBCStorage< VehicleSeatEntry > sVehicleSeatStore(VehicleSeatEntryfmt)
Seats
Definition: boss_flame_leviathan.cpp:159
#define MAX_VEHICLE_SEATS
Definition: DBCStructure.h:2000
uint32 _usableSeatNum
Definition: Vehicle.h:96
void InitMovementInfoForBase()
Definition: Vehicle.cpp:569
uint32 _creatureEntry
Definition: Vehicle.h:97
Status _status
Definition: Vehicle.h:98
Unit * _me
Definition: Vehicle.h:94
VehicleEntry const * _vehicleInfo
Definition: Vehicle.h:95
Definition: VehicleDefines.h:79
uint32 m_seatID[MAX_VEHICLE_SEATS]
Definition: DBCStructure.h:2010
Definition: DBCStructure.h:2040

References _usableSeatNum, _vehicleInfo, InitMovementInfoForBase(), VehicleEntry::m_ID, VehicleEntry::m_seatID, MAX_VEHICLE_SEATS, and sVehicleSeatStore.

◆ ~Vehicle()

Vehicle::~Vehicle ( )
overrideprotected

@Uninstall must be called before this.

53{
56
57 for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
58 if (itr->second.Passenger.Guid)
59 {
60 if (Unit* unit = ObjectAccessor::GetUnit(*_me, itr->second.Passenger.Guid))
61 {
62 LOG_FATAL("vehicles", "Vehicle(), unit: {}, entry: {}, typeid: {}, this_entry: {}, this_typeid: {}!", unit->GetName(), unit->GetEntry(), unit->GetTypeId(), _me ? _me->GetEntry() : 0, _me ? _me->GetTypeId() : 0);
63 unit->_ExitVehicle();
64 }
65 else
66 LOG_FATAL("vehicles", "Vehicle(), unknown guid!");
67 }
68}
#define ASSERT
Definition: Errors.h:68
#define LOG_FATAL(filterType__,...)
Definition: Log.h:155
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:204
TypeID GetTypeId() const
Definition: Object.h:121
uint32 GetEntry() const
Definition: Object.h:109
Definition: Unit.h:1290

References _me, _status, ASSERT, Object::GetEntry(), Object::GetTypeId(), ObjectAccessor::GetUnit(), LOG_FATAL, and STATUS_UNINSTALLING.

Member Function Documentation

◆ AddPassenger()

bool Vehicle::AddPassenger ( Unit passenger,
int8  seatId = -1 
)

@Prevent adding passengers when vehicle is uninstalling. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.)

308{
311 {
312 LOG_DEBUG("vehicles", "Passenger {}, attempting to board vehicle {} during uninstall! SeatId: {}",
313 unit->GetGUID().ToString(), _me->GetGUID().ToString(), (int32)seatId);
314 return false;
315 }
316
317 if (unit->GetVehicle() != this)
318 return false;
319
320 SeatMap::iterator seat;
321 if (seatId < 0) // no specific seat requirement
322 {
323 for (seat = Seats.begin(); seat != Seats.end(); ++seat)
324 if (seat->second.IsEmpty() && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride()))
325 break;
326
327 if (seat == Seats.end()) // no available seat
328 return false;
329 }
330 else
331 {
332 seat = Seats.find(seatId);
333 if (seat == Seats.end())
334 return false;
335
336 if (!seat->second.IsEmpty())
337 {
338 if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger.Guid))
339 passenger->ExitVehicle();
340
341 seat->second.Passenger.Guid.Clear();
342 }
343
344 ASSERT(seat->second.IsEmpty());
345 }
346
347 if (!seat->second.SeatInfo)
348 return false;
349
350 LOG_DEBUG("vehicles", "Unit {} enter vehicle entry {} id {} ({}) seat {}",
351 unit->GetName(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUID().ToString(), (int32)seat->first);
352
353 seat->second.Passenger.Guid = unit->GetGUID();
354 seat->second.Passenger.IsUnselectable = unit->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
355
356 if (seat->second.SeatInfo->CanEnterOrExit())
357 {
360 if (!_usableSeatNum)
361 {
362 if (_me->GetTypeId() == TYPEID_PLAYER)
364 else
366 }
367 }
368
369 if (!_me || !_me->IsInWorld() || _me->IsDuringRemoveFromWorld())
370 return false;
371
372 // Xinef: moved from unit.cpp, if aura passes seatId == -1 (choose automaticly) we wont get appropriate flags
373 if (unit->GetTypeId() == TYPEID_PLAYER && !(seat->second.SeatInfo->m_flagsB & VEHICLE_SEAT_FLAG_B_KEEP_PET))
374 unit->ToPlayer()->UnsummonPetTemporaryIfAny();
375
376 if (seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE)
377 unit->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
378
379 unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
380 VehicleSeatEntry const* veSeat = seat->second.SeatInfo;
381 unit->m_movementInfo.transport.pos.Relocate(veSeat->m_attachmentOffsetX, veSeat->m_attachmentOffsetY, veSeat->m_attachmentOffsetZ);
382 unit->m_movementInfo.transport.time = 0;
383 unit->m_movementInfo.transport.seat = seat->first;
384 unit->m_movementInfo.transport.guid = _me->GetGUID();
385
386 // xinef: removed seat->first == 0 check...
387 if (_me->GetTypeId() == TYPEID_UNIT
388 && unit->GetTypeId() == TYPEID_PLAYER
389 && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
390 {
391 try
392 {
394 ABORT();
395 }
396 catch (...)
397 {
398 LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy()!");
399 LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). not null: {}", _me ? 1 : 0);
400 if (!_me)
401 return false;
402 LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Is: {}!", _me->IsInWorld());
403 LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Is2: {}!", _me->IsDuringRemoveFromWorld());
404 LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Unit {}!", _me->GetName());
405 LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). typeid: {}!", _me->GetTypeId());
406 LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Unit {}, typeid: {}, in world: {}, duringremove: {} has wrong CharmType! Charmer {}, typeid: {}, in world: {}, duringremove: {}.", _me->GetName(), _me->GetTypeId(), _me->IsInWorld(), _me->IsDuringRemoveFromWorld(), unit->GetName(), unit->GetTypeId(), unit->IsInWorld(), unit->IsDuringRemoveFromWorld());
407 return false;
408 }
409 }
410
411 if (_me->IsInWorld())
412 {
413 unit->SendClearTarget(); // SMSG_BREAK_TARGET
414 unit->SetControlled(true, UNIT_STATE_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures)
415 // also adds MOVEMENTFLAG_ROOT
416 Movement::MoveSplineInit init(unit);
417 init.DisableTransportPathTransformations();
418 init.MoveTo(veSeat->m_attachmentOffsetX, veSeat->m_attachmentOffsetY, veSeat->m_attachmentOffsetZ);
419 // Xinef: did not found anything unique in dbc, maybe missed something
420 if (veSeat->m_ID == 3566 || veSeat->m_ID == 3567 || veSeat->m_ID == 3568 || veSeat->m_ID == 3570)
421 {
422 float x = veSeat->m_attachmentOffsetX, y = veSeat->m_attachmentOffsetY, z = veSeat->m_attachmentOffsetZ, o;
423 CalculatePassengerPosition(x, y, z, &o);
424 init.SetFacing(_me->GetAngle(x, y));
425 }
426 else
427 init.SetFacing(0.0f);
428
429 init.SetTransportEnter();
430 init.Launch();
431
432 if (_me->GetTypeId() == TYPEID_UNIT)
433 {
434 if (_me->ToCreature()->IsAIEnabled)
435 _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true);
436 }
437 }
438
439 if (GetBase()->GetTypeId() == TYPEID_UNIT)
440 sScriptMgr->OnAddPassenger(this, unit, seatId);
441
442 // Remove parachute on vehicle switch
443 unit->RemoveAurasDueToSpell(VEHICLE_SPELL_PARACHUTE);
444 return true;
445}
#define ABORT
Definition: Errors.h:76
std::int32_t int32
Definition: Define.h:104
#define LOG_INFO(filterType__,...)
Definition: Log.h:167
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:171
@ TYPEID_UNIT
Definition: ObjectGuid.h:37
@ TYPEID_PLAYER
Definition: ObjectGuid.h:38
@ MOVEMENTFLAG_ONTRANSPORT
Definition: Unit.h:561
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: Unit.h:540
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition: Unit.h:541
@ CHARM_TYPE_VEHICLE
Definition: Unit.h:1077
@ UNIT_STATE_ROOT
Definition: Unit.h:335
@ UNIT_FLAG_NOT_SELECTABLE
Definition: Unit.h:473
@ VEHICLE_SPELL_PARACHUTE
Definition: VehicleDefines.h:54
#define sScriptMgr
Definition: ScriptMgr.h:2702
@ VEHICLE_SEAT_FLAG_CAN_CONTROL
Definition: DBCEnums.h:460
@ VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE
Definition: DBCEnums.h:469
@ VEHICLE_SEAT_FLAG_B_KEEP_PET
Definition: DBCEnums.h:491
virtual void PassengerBoarded(Unit *, int8, bool)
== Fields =======================================
Definition: CreatureAI.h:194
CreatureAI * AI() const
Definition: Creature.h:135
bool IsInWorld() const
Definition: Object.h:101
Creature * ToCreature()
Definition: Object.h:197
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
std::string const & GetName() const
Definition: Object.h:446
std::string ToString() const
Definition: ObjectGuid.cpp:47
float GetAngle(const Position *pos) const
Definition: Position.cpp:77
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:1648
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:2396
bool IsAIEnabled
Definition: Unit.h:2350
bool SetCharmedBy(Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
Definition: Unit.cpp:18518
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19896
Unit * GetBase() const
May be called from scripts.
Definition: Vehicle.h:39
void CalculatePassengerPosition(float &x, float &y, float &z, float *o) const override
This method transforms supplied transport offsets into global coordinates.
Definition: Vehicle.h:79
Definition: MoveSplineInit.h:71
uint32 m_ID
Definition: DBCStructure.h:2004
float m_attachmentOffsetX
Definition: DBCStructure.h:2044
uint32 m_ID
Definition: DBCStructure.h:2041
float m_attachmentOffsetY
Definition: DBCStructure.h:2045
float m_attachmentOffsetZ
Definition: DBCStructure.h:2046

References _me, _status, _usableSeatNum, _vehicleInfo, ABORT, Unit::AddUnitMovementFlag(), Creature::AI(), ASSERT, CalculatePassengerPosition(), CHARM_TYPE_VEHICLE, Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetAngle(), GetBase(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), ObjectAccessor::GetUnit(), Unit::GetVehicle(), MovementInfo::TransportInfo::guid, Unit::HasUnitFlag(), Unit::IsAIEnabled, Unit::IsDuringRemoveFromWorld(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), LOG_DEBUG, LOG_INFO, VehicleSeatEntry::m_attachmentOffsetX, VehicleSeatEntry::m_attachmentOffsetY, VehicleSeatEntry::m_attachmentOffsetZ, VehicleEntry::m_ID, VehicleSeatEntry::m_ID, WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), CreatureAI::PassengerBoarded(), MovementInfo::TransportInfo::pos, Position::Relocate(), Unit::RemoveAurasDueToSpell(), Unit::RemoveNpcFlag(), MovementInfo::TransportInfo::seat, Unit::SendClearTarget(), Unit::SetCharmedBy(), Unit::SetControlled(), Movement::MoveSplineInit::SetFacing(), Movement::MoveSplineInit::SetTransportEnter(), Unit::SetUnitFlag(), sScriptMgr, STATUS_UNINSTALLING, MovementInfo::TransportInfo::time, Object::ToCreature(), Object::ToPlayer(), ObjectGuid::ToString(), MovementInfo::transport, TYPEID_PLAYER, TYPEID_UNIT, UNIT_FLAG_NOT_SELECTABLE, UNIT_NPC_FLAG_PLAYER_VEHICLE, UNIT_NPC_FLAG_SPELLCLICK, UNIT_STATE_ROOT, Player::UnsummonPetTemporaryIfAny(), VEHICLE_SEAT_FLAG_B_KEEP_PET, VEHICLE_SEAT_FLAG_CAN_CONTROL, VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE, and VEHICLE_SPELL_PARACHUTE.

Referenced by Unit::_EnterVehicle(), and Unit::ChangeSeat().

◆ ApplyAllImmunities()

void Vehicle::ApplyAllImmunities ( )
139{
140 // This couldn't be done in DB, because some spells have MECHANIC_NONE
141
142 // Vehicles should be immune on Knockback ...
143 //_me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
144 //_me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
145
146 // Mechanical units & vehicles ( which are not Bosses, they have own immunities in DB ) should be also immune on healing ( exceptions in switch below )
148 {
149 // Heal & dispel ...
155
156 // ... Shield & Immunity grant spells ...
158 //_me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_UNATTACKABLE, true);
163
164 // ... Resistance, Split damage, Change stats ...
169
170 // Taunt
173 }
174
175 // Different immunities for vehicles goes below
176 switch (GetVehicleInfo()->m_ID)
177 {
178 case 160: //Isle of conquest turret
179 case 244: //Wintergrasp turret
180 case 510: // Isle of Conquest
181 case 452: // Isle of Conquest
182 case 543: // Isle of Conquest
183 //_me->SetControlled(true, UNIT_STATE_ROOT);
184 //me->AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
185 //me->SetSpeed(MOVE_TURN_RATE, 0.7f);
186 //me->SetSpeed(MOVE_PITCH_RATE, 0.7f);
187 //me->m_movementInfo.flags2=59;
189 break;
190 // Ulduar vehicles, remove immunities used in flame leviathan spells
191 case 335:
192 case 336:
193 case 338:
196 break;
197 default:
198 break;
199 }
200}
@ BATTLEFIELD_WG_ZONEID
Definition: BattlefieldWG.h:117
@ SPELL_AURA_DAMAGE_SHIELD
Definition: SpellAuraDefines.h:78
@ SPELL_AURA_MOD_RESISTANCE
Definition: SpellAuraDefines.h:85
@ SPELL_AURA_PERIODIC_HEAL
Definition: SpellAuraDefines.h:71
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition: SpellAuraDefines.h:150
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition: SpellAuraDefines.h:144
@ SPELL_AURA_MOD_STAT
Definition: SpellAuraDefines.h:92
@ SPELL_AURA_SCHOOL_IMMUNITY
Definition: SpellAuraDefines.h:102
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition: SpellAuraDefines.h:96
@ SPELL_AURA_SCHOOL_ABSORB
Definition: SpellAuraDefines.h:132
@ SPELL_EFFECT_HEAL
Definition: SharedDefines.h:760
@ SPELL_EFFECT_HEAL_MAX_HEALTH
Definition: SharedDefines.h:817
@ SPELL_EFFECT_DISPEL
Definition: SharedDefines.h:788
@ SPELL_EFFECT_ATTACK_ME
Definition: SharedDefines.h:864
@ SPELL_EFFECT_HEAL_PCT
Definition: SharedDefines.h:886
@ CREATURE_TYPE_MECHANICAL
Definition: SharedDefines.h:2608
@ MECHANIC_IMMUNE_SHIELD
Definition: SharedDefines.h:1326
@ MECHANIC_SHIELD
Definition: SharedDefines.h:1316
@ IMMUNITY_STATE
Definition: SharedDefines.h:1367
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1366
@ IMMUNITY_MECHANIC
Definition: SharedDefines.h:1371
bool isWorldBoss() const
Definition: Creature.h:115
ObjectGuid::LowType GetSpawnId() const
Definition: Creature.h:67
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:197
uint32 type
Definition: CreatureData.h:215
Map * FindMap() const
Definition: Object.h:518
uint32 GetZoneId() const
Definition: Object.cpp:3075
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13300
VehicleEntry const * GetVehicleInfo() const
Definition: Vehicle.h:40
bool Instanceable() const
Definition: Map.h:446

References _me, Unit::ApplySpellImmune(), BATTLEFIELD_WG_ZONEID, CREATURE_TYPE_MECHANICAL, WorldObject::FindMap(), Creature::GetCreatureTemplate(), Creature::GetSpawnId(), GetVehicleInfo(), WorldObject::GetZoneId(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, Map::Instanceable(), Creature::isWorldBoss(), MECHANIC_IMMUNE_SHIELD, MECHANIC_SHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_RESISTANCE, SPELL_AURA_MOD_STAT, SPELL_AURA_MOD_TAUNT, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SCHOOL_IMMUNITY, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_EFFECT_ATTACK_ME, SPELL_EFFECT_DISPEL, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEAL_MAX_HEALTH, SPELL_EFFECT_HEAL_PCT, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Reset().

◆ CalculatePassengerOffset()

void Vehicle::CalculatePassengerOffset ( float &  x,
float &  y,
float &  z,
float *  o 
) const
inlineoverrideprivatevirtual

This method transforms supplied global coordinates into local offsets.

Implements TransportBase.

88 {
90 GetBase()->GetPositionX(), GetBase()->GetPositionY(),
91 GetBase()->GetPositionZ(), GetBase()->GetOrientation());
92 }
virtual void CalculatePassengerOffset(float &x, float &y, float &z, float *o=nullptr) const =0
This method transforms supplied global coordinates into local offsets.

References TransportBase::CalculatePassengerOffset(), and GetBase().

◆ CalculatePassengerPosition()

void Vehicle::CalculatePassengerPosition ( float &  x,
float &  y,
float &  z,
float *  o 
) const
inlineoverrideprivatevirtual

This method transforms supplied transport offsets into global coordinates.

Implements TransportBase.

80 {
82 GetBase()->GetPositionX(), GetBase()->GetPositionY(),
83 GetBase()->GetPositionZ(), GetBase()->GetOrientation());
84 }
virtual void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const =0
This method transforms supplied transport offsets into global coordinates.

References TransportBase::CalculatePassengerPosition(), and GetBase().

Referenced by AddPassenger(), and RelocatePassengers().

◆ Dismiss()

void Vehicle::Dismiss ( )
527{
528 if (GetBase()->GetTypeId() != TYPEID_UNIT)
529 return;
530
531 LOG_DEBUG("vehicles", "Vehicle::Dismiss {}", _me->GetGUID().ToString());
532 Uninstall();
534}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer)
Definition: Creature.cpp:2108
void Uninstall()
Definition: Vehicle.cpp:99

References _me, Creature::DespawnOrUnsummon(), GetBase(), Object::GetGUID(), LOG_DEBUG, Object::ToCreature(), ObjectGuid::ToString(), TYPEID_UNIT, and Uninstall().

Referenced by Unit::_ExitVehicle(), BattlefieldWG::OnPlayerLeaveWar(), and Player::UpdateAreaDependentAuras().

◆ EjectPassenger()

void Vehicle::EjectPassenger ( Unit passenger,
Unit controller 
)

◆ GetAvailableSeatCount()

uint8 Vehicle::GetAvailableSeatCount ( ) const
606{
607 uint8 ret = 0;
608 SeatMap::const_iterator itr;
609 for (itr = Seats.begin(); itr != Seats.end(); ++itr)
610 if (itr->second.IsEmpty() && (itr->second.SeatInfo->CanEnterOrExit() || itr->second.SeatInfo->IsUsableByOverride()))
611 ++ret;
612
613 return ret;
614}
std::uint8_t uint8
Definition: Define.h:110

Referenced by Aura::CanStackWith(), and npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit().

◆ GetBase()

◆ GetCreatureEntry()

uint32 Vehicle::GetCreatureEntry ( ) const
inline

◆ GetNextEmptySeat()

int8 Vehicle::GetNextEmptySeat ( int8  seatId,
bool  next 
) const
236{
237 SeatMap::const_iterator seat = Seats.find(seatId);
238 if (seat == Seats.end())
239 return -1;
240
241 while (!seat->second.IsEmpty() || (!seat->second.SeatInfo->CanEnterOrExit() && !seat->second.SeatInfo->IsUsableByOverride()))
242 {
243 if (next)
244 {
245 ++seat;
246 if (seat == Seats.end())
247 seat = Seats.begin();
248 }
249 else
250 {
251 if (seat == Seats.begin())
252 seat = Seats.end();
253 --seat;
254 }
255
256 if (seat->first == seatId)
257 return -1; // no available seat
258 }
259
260 return seat->first;
261}

Referenced by Unit::ChangeSeat().

◆ GetPassenger()

Unit * Vehicle::GetPassenger ( int8  seatId) const
227{
228 SeatMap::const_iterator seat = Seats.find(seatId);
229 if (seat == Seats.end())
230 return nullptr;
231
232 return ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger.Guid);
233}

References GetBase(), and ObjectAccessor::GetUnit().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::spell_demolisher_ride_vehicle_SpellScript::CheckCast(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), SmartScript::GetTargets(), spell_switch_infragreen_bomber_station::spell_switch_infragreen_bomber_station_SpellScript::HandleDummy(), spell_q13280_13283_plant_battle_standard::HandleDummy(), spell_auto_repair::spell_auto_repair_SpellScript::HandleScript(), spell_q12919_gymers_throw::HandleScript(), InstallAccessory(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), spell_fight_fire_bomber::spell_fight_fire_bomber_SpellScript::PrepareSpellScript(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), and npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI().

◆ GetSeatForPassenger()

VehicleSeatEntry const * Vehicle::GetSeatForPassenger ( Unit const *  passenger)
586{
587 SeatMap::iterator itr;
588 for (itr = Seats.begin(); itr != Seats.end(); ++itr)
589 if (itr->second.Passenger.Guid == passenger->GetGUID())
590 return itr->second.SeatInfo;
591
592 return nullptr;
593}

References Object::GetGUID().

Referenced by Spell::CheckCast(), WorldSession::HandleChangeSeatsOnControlledVehicle(), WorldSession::HandleEjectPassenger(), and Player::ProcessTerrainStatusUpdate().

◆ GetSeatIteratorForPassenger()

SeatMap::iterator Vehicle::GetSeatIteratorForPassenger ( Unit passenger)
596{
597 SeatMap::iterator itr;
598 for (itr = Seats.begin(); itr != Seats.end(); ++itr)
599 if (itr->second.Passenger.Guid == passenger->GetGUID())
600 return itr;
601
602 return Seats.end();
603}

References Object::GetGUID().

Referenced by spell_switch_infragreen_bomber_station::spell_switch_infragreen_bomber_station_SpellScript::HandleDummy(), and RemovePassenger().

◆ GetVehicleInfo()

◆ HasEmptySeat()

bool Vehicle::HasEmptySeat ( int8  seatId) const
219{
220 SeatMap::const_iterator seat = Seats.find(seatId);
221 if (seat == Seats.end())
222 return false;
223 return seat->second.IsEmpty();
224}

Referenced by Unit::ChangeSeat().

◆ InitMovementInfoForBase()

void Vehicle::InitMovementInfoForBase ( )
private
570{
571 uint32 vehicleFlags = GetVehicleInfo()->m_flags;
572
573 if (vehicleFlags & VEHICLE_FLAG_NO_STRAFE)
575 if (vehicleFlags & VEHICLE_FLAG_NO_JUMPING)
577 if (vehicleFlags & VEHICLE_FLAG_FULLSPEEDTURNING)
579 if (vehicleFlags & VEHICLE_FLAG_ALLOW_PITCHING)
581 if (vehicleFlags & VEHICLE_FLAG_FULLSPEEDPITCHING)
583}
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition: Unit.h:613
@ MOVEMENTFLAG2_NO_STRAFE
Definition: Unit.h:608
@ MOVEMENTFLAG2_FULL_SPEED_PITCHING
Definition: Unit.h:612
@ MOVEMENTFLAG2_FULL_SPEED_TURNING
Definition: Unit.h:611
@ MOVEMENTFLAG2_NO_JUMPING
Definition: Unit.h:609
@ VEHICLE_FLAG_NO_JUMPING
Definition: VehicleDefines.h:42
@ VEHICLE_FLAG_NO_STRAFE
Definition: VehicleDefines.h:41
@ VEHICLE_FLAG_FULLSPEEDTURNING
Definition: VehicleDefines.h:43
@ VEHICLE_FLAG_ALLOW_PITCHING
Definition: VehicleDefines.h:44
@ VEHICLE_FLAG_FULLSPEEDPITCHING
Definition: VehicleDefines.h:45
void AddExtraUnitMovementFlag(uint16 f)
Definition: Unit.h:2278
uint32 m_flags
Definition: DBCStructure.h:2005

References _me, Unit::AddExtraUnitMovementFlag(), GetVehicleInfo(), VehicleEntry::m_flags, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_FULL_SPEED_PITCHING, MOVEMENTFLAG2_FULL_SPEED_TURNING, MOVEMENTFLAG2_NO_JUMPING, MOVEMENTFLAG2_NO_STRAFE, VEHICLE_FLAG_ALLOW_PITCHING, VEHICLE_FLAG_FULLSPEEDPITCHING, VEHICLE_FLAG_FULLSPEEDTURNING, VEHICLE_FLAG_NO_JUMPING, and VEHICLE_FLAG_NO_STRAFE.

Referenced by Vehicle().

◆ Install()

void Vehicle::Install ( )
71{
72 if (_me->GetTypeId() == TYPEID_UNIT)
73 {
74 if (PowerDisplayEntry const* powerDisplay = sPowerDisplayStore.LookupEntry(_vehicleInfo->m_powerDisplayId))
75 _me->setPowerType(Powers(powerDisplay->PowerType));
76 else if (_me->getClass() == CLASS_ROGUE)
78 }
79
81 if (GetBase()->GetTypeId() == TYPEID_UNIT)
82 sScriptMgr->OnInstall(this);
83}
DBCStorage< PowerDisplayEntry > sPowerDisplayStore(PowerDisplayfmt)
Powers
Definition: SharedDefines.h:240
@ POWER_ENERGY
Definition: SharedDefines.h:244
@ CLASS_ROGUE
Definition: SharedDefines.h:116
uint8 getClass() const
Definition: Unit.h:1426
void setPowerType(Powers power)
Definition: Unit.cpp:9952
Definition: DBCStructure.h:1404
uint32 m_powerDisplayId
Definition: DBCStructure.h:2034

References _me, _status, _vehicleInfo, CLASS_ROGUE, GetBase(), Unit::getClass(), Object::GetTypeId(), VehicleEntry::m_powerDisplayId, POWER_ENERGY, Unit::setPowerType(), sPowerDisplayStore, sScriptMgr, STATUS_INSTALLED, and TYPEID_UNIT.

Referenced by Creature::AddToWorld().

◆ InstallAccessory()

void Vehicle::InstallAccessory ( uint32  entry,
int8  seatId,
bool  minion,
uint8  type,
uint32  summonTime 
)

@Prevent adding accessories when vehicle is uninstalling. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.)

264{
267 {
268 LOG_ERROR("vehicles", "Vehicle {} attempts to install accessory Entry: {} on seat {} with STATUS_UNINSTALLING! "
269 "Check Uninstall/PassengerBoarded script hooks for errors.", _me->GetGUID().ToString(), entry, (int32)seatId);
270 return;
271 }
272
273 LOG_DEBUG("vehicles", "Vehicle: Installing accessory entry {} on vehicle entry {} (seat:{})", entry, GetCreatureEntry(), seatId);
274 if (Unit* passenger = GetPassenger(seatId))
275 {
276 // already installed
277 if (passenger->GetEntry() == entry)
278 {
279 ASSERT(passenger->GetTypeId() == TYPEID_UNIT);
280 if (_me->GetTypeId() == TYPEID_UNIT)
281 {
282 if (_me->ToCreature()->IsInEvadeMode() && passenger->ToCreature()->IsAIEnabled)
283 passenger->ToCreature()->AI()->EnterEvadeMode();
284 return;
285 }
286 }
287 else
288 passenger->ExitVehicle(); // this should not happen
289 }
290
291 if (TempSummon* accessory = _me->SummonCreature(entry, *_me, TempSummonType(type), summonTime))
292 {
293 if (minion)
294 accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY);
295
296 if (!_me->HandleSpellClick(accessory, seatId))
297 {
298 accessory->UnSummon();
299 return;
300 }
301
302 if (GetBase()->GetTypeId() == TYPEID_UNIT)
303 sScriptMgr->OnInstallAccessory(this, accessory);
304 }
305}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:159
TempSummonType
Definition: Object.h:41
@ UNIT_MASK_ACCESSORY
Definition: Unit.h:684
bool IsInEvadeMode() const
Definition: Creature.h:129
Definition: TemporarySummon.h:40
TempSummon * SummonCreature(uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
Definition: Object.cpp:2318
bool HandleSpellClick(Unit *clicker, int8 seatId=-1)
Definition: Unit.cpp:19713
Unit * GetPassenger(int8 seatId) const
Definition: Vehicle.cpp:226
uint32 GetCreatureEntry() const
Definition: Vehicle.h:41

References _me, _status, ASSERT, GetBase(), GetCreatureEntry(), Object::GetGUID(), GetPassenger(), Object::GetTypeId(), Unit::HandleSpellClick(), Creature::IsInEvadeMode(), LOG_DEBUG, LOG_ERROR, sScriptMgr, STATUS_UNINSTALLING, WorldObject::SummonCreature(), Object::ToCreature(), ObjectGuid::ToString(), TYPEID_UNIT, and UNIT_MASK_ACCESSORY.

Referenced by InstallAllAccessories().

◆ InstallAllAccessories()

void Vehicle::InstallAllAccessories ( bool  evading)
86{
87 if (GetBase()->GetTypeId() == TYPEID_PLAYER || !evading)
88 RemoveAllPassengers(); // We might have aura's saved in the DB with now invalid casters - remove
89
90 VehicleAccessoryList const* accessories = sObjectMgr->GetVehicleAccessoryList(this);
91 if (!accessories)
92 return;
93
94 for (VehicleAccessoryList::const_iterator itr = accessories->begin(); itr != accessories->end(); ++itr)
95 if (!evading || itr->IsMinion) // only install minions on evade mode
96 InstallAccessory(itr->AccessoryEntry, itr->SeatId, itr->IsMinion, itr->SummonedType, itr->SummonTime);
97}
std::vector< VehicleAccessory > VehicleAccessoryList
Definition: VehicleDefines.h:102
#define sObjectMgr
Definition: ObjectMgr.h:1640
void RemoveAllPassengers()
Definition: Vehicle.cpp:202
void InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 type, uint32 summonTime)
Definition: Vehicle.cpp:263

References GetBase(), InstallAccessory(), RemoveAllPassengers(), sObjectMgr, and TYPEID_PLAYER.

Referenced by boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::EnterEvadeMode(), Unit::Mount(), Reset(), and npc_hyldsmeet_protodrake::npc_hyldsmeet_protodrakeAI::UpdateAI().

◆ IsVehicleInUse()

bool Vehicle::IsVehicleInUse ( )
537{
538 for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
539 if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.Passenger.Guid))
540 {
541 if (passenger->GetTypeId() == TYPEID_PLAYER)
542 return true;
543 else if (passenger->GetTypeId() == TYPEID_UNIT && passenger->GetVehicleKit() && passenger->GetVehicleKit()->IsVehicleInUse())
544 return true;
545 }
546
547 return false;
548}

References GetBase(), ObjectAccessor::GetUnit(), TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by VehicleAI::OnCharmed().

◆ RelocatePassengers()

void Vehicle::RelocatePassengers ( )
502{
503 ASSERT(_me->GetMap());
504
505 std::vector<std::pair<Unit*, Position>> seatRelocation;
506 seatRelocation.reserve(Seats.size());
507
508 // not sure that absolute position calculation is correct, it must depend on vehicle pitch angle
509 for (auto const& itr : Seats)
510 {
511 if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr.second.Passenger.Guid))
512 {
513 ASSERT(passenger->IsInWorld());
514
515 float px, py, pz, po;
516 passenger->m_movementInfo.transport.pos.GetPosition(px, py, pz, po);
517 CalculatePassengerPosition(px, py, pz, &po);
518 seatRelocation.emplace_back(passenger, Position(px, py, pz, po));
519 }
520 }
521
522 for (auto const& pair : seatRelocation)
523 pair.first->UpdatePosition(pair.second);
524}
Map * GetMap() const
Definition: Object.h:517
Definition: Position.h:28

References _me, ASSERT, CalculatePassengerPosition(), GetBase(), WorldObject::GetMap(), and ObjectAccessor::GetUnit().

Referenced by Map::CreatureRelocation(), Map::PlayerRelocation(), Unit::UpdateHeight(), and Unit::UpdateOrientation().

◆ RemoveAllPassengers()

void Vehicle::RemoveAllPassengers ( )
203{
204 LOG_DEBUG("vehicles", "Vehicle::RemoveAllPassengers. {}", _me->GetGUID().ToString());
205
206 // Passengers always cast an aura with SPELL_AURA_CONTROL_VEHICLE on the vehicle
207 // We just remove the aura and the unapply handler will make the target leave the vehicle.
208 // We don't need to iterate over Seats
210
211 // Following the above logic, this assertion should NEVER fail.
212 // Even in 'hacky' cases, there should at least be VEHICLE_SPELL_RIDE_HARDCODED on us.
213 // SeatMap::const_iterator itr;
214 // for (itr = Seats.begin(); itr != Seats.end(); ++itr)
215 // ASSERT(!itr->second.passenger.Guid);
216}
@ SPELL_AURA_CONTROL_VEHICLE
Definition: SpellAuraDefines.h:299
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5025

References _me, Object::GetGUID(), LOG_DEBUG, Unit::RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, and ObjectGuid::ToString().

Referenced by InstallAllAccessories(), and Uninstall().

◆ RemovePassenger()

void Vehicle::RemovePassenger ( Unit passenger)
448{
449 if (unit->GetVehicle() != this)
450 return;
451
452 SeatMap::iterator seat = GetSeatIteratorForPassenger(unit);
453 // it can happen that unit enters vehicle and removes owner passenger
454 // then vehicles is dissmised and removes all existing passengers, even the unit (vehicle has aura of unit)
455 // but the unit is not on the vehicles seat yet, thus crashing at ASSERT(seat != Seats.end());
456 // ASSERT(seat != Seats.end());
457 if (seat == Seats.end())
458 {
459 LOG_ERROR("vehicles", "Vehicle::RemovePassenger: Vehicle entry ({}) id ({}) is dissmised and removed all existing passangers, but the unit ({}) was not on the vehicle!",
460 _me->GetEntry(), _vehicleInfo->m_ID, unit->GetName());
461 return;
462 }
463
464 LOG_DEBUG("vehicles", "Unit {} exit vehicle entry {} id {} ({}) seat {}",
465 unit->GetName(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUID().ToString(), (int32)seat->first);
466
467 if (seat->second.SeatInfo->CanEnterOrExit() && ++_usableSeatNum)
469
470 // Remove UNIT_FLAG_NOT_SELECTABLE if passenger did not have it before entering vehicle
471 if (seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUnselectable)
472 unit->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
473
474 seat->second.Passenger.Reset();
475
476 if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
477 _me->RemoveCharmedBy(unit);
478
479 if (_me->IsInWorld())
480 {
481 if (!_me->GetTransport())
482 {
483 unit->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
484 unit->m_movementInfo.transport.Reset();
485 }
486 else
487 unit->m_movementInfo.transport = _me->m_movementInfo.transport;
488 }
489
490 // only for flyable vehicles
491 if (_me->IsFlying() && !_me->GetInstanceId() && unit->GetTypeId() == TYPEID_PLAYER && !(unit->ToPlayer()->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT) && _me->GetEntry() != 30275 /*NPC_WILD_WYRM*/)
493
495 _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false);
496
497 if (_me && _me->GetTypeId() == TYPEID_UNIT)
498 sScriptMgr->OnRemovePassenger(this, unit);
499}
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:901
struct MovementInfo::TransportInfo transport
uint32 GetInstanceId() const
Definition: Object.h:431
Transport * GetTransport() const
Definition: Object.h:585
MovementInfo m_movementInfo
Definition: Object.h:595
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:1647
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1169
void RemoveCharmedBy(Unit *charmer)
Definition: Unit.cpp:18720
bool IsFlying() const
Definition: Unit.h:2385
SeatMap::iterator GetSeatIteratorForPassenger(Unit *passenger)
Definition: Vehicle.cpp:595

References _me, _usableSeatNum, _vehicleInfo, Creature::AI(), Unit::CastSpell(), DELAYED_VEHICLE_TELEPORT, Player::GetDelayedOperations(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetInstanceId(), WorldObject::GetName(), GetSeatIteratorForPassenger(), WorldObject::GetTransport(), Object::GetTypeId(), Unit::GetVehicle(), Unit::IsAIEnabled, Unit::IsFlying(), Object::IsInWorld(), LOG_DEBUG, LOG_ERROR, VehicleEntry::m_ID, WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, CreatureAI::PassengerBoarded(), Unit::RemoveCharmedBy(), Unit::RemoveUnitFlag(), Unit::RemoveUnitMovementFlag(), MovementInfo::TransportInfo::Reset(), Unit::SetNpcFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), ObjectGuid::ToString(), MovementInfo::transport, TYPEID_PLAYER, TYPEID_UNIT, UNIT_FLAG_NOT_SELECTABLE, UNIT_NPC_FLAG_PLAYER_VEHICLE, UNIT_NPC_FLAG_SPELLCLICK, VEHICLE_SEAT_FLAG_CAN_CONTROL, VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE, and VEHICLE_SPELL_PARACHUTE.

Referenced by Unit::_ExitVehicle(), and Unit::ChangeSeat().

◆ Reset()

void Vehicle::Reset ( bool  evading = false)
119{
120 LOG_DEBUG("vehicles", "Vehicle::Reset: {}", _me->GetGUID().ToString());
121 if (_me->GetTypeId() == TYPEID_PLAYER)
122 {
123 if (_usableSeatNum)
125 }
126 else
127 {
129 InstallAllAccessories(evading);
130 if (_usableSeatNum)
132 }
133
134 if (GetBase()->GetTypeId() == TYPEID_UNIT)
135 sScriptMgr->OnReset(this);
136}
void ApplyAllImmunities()
Definition: Vehicle.cpp:138
void InstallAllAccessories(bool evading)
Definition: Vehicle.cpp:85

References _me, _usableSeatNum, ApplyAllImmunities(), GetBase(), Object::GetGUID(), Object::GetTypeId(), InstallAllAccessories(), LOG_DEBUG, Unit::SetNpcFlag(), sScriptMgr, ObjectGuid::ToString(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Creature::AIM_Initialize(), CreatureAI::EnterEvadeMode(), Unit::Mount(), and Creature::Update().

◆ TeleportVehicle()

void Vehicle::TeleportVehicle ( float  x,
float  y,
float  z,
float  ang 
)
551{
552 _me->GetMap()->LoadGrid(x, y);
553 _me->NearTeleportTo(x, y, z, ang, true);
554
555 for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
556 if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.Passenger.Guid))
557 {
558 if (passenger->GetTypeId() == TYPEID_PLAYER)
559 {
560 passenger->ToPlayer()->SetMover(passenger);
561 passenger->NearTeleportTo(x, y, z, ang, false, true);
562 passenger->ToPlayer()->ScheduleDelayedOperation(DELAYED_VEHICLE_TELEPORT);
563 }
564 else if (passenger->GetTypeId() == TYPEID_UNIT && passenger->GetVehicleKit())
565 passenger->GetVehicleKit()->TeleportVehicle(x, y, z, ang);
566 }
567}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition: Unit.cpp:20148
void LoadGrid(float x, float y)
Definition: Map.cpp:494

References _me, DELAYED_VEHICLE_TELEPORT, GetBase(), WorldObject::GetMap(), ObjectAccessor::GetUnit(), Map::LoadGrid(), Unit::NearTeleportTo(), TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by Spell::EffectTeleportUnits().

◆ Uninstall()

void Vehicle::Uninstall ( )

@Prevent recursive uninstall call. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.)

100{
102 if (_status == STATUS_UNINSTALLING && !GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
103 {
104 LOG_ERROR("vehicles", "Vehicle {} attempts to uninstall, but already has STATUS_UNINSTALLING! "
105 "Check Uninstall/PassengerBoarded script hooks for errors.", _me->GetGUID().ToString());
106 return;
107 }
109 LOG_DEBUG("vehicles", "Vehicle::Uninstall {}", _me->GetGUID().ToString());
111
112 if (_me && _me->GetTypeId() == TYPEID_UNIT)
113 {
114 sScriptMgr->OnUninstall(this);
115 }
116}
@ UNIT_MASK_MINION
Definition: Unit.h:676

References _me, _status, GetBase(), Object::GetGUID(), Object::GetTypeId(), LOG_DEBUG, LOG_ERROR, RemoveAllPassengers(), sScriptMgr, STATUS_UNINSTALLING, ObjectGuid::ToString(), TYPEID_UNIT, and UNIT_MASK_MINION.

Referenced by Unit::_ExitVehicle(), Dismiss(), and Unit::RemoveVehicleKit().

Friends And Related Function Documentation

◆ Unit::CreateVehicleKit

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)
friend

◆ Unit::RemoveVehicleKit

void Unit::RemoveVehicleKit ( )
friend

Member Data Documentation

◆ _creatureEntry

uint32 Vehicle::_creatureEntry
private

Referenced by GetCreatureEntry().

◆ _me

◆ _status

Status Vehicle::_status
private

◆ _usableSeatNum

uint32 Vehicle::_usableSeatNum
private

◆ _vehicleInfo

VehicleEntry const* Vehicle::_vehicleInfo
private

◆ Seats