diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d31f0ef457..7ed5ca85d7 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -195,6 +195,16 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c break; } + if (WorldObject const* worldObject = dynamic_cast(this)) + { + if (!(flags & UPDATEFLAG_LIVING)) + if (!worldObject->m_movementInfo.transport.guid.IsEmpty()) + flags |= UPDATEFLAG_TRANSPORT_POSITION; + + if (worldObject->GetAIAnimKitId() || worldObject->GetMovementAnimKitId() || worldObject->GetMeleeAnimKitId()) + flags |= UPDATEFLAG_ANIMKITS; + } + if (flags & UPDATEFLAG_STATIONARY_POSITION) { // UPDATETYPE_CREATE_OBJECT2 for some gameobject types... @@ -215,14 +225,9 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c } if (Unit const* unit = ToUnit()) - { if (unit->GetVictim()) flags |= UPDATEFLAG_HAS_TARGET; - if (unit->GetAIAnimKitId() || unit->GetMovementAnimKitId() || unit->GetMeleeAnimKitId()) - flags |= UPDATEFLAG_ANIMKITS; - } - ByteBuffer buf(500); buf << uint8(updateType); buf << GetPackGUID(); @@ -364,7 +369,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const data->WriteBit(flags & UPDATEFLAG_LIVING); data->WriteBits(stopFrameCount, 24); data->WriteBit(0); - data->WriteBit(flags & UPDATEFLAG_GO_TRANSPORT_POSITION); + data->WriteBit(flags & UPDATEFLAG_TRANSPORT_POSITION); data->WriteBit(flags & UPDATEFLAG_STATIONARY_POSITION); data->WriteBit(flags & UPDATEFLAG_UNK5); data->WriteBit(0); @@ -468,10 +473,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const if (flags & UPDATEFLAG_ANIMKITS) { - Unit const* unit = ToUnit(); - data->WriteBit(unit->GetAIAnimKitId() == 0); - data->WriteBit(unit->GetMovementAnimKitId() == 0); - data->WriteBit(unit->GetMeleeAnimKitId() == 0); + WorldObject const* self = static_cast(this); + *data << uint16(self->GetAIAnimKitId()); // AiID + *data << uint16(self->GetMovementAnimKitId()); // MovementID + *data << uint16(self->GetMeleeAnimKitId()); // MeleeID } data->FlushBits(); @@ -1197,7 +1202,8 @@ void MovementInfo::OutDebug() WorldObject::WorldObject(bool isWorldObject) : WorldLocation(), LastUsedScriptID(0), m_name(""), m_isActive(false), m_isWorldObject(isWorldObject), m_zoneScript(NULL), m_transport(NULL), m_currMap(NULL), m_InstanceId(0), -m_phaseMask(PHASEMASK_NORMAL), _dbPhase(0), m_notifyflags(0), m_executed_notifies(0) +m_phaseMask(PHASEMASK_NORMAL), _dbPhase(0), m_notifyflags(0), m_executed_notifies(0), +m_aiAnimKitId(0), m_movementAnimKitId(0), m_meleeAnimKitId(0) { m_serverSideVisibility.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE | GHOST_VISIBILITY_GHOST); m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GHOST, GHOST_VISIBILITY_ALIVE); @@ -2940,6 +2946,45 @@ ObjectGuid WorldObject::GetTransGUID() const return ObjectGuid::Empty; } +void WorldObject::SetAIAnimKitId(uint16 animKitId) +{ + if (m_aiAnimKitId == animKitId) + return; + + m_aiAnimKitId = animKitId; + + WorldPacket data(SMSG_SET_AI_ANIM_KIT, 8 + 2); + data << GetPackGUID(); + data << uint16(animKitId); + SendMessageToSet(&data, true); +} + +void WorldObject::SetMovementAnimKitId(uint16 animKitId) +{ + if (m_movementAnimKitId == animKitId) + return; + + m_movementAnimKitId = animKitId; + + WorldPacket data(SMSG_SET_MOVEMENT_ANIM_KIT, 8 + 2); + data << GetPackGUID(); + data << uint16(animKitId); + SendMessageToSet(&data, true); +} + +void WorldObject::SetMeleeAnimKitId(uint16 animKitId) +{ + if (m_meleeAnimKitId == animKitId) + return; + + m_meleeAnimKitId = animKitId; + + WorldPacket data(SMSG_SET_MELEE_ANIM_KIT, 8 + 2); + data << GetPackGUID(); + data << uint16(animKitId); + SendMessageToSet(&data, true); +} + void WorldObject::RebuildTerrainSwaps() { // Clear all terrain swaps, will be rebuilt below diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 4d9b716760..72441cb14d 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -641,6 +641,13 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation virtual float GetStationaryZ() const { return GetPositionZ(); } virtual float GetStationaryO() const { return GetOrientation(); } + uint16 GetAIAnimKitId() const { return m_aiAnimKitId; } + void SetAIAnimKitId(uint16 animKitId); + uint16 GetMovementAnimKitId() const { return m_movementAnimKitId; } + void SetMovementAnimKitId(uint16 animKitId); + uint16 GetMeleeAnimKitId() const { return m_meleeAnimKitId; } + void SetMeleeAnimKitId(uint16 animKitId); + protected: std::string m_name; bool m_isActive; @@ -681,6 +688,10 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation bool CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkAlert = false) const; bool CanDetectInvisibilityOf(WorldObject const* obj) const; bool CanDetectStealthOf(WorldObject const* obj, bool checkAlert = false) const; + + uint16 m_aiAnimKitId; + uint16 m_movementAnimKitId; + uint16 m_meleeAnimKitId; }; namespace Trinity diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1ddceb3a22..cf0841a9bd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -278,10 +278,6 @@ Unit::Unit(bool isWorldObject) : _oldFactionId = 0; _isWalkingBeforeCharm = false; - - _aiAnimKitId = 0; - _movementAnimKitId = 0; - _meleeAnimKitId = 0; } //////////////////////////////////////////////////////////// @@ -13950,45 +13946,6 @@ void Unit::SendDurabilityLoss(Player* receiver, uint32 percent) receiver->GetSession()->SendPacket(&data); } -void Unit::SetAIAnimKitId(uint16 animKitId) -{ - if (_aiAnimKitId == animKitId) - return; - - _aiAnimKitId = animKitId; - - WorldPacket data(SMSG_SET_AI_ANIM_KIT, 8 + 2); - data << GetPackGUID(); - data << uint16(animKitId); - SendMessageToSet(&data, true); -} - -void Unit::SetMovementAnimKitId(uint16 animKitId) -{ - if (_movementAnimKitId == animKitId) - return; - - _movementAnimKitId = animKitId; - - WorldPacket data(SMSG_SET_MOVEMENT_ANIM_KIT, 8 + 2); - data << GetPackGUID(); - data << uint16(animKitId); - SendMessageToSet(&data, true); -} - -void Unit::SetMeleeAnimKitId(uint16 animKitId) -{ - if (_meleeAnimKitId == animKitId) - return; - - _meleeAnimKitId = animKitId; - - WorldPacket data(SMSG_SET_MELEE_ANIM_KIT, 8 + 2); - data << GetPackGUID(); - data << uint16(animKitId); - SendMessageToSet(&data, true); -} - void Unit::PlayOneShotAnimKit(uint16 animKitId) { WorldPacket data(SMSG_PLAY_ONE_SHOT_ANIM_KIT, 7+2); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1e536e1a1a..338563b9cc 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1448,12 +1448,6 @@ class TC_GAME_API Unit : public WorldObject MountCapabilityEntry const* GetMountCapability(uint32 mountType) const; void SendDurabilityLoss(Player* receiver, uint32 percent); - uint16 GetAIAnimKitId() const { return _aiAnimKitId; } - void SetAIAnimKitId(uint16 animKitId); - uint16 GetMovementAnimKitId() const { return _movementAnimKitId; } - void SetMovementAnimKitId(uint16 animKitId); - uint16 GetMeleeAnimKitId() const { return _meleeAnimKitId; } - void SetMeleeAnimKitId(uint16 animKitId); void PlayOneShotAnimKit(uint16 animKitId); uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; } @@ -2324,9 +2318,6 @@ class TC_GAME_API Unit : public WorldObject time_t _lastDamagedTime; // Part of Evade mechanics SpellHistory* m_spellHistory; - uint16 _aiAnimKitId; - uint16 _movementAnimKitId; - uint16 _meleeAnimKitId; }; namespace Trinity