Sav
Posts: 2180
|
Улучшил dll.
Выкладываю только исходник.
LIBRARY HookAfterDamage;
{!INFO
MODULENAME = 'AfterDamage'
VERSION = '1.0'
AUTHOR = 'Sav'
}
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_AfterDamage; ASSEMBLER; {$FRAME-}
ASM
PUSHAD
SUB ECX, $4463CEC
MOV EDX, 0
MOV EAX, ECX
MOV BX, $548
DIV BX
MOV [$91DA38], AX
PUSH 9500//номер ERM-функции.
MOV EAX, $74CE30
CALL EAX//вызываем C_FUNC_ZVS_CALLFU
ADD ESP, 4
POPAD
PUSH EBX
MOV EBX, $7C8554
MOV EAX, CS:[EBX]
POP EBX
CALL EAX
PUSH $756E41
END;
BEGIN
HookCode(POINTER($756E3B), @Hook_AfterDamage, C_HOOKTYPE_JUMP);
END. Добавлено:
Теперь при вызове функции в x1 заносится номер атакующего стека ( Upd: на самом деле не правильно заносится.) (его, кстати, нельзя получить в !?MF1;), что, скорее всего, позволит очень сильно упростить скрипт горыныча.
(This post was last modified: 29.10.2010 18:22 by Sav.)
|
|
11.09.2010 18:23 |
|
Sav
Posts: 2180
|
Ещё обновил dll. Теперь ещё в x2 записывается номер атакованного стека, а в x3 ( Upd: на самом деле не правильно записывается.) его тип. Правда, оказалось, адрес неудачный, вышло не совсем !$MF, и применять её для горыныча не получится. Буду искать дальше.
LIBRARY HookAfterDamage;
{!INFO
MODULENAME = 'AfterDamage'
VERSION = '1.0'
AUTHOR = 'Sav'
}
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_AfterDamage1; ASSEMBLER; {$FRAME-}
ASM
PUSHAD
PUSH EAX
SUB ECX, $4463CEC
MOV EDX, 0
MOV EAX, ECX
MOV BX, $548
DIV BX
MOV [$91DA38], AX
POP EAX
MOV ECX, EAX
SUB ECX, $4463CEC
MOV EDX, 0
MOV EAX, ECX
MOV BX, $548
DIV BX
MOV [$91DA3C], AX
PUSH 9500//номер ERM-функции.
MOV EAX, $74CE30
CALL EAX//вызываем C_FUNC_ZVS_CALLFU
ADD ESP, 4
POPAD
PUSH EBX
MOV EBX, $7C8554
MOV EAX, CS:[EBX]
POP EBX
CALL EAX
PUSH $756E41
END;
BEGIN
HookCode(POINTER($756E3B), @Hook_AfterDamage1, C_HOOKTYPE_JUMP);
END.
(This post was last modified: 29.10.2010 18:23 by Sav.)
|
|
11.09.2010 21:02 |
|
Sav
Posts: 2180
|
Поправка: в x3 тип атакующего существа.
|
|
11.09.2010 21:32 |
|
GhostManSD
Posts: 1054
|
Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
(This post was last modified: 15.09.2010 03:55 by GhostManSD.)
|
|
15.09.2010 03:54 |
|
Sav
Posts: 2180
|
Ты тогда мой профиль перенеси на новый архив.
|
|
15.09.2010 11:35 |
|
GhostManSD
Posts: 1054
|
Sav, твой профиль должен работать: я же не менял ящик, а только поменял адрес. Или у тебя не заходит?
Кстати, любопытная деталь. Все знают, что Google не различает почту "name.surname@gmail.com" и "namesurname@gmail.com" (причем под "name.surname" подразумевается логин с любым количеством точек). Но вот box.net эти адреса [b]различает[b]. Так что можно зарегистрировать тонну ящиков по одному адресу. Это становится своеобразной имбой, да. Но при ограничении в 1 ГБ - весьма полезно. А если есть адреса ещё и в других системах...
Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
|
|
15.09.2010 12:03 |
|
Sav
Posts: 2180
|
Всё нормально, уже зашёл.
|
|
17.09.2010 17:45 |
|
Sav
Posts: 2180
|
1. GhostManSD, в некоторых твоих постах этой темы есть ссылки на старый адрес драконьего архива.
Обнови или удали, пожалуйста, ссылки в следующих постах:
196;
457.
|
|
18.09.2010 20:41 |
|
Sav
Posts: 2180
|
2. Поскольку моя работа над нормальным !$MF; может затянуться на неопределённое время, я адаптировал скрипт горыныча под мою уже сделанную, "кривую" dll.
Скачать можно из DragUpd-архива.
Распаковывать в папку с Героями.
Работает только под Эрой.
(This post was last modified: 29.10.2010 18:28 by Sav.)
|
|
18.09.2010 20:49 |
|
NIKr0m@nceR
Posts: 203
|
я извиняюсь, но скажите а обсуждение еще продолжается?
|
|
29.10.2010 12:08 |
|
Sav
Posts: 2180
|
Да, продолжается.
Просто ещё недоделан горыныч, а у меня хронически недостаёт времени, чтобы закончить.
Но проект живёт и если есть желание что-нибудь обсудить, то пожалуйста.
|
|
29.10.2010 12:15 |
|
GhostManSD
Posts: 1054
|
Разумеется, мини-проект жив. Но, как верно говорит Sav, времени на его реализацию почти нет.
Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
|
|
29.10.2010 18:13 |
|
NIKr0m@nceR
Posts: 203
|
тогда пара вопросов:
лазурный дракон не изменится?
а как будет регенировать ржавый дракон? во-первых, мне кажется, что зависимость от количества должна быть логарифмической, а во-вторых, собственно, вопрос: а зависеть будет процент хп которые они регенирируют или просто константа?
|
|
29.10.2010 20:57 |
|
Sav
Posts: 2180
|
NIKr0m@nceR Wrote:лазурный дракон не изменится?
Я уже писал, что лично мне хотелось бы дать лазурному атаку по площади и шанс заморозить (например уменьшить атаку, скорость) каждого атакованного.
NIKr0m@nceR Wrote:а как будет регенировать ржавый дракон ?
Однозначно - каждый ход. А на сколько - ещё обсуждается.
NIKr0m@nceR Wrote:во-
первых , мне кажется, что зависимость от
количества должна быть логарифмической
Не знаю, как лучше непосредственно в этом случае, а в целом логарифмическая зависимость привлекает меня больше, чем прямая.
NIKr0m@nceR Wrote:а во -
вторых , собственно , вопрос : а зависеть будет
процент хп которые они регенирируют или просто
константа?
Поскольку max hp = const, то и % от max hp = const.
То есть, разницы по сути нет, если только общее здоровье вдруг не изменится.
Или ты имеешь ввиду % от текущего здоровья?
|
|
29.10.2010 21:34 |
|
NIKr0m@nceR
Posts: 203
|
нет, ну макс хп вполне меняется старостью, а при включенном опыте с получением левела т.е. очень часто. или артами полнимается. или, на худой конец, кто-нибудь захочет мод на основе скрипта сделать а хп у драконов поменять
|
|
31.10.2010 00:53 |
|