(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
			
		 |