Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
бля я понял почему там 0. потому что там блядь еще не выставлен контрол поинт. ты хукаешь создание партикли - получаешь НОВОСОЗДАННУЮ партиклю. естественно она пустая и там нихуя нет. хукай SetControlPoint и там уже чекай. вот и создается иллюзия, что вроде в реклассе есть, а по факту везде 0 xD. у меня такая же хуйня, думаю думаю а потом башку включил и понял эту простую истину
БЛДЯДЬ. Самый рофл, что у меня подобные мысли были, но я их проигнорировал -- помнишь, может, я где-то тут писал про хук OnAddEntity, там такое же было.
Господи, как же тупо. Ну, может еще кому-то этот тред поможет. Спасибо, кстати.
Ребятки уже порешали вопросы, я не успел :sob:, но ситуация с неинициализированным объектом бьет по ментальному здоровью.
Кроме хука другой функции можно еще предложить сделать
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А, забыл о результатах отписать. Не уверен, что нашел именно SetControlPoint, но с этой функой всё работает.
36 функция в вмт CParticleCollection. Сига до вмт, если кому нужна: "48 8D ? ? ? ? ? 48 89 ? ? 48 8B ? 48 89".
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Короче шляпу я какую-то хукал. Не знаю, че это за функция. Хоть она и работает, там не вся инфа есть. IsDormant там не заполнен, что делает для меня функцию бесполезной. Хотел брать положение и IsDormant партикли "че-то там dota_base_atack", ну короче когда лес фармят.
Нашел SetParticleControlEnt, но она из client.dll, т.е. видимо какая-то обертка. А дальше реверсить в падлу, она тоже бесполезная.
Там в глубине есть индекс энтити (что очевидно), но всё равно координаты из дорманта не получить -- ни у энтити (что очевидно), ни у партикли -- последнее положение не в тумане показывается.
Но если вдруг она кому-то нужна:
typedef void(__fastcall* SetParticleControlEntFn)(CParticleSystemMgr* thisptr, void* CNewParticleEffect, int a3, int particleIndex, int a5, void* attachType, void* a7, void* a8, void* a9);
SetParticleControlEntFn oSetParticleControlEnt;
void SetParticleControlEnt(CParticleSystemMgr* thisptr, CNewParticleEffect* CNewParticleEffect, int a3, int particleIndex, int a5, void* attachType, void* a7, void* a8, void* a9) {
// Ну и тут из полезного -- энтитя, CNewParticleEffect, CParticleCollection, и CParticleSystemMgr.
// Еще вроде a3 -- это индекс энтити, но чет пару раз рандомно крашило с ним.
CBaseEntity* BaseEntity = CNewParticleEffect->ParticlesListPtr->C_BaseEntityOuterHelperPtr->BaseEntity;
CParticleCollection* ParticleCollection = CNewParticleEffect->CParticleCollectionPtr;
oSetParticleControlEnt(thisptr, CNewParticleEffect, a3, particleIndex, a5, attachType, a7, a8, a9);
}
Классы:
C++:
class C_BaseEntityOuterHelper {
public:
char pad_0000[8]; //0x0000
CBaseEntity* BaseEntity; //0x0008
};
class ParticlesList { // В падлу разбираться, что за класс, название от балды дал
public:
char pad_0000[8]; //0x0000
C_BaseEntityOuterHelper* C_BaseEntityOuterHelperPtr; //0x0008
};
class CNewParticleEffect {
public:
char pad_0000[32]; //0x0000
CParticleCollection* CParticleCollectionPtr; //0x0020
char pad_0028[48]; //0x0028
ParticlesList* ParticlesListPtr; //0x0058
};
Кстати, если кто-нибудь подскажет, где лежит чертов SetParticleControl, я... ну... спасибо скажу, лол.
Столько всего реализовал, а банальный кружок вокруг энтити нарисовать не могу.
Пробовал его найти пару раз -- нашел всё, что угодно, но не его, и чет плюнул.
ЗЫ: Щас старый хук юзаю, из прошлого поста, он хоть что-то может. Беру имя партикли и рисую её на миникарте и в мире.
Только не все партикли работают. У некоторых "последняя видимая позиция энтити" в GetControlPointPosition.
Хрен его знает, от чего это зависит. И получается, просто все "геройские" партикли (particles/units/heroes/hero_name) рисовать не вариант. Условный старшторм Мираны будет хрен пойми где высираться. Получается, мне нужно все абилки всех героев протестить в лобби, правильная ли у них позиция, и занести их в файл? :D Вроде LWSS так делает, но это жопная боль.
Короче шляпу я какую-то хукал. Не знаю, че это за функция. Хоть она и работает, там не вся инфа есть. IsDormant там не заполнен, что делает для меня функцию бесполезной. Хотел брать положение и IsDormant партикли "че-то там dota_base_atack", ну короче когда лес фармят.
Нашел SetParticleControlEnt, но она из client.dll, т.е. видимо какая-то обертка. А дальше реверсить в падлу, она тоже бесполезная.
Там в глубине есть индекс энтити (что очевидно), но всё равно координаты из дорманта не получить -- ни у энтити (что очевидно), ни у партикли -- последнее положение не в тумане показывается.
Но если вдруг она кому-то нужна:
typedef void(__fastcall* SetParticleControlEntFn)(CParticleSystemMgr* thisptr, void* CNewParticleEffect, int a3, int particleIndex, int a5, void* attachType, void* a7, void* a8, void* a9);
SetParticleControlEntFn oSetParticleControlEnt;
void SetParticleControlEnt(CParticleSystemMgr* thisptr, CNewParticleEffect* CNewParticleEffect, int a3, int particleIndex, int a5, void* attachType, void* a7, void* a8, void* a9) {
// Ну и тут из полезного -- энтитя, CNewParticleEffect, CParticleCollection, и CParticleSystemMgr.
// Еще вроде a3 -- это индекс энтити, но чет пару раз рандомно крашило с ним.
CBaseEntity* BaseEntity = CNewParticleEffect->ParticlesListPtr->C_BaseEntityOuterHelperPtr->BaseEntity;
CParticleCollection* ParticleCollection = CNewParticleEffect->CParticleCollectionPtr;
oSetParticleControlEnt(thisptr, CNewParticleEffect, a3, particleIndex, a5, attachType, a7, a8, a9);
}
Классы:
C++:
class C_BaseEntityOuterHelper {
public:
char pad_0000[8]; //0x0000
CBaseEntity* BaseEntity; //0x0008
};
class ParticlesList { // В падлу разбираться, что за класс, название от балды дал
public:
char pad_0000[8]; //0x0000
C_BaseEntityOuterHelper* C_BaseEntityOuterHelperPtr; //0x0008
};
class CNewParticleEffect {
public:
char pad_0000[32]; //0x0000
CParticleCollection* CParticleCollectionPtr; //0x0020
char pad_0028[48]; //0x0028
ParticlesList* ParticlesListPtr; //0x0058
};
Кстати, если кто-нибудь подскажет, где лежит чертов SetParticleControl, я... ну... спасибо скажу, лол.
Столько всего реализовал, а банальный кружок вокруг энтити нарисовать не могу.
Пробовал его найти пару раз -- нашел всё, что угодно, но не его, и чет плюнул.
ЗЫ: Щас старый хук юзаю, из прошлого поста, он хоть что-то может. Беру имя партикли и рисую её на миникарте и в мире.
Только не все партикли работают. У некоторых "последняя видимая позиция энтити" в GetControlPointPosition.
Хрен его знает, от чего это зависит. И получается, просто все "геройские" партикли (particles/units/heroes/hero_name) рисовать не вариант. Условный старшторм Мираны будет хрен пойми где высираться. Получается, мне нужно все абилки всех героев протестить в лобби, правильная ли у них позиция, и занести их в файл? :D Вроде LWSS так делает, но это жопная боль.
ты мог бы чисто теоритически сравнивать коорды партикли с последним местом появления сущности(последние известные коорды сущности) - если совпадает, значит смысла нет рисовать партикль на минимапе(ибо этот партикль будет рисоваться в жопе. а точнее не в жопе а там где была сущность в последний раз). в противном случае можешь рисовать. меня тоже иногда заебывает когда всякие эффекты вампиризма просто посреди карты показываются(потому что там сущность была видна в последний раз) а не там где она лес фармит(ну это просто с дефолтным dota_use_particle_fow 0).
SetParticleControl чтобы найти джаваскрипт в помощь. Particles.SetParticleControl( integer iIndex, integer iPoint, js_value vPosVal )
если не ошибаюсь то это виртуалка прост у какого-то из классов партикли. ее же сразу и хукнуть можешь
ты мог бы чисто теоритически сравнивать коорды партикли с последним местом появления сущности(последние известные коорды сущности) - если совпадает, значит смысла нет рисовать партикль на минимапе(ибо этот партикль будет рисоваться в жопе. а точнее не в жопе а там где была сущность в последний раз). в противном случае можешь рисовать. меня тоже иногда заебывает когда всякие эффекты вампиризма просто посреди карты показываются(потому что там сущность была видна в последний раз) а не там где она лес фармит(ну это просто с дефолтным dota_use_particle_fow 0).
SetParticleControl чтобы найти джаваскрипт в помощь. Particles.SetParticleControl( integer iIndex, integer iPoint, js_value vPosVal )
если не ошибаюсь то это виртуалка прост у какого-то из классов партикли. ее же сразу и хукнуть можешь
Получается, нужно куда-то, и, что самое главное, когда-то, записывать последние координаты энтити.
Знаю, что где-то там есть виртуальная функа SetDormant. В принципе, если её хукнуть, можно записывать коорды энтити в момент её ухода в туман.
А, или можно в хуке создания партикли чекать, что за герой (это я уже делаю), потом смотреть его IsDormant (это я тоже делаю), и если да, то сравнивать с его позицией, т.е. "последней позицией". Ну, он в тумане же. Да, хороший вариант. Спасибо, что подсказал.
А насчет SetParticleControl -- ну я так и делал, очевидно, я же SetParticleControlEnt там же и нашел :D
Там вроде очевидный паттерн -- идет хреф, ниже функа, где "iIndex", и два хрефа. У других функций, один из них -- тот, что нужен.
А вот у SetParticleControl там какой-то мусор. Ну может и не мусор, но там видно, что это не они, да и хук просто не срабатывает.
Ладно, хрен с ним, лучше буду particles.dll реверсить, чем эту оберточную шляпу.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ну и тогда сразу спрошу, может у тебя появится идея получше. Насчет партикли атаки в тумане войны. Ну т.е. когда юнит лес фармит.
Проблема с ним в том, что у него дормант не заполнен. И вообще, он будет колбекаться при ЛЮБОЙ атаке кем-либо кого-либо.
Что, сам понимаешь, шляпа. В теории, я могу просто ручками разметить всю карту на "свою" и "чужую", или даже координаты всех крип-спавнов записать (при нажатии на Alt появляются ректы спавнбоксов, а это партикли -- я, в принципе, могу их коорды брать), ну и дальше очевидно -- чекаю, в каких коордах партикль атаки, и если в нужных -- рисую на миникарте\в мире\высираю уведомление мб.
Но тут проблемы две. Первая -- ну это ваще какой-то костыль, еще и боль в моей жопе.
Вторая -- а если мой керри фармит вражеский лес? Ну чет такое.
Я вот, что думаю. Когда итерировал энтитей и записывал их в файл (чет тестил), видел там крипспавны.
Попробую, короче, брать координаты этих спавнов и смотреть, какая в них инфа в дорманте есть.
Ну как бы очевидно, что если там есть IsDormant (и, наверное, коорд там может не быть, если кто-то этот спавн еще не видел из тиммейтов), то это лютая имба, и я могу просто коорды спавна округлить до небольшого квадратика (ну типа квадрат вокруг спавна), и в хуке чекать, где создается партикль атаки. Ну и если он внутри спавнбокса и он в дорманте -- рисовать алерт, там, ну ты понял.
Только я сильно сомневаюсь, что всё будет вот так просто. По хорошему, мне бы в нетчан смотреть.
Я уже его нашел, зареверсил, хукнул. Но там чет протобаффы какие-то, вот этот вот всё. Сложно, короче.
Ну и тогда сразу спрошу, может у тебя появится идея получше. Насчет партикли атаки в тумане войны. Ну т.е. когда юнит лес фармит.
Проблема с ним в том, что у него дормант не заполнен. И вообще, он будет колбекаться при ЛЮБОЙ атаке кем-либо кого-либо.
Что, сам понимаешь, шляпа. В теории, я могу просто ручками разметить всю карту на "свою" и "чужую", или даже координаты всех крип-спавнов записать (при нажатии на Alt появляются ректы спавнбоксов, а это партикли -- я, в принципе, могу их коорды брать), ну и дальше очевидно -- чекаю, в каких коордах партикль атаки, и если в нужных -- рисую на миникарте\в мире\высираю уведомление мб.
Но тут проблемы две. Первая -- ну это ваще какой-то костыль, еще и боль в моей жопе.
Вторая -- а если мой керри фармит вражеский лес? Ну чет такое.
Я вот, что думаю. Когда итерировал энтитей и записывал их в файл (чет тестил), видел там крипспавны.
Попробую, короче, брать координаты этих спавнов и смотреть, какая в них инфа в дорманте есть.
Ну как бы очевидно, что если там есть IsDormant (и, наверное, коорд там может не быть, если кто-то этот спавн еще не видел из тиммейтов), то это лютая имба, и я могу просто коорды спавна округлить до небольшого квадратика (ну типа квадрат вокруг спавна), и в хуке чекать, где создается партикль атаки. Ну и если он внутри спавнбокса и он в дорманте -- рисовать алерт, там, ну ты понял.
Только я сильно сомневаюсь, что всё будет вот так просто. По хорошему, мне бы в нетчан смотреть.
Я уже его нашел, зареверсил, хукнул. Но там чет протобаффы какие-то, вот этот вот всё. Сложно, короче.
я не тестил, ты уверен что у сущности в тумане войны GetAbsOrigin() не работает? мне кажется он и должен возвращать последнюю известную позицию героя. посмотри потести. сомневаюсь что там позиция в 0 сбрасывается когда сущность в туман уходит(опять же не тестил не знаю просто предполагаю).
тоже не тестил, но посмотри, привязана ли партикля фарма в тумане к какой-то сущности или же к коордам. ну а так я ваще хуй знает как это все сделать. сиди тести смотри хули.
но все же я думаю подход с нетчаном будет гораздо мощнее.
протобафы доты на гитхабе есть
через protoc от гугла компилишь(и потом инклюдишь: в проект добавляешь существующие файлы - .cc + .h которые тебе нужны(+остальные .cc и .h которые этим хедерам нужны. они там друг от друга зависят), закидываешь рядом с хедерами папку google из protobuf-3.18.1\src\google но не инклюдишь ее в проект), билдишь libprotobuf и наслаждаешься поеданием говна от уебков из гугла
Ага, привязана. К WorldEnt :D Гейб, видимо, не настолько мудак.
Короче, я всё потестил со всех сторон, попробовал разные варианты -- всё херня. Спасибо, что надоумил таки с протобаффами разобраться-- там рили всё просто. (Я надеюсь, как заинклюдить депсы от гугла ты пишешь "для потомков", потому что я конечно тот еще кодер, но не настолько же...)
Опщем, через пару дней буду пробовать. Как сделаю -- отпишу о результатах. Или, что еще лучше, отдельный тред в соседнем разделе с гайдами запилю.
Энивей, спасибо за неоценимую помощь <З
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дошли руки до нетчана. Хукнул, смотрю. Вроде что-то приходит.
Но я, видимо, что-то не так делаю. Прототип функции:
C++:
INetChannel* thisptr, NetMessageHandle_t* messageHandle, void* msg, NetChannelBufType_t const* type, int bits, int messageNum
msg не void* должен быть, а google::protobuf::Message*, но пока пусть так. Открываю его в реклассе -- там какой-то хлам, который еще и меняется постоянно. Выглядит, как какой-то рандом, из которого я ничего полезного не получу.
Вроде индекс правильный, 87. В классе рядом ничего другого подходящего нет.
Дошли руки до нетчана. Хукнул, смотрю. Вроде что-то приходит.
Но я, видимо, что-то не так делаю. Прототип функции:
C++:
INetChannel* thisptr, NetMessageHandle_t* messageHandle, void* msg, NetChannelBufType_t const* type, int bits, int messageNum
msg не void* должен быть, а google::protobuf::Message*, но пока пусть так. Открываю его в реклассе -- там какой-то хлам, который еще и меняется постоянно. Выглядит, как какой-то рандом, из которого я ничего полезного не получу.
Вроде индекс правильный, 87. В классе рядом ничего другого подходящего нет.
Как у тебя красиво сделано, спизжу себе пару идей. А так, я всё это в общем-то и делаю. Ну, кроме ToString, попробую потом его так заюзать.
Стало быть, все вкусности в msg лежат? Не стал сильно пытаться разобраться, потому что вдруг я не туда воюю.
Щас PrepareUnitOrders доделаю (собака сутулая на Габене зачем-то сделала её не виртуальной, плюс сига, минус стабильность), да к нетчану вернусь.
Как у тебя красиво сделано, спизжу себе пару идей. А так, я всё это в общем-то и делаю. Ну, кроме ToString, попробую потом его так заюзать.
Стало быть, все вкусности в msg лежат? Не стал сильно пытаться разобраться, потому что вдруг я не туда воюю.
Щас PrepareUnitOrders доделаю (собака сутулая на Габене зачем-то сделала её не виртуальной, плюс сига, минус стабильность), да к нетчану вернусь.