Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

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

Shitcode lord ?
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции
84
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Может кто подскажет, как все эти модные-молодежные читы узнают о телепортах\прожатых спеллах в тумане войны?
Хочу их на минимапе рисовать. Легко-доступной инфы в тумане же нет. Думаю, нужно куда-то в сторону системы партиклей смотреть, но не могу разобраться, куда именно. Условно на OnCreateParticle, смотреть, что за партикля и где она вызывается. Наверное. А может я вообще не туда воюю.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Тут всё доходчиво расписано, плюс какой-то из кодеров делал тему на юг о читах\скриптах на доту.
Nah, там только про показ партиклей в тумане, еще и через какие-то хитрые манипуляции. Я просто через ClientCmd шлю dota_use_particle_fow 0.
 
Nah, там только про показ партиклей в тумане, еще и через какие-то хитрые манипуляции. Я просто через ClientCmd шлю dota_use_particle_fow 0.
Ну, посмотри на сурсы с гитхаба или туторы на анончитс
 
ну так и попробуй 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: "}"
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну так и попробуй OnParticleCreate похукать
Босс качалки пришел, тебя-то я и ждал. Получается, раз я всё равно использую систему партиклей доты, в т.ч. CreateParticle из панорамы, я могу вот так просто хукнуть этот самый CreateParticle? Или, скорей, SetParticleControl. Соседняя функция, в принципе, не велика разница.
Как-то это слишком просто звучит, меня это смутило.
(Почему я больше не могу реакт оставить, лол)
 
Последнее редактирование:
Босс качалки пришел, тебя-то я и ждал. Получается, раз я всё равно использую систему партиклей доты, в т.ч. CreateParticle из панорамы, я могу вот так просто хукнуть этот самый CreateParticle? Или, скорей, SetParticleControl. Соседняя функция, в принципе, не велика разница.
Как-то это слишком просто звучит, меня это смутило.
(Почему я больше не могу реакт оставить, лол)
да. но естественно не сами джс методы хукай, а то что они внутри вызывают.(ну тип игра не вызывает джс методы зачем ей это делать она настоящие функции движка(ну игры всмысле) вызывает). ну и не забывай тестить - может быть такое что функция которую ты хукнул не все партикли ловит(на некоторые не вызывается)(ну то есть ты хукнул какуюто оберточную функцию а не самую низкоуровневую. в итоге некоторые партикли через обертку создаются, а остальные через низкоуровневые функции). в таком случае ищи другие функции поглубже. а ваще лучше бы сразу в нетчан пошел - там не только партикли, там ваще все что можно. ваще все что прилетает от сервака проходит через нетчан. вот там можешь сразу тусить и подслушивать. ну и еще есть SetParticleControlEnt - не все партикли к коордам статичным привязываются, некоторые за сущностями следуют.
у лвсс пример хука есть
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
да. но естественно не сами джс методы хукай, а то что они внутри вызывают.(ну тип игра не вызывает джс методы зачем ей это делать она настоящие функции движка(ну игры всмысле) вызывает). ну и не забывай тестить - может быть такое что функция которую ты хукнул не все партикли ловит(на некоторые не вызывается)(ну то есть ты хукнул какуюто оберточную функцию а не самую низкоуровневую. в итоге некоторые партикли через обертку создаются, а остальные через низкоуровневые функции). в таком случае ищи другие функции поглубже. а ваще лучше бы сразу в нетчан пошел - там не только партикли, там ваще все что можно. ваще все что прилетает от сервака проходит через нетчан. вот там можешь сразу тусить и подслушивать. ну и еще есть SetParticleControlEnt - не все партикли к коордам статичным привязываются, некоторые за сущностями следуют.
у лвсс пример хука есть
Пожалуйста, авторизуйтесь для просмотра ссылки.
Ну опщем да, спасибо, оно (с партиклями) работает, как и ожидалось. А вот в сторону нетчана даже смотреть не думал. А зря, выглядит многообещающе.
Давно еще, когда сырцы lwss смотрел, хотел разобраться, но чет сложно короче было тогда.
Не разберусь, так вариант с партиклями оставлю. Если в божеский вид свой говнокод приведу, мб сюда скину. Потомкам, так сказать.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Короче, с нетчаном мне пока сложно. А с партиклями какая-то очень странная херня получается.
Беру интерфейс ParticleSystemMgr003 из particles.dll, кладу его в vmt.particleMgr.
Хукаю CreateParticleCollection_Handle -- 17 функция. Сто раз перепроверил, это точно она.

C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
struct InfoStruct {
    const char* name;
};

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

struct CWeakHandle_InfoForResourceTypeIParticleSystemDefinition {
    WeakHandleContents_InfoForResourceTypeIParticleSystemDefinition* contents;
};

Это мне уже спать пора, или я чего-то не учел?
 
Последнее редактирование:
Короче, с нетчаном мне пока сложно. А с партиклями какая-то очень странная херня получается.
Беру интерфейс ParticleSystemMgr003 из particles.dll, кладу его в vmt.particleMgr.
Хукаю CreateParticleCollection_Handle -- 17 функция. Сто раз перепроверил, это точно она.

C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
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[])
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Написал ответ так, что югейм лег. Класс.
удостоверься что там 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, а не краш, там, или какой-то мусор.
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Да, и я дампил CParticleSystemDefinition (описанным тобой методом), оффсеты неправильные.
Ну, верней, в полученном мною CParticleSystemDefinition они не совпадают с теми, что из дампера.
Странно всё это, короче.
 
Написал ответ так, что югейм лег. Класс.

Не, я же адрес в зааттаченную консоль вывожу, дальше его в рекласс\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 попробуй передать
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
вместо char pad юзай лучше геттеры

Вот такое юзаю. Просто расписывать в падлу было.
C++:
Expand Collapse Copy
#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++:
Expand Collapse Copy
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


Остальное-то работает -- и сам хук, и другие хуки, и имя партикля же я получаю. А вот конкретно это дерьмо -- нет.
 
еще раз(криво запостил, вместо нью поста как редактирование)
бля токо что заметил
Vector* Vec = Ret->GetControlPointPosition(particleIndex);
ты уверен что параметр ты правильно передаешь? там индекс контрол поинта скорее всего а не партикли. 0 попробуй передать

вот из сурсов тф2. как видишь параметр там первый вовсе не партикль индекс.(другая функа но она из этого же семейства)
C++:
Expand Collapse Copy
//-----------------------------------------------------------------------------
// 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 туда вставь в рекласс
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
еще раз(криво запостил, вместо нью поста как редактирование)
бля токо что заметил
Vector* Vec = Ret->GetControlPointPosition(particleIndex);
ты уверен что параметр ты правильно передаешь? там индекс контрол поинта скорее всего а не партикли. 0 попробуй передать

вот из сурсов тф2. как видишь параметр там первый вовсе не партикль индекс.(другая функа но она из этого же семейства)
C++:
Expand Collapse Copy
//-----------------------------------------------------------------------------
// 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 туда вставь в рекласс
Та не, я же сегодня весь день этим занимаюсь, уже всё это сто раз перепроверял. Уже незачем.
 
Не, всё равно 0. Ну и вроде как это индекс, хотя я уже вообще ни в чем не уверен. Скрин из длибы. В длл всё так же.

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

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

UPD:

Та не, я же сегодня весь день этим занимаюсь, уже всё это сто раз перепроверял. Уже незачем.
что значит незачем :D затем чтобы понять в чем проблема.
ладно через часик в дотку зайду чисто ради тебя потестить эту хуйню. напиши еще раз всю инфу, название интерфейса там, индексы вмт что где хукать структуры.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Да там всегда одно и то же :D Щас вот еще раз проверил с выводом вообще всего в сосноль -- ну да, без изменений.
Всё это выглядит, как какая-то очень странная херня. То ли я дурак, то ли да. Ну коротщи держи код. Копипастну со своими функами, но ты и так поймешь, что куда. Ну и выпилю всё, что к делу не относится (интерфейсы клиента\энжина, вот это).

C++:
Expand Collapse Copy
// Интерфейсы
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.
 
Последнее редактирование:
бля я понял почему там 0. потому что там блядь еще не выставлен контрол поинт. ты хукаешь создание партикли - получаешь НОВОСОЗДАННУЮ партиклю. естественно она пустая и там нихуя нет. хукай SetControlPoint и там уже чекай. вот и создается иллюзия, что вроде в реклассе есть, а по факту везде 0 xD. у меня такая же хуйня, думаю думаю а потом башку включил и понял эту простую истину
 
Назад
Сверху Снизу