(22.08.2011 19:05)Berserker Wrote: MOP, ты не смотрел проблему потери опыта, если передаётся последний отряд?
Посмотрел, но ни черта не понял. Бряк на вог-хук срабатывает в любом случае, последний это отряд или нет. Какая такая проверка может стоять в ВОГе и зачем она нужна - ума не приложу.
(27.08.2011 17:17)Berserker Wrote: Патчит Arsenal.dll - плагин Мора, позволяющий в кузнице нанимать все три машины войны.
Посмотрел - у меня нет его исходников.
Кое-как откопал. Моя самая первая длл:
Code:
LIBRARY Arsenal;
{!INFO
MODULENAME = 'Arsenal'
VERSION = '1.0'
AUTHOR = 'Master Of Puppets'
}
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
(* Caienu, iaiaoiaeiay aey ?aaiou n ooieoeyie iao?eiaa *)
THookRec = RECORD
Opcode: BYTE;
Ofs: INTEGER;
END; // .record THookRec
VAR
Temp: INTEGER; // Oieaa?naeuiay a?aiaiiay ia?aiaiiay
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 ARSENAL_FUNCTION; ASSEMBLER; {$FRAME-}
ASM
PUSH EBP
MOV EBP,ESP
MOV ECX,DWORD PTR DS:[$69954C]
PUSH -1
PUSH $63656B
MOV EAX, LARGE FS:0
PUSH EAX
MOV LARGE FS:0, ESP
PUSH ECX
PUSH ESI
MOV ESI,ECX
MOV ECX,DWORD PTR DS:[ESI+$38]
CMP DWORD PTR DS:[ECX+$3C],-1
JNZ @@No_call
MOV EAX, $5BDB50
CALL EAX
@@No_call:
MOV EAX,DWORD PTR DS:[ESI+$38]
PUSH EDI
MOV EAX,DWORD PTR DS:[$69CCFC]
MOV EDX,DWORD PTR DS:[$69CCF4]
IMUL EDX,EDX,$168
SUB EAX,EDX
MOV EDX,DWORD PTR SS:[EBP+8]
IMUL EDX,EDX,$492
ADD EDX,EAX
ADD EDX,$0B50
MOV DWORD PTR SS:[EBP+8],EDX
PUSH $4AA2F5
END;
//Вклиниваемся в адрес, откуда начинается вызов диалога Кузницы
PROCEDURE HOOK_Blacksmith; ASSEMBLER; {$FRAME-}
ASM
PUSH 0
PUSH ESI
CALL ARSENAL_FUNCTION
PUSH $5D22E1
END;
//Вырубаем все функции обновления экрана мира при входе в город
PROCEDURE Disable_Redraw_Map; ASSEMBLER; {$FRAME-}
ASM
PUSH EBP
MOV EBP, ESP
PUSH -1
MOV DWORD PTR DS:[$415D44],$114E9
MOV BYTE PTR DS:[$415D48],0
MOV DWORD PTR DS:[$4032E5],$124E9
MOV BYTE PTR DS:[$4032E9],0
MOV DWORD PTR DS:[$403423],$123E9
MOV BYTE PTR DS:[$403427],0
PUSH $5C6C75
END;
//Врубаем все функции обновления экрана мира при выходе из города
PROCEDURE Enable_Redraw_Map; ASSEMBLER; {$FRAME-}
ASM
MOV DWORD PTR DS:[$415D44],$BE83F18B
MOV BYTE PTR DS:[$415D48],$98
MOV DWORD PTR DS:[$4032E5],$0D8BF18B
MOV BYTE PTR DS:[$4032E9],$38
MOV DWORD PTR DS:[$403423],$8B565351
MOV BYTE PTR DS:[$403427],$0F1
MOV EAX,2
PUSH $5D4C74
END;
BEGIN
HookCode(POINTER($5D21A4), @HOOK_Blacksmith, C_HOOKTYPE_JUMP);
HookCode(POINTER($5C6C70), @Disable_Redraw_Map, C_HOOKTYPE_JUMP);
HookCode(POINTER($5D4C6F), @Enable_Redraw_Map, C_HOOKTYPE_JUMP);
END.
(22.08.2011 19:05)Berserker Wrote: Пока что удали его лучше, а потом нужно выловить Мора и поругать.
Пусть лучше мир прогнётся под нас...
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
|