Начинающий
-
Автор темы
- #1
Почему наследование может слегка наебнуть проект или челибо?
Сидел и делал ченжер,
есть у меня клаcc:
Обычное наследование,беды здесь нету вродебы.
Но как только я добавляю шмотку в кэш:
Смотрел в реклассе и вмтшки Object-а выглядит вот так
CEconItem : GCSDK::CSharedObject : IEconItemInterface
CEconItem : GCSDK::CSharedObject : IEconItemInterface
А после добавления в кэш(после функи AddObject)
ВМТ какогото хера стает таким:
GCSDK::CSharedObject
IEconItemInterface
Но адреса на которые они указывают(вмтшки) вроде бы не меняются.
И шмотки нихера не добавляются в инвентарь.
Чтобы пофиксить данную и непонятную ошибку, потребовалось удалить наследование CEconItem::CSharedObject. И просто вручную кастовать при добавлении в кэш
В чём прикол с этим не пойму? Нельзя делать наследования на вальвоские классы?
Сидел и делал ченжер,
есть у меня клаcc:
C++:
class CSharedObject;
class C_EconItem : public CSharedObject
{
public:
virtual void* Destructor(bool bImmediately) = 0;
virtual void* DllMain() = 0;
virtual void* sub_181CDD630() = 0;
virtual void* vcrt_uninitialize_critical_129() = 0;
virtual void* sub_181CDD850() = 0;
virtual void* sub_181CDD860() = 0;
virtual void* Dump() = 0;
virtual void* BAddToMessage() = 0; //; #STR: "CEconItem::BAddToMessage::std::string", "Steam"
virtual void* BAddDestroyTomessaage() = 0;
void* vmt1; // 0x0008
uint64_t m_ItemID; //0x0010
uint64_t unk; //0x0018
uint32_t m_AccountID; //0x0020
uint32_t m_numInventory; //0x0024
uint32_t m_DefIndex; //0x0028
uint8_t m_Flags; //0x002C
uint8_t m_Level; //0x002D
uint8_t m_Quality; //0x002E
uint8_t m_Origin; //0x002F
style_index_t m_unStyle; // Style
dirty_bits_t m_dirtyBits; // dirty bits
EquippedInstance_t m_EquipInstanceSingleton;
attribute_t m_CustomAttribSingleton;
CEconItemCustomData* m_pCustomData;
void EnsureCustomDataExists();
void Equip(equipped_class_t unClass, equipped_slot_t unSlot);
void UnequipFromClass(equipped_class_t unClass);
}; // 0x50
Но как только я добавляю шмотку в кэш:
C++:
auto Object = CreateSharedObjectEconItem();
Object->m_ItemID = i + 100;
Object->m_numInventory = i + 1;
Object->m_DefIndex = itemdef->DefinitionIndex;
/*Object->m_Flags = 1;
Object->m_Level = 4;
Object->m_Quality = 1;
Object->m_Origin = 34;
Object->m_unStyle = 0;*/
Object->m_AccountID = g_InventoryManager->GetPlayerInventory()->soid.SteamID;
g_DOTAGCClientSystem->SOCache->AddObject(Object); <------------- здесь случится хуйня
CEconItem : GCSDK::CSharedObject : IEconItemInterface
CEconItem : GCSDK::CSharedObject : IEconItemInterface
А после добавления в кэш(после функи AddObject)
ВМТ какогото хера стает таким:
GCSDK::CSharedObject
IEconItemInterface
Но адреса на которые они указывают(вмтшки) вроде бы не меняются.
И шмотки нихера не добавляются в инвентарь.
Чтобы пофиксить данную и непонятную ошибку, потребовалось удалить наследование CEconItem::CSharedObject. И просто вручную кастовать при добавлении в кэш
C++:
g_DOTAGCClientSystem->SOCache->AddObject((CSharedObject*)Object);