返回列表 发帖

ai修改方法

首先确定你的生命体的类型
精灵是LIF
鸟是FILIR
羊(也有人叫狗)是AMISTR
布丁(过着果冻)是VANILMIRTH

关于名字的定义可以参考Homunculus’s Artificial Intelligence User’s Manual.htm
其中提到如下:
有关GetV (V_HOMUNTYPE, id)的 归还值
LIF                =     1                   : 丽芙
AMISTR                =     2                   : 艾咪斯可鲁
FILIR                =     3                   : 飞里乐
VANILMIRTH        =     4                   : 巴尼米乐斯
LIF_H                =     5                   : 进化的 丽芙
AMISTR_H                =     6                   : 进化的 艾咪斯可鲁
FILIR_H                =     7                   : 进化的 飞里乐
VANILMIRTH_H        =     8                   : 进化的 巴尼米乐斯


然后打开你ro的文件夹,找到ai文件夹,可以看到4个文件和一个文件夹,用记事本打开ai.lua。

搜索字节
function        GetMyEnemy
然后会看到如下一段
function        GetMyEnemy (myid)
        local result = 0

        local type = GetV (V_HOMUNTYPE,myid)
        if (type == LIF or type == LIF_H or type == AMISTR or type == AMISTR_H) then
                result = GetMyEnemyA (myid)
        elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
                result = GetMyEnemyB (myid)

上面的result = GetMyEnemyA就是把攻击自己和主人作为敌人攻击,result = GetMyEnemyB 就是把所有的怪物作为敌人攻击。
(当然要声明的是npc怪物,比如艾思恩魔女面具中的3个npc就不会被当作怪物,虽然鼠标放上去会变成刀。)

现在就开始修改了

如果你想目前所有种类的生命体都处于非主动攻击状态
就把type == FILIR 还有type == VANILMIRTH 放置到result = GetMyEnemyA 中。
结果如下:
function        GetMyEnemy (myid)
        local result = 0

        local type = GetV (V_HOMUNTYPE,myid)
        if (type == LIF or type == LIF_H or type == AMISTR or type == AMISTR_H or type ==FILIR or type == VANILMIRTH) then
                result = GetMyEnemyA (myid)
        elseif (type == FILIR_H or type == VANILMIRTH_H) then
                result = GetMyEnemyB (myid)

如果想要目前所有种类的生命体都处于主动攻击状态
就修改成如下结果:
function        GetMyEnemy (myid)
        local result = 0

        local type = GetV (V_HOMUNTYPE,myid)
        if (type == LIF_H or type == AMISTR_H) then
                result = GetMyEnemyA (myid)
        elseif (type == LIF or type == AMISTR or type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
                result = GetMyEnemyB (myid)

保存修改结果就可以了,目前根据ai目录下的帮助档Homunculus’s Artificial Intelligence User’s Manual.htm中提到的ai脚本的作用如下

RO Client是从Client程序,在生命体新形成的时机,以解读AI.lua, Util.lua档案后,才会启动人工智能的。

因此只要重新启动游戏就能正常启用刚才的修改后的ai了。

如有什么不懂可以参考Homunculus’s Artificial Intelligence User’s Manual.htm,此脚本支持c++的所有脚本调试平台,使用语言为lua。

(八卦一句,根据天野和romp3的资料,这里脚本中写到的LIF_H,AMISTR_H,FILIR_H,VANILMIRTH_H这4种生命体的进化形态,10-3开启。)

[ 本帖最后由 喵喵の狗狗 于 2006-1-4 05:31 编辑 ]
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

上面的方法只是简单的修改,其实在帮助档中的
所谓“有我的敌人” 的条件是怎么判断的呢?
一处提到了如果让生命体判断敌人的方式中提到的具体的编译方法
for i,v in ipairs(actors) do

              if (v ~= owner and v ~= myid) then
                     target = GetV (V_TARGET,v)                           
                     if (target == myid) then                              
                            enemys[index] = v  
                            index = index+1

这是只攻击已经攻击了自己或者主人的语段

V_TARGET                =     5                  -- 攻击或是使用技能目标 归还
这是V_TARGET的说明

以及
for i,v in ipairs(actors) do
              if (v ~= owner and v ~= myid) then
                     if (1 == IsMonster(v))     then
                            enemys[index] = v            
                            index = index+1

这是对于视野中所有怪物攻击的语段

13)  IsMonster (id)
id : 游戏内的物体
归还值 : id 所包含的东西是魔物的话可归换1,若不是的话可归换为0
机能 : 可判别魔物

这是monster语句的说明

上面的v都是默认变量名

这就是其中的不同之处了
如果直接把GetMyEnemyB部分的语句替换成GetMyEnemyA相同的
也可以起到相同的作用,当然事先最好备份好初始的ai就行了

[ 本帖最后由 喵喵の狗狗 于 2006-1-4 05:28 编辑 ]
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

至于你提到的治愈技能自动使用方面
在command process  这一部分有写,目前我还在研究,因为这个技能是直接点击后对主人使用,我只找到了固定时间使用这个技能的方法,而根据主人hp修改的方法还不知道怎么编译,应该能很快找到方法吧。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

这里无聊贴上我在romp3找到的进化型lif的图片,似乎有2个姿态阿



[ 本帖最后由 喵喵の狗狗 于 2006-1-4 05:12 编辑 ]
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

附加,在帮助档里也提到了如何切换ai的方法:
3) 增加了使用者人工智能档案夹,有基本的人工智能和使用者人工智能,还增加了两者转换的键盘输入和对话窗命令语,

使用者人工智能档案夹里,基本上提供的人工智能,是不会受改版的影响而制作的,

使用者人工智能档案夹里,人工智能剧本启动的必要条件是,AI.lua 档案和定义 AI.lua 档案的 AI (myid) 函数。

/生命体智能或是在对话窗口输入 /hoai,会转换成人工智能和使用者人工智能的,假如有仙境玩家想要使用自己制作的人工智能剧本的话,请在先有的

AI 档案夹里面,在USER_AI 档案夹里复制剧本即可。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

目前根据我的修改alt+t切换的状态跟ai文本无关,是强制切换为OnHOLD_CMD_ST+OnSTOP_CMD_ST+OnFOLLOW_ST,通过修改ai只能更改alt+鼠标指令后生命体的ai

可以通过替换OnHOLD_CMD_ST,OnSTOP_CMD_ST,OnFOLLOW_ST这3个语段来试验,经过试验并没有影响到alt+t的效果。

[ 本帖最后由 喵喵の狗狗 于 2006-1-4 07:09 编辑 ]
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

如果你已经对计算机语言有所了解,那么可以参考这篇文章来初步了解lua语言的使用方法
http://202.113.13.169/site/mybbs/read.php?tid=35
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

解读util.lua

--------------------------------------------
-- List utility
--------------------------------------------

这一部分是对list系函数的编译,说明档中翻译成数据的顺序构成
分别是7条函数变量
List.new ()                           -- 新的清单 归还
List.pushleft (list, value)                   -- list 左边的要素增加
List.pushright (list, value)          -- list 右边的要素增加
List.popleft (list)                  -- 把 list 左边的第一个数值拿过来
List.popright (list)                -- 把 list 右边的第一个数值拿过来
List.clear (list)                      --把 list 清空
List.size (list)                       --在 list 里面的要素个数

这部分可以不必修改

接着是对距离的定义
第一段是GetDistance,这是所有距离的运算公式的定义,用的是最基本的利用勾股定理的运算,当然不会错啦,不用修改。

第二段是GetDistance2,这是对距离判定的函数,针对所有物体。呃……也没有人需要改这个吧……

第三段是GetOwnerPosition,当然是对主人方位的判定啦,定义上也没有问题。

第四段是GetDistanceFromOwner,这是根据上断判断自己与主人距离的,也没有问题。

第五段是IsOutOfSight,这是对第2断的补充,用以判断物体是否超出视野,默认判定距离是20,这里想让自己的生命体不乱飞的同志就可以修改了,比如你召唤的是飞里乐,那么就可以把这个距离设定到你希望的距离,比如老鹰的12,魔法的10,之类的。

第六段是IsInAttackSight,也是对第2段的补充,是对敌人使用技能及攻击时,判断距离是否超出攻击范围。

完结

函数中的变量可以参考Homunculus’s Artificial Intelligence User’s Manual.htm中的
3- 仙境传说Client端 内建函数 说明
一段,这里有交待,这些变量在roClient中都是预先定义好的,看来alt+t指令也是如此。
但是先要区分id1 : 攻击者 id2 : 非攻击者就行了。

[ 本帖最后由 喵喵の狗狗 于 2006-1-4 08:56 编辑 ]
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

要能讨论出一个结果才是,我也是第一次使用lua,虽然跟c相似处很多,但是实际上主要运用的都是function构成的函数,其实只要分清楚变量,略懂c的人也参与编译。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

目前根据ai文件的内容可以,但是我不知道生命体技能在Client中的对应名是什么。上面提供了编译的地方
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

ai.lua中

function OnSKILL_OBJECT_CMD_ST ()
       
end

这一段就是留给填写技能的语句,目前次句未被编译。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

原帖由 暗黑殿堂 于 2006-1-4 09:47 发表


明显是后面一个好看啊


大家还是讨论楼主的问题吧……如果还是争论这个图片我就编辑掉了,其实我也希望有懂lua的达人能解决这个问题。目前似乎wow也用到了lua脚本
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

你的如果是飞里乐(就是鸟)或者巴尼米乐斯 (果冻)默认ai的都是设定的会主动攻击的,如果你的是丽芙(精灵)或者艾咪斯可鲁(羊或者狗)就不会。
渣渣!你们信誓旦旦的表忠心,却连工会激活码都不找喧哗要。 将功补过,快一人激活5个帐号先。哪个渣渣能够立下首功,就将得到yaloo的青睐。

TOP

返回列表