Начинающий
-
Автор темы
- #1
Здарова. Постараюсь изложить коротко и ясно на эту тему.
В доте, это не герой напрямую делает действия, а игрок(Player), тоесть ваши глаза(камера).
Хочу начать атаковать вражеского героя. В таком случае Игрок(ТЫ) внутри доты вызываешь функцию "PrepareUnitOrders"
И там передаюся определённые параметры.
(Source: мой какахоЧит который был сделан на базе других читов)
Тут самое главное всё грамотно подставить и во время. Необходимо сделать себе итерацию сущностей, например как в гайдах от Liberalist . Можна также хукнуть OnAddEntity / OnRemoveEntity и просто добавлять сущностей себе в массив и гдето в своем цикле итерировать их( не забывайте что новосозданная сущность пустая, и потчи ничего не содержит. Поэтому както делайте задержку или делайте проверку, не пустая ли сущность на данный момент )
Раньше эта функция была в классе C_DOTAPlayer, но с недавнего времени её убрали и сделали типа глобальной(или как это называется). Ну в общем берете сигу на функу и вызываете её, подставля правильно параметры. Для х64 версии игры там будет конвенция _fastcall (rcx,rdx,r8,r9,...). Можете поставить брекпоинт на функцию в дебаггере(x64dbg) и посмотреть что за параметры передаются(Поставил брекпоинт и сделал какое-то действие: клик ПКМ, юз способки, чё угодно и игра запаузится и зайдешь в дебаггер и посмотришь, что там)
Вот один из способов, как находить PrepareUnitOrders. Может есть какие-то более легкие, но я только об этом знаю на данный момент. Можете сделать самим сигу вписовая байт по байту, либо скачать плагин в инете (например SwissArmyKnife, которым я лично пользуюсь (НЕ РЕКЛАМА,ССЫЛКУ НА СКАЧИВАНИЕ НЕ ДАЮ. ИЩИТЕ САМИ) )
И так:
1. Открываем дебаггер и Аттачимся к доте( жмешь ф9 если необходимо). не важно где мы, в гл меню или в катке(желательно в меню)
2. В дебaггере ctrl+g ( client.entry )
3. ПКМ - Search For -> current module -> string referrences
4. Ждем несколько секунд. Когда завершит загружать строки, вписываем снизу PrepareUnitOrders и выбераем первое сверху
5.нас перекинуло куда то, и мы ниже видим что в rcx что-то загружается (По секрету и опыту скажу, что это функа(адрес, указатель не важно, главное что это связанно с нашей PrepareUnitOrders) кликаем ПКМ->Follow in Dissambler-> Constant
6. Нас снова кудась перекинуло и если покрутим чучуть ниже увидим, что-то похожее на аргументы функции
(Скрин не могу выложить поэтому ловите имгур
7. Вызовы важных функций обычно лежат в самом низу, поэтому туда мы и летим(крутим пока не увидем какойто вызов)
(немного придется покрутить, но ничего. Рука от пастинга не ломается же , поэтому от мейкинга вам ничего не будет)
Выделяю начавло (не очень много и не очень мало) плагинс. ( Режим IDA выберайте, хоть как кому удобно)
И так сига готова, теперь в своем бест хак ин зе ворлд гдето поставьте себе это:
Теперь нужно сделать тайпдеф функи( если незнаешь что это, то лучше загугли. Проще говоря, это прототип функции. Мы указываем, что эта за функа, какие параметры берёт, как их юзает и что вернёт нам)
C_DOTAPlayer* player это просто Указатель на обьект класса C_DOTAPlayer на локального игрока. Как получить локального игрока? Смотри гайд от Liberalist
entHandle это индекс цели на которую что-то будет применено(ну например если мы дадим приказ Атаковать. Кого? Мы не вставим туда сущность врага, а только её индекс. Это может также быть предмет(Подобрать. Что? Индекс предмета)
movePosition это вектор координат(х,у,z) Обычно туда вставляемпустой вектор Vector empty = {0,0,0} если нам ненужно коорды. Ну тип посмотрите,
Атаковать героя вражеского. Для этого нам не ненадо координаты, а просто цель(Индекс сущности врага).
Бликнуться к врагу. Вот тут нам уже надо координаты. Vector MovePosition = Enemy->GetAbsOrigin(); и это будет чтото в этом роде
CBaseEntity* entity это указатель на обьект класса CBaseEntity на сущность, которая выполнит приказ(действие) тоесть мы туда поставим сущность нашего героя.
Из этой функи можна прикольные шняги сделать, вот вам примеры:
Только у меня проблема с PickupItem. Когда её вызываю на предмет( предмет это когда entity.name == dota_item_drop ну и еще я пробовал item_aegis), то пишет что должен быть физический предмет. Если решу проблему, обновлю текст(может я не понял как юзать эту функу, что должен быть подобрано.
Надеюсь, пригодится. Может быть немного лишнего мусора написал, но уверен что большинство по теме. Я не про хацкер, а обычный нуб. Учусь на ошибках.
В доте, это не герой напрямую делает действия, а игрок(Player), тоесть ваши глаза(камера).
Хочу начать атаковать вражеского героя. В таком случае Игрок(ТЫ) внутри доты вызываешь функцию "PrepareUnitOrders"
И там передаюся определённые параметры.
(Source: мой какахоЧит который был сделан на базе других читов)
C++:
void PrepareUnitOrders (C_DOTAPlayer* player, DotaUnitOrder_t order, int entHandle, Vector movePosition, int abilityIndex, PlayerOrderIssuer_t orderIssuer, CBaseEntity* entity, bool queue, OrderQueueBehavior_t queueBehavior, bool showEffect);
Раньше эта функция была в классе C_DOTAPlayer, но с недавнего времени её убрали и сделали типа глобальной(или как это называется). Ну в общем берете сигу на функу и вызываете её, подставля правильно параметры. Для х64 версии игры там будет конвенция _fastcall (rcx,rdx,r8,r9,...). Можете поставить брекпоинт на функцию в дебаггере(x64dbg) и посмотреть что за параметры передаются(Поставил брекпоинт и сделал какое-то действие: клик ПКМ, юз способки, чё угодно и игра запаузится и зайдешь в дебаггер и посмотришь, что там)
Вот один из способов, как находить PrepareUnitOrders. Может есть какие-то более легкие, но я только об этом знаю на данный момент. Можете сделать самим сигу вписовая байт по байту, либо скачать плагин в инете (например SwissArmyKnife, которым я лично пользуюсь (НЕ РЕКЛАМА,ССЫЛКУ НА СКАЧИВАНИЕ НЕ ДАЮ. ИЩИТЕ САМИ) )
И так:
1. Открываем дебаггер и Аттачимся к доте( жмешь ф9 если необходимо). не важно где мы, в гл меню или в катке(желательно в меню)
2. В дебaггере ctrl+g ( client.entry )
3. ПКМ - Search For -> current module -> string referrences
4. Ждем несколько секунд. Когда завершит загружать строки, вписываем снизу PrepareUnitOrders и выбераем первое сверху
5.нас перекинуло куда то, и мы ниже видим что в rcx что-то загружается (По секрету и опыту скажу, что это функа(адрес, указатель не важно, главное что это связанно с нашей PrepareUnitOrders) кликаем ПКМ->Follow in Dissambler-> Constant
6. Нас снова кудась перекинуло и если покрутим чучуть ниже увидим, что-то похожее на аргументы функции
(Скрин не могу выложить поэтому ловите имгур
Пожалуйста, авторизуйтесь для просмотра ссылки.
)7. Вызовы важных функций обычно лежат в самом низу, поэтому туда мы и летим(крутим пока не увидем какойто вызов)
(немного придется покрутить, но ничего. Рука от пастинга не ломается же , поэтому от мейкинга вам ничего не будет)
Пожалуйста, авторизуйтесь для просмотра ссылки.
8. кликаем пкм - follow in dissambler - constant
Пожалуйста, авторизуйтесь для просмотра ссылки.
9. Делаем сигу на начало функции ( либо ручками вписовать байтики, но в относительных адресах заменяйте байтики(относительные, тоесть которые меняются после перезапуска игры на знаки вопроса). Я же воспользуюсь плагином от SwissArmyKnifeВыделяю начавло (не очень много и не очень мало) плагинс. ( Режим IDA выберайте, хоть как кому удобно)
Пожалуйста, авторизуйтесь для просмотра ссылки.
И так сига готова, теперь в своем бест хак ин зе ворлд гдето поставьте себе это:
C++:
enum class DotaUnitOrder_t : int {
DOTA_UNIT_ORDER_NONE = 0,
DOTA_UNIT_ORDER_MOVE_TO_POSITION = 1,
DOTA_UNIT_ORDER_MOVE_TO_TARGET = 2,
DOTA_UNIT_ORDER_ATTACK_MOVE = 3,
DOTA_UNIT_ORDER_ATTACK_TARGET = 4,
DOTA_UNIT_ORDER_CAST_POSITION = 5,
DOTA_UNIT_ORDER_CAST_TARGET = 6,
DOTA_UNIT_ORDER_CAST_TARGET_TREE = 7,
DOTA_UNIT_ORDER_CAST_NO_TARGET = 8,
DOTA_UNIT_ORDER_CAST_TOGGLE = 9,
DOTA_UNIT_ORDER_HOLD_POSITION = 10,
DOTA_UNIT_ORDER_TRAIN_ABILITY = 11,
DOTA_UNIT_ORDER_DROP_ITEM = 12,
DOTA_UNIT_ORDER_GIVE_ITEM = 13,
DOTA_UNIT_ORDER_PICKUP_ITEM = 14,
DOTA_UNIT_ORDER_PICKUP_RUNE = 15,
DOTA_UNIT_ORDER_PURCHASE_ITEM = 16,
DOTA_UNIT_ORDER_SELL_ITEM = 17,
DOTA_UNIT_ORDER_DISASSEMBLE_ITEM = 18,
DOTA_UNIT_ORDER_MOVE_ITEM = 19,
DOTA_UNIT_ORDER_CAST_TOGGLE_AUTO = 20,
DOTA_UNIT_ORDER_STOP = 21,
DOTA_UNIT_ORDER_TAUNT = 22,
DOTA_UNIT_ORDER_BUYBACK = 23,
DOTA_UNIT_ORDER_GLYPH = 24,
DOTA_UNIT_ORDER_EJECT_ITEM_FROM_STASH = 25,
DOTA_UNIT_ORDER_CAST_RUNE = 26,
DOTA_UNIT_ORDER_PING_ABILITY = 27,
DOTA_UNIT_ORDER_MOVE_TO_DIRECTION = 28,
DOTA_UNIT_ORDER_PATROL = 29,
DOTA_UNIT_ORDER_VECTOR_TARGET_POSITION = 30,
DOTA_UNIT_ORDER_RADAR = 31,
DOTA_UNIT_ORDER_SET_ITEM_COMBINE_LOCK = 32,
DOTA_UNIT_ORDER_CONTINUE = 33,
DOTA_UNIT_ORDER_VECTOR_TARGET_CANCELED = 34,
DOTA_UNIT_ORDER_CAST_RIVER_PAINT = 35,
DOTA_UNIT_ORDER_PREGAME_ADJUST_ITEM_ASSIGNMENT = 36,
};
enum PlayerOrderIssuer_t : int {
DOTA_ORDER_ISSUER_SELECTED_UNITS = 0,
DOTA_ORDER_ISSUER_CURRENT_UNIT_ONLY = 1,
DOTA_ORDER_ISSUER_HERO_ONLY = 2,
DOTA_ORDER_ISSUER_PASSED_UNIT_ONLY = 3
};
enum OrderQueueBehavior_t : int {
DOTA_ORDER_QUEUE_DEFAULT = 0,
DOTA_ORDER_QUEUE_NEVER = 1,
DOTA_ORDER_QUEUE_ALWAYS = 2,
};
Теперь нужно сделать тайпдеф функи( если незнаешь что это, то лучше загугли. Проще говоря, это прототип функции. Мы указываем, что эта за функа, какие параметры берёт, как их юзает и что вернёт нам)
C++:
typedef void(_fastcall* _PrepareUnitOrders)(C_DOTAPlayer* player, DotaUnitOrder_t order, int entHandle, Vector movePosition, int abilityIndex, PlayerOrderIssuer_t orderIssuer, CBaseEntity* entity, bool queue, OrderQueueBehavior_t queueBehavior, bool showEffect);
_PrepareUnitOrders PrepareUnitOrders;
C_DOTAPlayer* player это просто Указатель на обьект класса C_DOTAPlayer на локального игрока. Как получить локального игрока? Смотри гайд от Liberalist
entHandle это индекс цели на которую что-то будет применено(ну например если мы дадим приказ Атаковать. Кого? Мы не вставим туда сущность врага, а только её индекс. Это может также быть предмет(Подобрать. Что? Индекс предмета)
movePosition это вектор координат(х,у,z) Обычно туда вставляемпустой вектор Vector empty = {0,0,0} если нам ненужно коорды. Ну тип посмотрите,
Атаковать героя вражеского. Для этого нам не ненадо координаты, а просто цель(Индекс сущности врага).
Бликнуться к врагу. Вот тут нам уже надо координаты. Vector MovePosition = Enemy->GetAbsOrigin(); и это будет чтото в этом роде
C++:
PrepareUnitOrders(localhero.pPlayer, DotaUnitOrder_t::DOTA_UNIT_ORDER_CAST_POSITION, 0, position, AbilityIndex, PlayerOrderIssuer_t::DOTA_ORDER_ISSUER_HERO_ONLY, this, order, OrderQueueBehavior_t::DOTA_ORDER_QUEUE_DEFAULT, 0);
/// У меня эта функа лежит в классе CBaseEntity, поэтому я юзаю this
Из этой функи можна прикольные шняги сделать, вот вам примеры:
C++:
void SpellPointTarget(int AbilityIndex, Vector position, bool order)
{
if (localhero.pPlayer == nullptr) { localhero.pPlayer = localhero.pEnt->GetPlayer(); }
PrepareUnitOrders(localhero.pPlayer, DotaUnitOrder_t::DOTA_UNIT_ORDER_CAST_POSITION, 0, position, AbilityIndex, PlayerOrderIssuer_t::DOTA_ORDER_ISSUER_HERO_ONLY, this, order, OrderQueueBehavior_t::DOTA_ORDER_QUEUE_DEFAULT, 0);
}
void PickupRune(CBaseEntity* ent)
{
Vector empty = { 0,0,0 };
PrepareUnitOrders(localhero.pPlayer, DotaUnitOrder_t::DOTA_UNIT_ORDER_PICKUP_RUNE, ent->GetUnitIndex(), empty, 0, PlayerOrderIssuer_t::DOTA_ORDER_ISSUER_HERO_ONLY, this, 0, OrderQueueBehavior_t::DOTA_ORDER_QUEUE_DEFAULT, 0);
}
void PickupItem(CBaseEntity* ent)
{
Vector empty = { 0,0,0 };
PrepareUnitOrders(localhero.pPlayer, DotaUnitOrder_t::DOTA_UNIT_ORDER_PICKUP_ITEM, ent->GetUnitIndex(), empty, 0, PlayerOrderIssuer_t::DOTA_ORDER_ISSUER_HERO_ONLY, this, 0, OrderQueueBehavior_t::DOTA_ORDER_QUEUE_DEFAULT, 0);
}
void SpellNoTarget(int AbilityIndex,bool order)
{
Vector empty = { 0,0,0 };
PrepareUnitOrders(localhero.pPlayer, DotaUnitOrder_t::DOTA_UNIT_ORDER_CAST_NO_TARGET, NULL, empty, AbilityIndex, PlayerOrderIssuer_t::DOTA_ORDER_ISSUER_HERO_ONLY, this, order, OrderQueueBehavior_t::DOTA_ORDER_QUEUE_DEFAULT, 0);
}
void SpellTarget(int AbilityIndex,CBaseEntity* target, bool order)
{
Vector empty = { 0,0,0 };
PrepareUnitOrders(localhero.pPlayer, DotaUnitOrder_t::DOTA_UNIT_ORDER_CAST_TARGET, target->GetUnitIndex(), empty, AbilityIndex, PlayerOrderIssuer_t::DOTA_ORDER_ISSUER_HERO_ONLY, this, order, OrderQueueBehavior_t::DOTA_ORDER_QUEUE_DEFAULT, 0);
}
void Think() //// типа чтоб юнит прекратил юзать чтолибо и просто стал на месте
{
Vector empty = { 0,0,0 };
PrepareUnitOrders(localhero.pPlayer, DotaUnitOrder_t::DOTA_UNIT_ORDER_STOP, NULL, empty, 0, PlayerOrderIssuer_t::DOTA_ORDER_ISSUER_HERO_ONLY, this, 0, OrderQueueBehavior_t::DOTA_ORDER_QUEUE_DEFAULT, 0);
}
Только у меня проблема с PickupItem. Когда её вызываю на предмет( предмет это когда entity.name == dota_item_drop ну и еще я пробовал item_aegis), то пишет что должен быть физический предмет. Если решу проблему, обновлю текст(может я не понял как юзать эту функу, что должен быть подобрано.
Надеюсь, пригодится. Может быть немного лишнего мусора написал, но уверен что большинство по теме. Я не про хацкер, а обычный нуб. Учусь на ошибках.