From 6b67cd773e0934f21279687797ef8d6eab37f817 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 9 Mar 2025 00:26:00 +0100 Subject: [PATCH] Core/Objects: replaced ObjectUpdateFlags with CreateObjectBits to get closer to how master branch handles their bits --- .../game/Entities/AreaTrigger/AreaTrigger.cpp | 2 +- src/server/game/Entities/Corpse/Corpse.cpp | 2 +- .../game/Entities/Creature/Creature.cpp | 5 +- .../Entities/DynamicObject/DynamicObject.cpp | 2 +- .../game/Entities/GameObject/GameObject.cpp | 5 +- src/server/game/Entities/Item/Item.cpp | 2 - src/server/game/Entities/Object/Object.cpp | 79 +++++++++---------- src/server/game/Entities/Object/Object.h | 28 ++++++- .../game/Entities/Object/Updates/UpdateData.h | 23 ------ .../game/Entities/Transport/Transport.cpp | 4 +- src/server/game/Entities/Unit/Unit.cpp | 6 +- 11 files changed, 75 insertions(+), 83 deletions(-) diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 0b962fbc7f..5b62e050d2 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -29,7 +29,7 @@ AreaTrigger::AreaTrigger() : WorldObject(false), _duration(0) m_objectType |= TYPEMASK_AREATRIGGER; m_objectTypeId = TYPEID_AREATRIGGER; - m_updateFlag = UPDATEFLAG_STATIONARY_POSITION; + m_updateFlag.AreaTrigger = true; m_valuesCount = AREATRIGGER_END; } diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 76355c6fe2..8ed49fb106 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -35,7 +35,7 @@ Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES), m_type(type m_objectType |= TYPEMASK_CORPSE; m_objectTypeId = TYPEID_CORPSE; - m_updateFlag = UPDATEFLAG_STATIONARY_POSITION; + m_updateFlag.Stationary = true; m_valuesCount = CORPSE_END; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 950519a072..d6cdaa8464 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -567,10 +567,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) _staticFlags.ApplyFlag(CREATURE_STATIC_FLAG_4_TREAT_AS_RAID_UNIT_FOR_HELPFUL_SPELLS, (cinfo->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT) != 0); - if (_staticFlags.HasFlag(CREATURE_STATIC_FLAG_4_NO_BIRTH_ANIM)) - m_updateFlag |= UPDATEFLAG_NO_BIRTH_ANIM; - else - m_updateFlag &= ~UPDATEFLAG_NO_BIRTH_ANIM; + m_updateFlag.NoBirthAnim = _staticFlags.HasFlag(CREATURE_STATIC_FLAG_4_NO_BIRTH_ANIM); SetNoNpcDamageBelowPctHealthValue(sObjectMgr->GetSparringHealthLimitFor(GetEntry())); diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 119f1fac55..ff22c45270 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -37,7 +37,7 @@ DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject), m_objectType |= TYPEMASK_DYNAMICOBJECT; m_objectTypeId = TYPEID_DYNAMICOBJECT; - m_updateFlag = UPDATEFLAG_STATIONARY_POSITION; + m_updateFlag.Stationary = true; m_valuesCount = DYNAMICOBJECT_END; } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 761ce30e2f..737880c566 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -477,7 +477,8 @@ GameObject::GameObject() : WorldObject(false), MapObject(), m_objectType |= TYPEMASK_GAMEOBJECT; m_objectTypeId = TYPEID_GAMEOBJECT; - m_updateFlag = (UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION); + m_updateFlag.Stationary = true; + m_updateFlag.Rotation = true; m_valuesCount = GAMEOBJECT_END; m_respawnTime = 0; @@ -661,7 +662,7 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, P if (goinfo->type == GAMEOBJECT_TYPE_TRANSPORT) { - m_updateFlag |= UPDATEFLAG_TRANSPORT; + m_updateFlag.ServerTime = true; guidHigh = HighGuid::Mo_Transport; } diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 941158ddde..9221f42623 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -253,8 +253,6 @@ Item::Item() m_objectType |= TYPEMASK_ITEM; m_objectTypeId = TYPEID_ITEM; - m_updateFlag = 0; - m_valuesCount = ITEM_END; m_slot = 0; uState = ITEM_NEW; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 9dbc980b31..68a2cc944f 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -74,7 +74,7 @@ Object::Object() { m_objectTypeId = TYPEID_OBJECT; m_objectType = TYPEMASK_OBJECT; - m_updateFlag = UPDATEFLAG_NONE; + m_updateFlag.Clear(); m_uint32Values = nullptr; m_valuesCount = 0; @@ -179,33 +179,26 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c if (!target) return; - uint8 updateType = m_isNewObject ? UPDATETYPE_CREATE_OBJECT2 : UPDATETYPE_CREATE_OBJECT; - uint32 flags = m_updateFlag; + uint8 updateType = m_isNewObject ? UPDATETYPE_CREATE_OBJECT2 : UPDATETYPE_CREATE_OBJECT; + CreateObjectBits flags = m_updateFlag; /** lower flag1 **/ if (target == this) // building packet for yourself - flags |= UPDATEFLAG_SELF; + flags.ThisIsYou = true; if (WorldObject const* worldObject = dynamic_cast(this)) { - if (!(flags & UPDATEFLAG_LIVING)) - if (!worldObject->m_movementInfo.transport.guid.IsEmpty()) - flags |= UPDATEFLAG_STATIONARY_POSITION; + if (!flags.MovementUpdate && !worldObject->m_movementInfo.transport.guid.IsEmpty()) + flags.MovementTransport = true; if (worldObject->GetAIAnimKitId() || worldObject->GetMovementAnimKitId() || worldObject->GetMeleeAnimKitId()) - flags |= UPDATEFLAG_ANIMKITS; - - if (!worldObject->m_movementInfo.transport.guid.IsEmpty() && (ToGameObject() || ToDynObject())) - flags |= UPDATEFLAG_GO_TRANSPORT_POSITION; + flags.AnimKit = true; } if (Unit const* unit = ToUnit()) { if (unit->GetVictim()) - flags |= UPDATEFLAG_HAS_TARGET; - - if (unit->HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) - flags |= UPDATEFLAG_PLAY_HOVER_ANIM; + flags.CombatVictim = true; } ByteBuffer buf(500); @@ -334,7 +327,7 @@ ObjectGuid Object::GetGuidValue(uint16 index) const return *((ObjectGuid*)&(m_uint32Values[index])); } -void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const +void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const { Unit const* self = nullptr; ObjectGuid guid = GetGUID(); @@ -357,23 +350,23 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const PauseTimes = go->GetPauseTimes(); // Bit content - data->WriteBit(flags & UPDATEFLAG_PLAY_HOVER_ANIM); - data->WriteBit(flags & UPDATEFLAG_SUPPRESSED_GREETINGS); - data->WriteBit(flags & UPDATEFLAG_ROTATION); - data->WriteBit(flags & UPDATEFLAG_ANIMKITS); - data->WriteBit(flags & UPDATEFLAG_HAS_TARGET); - data->WriteBit(flags & UPDATEFLAG_SELF); - data->WriteBit(flags & UPDATEFLAG_VEHICLE); - data->WriteBit(flags & UPDATEFLAG_LIVING); + data->WriteBit(flags.PlayerHoverAnim); + data->WriteBit(flags.SupressedGreetings); + data->WriteBit(flags.Rotation); + data->WriteBit(flags.AnimKit); + data->WriteBit(flags.CombatVictim); + data->WriteBit(flags.ThisIsYou); + data->WriteBit(flags.Vehicle); + data->WriteBit(flags.MovementUpdate); data->WriteBits(PauseTimes ? PauseTimes->size() : 0, 24); - data->WriteBit(flags & UPDATEFLAG_NO_BIRTH_ANIM); - data->WriteBit(flags & UPDATEFLAG_GO_TRANSPORT_POSITION); - data->WriteBit(flags & UPDATEFLAG_STATIONARY_POSITION); - data->WriteBit(flags & UPDATEFLAG_AREATRIGGER); - data->WriteBit(flags & UPDATEFLAG_ENABLE_PORTALS); - data->WriteBit(flags & UPDATEFLAG_TRANSPORT); + data->WriteBit(flags.NoBirthAnim); + data->WriteBit(flags.MovementTransport); + data->WriteBit(flags.Stationary); + data->WriteBit(flags.AreaTrigger); + data->WriteBit(flags.EnablePortals); + data->WriteBit(flags.ServerTime); - if (flags & UPDATEFLAG_LIVING) + if (flags.MovementUpdate) { self = ToUnit(); movementFlags = self->m_movementInfo.GetMovementFlags(); @@ -440,7 +433,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteBits(movementFlagsExtra, 12); } - if (flags & UPDATEFLAG_GO_TRANSPORT_POSITION) + if (flags.MovementTransport) { WorldObject const* self = static_cast(this); ObjectGuid transGuid = self->m_movementInfo.transport.guid; @@ -456,7 +449,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteBit(transGuid[7]); } - if (flags & UPDATEFLAG_HAS_TARGET) + if (flags.CombatVictim) { ObjectGuid victimGuid = self->GetVictim()->GetGUID(); // checked in BuildCreateUpdateBlockForPlayer data->WriteBit(victimGuid[2]); @@ -469,7 +462,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteBit(victimGuid[3]); } - if (flags & UPDATEFLAG_ANIMKITS) + if (flags.AnimKit) { WorldObject const* self = static_cast(this); hasAIAnimKit = self->GetAIAnimKitId(); @@ -485,7 +478,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const if (PauseTimes && !PauseTimes->empty()) data->append(PauseTimes->data(), PauseTimes->size()); - if (flags & UPDATEFLAG_LIVING) + if (flags.MovementUpdate) { data->WriteByteSeq(guid[4]); *data << self->GetSpeed(MOVE_RUN_BACK); @@ -566,13 +559,13 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << self->GetSpeed(MOVE_FLIGHT_BACK); } - if (flags & UPDATEFLAG_VEHICLE) + if (flags.Vehicle) { *data << float(self->GetTransport() ? self->GetTransOffsetO() : self->GetOrientation()); *data << uint32(self->GetVehicleKit()->GetVehicleInfo()->ID); } - if (flags & UPDATEFLAG_GO_TRANSPORT_POSITION) + if (flags.MovementTransport) { WorldObject const* self = static_cast(this); ObjectGuid transGuid = self->m_movementInfo.transport.guid; @@ -598,10 +591,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << uint32(self->m_movementInfo.transport.time2); } - if (flags & UPDATEFLAG_ROTATION) + if (flags.Rotation) *data << uint64(ToGameObject()->GetPackedLocalRotation()); - if (flags & UPDATEFLAG_AREATRIGGER) + if (flags.AreaTrigger) { // client doesn't use these values, so unk *data << float(0.0f); @@ -623,7 +616,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << float(0.0f); } - if (flags & UPDATEFLAG_STATIONARY_POSITION) + if (flags.Stationary) { WorldObject const* self = static_cast(this); *data << float(self->GetStationaryO()); @@ -632,7 +625,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << float(self->GetStationaryZ()); } - if (flags & UPDATEFLAG_HAS_TARGET) + if (flags.CombatVictim) { ObjectGuid victimGuid = self->GetVictim()->GetGUID(); // checked in BuildCreateUpdateBlockForPlayer data->WriteByteSeq(victimGuid[4]); @@ -645,7 +638,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteByteSeq(victimGuid[1]); } - if (flags & UPDATEFLAG_ANIMKITS) + if (flags.AnimKit) { WorldObject const* self = static_cast(this); if (hasAIAnimKit) @@ -656,7 +649,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << uint16(self->GetMeleeAnimKitId()); } - if (flags & UPDATEFLAG_TRANSPORT) + if (flags.ServerTime) *data << uint32(GameTime::GetGameTimeMS()); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index bbca273239..9eb715d078 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -63,6 +63,30 @@ enum ZLiquidStatus : uint32; typedef std::unordered_map UpdateDataMapType; +struct CreateObjectBits +{ + bool PlayerHoverAnim : 1; + bool SupressedGreetings : 1; + bool Rotation : 1; + bool AnimKit : 1; + bool CombatVictim : 1; + bool ThisIsYou : 1; + bool Vehicle : 1; + bool MovementUpdate : 1; + bool NoBirthAnim : 1; + bool MovementTransport : 1; + bool Stationary : 1; + bool AreaTrigger : 1; + bool EnablePortals : 1; + bool ServerTime : 1; + + + void Clear() + { + memset(this, 0, sizeof(CreateObjectBits)); + } +}; + float const DEFAULT_COLLISION_HEIGHT = 2.03128f; // Most common value in dbc class TC_GAME_API Object @@ -199,13 +223,13 @@ class TC_GAME_API Object uint32 GetUpdateFieldData(Player const* target, uint32*& flags) const; - void BuildMovementUpdate(ByteBuffer* data, uint32 flags) const; + void BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const; virtual void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const; uint16 m_objectType; TypeID m_objectTypeId; - uint32 m_updateFlag; + CreateObjectBits m_updateFlag; union { diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h index a211b0cf32..42386cc232 100644 --- a/src/server/game/Entities/Object/Updates/UpdateData.h +++ b/src/server/game/Entities/Object/Updates/UpdateData.h @@ -33,29 +33,6 @@ enum OBJECT_UPDATE_TYPE UPDATETYPE_OUT_OF_RANGE_OBJECTS = 3, }; -enum OBJECT_UPDATE_FLAGS -{ - UPDATEFLAG_NONE = 0x00000, - UPDATEFLAG_SELF = 0x00001, - UPDATEFLAG_TRANSPORT = 0x00002, - UPDATEFLAG_HAS_TARGET = 0x00004, - UPDATEFLAG_UNKNOWN = 0x00008, - UPDATEFLAG_LOWGUID = 0x00010, - UPDATEFLAG_LIVING = 0x00020, - UPDATEFLAG_STATIONARY_POSITION = 0x00040, - UPDATEFLAG_VEHICLE = 0x00080, - UPDATEFLAG_GO_TRANSPORT_POSITION = 0x00100, - UPDATEFLAG_ROTATION = 0x00200, - UPDATEFLAG_UNK3 = 0x00400, - UPDATEFLAG_ANIMKITS = 0x00800, - UPDATEFLAG_AREATRIGGER = 0x01000, - UPDATEFLAG_UNK6 = 0x02000, - UPDATEFLAG_PLAY_HOVER_ANIM = 0x04000, - UPDATEFLAG_SUPPRESSED_GREETINGS = 0x08000, - UPDATEFLAG_NO_BIRTH_ANIM = 0x10000, - UPDATEFLAG_ENABLE_PORTALS = 0x20000, -}; - class UpdateData { public: diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 8b1aa0f70b..305e2c8075 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -84,7 +84,9 @@ Transport::Transport() : GameObject(), _transportInfo(nullptr), _movementState(TransportMovementState::Moving), _eventsToTrigger(std::make_unique>()), _currentPathLeg(0), _pathProgress(0), _delayedAddModel(false) { - m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION; + m_updateFlag.ServerTime = true; + m_updateFlag.Stationary = true; + m_updateFlag.Rotation = true; } Transport::~Transport() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c544a44b44..65a8adb074 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -310,7 +310,7 @@ Unit::Unit(bool isWorldObject) : m_objectType |= TYPEMASK_UNIT; m_objectTypeId = TYPEID_UNIT; - m_updateFlag = UPDATEFLAG_LIVING; + m_updateFlag.MovementUpdate = true; m_attackTimer = { }; m_modAttackSpeedPct.fill(1.0f); @@ -11779,7 +11779,7 @@ bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading /*= fa return false; m_vehicleKit = std::make_unique(this, vehInfo, creatureEntry); - m_updateFlag |= UPDATEFLAG_VEHICLE; + m_updateFlag.Vehicle = true; m_unitTypeMask |= UNIT_MASK_VEHICLE; if (!loading) @@ -11799,7 +11799,7 @@ void Unit::RemoveVehicleKit(bool onRemoveFromWorld /*= false*/) m_vehicleKit->Uninstall(); m_vehicleKit.reset(); - m_updateFlag &= ~UPDATEFLAG_VEHICLE; + m_updateFlag.Vehicle = false; m_unitTypeMask &= ~UNIT_MASK_VEHICLE; RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK | UNIT_NPC_FLAG_PLAYER_VEHICLE); }