air 发表于 2017-5-5 21:27:46

为什么负运气脚本单独拿出来会出错...SN:E错误...

直接放入图里...就会出现SN:E; 出错的提示..

ZVSE
*作者:贤知有您 (Hawaiing 007)
*需要ERM_HOOKER插件支持.
*******************************************************************
肉搏攻击或射击攻击所有攻击动作之后触发器模块——最后更新 2014-9-22
*******************************************************************
;   EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
;   RetAddr (32)
*FU777710[] 生物射击或攻击之后 (FU111105-FU111106)(所有攻击反击双击完成之后,FU77006之前,BR之前,BG1之前)
*-----------------------------初始化HOOK或解除HOOK---------------
!?BA0&1000;[战斗前]
!!FU111105:P0;[生物射击或攻击之后]
!?BA1&1000;[战斗后]
!!FU111105:P1;[生物射击或攻击之后]
*--------------------------------------------
!?FU111105&x1=0;[射击或攻击之后]
*004459D7 5F pop edi <-----这里HOOK入
*004459D8 5E pop esi
*004459D9 B001 mov al,01h
*004459DB 5B pop ebx
*004459DC 8BE5 mov esp,ebp <-----返回
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4479447/111106; hook at 0x004459D7 => FU111106

!?FU111105&x1=1;[射击或攻击之后]解除HOOK
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^UnsetHook^/?y2;
!!SN:Ey2/1/4479447;

!?FU111106;[射击或攻击之后,连接FU拦截式触发器]
!!SN:X?y1/1; [运行原来的代码]
!!FU777710:P;[这是个触发器,没有参数,可以使用几乎所有的BG参数]

*******************************************************************
                   厄运效果模块——最后更新 2014-10-23
*******************************************************************
*实现霉运效果(或厄运效果)(BadLuck),霉运时伤害减半
*去掉原官方版本中,需要有英雄带领生物才能拥有幸运一击的限制(无需英雄带领)

!?PI;
*0043F642 - 0f 84 ae 00 00 00 - je 0043f6f6 射击时判断
*00441524 - 0f 84 b4 00 00 00 - je 004415de 肉搏判断
!!UN:C4453954/4/2425393296;
!!UN:C4453958/2/37008;
!!UN:C4461860/4/2425393296;
!!UN:C4461864/2/37008;
!!FU111201:P;
!!FU111203:P;
!!FU111205:P;

!?GM0;
!!UN:C4453954/4/2425393296;
!!UN:C4453958/2/37008;
!!UN:C4461860/4/2425393296;
!!UN:C4461864/2/37008;
!!FU111201:P;
!!FU111203:P;
!!FU111205:P;

!?FU111201;[射击判断幸运一击之后]esi为堆栈
*0043F6F6 - 8b 7d 08 - mov edi, #幸运一击处理完毕后(HOOK入)
*0043F6F9 - 8b ce - mov ecx,esi
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4454134/111202; hook at 0x0043F6F6 => FU111202

!?FU111202;[射击判断幸运一击之后]
*此时esi为堆栈内存*
!!SN:X?y1/1; [运行原来的代码]
!!VRy2:Sy1+4;
!!UN:Cy2/4/?y4;[堆栈内存=y4]
!!UN:C6919200/4/?y10;
!!VRy11:Sy4-y10-21708:1352;[攻击者堆栈号]
!!VRy12:Sy4-y10-21708%1352;
!!FU|y12<>0/y11<0/y11>41:E;[堆栈错误]
!!BMy11:T?y13 G213/?y20/d;[当前运气值]
!!FU|y13<0/y13=149/y20>=0:E;
!!VRy21:Sy20*-1;
*!VRy21&y21>3:S3;
!!VRy21&y21>10:S10;   封神特殊改动
!!UN:P616/=1;
!!VRy23:S23;
!!VRy23&1:S13;
!!VRy22:S1Ry23;[随机1-24(S1R23)]
!!FU&y22>y21:E;
!!VRz-2:S^Misfort.wav^;[优先播放声效]
!!SN:Pz-2;
!!BMy11:G-74/-1/d V48;[设定一个标志](用于后面的计算伤害)
!!UN:N3/2/y13/0;
!!VRz-1:S^%Z2交上了恶运!^;
!!BU:Mz-1;

!?FU111203;[肉搏判断幸运一击之后]esi
*004415DE - 8b 96 84 00 00 00 - mov edx, #判断幸运一击完毕之后(HOOK入)
*004415E4 - 89 7d f0 - mov ,edi
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4462046/111204; hook at 0x004415DE => FU111204

!?FU111204;[肉搏判断幸运一击之后]esi(与射击段一样)
*此时esi为堆栈内存*
!!SN:X?y1/1; [运行原来的代码]
!!VRy2:Sy1+4;
!!UN:Cy2/4/?y4;[堆栈内存=y4]
!!UN:C6919200/4/?y10;
!!VRy11:Sy4-y10-21708:1352;[攻击者堆栈号]
!!VRy12:Sy4-y10-21708%1352;
!!FU|y12<>0/y11<0/y11>41:E;[堆栈错误]
!!BMy11:T?y13 G213/?y20/d;[当前运气值]
!!FU|y13<0/y13=149/y20>=0:E;
!!VRy21:Sy20*-1;
*!VRy21&y21>3:S3;
!!VRy21&y21>10:S10;   封神特殊改动
!!UN:P616/=1;
!!VRy23:S23;
!!VRy23&1:S13;
!!VRy22:S1Ry23;[随机1-24(S1R23)]
!!FU&y22>y21:E;
!!VRz-2:S^Misfort.wav^;[优先播放声效]
!!SN:Pz-2;
!!BMy11:G-74/-1/d V48;[设定一个标志](用于后面的计算伤害)
!!UN:N3/2/y13/0;
!!VRz-1:S^%Z2交上了恶运!^;
!!BU:Mz-1;

!?FU111205;[计算堆栈伤害时考虑幸运一击之后]ebx
*004430A3 - 8b 43 70 - mov eax, #幸运一击的标志
*004430A6 - 85 c0 - test eax,eax
*004430A8 - 7e 0b - jle 004430b5 #非大于0则跳转
*004430AA - 8b 45 08 - mov eax, #第二参数(伤害值)*
*004430AD - 8b 4d f0 - mov ecx, #用于返回伤害
*004430B0 - 03 c8 - add ecx,eax #幸运时伤害翻倍
*004430B2 - 89 4d f0 - mov ,ecx #
*这里插入检测是否有霉运(标志值为-1),需要更新,原传递伤害为
*004430B5 - 8b 4d 0c                   - mov ecx, #第三参数 (HOOK入)
*004430B8 - 51                         - push ecx #第三参数
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/4468917/111206; hook at 0x004430B5 => FU111206

!?FU111206;[计算堆栈伤害时考虑幸运一击之后]ebx
*需要ebx,ebp
!!SN:X?y1/1; [运行原来的代码]
!!VRy2:Sy1+4;
!!VRy3:Sy1+8;
!!UN:Cy2/4/?y5;
!!UN:Cy3/4/?y6;
!!VRy20:Sy6-16;[为返回的伤害值]
!!VRy21:Sy6+8;[为原函数传递的参数中的伤害值(第二参数)]
!!UN:Cy20/4/?y7;[得当前伤害值]
!!UN:Cy21/4/?y8;[原传递伤害值]
!!UN:C6919200/4/?y10;
!!VRy11:Sy5-y10-21708:1352;[攻击者堆栈号y11]
!!VRy12:Sy5-y10-21708%1352;
!!FU|y12<>0/y11<0/y11>41:E;[堆栈错误]
!!BMy11:G-74/?y13/d;
!!FU&y13<>-1:E;
!!VRy8::2;[伤害值减半]
!!VRy7:-y8;[可能是负数(原本是为了计算附加伤害)]
!!UN:Cy20/4/y7;[的更新]

XEricSin 发表于 2017-5-5 22:58:38

*需要ERM_HOOKER插件支持.

你仔细看了吗?这玩意在plugin文件夹里面

air 发表于 2017-5-6 11:02:36

XEricSin 发表于 2017-5-5 22:58
*需要ERM_HOOKER插件支持.

你仔细看了吗?这玩意在plugin文件夹里面

必须DAT S ????

贤知有您 发表于 2017-5-6 13:25:25

必须使用 erm_hooker.era 插件

air 发表于 2017-5-6 13:37:23

贤知有您 发表于 2017-5-6 13:25
必须使用 erm_hooker.era 插件

这插件能创造促发器?FU777710[] 生物射击或攻击之后 (FU111105-FU111106??那么能利用这个插件创造攻击前的促发器吗?就BG0-MF1 之间的那个怪物刚好移动后.即将攻击的那个.....

air 发表于 2017-5-6 13:38:31

贤知有您 发表于 2017-5-6 13:25
必须使用 erm_hooker.era 插件

这插件感觉好牛逼啊!!!....尤其是看见前面几句...制造新的促发器......

air 发表于 2017-5-6 13:49:48

贤知有您 发表于 2017-5-6 13:25
必须使用 erm_hooker.era 插件

对了负运气应该是只有MF之前才有效吧???...
!?FU111203;[肉搏判断幸运一击之后]应该是这个吧? 这个插件有说明吗??

air 发表于 2017-5-6 14:24:59

贤知有您 发表于 2017-5-6 13:25
必须使用 erm_hooker.era 插件

好吧果然时代变了....原来几百行代码现在就几句解决..而变得更加稳定.....这插件确实破天荒的意义...

air 发表于 2017-5-6 14:26:57

XEricSin 发表于 2017-5-5 22:58
*需要ERM_HOOKER插件支持.

你仔细看了吗?这玩意在plugin文件夹里面

;tl;这插件果然牛逼得不行啊!原来快破千行的代码现在不到10句解决.而且是完美解决!

贤知有您 发表于 2017-5-6 16:35:41

楼主慢慢来,须先有扎实的erm基础知识,然后很多功能都是套用。等你全面了解了,你就可以利用插件做这些超炫的功能,甚至你还可以做插件。

air 发表于 2017-5-6 17:41:34

贤知有您 发表于 2017-5-6 16:35
楼主慢慢来,须先有扎实的erm基础知识,然后很多功能都是套用。等你全面了解了,你就可以利用插件做这些超 ...

唉.不行还是无法解决诈尸问题..........这个抢先反击伤害非常正确.只有没抢先打死对方就是完美脚本.但是如果打死对方了就会被诈尸一次1伤害攻击...不知道有没有清理数量为0堆斩行动的内存方法...强制复位..取消掉这次攻击.中途被地雷炸死烧死不也没出现这种诈尸情况.......不知道有不有内存强制让怪停止行动的方法..

air 发表于 2017-5-6 17:57:15

贤知有您 发表于 2017-5-6 16:35
楼主慢慢来,须先有扎实的erm基础知识,然后很多功能都是套用。等你全面了解了,你就可以利用插件做这些超 ...

有办法拦截...这个
!!SN:E4461360/2/y10/y11/x3;   攻击且伤害
的内存吗...如果用哪个厄运触发器..如果攻击方被抢先打死..由于后面还有一个!!SN:E4461360/2/y10/y11/x3;类似语句..就好像无论你前面如何写后面都被增加这句 !!SN:E4461360/2/y10/y11/x3;   攻击且伤害..就是清除堆栈都没用...这个语句!!SN:E4461360/2/y10/y11/x3;   就算是y10是不存在的堆栈..照样能给y11一点攻击伤害.而且做出伤害动作..也就是说必须拦截..

air 发表于 2017-5-6 18:05:54

贤知有您 发表于 2017-5-6 16:35
楼主慢慢来,须先有扎实的erm基础知识,然后很多功能都是套用。等你全面了解了,你就可以利用插件做这些超 ...

话说这个插件有说明书没有....;sw;;sw;;sw;

XEricSin 发表于 2017-5-6 19:00:57

你看看封神文件里的eraplugins文件夹,复制到你的mod里面

air 发表于 2017-5-6 19:57:07

XEricSin 发表于 2017-5-6 19:00
你看看封神文件里的eraplugins文件夹,复制到你的mod里面

已经用了.只是感觉无法大规模运用啊...无法开发这钩子..

贤知有您 发表于 2017-5-6 23:53:08

ERM_HOOKER的说明书是这样子的.
Bersy said:
ERM Hooker v1.0.0
Era plugin allows to easily install and remove code hooks which execute corresponding ERM handlers.
{code block address} => {erm function receiving the context}

API:
(*
ErmHandlerFunc receives two SN:X arguments: (Context pointer, ExecuteOverwrittenCode? = 1)
If you set ExecuteOverwrittenCode to 0, be sure to change context.RetAddr
Context structure (offsets in brackets):
: EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
: RetAddr (32)

Returns non-zero value on success. Fails if another hook is set at the same address.
*)
function SetHook (Addr: pointer; ErmHandlerFunc: integer): longbool; stdcall;
(*
Removes erm hook at specified address. Returns true if hook existed.
*)
function UnsetHook (Addr: pointer): longbool; stdcall;
(*
Prints list of hooks in "DebugEraerm hooks.txt"
*)
procedure PrintHooks; stdcall;

All hooks are automatically removed on the following events: new game start, game loading, game leaving (Era 2.55+).

Plugin supports both Era 2.46 and Era 2.55+. For 2.55+ it handles OnGenerateDebugInfoEvent (you can generate list of hooks by pressing F11) and OnGameLeave event.

Example of usage:
!?FU102777;
!!SN:L^EraPluginserm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/5933074/102778; 0x5a8812

!?GM0;
!!FU102777:P;

!?PI;
!!FU102777:P;

!?FU102778;
!!IF:M^Hi from hook!^;

盘古 发表于 2020-5-29 14:01:07

好帖,但找不到erm_hooker.era

贤知有您 发表于 2020-5-30 11:30:18

盘古 发表于 2020-5-29 14:01
好帖,但找不到erm_hooker.era

era2.9新版的没有单独插件,是集成的。
我们当年用这个插件时是era246。
页: [1]
查看完整版本: 为什么负运气脚本单独拿出来会出错...SN:E错误...

捐赠