Все еще 6-ой индекс, но не совсем то, что нужно.
Посмотреть вложение 278262
дамп в помощь оффсеты искать. сопоставляешь то что видишь в консоли с тем что в памяти, если что-то неоднозначно/непонятно значит меняешь в памяти смотришь в дампе поменялось или нетЕсть у кого-то актуальные оффсеты CEconItem?
можешь впринципе просто присылать самому себе фейковые CMsgSOMultipleObjects и не трогать руками ничего. собственно сама дота так и делает(от гс приходит CMsgSOMultipleObjects и из этого уже клиент шмоточки себе делает)Все еще 6-ой индекс, но не совсем то, что нужно.
Посмотреть вложение 278262
Ты имеешь ввиду хук RetrieveMessage и там создавать этот СMsgSOMultipleObjects?присылать самому себе фейковые CMsgSOMultipleObjects и не трогать руками ничего
Создает EConItem на основе данных в CMsgSOMultipleObjects ?клиент шмоточки себе делает
1) да но и не только это(этого недостаточно. как минимум потому что RetrieveMessage ты не контроллируешь когда вызывается. толку от хука если не будет вызываться(надо заставлять вызывать))Ты имеешь ввиду хук RetrieveMessage и там создавать этот СMsgSOMultipleObjects?
Создает EConItem на основе данных в CMsgSOMultipleObjects ?
не тестил(ну точнее тестил но поверхностно слишком тяп ляп) но попробуй, должно работать в теорииЯ тут внезапно обнаружил, что объектов класса C_FogController несколько, в демке 2, с ботами вообще создается сначала 7 еще на стадии пика, при этом искомый будет 6-ым. После пика 5 из них удаляются и в самом начале матча создается еще 5 и сразу же удаляются и остается только 2.
При этом нужен только 1 и разница между ним и вторым в наличии имени на 0x18(CUtlSymbolLarge* m_name).
Ну и все бы хорошо но это второе имя присваивается в CEntityIdentity::SetEntityName, которое вызывается когда-то после OnAdd, а до тех пор, эти C_FogController идентичны по сути. Т.е. хук OnAdd с этим объектом не то чтобы помогает.
Сейчас я создал map<&C_FogController, C_FogController*>, после я запихиваю туда все эти объекты и выпиливаю из него все указатели, объекты которых засветились в OnRemove, затем я проверяю у кого есть имя на 0х18 и удаляю объект с этим именем.
Крч костыль, кто-то решал такое?
static CMemAlloc* g_pMemAlloc = *Memory::GetExport<CMemAlloc**>("tier0.dll", "g_pMemAlloc");
чекниПосмотреть вложение 279450C++:static CMemAlloc* g_pMemAlloc = *Memory::GetExport<CMemAlloc**>("tier0.dll", "g_pMemAlloc");
Я правильно понимаю, что это(стянуто с McDota) является новым классом и в дилибах его нету? Или он там назван иначе?
Так, тут все путем, просто такая вот плотность да. Пихается туда, что угодно, реализующие интерфейс IEntityListener и дальше у этого объекта вызываются эти функции в зависимости от того, что произошло: создалось энтити - OnEntityCreated...И еще вопрос. Я так понимаю, что можно вместо хука OnAddEntity влезть в габеновский вектор в EntitySystem
Посмотреть вложение 279452
Запихать туда то, что реализует OnEntityCreated на 0 индексе вмт и она будет вызываться на каждом тике.
Но я чет не понимаю, что я тут вижу.
По идее 3 это size, потом должно быть 3 элемента(по указателю) IEntityListener и первая ссылка это оно и есть, а дальше какой-то рандом.
Посмотреть вложение 279453
class IEntityListener {
public:
virtual void OnEntityCreated(C_BaseEntity* ent) = 0;
virtual void OnEntitySpawned(C_BaseEntity* ent) {};
virtual void OnEntityDeleted(C_BaseEntity* ent) = 0;
virtual void OnEntityParentChanged(C_BaseEntity* ent, C_BaseEntity* parent) {};
};
uint32_t CCVar::GetCVarCount()
{
return Member<uint32_t>(0xA0);
}
CVarNode* CCVar::GetCVarNodeList()
{
return Member<CVarNode*>(0x40);
}
auto list = GetCVarNodeList();
auto size = GetCVarCount();
for (int i = 0; i < size; i++)
{
auto var = list[i].var;
if (!var || !var->name)
continue;
CVarID id;
id.m_pVar = var;
id.impl = static_cast<uint64_t>(i);
CVars[var->name] = id;
}
struct CVar
{
const char* name{};
CVar* m_pNext{};
PAD(16,1)
const char* desc{};
EConvarType type{};
uint32_t timesChanged{};
uint32_t flags{};
PAD(4,2)
int m_iCallbackIndex{};
PAD(4,3)
CVarValue value{};
CVarValue defaultValue{};
}
try the count from 0x58Is CCvar/CVarNode changed? I've checked, everything is fine (I guess), but:
When I'm iterating through list (GetCVarNodeList) some addresses are invalid. So it crashes when it tries to access var->name. GetCVarCount() returns 5203 and the list gets invalid addresses after 5120. Maybe I'm getting wrong size?C++:uint32_t CCVar::GetCVarCount() { return Member<uint32_t>(0xA0); } CVarNode* CCVar::GetCVarNodeList() { return Member<CVarNode*>(0x40); } auto list = GetCVarNodeList(); auto size = GetCVarCount(); for (int i = 0; i < size; i++) { auto var = list[i].var; if (!var || !var->name) continue; CVarID id; id.m_pVar = var; id.impl = static_cast<uint64_t>(i); CVars[var->name] = id; } struct CVar { const char* name{}; CVar* m_pNext{}; PAD(16,1) const char* desc{}; EConvarType type{}; uint32_t timesChanged{}; uint32_t flags{}; PAD(4,2) int m_iCallbackIndex{}; PAD(4,3) CVarValue value{}; CVarValue defaultValue{}; }
It sometime happens and sometime not !
auto GetCvarList() const noexcept
{
return std::span<const CvarNode>{ Member<const CvarNode*>(0x40), Member<std::uint16_t>(0x58) };
}
попробуй PlayerResourcePlayerTeamData_t(из C_DOTA_PlayerResource::m_vecPlayerTeamData)::m_nSelectedHeroIDКто-то знает как можно получить имя героя, которого пикнул енеми?
В C_DOTAPlayerController есть CHandle сущности, он появляется там на стадии PRE_GAME, но в EntityList'e такой сущности просто нету(пока она в тумане войны), а в панораму, что-то вообще лезть не хочется.
К сожалению C_DOTA_PlayerResource энеми вообще в EntityList'e не появляется.попробуй PlayerResourcePlayerTeamData_t(из C_DOTA_PlayerResource::m_vecPlayerTeamData)::m_nSelectedHeroID
хиро айдишники есть в scripts\npc\npc_heroes.txt
или в DOTAHeroDefinition_t(в C_DOTAGameManager)
пруф? на локалке и в стокгольме проверил все работает. плеер ресурс если что только один, глобальный. там вектор с данными по всем игрокам.К сожалению C_DOTA_PlayerResource энеми вообще в EntityList'e не появляется.
-----members of class C_DOTA_PlayerResource-----
...
C_UtlVectorEmbeddedNetworkVar< PlayerResourcePlayerTeamData_t > m_vecPlayerTeamData(offset 0x550, size 0x50, align 0x8)
Протупил мальца, я чет думал, что там этих C_DOTA_PlayerResource на каждый C_DOTAPlayerController.пруф? на локалке и в стокгольме проверил все работает. плеер ресурс если что только один, глобальный. там вектор с данными по всем игрокам.
Посмотреть вложение 284341
Посмотреть вложение 284342
Посмотреть вложение 284343C++:-----members of class C_DOTA_PlayerResource----- ... C_UtlVectorEmbeddedNetworkVar< PlayerResourcePlayerTeamData_t > m_vecPlayerTeamData(offset 0x550, size 0x50, align 0x8)
C_DOTAPlayerController::m_nPlayerID это вроде индекс в массивах в плеерресурсе. в самом PlayerResourcePlayerData_t есть m_nPlayerSlot(вроде +1 прибавляешь и получить индекс сущности контроллера). потести самПротупил мальца, я чет думал, что там этих C_DOTA_PlayerResource на каждый C_DOTAPlayerController.
Но я же одним PlayerResourcePlayerTeamData_t не смогу соотнести этот HeroID с конкретным C_DOTAPlayerController?
Я нашел вектор PlayerResourcePlayerData_t, там есть имя учетки Steam и SteamID, и вроде даже по индексам с PlayerResourcePlayerTeamData_t совпадает.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz