IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Reply to this topicStart new topic
> Пишем свои DLL, новые инструменты мододелов, скриптеров
SAG19330184
сообщение 20 Feb 2010, 22:01
Сообщение #1

Организатор лиги WCL
Сообщений: 984
Спасибо сказали: 642 раза




создал dll позволяющую расширить список стартовых героев за счет добавления героев из кампаний. Пока добавляются Мюллих и Катерина и банятся Сильвия и Саня. Потом доделаю, чтобы список динамически расширялся, без бана.
Большое спасибо Сергею Роженко, ASM, Дьякон, Берсеркер за большую помощь в создании этой dll.
Скачать можно здесь: http://www.heroes-iii.com/files/sag_dll_v1.zip
Про создание своих DLL можно почитать в туториале Дьякона http://wforum.heroes35.net/showthread.php?tid=862&page=1


--------------------
Постоянно играю на рейтинг www.heroes-III.com в онлайне через сервер GameRanger - в HoMM3 SOD или WT. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил
Go to the top of the pageAdd Nick
 
+Quote Post
Haart of the Aby...
сообщение 20 Feb 2010, 22:18
Сообщение #2

Рыцарь в лесу.
Сообщений: 4 469
Спасибо сказали: 6237 раз




Цитата
создал dll позволяющую расширить список стартовых героев за счет добавления героев из кампаний. Пока добавляются Мюллих и Катерина и банятся Сильвия и Саня.
*пытается понять, какой смысл в использовании DLL, когда то же самое можно сделать в редакторе секунд за пять*


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 20 Feb 2010, 22:21
Сообщение #3

😸🧡✊✌️
Сообщений: 16 514
Спасибо сказали: 3458 раз




Конечно, это можно сделать и для случайной карты тоже, но нужно ее загружать в редактор, ставить опции, сохранять. А тут одна dll-ка все делает автоматически.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post
Haart of the Aby...
сообщение 20 Feb 2010, 22:30 (Сообщение отредактировал Лорд Хаарт - 20 Feb 2010, 22:31)
Сообщение #4

Рыцарь в лесу.
Сообщений: 4 469
Спасибо сказали: 6237 раз




Цитата
Конечно, это можно сделать и для случайной карты тоже, но нужно ее загружать в редактор, ставить опции, сохранять. А тут одна dll-ка все делает автоматически.
Угу. Только сначала нужно узнать откуда-то про длл, выйти из игры, скачать, подключить, снова войти в игру… Тоже дело небыстрое, между прочим (да и не со всякой версией выйдет). "Ты только воду вскипяти, кофе засыпь, сахару добавь, ложкой размешай, в чашку налей, а выпью я, так и быть, сам".


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
fireman
сообщение 20 Feb 2010, 22:36
Сообщение #5

Immortal
Сообщений: 2 768
Спасибо сказали: 959 раз




Лорд Хаарт, потому что править каждую карту долго, а длл правит всё. Хаарт ты не понимаешь, но не значит, что не нужная вещь.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 20 Feb 2010, 22:39 (Сообщение отредактировал feanor - 20 Feb 2010, 22:44)
Сообщение #6

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20605 раз




А экзешник в архиве с 10 кб длл зачем?
И сорцы выложить можешь или нет?
Go to the top of the pageAdd Nick
 
+Quote Post
Haart of the Aby...
сообщение 20 Feb 2010, 22:43
Сообщение #7

Рыцарь в лесу.
Сообщений: 4 469
Спасибо сказали: 6237 раз




Цитата
Лорд Хаарт, потому что править каждую карту долго
Двойной щелчок → контрол+энтер → герои → четыре щелчка → ок → дискета → крестик. У меня занимает три секунды с копейками.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
fireman
сообщение 21 Feb 2010, 08:51
Сообщение #8

Immortal
Сообщений: 2 768
Спасибо сказали: 959 раз




Лорд Хаарт, если нравиться правь каждую карту. Мне больше нравиться, когда дллка лежит и я не думаю не о чём. Вот если бы можно было выбирать не выходя из игры, но это в некоторых картах чит.
Go to the top of the pageAdd Nick
 
+Quote Post
SAG19330184
сообщение 23 Feb 2010, 14:57
Сообщение #9

Организатор лиги WCL
Сообщений: 984
Спасибо сказали: 642 раза




1) это всего лишь пример того что можно реализовать с помощью DLL.
2) обращаю внимание на фишку: МОЖНО РАБОТАТЬ С DLL ДО СТАРТА КАРТЫ И ДО СТАРТА ERM!!! То есть, можно организовать клиент-серверную связь или, например, подгрузить нужные текстовые файлы настроек с вебсайта.
3)
Цитата(Лорд Хаарт @ 20 Feb 2010, 22:43)
щелчок → контрол+энтер → герои → четыре щелчка → ок → дискета → крестик. У меня занимает три секунды с копейками.

сингл-карты меня не интересуют, а в онлайне вскрытие случайной карты дисбалансно и потому запрещено.
4) исходники DLL выложу чуть позже
5) экзе включил потому как он патченный патчем Дьякона для того, чтобы DLL загружалась при старте приложения. С обычным экзе длл работать не будет. Экзе и патч протестирован на TE версии, по поводу остальных - as is, без гарантий.


--------------------
Постоянно играю на рейтинг www.heroes-III.com в онлайне через сервер GameRanger - в HoMM3 SOD или WT. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Shihad
сообщение 26 Feb 2010, 18:06
Сообщение #10

Weird
Сообщений: 1 976
Спасибо сказали: 644 раза




SAG, сделай, пожайста, из этой длл-ки туториал. Пошагово опиши, как делал. Пригодится.


--------------------
Работать надо - винтовка рядом.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 26 Feb 2010, 18:35
Сообщение #11

Immortal
Сообщений: 1 468
Спасибо сказали: 1153 раза




Я бы ещё более тчоно определил структуру массива. Что там, массив integer-ов? Сколько их?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 27 Feb 2010, 13:46
Сообщение #12

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20605 раз




Sample.rar, 5 kb
Cтавится хук на подсказки в окне юнита.
Язык - С, использован Codeblocks+GCC.
Тестировано на Эре 1.6.
Работоспособность - ээ..не очень глючно smile.gif
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 27 Feb 2010, 15:35
Сообщение #13

laughed as one fey
Сообщений: 12 167
Спасибо сказали: 20605 раз




Цитата
SAG, сделай, пожайста, из этой длл-ки туториал. Пошагово опиши, как делал. Пригодится.

я могу попробовать. А что именно описать?
Go to the top of the pageAdd Nick
 
+Quote Post
Etoprostoya
сообщение 27 Feb 2010, 15:42
Сообщение #14

Etoslozhnostatus
Сообщений: 8 715
Спасибо сказали: 16314 раза




Всё, шаг за шагом.

(хотя похожий туториал уже делался, ссылка была на форуме КорВога)


--------------------
- Да ну!?
- Horn of the Argali гну!
Go to the top of the pageAdd Nick
 
+Quote Post
SAG19330184
сообщение 01 Mar 2010, 10:34
Сообщение #15

Организатор лиги WCL
Сообщений: 984
Спасибо сказали: 642 раза




Код
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


--------------------
Постоянно играю на рейтинг www.heroes-III.com в онлайне через сервер GameRanger - в HoMM3 SOD или WT. Присоединяйтесь! Чужие подписи и аватары не читаю - отключил
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 19 Aug 2010, 18:17
Сообщение #16

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2377 раз




Arsenal.7z (5 Кб)
Позволяет покупать в Кузнице все БМ + устраняет обновление экрана мира, если игрок находится в экране города.


--------------------
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
FCst1
сообщение 19 Aug 2010, 18:43
Сообщение #17

Fattest man
Сообщений: 4 669
Спасибо сказали: 2617 раз




Я так понимаю, для Эры? smile.gif


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 19 Aug 2010, 18:47 (Сообщение отредактировал Master Of Puppets - 19 Aug 2010, 18:47)
Сообщение #18

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2377 раз




Да. Кидаем в EraPlugins - и всё.


--------------------
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery



Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
FCst1
сообщение 19 Aug 2010, 18:50
Сообщение #19

Fattest man
Сообщений: 4 669
Спасибо сказали: 2617 раз




Master Of Puppets, если версия 1.8, то в Era/Plugins wink.gif


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
MasterOfPuppets
сообщение 19 Aug 2010, 18:54 (Сообщение отредактировал Master Of Puppets - 19 Aug 2010, 18:54)
Сообщение #20

Анти-Всë
Сообщений: 2 989
Спасибо сказали: 2377 раз




...скомпилированная с {$DEFINE ERA2}. Я не стал менять расположение ресурсов.
Енто... работает?


--------------------
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery

Go to the top of the pageAdd Nick
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 13 January 2026 - 04:50
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика