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 if (flags.MovementUpdate)
265 {
266 Unit const* unit = static_cast<Unit const*>(this);
267 bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
268 bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0;
269 bool HasSpline = unit->IsSplineEnabled();
270 bool HasInertia = unit->m_movementInfo.inertia.has_value();
271 bool HasAdvFlying = unit->m_movementInfo.advFlying.has_value();
272 bool HasDriveStatus = unit->m_movementInfo.driveStatus.has_value();
273 bool HasStandingOnGameObjectGUID = unit->m_movementInfo.standingOnGameObjectGUID.has_value();
274
275 data << GetGUID(); // MoverGUID
276
277 data << uint32(unit->GetUnitMovementFlags());
278 data << uint32(unit->GetExtraUnitMovementFlags());
279 data << uint32(unit->GetExtraUnitMovementFlags2());
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);
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
310 data << unit->m_movementInfo.transport;
311
312 if (HasStandingOnGameObjectGUID)
314
315 if (HasInertia)
316 {
317 data << unit->m_movementInfo.inertia->id;
318 data << unit->m_movementInfo.inertia->force.PositionXYZStream();
319 data << uint32(unit->m_movementInfo.inertia->lifetime);
320 }
321
322 if (HasAdvFlying)
323 {
324 data << float(unit->m_movementInfo.advFlying->forwardVelocity);
325 data << float(unit->m_movementInfo.advFlying->upVelocity);
326 }
327
328 if (HasFall)
329 {
330 data << uint32(unit->m_movementInfo.jump.fallTime); // Time
331 data << float(unit->m_movementInfo.jump.zspeed); // JumpVelocity
332
333 if (data.WriteBit(HasFallDirection))
334 {
335 data << float(unit->m_movementInfo.jump.sinAngle); // Direction
336 data << float(unit->m_movementInfo.jump.cosAngle);
337 data << float(unit->m_movementInfo.jump.xyspeed); // Speed
338 }
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 data.WriteBit(HasSpline);
390 data.FlushBits();
391
392 if (MovementForces const* movementForces = unit->GetMovementForces())
393 for (MovementForce const& force : *movementForces->GetForces())
395
396 if (HasSpline)
398 }
399
400 data << uint32(PauseTimes.size());
401
402 if (flags.Stationary)
403 {
404 WorldObject const* self = static_cast<WorldObject const*>(this);
406 }
407
408 if (flags.CombatVictim)
409 {
410 Unit const* unit = static_cast<Unit const*>(this);
411 data << unit->GetVictim()->GetGUID(); // CombatVictim
412 }
413
414 if (flags.ServerTime)
416
417 if (flags.Vehicle)
418 {
419 Unit const* unit = static_cast<Unit const*>(this);
420 data << uint32(unit->GetVehicleKit()->GetVehicleInfo()->ID); // RecID
421 data << float(unit->GetOrientation()); // InitialRawFacing
422 }
423
424 if (flags.AnimKit)
425 {
426 WorldObject const* self = static_cast<WorldObject const*>(this);
427 data << uint16(self->GetAIAnimKitId()); // AiID
428 data << uint16(self->GetMovementAnimKitId()); // MovementID
429 data << uint16(self->GetMeleeAnimKitId()); // MeleeID
430 }
431
432 if (flags.Rotation)
433 {
434 GameObject const* gameObject = static_cast<GameObject const*>(this);
435 data << uint64(gameObject->GetPackedLocalRotation()); // Rotation
436 }
437
438 //if (flags.Room)
439 // data << ObjectGuid(HouseGUID);
440
441 //if (flags.Decor)
442 // data << ObjectGuid(RoomGUID);
443
444 //if (flags.MeshObject)
445 //{
446 // data << ObjectGuid(AttachParentGUID);
447 // data << TaggedPosition<Position::XYZ>(PositionLocalSpace);
448 // data << QuaternionData(RotationLocalSpace);
449 // data << float(ScaleLocalSpace);
450 // data << uint8(AttachmentFlags);
451 //}
452
453 if (!PauseTimes.empty())
454 data.append(PauseTimes.data(), PauseTimes.size());
455
456 if (flags.MovementTransport)
457 {
458 WorldObject const* self = static_cast<WorldObject const*>(this);
459 data << self->m_movementInfo.transport;
460 }
461
462 if (flags.GameObject)
463 {
464 GameObject const* gameObject = static_cast<GameObject const*>(this);
465
466 bool bit8 = false;
467 bool isTransport = gameObject->GetGOInfo()->type == GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT;
468
469 data << uint32(gameObject->GetWorldEffectID());
470
471 data.WriteBit(bit8);
472 data.WriteBit(isTransport);
473 data.WriteBit(gameObject->GetPathProgressForClient().has_value());
474 data.FlushBits();
475 if (isTransport)
476 {
477 Transport const* transport = static_cast<Transport const*>(gameObject);
478 uint32 period = transport->GetTransportPeriod();
479
480 data << uint32((((int64(transport->GetTimer()) - int64(GameTime::GetGameTimeMS())) % period) + period) % period); // TimeOffset
481 data << uint32(transport->GetNextStopTimestamp().value_or(0));
482 data.WriteBit(transport->GetNextStopTimestamp().has_value());
483 data.WriteBit(transport->IsStopped());
484 data.WriteBit(false);
485 data.FlushBits();
486 }
487
488 if (bit8)
489 data << uint32(0);
490
491 if (gameObject->GetPathProgressForClient())
492 data << float(*gameObject->GetPathProgressForClient());
493 }
494
495 if (flags.SmoothPhasing)
496 {
497 SmoothPhasingInfo const* smoothPhasingInfo = static_cast<WorldObject const*>(this)->GetSmoothPhasing()->GetInfoForSeer(target->GetGUID());
498 ASSERT(smoothPhasingInfo);
499
500 data.WriteBit(smoothPhasingInfo->ReplaceActive);
501 data.WriteBit(smoothPhasingInfo->StopAnimKits);
502 data.WriteBit(smoothPhasingInfo->ReplaceObject.has_value());
503 data.FlushBits();
504 if (smoothPhasingInfo->ReplaceObject)
505 data << *smoothPhasingInfo->ReplaceObject;
506 }
507
508 if (flags.SceneObject)
509 {
510 data.WriteBit(false); // HasLocalScriptData
511 data.WriteBit(false); // HasPetBattleFullUpdate
512 data.FlushBits();
513
514 // if (HasLocalScriptData)
515 // {
516 // data.WriteBits(Data.length(), 7);
517 // data.FlushBits();
518 // data.WriteString(Data);
519 // }
520
521 // if (HasPetBattleFullUpdate)
522 // {
523 // for (std::size_t i = 0; i < 2; ++i)
524 // {
525 // data << ObjectGuid(Players[i].CharacterID);
526 // data << int32(Players[i].TrapAbilityID);
527 // data << int32(Players[i].TrapStatus);
528 // data << uint16(Players[i].RoundTimeSecs);
529 // data << int8(Players[i].FrontPet);
530 // data << uint8(Players[i].InputFlags);
531
532 // data.WriteBits(Players[i].Pets.size(), 2);
533 // data.FlushBits();
534 // for (std::size_t j = 0; j < Players[i].Pets.size(); ++j)
535 // {
536 // data << ObjectGuid(Players[i].Pets[j].BattlePetGUID);
537 // data << int32(Players[i].Pets[j].SpeciesID);
538 // data << int32(Players[i].Pets[j].CreatureID);
539 // data << int32(Players[i].Pets[j].DisplayID);
540 // data << int16(Players[i].Pets[j].Level);
541 // data << int16(Players[i].Pets[j].Xp);
542 // data << int32(Players[i].Pets[j].CurHealth);
543 // data << int32(Players[i].Pets[j].MaxHealth);
544 // data << int32(Players[i].Pets[j].Power);
545 // data << int32(Players[i].Pets[j].Speed);
546 // data << int32(Players[i].Pets[j].NpcTeamMemberID);
547 // data << uint8(Players[i].Pets[j].BreedQuality);
548 // data << uint16(Players[i].Pets[j].StatusFlags);
549 // data << int8(Players[i].Pets[j].Slot);
550
551 // data << uint32(Players[i].Pets[j].Abilities.size());
552 // data << uint32(Players[i].Pets[j].Auras.size());
553 // data << uint32(Players[i].Pets[j].States.size());
554 // for (std::size_t k = 0; k < Players[i].Pets[j].Abilities.size(); ++k)
555 // {
556 // data << int32(Players[i].Pets[j].Abilities[k].AbilityID);
557 // data << int16(Players[i].Pets[j].Abilities[k].CooldownRemaining);
558 // data << int16(Players[i].Pets[j].Abilities[k].LockdownRemaining);
559 // data << int8(Players[i].Pets[j].Abilities[k].AbilityIndex);
560 // data << uint8(Players[i].Pets[j].Abilities[k].Pboid);
561 // }
562
563 // for (std::size_t k = 0; k < Players[i].Pets[j].Auras.size(); ++k)
564 // {
565 // data << int32(Players[i].Pets[j].Auras[k].AbilityID);
566 // data << uint32(Players[i].Pets[j].Auras[k].InstanceID);
567 // data << int32(Players[i].Pets[j].Auras[k].RoundsRemaining);
568 // data << int32(Players[i].Pets[j].Auras[k].CurrentRound);
569 // data << uint8(Players[i].Pets[j].Auras[k].CasterPBOID);
570 // }
571
572 // for (std::size_t k = 0; k < Players[i].Pets[j].States.size(); ++k)
573 // {
574 // data << uint32(Players[i].Pets[j].States[k].StateID);
575 // data << int32(Players[i].Pets[j].States[k].StateValue);
576 // }
577
578 // data.WriteBits(Players[i].Pets[j].CustomName.length(), 7);
579 // data.FlushBits();
580 // data.WriteString(Players[i].Pets[j].CustomName);
581 // }
582 // }
583
584 // for (std::size_t i = 0; i < 3; ++i)
585 // {
586 // data << uint32(Enviros[j].Auras.size());
587 // data << uint32(Enviros[j].States.size());
588 // for (std::size_t j = 0; j < Enviros[j].Auras.size(); ++j)
589 // {
590 // data << int32(Enviros[j].Auras[j].AbilityID);
591 // data << uint32(Enviros[j].Auras[j].InstanceID);
592 // data << int32(Enviros[j].Auras[j].RoundsRemaining);
593 // data << int32(Enviros[j].Auras[j].CurrentRound);
594 // data << uint8(Enviros[j].Auras[j].CasterPBOID);
595 // }
596
597 // for (std::size_t j = 0; j < Enviros[j].States.size(); ++j)
598 // {
599 // data << uint32(Enviros[i].States[j].StateID);
600 // data << int32(Enviros[i].States[j].StateValue);
601 // }
602 // }
603
604 // data << uint16(WaitingForFrontPetsMaxSecs);
605 // data << uint16(PvpMaxRoundTime);
606 // data << int32(CurRound);
607 // data << uint32(NpcCreatureID);
608 // data << uint32(NpcDisplayID);
609 // data << int8(CurPetBattleState);
610 // data << uint8(ForfeitPenalty);
611 // data << ObjectGuid(InitialWildPetGUID);
612 // data.WriteBit(IsPVP);
613 // data.WriteBit(CanAwardXP);
614 // data.FlushBits();
615 // }
616 }
617
618 if (flags.ActivePlayer)
619 {
620 Player const* player = static_cast<Player const*>(this);
621
622 bool HasSceneInstanceIDs = !player->GetSceneMgr().GetSceneTemplateByInstanceMap().empty();
623 bool HasRuneState = player->GetPowerIndex(POWER_RUNES) != MAX_POWERS;
624
625 data.WriteBit(HasSceneInstanceIDs);
626 data.WriteBit(HasRuneState);
627 data.FlushBits();
628 if (HasSceneInstanceIDs)
629 {
630 data << uint32(player->GetSceneMgr().GetSceneTemplateByInstanceMap().size());
631 for (auto const& [sceneInstanceId, _] : player->GetSceneMgr().GetSceneTemplateByInstanceMap())
632 data << uint32(sceneInstanceId);
633 }
634 if (HasRuneState)
635 {
636 float baseCd = float(player->GetRuneBaseCooldown());
637 uint32 maxRunes = uint32(player->GetMaxPower(POWER_RUNES));
638
639 data << uint8((1 << maxRunes) - 1);
640 data << uint8(player->GetRunesState());
641 data << uint32(maxRunes);
642 for (uint32 i = 0; i < maxRunes; ++i)
643 data << uint8((baseCd - float(player->GetRuneCooldown(i))) / baseCd * 255);
644 }
645 }
646
647 if (flags.Conversation)
648 {
649 Conversation const* self = static_cast<Conversation const*>(this);
650 if (data.WriteBit(self->GetTextureKitId() != 0))
651 data << uint32(self->GetTextureKitId());
652
653 data.FlushBits();
654 }
655}
656
661
667
669{
670 for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
671 WowCS::EntityFragmentInfo->ClearChanged[static_cast<std::size_t>(m_entityFragments.Updateable.Ids[i])](m_entityFragments.Updateable.Data[i]);
672
674
675 if (m_objectUpdated)
676 {
677 if (remove)
679 m_objectUpdated = false;
680 }
681}
682
684{
685 for (std::size_t i = 0; i < m_entityFragments.UpdateableCount; ++i)
686 {
687 if (WowCS::EntityFragmentInfo->IsChanged[static_cast<std::size_t>(m_entityFragments.Updateable.Ids[i])](m_entityFragments.Updateable.Data[i]))
689 else
690 m_entityFragments.ContentsChangedMask &= ~m_entityFragments.Updateable.Masks[i];
691 }
692}
693
695{
696 UpdateDataMapType::iterator iter = data_map.emplace(player, player->GetMapId()).first;
697 BuildValuesUpdateBlockForPlayer(&iter->second, iter->first);
698}
699
700std::string BaseEntity::GetDebugInfo() const
701{
702 return Trinity::StringFormat("{}", GetGUID());
703}
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:87
#define ASSERT
Definition Errors.h:80
#define TC_LOG_FATAL(filterType__, message__,...)
Definition Log.h:193
@ TYPEID_ACTIVE_PLAYER
Definition ObjectGuid.h:45
@ GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT
@ MAX_POWERS
@ 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
@ MOVEMENTFLAG_FALLING
@ 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:130
size_t wpos() const
Definition ByteBuffer.h:461
bool WriteBit(bool bit)
Definition ByteBuffer.h:158
void put(std::size_t pos, T value)
Definition ByteBuffer.h:260
void FlushBits()
Definition ByteBuffer.h:141
uint32 GetTextureKitId() const
constexpr bool HasFlag(T flag) const
Definition EnumFlag.h:106
GameObjectTemplate const * GetGOInfo() const
Definition GameObject.h:203
int64 GetPackedLocalRotation() const
Definition GameObject.h:219
Optional< float > GetPathProgressForClient() const
Definition GameObject.h:295
uint32 GetWorldEffectID() const
Definition GameObject.h:430
bool IsEmpty() const
Definition ObjectGuid.h:362
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
uint32 GetPowerIndex(Powers power) const override
uint32 GetRuneBaseCooldown() const
Definition Player.cpp:27097
SceneMgr & GetSceneMgr()
Definition Player.h:2888
bool HaveAtClient(BaseEntity const *u) const
Definition Player.cpp:24475
uint8 GetRunesState() const
Definition Player.cpp:27092
uint32 GetRuneCooldown(uint8 index) const
Definition Player.h:2833
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:635
uint32 GetUnitMovementFlags() const
Definition Unit.h:1735
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:8932
MovementForces const * GetMovementForces() const
Definition Unit.h:1174
bool IsSplineEnabled() const
Definition Unit.cpp:14211
float GetAdvFlyingSpeedMax(AdvFlyingRateTypeRange speedType) const
Definition Unit.h:1715
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10037
float GetAdvFlyingSpeedMin(AdvFlyingRateTypeRange speedType) const
Definition Unit.h:1714
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:1734
Unit * GetVictim() const
Definition Unit.h:726
uint32 GetExtraUnitMovementFlags() const
Definition Unit.h:1741
float GetAdvFlyingSpeed(AdvFlyingRateTypeSingle speedType) const
Definition Unit.h:1713
std::unique_ptr< Movement::MoveSpline > movespline
Definition Unit.h:1838
Vehicle * GetVehicleKit() const
Definition Unit.h:1782
uint32 GetExtraUnitMovementFlags2() const
Definition Unit.h:1747
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