跳转到内容
模组网
登录并关注  
十字月★灵猫

【简单脚本分析】双持武器视觉效果

被推荐的帖子

kirito_render_by_ivanpogi-d5fmokm.png
前言
帅气的双持武器是许多oblivion玩家的梦想,但是因为游戏引擎原因,如同skyrim一样的真双持系统是绝对不可能(你没看错,绝!对!不!可!能——~~~!)在oblivion中实现的,因此出现了无数诸如UV这样的类双持系统mod,以及DMC style这样的伪双持系统
 
这里就像大家介绍一个著名mod实现双持视觉效果的脚本
此外对于类双持战斗系统mod,也介绍一个小巧而强大到极限战斗mod 
 
前期准备
首先你要明确你想要的效果:
1 在收刀状态将双刀背负于后背
2 在拔刀状态左右手各持一把武器
3 我不希望每次战斗时候都要手动装备盾(左手伪武器)和单手武器(右手)
4 不要发生复制武器或者武器丢失这样令人蛋疼的事情
 
你需要的材料:
你要知道oblivion中不可能实现真双持,所以要达到上面的效果,只能用一把双手剑背在身后伪装成背在身后的双刀,用一个盾牌拿在左手伪装成副手刀,再加上一把单手武器作为主手刀。你必须拥有以下三种模型(这些模型均可以从Dual Weapons这个mod中得到,也可以自己制作...说实话这mod中除了yamato,FF7小红的剑和战锤40000帝国剑没一个好看的)
 
1 单手剑one hand(主手刀)
2 盾off hand(副手刀)
3 双手武器on back(背在背上的双刀)
 
你需要的工具
1 TES construction set最新版
2 CSE 6.1(脚本编辑系统重置,看起来非常顺眼) 或者 CSE 5.1
3 obse 21bate4(虽然是bate版,但是目前看来很稳定) 或者 obse 20
 
开始制作
1 准备材料,在CS中分别建立三个项目,防具中新建一个盾牌offhand,选择副手刀的模型(设定为任务物品,即不能扔掉,因为它是onback的附属,双刀中的一把刀);武器中新建单手剑onehand,选择主手刀的模型(也设定为任务物品,理由同上,可以防止扔掉或者缴械;不过问题是某些战斗mod中的脚本缴械投掷武器会让它被扔出去,我们会在后面用自己的脚本解决);武器中新建双手剑onback选择背负在后背的双刀的模型
 
这次纯粹是脚本讲解,如果你是脚本新手建议你看一个更简单的脚本案例,也就是冰梦的自动入包脚本,学习一些基本操作(他有图例)http://sinomod.com/topic-143/
 
颜色提示:
蓝色 脚本内部设定的引用
绿色 obse以及游戏原本的脚本功能
红色 脚本功能开始、结束和重复
灰色 对游戏内材料(如武器,物体,NPC)的引用
紫色 本喵的解释
 
ScriptName Onback  ;这个脚本是放在onback上的,所以选择object script物体脚本
 
ref Who  ;这个是用来判定持有者的
short box  ;这是个条件变量,用来确定持有者是否是人
float interval  ;这个是用来给出脚本定时监测的时间间隔
 
begin OnAdd  ;这个设定的是开始的条件,当脚本所在的物体onback被加入到
set Who to GetContainer  ;让武器持有者被定义为Who(可能是个箱子也可能是个NPC)
    if ( Who.IsActor != 0 )   ;如果Who不是一个人NPC或者动物Creature(也就是一个箱子,另外别没事找事把武器放在动物尸体上,动物也是actor)
        set box to 1  
    else  ;否则
        set box to 0
    endif 
end
 
Begin GameMode  ;当游戏状态,也就是你退出tab菜单进入游戏中的即时状态时
    if ( box != 0 )  ;如果box不为0,也就是持有者不是箱子而是一个NPC的情况下
        set interval to interval + GetSecondsPassed  ;设定interval为它本身+本次脚本生效后已经过去的时间,gamemode开始以后interval默认为0
        if ( interval < 0.3 )  ;如果interval在0.3喵以内
            return  ;返回继续获取脚本生效后已经过去的时间(这里比较绕,这是因为obse自身是以一定的频率进行重新监测的,0.3喵的间隔不是脚本自检时间间隔,而是脚本发生效应的时间间隔)
        else   ;否则
            set interval to 0  ;如果interval时间间隔到达了0.3喵,让脚本开始生效,并且执行后面的脚本功能
        endif
    endif
;其实以上的部分你们照抄就好,唯一需要注意的就是0.3喵的时间间隔,你们可以按需求改成别的,这个0.3喵的作用是在时间间隔中禁止后面的功能,防止占用CPU资源,以做到对脚本的优化。如果觉得视觉效果延迟无所谓,设定个1喵也是ok的,反正设定越大,越省CPU
 
;喵了个咪的...这论坛就没个存草稿的功能么...好吧,刚去洗了个澡喵,边写边更吧
 
;事实上,本脚本还要配合另一个脚本来实现全部的双持效果,那是duke近距械斗里面专有的附在盾(副手刀上的一个脚本,后面我们会提到)...原来在这个脚本中有对应着副手刀的功能,但是因为跟duke里的重复了于是我给去掉了
 
 
 
 
;下面的功能是当你装备双手剑Onback以后,为你增加它的附属主手Onehand(单手剑)和副手武器Offhand(盾),作为后面拔刀自动换为双持状态的功能的先决条件
 
    if (Who.GetEquipped OnBack == 1)  ;如果Who(也就是你)装备了Onback(双手刀,背负在身后的双刀),getequipped就是监测是否装备
        if(Who.GetItemCount Offhand == 0)  ;如果盾牌伪装的副手武器Offhand不在你背包里,getitemcount这个功能是监测你包里有几件这玩意
            Who.Additem Offhand 1   ;增加1件Offhand到你背包里,additem这个功能是游戏自带的,如同命令player.additem XXXXXXXX X
        if(Who.GetItemCount Onehand == 0)  ;如果你背包里没有主手刀...(为什么我觉得上一个if少了个endif,不过既然编辑器没有提示,应该没错)
            Who.Additem Onehand 1  ;增加1件Onehand道理背包里
        endif  ;对应着跟它对齐的上面那个if,只要if后面必然跟着endif做结尾
    endif
 
 
 
 
;下面一系列功能是为了防止因为上面装备Onback给你背包加入主手和副手武器发生复制的情况
 
    elseif (Who.GetItemCount Onehand > 1)  ;elseif指的是如果前面所有同级的if和elseif条件未能达成,也就是Onback并没有装备,这里是脚本的一个疏漏,应该用if,因为即使Onback并没有装备,它也应该移走背包里多余的Onehand和Offhand
        Who.RemoveItem Onehand 1  ;remove是删除的意思,然后你懂得...由于0.3秒执行一次脚本功能,所以除非你有意跟本脚本过不去,你的背包里onehand是绝对不可能多余1的
    elseif (Who.GetItemCount Offhand >1)  ;同上,不多说了
        Who.RemoveItem Offhand 1
 
 
 
;下面的功能是用于移除你未装备双刀Onback和主副手武器的情况下(也就是你不用双刀把它放在背包里的时候),移除双刀使用状态所增加的附属主副手武器
 
    elseif (Who.GetEquipped Onback == 0 && Who.GetEquipped Onehand == 0 && Who.GetEquipped Offhand == 0)   ;如左边所示,三件东西都没装备,这个用elseif绝对没错,因为此时Onback绝对没有装备;事实上,条件GetEquipped Onback可以不要,不过我没实验过
         Who.RemoveItem Onehand 1
         Who.RemoveItem Offhand 1
    endif
 
 
 
;下面就是重头戏了,不过是在副手武器Offhand(盾)上有脚本的情况下(盾脚本的功能是Onehand装备,Offhand自动装备;Onehand卸下,Offhand自动卸下),盾脚本后面会补充。此脚本实现功能是,拔出双手剑Onback自动装备单手剑Onehand;收回单手剑Onehand自动装备双手剑Onback
 
;这里为了便于理解,必须说明,收刀和拔刀相当于两种状态,它与装备何种装备无关。比如你拔刀以后换武器,新武器会自动拔出,实际上那只是个拔出动画。你此时处于拔刀状态,并不没有经历收回原武器卸下,然后再装备新武器拔出的过程,等同于刀在你手里被瞬间替换为一把新的刀;同理,收回状态也是,不过没有收刀动画就是了
 
;友情提示喵,下面这段非常饶...玩脚本你逻辑要好,让我这只文艺喵情何以堪啊逻辑!
 
    if(Who.GetEquipped Onback == 1  && Who.IsWeaponOut == 1)  ;如果处于拔刀状态并且装备Onback
        Who.EquipItem Onehand  ;自动装备Onehand
也就是说只要你装备Onback的时候拔刀,它就会被替换为Onehand。因此只要你拔出Onback这把双手剑,它会在你手上变成主手刀Onehand,配合自动装备的Offhand,完美的拔出双刀的动画
    elseif (Who.GetEquipped Onehand == 1 && Who.IsWeaponOut == 0) ;倘若处于收刀状态并且装备Onehand
        Who.EquipItem Onback  ;自动装备Onback
;只要你装备Onehand的时候收刀,它就会被替换为Onback。所以你收回Onehand结果是Onback回到你背上。在你收刀瞬间Offhand自动卸下,与装备双刀卸下盾牌功能重叠,且不会冲突
    endif
 
 
 
End
 
;晚上大概更新盾牌脚本,其实那个脚本不是我做的,是duke里面自带的,但是原理我知道,所以提供解决思路
 
;...困死了,不过先更新完了吧,反正副手武器(盾)脚本简单地要死,我就不用变色字体了啊
 
ScriptName Offhand
 
ref who  ;用于定义持有者
float interval  ;用于定义脚本功能时间间隔
 
;首先定义持有者
 
begin OnAdd  ;只要offhand被加入物品栏,由于offhand是onback的附属且无法扔掉,根据前面的脚本,它必定是在人身上
   set who to GetContainer  ;设定who为持有者,也就是你,当然你给NPC的话就变成NPC了
end
 
Begin GameMode  ;处于游戏状态开始执行内容
 
;以下功能是给脚本功能实现一个时间间隔,也就是在时间间隔内脚本不会执行后面乱七八糟的大量功能,只进行间隔事件检测,这样可以减少cpu资源消耗,达到优化的目的。当然这个脚本非常短小,所以这个优化功能是无所谓的,但是考虑到可能会附加其他功能所以我们还是养成一个自行优化的习惯吧
    set interval to interval + GetSecondsPassed  ;设定interval为它本身(初值0)+ 经过的时间监测
        if (interval < 0.2 )  ;时间间隔为0.2喵
           return;返回set interval to interval + GetSecondsPassed
        else
            set interval to 0  ;当事件检测累计interval达到0.2喵,也就是时间间隔到了,开始执行一次后面的功能并且重新计时。所以要让inter>=0.2的时候使其归零
        endif  ;计时功能结束
 
;以下功能是实现,拔出onehand时自动装备offhand,onehand收刀或者因为其他原因卸下的时候自动卸下offhand
    if (who.GetEquipped Onehand == 1 && who.IsWeaponOut == 1)
        who.EquipItem Offhand  ;只要你装备Onehand并且处于拔刀状态,这样就让你装备Offhand
    else
        who. UnequipItem Offhand  ;否则,无论你收刀还是因为别的原因(比如被缴械或者投掷武器)卸下Onehand,就会给你卸下Offhand;延伸作用就是,只要不装备Onehand并且拔出,你即使想要手动装备Offhand也是做不到的,你点上以后关闭Tab背包菜单的一瞬间Offhand就会卸下
     endif
 
end
编辑于 ,编辑者 十字月★灵猫
  • Upvote 1

分享此帖子


帖子链接
分享到其他网站

沙發 感謝詳細的解說 對腳本一直很蛋疼

 

有了這樣的註解 可以讓我不只能覆製 或許還可以加以變化..

分享此帖子


帖子链接
分享到其他网站

创建账户或者登录再讨论

您需要成为会员才能留下讨论

创建账户

在本社区注册新账户。很简单的!

注册为新账户

登录

已有账户?这边登录

马上登录
登录并关注  

×
×
  • 新建...