Патч естественно 1.26, частично пользуюсь мемхаком. И добрался до такого вопроса.
А возможно ли с помощью мемхака каким то образом сделать так, чтобы игрок не мог контролировать своей боевой единицей, но при этом полностью была бы видна панель управления приказами и способностями, а так же, чтобы не пропадала возможность отдавать приказы триггерно?

Принятый ответ

Тут нужно работать с динамическими триггерами и следить за юнитом очень тщательно.
Почти все дизейблы в игре построены на приказе стана и особом флаге - неприрываемый, собственно так и работает функция стана внутри движка игры, устанавливает счетчик станов ( текущее кол-во +1) больше, и принудительно записывает в начало очереди приказов - приказ стоять и смотреть на источник стана ( прикол да? Приказ стана это приказ типа цель-обьект), Но если мемхаком повысить счетчик станов на 1 и не отдавать никаких других приказов то юнит будет выполнять первый отданный приказ во что бы то нистало. При этом сломаются все стандартные дизейблы.
Что нам нужно - отслеживать смерть юнита, причем событием EVENT_WIDGET_DEATH (TriggerRegisterDeathEvent). Отлавливать приказы которые получает юнит, если это стан - то снимать счетчик на 0, а потом после окончания стана (событие на 0.00 едениц урона) повышать счетчик. Приказы триггерно отдавать точно так же, снял счетчик до нуля, приказ чето делать, поставил на то кол-во столько было.
Важно - это поле юзают многие дебаффы и абилки, к примеру морфы, поэтому не тупо ставим 0 или 1, а читаем сколько было, записываем 0, отдаем приказ, потом ставим сколько было, обязательно проверяя чтобы счетчик был выше 0 или равен нулю.
Счетчик станов (Он же флаг неприрываемости) находится по оффсету 0x198/
ReadRealMemory( pHandle + 0x198 ) 
Где p Handle это адресс юнита.
Важное НО, получение адресса юнита сравнительно тяжелая операция (ConvertHandle), поэтому имеет смысл записать адресс куда-нибудь, чтобы потом работать с ним, адресса у юнитов остаются не изменными всю игру, как и у абилок (даже если их удалять и добавлять).
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
4 года назад
0
Похожие вопросы:

ответ
Конечно можно, просто передать этих юнитов другим игрокам.

0
32
4 года назад
0
Ну конечно можно, но сложно. Если ваш уровень жасс кодинга выше среднего то могу рассказать как это сделать.
0
11
4 года назад
0
quq_CCCP:
Ну конечно можно, но сложно. Если ваш уровень жасс кодинга выше среднего то могу рассказать как это сделать.
Буду благодарен, если попробуешь хотя бы :) С мемхаком опыта пока что нету, да и не очень активно его использую, по-тихоньку изучаю. Но вот появилась необходимость в подобном функционале
0
32
4 года назад
0
Тут нужно работать с динамическими триггерами и следить за юнитом очень тщательно.
Почти все дизейблы в игре построены на приказе стана и особом флаге - неприрываемый, собственно так и работает функция стана внутри движка игры, устанавливает счетчик станов ( текущее кол-во +1) больше, и принудительно записывает в начало очереди приказов - приказ стоять и смотреть на источник стана ( прикол да? Приказ стана это приказ типа цель-обьект), Но если мемхаком повысить счетчик станов на 1 и не отдавать никаких других приказов то юнит будет выполнять первый отданный приказ во что бы то нистало. При этом сломаются все стандартные дизейблы.
Что нам нужно - отслеживать смерть юнита, причем событием EVENT_WIDGET_DEATH (TriggerRegisterDeathEvent). Отлавливать приказы которые получает юнит, если это стан - то снимать счетчик на 0, а потом после окончания стана (событие на 0.00 едениц урона) повышать счетчик. Приказы триггерно отдавать точно так же, снял счетчик до нуля, приказ чето делать, поставил на то кол-во столько было.
Важно - это поле юзают многие дебаффы и абилки, к примеру морфы, поэтому не тупо ставим 0 или 1, а читаем сколько было, записываем 0, отдаем приказ, потом ставим сколько было, обязательно проверяя чтобы счетчик был выше 0 или равен нулю.
Счетчик станов (Он же флаг неприрываемости) находится по оффсету 0x198/
ReadRealMemory( pHandle + 0x198 ) 
Где p Handle это адресс юнита.
Важное НО, получение адресса юнита сравнительно тяжелая операция (ConvertHandle), поэтому имеет смысл записать адресс куда-нибудь, чтобы потом работать с ним, адресса у юнитов остаются не изменными всю игру, как и у абилок (даже если их удалять и добавлять).
Принятый ответ
0
11
4 года назад
0
quq_CCCP:
Тут нужно работать с динамическими триггерами и следить за юнитом очень тщательно.
Почти все дизейблы в игре построены на приказе стана и особом флаге - неприрываемый, собственно так и работает функция стана внутри движка игры, устанавливает счетчик станов ( текущее кол-во +1) больше, и принудительно записывает в начало очереди приказов - приказ стоять и смотреть на источник стана ( прикол да? Приказ стана это приказ типа цель-обьект), Но если мемхаком повысить счетчик станов на 1 и не отдавать никаких других приказов то юнит будет выполнять первый отданный приказ во что бы то нистало. При этом сломаются все стандартные дизейблы.
Что нам нужно - отслеживать смерть юнита, причем событием EVENT_WIDGET_DEATH (TriggerRegisterDeathEvent). Отлавливать приказы которые получает юнит, если это стан - то снимать счетчик на 0, а потом после окончания стана (событие на 0.00 едениц урона) повышать счетчик. Приказы триггерно отдавать точно так же, снял счетчик до нуля, приказ чето делать, поставил на то кол-во столько было.
Важно - это поле юзают многие дебаффы и абилки, к примеру морфы, поэтому не тупо ставим 0 или 1, а читаем сколько было, записываем 0, отдаем приказ, потом ставим сколько было, обязательно проверяя чтобы счетчик был выше 0 или равен нулю.
Счетчик станов (Он же флаг неприрываемости) находится по оффсету 0x198/
ReadRealMemory( pHandle + 0x198 ) 
Где p Handle это адресс юнита.
Важное НО, получение адресса юнита сравнительно тяжелая операция (ConvertHandle), поэтому имеет смысл записать адресс куда-нибудь, чтобы потом работать с ним, адресса у юнитов остаются не изменными всю игру, как и у абилок (даже если их удалять и добавлять).
То есть прямой функции нету, я так понял. Ну ок.
В целом мне бы хватило вообще показа скилл-панели союзных войск. Но тут приходится подключать DotaHelper, в котором я пока не разобрался как отключать конкретный функционал, а точнее alt+click... Вроде все остальное, что в нем есть отключать получается, а вот именно эту опцию с кликами отключить не получается.
Но все равно, спасибо за помощь, будем пробовать
0
32
4 года назад
0
respect_gg, А отдельной функции и неможет быть, это считай дебафф описаный кодом, как это делают абилки. Работа сложная и требует предусмотреть все и вся.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.