阿荣社区采集员1 发表于 2025-3-10 21:05:25

[分享]nut注册的实现过程与简单的力智平衡

此贴所有资源均来自于吧内,本人只做了部分整合工作,发贴一是为了显摆周末的成果(不是),二则是为了请教实现过程中产生的部分问题。
关键项目地址:
https://gitee.com/sunstar59/nut-function-extension

阿荣社区采集员1 发表于 2025-3-10 21:05:42


图为简易版力智平衡实现结果


图为体精平衡实现后带来的问题(支援兵荣誉祝福后的下场),下面会进行详细的描述

阿荣社区采集员1 发表于 2025-3-10 21:06:13

完成上面配置后,此时已经可以直接生成dll,项目内自带有大佬提供的sqx_send_notice等方法,可以使用大合集加载dll后进行测试
测试可以通过游戏内输入//dofile xxx.nut (xxx.nut置于根目录)进行
我的测试代码:
local rgb = sq_RGB(0,255,0);
sqx_send_notice("hi",rgb,14);//14为喇叭,其余两框在示例内有标注
如果成功,则会在游戏内喇叭处出现绿色"hi"字样

阿荣社区采集员1 发表于 2025-3-10 21:06:20

3楼被吞的图重发:

阿荣社区采集员1 发表于 2025-3-10 21:07:14

我们新建sq函数,只需要sqfunctionhook.cpp、sqxtfunction.cpp、sqxfunction.h内进行即可
通过查询squirrel官方提供的文档,了解到如果在C++内实现sq函数并获取返回值,有对应约定为需要返回1;
则实现力智平衡最关键的获取角色力量、智力方法最简单方法如下:
//sqxfunction.cpp内实现
INT sqx_GetCharacterStrength(HSQUIRRELVM vm)
{
INT strength = readVal(0x1D5130C + 0x0400000);
sq_pushinteger(vm, strength);
return 1;
}
INT sqx_GetCharacterIntelligence(HSQUIRRELVM vm)
{
INT intelligence = readVal(0x1D5132C + 0x0400000);
sq_pushinteger(vm, intelligence);
return 1;
}
//sqxfunction.h内做声明
INT sqx_GetCharacterStrength(HSQUIRRELVM vm);
INT sqx_GetCharacterIntelligence(HSQUIRRELVM vm);
//sqfunctionhook.cpp内startRegistNewSqxFunction()中注册
registerFunction(L"sqx_GetCharacterStrength", sqx_GetCharacterStrength);
registerFunction(L"sqx_GetCharacterIntelligence", sqx_GetCharacterIntelligence);

阿荣社区采集员1 发表于 2025-3-10 21:07:23

此时我们已可以生成dll并挂载后,在pvf内部调用我们注册的sqx_GetCharacterStrength()与sqx_GetCharacterIntelligence();
并通过其获取的值在ap中来完成简单的力智平衡,以下代码为我在战灵潜能的procap中加入
local currentStrength = sqx_GetCharacterStrength();
local currentIntelligence = sqx_GetCharacterIntelligence();
local change_appendage = appendage.sq_getChangeStatus("zhanlingqianneng");
if(!change_appendage)
{change_appendage = appendage.sq_AddChangeStatus("zhanlingqianneng",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, false, 0);}
if(change_appendage)
{if(currentStrength < currentIntelligence )
{
local delta = (currentIntelligence - currentStrength).tofloat();   change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, false, delta);
}
else if(currentStrength > currentIntelligence)
{local delta = (-currentIntelligence + currentStrength).tofloat();change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_ATTACK, false, delta);
}
}

阿荣社区采集员1 发表于 2025-3-10 21:07:55

上面所有就是我周末的实验结果,对于sq的vm与C的关系只不过是一知半解
但动手操作了以上流程,已经对注册nut函数略有眉目,那么下面就轮到我的请教时间了

请问路过的大佬们
INT strength = readVal(0x1D5130C + 0x0400000);
是我通过CE查询出的当前角色属性基址,但对于支援兵,获取的仍为当前操控的角色属性,在我上一条中实现属性平衡的方式会导致支援兵出现的几秒内持续叠加主角色属性的差值,从而使得2l中的结果出现

我该怎样才能更聪明的得到obj的各属性值?求大佬指点

阿荣社区采集员 发表于 2025-3-10 21:08:25

意思是把当前角色的计算值加到了支援兵,然后因为当前角色数值没能平衡导致持续触发,最后支援兵属性暴增致使荣誉祝福数据爆炸?

阿苏 发表于 2025-3-10 21:08:36

奶志愿兵不好平衡,但是这个点对战法而言太伟大了啊!大佬牛逼

xiaomi 发表于 2025-3-10 21:09:29

627的吗?

阿荣社区采集员2 发表于 2025-3-10 21:09:55

那支援兵应该用apc的基址

阿荣社区采集员1 发表于 2025-3-10 21:10:06

技术贴先收藏

阿荣社区机器人 发表于 2025-3-10 21:11:06

技术贴先收藏,大佬牛逼!

阿荣社区采集员2 发表于 2025-3-10 21:11:47

不知道国服支援兵,吃药平衡吗,不重复平衡的话,把平衡的技能的nut中的附加ap改成进地下城,复活后,站街的时候,加自身buff技能触发一次,附加一个持续时间无限的补齐差值的buff,来规避掉支援兵入场时的力智平衡。好久不研究nut了不知道行不行

admin 发表于 2025-3-10 21:12:44

大佬有QQ吗
页: [1]
查看完整版本: [分享]nut注册的实现过程与简单的力智平衡