Добавлен , опубликован
Программы
Предназначение:
Прочее
Иногда картоделы нуждаются в возможности дать какому-либо юнита способность, но при этом не показывать команду на панели приказов.
К сожалению, игра не предоставляет такую возможность, так что приходится идти на хитрости.

Особые координаты

У каждой способности есть настраиваемые координаты для кнопки.
Обычно их значения находятся в диапазоне 0..3 для X и 0..2 для Y.
Если выйти за их пределы, то игра начнет лазить по памяти за пределами массива кнопок и обычно это приводит к крашу, а если не повезёт, то к трудноуловимым багам.
Но нашлись такие значения, который позволяют скрыть кнопку и при этом не приводят к крашу. Среди них есть и такие, которые обычно работают правильно, но иногда приводят к проблемам.
Тестировалось на версии игры 1.26a. На других версиях поведение может отличаться.

0, -11

При Y равным -11 игра отнимает от указателя на массив рядов (каждый ряд это объект-список, содержащий указатели на CSimpleFrame) число 0xA8. В моем случае, получился указатель на начало региона памяти, в котором содержался этот самый массив (сигнатура региона ".?AV?$TSGrowableArray@PAVCSimpleFrame@@@@:-2").
Там находятся служебные данные менеджера памяти.
Думая, что там указатель на массив указателей на кнопки, игра считывает первое число (но на самом деле это указатель на следующий регион памяти, в моём случае ".\CGameUI.cpp:370", содержащий память для экземпляров класса CPortraitButton)
Если координата X равна 0, то берется первый элемент этого "массива", которым опять оказывается указатель на следующий регион памяти (у меня попался ".\SprAnimList.cpp:88", содержащий память для экземпляров класса CAnimList).
Игра работает с заголовком этого региона как с кнопкой.
По смещению 0x94 в кнопке находится поле Visible, которое и проверяет игра.
Если кнопку видно, то она начинает искать следующую, но видя кривые координаты отказывается что либо показывать и завершает выполнение функции.
Если же кнопку не видно (значение поля равняется нулю), то игра поместит в неё требуемую команду, перезаписав для этого все необходимые поля, но беда в том, что не кнопка это, а случайная память, изменение которой приведет к непредсказуемым последствиям.
При чтении поля CCommandButton.Visible, на самом деле читалось поле CAnimList.HashNode1.Previous, которое указывало на другой узел связного списка по адресу 0x0B0001FC. Так как это значение отлично от нуля, то интерпретировалось игрой как TRUE.
На этот раз пронесло, но при каждом перезапуске игры есть шанс, что случится беда.
И вовсе необязательно произойдет немедленный краш, вполне возможно, что повреждение случайной памяти приведет к возникновению самых разных багов в карте.

-2147483648, -2147483648

Эти координаты приводят игру к первой кнопке (слева сверху, координаты 0, 0).
Если этот слот не занят, то кнопка помещается туда, а иначе идёт поиск другого свободного слота, но там как координаты кривые, то цикл сразу завершается и команда не показывается.
Смотрится безопаснее предыдущего варианта, но даже если на моей версии игры это работает, то кто знает, что может случиться в прошлых, будущих или даже в моей текущей, если будет установлен какой-нибудь мод, модифицирующий участок кода игры, отвечающий за показ кнопок — он может оказаться не готовым к таким значениям координат.

Страдания игроков

Так как уже могло успеть появиться много карт, использующих кривые координаты, то их игрокам придется столкнуться со сложностями.
Чтобы предотвратить возможные проблемы, я сделал мод, который добавляет фильтр на панель приказов, который игнорирует все команды, координаты которых выходят за допустимые пределы.
Для работы достаточно кинуть .mix файл из скачаного архива в папку с игрой.
В папке sources находятся исходники.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Этот комментарий удален
21
И вот, великий Айсфрог услышал наши молитвы! Только что мне делать этой ссылкой по скачиванию?
Предлагается добавить их к себе в варик через Mix?
Только другие то игроки не будут себе это добавлять и какой тогда в этом смысл?))
Ответы (3)
18
Только что мне делать этой ссылкой по скачиванию?
Под кнопкой "Скачать" есть кнопка "Инструкция по установке".
Только другие то игроки не будут себе это добавлять и какой тогда в этом смысл?
Так хотя бы не будут страдать те, кто установил мод.
А если собираться играть компанией, то можно договориться заранее всем поставить этот мод.
21
IceFog, Спасибо. Проверил на кривых координатах, действительно работает!))
38
IceFog, надо подумать как-то подсвечивать инструкцию, если она не от категории, а от автора
22
Шикарно! Спасибо большое)
28
0, -11 на самом деле приводит к крашам. Если запустить WispTD, потом любое сражение, будет краш)
21
В общем, единственное верное решение это вообще не трогать кнопки атаки, стоп и Холд.
Можно скрыть только Мув и патруль. При других ситуациях возникают краши.
Обидно, досадно, но ничего не поделаешь!
22
Я правильно понял, что этот mix решает проблемы с возможными крашами из-за скрытия кнопок таким методом, но при этом не портит задумку авторов карт? Т.е. скрытые авторами кнопки остаются скрытыми, а с их заменой ничего плохого не случается.
Ответы (5)
21
makkad, Для тех, кто тоже поставит себе mix! Думаешь, кто - то из игроков будет так заворачиваться?
22
SсRealm, Не массовое решение, но может помочь отдельным энтузиастам попробовать некоторые старые заброшенные из-за этой проблемы карты.
У меня вопрос был именно по функционалу приложенного mix.
21
makkad, Mix, если мне правильно объясняли, это система, которая работает быстрее варика. Она как стул, который по быстрому подменяют перед дедом Варкрафтом, а он на него садится и не видит подмены. Знаю, что таким образом можно подменить стандартные модельки, текстуры, музыку.
Варик будет воспринимать их как родные, но на самом деле они подмененные. Да, таким способом карты вообще перестают весить, но возникает необходимость скачаивать файлы с Миксом.
Кроме того для каждой новой такой карты нужен отдельный микс с файлами, что вообще никому не интересно!
22
SсRealm, не совсем так. Первым делом варик загружает dll библиотеки, а mix это файл звукового кодека и тоже грузится, и варик тоже запускает его, а поскольку он dll, как тут, или архив, он его кушает. Короче, это подпорка к древнему стулу)
18
makkad, этот мод модифицирует код игры таким образом, что при попытке добавить на панель приказов команду с координатами, выходящими за пределы сетки, такой запрос будет попросту отклонен и кнопка не появится в игровом интерфейсе.
Конечно, лучше если карта изначально будет сделана правильно, но если захочется поиграть в какую-нибудь карту с кривыми координатами кнопок, но при этом не хочется заморачиваться с ручной правкой архива, то это решение может помочь.
21
Проверил эту штуку на заранее искривленных координатах и вот результат. Указываем в CommandFunc кривые кооддинаты, например"-19, 0"
Дальше
Теперь пробуем запустить: вылетает с фатальной ошибкой :
Теперь устанавливаем микс в паку с игрой и пробуем запустить:
И запускаем варик:
Ошибка пропала, максимум, это просто исчезает кнопка
ИТОГ: Все прекрасно работает, спасибо IceFog !😀😀😀😀
4
Иногда картоделы нуждаются в возможности дать какому-либо юнита способность, но при этом не показывать команду на панели приказов.
К сожалению, игра не предоставляет такую возможность, так что приходится идти на хитрости
Говорят, можно скилл засунуть в спеллбук и заблокировать спеллбук. Может, конечно, вранье, но надо потестить.
Ответы (7)
21
Integral, ты можешь любую способку дать герою, указать у ней координаты 0,-11 прямо в игре, а потом запустить ее триггерно. В принципе работает)
4
SсRealm, очень сомнительная фишка. Не проще ли даммику дать этот скилл и через него кастовать? Если делать через героя, то герой будет останавливаться на время каста, опять же надо следить за id приказов чтобы они не конфликтовали и тому прочее. Плюс не уверен что 26 варик не будет крашить с таким положением скиллов
21
Integral, Например, ты можешь дать так герою москитов. И тогда у героя будет сразу два типа москитов, например огненные и водяные одновременно!
4
SсRealm, ага, и при приказе кастовать москиты он будет кастить рандомный скилл а не тот что ты захотел, потому что приказ одинаковый
21
Integral, У меня получилось. Кастуешь основную москитную и потом триггерную)))
Загруженные файлы
32
Integral, нет это работает, действительно пассивка помещенная в спеллбук работает, а спеллбук можно скрыть запретив для изучения игроком, есть такая функция SetPlayerAbilityAvalible - но работает на всех юнитов игрока, а не одного, плодить спеллбуки не удобно. Тут как раз помогает мемхак, записывает в адресс абилки инфу - скрыть иконку.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.