19

» WarCraft 3 / Помогите запустить карту

Gerbant, если у зашедшего в лобби с большой картой игрока висит застывший счетчик прогресса скачивания и не дает хосту стартануть игру, то может помочь этот мод.
19

» WarCraft 3 / Секретные поля камеры

ValdionWorld, потому, что это касается только классики. Поля не объявлены в common.j, но их можно добавить самому и затем использовать.
19

» WarCraft 3 / Как получить нормальный доступ к содержимому War3Patch.mpq?

Принятый ответ
Скачай Ladik MPQ Editor. Там же в конце есть ссылка на скачивание архива со списками файлов. Когда будешь открывать War3Patch.mpq укажи дополнительный список файлов "WarCraft III.txt" и тогда имена всех файлов определятся.
Но, чем редактировать стандартные архивы, куда удобнее использовать mix-архивы.
19

» WarCraft 3 / Секретные поля камеры

Makeba, мне казалось очевидным, что ресурс касается лишь класической версии игры, но раз не все так считают, я решил добавить этот факт в описание.
19

» WarCraft 3 / Секретные поля камеры

nazarpunk, то что её добавили в рефе не указывает на её наличие в 1.26a версии.
Также, похоже, что там удалили настройку слушателя и добавили еще каких-то полей.
constant camerafield CAMERA_FIELD_NEARZ       = ConvertCameraField(7)
constant camerafield CAMERA_FIELD_LOCAL_PITCH = ConvertCameraField(8)
constant camerafield CAMERA_FIELD_LOCAL_YAW   = ConvertCameraField(9)
constant camerafield CAMERA_FIELD_LOCAL_ROLL  = ConvertCameraField(10)
19

» WarCraft 3 / Просмотр состояния виртуальной машины JASS

Последние новости!
Обновил deprotect.mix, чтобы тот перестал показывать раздражающее окно "Disk full" при запуске игры.
19

» WarCraft 3 / Просмотр состояния виртуальной машины JASS

Вышла новая версия!
Прокрутить к ресурсу
  • Добавил возможность выбрать процесс игры из которого будут извлечены данные.
  • Теперь появилась возможность создавать/загружать файлы с состоянием виртуальной машины.
  • Опубликовал исходники.
19

» WarCraft 3 / Супер хоткей

SLina, если не можешь адаптировать код под компилятор microsoft'а, то попробуй воспользоваться GCC. Если сидишь на windows'е, то установи MSYS или WSL. Там можно будет установить компилятор и запускать bash скрипты.
Вот скрипт, который может скомпилировать пакет wc3 (хотя лучше, конечно, воспользоваться какой-нибудь системой сборки):
раскрыть
mkdir -p build || exit 1
files=$(find src -iname *.cpp)

echo "$files" | while read file_path
do
	relative_path=$(realpath -s --relative-to=src "$file_path")
	i686-w64-mingw32-g++ "$file_path" -Iinclude -c -O2 -o "build/$relative_path.o" || exit 1
done

i686-w64-mingw32-ar csr build/wc3.lib build/*.o || exit 1
Приложил архив со скомпилированой статической библиотекой, но в следующий раз тебе стоит сделать это самостоятельно.
Загруженные файлы
19

» WarCraft 3 / Супер хоткей

SLina, нужно смотреть на место первой ошибки: "На строке 33 отсутствует «;»".
раскрыть
class __attribute__((packed)) CPlayer: TSHashObject<CPlayer, HASHKEY_NONE> {
public:
	BYTE start_loc;
	PLAYERDATA data;
	DWORD field32;
	BYTE Index;
	BYTE field37;
	DWORD pauses_counter_;
	DWORD saves_performed_;
	DWORD finished_saving__;
	DWORD finished_saving_result__;
};
Здесь я использую "__attribute__((packed))", чтобы выключить выравнивание данных.
Вероятно, это какое-то нестандартное расширение компилятора, которое понимает мой GCC, но не принимает твой MSVC. В таком случае, замени эту опцию на аналог из своей системы.
19

» WarCraft 3 / [MemHack] Загрузка .mix файла с модельками прямо в игре

Принятый ответ
Я сделал mix-архив, который меняет модельку футмана на артаса, и загрузил в процесс игры (после загрузки карты) при помощи инжектора, после чего нанял футмана и у того, ожидаемо, оказалась моделька артаса с мечом. Так что, не вижу проблем с этим.
Главное, загрузить архив с моделью до первого появления модели на карте, а иначе игра закеширует её и новые файлы останутся неиспользоваными.
Впрочем, если хакать игру, то должно быть возможно сбросить файловый кеш и тогда можно будет менять модельку когда угодно. Или, как вариант, можно поменять модельку для всех юнитов определенного типа на другую, если в мемхаке есть такая функция.
19

» WarCraft 3 / Открытая виртуальная машина

На чем основано решение выбрать мертвый язык для реализации?
Я начинал с JASS'а, после чего перешел на Delphi. Там мне что-то не понравилось и я пересел на Lazarus/FreePascal. Потом я знакомился с Java, Python, Lua, но ни один из них не годился для хаков.
Еще есть Rust, но писать хаки на этом языке, сосредоточеном на безопасности, будет тем еще развлечением.
Лишь недавно я начал изучать C++, благодаря которому появился выбор и на котором теперь я буду предпочитать делать все новые моды.
Вот только этот проект уже написан на FreePascal и переписывать его на другой язык пока лень, хотя я уже успел настрадаться от него. Мог бы даже написать небольшую статью о том, почему не стоит на нём работать и о всех тех минах, что там расставлены.
19

» WarCraft 3 / Открытая виртуальная машина

ScorpioT1000, игра не использует STL, вместо этого у неё свои велосипеды. Массив в JASS использует шаблонный класс TSGrowableArray, который при росте выделяет про запас до 63-х элементов, как я уже писал ранее.
Далеко не факт, что понадобится весь размер массива
Делалось в первую очередь для локалок. А для глобалок, наверное, можно вернуть как было.
19

» WarCraft 3 / Открытая виртуальная машина

Вышла новая версия!
Прокрутить к ресурсу
  • Исправил у себя утечки памяти, при удалении переменных с типом массив.
  • Теперь, во избежание десинхронизации, по умолчанию используется эмуляция вещественных чисел.
  • Добавил поддержку нативки TriggerRegisterVariableEvent.
19

» WarCraft 3 / Можно ли узнать свой ключ RoC/TFT

RatzCard, я сделал небольшой мод (исходники прилагаются), который создает в папке с игрой файл "cd_key_dumper.log" с информацией о лицензии. Первый ключ для ROC'а, а второй для дополнения TFT. Перемести ".mix" файл в папку с игрой версии 1.26a и запусти её, после чего проверяй результат.
Загруженные файлы
19

» WarCraft 3 / Можно ли узнать свой ключ RoC/TFT

RatzCard, в игре версии 1.26a по адресу Game.dll+0x555630 находится функция для расшифровки:
size_t __fastcall DecodeCredentials(void *data, size_t size, const char *password)
Я незнаю что за алгоритм там внутри используется, но я видел внутри константы SHA-1. Вот только это ведь алгоритм хэширования, а не шифрования?
Наверное, чем писать программу для расшифровки, будет проще сделать мод, который подождет, пока игра сама не прочитает ключи, после чего запишет подсмотреные значения на диск.
19

» WarCraft 3 / Можно ли узнать свой ключ RoC/TFT

Информация о лицензии содержится в следующих файлах:
Содержание Путь в архиве Размер данных (байт)
Ключ ROC font/font.gid 32
Ключ TFT font/font.exp 32
Имя владельца font/font.clh 64
Не используется? font/font.ccd 8
Но она зашифрована, так что врядли тебе поможет это знание.
Формат файла:
  • Произвольное количество зашифрованых блоков размером 64 байта.
  • 4 байта с подписью?
  • 1 байт обязательно должный быть нулем.
  • 2 байта равные нулю не используются.
Все файлы содержат лишь по одному блоку каждый, так что и занимают по 72 байта.
19

» WarCraft 3 / как заранее автоматически узнать кодировку каждого символа в строке?

Помнится, мне тоже понадобилось пройтись по символам в строке для того, чтобы проверить её на присутствие запрещенных символов или превышение длины, при этом допуская использование русских букв. В итоге я нашел эту библиотеку.
19

» WarCraft 3 / Карта не может запуститься в локальной игре

Принятый ответ
При размере карты начиная примерно с 41 МиБ игру начинает глючить. На хостботах такого не наблюдается, так как там, видимо, нормально написан код для расчета процентов прогресса скачивания карты.
Есть мод решающий эту проблему.
19

» WarCraft 3 / ЦВЕТ - как из игры получить точные значения playercolor в RGB кодировке ?

Принятый ответ
У есть игры текстуры цветов, находящиеся по путям, указаным в ключах "TeamColor" и "TeamGlow" файла "war3skins.txt".
[Default]
TeamColors=16
TeamColor=ReplaceableTextures\TeamColor\TeamColor
TeamGlow=ReplaceableTextures\TeamGlow\TeamGlow
Цвета имен игроков получаются путем извлечения первого пикселя текстуры командного цвета.
Чтобы получить путь к текстуре, нужно приклеить к пути из "TeamColor" номер игрока с нулем в начале и расширение ".tga" или ".blp", если первый вариант не нашелся.
Пример:
Игрок Путь к текстуре
Красный ReplaceableTextures\TeamColor\TeamColor00.blp
Синий ReplaceableTextures\TeamColor\TeamColor01.blp
Цвета игроков от нулевого до шестнадцатого
FFFF0303
FF0042FF
FF1CE6B9
FF540081
FFFFFC01
FFFE8A0E
FF20C000
FFE55BB0
FF959697
FF7EBFF1
FF106246
FF4E2A04
FF282828
FF282828
FF282828
FF282828
19

» WarCraft 3 / Неограниченый размер карт без багов

Вышла новая версия!
Прокрутить к ресурсу
  • Исправил ошибку с зависающим счетчиком процента скачивания карты в лобби, возникающую из-за арифметического переполнения.
19

» WarCraft 3 / Наработка: Онлайн фича с животными

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

» WarCraft 3 / зачем в Substring start -1 (minus) ?

Принятый ответ
Менеджер памяти варкрафта размещает перед каждой выделеной единицей памяти служебные данные. Непосредственно перед строкой находятся 16 байт, содержащие старшие два байта адреса текущего региона памяти, за которыми следует константа 0x6F6D ("mo"), которая, вероятно, является маркером, нужным для проверок блока на правильность во время освобождения.
Нативка SubString позволяет читать память перед строкой с минимальным рабочим индексом равным -32768. Если дотянуться до незанятой памяти, то должно быть возможно и крашнуть игру.
Проверка, что символ перед строкой не равен букве "o" всегда будет возвращать false, если только кто-нибудь не сделает мод, который заменит стандартный менеджер памяти на альтернативный, что может привести к изменению содержимого служебной памяти перед строкой.
Загруженные файлы
19

» WarCraft 3 / Ошибка

В игре версии 1.26a, по адресу game.dll+0x4CC4C0 находится функция, которая, как мне кажется, вычисляет ширину текста.
В данном случае краш произошел из-за того, что указатель на объект со шрифтом оказался равен nullptr'у.