From 5492b3f23117f112df118c0f5df625ccbd224d17 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Wed, 25 Feb 2026 22:11:31 -0600 Subject: [PATCH] feat(object): set position and facing in CGUnit_C ctor --- src/object/client/CGUnit_C.cpp | 6 ++++- src/object/client/CGUnit_C.hpp | 4 ++++ src/object/client/CMovementData_C.cpp | 7 ++++++ src/object/client/CMovementData_C.hpp | 14 +++++++++++ src/object/client/CMovement_C.hpp | 15 ++++++++++++ src/object/movement/CMovementShared.cpp | 15 ++++++++++++ src/object/movement/CMovementShared.hpp | 31 +++++++++++++++++++++++++ src/object/movement/CMovementStatus.cpp | 2 +- src/object/movement/CPassenger.cpp | 18 ++++++++++++++ src/object/movement/CPassenger.hpp | 30 ++++++++++++++++++++++++ 10 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 src/object/client/CMovementData_C.cpp create mode 100644 src/object/client/CMovementData_C.hpp create mode 100644 src/object/client/CMovement_C.hpp create mode 100644 src/object/movement/CMovementShared.cpp create mode 100644 src/object/movement/CMovementShared.hpp create mode 100644 src/object/movement/CPassenger.cpp create mode 100644 src/object/movement/CPassenger.hpp diff --git a/src/object/client/CGUnit_C.cpp b/src/object/client/CGUnit_C.cpp index d040676..a13d418 100644 --- a/src/object/client/CGUnit_C.cpp +++ b/src/object/client/CGUnit_C.cpp @@ -96,7 +96,11 @@ const char* CGUnit_C::GetDisplayRaceNameFromRecord(const ChrRacesRec* raceRec, U return raceRec->m_name; } -CGUnit_C::CGUnit_C(uint32_t time, CClientObjCreate& objCreate) : CGObject_C(time, objCreate) { +CGUnit_C::CGUnit_C(uint32_t time, CClientObjCreate& objCreate) + : CGObject_C(time, objCreate) + , m_movement(&this->m_localMovement) + , m_localMovement(objCreate.move.status.position28, objCreate.move.status.facing34, this->GetGUID(), this) +{ // TODO this->RefreshDataPointers(); diff --git a/src/object/client/CGUnit_C.hpp b/src/object/client/CGUnit_C.hpp index 5f4a1e2..66bab58 100644 --- a/src/object/client/CGUnit_C.hpp +++ b/src/object/client/CGUnit_C.hpp @@ -4,6 +4,7 @@ #include "object/client/CClientObjCreate.hpp" #include "object/client/CGObject_C.hpp" #include "object/client/CGUnit.hpp" +#include "object/client/CMovementData_C.hpp" #include "object/Types.hpp" #include "util/GUID.hpp" @@ -48,6 +49,9 @@ class CGUnit_C : public CGObject_C, public CGUnit { private: // Private member variables + CMovementData_C* m_movement; + // TODO + CMovementData_C m_localMovement; // TODO CreatureDisplayInfoRec* m_displayInfo; CreatureDisplayInfoExtraRec* m_displayInfoExtra; diff --git a/src/object/client/CMovementData_C.cpp b/src/object/client/CMovementData_C.cpp new file mode 100644 index 0000000..edc66d6 --- /dev/null +++ b/src/object/client/CMovementData_C.cpp @@ -0,0 +1,7 @@ +#include "object/client/CMovementData_C.hpp" + +CMovementData_C::CMovementData_C(const C3Vector& position, float facing, const WOWGUID& guid, CGUnit_C* unit) + : CMovementShared(0, position, facing, guid) +{ + // TODO +} diff --git a/src/object/client/CMovementData_C.hpp b/src/object/client/CMovementData_C.hpp new file mode 100644 index 0000000..84ed154 --- /dev/null +++ b/src/object/client/CMovementData_C.hpp @@ -0,0 +1,14 @@ +#ifndef OBJECT_CLIENT_C_MOVEMENT_DATA_C_HPP +#define OBJECT_CLIENT_C_MOVEMENT_DATA_C_HPP + +#include "object/movement/CMovementShared.hpp" + +class CGUnit_C; + +class CMovementData_C : public CMovementShared { + public: + // Public member functions + CMovementData_C(const C3Vector& position, float facing, const WOWGUID& guid, CGUnit_C* unit); +}; + +#endif diff --git a/src/object/client/CMovement_C.hpp b/src/object/client/CMovement_C.hpp new file mode 100644 index 0000000..bdfae7d --- /dev/null +++ b/src/object/client/CMovement_C.hpp @@ -0,0 +1,15 @@ +#ifndef OBJECT_CLIENT_C_MOVEMENT_C_HPP +#define OBJECT_CLIENT_C_MOVEMENT_C_HPP + +#include "object/client/CMovementData_C.hpp" +#include "util/GUID.hpp" +#include + +class CMovement_C : public CMovementData_C { + public: + // Public member functions + CMovement_C(const C3Vector& position, float facing, const WOWGUID& guid, CGUnit_C* unit) + : CMovementData_C(position, facing, guid, unit) {}; +}; + +#endif diff --git a/src/object/movement/CMovementShared.cpp b/src/object/movement/CMovementShared.cpp new file mode 100644 index 0000000..ea1b7b5 --- /dev/null +++ b/src/object/movement/CMovementShared.cpp @@ -0,0 +1,15 @@ +#include "object/movement/CMovementShared.hpp" + +CMovementShared::CMovementShared(const WOWGUID& transportGUID, const C3Vector& position, float facing, const WOWGUID& guid) + : CPassenger(transportGUID, position, guid) +{ + this->m_facing = facing; + + this->m_anchorPosition = position; + this->m_anchorFacing = facing; + this->m_anchorPitch = 0.0f; + this->m_cosAnchorPitch = 1.0f; + this->m_sinAnchorPitch = 0.0f; + + this->m_spline = nullptr; +} diff --git a/src/object/movement/CMovementShared.hpp b/src/object/movement/CMovementShared.hpp new file mode 100644 index 0000000..8d7a024 --- /dev/null +++ b/src/object/movement/CMovementShared.hpp @@ -0,0 +1,31 @@ +#ifndef OBJECT_MOVEMENT_C_MOVEMENT_SHARED_HPP +#define OBJECT_MOVEMENT_C_MOVEMENT_SHARED_HPP + +#include "object/movement/CPassenger.hpp" +#include "util/GUID.hpp" +#include + +struct CMoveSpline; + +class CMovementShared : public CPassenger { + public: + // Public member functions + CMovementShared(const WOWGUID& transportGUID, const C3Vector& position, float facing, const WOWGUID& guid); + + protected: + // Protected member variables + // TODO + C3Vector m_anchorPosition; + float m_anchorFacing; + float m_anchorPitch; + // TODO + C3Vector m_direction; + C2Vector m_direction2d; + float m_cosAnchorPitch; + float m_sinAnchorPitch; + // TODO + CMoveSpline* m_spline; + // TODO +}; + +#endif diff --git a/src/object/movement/CMovementStatus.cpp b/src/object/movement/CMovementStatus.cpp index 844b65f..9bfd717 100644 --- a/src/object/movement/CMovementStatus.cpp +++ b/src/object/movement/CMovementStatus.cpp @@ -48,7 +48,7 @@ CDataStore& operator>>(CDataStore& msg, CMovementStatus& move) { msg.Get(move.uint14); msg.Get(move.uint0); - msg >> move.position18; + msg >> move.position28; msg.Get(move.facing34); if (move.moveFlags & 0x200) { diff --git a/src/object/movement/CPassenger.cpp b/src/object/movement/CPassenger.cpp new file mode 100644 index 0000000..8a56829 --- /dev/null +++ b/src/object/movement/CPassenger.cpp @@ -0,0 +1,18 @@ +#include "object/movement/CPassenger.hpp" +#include + +C3Vector CPassenger::GetPosition() const { + return GetPosition(this->m_position); +} + +C3Vector CPassenger::GetPosition(const C3Vector& position) const { + // If on transport, transform position by transport matrix + if (this->m_transportGUID) { + C44Matrix transportMatrix; + // MovementGetTransportMtxX(this->m_transportGUID, &transportMatrix); + + return position * transportMatrix; + } + + return position; +} diff --git a/src/object/movement/CPassenger.hpp b/src/object/movement/CPassenger.hpp new file mode 100644 index 0000000..ca5560d --- /dev/null +++ b/src/object/movement/CPassenger.hpp @@ -0,0 +1,30 @@ +#ifndef OBJECT_MOVEMENT_C_PASSENGER_HPP +#define OBJECT_MOVEMENT_C_PASSENGER_HPP + +#include "util/GUID.hpp" +#include + +class CPassenger { + public: + // Public member functions + CPassenger(const WOWGUID& transportGUID, const C3Vector& position, const WOWGUID& guid) + : m_transportGUID(transportGUID) + , m_position(position) + , m_facing(0.0f) + , m_guid(guid) {}; + C3Vector GetPosition() const; + C3Vector GetPosition(const C3Vector& position) const; + + protected: + // Protected member variables + // TODO + WOWGUID m_transportGUID; + C3Vector m_position; + // TODO + float m_facing; + // TODO + const WOWGUID& m_guid; + // TODO +}; + +#endif