TrinityCore
Loading...
Searching...
No Matches
BaseEntity.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 "BaseEntity.h"
19#include "Conversation.h"
20#include "DB2Structure.h"
21#include "Errors.h"
22#include "GameTime.h"
23#include "Log.h"
24#include "MovementPackets.h"
25#include "Player.h"
26#include "SmoothPhasing.h"
27#include "Transport.h"
28#include "UpdateData.h"
29#include "Vehicle.h"
30
31namespace WowCS
32{
34{
36 {
50 }
52}
53
54BaseEntity::BaseEntity() = default;
55
57{
58 if (IsInWorld())
59 {
60 TC_LOG_FATAL("misc", "BaseEntity::~BaseEntity {} deleted but still in world!!", GetGUID());
61 ABORT();
62 }
63
65 {
66 TC_LOG_FATAL("misc", "BaseEntity::~BaseEntity {} deleted but still in update list!!", GetGUID());
67 ABORT();
68 }
69}
70
72{
73 if (m_inWorld)
74 return;
75
76 m_inWorld = true;
77
78 // synchronize values mirror with values array (changes will send in updatecreate opcode any way
80 ClearUpdateMask(false);
81}
82
84{
85 if (!m_inWorld)
86 return;
87
88 m_inWorld = false;
89
90 // if we remove from world then sending changes not required
91 ClearUpdateMask(true);
92}
93
95{
96 if (!target)
97 return;
98
100 uint8 objectType = m_objectTypeId;
102
103 if (target == this) // building packet for yourself
104 {
105 flags.ThisIsYou = true;
106 flags.ActivePlayer = true;
107 objectType = TYPEID_ACTIVE_PLAYER;
108 }
109
110 if (IsWorldObject())
111 {
112 WorldObject const* worldObject = static_cast<WorldObject const*>(this);
113 if (worldObject->GetSmoothPhasing() && worldObject->GetSmoothPhasing()->GetInfoForSeer(target->GetGUID()))
114 flags.SmoothPhasing = true;
115 }
116
117 ByteBuffer& buf = data->GetBuffer();
118 buf << uint8(updateType);
119 buf << GetGUID();
120 buf << uint8(objectType);
121
122 BuildMovementUpdate(buf, flags, target);
123
124 UF::UpdateFieldFlag fieldFlags = GetUpdateFieldFlagsFor(target);
125 std::size_t sizePos = buf.wpos();
126 buf << uint32(0);
127 buf << uint8(fieldFlags);
129
130 for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
131 {
133 if (WowCS::IsIndirectFragment(fragmentId))
134 buf << uint8(1); // IndirectFragmentActive
135
137 m_entityFragments.Updateable.Data[i], fieldFlags, buf, target, this);
138 }
139
140 buf.put<uint32>(sizePos, buf.wpos() - sizePos - 4);
141
142 data->AddUpdateBlock();
143}
144
146{
147 // send create update to player
148 UpdateData upd(player->GetMapId());
149 WorldPacket packet;
150
151 if (player->HaveAtClient(this))
153 else
155 upd.BuildPacket(&packet);
156 player->SendDirectMessage(&packet);
157}
158
160{
162
164 std::size_t sizePos = buf.wpos();
165 buf << uint32(0);
166 buf << uint8(fieldFlags.HasFlag(UF::UpdateFieldFlag::Owner));
169 {
172 }
174
175 for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
176 {
178 continue;
179
181 m_entityFragments.Updateable.Data[i], fieldFlags, buf, target, this);
182 }
183
184 buf.put<uint32>(sizePos, buf.wpos() - sizePos - 4);
185
186 data->AddUpdateBlock();
187}
188
189inline void BaseEntity::BuildEntityFragments(ByteBuffer& data, std::span<WowCS::EntityFragment const> fragments)
190{
191 data.append(fragments.data(), fragments.size());
193}
194
199
204
206{
207 ByteBuffer& buffer = data->GetBuffer();
208 buffer << uint8(UPDATETYPE_VALUES);
209 buffer << GetGUID();
210 return buffer;
211}
212
213void BaseEntity::DestroyForPlayer(Player const* target) const
214{
215 ASSERT(target);
216
217 UpdateData updateData(target->GetMapId());
218 BuildDestroyUpdateBlock(&updateData);
219 WorldPacket packet;
220 updateData.BuildPacket(&packet);
221 target->SendDirectMessage(&packet);
222}
223
225{
226 ASSERT(target);
227
228 UpdateData updateData(target->GetMapId());
229 BuildOutOfRangeUpdateBlock(&updateData);
230 WorldPacket packet;
231 updateData.BuildPacket(&packet);
232 target->SendDirectMessage(&packet);
233}
234
236{
237 std::span<uint32 const> PauseTimes;
238 if (IsGameObject())
239 PauseTimes = static_cast<GameObject const*>(this)->GetPauseTimes();
240
241 data.WriteBit(flags.HasEntityPosition);
242 data.WriteBit(flags.NoBirthAnim);
243 data.WriteBit(flags.EnablePortals);
244 data.WriteBit(flags.PlayHoverAnim);
245 data.WriteBit(flags.ThisIsYou);
246 data.WriteBit(flags.MovementUpdate);
247 data.WriteBit(flags.MovementTransport);
248 data.WriteBit(flags.Stationary);
249 data.WriteBit(flags.CombatVictim);
250 data.WriteBit(flags.ServerTime);
251 data.WriteBit(flags.Vehicle);
252 data.WriteBit(flags.AnimKit);
253 data.WriteBit(flags.Rotation);
254 data.WriteBit(flags.GameObject);
255 data.WriteBit(flags.SmoothPhasing);
256 data.WriteBit(flags.SceneObject);
257 data.WriteBit(flags.ActivePlayer);
258 data.WriteBit(flags.Conversation);
259 data.WriteBit(flags.Room);
260 data.WriteBit(flags.Decor);
261 data.WriteBit(flags.MeshObject);
262 data.FlushBits();
263
264 data << uint32(PauseTimes.size());
265
266 if (flags.MovementUpdate)
267 {
268 Unit const* unit = static_cast<Unit const*>(this);
269 bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
270 bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0;
271 bool HasSpline = unit->IsSplineEnabled();
272 bool HasInertia = unit->m_movementInfo.inertia.has_value();
273 bool HasAdvFlying = unit->m_movementInfo.advFlying.has_value();
274 bool HasDriveStatus = unit->m_movementInfo.driveStatus.has_value();
275 bool HasStandingOnGameObjectGUID = unit->m_movementInfo.standingOnGameObjectGUID.has_value();
276
277 data << GetGUID(); // MoverGUID
278
279 data << uint64(unit->GetUnitMovementFlags());
280
281 data << uint32(unit->m_movementInfo.time); // MoveTime
282 data << float(unit->GetPositionX());
283 data << float(unit->GetPositionY());
284 data << float(unit->GetPositionZ());
285 data << float(unit->GetOrientation());
286
287 data << float(unit->m_movementInfo.pitch); // Pitch
288 data << float(unit->m_movementInfo.stepUpStartElevation); // StepUpStartElevation
289
290 data << uint32(0); // RemoveForcesIDs.size()
291 data << uint32(0); // MoveIndex
292
293 data << float(unit->m_movementInfo.gravityModifier); // GravityModifier
294
295 //for (std::size_t i = 0; i < RemoveForcesIDs.size(); ++i)
296 // data << ObjectGuid(RemoveForcesIDs);
297
298 data.WriteBit(HasStandingOnGameObjectGUID); // HasStandingOnGameObjectGUID
299 data.WriteBit(!unit->m_movementInfo.transport.guid.IsEmpty()); // HasTransport
300 data.WriteBit(HasFall); // HasFall
301 data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement
302 data.WriteBit(false); // HeightChangeFailed
303 data.WriteBit(false); // RemoteTimeValid
304 data.WriteBit(HasInertia); // HasInertia
305 data.WriteBit(HasAdvFlying); // HasAdvFlying
306 data.WriteBit(HasDriveStatus); // HasDriveStatus
307 data.FlushBits();
308
309 if (HasStandingOnGameObjectGUID)
311
313 data << unit->m_movementInfo.transport;
314
315 if (HasFall)
316 {
317 data << uint32(unit->m_movementInfo.jump.fallTime); // Time
318 data << float(unit->m_movementInfo.jump.zspeed); // JumpVelocity
319
320 if (data.WriteBit(HasFallDirection))
321 {
322 data << float(unit->m_movementInfo.jump.sinAngle); // Direction
323 data << float(unit->m_movementInfo.jump.cosAngle);
324 data << float(unit->m_movementInfo.jump.xyspeed); // Speed
325 }
326 }
327
328 if (HasInertia)
329 {
330 data << unit->m_movementInfo.inertia->id;
331 data << unit->m_movementInfo.inertia->force.PositionXYZStream();
332 data << uint32(unit->m_movementInfo.inertia->lifetime);
333 }
334
335 if (HasAdvFlying)
336 {
337 data << float(unit->m_movementInfo.advFlying->forwardVelocity);
338 data << float(unit->m_movementInfo.advFlying->upVelocity);
339 }
340
341 if (HasDriveStatus)
342 {
343 data << float(unit->m_movementInfo.driveStatus->speed);
344 data << float(unit->m_movementInfo.driveStatus->movementAngle);
345 data.WriteBit(unit->m_movementInfo.driveStatus->accelerating);
346 data.WriteBit(unit->m_movementInfo.driveStatus->drifting);
347 data.FlushBits();
348 }
349
350 data << float(unit->GetSpeed(MOVE_WALK));
351 data << float(unit->GetSpeed(MOVE_RUN));
352 data << float(unit->GetSpeed(MOVE_RUN_BACK));
353 data << float(unit->GetSpeed(MOVE_SWIM));
354 data << float(unit->GetSpeed(MOVE_SWIM_BACK));
355 data << float(unit->GetSpeed(MOVE_FLIGHT));
356 data << float(unit->GetSpeed(MOVE_FLIGHT_BACK));
357 data << float(unit->GetSpeed(MOVE_TURN_RATE));
358 data << float(unit->GetSpeed(MOVE_PITCH_RATE));
359
360 if (MovementForces const* movementForces = unit->GetMovementForces())
361 {
362 data << uint32(movementForces->GetForces()->size());
363 data << float(movementForces->GetModMagnitude()); // MovementForcesModMagnitude
364 }
365 else
366 {
367 data << uint32(0);
368 data << float(1.0f); // MovementForcesModMagnitude
369 }
370
371 data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_AIR_FRICTION));
372 data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_MAX_VEL));
377 data << float(unit->GetAdvFlyingSpeedMin(ADV_FLYING_BANKING_RATE));
378 data << float(unit->GetAdvFlyingSpeedMax(ADV_FLYING_BANKING_RATE));
388
389 if (MovementForces const* movementForces = unit->GetMovementForces())
390 for (MovementForce const& force : *movementForces->GetForces())
392
393 data.WriteBit(HasSpline);
394 data.FlushBits();
395
396 if (HasSpline)
398 }
399
400 if (flags.MovementTransport)
401 {
402 WorldObject const* self = static_cast<WorldObject const*>(this);
403 data << self->m_movementInfo.transport;
404 }
405
406 if (flags.Stationary)
407 {
408 WorldObject const* self = static_cast<WorldObject const*>(this);
410 }
411
412 if (flags.CombatVictim)
413 {
414 Unit const* unit = static_cast<Unit const*>(this);
415 data << unit->GetVictim()->GetGUID(); // CombatVictim
416 }
417
418 if (flags.ServerTime)
420
421 if (flags.Vehicle)
422 {
423 Unit const* unit = static_cast<Unit const*>(this);
424 data << uint32(unit->GetVehicleKit()->GetVehicleInfo()->ID); // RecID
425 data << float(unit->GetOrientation()); // InitialRawFacing
426 }
427
428 if (flags.AnimKit)
429 {
430 WorldObject const* self = static_cast<WorldObject const*>(this);
431 data << uint16(self->GetAIAnimKitId()); // AiID
432 data << uint16(self->GetMovementAnimKitId()); // MovementID
433 data << uint16(self->GetMeleeAnimKitId()); // MeleeID
434 }
435
436 if (flags.Rotation)
437 {
438 GameObject const* gameObject = static_cast<GameObject const*>(this);
439 data << uint64(gameObject->GetPackedLocalRotation()); // Rotation
440 }
441
442 if (flags.GameObject)
443 {
444 GameObject const* gameObject = static_cast<GameObject const*>(this);
445
446 bool bit8 = false;
447 bool isTransport = gameObject->GetGOInfo()->type == GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT;
448
449 data << uint32(gameObject->GetWorldEffectID());
450
451 data.WriteBit(bit8);
452 data.WriteBit(isTransport);
453 data.WriteBit(gameObject->GetPathProgressForClient().has_value());
454 data.FlushBits();
455 if (isTransport)
456 {
457 Transport const* transport = static_cast<Transport const*>(gameObject);
458 uint32 period = transport->GetTransportPeriod();
459
460 data << uint32((((int64(transport->GetTimer()) - int64(GameTime::GetGameTimeMS())) % period) + period) % period); // TimeOffset
461 data << uint32(transport->GetNextStopTimestamp().value_or(0));
462 data.WriteBit(transport->GetNextStopTimestamp().has_value());
463 data.WriteBit(transport->IsStopped());
464 data.WriteBit(false);
465 data.FlushBits();
466 }
467
468 if (bit8)
469 data << uint32(0);
470
471 if (gameObject->GetPathProgressForClient())
472 data << float(*gameObject->GetPathProgressForClient());
473 }
474
475 if (flags.SmoothPhasing)
476 {
477 SmoothPhasingInfo const* smoothPhasingInfo = static_cast<WorldObject const*>(this)->GetSmoothPhasing()->GetInfoForSeer(target->GetGUID());
478 ASSERT(smoothPhasingInfo);
479
480 data.WriteBit(smoothPhasingInfo->ReplaceActive);
481 data.WriteBit(smoothPhasingInfo->StopAnimKits);
482 data.WriteBit(smoothPhasingInfo->ReplaceObject.has_value());
483 data.FlushBits();
484 if (smoothPhasingInfo->ReplaceObject)
485 data << *smoothPhasingInfo->ReplaceObject;
486 }
487
488 if (flags.SceneObject)
489 {
490 data.WriteBit(false); // HasLocalScriptData
491 data.WriteBit(false); // HasPetBattleFullUpdate
492 data.FlushBits();
493
494 // if (HasLocalScriptData)
495 // {
496 // data.WriteBits(Data.length(), 7);
497 // data.FlushBits();
498 // data.WriteString(Data);
499 // }
500
501 // if (HasPetBattleFullUpdate)
502 // {
503 // for (std::size_t i = 0; i < 2; ++i)
504 // {
505 // data << ObjectGuid(Players[i].CharacterID);
506 // data << int32(Players[i].TrapAbilityID);
507 // data << int32(Players[i].TrapStatus);
508 // data << uint16(Players[i].RoundTimeSecs);
509 // data << int8(Players[i].FrontPet);
510 // data << uint8(Players[i].InputFlags);
511
512 // data.WriteBits(Players[i].Pets.size(), 2);
513 // data.FlushBits();
514 // for (std::size_t j = 0; j < Players[i].Pets.size(); ++j)
515 // {
516 // data << ObjectGuid(Players[i].Pets[j].BattlePetGUID);
517 // data << int32(Players[i].Pets[j].SpeciesID);
518 // data << int32(Players[i].Pets[j].CreatureID);
519 // data << int32(Players[i].Pets[j].DisplayID);
520 // data << int16(Players[i].Pets[j].Level);
521 // data << int16(Players[i].Pets[j].Xp);
522 // data << int32(Players[i].Pets[j].CurHealth);
523 // data << int32(Players[i].Pets[j].MaxHealth);
524 // data << int32(Players[i].Pets[j].Power);
525 // data << int32(Players[i].Pets[j].Speed);
526 // data << int32(Players[i].Pets[j].NpcTeamMemberID);
527 // data << uint8(Players[i].Pets[j].BreedQuality);
528 // data << uint16(Players[i].Pets[j].StatusFlags);
529 // data << int8(Players[i].Pets[j].Slot);
530
531 // data << uint32(Players[i].Pets[j].Abilities.size());
532 // data << uint32(Players[i].Pets[j].Auras.size());
533 // data << uint32(Players[i].Pets[j].States.size());
534 // for (std::size_t k = 0; k < Players[i].Pets[j].Abilities.size(); ++k)
535 // {
536 // data << int32(Players[i].Pets[j].Abilities[k].AbilityID);
537 // data << int16(Players[i].Pets[j].Abilities[k].CooldownRemaining);
538 // data << int16(Players[i].Pets[j].Abilities[k].LockdownRemaining);
539 // data << int8(Players[i].Pets[j].Abilities[k].AbilityIndex);
540 // data << uint8(Players[i].Pets[j].Abilities[k].Pboid);
541 // }
542
543 // for (std::size_t k = 0; k < Players[i].Pets[j].Auras.size(); ++k)
544 // {
545 // data << int32(Players[i].Pets[j].Auras[k].AbilityID);
546 // data << uint32(Players[i].Pets[j].Auras[k].InstanceID);
547 // data << int32(Players[i].Pets[j].Auras[k].RoundsRemaining);
548 // data << int32(Players[i].Pets[j].Auras[k].CurrentRound);
549 // data << uint8(Players[i].Pets[j].Auras[k].CasterPBOID);
550 // }
551
552 // for (std::size_t k = 0; k < Players[i].Pets[j].States.size(); ++k)
553 // {
554 // data << uint32(Players[i].Pets[j].States[k].StateID);
555 // data << int32(Players[i].Pets[j].States[k].StateValue);
556 // }
557
558 // data.WriteBits(Players[i].Pets[j].CustomName.length(), 7);
559 // data.FlushBits();
560 // data.WriteString(Players[i].Pets[j].CustomName);
561 // }
562 // }
563
564 // for (std::size_t i = 0; i < 3; ++i)
565 // {
566 // data << uint32(Enviros[j].Auras.size());
567 // data << uint32(Enviros[j].States.size());
568 // for (std::size_t j = 0; j < Enviros[j].Auras.size(); ++j)
569 // {
570 // data << int32(Enviros[j].Auras[j].AbilityID);
571 // data << uint32(Enviros[j].Auras[j].InstanceID);
572 // data << int32(Enviros[j].Auras[j].RoundsRemaining);
573 // data << int32(Enviros[j].Auras[j].CurrentRound);
574 // data << uint8(Enviros[j].Auras[j].CasterPBOID);
575 // }
576
577 // for (std::size_t j = 0; j < Enviros[j].States.size(); ++j)
578 // {
579 // data << uint32(Enviros[i].States[j].StateID);
580 // data << int32(Enviros[i].States[j].StateValue);
581 // }
582 // }
583
584 // data << uint16(WaitingForFrontPetsMaxSecs);
585 // data << uint16(PvpMaxRoundTime);
586 // data << int32(CurRound);
587 // data << uint32(NpcCreatureID);
588 // data << uint32(NpcDisplayID);
589 // data << int8(CurPetBattleState);
590 // data << uint8(ForfeitPenalty);
591 // data << ObjectGuid(InitialWildPetGUID);
592 // data.WriteBit(IsPVP);
593 // data.WriteBit(CanAwardXP);
594 // data.FlushBits();
595 // }
596 }
597
598 if (flags.ActivePlayer)
599 {
600 Player const* player = static_cast<Player const*>(this);
601
602 bool HasSceneInstanceIDs = !player->GetSceneMgr().GetSceneTemplateByInstanceMap().empty();
603 bool HasRuneState = player->GetPowerIndex(POWER_RUNES) < MAX_POWERS_PER_CLASS;
604
605 data.WriteBit(HasSceneInstanceIDs);
606 data.WriteBit(HasRuneState);
607 data.FlushBits();
608 if (HasSceneInstanceIDs)
609 {
610 data << uint32(player->GetSceneMgr().GetSceneTemplateByInstanceMap().size());
611 for (auto const& [sceneInstanceId, _] : player->GetSceneMgr().GetSceneTemplateByInstanceMap())
612 data << uint32(sceneInstanceId);
613 }
614 if (HasRuneState)
615 {
616 float baseCd = float(player->GetRuneBaseCooldown());
617 uint32 maxRunes = uint32(player->GetMaxPower(POWER_RUNES));
618
619 data << uint8((1 << maxRunes) - 1);
620 data << uint8(player->GetRunesState());
621 data << uint32(maxRunes);
622 for (uint32 i = 0; i < maxRunes; ++i)
623 data << uint8((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255);
624 }
625 }
626
627 if (flags.Conversation)
628 {
629 Conversation const* self = static_cast<Conversation const*>(this);
630 if (data.WriteBit(self->GetTextureKitId() != 0))
631 data << uint32(self->GetTextureKitId());
632
633 data.FlushBits();
634 }
635
636 //if (flags.Room)
637 // data << ObjectGuid(HouseGUID);
638
639 //if (flags.Decor)
640 // data << ObjectGuid(RoomGUID);
641
642 //if (flags.MeshObject)
643 //{
644 // data << ObjectGuid(AttachParentGUID);
645 // data << TaggedPosition<Position::XYZ>(PositionLocalSpace);
646 // data << QuaternionData(RotationLocalSpace);
647 // data << float(ScaleLocalSpace);
648 // data << uint8(AttachmentFlags);
649 //}
650
651 if (!PauseTimes.empty())
652 data.append(PauseTimes.data(), PauseTimes.size());
653}
654
659
665
667{
668 for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
669 WowCS::EntityFragmentInfo->ClearChanged[static_cast<std::size_t>(m_entityFragments.Updateable.Ids[i])](m_entityFragments.Updateable.Data[i]);
670
672
673 if (m_objectUpdated)
674 {
675 if (remove)
677 m_objectUpdated = false;
678 }
679}
680
682{
683 for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
684 {
685 if (WowCS::EntityFragmentInfo->IsChanged[static_cast<std::size_t>(m_entityFragments.Updateable.Ids[i])](m_entityFragments.Updateable.Data[i]))
687 else
688 m_entityFragments.ContentsChangedMask &= ~m_entityFragments.Updateable.Masks[i];
689 }
690}
691
693{
694 UpdateDataMapType::iterator iter = data_map.emplace(player, player->GetMapId()).first;
695 BuildValuesUpdateBlockForPlayer(&iter->second, iter->first);
696}
697
698std::string BaseEntity::GetDebugInfo() const
699{
700 return Trinity::StringFormat("{}", GetGUID());
701}
std::unordered_map< Player *, UpdateData > UpdateDataMapType
Definition BaseEntity.h:32
uint8_t uint8
Definition Define.h:156
int64_t int64
Definition Define.h:149
uint64_t uint64
Definition Define.h:153
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
uint16 flags
#define ABORT
Definition Errors.h:79
#define ASSERT
Definition Errors.h:72
#define TC_LOG_FATAL(filterType__, message__,...)
Definition Log.h:185
@ MOVEMENTFLAG_FALLING
@ TYPEID_ACTIVE_PLAYER
Definition ObjectGuid.h:45
#define MAX_POWERS_PER_CLASS
@ GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT
@ POWER_RUNES
@ MOVE_FLIGHT
@ MOVE_SWIM
@ MOVE_TURN_RATE
@ MOVE_FLIGHT_BACK
@ MOVE_SWIM_BACK
@ MOVE_RUN
@ MOVE_PITCH_RATE
@ MOVE_RUN_BACK
@ MOVE_WALK
@ ADV_FLYING_DOUBLE_JUMP_VEL_MOD
@ ADV_FLYING_OVER_MAX_DECELERATION
@ ADV_FLYING_LIFT_COEFFICIENT
@ ADV_FLYING_ADD_IMPULSE_MAX_SPEED
@ ADV_FLYING_GLIDE_START_MIN_HEIGHT
@ ADV_FLYING_AIR_FRICTION
@ ADV_FLYING_LAUNCH_SPEED_COEFFICIENT
@ ADV_FLYING_MAX_VEL
@ ADV_FLYING_SURFACE_FRICTION
@ ADV_FLYING_PITCHING_RATE_DOWN
@ ADV_FLYING_TURN_VELOCITY_THRESHOLD
@ ADV_FLYING_PITCHING_RATE_UP
@ ADV_FLYING_BANKING_RATE
@ UPDATETYPE_VALUES
Definition UpdateData.h:30
@ UPDATETYPE_CREATE_OBJECT
Definition UpdateData.h:31
@ UPDATETYPE_CREATE_OBJECT2
Definition UpdateData.h:32
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void BuildUpdateChangesMask()
virtual std::string GetDebugInfo() const
WowCS::EntityFragmentsHolder m_entityFragments
Definition BaseEntity.h:353
bool m_isNewObject
Definition BaseEntity.h:363
bool IsWorldObject() const
Definition BaseEntity.h:169
virtual bool AddToObjectUpdate()=0
bool IsInWorld() const
Definition BaseEntity.h:158
virtual void RemoveFromWorld()
CreateObjectBits m_updateFlag
Definition BaseEntity.h:352
virtual void DestroyForPlayer(Player const *target) const
void AddToObjectUpdateIfNeeded()
virtual void AddToWorld()
static void BuildEntityFragments(ByteBuffer &data, std::span< WowCS::EntityFragment const > fragments)
void BuildDestroyUpdateBlock(UpdateData *data) const
virtual void RemoveFromObjectUpdate()=0
void BuildMovementUpdate(ByteBuffer &data, CreateObjectBits flags, Player const *target) const
void ClearUpdateMask(bool remove)
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const
bool IsGameObject() const
Definition BaseEntity.h:174
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
void SendOutOfRangeForPlayer(Player const *target) const
TypeID m_objectTypeId
Definition BaseEntity.h:351
bool m_inWorld
Definition BaseEntity.h:362
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player const *target) const
virtual ~BaseEntity()
bool m_objectUpdated
Definition BaseEntity.h:359
void BuildOutOfRangeUpdateBlock(UpdateData *data) const
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
void BuildFieldsUpdate(Player *player, UpdateDataMapType &data_map) const
void SendUpdateToPlayer(Player *player) const
void append(T value)
Definition ByteBuffer.h:131
size_t wpos() const
Definition ByteBuffer.h:462
bool WriteBit(bool bit)
Definition ByteBuffer.h:159
void put(std::size_t pos, T value)
Definition ByteBuffer.h:261
void FlushBits()
Definition ByteBuffer.h:142
uint32 GetTextureKitId() const
constexpr bool HasFlag(T flag) const
Definition EnumFlag.h:106
GameObjectTemplate const * GetGOInfo() const
Definition GameObject.h:209
int64 GetPackedLocalRotation() const
Definition GameObject.h:225
Optional< float > GetPathProgressForClient() const
Definition GameObject.h:301
uint32 GetWorldEffectID() const
Definition GameObject.h:436
bool IsEmpty() const
Definition ObjectGuid.h:362
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6193
uint32 GetPowerIndex(Powers power) const override
uint32 GetRuneBaseCooldown() const
Definition Player.cpp:27051
SceneMgr & GetSceneMgr()
Definition Player.h:2873
bool HaveAtClient(BaseEntity const *u) const
Definition Player.cpp:24425
uint8 GetRunesState() const
Definition Player.cpp:27046
uint32 GetRuneCooldown(uint8 index) const
Definition Player.h:2818
SceneTemplateByInstance const & GetSceneTemplateByInstanceMap() const
Definition SceneMgr.h:71
SmoothPhasingInfo const * GetInfoForSeer(ObjectGuid seer) const
uint32 GetTransportPeriod() const
Definition Transport.h:83
Optional< uint32 > GetNextStopTimestamp() const
Definition Transport.h:86
bool IsStopped() const
Definition Transport.h:87
uint32 GetTimer() const
Definition Transport.h:85
Definition Unit.h:647
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:8951
MovementForces const * GetMovementForces() const
Definition Unit.h:1189
MovementFlags GetUnitMovementFlags() const
Definition Unit.h:1762
bool IsSplineEnabled() const
Definition Unit.cpp:14358
float GetAdvFlyingSpeedMax(AdvFlyingRateTypeRange speedType) const
Definition Unit.h:1742
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10105
float GetAdvFlyingSpeedMin(AdvFlyingRateTypeRange speedType) const
Definition Unit.h:1741
Unit * GetVictim() const
Definition Unit.h:738
float GetAdvFlyingSpeed(AdvFlyingRateTypeSingle speedType) const
Definition Unit.h:1740
std::unique_ptr< Movement::MoveSpline > movespline
Definition Unit.h:1854
bool HasUnitMovementFlag(MovementFlags f) const
Definition Unit.h:1761
Vehicle * GetVehicleKit() const
Definition Unit.h:1798
void AddDestroyObject(ObjectGuid guid)
void AddOutOfRangeGUID(ObjectGuid guid)
ByteBuffer & GetBuffer()
Definition UpdateData.h:47
bool BuildPacket(WorldPacket *packet)
void AddUpdateBlock()
Definition UpdateData.h:46
VehicleEntry const * GetVehicleInfo() const
Definition Vehicle.h:50
constexpr uint32 GetMapId() const
Definition Position.h:216
virtual uint16 GetMeleeAnimKitId() const
Definition Object.h:565
virtual uint16 GetMovementAnimKitId() const
Definition Object.h:564
virtual Position const & GetStationaryPosition() const
Definition Object.h:550
SmoothPhasing * GetSmoothPhasing()
Definition Object.h:575
virtual uint16 GetAIAnimKitId() const
Definition Object.h:563
MovementInfo m_movementInfo
Definition Object.h:548
static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const &moveSpline, ByteBuffer &data)
static void WriteMovementForceWithDirection(MovementForce const &movementForce, ByteBuffer &data, Position const *objectPosition=nullptr)
uint32 GetGameTimeMS()
Definition GameTime.cpp:57
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
UpdateFieldFlag
Definition UpdateField.h:37
EntityFragmentInfos const * EntityFragmentInfo
constexpr bool IsIndirectFragment(EntityFragment frag)
struct WowCS::FragmentInfoInitializer InitFragments
Optional< Inertia > inertia
Optional< Drive > driveStatus
float gravityModifier
Optional< ObjectGuid > standingOnGameObjectGUID
struct MovementInfo::JumpInfo jump
float stepUpStartElevation
struct MovementInfo::TransportInfo transport
Optional< AdvFlying > advFlying
Streamer< XYZO > PositionXYZOStream()
Definition Position.h:101
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr float GetOrientation() const
Definition Position.h:90
constexpr float GetPositionZ() const
Definition Position.h:89
Optional< ObjectGuid > ReplaceObject
std::array< EntityFragmentSerializeFn, N > SerializeUpdate
std::array< EntityFragmentSerializeFn, N > SerializeCreate
static void Register(EntityFragment fragment, EntityFragmentSerializeFn serializeCreate, EntityFragmentSerializeFn serializeUpdate, EntityFragmentIsChangedFn isChanged, EntityFragmentClearChangedFn clearChanged)
std::span< EntityFragment const > GetIds() const