找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 988|回复: 14

【代码】关于.nut代码的分享

[复制链接]

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
发表于 昨天 22:11 | 显示全部楼层 |阅读模式
写在开头,免责声明:本人刚研究.nut和台服单机技能,今天是第二天写技能,所以下列发现可能大佬们已经发现了,只不过我不知道

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:12 | 显示全部楼层
好了直接说结论,.nut有面向对象编程的特征,但是不同于其他面向对象语言的继承特征(重写),同时也没有遵循经典的OO继承模型。
比如,我昨天想要给角色的主动buff添加增加移速的效果(毕竟没有高级装备的时候太慢了)。
以死亡左轮为例,释放技能时会调用:
function onStart_appendage_revolvercriticaldamageup(appendage){}函数,但是显然这里有一个问题。
// 空实现!
//这意味着:
// 1. 引擎检测到此函数存在
// 2. 执行空函数体
// 3. 引擎基类实现完全被跳过
如果按照C++或者java等语言思路来看,像这种空函数会重写父类的内容,空函数实际上阻止了原技能死亡左轮默认暴伤加成的应用!
所以我研究了一下别的大佬修改的封包后发现了DNF引擎的基本机制:
DNF引擎中的效果应用有两种独立机制:
1.自动配置机制(数据驱动)
引擎根据脚本文件路径自动关联预设效果;在加载脚本前就已经确定要应用的效果;应用发生在脚本函数被调用之前(这条很重要,也就是无论大家在脚本文件中写任何内容,只要没有对原本的技能逻辑进行修改,那么原技能旧不会变化)
2.脚本函数机制
通过注册的函数实现自定义行为;在脚本函数中可以覆盖、扩展或修改自动配置的效果
所以了解这个原理之后,只需要有核心代码:
local parentObj = appendage.getParent();//获取目标对象
local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj);
local skillLevel = sqrChr.sq_GetSkillLevel(60);//死亡左轮技能ID
local moveSpeed = sq_GetLevelData(sqrChr, 60, 3, skillLevel);
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:12 | 显示全部楼层
local moveSpeed = sq_GetLevelData(sqrChr, 60, 3, skillLevel);
注意,这里需要在原有的数组中额外添加一列;(不知道DNF的skl文件中的levelinfo究竟属于什么数据类型,大概能算是数组吧,需要提前声明列宽)
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:12 | 显示全部楼层
哦,刚才忘记说了,释放技能时,引擎调用onStart,我们可以通过
appendage.sq_AddFunctionName("onStart", "onStart_appendage_revolvercriticaldamageup")
将onStart改成自己想要的名字,我改的是onStart_appendage_revolvercriticaldamageup

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:13 | 显示全部楼层
没有nut经验,第一次写脚本,不喜勿喷

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3819

主题

3万

回帖

11万

积分

出神入化

积分
116619
发表于 昨天 22:14 | 显示全部楼层
大佬如何让一觉后技能吃到死左爆伤加成呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:14 | 显示全部楼层
比如增加魔法伤害的写法是:
local change_appendage = appendage.sq_getChangeStatus("magical");
if(!change_appendage)
{
change_appendage = appendage.sq_AddChangeStatus("magical",obj, obj, 0, CHANGE_STATUS_TYPE_MAGICAL_ATTACK_BONUS, true, magicalAttackBonus);
}
if(change_appendage)
{
change_appendage.clearParameter();
change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_ATTACK_BONUS, true, magicalAttackBonus.tofloat());
change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, magicalcrittcal.tofloat());
}
如果技能本身增加的是魔法伤害,可以用这句代码覆盖掉原有的条件逻辑
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

发表于 昨天 22:15 | 显示全部楼层
顶帖
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:15 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:16 | 显示全部楼层


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:17 | 显示全部楼层
我只能说,不用全部重写逻辑的加载方式真是太棒啦!
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3913

主题

3万

回帖

11万

积分

出神入化

积分
118678
发表于 昨天 22:17 | 显示全部楼层
卧槽  新的大佬
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3170

主题

3万

回帖

10万

积分

出神入化

积分
103586
 楼主| 发表于 昨天 22:18 | 显示全部楼层
那如果是这样的话,理论上可以在不修改技能原有内容的情况下,主动增加特殊效果!
比如,众所周知的弹药技能【爆炎弹】是附带额外的魔法伤害,也可以为之增加物理伤害咯?
我去试试,等我的好消息
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3686

主题

3万

回帖

11万

积分

管理员

积分
112904
发表于 昨天 22:18 | 显示全部楼层
津爷太强了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

发表于 昨天 22:19 | 显示全部楼层
是大佬就该被膜拜
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表