123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #ifndef _INCLUDE_DYNATTRIB_ECON_MANAGER_H_
- #define _INCLUDE_DYNATTRIB_ECON_MANAGER_H_
- #include "mmsplugin.h"
- #include <map>
- #include <memory>
- #include <utlmap.h>
- #include <utlstring.h>
- #include <KeyValues.h>
- class ISchemaAttributeType;
- // this may need to be updated in the future
- class CEconItemAttributeDefinition
- {
- public:
- // TODO implementing ~CEconItemAttributeDefinition segfaults. not sure what's up.
- // ideally we implement it to match the game so InsertOrReplace is sure to work correctly
-
- /* 0x00 */ KeyValues *m_KeyValues;
- /* 0x04 */ unsigned short m_iIndex;
- /* 0x08 */ ISchemaAttributeType *m_AttributeType;
- /* 0x0c */ bool m_bHidden;
- /* 0x0d */ bool m_bForceOutputDescription;
- /* 0x0e */ bool m_bStoreAsInteger;
- /* 0x0f */ bool m_bInstanceData;
- /* 0x10 */ int m_iAssetClassExportType;
- /* 0x14 */ int m_iAssetClassBucket;
- /* 0x18 */ bool m_bIsSetBonus;
- /* 0x1c */ int m_iIsUserGenerated;
- /* 0x20 */ int m_iEffectType;
- /* 0x24 */ int m_iDescriptionFormat;
- /* 0x28 */ char *m_pszDescriptionString;
- /* 0x2c */ char *m_pszArmoryDesc;
- /* 0x30 */ char *m_pszName;
- /* 0x34 */ char *m_pszAttributeClass;
- /* 0x38 */ bool m_bCanAffectMarketName;
- /* 0x39 */ bool m_bCanAffectRecipeCompName;
- /* 0x3c */ int m_nTagHandle;
- /* 0x40 */ string_t m_iszAttributeClass;
- };
- /**
- * Copied implementation of KeyValues::AutoDelete.
- * This implementation creates copies of any KeyValues pointers passed into it.
- */
- class AutoKeyValues {
- public:
- AutoKeyValues() : m_pKeyValues{new KeyValues("auto")} {}
-
- AutoKeyValues(KeyValues *pKeyValues) : m_pKeyValues{pKeyValues->MakeCopy()} {}
- AutoKeyValues(const AutoKeyValues &other) : m_pKeyValues{other.m_pKeyValues->MakeCopy()} {}
-
- /**
- * Copy assignment. The contents of the KeyValues* needs to be copied; the default
- * implementation seems to cause a use-after-free.
- */
- AutoKeyValues& operator =(const AutoKeyValues &other) {
- this->Assign(other);
- return *this;
- }
-
- ~AutoKeyValues() {
- if (m_pKeyValues) {
- m_pKeyValues->deleteThis();
- }
- }
-
- void Assign(KeyValues *pKeyValues) {
- if (m_pKeyValues) {
- m_pKeyValues->deleteThis();
- }
- m_pKeyValues = pKeyValues->MakeCopy();
- }
-
- KeyValues *operator->() const { return m_pKeyValues; }
- operator KeyValues *() const { return m_pKeyValues; }
-
- private:
- KeyValues *m_pKeyValues;
- };
- /**
- * Keeps a copy of existing schema items to inject.
- */
- class CEconManager {
- public:
- CEconManager() : m_RegisteredAttributes{} {}
-
- bool Init(char *error, size_t maxlength);
- bool InsertOrReplaceAttribute(KeyValues *pAttribKV);
- bool RegisterAttribute(KeyValues *pAttribKV);
- void InstallAttributes();
-
- private:
- std::map<std::string, AutoKeyValues> m_RegisteredAttributes;
- };
- // binary refers to 0x58 when iterating over the attribute map, so we'll refer to that value
- // we could also do a runtime assertion
- static_assert(sizeof(CEconItemAttributeDefinition) + 0x14 == 0x58, "CEconItemAttributeDefinition size mismatch");
- extern CEconManager g_EconManager;
- #endif // _INCLUDE_DYNATTRIB_ECON_MANAGER_H_
|