反解析了JS纳米装甲的Script,个人注释
本帖最后由 qjyuio 于 2011-6-8 00:22 编辑就是纳米服的Script,中国制造雷霆III也使用了。
(貌似这东西有点老了……)
所有带颜色的字不属于Script本身,因为大量内容不方便在\注解表示
蓝色则表示 数值、指令,也是注释的一部分
橙色则表示路径,你可以在哪里找到相关的东西,如果没有特殊说明的话默认在Object Window下。
红色是我个人插嘴,绿色是其他朋友的补充。
\后面的字虽然是注解,但是和程序也完全没有关系。
scn JSNanoStealthSuitControlEffectScript \名称
short button \创建一个叫做Button(按钮)的短句
short DoOnce \创建一个叫DoOnce(流程)的短句
float timer \创建一个浮点数叫Timer(计时器)
begin scripteffectstart \开始Script效果
ShowMessage JSNanoSuitInterface \显示信息 JSNanoSuitInterface (JS纳米服界面)
ShowMessage 这个指令可以调出设定好的Message
Message里面有MenuButton,你可以随意设置按钮,每个按钮都有自己的数值,显示在Index那一行当你在游戏中按下相应按钮的时候
相应的数值在Script就可以用下面的蓝色字体表示。
getbuttonpressed
end \完成,以后不解释这个词
begin scripteffectupdate \开始效果上传
set button to getbuttonpressed \设置
注意上面这一行,把创建好的短句 Button 和 getbuttonpressed 设置为等值。
if (doOnce == 1) \如果流程=1
if (timer <= 1) \外加计时器=1
看到没有,计时器就是表示能量剩余数,当第一次循环的时候并没有执行流程=1,为何?继续看吧。
Player.restoreav rightmobilitycondition 1
Player.setav SpeedMult 100 \设置玩家速度为100。
Player.removespell JSNanoArmor
Player.removespell JSDamage
Player.removespell JSStrength
Player.removespell JSStealth
这四行都是玩家移除特殊效果,也就是说流程=1是移除所有特殊效果。
Timer<=1就是说当计时器=1 的时候,能量耗尽,所以说下面播放能量耗尽的声音
PlaySound这个指令可以用于播放Miscellaneous-sound下面的任何声音文件。
PlaySound JSSuitPowerLow
set DoOnce to 2 \当完成流程=1的时候,就把流程设置为=2以进行下一个循环
set timer to 120 \移除效果之后把计时器设置为120
endif \每一个if的背后就有一个endif的默默支持。
endif
可以看到下面的流程2有个附加条件就是计时器小于105,所以在执行完了流程1计时器等于120,之后并不会马上转到流程2,而是需要等待15秒钟。
现在可能有点不理解,不过没关系,继续往下看,下面有个倒计时行,每秒钟把Timer的数值减少1,在每一次循环中都会计算。
也就是说实际上这次计算循环完毕之后也没有执行任何事情,而是在15秒钟循环计算之后才开始计算流程2
下面的else后面的解释准确一点讲的话:任何不满足上述所有的条件情况下。
elseif (doOnce == 2) \如果不是流程1的话(就是流程2)
if (timer <= 105) \如果Timer值数小于105的话
PlaySound JSCharging \播放声音充能
set DoOnce to 3 \把已过流程(doOnce)设置为3,然后如果Timer小于1则会进行流程3,如果大于1则直接进行充能,直到Timer减少到小于1再执行流程3.
endif
endif
注意看下面的计时器,也是小于等于1,但是这不表示是能量耗尽,我说过,Timer不过是一个计算用的数值罢了,和任何东西都没有必然的关联。
上面正在充能,105秒钟的循环计算之后,就会跳到流程3
elseif (doOnce == 3) \流程3
if (timer <= 1) \如果 Timer 小于 1
所以说下面播放的声音是能量补满
PlaySound Online \播放声音
Player.additem JSSuitControlstealth 1 1
能量补满之后特效可以继续使用,但是医疗物品栏都是一次性消耗物品,所以说添加一个打开纳米服菜单栏的医疗物品,也是这个Script的关联物品,使用这个物品,就会触发这个Script。
医疗物品在Game Effects 的 Ingestible
set DoOnce to 0 \把流程设置为0,也就是效果的部分
endif
endif
else \如果没有设置流程为0的话
set timer to timer - GetSecondsPassed\倒计时
上面这一行非常重要,直接翻译过来就是 把 Timer 这个短句 设置为 减去 过去的秒数。
也就是倒计时,这个Script的每一次循环都要经过这个数据,此数据必须是时常更新,所以必须放在每一次循环都可以计算到的位置,在很多Script中都用到了这个倒计时行,包括夜视仪、FWE中的电池消耗隐身。
endif
elseif (button == 0) \如果按钮=0 也就是 Message 里面设置的按钮到底按了哪个。
if (doOnce == 0) \如果流程=0
if (timer <= 0) \如果计时器小于等于0,这时候表示能量充满了
Player.addspell JSStealth
玩家增加特效 JSStealth 这个是不是Script的数值是Game Effects 下面的 Actor Effect 里面的一个特效。
Player.addspell 这个指令是给玩家添加特效的。
特指Actor Effect
PlaySound JSSuitStealth \玩家播放声音 启动隐身,因为按钮0是隐身效果。
set DoOnce to 1 \把流程设置为1,这样能量就会耗尽。
第一步doonce=1,timer<=1的时候,timer被重置,此时doonce不为0,但timer的定义改变。所以光说doonce不为0的前提有点笼统
set timer to 90 \最后把计时器设置为90,这样能量就会在90秒之后耗尽。
此MOD中的Timer用的真巧妙,让一个短句在不同的时候当了两个短句的工作,佩服。
endif
endif
endif
elseif (button == 1)\一下如上面所讲类同,就不在多说。
if (doOnce == 0)
if (timer <= 0)
Player.addspell JSNanoArmor
PlaySound JSMaxArmor
set DoOnce to 1
set timer to 60
endif
endif
endif
elseif (button == 2)
if (doOnce == 0)
if (timer <= 0)
Player.addspell JSDamage
PlaySound JSMaxDamage
set DoOnce to 1
set timer to 60
endif
endif
endif
elseif (button == 3)
if (doOnce == 0)
if (timer <= 0)
Player.addspell JSStrength
PlaySound JSMaxStrength
set DoOnce to 1
set timer to 60
endif
endif
endif
elseif (button == 4)
if (doOnce == 0)
if (timer <= 0)
Player.damageav rightmobilitycondition 1
Player.setav SpeedMult 250
PlaySound JSMaxSpeed
set DoOnce to 0
set timer to 30
endif
endif
endif
begin scripteffectfinish
end 额.....脚本类的东西挺费脑子.....参考参考
页:
[1]