Вопрос Отлов телепортов в тумане войны

Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Может кто подскажет, как все эти модные-молодежные читы узнают о телепортах\прожатых спеллах в тумане войны?
Хочу их на минимапе рисовать. Легко-доступной инфы в тумане же нет. Думаю, нужно куда-то в сторону системы партиклей смотреть, но не могу разобраться, куда именно. Условно на OnCreateParticle, смотреть, что за партикля и где она вызывается. Наверное. А может я вообще не туда воюю.
 
Участник
Статус
Оффлайн
Регистрация
4 Фев 2019
Сообщения
739
Реакции[?]
225
Поинты[?]
0
Пожалуйста, авторизуйтесь для просмотра ссылки.
Тут всё доходчиво расписано, плюс какой-то из кодеров делал тему на юг о читах\скриптах на доту.
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Тут всё доходчиво расписано, плюс какой-то из кодеров делал тему на юг о читах\скриптах на доту.
Nah, там только про показ партиклей в тумане, еще и через какие-то хитрые манипуляции. Я просто через ClientCmd шлю dota_use_particle_fow 0.
 
Участник
Статус
Оффлайн
Регистрация
4 Фев 2019
Сообщения
739
Реакции[?]
225
Поинты[?]
0
Nah, там только про показ партиклей в тумане, еще и через какие-то хитрые манипуляции. Я просто через ClientCmd шлю dota_use_particle_fow 0.
Ну, посмотри на сурсы с гитхаба или туторы на анончитс
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
ну так и попробуй OnParticleCreate похукать. они же создаются в тумане(пруф ниже).(синие зеленые коробки это dota_particle_fow_debug 1. синий = не видно, в тумане. зеленый = видно, не в тумане). вместе с каким-нибудь OnParticleUpdate. коорды партиклей лежат в контрол поинте 0
// Control Points 0 (vecOrigin) and 1 (vecStart) are defined when dispatching from the server. Be aware of this when choosing which CPs to use in your system.
Пожалуйста, авторизуйтесь для просмотра ссылки.
[Particles] Creating collection: particles/ui_mouseactions/range_finder_generic_aoe.vpcf
[Particles] Child: particles/ui_mouseactions/range_finder_line.vpcf
[Particles] Child: particles/ui_mouseactions/range_finder_d.vpcf
[Particles] Child: particles/ui_mouseactions/range_finder_d_glow.vpcf
[Particles] Child: particles/ui_mouseactions/range_finder_aoe.vpcf
[Particles] Child: particles/ui_mouseactions/range_finder_aoe_glow.vpcf
[Particles] Creating collection: particles/ui_mouseactions/clicked_basemove.vpcf
[Particles] Child: particles/ui_mouseactions/clicked_arrow_trail.vpcf
[Particles] Child: particles/ui_mouseactions/clicked_rings.vpcf
[Particles] Child: particles/ui_mouseactions/clicked_rings_c.vpcf
[Particles] Creating collection: particles/units/heroes/hero_silencer/silencer_curse_cast.vpcf
[Particles] Child: particles/units/heroes/hero_silencer/silencer_curse_cast_energy.vpcf
[Particles] Child: particles/units/heroes/hero_silencer/silencer_curse_cast_flash.vpcf
[Particles] Child: particles/units/heroes/hero_silencer/silencer_curse_cast_flares.vpcf
[Particles] Creating collection: particles/units/heroes/hero_silencer/silencer_curse_aoe.vpcf
[Particles] Child: particles/units/heroes/hero_silencer/silencer_curse_cast_ring_rope.vpcf
[Particles] Child: particles/units/heroes/hero_silencer/silencer_curse_cast_ring_glow.vpcf
[Particles] Child: particles/units/heroes/hero_silencer/silencer_curse_cast_ring_glow_b.vpcf
1637915920400.png
альтернативно можешь в сторону нетчана копать(ну тип очевидно что все это тебе с сервака прилетает).
DebugString: "client loopback:1[0]: (218 bits/28 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_CREATE"
DebugString: "index: 368"
DebugString: "create_particle {"
DebugString: "particle_name_index: 5189642778699925318"
DebugString: "attach_type: 2"
DebugString: "entity_handle: 2982080"
DebugString: "apply_voice_ban_rules: false"
DebugString: "}"
DebugString: "}"
DebugString: "client loopback:1[0]: (314 bits/40 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_UPDATE_ENT"
DebugString: "index: 368"
DebugString: "update_particle_ent {"
DebugString: "control_point: 0"
DebugString: "entity_handle: 2982080"
DebugString: "attach_type: 5"
DebugString: "attachment: 2"
DebugString: "fallback_position {"
DebugString: "x: 1275.47534"
DebugString: "y: 249.312103"
DebugString: "z: 128"
DebugString: "}"
DebugString: "include_wearables: true"
DebugString: "}"
DebugString: "}"
DebugString: "client loopback:1[0]: (226 bits/29 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_UPDATE"
DebugString: "index: 368"
DebugString: "update_particle {"
DebugString: "control_point: 1"
DebugString: "position {"
DebugString: "x: 0.796548426"
DebugString: "y: 0.6045748"
DebugString: "z: 0"
DebugString: "}"
DebugString: "}"
DebugString: "}"
DebugString: "client loopback:1[0]: (58 bits/8 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_RELEASE"
DebugString: "index: 368"
DebugString: "}"
DebugString: "client loopback:1[0]: (258 bits/33 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_CREATE"
DebugString: "index: 369"
DebugString: "create_particle {"
DebugString: "particle_name_index: 9777761664553108662"
DebugString: "attach_type: 2"
DebugString: "entity_handle: 16777215"
DebugString: "entity_handle_for_modifiers: 2982080"
DebugString: "apply_voice_ban_rules: false"
DebugString: "}"
DebugString: "}"
DebugString: "client loopback:1[0]: (226 bits/29 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_UPDATE"
DebugString: "index: 369"
DebugString: "update_particle {"
DebugString: "control_point: 0"
DebugString: "position {"
DebugString: "x: 1593.74072"
DebugString: "y: 490.873352"
DebugString: "z: 128"
DebugString: "}"
DebugString: "}"
DebugString: "}"
DebugString: "client loopback:1[0]: (226 bits/29 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_UPDATE"
DebugString: "index: 369"
DebugString: "update_particle {"
DebugString: "control_point: 1"
DebugString: "position {"
DebugString: "x: 425"
DebugString: "y: 0"
DebugString: "z: 0"
DebugString: "}"
DebugString: "}"
DebugString: "}"
DebugString: "client loopback:1[0]: (58 bits/8 bytes):"
DebugString: "CUserMsg_ParticleManager [145]"
DebugString: "{"
DebugString: "type: GAME_PARTICLE_MANAGER_EVENT_RELEASE"
DebugString: "index: 369"
DebugString: "}"
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну так и попробуй OnParticleCreate похукать
Босс качалки пришел, тебя-то я и ждал. Получается, раз я всё равно использую систему партиклей доты, в т.ч. CreateParticle из панорамы, я могу вот так просто хукнуть этот самый CreateParticle? Или, скорей, SetParticleControl. Соседняя функция, в принципе, не велика разница.
Как-то это слишком просто звучит, меня это смутило.
(Почему я больше не могу реакт оставить, лол)
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Босс качалки пришел, тебя-то я и ждал. Получается, раз я всё равно использую систему партиклей доты, в т.ч. CreateParticle из панорамы, я могу вот так просто хукнуть этот самый CreateParticle? Или, скорей, SetParticleControl. Соседняя функция, в принципе, не велика разница.
Как-то это слишком просто звучит, меня это смутило.
(Почему я больше не могу реакт оставить, лол)
да. но естественно не сами джс методы хукай, а то что они внутри вызывают.(ну тип игра не вызывает джс методы зачем ей это делать она настоящие функции движка(ну игры всмысле) вызывает). ну и не забывай тестить - может быть такое что функция которую ты хукнул не все партикли ловит(на некоторые не вызывается)(ну то есть ты хукнул какуюто оберточную функцию а не самую низкоуровневую. в итоге некоторые партикли через обертку создаются, а остальные через низкоуровневые функции). в таком случае ищи другие функции поглубже. а ваще лучше бы сразу в нетчан пошел - там не только партикли, там ваще все что можно. ваще все что прилетает от сервака проходит через нетчан. вот там можешь сразу тусить и подслушивать. ну и еще есть SetParticleControlEnt - не все партикли к коордам статичным привязываются, некоторые за сущностями следуют.
у лвсс пример хука есть
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
да. но естественно не сами джс методы хукай, а то что они внутри вызывают.(ну тип игра не вызывает джс методы зачем ей это делать она настоящие функции движка(ну игры всмысле) вызывает). ну и не забывай тестить - может быть такое что функция которую ты хукнул не все партикли ловит(на некоторые не вызывается)(ну то есть ты хукнул какуюто оберточную функцию а не самую низкоуровневую. в итоге некоторые партикли через обертку создаются, а остальные через низкоуровневые функции). в таком случае ищи другие функции поглубже. а ваще лучше бы сразу в нетчан пошел - там не только партикли, там ваще все что можно. ваще все что прилетает от сервака проходит через нетчан. вот там можешь сразу тусить и подслушивать. ну и еще есть SetParticleControlEnt - не все партикли к коордам статичным привязываются, некоторые за сущностями следуют.
у лвсс пример хука есть
Пожалуйста, авторизуйтесь для просмотра ссылки.
Ну опщем да, спасибо, оно (с партиклями) работает, как и ожидалось. А вот в сторону нетчана даже смотреть не думал. А зря, выглядит многообещающе.
Давно еще, когда сырцы lwss смотрел, хотел разобраться, но чет сложно короче было тогда.
Не разберусь, так вариант с партиклями оставлю. Если в божеский вид свой говнокод приведу, мб сюда скину. Потомкам, так сказать.
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Короче, с нетчаном мне пока сложно. А с партиклями какая-то очень странная херня получается.
Беру интерфейс ParticleSystemMgr003 из particles.dll, кладу его в vmt.particleMgr.
Хукаю CreateParticleCollection_Handle -- 17 функция. Сто раз перепроверил, это точно она.

C++:
CParticleCollection* CreateParticleCollection(CParticleSystemMgr* thisptr, CWeakHandle_InfoForResourceTypeIParticleSystemDefinition* info, void* unk, IParticleSystemQuery* query, bool bUnk, float fUnk, int particleIndex) {
    CParticleCollection* Ret = vmt.particleMgr->GetOriginalMethod(CreateParticleCollection)(thisptr, info, unk, query, bUnk, fUnk, particleIndex);

    if (!strcmp(info->contents->info->name, "particles/items_fx/aura_shivas.vpcf")) { // Рисуется для VBE
        cout << "\nParticle Created" << endl;
        Vector* Vec = Ret->GetControlPointPosition(particleIndex);
        // Ну и тут пытаюсь свои дела делать
    }

    return Ret;
}
GetControlPointPosition(индекс партикля) -- 21 функция в виртуалке. Сравнивал код из длибы с длл, он один в один.
Да и если в реклассе открыть, там очевидный Vector3. Ну и еще там на каком-то оффсете тоже вектор лежит нетваром.
А вот читать их не могу. Я уже кукухой ехать начинаю. Что бы я ни пытался читать, там всегда 0. А если прям тупо указываю нужный адрес вида (void*)0xABC, всё ок. Или если в читенжин его сую.
При этом всё, что внутри CParticleSystemMgr нормально читается.

C++:
struct InfoStruct {
    const char* name;
};

struct WeakHandleContents_InfoForResourceTypeIParticleSystemDefinition {
    CParticleSystemDefinition* systemDefinition;
    InfoStruct* info;
    char _pad[0x200];
};

struct CWeakHandle_InfoForResourceTypeIParticleSystemDefinition {
    WeakHandleContents_InfoForResourceTypeIParticleSystemDefinition* contents;
};
Это мне уже спать пора, или я чего-то не учел?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Короче, с нетчаном мне пока сложно. А с партиклями какая-то очень странная херня получается.
Беру интерфейс ParticleSystemMgr003 из particles.dll, кладу его в vmt.particleMgr.
Хукаю CreateParticleCollection_Handle -- 17 функция. Сто раз перепроверил, это точно она.

C++:
CParticleCollection* CreateParticleCollection(CParticleSystemMgr* thisptr, CWeakHandle_InfoForResourceTypeIParticleSystemDefinition* info, void* unk, IParticleSystemQuery* query, bool bUnk, float fUnk, int particleIndex) {
    CParticleCollection* Ret = vmt.particleMgr->GetOriginalMethod(CreateParticleCollection)(thisptr, info, unk, query, bUnk, fUnk, particleIndex);

    if (!strcmp(info->contents->info->name, "particles/items_fx/aura_shivas.vpcf")) { // Рисуется для VBE
        cout << "\nParticle Created" << endl;
        Vector* Vec = Ret->GetControlPointPosition(particleIndex);
        // Ну и тут пытаюсь свои дела делать
    }

    return Ret;
}
GetControlPointPosition(индекс партикля) -- 21 функция в виртуалке. Сравнивал код из длибы с длл, он один в один.
Да и если в реклассе открыть, там очевидный Vector3. Ну и еще там на каком-то оффсете тоже вектор лежит нетваром.
А вот читать их не могу. Я уже кукухой ехать начинаю. Что бы я ни пытался читать, там всегда 0. А если прям тупо указываю нужный адрес вида (void*)0xABC, всё ок. Или если в читенжин его сую.
При этом всё, что внутри CParticleSystemMgr нормально читается.

C++:
struct InfoStruct {
    const char* name;
};

struct WeakHandleContents_InfoForResourceTypeIParticleSystemDefinition {
    CParticleSystemDefinition* systemDefinition;
    InfoStruct* info;
    char _pad[0x200];
};

struct CWeakHandle_InfoForResourceTypeIParticleSystemDefinition {
    WeakHandleContents_InfoForResourceTypeIParticleSystemDefinition* contents;
};
Это мне уже спать пора, или я чего-то не учел?
нихрена не понял, подробнее опиши проблему и все свои шаги. если чит енджином и реклассом все норм читается, и даже напрямую с указателя норм читается, значит ты неправильный указатель даешь/неправильный тип. сделай лог указателя и удостоверься что там 0xABC а не 1234567 какой-нибудь.
ну и еще раз объясни - что откуда где когда читаешь, нихрена не понял.
а так оффтопик
Vector* Vec = Ret->GetControlPointPosition(particleIndex);
выглядит как говнокод.
создается впечатление, что GetControlPointPosition тебе возвращает new Vector. что очевидно не так - там тебе просто подчлен класса возвращает. я бы тут референс заюзал - референс ссылается на существующий объект и при этом явно выражает что ты не владелец ресурса(а еще лучше const референс ибо ты не собираешься данные менять в этом векторе). а твой Vector* такое ощущение что реально через new аллоцирован и теперь ты владелец ресурса и тебе потом его нужно будет удалить. в общем поинтер = нихуя не понятно. конст референс = все сразу понятно. но не в этом суть.
и кстати что за магическое бог знает что
CParticleCollection* Ret = vmt.particleMgr->GetOriginalMethod(CreateParticleCollection)(thisptr, info, unk, query, bUnk, fUnk, particleIndex);
ты уверен ваще что тебе валидный результат дает(валидную функцию оригинальную и валидный указатель как возврат функции)?
ну и конечно же опять, где if(Ret == nullptr) (указатель может быть 0)
ну кароче больше инфы давай сюда нихрена не понял
ну и плюс strcmp = C
пиши на с++, юзай std::string_view(c++17).
info->contents->info->name замени на
info->contents->info->GetName() который просто возвращает std::string_view из члена name, и потом уже сравнивай через равно == "xxx"
ну и я искренне надеюсь что ты не делаешь так
Vector* Vec = Ret->GetControlPointPosition(particleIndex);
auto x = Vec[1];
потому что это пиздец(Vec->operator[](1) и Vec[1] это очень разные вещи. Vec это не Vector, это Vector*. у указателя свой operator[])
 
Последнее редактирование:
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Написал ответ так, что югейм лег. Класс.
удостоверься что там 0xABC а не 1234567 какой-нибудь.
Не, я же адрес в зааттаченную консоль вывожу, дальше его в рекласс\CE. Там то, что нужно.

Vector* Vec = Ret->GetControlPointPosition(particleIndex);
выглядит как говнокод.
virtual Vector* GetControlPointPosition(int index) = 0; // 21
Хз, может с ним по-другому нужно обращаться. Ну я естественно попробовал cout << (void*)Ret->GetControlPointPosition(particleIndex) << endl;
Открываю в реклассе. Двигаю энтитю (партикль к ней прикреплен, PATTACH_ABSORIGIN_FOLLOW), вектор правильный.
1638209828101.png

Ну и энивей я Ret в реклассе открывал, делал класс, типа, "char pad_000[120]; int SomeInt;" Там всегда 5 лежит.
И cout << Ret->SomeInt; И везде всегда 0.

CParticleCollection* Ret = vmt.particleMgr->GetOriginalMethod(CreateParticleCollection)(thisptr, info, unk, query, bUnk, fUnk, particleIndex);
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Ну и, как я и сказал, там действительно то, что должно быть.

потому что это пиздец(Vec->operator[](1) и Vec[1] это очень разные вещи.
Я конечно тот еще кодер, но не настолько. Бтв оно тоже 0 возвращает.

За остальное спасибо, буду юзать <З

UPD:
Алсо, до нужного мне CParticleCollection можно добраться и через info->contents->systemDefinition.
Это класс CParticleSystemDefinition, там лежит ссылка на CParticleCollection создаваемой партикли.
С ней всё так же -- везде 0. Смущает, что именно 0, а не краш, там, или какой-то мусор.
 
Последнее редактирование:
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Да, и я дампил CParticleSystemDefinition (описанным тобой методом), оффсеты неправильные.
Ну, верней, в полученном мною CParticleSystemDefinition они не совпадают с теми, что из дампера.
Странно всё это, короче.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Написал ответ так, что югейм лег. Класс.

Не, я же адрес в зааттаченную консоль вывожу, дальше его в рекласс\CE. Там то, что нужно.


virtual Vector* GetControlPointPosition(int index) = 0; // 21
Хз, может с ним по-другому нужно обращаться. Ну я естественно попробовал cout << (void*)Ret->GetControlPointPosition(particleIndex) << endl;
Открываю в реклассе. Двигаю энтитю (партикль к ней прикреплен, PATTACH_ABSORIGIN_FOLLOW), вектор правильный.
Посмотреть вложение 182240

Ну и энивей я Ret в реклассе открывал, делал класс, типа, "char pad_000[120]; int SomeInt;" Там всегда 5 лежит.
И cout << Ret->SomeInt; И везде всегда 0.


Пожалуйста, авторизуйтесь для просмотра ссылки.
. Ну и, как я и сказал, там действительно то, что должно быть.


Я конечно тот еще кодер, но не настолько. Бтв оно тоже 0 возвращает.

За остальное спасибо, буду юзать <З
вместо char pad юзай лучше геттеры
class xxx...
void* GetMyShit(){ return *(int*)((std::uintptr_t)this + 0x123456);}
ибо у геттеров прямой оффсет и с ним нереально промахнуться и он ни от чего не зависит(падинг хуядинг настройки прагмы)
на лвсс я бы не стал ориентироватсья в плане стиля(С-стайл говнецо я такой вид кода называю. работать работает а выглядит как С, от с++ там токо одно название, ни исключений нихуя), и ты делаешь не так как лвсс - у него темплейт арг у тебя простой арг.
ну вот ты сделал void* вектор, вот теперь кастани его в float* считай оттуда флоат. потом прибавь 4 байта(не +4 а именно + 4 байта. сначала в число кастани перед прибавлением) снова считай флоат. потом еще 4 снова считай флоат. и посмотри че будет.
на крайняк - дебажь свой код в дебагере. ставь бряку на какую-нибудь хуиту типо MessageBox и вызывай ее в своем коде чтобы свой код найти.
ну и побольше кода кинь, а именно как где когда считываешь а то я нихуя и не понял.
бля токо что заметил
Vector* Vec = Ret->GetControlPointPosition(particleIndex);
ты уверен что параметр ты правильно передаешь? там индекс контрол поинта скорее всего а не партикли. 0 попробуй передать
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
вместо char pad юзай лучше геттеры
Вот такое юзаю. Просто расписывать в падлу было.
C++:
#define STR_MERGE_IMPL(a, b) a##b
#define STR_MERGE(a, b) STR_MERGE_IMPL(a, b)
#define MAKE_PAD(size) STR_MERGE(_pad, __COUNTER__)[size]
#define DEFINE_MEMBER_N(type, name, offset) struct {unsigned char MAKE_PAD(offset); type name;}

class CBaseEntity {
public:
    union {
        DEFINE_MEMBER_N(int, m_iMaxHealth, 0x0328);
        DEFINE_MEMBER_N(int, m_iHealth, 0x032C);
        ...
        }
};
ну и побольше кода кинь
C++:
CParticleCollection* CreateParticleCollection(CParticleSystemMgr* thisptr, CWeakHandle_InfoForResourceTypeIParticleSystemDefinition* info, void* unk, IParticleSystemQuery* query, bool bUnk, float fUnk, int particleIndex) {
    CParticleCollection* Ret = vmt.particleMgr->GetOriginalMethod(CreateParticleCollection)(thisptr, info, unk, query, bUnk, fUnk, particleIndex);
    if (!strcmp(info->contents->info->name, "particles/items_fx/aura_shivas.vpcf")) {
        void* voidShit = (void*)Ret->GetControlPointPosition(particleIndex);
        float floatShit = *(float*)voidShit;
        cout << "floatShit: " << floatShit << endl;
    }

    return Ret;
}
:forsenGun::coldsideRage:
1638213013966.png

Остальное-то работает -- и сам хук, и другие хуки, и имя партикля же я получаю. А вот конкретно это дерьмо -- нет.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
еще раз(криво запостил, вместо нью поста как редактирование)
бля токо что заметил
Vector* Vec = Ret->GetControlPointPosition(particleIndex);
ты уверен что параметр ты правильно передаешь? там индекс контрол поинта скорее всего а не партикли. 0 попробуй передать

вот из сурсов тф2. как видишь параметр там первый вовсе не партикль индекс.(другая функа но она из этого же семейства)
C++:
//-----------------------------------------------------------------------------
// Used to retrieve the position of a control point
// somewhere between m_flCurTime and m_flCurTime - m_fPreviousDT
//-----------------------------------------------------------------------------
void CParticleCollection::GetControlPointAtTime( int nControlPoint, float flTime, Vector *pControlPoint ) const
ну и на будущее, если ты знаешь что у тебя проблема(что-то не работает), ты логаешь ВСЕ. больше "мусора" на экране - больше инфы - больше шанс решения проблемы.
if (!strcmp(info->contents->info->name, "particles/items_fx/aura_shivas.vpcf")) {
void* voidShit = (void*)Ret->GetControlPointPosition(particleIndex);
float floatShit = *(float*)voidShit;
cout << "floatShit: " << floatShit << endl;
}
а cout << voidShit << endl где?
ты посмотри в реклассе то что находится по адресу voidShit. не в структуре в реклассе чето ищи, а именно адрес voidShit туда вставь в рекласс
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
еще раз(криво запостил, вместо нью поста как редактирование)
бля токо что заметил
Vector* Vec = Ret->GetControlPointPosition(particleIndex);
ты уверен что параметр ты правильно передаешь? там индекс контрол поинта скорее всего а не партикли. 0 попробуй передать

вот из сурсов тф2. как видишь параметр там первый вовсе не партикль индекс.(другая функа но она из этого же семейства)
C++:
//-----------------------------------------------------------------------------
// Used to retrieve the position of a control point
// somewhere between m_flCurTime and m_flCurTime - m_fPreviousDT
//-----------------------------------------------------------------------------
void CParticleCollection::GetControlPointAtTime( int nControlPoint, float flTime, Vector *pControlPoint ) const
ну и на будущее, если ты знаешь что у тебя проблема(что-то не работает), ты логаешь ВСЕ. больше "мусора" на экране - больше инфы - больше шанс решения проблемы.
if (!strcmp(info->contents->info->name, "particles/items_fx/aura_shivas.vpcf")) {
void* voidShit = (void*)Ret->GetControlPointPosition(particleIndex);
float floatShit = *(float*)voidShit;
cout << "floatShit: " << floatShit << endl;
}
а cout << voidShit << endl где?
ты посмотри в реклассе то что находится по адресу voidShit. не в структуре в реклассе чето ищи, а именно адрес voidShit туда вставь в рекласс
Не, всё равно 0. Ну и вроде как это индекс, хотя я уже вообще ни в чем не уверен. Скрин из длибы. В длл всё так же.

1638213686940.png
А, ну и я ручками смотрел вот эти все this + 20 из иды -- там вектор.

Короче, херня какая-то получается, нужно другой способ получения координат партикля искать.
Энивей, мне еще и хендл энтити, к которой она прикреплена нужен будет.

UPD:
ну и на будущее, если ты знаешь что у тебя проблема(что-то не работает), ты логаешь ВСЕ. больше "мусора" на экране - больше инфы - больше шанс решения проблемы.
if (!strcmp(info->contents->info->name, "particles/items_fx/aura_shivas.vpcf")) {
void* voidShit = (void*)Ret->GetControlPointPosition(particleIndex);
float floatShit = *(float*)voidShit;
cout << "floatShit: " << floatShit << endl;
}
а cout << voidShit << endl где?
ты посмотри в реклассе то что находится по адресу voidShit. не в структуре в реклассе чето ищи, а именно адрес voidShit туда вставь в рекласс
Та не, я же сегодня весь день этим занимаюсь, уже всё это сто раз перепроверял. Уже незачем.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Не, всё равно 0. Ну и вроде как это индекс, хотя я уже вообще ни в чем не уверен. Скрин из длибы. В длл всё так же.

Посмотреть вложение 182248
А, ну и я ручками смотрел вот эти все this + 20 из иды -- там вектор.

Короче, херня какая-то получается, нужно другой способ получения координат партикля искать.
Энивей, мне еще и хендл энтити, к которой она прикреплена нужен будет.

UPD:

Та не, я же сегодня весь день этим занимаюсь, уже всё это сто раз перепроверял. Уже незачем.
что значит незачем :D затем чтобы понять в чем проблема.
ладно через часик в дотку зайду чисто ради тебя потестить эту хуйню. напиши еще раз всю инфу, название интерфейса там, индексы вмт что где хукать структуры.
 
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Да там всегда одно и то же :D Щас вот еще раз проверил с выводом вообще всего в сосноль -- ну да, без изменений.
Всё это выглядит, как какая-то очень странная херня. То ли я дурак, то ли да. Ну коротщи держи код. Копипастну со своими функами, но ты и так поймешь, что куда. Ну и выпилю всё, что к делу не относится (интерфейсы клиента\энжина, вот это).

C++:
// Интерфейсы
inline class Internal {
  public:
    void GetModules() {
      this -> particles = new Library("particles.dll");
    };
  void GetInterfaces();

  Library * particles;
} lib;

void Internal::GetInterfaces() {
  sdk.particleMgr = particles -> LoadInterface < CParticleSystemMgr > ("ParticleSystemMgr003");
}

// VMT
inline class Interfaces {
  public:
    CParticleSystemMgr * particleMgr;
} sdk;

class Hooking {
  public:
    VMT * particleMgr;
  void Create() {
    particleMgr = new VMT(sdk.particleMgr);
  }
  void Attach() {
    particleMgr -> ApplyVMT(sdk.particleMgr);
  }
  void Hook() {
    vmt.particleMgr -> HookVMT(CreateParticleCollection, 17);
  }
}

  // Ну и функа, которую хукаю, еще раз напишу
  CParticleCollection * CreateParticleCollection(CParticleSystemMgr * thisptr, CWeakHandle_InfoForResourceTypeIParticleSystemDefinition * info, void * unk, IParticleSystemQuery * query, bool bUnk, float fUnk, int particleIndex) {
    CParticleCollection * Ret = vmt.particleMgr -> GetOriginalMethod(CreateParticleCollection)(thisptr, info, unk, query, bUnk, fUnk, particleIndex);
    if (!strcmp(info -> contents -> info -> name, "particles/items_fx/aura_shivas.vpcf")) {
      void * voidShit = (void * ) Ret -> GetControlPointPosition(0);
      float floatShit = * (float * ) voidShit;
      cout << "floatShit: " << floatShit << endl;
    }

    return Ret;

// CParticleCollection.h
// Спиздил у LWSS и индексы починил
#include "Schema.h"
#include "vector.h"

class CParticleCollection {
public:
    virtual CSchemaClassBinding* Schema_DynamicBinding(void) = 0;
    virtual void* GetOwner(void) = 0;
    virtual void SetAssociatedObj(void*) = 0;
    virtual void* GetAssociatedObj() = 0;
    virtual void SetSomethingElse(void*) = 0;
    virtual void* GetSomethingElse() = 0;
    virtual bool IsValid(void) = 0;
    virtual bool IsFullyValid(void) = 0;
    virtual void* GetDefinition(void) = 0;
    virtual CParticleCollection* GetParentCollection(void) = 0;
    virtual CParticleCollection* GetFirstChildCollection(void) = 0;
    virtual CParticleCollection* GetNextSiblingCollection(void) = 0;
    virtual CParticleCollection* GetNextCollectionUsingSameDef(void) = 0;
    virtual bool UsesPowerOfTwoFrameBufferTexture(bool) = 0;
    virtual void sub_105ED0() = 0;
    virtual void sub_1062B0() = 0;
    virtual void sub_1064A0() = 0; // confirmed void
    virtual void SetOrientationFLU() = 0;
    virtual void sub_105C60() = 0;
    virtual void sub_107C90() = 0;
    virtual void sub_1073F0() = 0;
    virtual Vector* GetControlPointPosition(int index) = 0; // 21
    virtual void sub_105861() = 0;
    virtual void* GetControlPointObject(int index) = 0;
    virtual void sub_105D00() = 0;
    virtual void sub_105740() = 0;
    virtual void sub_1056B0() = 0;
    virtual void sub_105700() = 0;
    virtual void sub_12DDA0() = 0;
    virtual void FullRestart(void) = 0;
    virtual void Simulate(float dt) = 0;
    virtual void SleepingSimulate(float dt) = 0;
    virtual void SkipToTime(float time) = 0;
    virtual float GetSimulationTime(void) = 0;
    virtual bool IsFinished(void) = 0;
    virtual float GetNextSleepTime(void) = 0;
    virtual void UpdateNextSleepTime(void) = 0;
    virtual void sub_106350() = 0;
    virtual void sub_106390() = 0;
    virtual void sub_106450() = 0;
    virtual void sub_1063D0() = 0;
    virtual void sub_106410() = 0;
    virtual void sub_105F40() = 0;
    virtual void sub_124A80() = 0;
    virtual void sub_1249B0() = 0;
    virtual void sub_126AA0() = 0;
    virtual bool IsBoundsValid(void) = 0;
    virtual Vector* GetMinBounds(void) = 0;
    virtual Vector* GetMaxBounds(void) = 0;
    virtual void sub_105830() = 0;
    virtual void sub_105840() = 0;
    virtual void SetMinBounds(Vector min) = 0;
    virtual void SetMaxBounds(Vector max) = 0;
    virtual void BloatBoundsUsingControlPoint(void) = 0;
    virtual void DrawDebug(void* IRenderContext, void const* CSceneObject, void* ISceneView, void* ISceneLayer, int, int) = 0;
    virtual void StartEmission(bool) = 0;
    virtual void StopEmission(bool, bool, bool, bool) = 0; // first one if false, particles at 0,0,0  -- last one if false, renders them normally
    virtual bool IsEmissionStopped(void) = 0;
    virtual bool IsEmitting(void) = 0;
    virtual float GetMinimumTimeStepModifier(void) = 0;
    virtual void StartQueuedEmission(void) = 0;
    virtual void SetDormant(bool state) = 0;
    virtual bool IsDormant(void) = 0;
    virtual void sub_105950() = 0;
    virtual void sub_105980() = 0;
    virtual void sub_105990() = 0;
    virtual void sub_133E00() = 0;
    virtual void sub_12E910() = 0;
    virtual void sub_12A3E0() = 0;
    virtual void sub_12A420() = 0;
    virtual void SetQueuedStartEmission(bool state) = 0;
    virtual bool GetQueuedStartEmission(void) = 0;
    virtual bool IsFrozen(void) = 0;
    virtual void SetFrozen(bool state) = 0;
    virtual void sub_12FCD0() = 0;
    virtual void sub_130990() = 0;
    virtual void sub_1241D0() = 0;
    virtual void DESTRUCTOR() = 0;
    virtual void DESTRUCTOR_2() = 0;
    virtual void sub_123F70() = 0;
    virtual void sub_105770() = 0;
    virtual void sub_1057A0() = 0;
    virtual void sub_12A290() = 0;
    virtual void SetOwningSceneObject(void* CSceneParticleObject) = 0;
    virtual void* GetOwningSceneObject(void) = 0;
    virtual void SetMaterialOverride() = 0; // (CWeakHandle<InfoForResourceTypeIMaterial2>)
    virtual bool GetRenderingEnabled(void) = 0;
    virtual void SetRenderingEnabled(bool state) = 0;
    virtual bool InEndCap(void) = 0;
    virtual int GetFlags(void) = 0;
    virtual void SetFlags(int ParticleCollectionFlags_t) = 0; // these flags are tricky, no clue what they do except crash ur game and make particles spawn at the origin.
    virtual void RemoveFlags(int ParticleCollectionFlags_t) = 0;
    virtual void GetSecondarySceneObjects() = 0;// (CUtlVector<CSceneObject *,CUtlMemory<CSceneObject *,int>> &)
    virtual bool HasAttribute(int) = 0;
    virtual void SetMinimumTimeStepModifier(float min) = 0;
    virtual void GetPerformanceData(void** ParticleCollectionPerf_t) = 0;
    virtual void OnSleepingStateChanged(bool) = 0;
    virtual void ValidateSystem(bool*, void* CUtlString) = 0;
    virtual int GetSystemParticleCount(void) = 0;
    virtual int GetSystemMaxParticleCount(void) = 0;
    virtual int GetTotalSystemCount(void) = 0;
    virtual void sub_1248F0() = 0;
    virtual void sub_1244B0() = 0;
    virtual void sub_124040() = 0;
    virtual void sub_1056F0() = 0;

    size_t GetHighestControlPoint(void) {
        return *(int*)(static_cast<size_t>(uintptr_t(this)) + 0xEC);
    }
};

// CParticleSystemMgr.h
// То же самое :D
#include "IAppSystem.h"

class ParticleFilterType_t;
class ParticleFunctionType_t;
class ParticleFullRenderData_Scalar_View;
class CParticleVisibilityData;
class IParticleSnapshot;
class IParticleSystemQuery;
class ISceneWorld;
class CParticleSystemDefinition;

struct InfoStruct {
    const char* name;
};

struct WeakHandleContents_InfoForResourceTypeIParticleSystemDefinition {
    CParticleSystemDefinition* systemDefinition;
    InfoStruct* info;
    char _pad[0x200];
};

struct CWeakHandle_InfoForResourceTypeIParticleSystemDefinition {
    WeakHandleContents_InfoForResourceTypeIParticleSystemDefinition* contents;
};

class CParticleSystemMgr : IAppSystem {
public:
    virtual void SetFallbackParameters(float, float, float, float) = 0; // 11
    virtual void SetSystemLevel(int, int) = 0;
    virtual void SetLowViolence(bool status) = 0;
    virtual bool IsLowViolence() = 0;
    virtual void* FindParticleSystem(const char*, bool) = 0;
    virtual void* GetParticleSystemDefinitionBinding() = 0;
    virtual void* CreateParticleCollection_Handle(CWeakHandle_InfoForResourceTypeIParticleSystemDefinition* info, void*, IParticleSystemQuery*, bool, float, int) = 0; //17
    virtual void* CreateParticleCollection(const char*, void*, IParticleSystemQuery*, bool, float, int) = 0; // 18
    virtual void DestroyParticleCollection(void*) = 0; //19
    virtual void sub_135CC0() = 0;
    virtual void sub_135CC0_2() = 0;
    virtual void sub_135CD0() = 0;
    virtual const char* GetParticleFieldName(ParticleFilterType_t) = 0;
    virtual int  GetParticleOperatorCount(ParticleFunctionType_t) = 0;
    virtual void* GetParticleOperator(ParticleFunctionType_t, int) = 0;
    virtual void SetLastSimulationTime(float time) = 0;
    virtual float GetLastSimulationTime() = 0;
    virtual void SetLastSimulationDuration(float duration) = 0;
    virtual float GetLastSimulationDuration() = 0;
    virtual void DumpParticleList(const char*) = 0;
    virtual void CreateParticleSceneObject(const char*, ISceneWorld*, IParticleSystemQuery*, float, int) = 0;
    virtual void CreateParticleSceneObject2(void* CWeakHandle_InfoForResourceTypeIParticleSystemDefinition, ISceneWorld*, IParticleSystemQuery*, float, int) = 0;
    virtual void CreateParticleSceneObject3(void*, ISceneWorld*, bool) = 0;
    virtual void GenerateExtendedSortedIndexList() = 0;
    virtual int ParticleRandomInt(void*, int min, int max) = 0;
    virtual float ParticleRandomFloat(void*, float min, float max) = 0;
    virtual const char* GetParticleAttributeName(int) = 0;
    virtual void sub_135B00() = 0;
    virtual void sub_1362F0() = 0;
    virtual void sub_135AB0() = 0;
    virtual void sub_1183B0() = 0;
    virtual void sub_135B20() = 0;
    virtual IParticleSnapshot CreateParticleSnapshot() = 0;
    virtual void DestroyParticleSnapshot(IParticleSnapshot*) = 0;
    virtual void sub_135A80() = 0;
    virtual void sub_135A90() = 0;
    virtual void sub_135D60() = 0;
};

ЗЫ:
Говнокод лютый, знаю. Уже пару месяцев хочу зарефакторить, но чет то одно хочу реализовать, то другое -- короче, руки не доходят.
Потому что изначально нужно было расширение предусмотреть. Яж тупо хотел камеру отдалить, там, туман войны, может VBE.
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
бля я понял почему там 0. потому что там блядь еще не выставлен контрол поинт. ты хукаешь создание партикли - получаешь НОВОСОЗДАННУЮ партиклю. естественно она пустая и там нихуя нет. хукай SetControlPoint и там уже чекай. вот и создается иллюзия, что вроде в реклассе есть, а по факту везде 0 xD. у меня такая же хуйня, думаю думаю а потом башку включил и понял эту простую истину
 
Сверху Снизу