Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пишем свои DLL
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
SAG19330184
создал dll позволяющую расширить список стартовых героев за счет добавления героев из кампаний. Пока добавляются Мюллих и Катерина и банятся Сильвия и Саня. Потом доделаю, чтобы список динамически расширялся, без бана.
Большое спасибо Сергею Роженко, ASM, Дьякон, Берсеркер за большую помощь в создании этой dll.
Скачать можно здесь: http://www.heroes-iii.com/files/sag_dll_v1.zip
Про создание своих DLL можно почитать в туториале Дьякона http://wforum.heroes35.net/showthread.php?tid=862&page=1
Haart of the Abyss
Цитата
создал dll позволяющую расширить список стартовых героев за счет добавления героев из кампаний. Пока добавляются Мюллих и Катерина и банятся Сильвия и Саня.
*пытается понять, какой смысл в использовании DLL, когда то же самое можно сделать в редакторе секунд за пять*
tolich
Конечно, это можно сделать и для случайной карты тоже, но нужно ее загружать в редактор, ставить опции, сохранять. А тут одна dll-ка все делает автоматически.
Haart of the Abyss
Цитата
Конечно, это можно сделать и для случайной карты тоже, но нужно ее загружать в редактор, ставить опции, сохранять. А тут одна dll-ка все делает автоматически.
Угу. Только сначала нужно узнать откуда-то про длл, выйти из игры, скачать, подключить, снова войти в игру… Тоже дело небыстрое, между прочим (да и не со всякой версией выйдет). "Ты только воду вскипяти, кофе засыпь, сахару добавь, ложкой размешай, в чашку налей, а выпью я, так и быть, сам".
fireman
Лорд Хаарт, потому что править каждую карту долго, а длл правит всё. Хаарт ты не понимаешь, но не значит, что не нужная вещь.
feanor
А экзешник в архиве с 10 кб длл зачем?
И сорцы выложить можешь или нет?
Haart of the Abyss
Цитата
Лорд Хаарт, потому что править каждую карту долго
Двойной щелчок → контрол+энтер → герои → четыре щелчка → ок → дискета → крестик. У меня занимает три секунды с копейками.
fireman
Лорд Хаарт, если нравиться правь каждую карту. Мне больше нравиться, когда дллка лежит и я не думаю не о чём. Вот если бы можно было выбирать не выходя из игры, но это в некоторых картах чит.
SAG19330184
1) это всего лишь пример того что можно реализовать с помощью DLL.
2) обращаю внимание на фишку: МОЖНО РАБОТАТЬ С DLL ДО СТАРТА КАРТЫ И ДО СТАРТА ERM!!! То есть, можно организовать клиент-серверную связь или, например, подгрузить нужные текстовые файлы настроек с вебсайта.
3)
Цитата(Лорд Хаарт @ 20 Feb 2010, 22:43)
щелчок → контрол+энтер → герои → четыре щелчка → ок → дискета → крестик. У меня занимает три секунды с копейками.

сингл-карты меня не интересуют, а в онлайне вскрытие случайной карты дисбалансно и потому запрещено.
4) исходники DLL выложу чуть позже
5) экзе включил потому как он патченный патчем Дьякона для того, чтобы DLL загружалась при старте приложения. С обычным экзе длл работать не будет. Экзе и патч протестирован на TE версии, по поводу остальных - as is, без гарантий.
Shihad
SAG, сделай, пожайста, из этой длл-ки туториал. Пошагово опиши, как делал. Пригодится.
Berserker
Я бы ещё более тчоно определил структуру массива. Что там, массив integer-ов? Сколько их?
feanor
Sample.rar, 5 kb
Cтавится хук на подсказки в окне юнита.
Язык - С, использован Codeblocks+GCC.
Тестировано на Эре 1.6.
Работоспособность - ээ..не очень глючно smile.gif
feanor
Цитата
SAG, сделай, пожайста, из этой длл-ки туториал. Пошагово опиши, как делал. Пригодится.

я могу попробовать. А что именно описать?
Etoprostoya
Всё, шаг за шагом.

(хотя похожий туториал уже делался, ссылка была на форуме КорВога)
SAG19330184
Код
LIBRARY Test;
{!INFO
MODULENAME = 'Test'
VERSION = '0.1'
AUTHOR = 'sag'
}

USES Win, Utils, SysUtils, VPUtils;

//PROCEDURE HookCode(P: POINTER; NewAddr: POINTER; UseCall: BOOLEAN); external 'angel' name 'HookCode';

CONST
    (* HookCode constants *)
    C_HOOKTYPE_JUMP = FALSE;
    C_HOOKTYPE_CALL = TRUE;
    C_OPCODE_JUMP = $E9;
    C_OPCODE_CALL = $E8;
    C_UNIHOOK_SIZE = 5;

TYPE
(* Çàïèñü, íåîáõîäèìàÿ äëÿ ðàáîòû ñ ôóíêöèÿìè ïàò÷èíãà *)
    THookRec = RECORD
 Opcode: BYTE;
 Ofs: INTEGER;
    END; // .record THookRec

VAR
    Temp: INTEGER; // Óíèâåðñàëüíàÿ âðåìåííàÿ ïåðåìåííàÿ

PROCEDURE WriteAtCode(P: POINTER; Buf: POINTER; Count: INTEGER);
BEGIN
    Win.VirtualProtect(P, Count, PAGE_READWRITE, @Temp);
    Win.CopyMemory(P, Buf, Count);
    Win.VirtualProtect(P, Count, Temp, NIL);
END; // .procedure WriteAtCode

PROCEDURE HookCode(P: POINTER; NewAddr: POINTER; UseCall: BOOLEAN);
VAR
    HookRec: THookRec;
BEGIN
    IF UseCall THEN BEGIN
 HookRec.Opcode:=C_OPCODE_CALL;
    END // .if
    ELSE BEGIN
 HookRec.Opcode:=C_OPCODE_JUMP;
    END; // .else
    HookRec.Ofs:=INTEGER(NewAddr)-INTEGER(P)-C_UNIHOOK_SIZE;
    WriteAtCode(P, @HookRec, 5);
END; // .procedure HookCode


PROCEDURE Hook_SAG_2;

BEGIN
    PByte(PINTEGER($699538)^+$4DF18)^:= 0;
    PByte(PINTEGER($699538)^+$4DF19)^:= 0;

END;

PROCEDURE Hook_SAG_1; ASSEMBLER; {$FRAME-}
ASM
    PUSHAD
    PUSHFD
    CALL Hook_SAG_2
    POPFD
    POPAD
    // old code from exe
 MOV EDX, $2917560
    //
    PUSH $7792BF


END;


BEGIN
    HookCode(POINTER($7792B9), @Hook_SAG_1, C_HOOKTYPE_JUMP);
END.

1) первым делом определяем место кода экзе куда мы вклиниваемся. Место можно определить шаманскими ритуалами с использованием программы IDA Pro + X-rays. Это самое сложное....В примере мы вклиниваемся по адресу $7792B9 который кстати не совсем верный (нам нужна процедура листания героев, а этот адрес срабатывает на любой лево-мышиный клик на экране старта карты).
HookCode(POINTER($7792B9), @Hook_SAG_1, C_HOOKTYPE_JUMP);
2) далее HookCode(POINTER($7792B9), @Hook_SAG_1, C_HOOKTYPE_JUMP); отправляет нас в процедуру PROCEDURE Hook_SAG_1;
В ней мы вызываем процедуру PROCEDURE Hook_SAG_2;
путем CALL Hook_SAG_2 и не забываем выполнить исходный код который мы затерли своим хуком. а именно : выполняем
MOV EDX, $2917560
и переход на следующую команду PUSH $7792BF
3) процедура PROCEDURE Hook_SAG_2; простая до ужаса:
PByte(PINTEGER($699538)^+$4DF18)^:= 0;
PByte(PINTEGER($699538)^+$4DF19)^:= 0;
в ней просто обнуляем 2 элемента массива доступности героев (Оррин $4DF18, Валеска $4DF19). массив байтовый, начинается с адреса PINTEGER($699538)^+$4DF18. мы выковыриваем адрес смещения из $699538 и суммируем со вторым смещением $4DF18. по умолчанию в массиве все элементы = FF, если обнулить один элемент, то добавляется один герой из кампаний
4) далее распаковываем http://wog.nxt.ru/diakon/patchexe.rar и ищем патчер Дьякона, запускаем его с аргументом в командной строке (бросаем нужный геройский экзе в папку с патчер-экзе и указывает его как аргумент патчер-экзе). На выходе - пропатченный геройский экзе который будет искать в корневой папке героев dll с названием Test.dll
5) компилируем dll в Virtual Pascal (результат - Test.dll )
6) бросаем Test.dll и патченный-геройский-экзе в корневую папку героев.
7) наслаждаемся результатом! biggrin.gif
MasterOfPuppets
Arsenal.7z (5 Кб)
Позволяет покупать в Кузнице все БМ + устраняет обновление экрана мира, если игрок находится в экране города.
FCst1
Я так понимаю, для Эры? smile.gif
MasterOfPuppets
Да. Кидаем в EraPlugins - и всё.
FCst1
Master Of Puppets, если версия 1.8, то в Era/Plugins wink.gif
MasterOfPuppets
...скомпилированная с {$DEFINE ERA2}. Я не стал менять расположение ресурсов.
Енто... работает?
FCst1
Протестил.
В ЭРЕ 1.6. - да.
В ЭРЕ 1.8 - нет.
Нужно просить Берса, чтобы плагины загружались "по старинке", из EraPlugins каталога.
MasterOfPuppets
Можно и самому это сделать.
Переносим содержимое папки Era Source на диск C. Запускаем BIN.W32\VP.EXE. Открываем в нём файл Angel.PAS. Жмём Compile -> Build. Новую Angel.dll с прежним отношением к ресурсам найдёшь в OUT.W32.
SAG19330184
сделал запуск диалогов IF на этапе выбора героя при старте карты
Berserker
Я уже обновил эру на вогархиве. Папка старая: EraPlugins. Не стоит рушить обратную совместимость.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.