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