diff --git a/src/object/client/CGContainer.cpp b/src/object/client/CGContainer.cpp index 07eb44e..0c9b943 100644 --- a/src/object/client/CGContainer.cpp +++ b/src/object/client/CGContainer.cpp @@ -1,10 +1,26 @@ #include "object/client/CGContainer.hpp" #include "object/client/CGItem.hpp" +uint32_t CGContainer::GetBaseOffset() { + return CGItem::TotalFields(); +} + +uint32_t CGContainer::GetBaseOffsetSaved() { + return CGItem::TotalFieldsSaved(); +} + +uint32_t CGContainer::GetDataSize() { + return CGContainer::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGContainer::GetDataSizeSaved() { + return CGContainer::TotalFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGContainer::TotalFields() { - return CGItem::TotalFields() + 74; + return CGContainer::GetBaseOffset() + 74; } uint32_t CGContainer::TotalFieldsSaved() { - return CGItem::TotalFieldsSaved() + 72; + return CGContainer::GetBaseOffsetSaved() + 72; } diff --git a/src/object/client/CGContainer.hpp b/src/object/client/CGContainer.hpp index a9797c8..e8fe574 100644 --- a/src/object/client/CGContainer.hpp +++ b/src/object/client/CGContainer.hpp @@ -4,14 +4,24 @@ #include struct CGContainerData { - // TODO + uint32_t numSlots; + uint32_t pad; + uint64_t slots[36]; }; class CGContainer { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalFieldsSaved(); + + // Public member variables + CGContainerData* m_cont; + uint32_t* m_contSaved; }; #endif diff --git a/src/object/client/CGContainer_C.cpp b/src/object/client/CGContainer_C.cpp new file mode 100644 index 0000000..48b36cc --- /dev/null +++ b/src/object/client/CGContainer_C.cpp @@ -0,0 +1,8 @@ +#include "object/client/CGContainer_C.hpp" + +void CGContainer_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->CGItem_C::SetStorage(storage, saved); + + this->m_cont = reinterpret_cast(&storage[CGContainer::GetBaseOffset()]); + this->m_contSaved = &saved[CGContainer::GetBaseOffsetSaved()]; +} diff --git a/src/object/client/CGContainer_C.hpp b/src/object/client/CGContainer_C.hpp index 39eeae2..2b06c97 100644 --- a/src/object/client/CGContainer_C.hpp +++ b/src/object/client/CGContainer_C.hpp @@ -6,7 +6,8 @@ class CGContainer_C : public CGItem_C, public CGContainer { public: - // TODO + // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); }; #endif diff --git a/src/object/client/CGCorpse.cpp b/src/object/client/CGCorpse.cpp index 5ccb069..3dd6ec2 100644 --- a/src/object/client/CGCorpse.cpp +++ b/src/object/client/CGCorpse.cpp @@ -1,10 +1,26 @@ #include "object/client/CGCorpse.hpp" #include "object/client/CGObject.hpp" +uint32_t CGCorpse::GetBaseOffset() { + return CGObject::TotalFields(); +} + +uint32_t CGCorpse::GetBaseOffsetSaved() { + return CGObject::TotalFieldsSaved(); +} + +uint32_t CGCorpse::GetDataSize() { + return CGCorpse::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGCorpse::GetDataSizeSaved() { + return CGCorpse::TotalFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGCorpse::TotalFields() { - return CGObject::TotalFields() + 30; + return CGCorpse::GetBaseOffset() + 30; } uint32_t CGCorpse::TotalFieldsSaved() { - return CGObject::TotalFieldsSaved() + 3; + return CGCorpse::GetBaseOffsetSaved() + 3; } diff --git a/src/object/client/CGCorpse.hpp b/src/object/client/CGCorpse.hpp index 902e48e..be7add3 100644 --- a/src/object/client/CGCorpse.hpp +++ b/src/object/client/CGCorpse.hpp @@ -10,8 +10,16 @@ struct CGCorpseData { class CGCorpse { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalFieldsSaved(); + + // Public member variables + CGCorpseData* m_corpse; + uint32_t* m_corpseSaved; }; #endif diff --git a/src/object/client/CGCorpse_C.cpp b/src/object/client/CGCorpse_C.cpp new file mode 100644 index 0000000..1cab4e4 --- /dev/null +++ b/src/object/client/CGCorpse_C.cpp @@ -0,0 +1,8 @@ +#include "object/client/CGCorpse_C.hpp" + +void CGCorpse_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->CGObject_C::SetStorage(storage, saved); + + this->m_corpse = reinterpret_cast(&storage[CGCorpse::GetBaseOffset()]); + this->m_corpseSaved = &saved[CGCorpse::GetBaseOffsetSaved()]; +} diff --git a/src/object/client/CGCorpse_C.hpp b/src/object/client/CGCorpse_C.hpp index df5d558..ab5c856 100644 --- a/src/object/client/CGCorpse_C.hpp +++ b/src/object/client/CGCorpse_C.hpp @@ -6,7 +6,8 @@ class CGCorpse_C : public CGObject_C, public CGCorpse { public: - // TODO + // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); }; #endif diff --git a/src/object/client/CGDynamicObject.cpp b/src/object/client/CGDynamicObject.cpp index 7a4e840..f55ca10 100644 --- a/src/object/client/CGDynamicObject.cpp +++ b/src/object/client/CGDynamicObject.cpp @@ -1,10 +1,26 @@ #include "object/client/CGDynamicObject.hpp" #include "object/client/CGObject.hpp" +uint32_t CGDynamicObject::GetBaseOffset() { + return CGObject::TotalFields(); +} + +uint32_t CGDynamicObject::GetBaseOffsetSaved() { + return CGObject::TotalFieldsSaved(); +} + +uint32_t CGDynamicObject::GetDataSize() { + return CGDynamicObject::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGDynamicObject::GetDataSizeSaved() { + return CGDynamicObject::TotalFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGDynamicObject::TotalFields() { - return CGObject::TotalFields() + 6; + return CGDynamicObject::GetBaseOffset() + 6; } uint32_t CGDynamicObject::TotalFieldsSaved() { - return CGObject::TotalFieldsSaved(); + return CGDynamicObject::GetBaseOffsetSaved() + 0; } diff --git a/src/object/client/CGDynamicObject.hpp b/src/object/client/CGDynamicObject.hpp index 2c32a10..8f68718 100644 --- a/src/object/client/CGDynamicObject.hpp +++ b/src/object/client/CGDynamicObject.hpp @@ -10,8 +10,16 @@ struct CGDynamicObjectData { class CGDynamicObject { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalFieldsSaved(); + + // Public member variables + CGDynamicObjectData* m_dynamicObj; + uint32_t* m_dynamicObjSaved; }; #endif diff --git a/src/object/client/CGDynamicObject_C.cpp b/src/object/client/CGDynamicObject_C.cpp new file mode 100644 index 0000000..4d3f5cf --- /dev/null +++ b/src/object/client/CGDynamicObject_C.cpp @@ -0,0 +1,8 @@ +#include "object/client/CGDynamicObject_C.hpp" + +void CGDynamicObject_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->CGObject_C::SetStorage(storage, saved); + + this->m_dynamicObj = reinterpret_cast(&storage[CGDynamicObject::GetBaseOffset()]); + this->m_dynamicObjSaved = &saved[CGDynamicObject::GetBaseOffsetSaved()]; +} diff --git a/src/object/client/CGDynamicObject_C.hpp b/src/object/client/CGDynamicObject_C.hpp index 6333b54..59fd38e 100644 --- a/src/object/client/CGDynamicObject_C.hpp +++ b/src/object/client/CGDynamicObject_C.hpp @@ -6,7 +6,8 @@ class CGDynamicObject_C : public CGObject_C, public CGDynamicObject { public: - // TODO + // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); }; #endif diff --git a/src/object/client/CGGameObject.cpp b/src/object/client/CGGameObject.cpp index 7f9b0d4..5a498f5 100644 --- a/src/object/client/CGGameObject.cpp +++ b/src/object/client/CGGameObject.cpp @@ -1,10 +1,26 @@ #include "object/client/CGGameObject.hpp" #include "object/client/CGObject.hpp" +uint32_t CGGameObject::GetBaseOffset() { + return CGObject::TotalFields(); +} + +uint32_t CGGameObject::GetBaseOffsetSaved() { + return CGObject::TotalFieldsSaved(); +} + +uint32_t CGGameObject::GetDataSize() { + return CGGameObject::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGGameObject::GetDataSizeSaved() { + return CGGameObject::TotalFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGGameObject::TotalFields() { - return CGObject::TotalFields() + 12; + return CGGameObject::GetBaseOffset() + 12; } uint32_t CGGameObject::TotalFieldsSaved() { - return CGObject::TotalFieldsSaved() + 4; + return CGGameObject::GetBaseOffsetSaved() + 4; } diff --git a/src/object/client/CGGameObject.hpp b/src/object/client/CGGameObject.hpp index ac573d0..5469f1f 100644 --- a/src/object/client/CGGameObject.hpp +++ b/src/object/client/CGGameObject.hpp @@ -10,8 +10,16 @@ struct CGGameObjectData { class CGGameObject { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalFieldsSaved(); + + // Public member variables + CGGameObjectData* m_gameObj; + uint32_t* m_gameObjSaved; }; #endif diff --git a/src/object/client/CGGameObject_C.cpp b/src/object/client/CGGameObject_C.cpp new file mode 100644 index 0000000..82bd71b --- /dev/null +++ b/src/object/client/CGGameObject_C.cpp @@ -0,0 +1,8 @@ +#include "object/client/CGGameObject_C.hpp" + +void CGGameObject_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->CGObject_C::SetStorage(storage, saved); + + this->m_gameObj = reinterpret_cast(&storage[CGGameObject::GetBaseOffset()]); + this->m_gameObjSaved = &saved[CGGameObject::GetBaseOffsetSaved()]; +} diff --git a/src/object/client/CGGameObject_C.hpp b/src/object/client/CGGameObject_C.hpp index b3349a5..d57e89f 100644 --- a/src/object/client/CGGameObject_C.hpp +++ b/src/object/client/CGGameObject_C.hpp @@ -6,7 +6,8 @@ class CGGameObject_C : public CGObject_C, public CGGameObject { public: - // TODO + // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); }; #endif diff --git a/src/object/client/CGItem.cpp b/src/object/client/CGItem.cpp index f540e0f..5c849cb 100644 --- a/src/object/client/CGItem.cpp +++ b/src/object/client/CGItem.cpp @@ -1,10 +1,26 @@ #include "object/client/CGItem.hpp" #include "object/client/CGObject.hpp" +uint32_t CGItem::GetBaseOffset() { + return CGObject::TotalFields(); +} + +uint32_t CGItem::GetBaseOffsetSaved() { + return CGObject::TotalFieldsSaved(); +} + +uint32_t CGItem::GetDataSize() { + return CGItem::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGItem::GetDataSizeSaved() { + return CGItem::TotalFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGItem::TotalFields() { - return CGObject::TotalFields() + 58; + return CGItem::GetBaseOffset() + 58; } uint32_t CGItem::TotalFieldsSaved() { - return CGObject::TotalFieldsSaved() + 47; + return CGItem::GetBaseOffsetSaved() + 47; } diff --git a/src/object/client/CGItem.hpp b/src/object/client/CGItem.hpp index 2efe3dc..7c9b52b 100644 --- a/src/object/client/CGItem.hpp +++ b/src/object/client/CGItem.hpp @@ -3,15 +3,43 @@ #include +struct ItemEnchantment { + int32_t id; + int32_t expiration; + int32_t chargesRemaining; +}; + struct CGItemData { - // TODO + uint64_t owner; + uint64_t containedIn; + uint64_t creator; + uint64_t giftCreator; + uint32_t stackCount; + int32_t expiration; + int32_t spellCharges[5]; + uint32_t flags; + ItemEnchantment enchantments[12]; + int32_t propertySeed; + int32_t randomPropertiesID; + int32_t durability; + int32_t maxDurability; + int32_t createPlayedTime; + int32_t pad; }; class CGItem { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalFieldsSaved(); + + // Public member variables + CGItemData* m_item; + uint32_t* m_itemSaved; }; #endif diff --git a/src/object/client/CGItem_C.cpp b/src/object/client/CGItem_C.cpp new file mode 100644 index 0000000..7756f76 --- /dev/null +++ b/src/object/client/CGItem_C.cpp @@ -0,0 +1,8 @@ +#include "object/client/CGItem_C.hpp" + +void CGItem_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->CGObject_C::SetStorage(storage, saved); + + this->m_item = reinterpret_cast(&storage[CGItem::GetBaseOffset()]); + this->m_itemSaved = &saved[CGItem::GetBaseOffsetSaved()]; +} diff --git a/src/object/client/CGItem_C.hpp b/src/object/client/CGItem_C.hpp index 842f7d0..0656562 100644 --- a/src/object/client/CGItem_C.hpp +++ b/src/object/client/CGItem_C.hpp @@ -6,7 +6,8 @@ class CGItem_C : public CGObject_C, public CGItem { public: - // TODO + // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); }; #endif diff --git a/src/object/client/CGObject.cpp b/src/object/client/CGObject.cpp index fd6d02d..d292eec 100644 --- a/src/object/client/CGObject.cpp +++ b/src/object/client/CGObject.cpp @@ -1,9 +1,25 @@ #include "object/client/CGObject.hpp" +uint32_t CGObject::GetBaseOffset() { + return 0; +} + +uint32_t CGObject::GetBaseOffsetSaved() { + return 0; +} + +uint32_t CGObject::GetDataSize() { + return CGObject::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGObject::GetDataSizeSaved() { + return CGObject::TotalFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGObject::TotalFields() { - return 6; + return CGObject::GetBaseOffset() + 6; } uint32_t CGObject::TotalFieldsSaved() { - return 3; + return CGObject::GetBaseOffsetSaved() + 3; } diff --git a/src/object/client/CGObject.hpp b/src/object/client/CGObject.hpp index bf054ce..bcbde33 100644 --- a/src/object/client/CGObject.hpp +++ b/src/object/client/CGObject.hpp @@ -15,6 +15,10 @@ struct CGObjectData { class CGObject { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalFieldsSaved(); diff --git a/src/object/client/CGObject_C.cpp b/src/object/client/CGObject_C.cpp index c5c8df8..c311673 100644 --- a/src/object/client/CGObject_C.cpp +++ b/src/object/client/CGObject_C.cpp @@ -1,5 +1,10 @@ #include "object/client/CGObject_C.hpp" +void CGObject_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->m_obj = reinterpret_cast(&storage[CGObject::GetBaseOffset()]); + this->m_objSaved = &saved[CGObject::GetBaseOffsetSaved()]; +} + void CGObject_C::SetTypeID(OBJECT_TYPE_ID typeID) { this->m_typeID = typeID; diff --git a/src/object/client/CGObject_C.hpp b/src/object/client/CGObject_C.hpp index 1c9e22f..54ed069 100644 --- a/src/object/client/CGObject_C.hpp +++ b/src/object/client/CGObject_C.hpp @@ -9,6 +9,7 @@ class CGObject_C : public CGObject, public TSHashObject { public: // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); void SetTypeID(OBJECT_TYPE_ID typeID); }; diff --git a/src/object/client/CGPlayer.cpp b/src/object/client/CGPlayer.cpp index e9567e0..5f30bcb 100644 --- a/src/object/client/CGPlayer.cpp +++ b/src/object/client/CGPlayer.cpp @@ -1,18 +1,42 @@ #include "object/client/CGPlayer.hpp" #include "object/client/CGUnit.hpp" +uint32_t CGPlayer::GetBaseOffset() { + return CGUnit::TotalFields(); +} + +uint32_t CGPlayer::GetBaseOffsetSaved() { + return CGUnit::TotalFieldsSaved(); +} + +uint32_t CGPlayer::GetDataSize() { + return CGPlayer::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGPlayer::GetDataSizeSaved() { + return CGPlayer::TotalFieldsSaved() * sizeof(uint32_t); +} + +uint32_t CGPlayer::GetRemoteDataSize() { + return CGPlayer::TotalRemoteFields() * sizeof(uint32_t); +} + +uint32_t CGPlayer::GetRemoteDataSizeSaved() { + return CGPlayer::TotalRemoteFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGPlayer::TotalFields() { - return CGUnit::TotalFields() + 1178; + return CGPlayer::GetBaseOffset() + 1178; } uint32_t CGPlayer::TotalRemoteFields() { - return CGUnit::TotalFields() + 176; + return CGPlayer::GetBaseOffset() + 176; } uint32_t CGPlayer::TotalFieldsSaved() { - return CGUnit::TotalFieldsSaved() + 1043; + return CGPlayer::GetBaseOffsetSaved() + 1043; } uint32_t CGPlayer::TotalRemoteFieldsSaved() { - return CGUnit::TotalFieldsSaved() + 173; + return CGPlayer::GetBaseOffsetSaved() + 173; } diff --git a/src/object/client/CGPlayer.hpp b/src/object/client/CGPlayer.hpp index 0b3d6da..13a655e 100644 --- a/src/object/client/CGPlayer.hpp +++ b/src/object/client/CGPlayer.hpp @@ -10,10 +10,20 @@ struct CGPlayerData { class CGPlayer { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); + static uint32_t GetRemoteDataSize(); + static uint32_t GetRemoteDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalRemoteFields(); static uint32_t TotalFieldsSaved(); static uint32_t TotalRemoteFieldsSaved(); + + // Public member variables + CGPlayerData* m_player; + uint32_t* m_playerSaved; }; #endif diff --git a/src/object/client/CGPlayer_C.cpp b/src/object/client/CGPlayer_C.cpp index 978f3b3..a838567 100644 --- a/src/object/client/CGPlayer_C.cpp +++ b/src/object/client/CGPlayer_C.cpp @@ -3,6 +3,13 @@ #include "object/Types.hpp" #include +void CGPlayer_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->CGUnit_C::SetStorage(storage, saved); + + this->m_player = reinterpret_cast(&storage[CGPlayer::GetBaseOffset()]); + this->m_playerSaved = &saved[CGPlayer::GetBaseOffsetSaved()]; +} + uint32_t Player_C_GetDisplayId(uint32_t race, uint32_t sex) { STORM_ASSERT(sex < UNITSEX_LAST); diff --git a/src/object/client/CGPlayer_C.hpp b/src/object/client/CGPlayer_C.hpp index cfe3c02..88fa230 100644 --- a/src/object/client/CGPlayer_C.hpp +++ b/src/object/client/CGPlayer_C.hpp @@ -9,7 +9,8 @@ class CreatureModelDataRec; class CGPlayer_C : public CGUnit_C, public CGPlayer { public: - // TODO + // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); }; uint32_t Player_C_GetDisplayId(uint32_t race, uint32_t sex); diff --git a/src/object/client/CGUnit.cpp b/src/object/client/CGUnit.cpp index 051d6c9..05b42e2 100644 --- a/src/object/client/CGUnit.cpp +++ b/src/object/client/CGUnit.cpp @@ -1,10 +1,26 @@ #include "object/client/CGUnit.hpp" #include "object/client/CGObject.hpp" +uint32_t CGUnit::GetBaseOffset() { + return CGObject::TotalFields(); +} + +uint32_t CGUnit::GetBaseOffsetSaved() { + return CGObject::TotalFieldsSaved(); +} + +uint32_t CGUnit::GetDataSize() { + return CGUnit::TotalFields() * sizeof(uint32_t); +} + +uint32_t CGUnit::GetDataSizeSaved() { + return CGUnit::TotalFieldsSaved() * sizeof(uint32_t); +} + uint32_t CGUnit::TotalFields() { - return CGObject::TotalFields() + 142; + return CGUnit::GetBaseOffset() + 142; } uint32_t CGUnit::TotalFieldsSaved() { - return CGObject::TotalFieldsSaved() + 123; + return CGUnit::GetBaseOffsetSaved() + 123; } diff --git a/src/object/client/CGUnit.hpp b/src/object/client/CGUnit.hpp index fa345ae..55bba2d 100644 --- a/src/object/client/CGUnit.hpp +++ b/src/object/client/CGUnit.hpp @@ -4,14 +4,86 @@ #include struct CGUnitData { - // TODO + uint64_t charm; + uint64_t summon; + uint64_t critter; + uint64_t charmedBy; + uint64_t summonedBy; + uint64_t createdBy; + uint64_t target; + uint64_t channelObject; + int32_t channelSpell; + int32_t pad1; + int32_t health; + int32_t power[7]; + int32_t maxHealth; + int32_t maxPower[7]; + int32_t powerRegenFlatModifier[7]; + int32_t powerRegenInterruptedFlatModifier[7]; + int32_t level; + int32_t factionTemplate; + int32_t virtualItemSlotID[3]; + uint32_t flags; + uint32_t flags2; + uint32_t auraState; + uint32_t attackRoundBaseTime[2]; + uint32_t rangedAttackTime; + float boundingRadius; + float combatReach; + int32_t displayID; + int32_t nativeDisplayID; + int32_t mountDisplayID; + uint32_t minDamage; + uint32_t maxDamage; + uint32_t minOffhandDamage; + uint32_t maxOffhandDamage; + int32_t pad2; + uint32_t petNumber; + uint32_t petNameTimestamp; + uint32_t petExperience; + uint32_t petNextLevelExperience; + uint32_t dynamicFlags; + int32_t modCastingSpeed; + int32_t createdBySpell; + uint32_t npcFlags; + uint32_t emoteState; + int32_t stats[5]; + int32_t posStats[5]; + int32_t negStats[5]; + int32_t resistance[7]; + int32_t resistanceBuffModsPositive[7]; + int32_t resistanceBuffModsNegative[7]; + int32_t baseMana; + int32_t baseHealth; + int32_t pad3; + int32_t attackPower; + int32_t attackPowerMods; + int32_t attackPowerMultiplier; + int32_t rangedAttackPower; + int32_t rangedAttackPowerMods; + int32_t rangedAttackPowerMultiplier; + int32_t minRangedDamage; + int32_t maxRangedDamage; + int32_t powerCostModifier[7]; + int32_t powerCostMultiplier[7]; + int32_t maxHealthModifier; + int32_t hoverHeight; + int32_t pad4; }; class CGUnit { public: // Public static functions + static uint32_t GetBaseOffset(); + static uint32_t GetBaseOffsetSaved(); + static uint32_t GetDataSize(); + static uint32_t GetDataSizeSaved(); static uint32_t TotalFields(); static uint32_t TotalFieldsSaved(); + + // Public member variables + CGUnitData* m_unit; + uint32_t* m_unitSaved; }; #endif diff --git a/src/object/client/CGUnit_C.cpp b/src/object/client/CGUnit_C.cpp index dad2f37..8bff572 100644 --- a/src/object/client/CGUnit_C.cpp +++ b/src/object/client/CGUnit_C.cpp @@ -88,3 +88,10 @@ const char* CGUnit_C::GetDisplayRaceNameFromRecord(const ChrRacesRec* raceRec, U return raceRec->m_name; } + +void CGUnit_C::SetStorage(uint32_t* storage, uint32_t* saved) { + this->CGObject_C::SetStorage(storage, saved); + + this->m_unit = reinterpret_cast(&storage[CGUnit::GetBaseOffset()]); + this->m_unitSaved = &saved[CGUnit::GetBaseOffsetSaved()]; +} diff --git a/src/object/client/CGUnit_C.hpp b/src/object/client/CGUnit_C.hpp index 6c0f17b..f025b5b 100644 --- a/src/object/client/CGUnit_C.hpp +++ b/src/object/client/CGUnit_C.hpp @@ -13,6 +13,9 @@ class CGUnit_C : public CGObject_C, public CGUnit { // Public static functions static const char* GetDisplayClassNameFromRecord(const ChrClassesRec* classRec, UNIT_SEX sex, UNIT_SEX* displaySex); static const char* GetDisplayRaceNameFromRecord(const ChrRacesRec* raceRec, UNIT_SEX sex, UNIT_SEX* displaySex); + + // Public member functions + void SetStorage(uint32_t* storage, uint32_t* saved); }; #endif diff --git a/src/object/client/ObjMgr.cpp b/src/object/client/ObjMgr.cpp index 08d9d31..cb8452f 100644 --- a/src/object/client/ObjMgr.cpp +++ b/src/object/client/ObjMgr.cpp @@ -26,14 +26,14 @@ static ClntObjMgr* s_curMgr; #endif static uint32_t s_objTotalSize[] = { - static_cast(sizeof(CGObject_C) + sizeof(CGObjectData) + (sizeof(uint32_t) * CGObject::TotalFieldsSaved())), - static_cast(sizeof(CGItem_C) + sizeof(CGItemData) + (sizeof(uint32_t) * CGItem::TotalFieldsSaved())), - static_cast(sizeof(CGContainer_C) + sizeof(CGContainerData) + (sizeof(uint32_t) * CGContainer::TotalFieldsSaved())), - static_cast(sizeof(CGUnit_C) + sizeof(CGUnitData) + (sizeof(uint32_t) * CGUnit::TotalFieldsSaved())), - static_cast(sizeof(CGPlayer_C) + sizeof(CGPlayerData) + (sizeof(uint32_t) * CGPlayer::TotalRemoteFieldsSaved())), - static_cast(sizeof(CGGameObject_C) + sizeof(CGGameObjectData) + (sizeof(uint32_t) * CGGameObject::TotalFieldsSaved())), - static_cast(sizeof(CGDynamicObject_C) + sizeof(CGDynamicObjectData) + (sizeof(uint32_t) * CGDynamicObject::TotalFieldsSaved())), - static_cast(sizeof(CGCorpse_C) + sizeof(CGCorpseData) + (sizeof(uint32_t) * CGCorpse::TotalFieldsSaved())), + static_cast(sizeof(CGObject_C) + CGObject::GetDataSize() + CGObject::GetDataSizeSaved()), + static_cast(sizeof(CGItem_C) + CGItem::GetDataSize() + CGItem::GetDataSizeSaved()), + static_cast(sizeof(CGContainer_C) + CGContainer::GetDataSize() + CGContainer::GetDataSizeSaved()), + static_cast(sizeof(CGUnit_C) + CGUnit::GetDataSize() + CGUnit::GetDataSizeSaved()), + static_cast(sizeof(CGPlayer_C) + CGPlayer::GetRemoteDataSize() + CGPlayer::GetRemoteDataSizeSaved()), + static_cast(sizeof(CGGameObject_C) + CGGameObject::GetDataSize() + CGGameObject::GetDataSizeSaved()), + static_cast(sizeof(CGDynamicObject_C) + CGDynamicObject::GetDataSize() + CGDynamicObject::GetDataSizeSaved()), + static_cast(sizeof(CGCorpse_C) + CGCorpse::GetDataSize() + CGCorpse::GetDataSizeSaved()), }; static const char* s_objNames[] = { @@ -71,7 +71,7 @@ void* ClntObjMgrAllocObject(OBJECT_TYPE_ID typeID, uint64_t guid) { // Heap allocate player object for current player if (guid == playerGUID) { - return STORM_ALLOC(sizeof(CGPlayer_C) + sizeof(CGPlayerData) + (sizeof(uint32_t) * CGPlayer::TotalFieldsSaved())); + return STORM_ALLOC(sizeof(CGPlayer_C) + CGPlayer::GetDataSize() + CGPlayer::GetDataSizeSaved()); } // TODO GarbageCollect(typeID, 10000);