feat(object): add storage management functions to base object classes

This commit is contained in:
fallenoak 2026-01-10 23:05:43 -06:00
parent 2d5d97f34a
commit 0c3bbc4336
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
33 changed files with 389 additions and 36 deletions

View File

@ -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;
}

View File

@ -4,14 +4,24 @@
#include <cstdint>
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

View File

@ -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<CGContainerData*>(&storage[CGContainer::GetBaseOffset()]);
this->m_contSaved = &saved[CGContainer::GetBaseOffsetSaved()];
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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<CGCorpseData*>(&storage[CGCorpse::GetBaseOffset()]);
this->m_corpseSaved = &saved[CGCorpse::GetBaseOffsetSaved()];
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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<CGDynamicObjectData*>(&storage[CGDynamicObject::GetBaseOffset()]);
this->m_dynamicObjSaved = &saved[CGDynamicObject::GetBaseOffsetSaved()];
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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<CGGameObjectData*>(&storage[CGGameObject::GetBaseOffset()]);
this->m_gameObjSaved = &saved[CGGameObject::GetBaseOffsetSaved()];
}

View File

@ -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

View File

@ -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;
}

View File

@ -3,15 +3,43 @@
#include <cstdint>
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

View File

@ -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<CGItemData*>(&storage[CGItem::GetBaseOffset()]);
this->m_itemSaved = &saved[CGItem::GetBaseOffsetSaved()];
}

View File

@ -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

View File

@ -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;
}

View File

@ -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();

View File

@ -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<CGObjectData*>(&storage[CGObject::GetBaseOffset()]);
this->m_objSaved = &saved[CGObject::GetBaseOffsetSaved()];
}
void CGObject_C::SetTypeID(OBJECT_TYPE_ID typeID) {
this->m_typeID = typeID;

View File

@ -9,6 +9,7 @@
class CGObject_C : public CGObject, public TSHashObject<CGObject_C, CHashKeyGUID> {
public:
// Public member functions
void SetStorage(uint32_t* storage, uint32_t* saved);
void SetTypeID(OBJECT_TYPE_ID typeID);
};

View File

@ -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;
}

View File

@ -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

View File

@ -3,6 +3,13 @@
#include "object/Types.hpp"
#include <storm/Error.hpp>
void CGPlayer_C::SetStorage(uint32_t* storage, uint32_t* saved) {
this->CGUnit_C::SetStorage(storage, saved);
this->m_player = reinterpret_cast<CGPlayerData*>(&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);

View File

@ -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);

View File

@ -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;
}

View File

@ -4,14 +4,86 @@
#include <cstdint>
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

View File

@ -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<CGUnitData*>(&storage[CGUnit::GetBaseOffset()]);
this->m_unitSaved = &saved[CGUnit::GetBaseOffsetSaved()];
}

View File

@ -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

View File

@ -26,14 +26,14 @@ static ClntObjMgr* s_curMgr;
#endif
static uint32_t s_objTotalSize[] = {
static_cast<uint32_t>(sizeof(CGObject_C) + sizeof(CGObjectData) + (sizeof(uint32_t) * CGObject::TotalFieldsSaved())),
static_cast<uint32_t>(sizeof(CGItem_C) + sizeof(CGItemData) + (sizeof(uint32_t) * CGItem::TotalFieldsSaved())),
static_cast<uint32_t>(sizeof(CGContainer_C) + sizeof(CGContainerData) + (sizeof(uint32_t) * CGContainer::TotalFieldsSaved())),
static_cast<uint32_t>(sizeof(CGUnit_C) + sizeof(CGUnitData) + (sizeof(uint32_t) * CGUnit::TotalFieldsSaved())),
static_cast<uint32_t>(sizeof(CGPlayer_C) + sizeof(CGPlayerData) + (sizeof(uint32_t) * CGPlayer::TotalRemoteFieldsSaved())),
static_cast<uint32_t>(sizeof(CGGameObject_C) + sizeof(CGGameObjectData) + (sizeof(uint32_t) * CGGameObject::TotalFieldsSaved())),
static_cast<uint32_t>(sizeof(CGDynamicObject_C) + sizeof(CGDynamicObjectData) + (sizeof(uint32_t) * CGDynamicObject::TotalFieldsSaved())),
static_cast<uint32_t>(sizeof(CGCorpse_C) + sizeof(CGCorpseData) + (sizeof(uint32_t) * CGCorpse::TotalFieldsSaved())),
static_cast<uint32_t>(sizeof(CGObject_C) + CGObject::GetDataSize() + CGObject::GetDataSizeSaved()),
static_cast<uint32_t>(sizeof(CGItem_C) + CGItem::GetDataSize() + CGItem::GetDataSizeSaved()),
static_cast<uint32_t>(sizeof(CGContainer_C) + CGContainer::GetDataSize() + CGContainer::GetDataSizeSaved()),
static_cast<uint32_t>(sizeof(CGUnit_C) + CGUnit::GetDataSize() + CGUnit::GetDataSizeSaved()),
static_cast<uint32_t>(sizeof(CGPlayer_C) + CGPlayer::GetRemoteDataSize() + CGPlayer::GetRemoteDataSizeSaved()),
static_cast<uint32_t>(sizeof(CGGameObject_C) + CGGameObject::GetDataSize() + CGGameObject::GetDataSizeSaved()),
static_cast<uint32_t>(sizeof(CGDynamicObject_C) + CGDynamicObject::GetDataSize() + CGDynamicObject::GetDataSizeSaved()),
static_cast<uint32_t>(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);