Board logo

标题: 关于移植fuland的ai过程中的笔记…… [打印本页]

作者: 喵喵の狗狗    时间: 2008-1-18 01:32     标题: 关于移植fuland的ai过程中的笔记……

本文是针对此次改版,ai的变化需要移植时的一个笔记性质的参考。
那啥,本人只是一个硬件工程师,软件啥的什么语法啊专业词汇啊,都不熟悉,说了外行话就无视吧。

第一步,文件的变化……

找到过去11-2版本以前的ai文件和11-3更新后的ai文件,进行初步的比较。

11-2的:
AI.lua14,066 字节2005-12-2211:22LUA 文件
Const.lua2,447 字节2005-12-2211:22LUA 文件
Util.lua2,663 字节2005-12-2211:22LUA 文件

11-3的:
AI.lua14,066 字节2005-9-279:15LUA 文件
AI_M.lua13,803 字节2008-1-1719:47LUA 文件
Const.lua3,111 字节2008-1-1719:47LUA 文件
Util.lua2,663 字节2005-6-289:41LUA 文件


就数量来说多了AI_M.lua这个文件,就大小来说Const.lua有了明显的变化,其中Const.lua只是一个用来放置参数编号的表。
就没有变化的AI.luaUtil.lua进行了逐行比较,没有任何变化,那么下一步的分析就放在AI_M.luaConst.lua上了。


第二步,Const.lua的变化……

打开2个Const.lua开始逐行比对
--  c function 无变化,这里是放置function

-- constants 多了V_MERTYPE = 12    -- 용병 종류一行,这个参数是佣兵种类的参数,具体设置在AI_M.lua中可以查到。

-- 호문클루스 종류 这个是生命体种类的参数,没有变化

-- 용병 종류 这个是佣兵种类等级的参数表如下:
弓箭手佣兵等级12345678910
代码12345678910
编码ARCHER01ARCHER02ARCHER03ARCHER04ARCHER05ARCHER06ARCHER07ARCHER08ARCHER09ARCHER10
枪兵佣兵等级12345678910
代码11121314151617181920
编码LANCER01LANCER02LANCER03LANCER04LANCER05LANCER06LANCER07LANCER08LANCER09LANCER10
剑士佣兵等级12345678910
代码21222324252627282930
编码SWORDMAN01SWORDMAN02SWORDMAN03SWORDMAN04SWORDMAN05SWORDMAN06SWORDMAN07SWORDMAN08SWORDMAN09SWORDMAN10


-- MOTION 无变化,这里是放置生命体或者佣兵的状态代码的

-- command 无变化,这是玩家的操作对应的代码

然后下面是对指令对应的韩文名的定义……

由此可见,Const.lua中针对11-3增加的佣兵部分变化不大,主要是增加了对AI_M.lua中的一部分代码的定义而已,并没有明显的指针等出现…………

第三步,AI_M.lua探秘……

其实一开始我就猜到一个问题,是不是也有相同的GetMyEnemy的相同function设定……(GetMyEnemy也就是自主寻敌部分,也就是有的人抱怨生命体不会主动攻击的原因,这里就是需要设置的地方。)
结果在全文件3/4处,我也没想过去研究第几行了,找到了这个function

这里要附加说明的,实际上在游戏中我们发现GetOwnerEnemy跟生命体的语句是完全一样的(重力社也知道偷懒啊)

语句如下:
function GetMyEnemy (myid)
local result = 0
local type = GetV (V_MERTYPE,myid)
if (type >= ARCHER01 and type <= SWORDMAN10) then
  result = GetMyEnemyA (myid)
else
  result = GetMyEnemyB (myid)
end
return result
end

-------------------------------------------
--  厚急傍屈 GetMyEnemy
-------------------------------------------
function GetMyEnemyA (myid)
local result = 0
local owner  = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local target
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
   end
  end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
  dis = GetDistance2 (myid,v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end
end
return result
end



-------------------------------------------
--  急傍屈 GetMyEnemy
-------------------------------------------
function GetMyEnemyB (myid)
local result = 0
local owner  = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local type
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
   end
  end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
  dis = GetDistance2 (myid,v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end
end
return result
end


如果你懂lua,我想你已经看懂这两段的意思了,第一段是攻击模式的判定,根据你的佣兵编码(不是代码),编码在第二步我已经列表出来了。其中,GetMyEnemyA是跟随护主,GetMyEnemyB是主动寻敌。

简单地说,现在的默认设定是,三种1-10级的佣兵都是GetMyEnemyA,因此如果你想要某一类及某一登记的佣兵要主动攻击,那么就修改成GetMyEnemyB即可。

这里放出应该修改的行段
既是:
if (type >= ARCHER01 and type <= SWORDMAN10) then
  result = GetMyEnemyA (myid)
else
  result = GetMyEnemyB (myid)
end


这里可以修改成:
if (type >= ARCHER01 and type <=ARCHER03 or type >= LANCER01 and type <=LANCER03 or type >= SWORDMAN01 and type <=SWORDMAN03 ) then
  result = GetMyEnemyA (myid)
elseif (type >= ARCHER04 and type <=ARCHER10 or type >= LANCER04 and type <=LANCER10 or type >= SWORDMAN04 and type <=SWORDMAN10) then
  result = GetMyEnemyB (myid)
end


意思是大于或等于4级的所有种类佣兵主动攻击,低于或等于3级的不主动攻击。

针对你的佣兵的级别你可以适量修改上面的佣兵编码来对应你的需求,或者找我定制。

如果你想所有等级的佣兵都主动攻击,那么请修改成

if (type >= ARCHER01 and type <= SWORDMAN10) then
  result = GetMyEnemyB (myid)
else
  result = GetMyEnemyA (myid)
end

即可



这里总结一下:
4个文件AI.luaAI_M.luaConst.luaUtil.lua
其中AI.lua是生命体的ai程序,跟佣兵的ai没有任何关系,使用过去旧的没有问题。
AI_M.lua是佣兵的ai程序,跟生命体的ai没有任何关系,按自己需求修改即可。
Const.lua是编码及代码表,请移植的时候将佣兵相关的语句也要写进去。
Util.lua是部分公式,目前AI.luaAI_M.lua的语句都没有超出这个公示表的,因此使用过去旧的没有问题。

针对旧的版本你所使用的ai移植,比如你想保留旧有的生命体ai的设定,又不干扰现有的佣兵的ai,是完全可以做到的,你只需要移植11-3中的Const.lua的佣兵编码,保留过去的AI.luaUtil.lua就行了。

这里添加一个不知道是不是重力社就有的bug,也就是/hoai指令并不能切换user_ai和ai根目录中的AI_M.lua,所以你如果要修改佣兵的ai,请直接修改ai目录下的即可。我个人认为是因为目前/hoai指令只是绑定了ai头语句下关联的lua文件而已。


修改好的ai已经放置于我的空间,文件名生命体AI免调整11-3老狗移植版.rar MD5值:e12fd309d0b55851b1b4408b8287927b,是基于fuland的生命体ai移植的。
我的空间地址为fengli1943.ys168.com,我的qq为140317494。


[ 本帖最后由 喵喵の狗狗 于 2008-1-18 02:55 编辑 ]
作者: 24950058    时间: 2008-1-18 01:33

这些字是他们认识我 我却不认识他们....
作者: 喵喵の狗狗    时间: 2008-1-18 01:35

如果不懂,直接去我空间下载拉现成的就可以了 其实很简单的。
作者: 南都夜夜    时间: 2008-1-18 02:02

我又想起来某个群...前几天在讨论FULAND是地名还是人
作者: 喵喵の狗狗    时间: 2008-1-18 02:46

由于白痴重力社的ai的getmyenemy部分是完全照搬生命体的,而生命体没有普攻是远距离攻击的类型。

因此开启主动攻击后也就是getmyenemyB后,默认的攻击方式是近身攻击。

我很想说草拟大爷,这个问题我将明天完善。


感谢不灭同学帮忙进行debug。
作者: natineprince    时间: 2008-1-18 08:52

好久没看过过程式的代码了...用惯BASIC/PASCAL的人看这个应该会很爽...
留言后再慢慢看...

[ 本帖最后由 natineprince 于 2008-1-18 08:53 编辑 ]
作者: -_-|||    时间: 2008-1-18 08:55

原帖由 南都夜夜 于 2008-1-18 02:02 发表
我又想起来某个群...前几天在讨论FULAND是地名还是人

FULAND

搜索引擎优化|网站排名|网站优化|网站推广公司-沈阳孚优科技
FULAND:我们是正规的搜索引擎优化公司,采用的是符合搜索引擎规则的优化技术。我们拒绝参与非法事件。涉嫌非法事件不仅有失到的风范,而且会带来严重后果--违反搜索引擎规则会遭受搜索引擎永久除名的惩罚。所以我们拒绝参与以下活动:作弊、关键字...
www.fuland.cn/ 13K 2008-1-16 - 百度快照


搜索引擎优化|网站排名|网站优化|网站推广公司-沈阳孚优科技孚优科技搜索引擎优化公司为客户网站排名提供专业周到的搜索引擎优化(SEO)服务,并积极推动搜索引擎优化在国内的发展,致力于网站优化、网站排名、网站推广方案和 ...
fuland.cn/ - 14k - 类似网页  

index002- 繁 - [ 转为简体网页 ]www.fuland.com.tw/ - 3k - 类似网页  






还是狗狗比腐烂好~~
作者: 脆奶虾    时间: 2008-1-18 08:55

啊喵……   我在你的空间下fuland这个目录下没找着你作的移植AI压缩包啊!  藏哪了……
作者: 永生不灭    时间: 2008-1-18 08:55

顺手搞个完全不攻击的吧,去研究拖个1级佣兵当替死鬼,关键时刻还可以让他破破冰
作者: natineprince    时间: 2008-1-18 08:59

原帖由 永生不灭 于 2008-1-18 08:55 发表
顺手搞个完全不攻击的吧,去研究拖个1级佣兵当替死鬼,关键时刻还可以让他破破冰

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
   end
  end
end
...索性整段获取敌人的代码去掉了...
这段去掉应该就不会攻击了吧...在代码的角度...

[ 本帖最后由 natineprince 于 2008-1-18 09:00 编辑 ]
作者: natineprince    时间: 2008-1-18 09:03

dis = GetDistance2 (myid,v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end

老狗试下把这段改成min_dis=0
看看会不会原地攻击
作者: fuland    时间: 2008-1-18 09:04

原帖由 南都夜夜 于 2008-1-18 02:02 发表
我又想起来某个群...前几天在讨论FULAND是地名还是人

.......................无语
作者: -_-|||    时间: 2008-1-18 09:05

原帖由 natineprince 于 2008-1-18 09:03 发表
dis = GetDistance2 (myid,v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end

老狗试下把这段改成min_dis=0
看看会不会原地攻击

会不会不攻击啊...


其实楼上的是搜索引擎
作者: natineprince    时间: 2008-1-18 09:05

原帖由 ||| 于 2008-1-18 09:05 发表

会不会不攻击啊...

我指远程系的...

搜索引擎?哦...了解了...那改掉这个就不会搜索...达到不主动打怪的目的了?

[ 本帖最后由 natineprince 于 2008-1-18 09:07 编辑 ]
作者: 南都夜夜    时间: 2008-1-18 09:07

原帖由 fuland 于 2008-1-18 09:04 发表

.......................无语

某雪还在那里说啥隔座大山野战什么的...
我说FULAND是个人...
却有人说FULAND=福建...
-v-
作者: 超越FIRE    时间: 2008-1-18 09:09

看到代码倍感亲切。。
作者: fuland    时间: 2008-1-18 09:10

原帖由 natineprince 于 2008-1-18 09:05 发表

我指远程系的...

搜索引擎?哦...了解了...那改掉这个就不会搜索...达到不主动打怪的目的了?

乐乐是笨蛋……


怎么会联系到福建……不可能有联系的啊……
作者: natineprince    时间: 2008-1-18 09:11

可以把GetActors ()那个函数发上来看看么?

我觉得上面那段不像是寻敌代码...反而GetActors ()这个像获取附近对象的.
作者: natineprince    时间: 2008-1-18 09:12

原帖由 fuland 于 2008-1-18 09:10 发表

乐乐是笨蛋……


怎么会联系到福建……不可能有联系的啊……

你索性整个文件发给我看好了...
作者: 南都夜夜    时间: 2008-1-18 09:14

原帖由 fuland 于 2008-1-18 09:10 发表

乐乐是笨蛋……


怎么会联系到福建……不可能有联系的啊……

A10:59:18
fuland是福州?
B10:59:26
…没啊…  
B11:00:10
福州你个头  
A 11:00:14
= =
A 11:00:17
那是啥
B11:00:21
…我没在山区打野战的爱好
作者: 喵喵の狗狗    时间: 2008-1-18 09:15

原始ai我也放到我空间了,你有需要可以看看

GetActors ()就是寻敌函数
作者: -_-|||    时间: 2008-1-18 09:16

原帖由 natineprince 于 2008-1-18 09:12 发表

你索性整个文件发给我看好了...

其实他们在水.....

文件可以在RO文件夹下面找到啊...
作者: natineprince    时间: 2008-1-18 09:22

function        GetActors () end
...
晕...
作者: natineprince    时间: 2008-1-18 09:23

原帖由 ||| 于 2008-1-18 09:16 发表

其实他们在水.....

文件可以在RO文件夹下面找到啊...

公司没RO啊...

老狗那里看到的function GetActors () end,实际应该是重载了的啊?
作者: 盛传    时间: 2008-1-18 09:29

佣兵的技能怎么使用呢。
这样改完的佣兵只会普攻吧
作者: 蜡烛鞭二郎    时间: 2008-1-18 09:48

技能代码我没有,我已经说过了。

但是我觉得这次这个是一双刃剑……因为部分技能和玩家技能重叠……可能会变成一个内挂性质的东西了…………
作者: natineprince    时间: 2008-1-18 09:50

function GetMyEnemyA (myid)
local result = 0//返回值,敌人
local owner  = GetV (V_OWNER,myid)//主人
local actors = GetActors ()//角色
local enemys = {}//敌人集
local index = 1
local target
//获取敌人集
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
   end
  end
end
local min_dis = 100
local dis
//当敌人集合中存在距离少于 min_dis 的,返回距离最近的敌人
for i,v in ipairs(enemys) do
  dis = GetDistance2 (myid,v)
  if (dis < min_dis) then
   result = v
   min_dis = dis
  end
end
return result
end

这次没理解错了吧...

LS又用2狼上这边啊...
作者: natineprince    时间: 2008-1-18 10:06


function OnATTACK_ST ()
TraceAI ("OnATTACK_ST")
//敌人不在视线内
if (true == IsOutOfSight(MyID,MyEnemy)) then -- ENEMY_OUTSIGHT_IN
  MyState = IDLE_ST
  TraceAI ("ATTACK_ST -> IDLE_ST")
  return
end
//敌人已死亡
if (MOTION_DEAD == GetV(V_MOTION,MyEnemy)) then   -- ENEMY_DEAD_IN
  MyState = IDLE_ST
  TraceAI ("ATTACK_ST -> IDLE_ST")
  return
end
  //在攻击范围外.状态变为 追
if (false == IsInAttackSight(MyID,MyEnemy)) then  -- ENEMY_OUTATTACKSIGHT_IN
  MyState = CHASE_ST
//移动片段.远程攻击关键?
  MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
  Move (MyID,MyDestX,MyDestY)
//移动片段END
  TraceAI ("ATTACK_ST -> CHASE_ST  : ENEMY_OUTATTACKSIGHT_IN")
  return
end

//没使用技能,则普攻
if (MySkill == 0) then
  Attack (MyID,MyEnemy)
else
//使用技能,则...SkillObject函数没看...
  if (1 == SkillObject(MyID,MySkillLevel,MySkill,MyEnemy)) then
   MyEnemy = 0
  end
  MySkill = 0
end
TraceAI ("ATTACK_ST -> ATTACK_ST  : ENERGY_RECHARGED_IN")
return

end

作者: 蜡烛鞭二郎    时间: 2008-1-18 10:10

原帖由 natineprince 于 2008-1-18 09:50 发表
function GetMyEnemyA (myid)
local result = 0//返回值,敌人
local owner  = GetV (V_OWNER,myid)//主人
local actors = GetActors ()//角色
local enemys = {}//敌人集
local index = 1
local target
...

这个只是锁敌,其实很关键的一点是距离判定和攻击距离设定,我还在看
作者: 蜡烛鞭二郎    时间: 2008-1-18 10:14

function        OnATTACK_ST ()下的
IsInAttackSight()函数应该就是锁敌距离判定了。

IsInAttackSight()的function在Util.lua下

打错了

[ 本帖最后由 蜡烛鞭二郎 于 2008-1-18 10:23 编辑 ]
作者: -_-|||    时间: 2008-1-18 10:17

支持狗狗...

半小时花区..不错的东西..
作者: natineprince    时间: 2008-1-18 10:19

原帖由 蜡烛鞭二郎 于 2008-1-18 10:14 发表
function        OnATTACK_ST ()下的
IsOutOfSight()函数应该就是锁敌距离判定了。

IsOutOfSight()的function在Util.lua下

IsInAttackSight这个才是锁敌吧?
作者: 蜡烛鞭二郎    时间: 2008-1-18 10:21

那看来要写弓箭手的ai,第一要增加一个GetMyEnemy来增加锁敌方式
还要增加一个IsInAttackSight来增加一个15格的攻击距离判定
因为默认的IsInAttackSight是怪物进入GetDistance的初始值就攻击的,也就是2格,不知道我理解错了没
作者: natineprince    时间: 2008-1-18 10:39

原帖由 蜡烛鞭二郎 于 2008-1-18 10:21 发表
那看来要写弓箭手的ai,第一要增加一个GetMyEnemy来增加锁敌方式
还要增加一个IsInAttackSight来增加一个15格的攻击距离判定
因为默认的IsInAttackSight是怪物进入GetDistance的初始值就攻击的,也就是2格,不 ...

V_ATTACKRANGE  = 4  -- 拱府 傍拜 裹困

关键是这个a     = GetV (V_ATTACKRANGE,id1).
其实.在这里做个判定就行了

也就是
IF(type >= ARCHER01 and type <= ARCHER10)a     = GetV (V_ATTACKRANGE,id1)+13 --不知道是不是13...
ELSE a     = GetV (V_ATTACKRANGE,id1)
END
作者: 蜡烛鞭二郎    时间: 2008-1-18 10:47

似乎可以,中午午休的时候我验证一下
作者: natineprince    时间: 2008-1-18 10:50

原帖由 蜡烛鞭二郎 于 2008-1-18 10:47 发表
似乎可以,中午午休的时候我验证一下

嗯...小H看到这贴又要喊你了...嘿嘿...2狼啊2狼...
作者: I钱I米    时间: 2008-1-18 11:34

不知道是不是错觉
空间无那个版本...
快点出一个带弓MM练级的吧
原版AI真蠢...
作者: 蜡烛鞭二郎    时间: 2008-1-18 11:37

在fuland目录下
作者: I钱I米    时间: 2008-1-18 11:42

和顶楼文件名不符- -..编辑下帖子吧,我之前还一直在找
生命体AI免调整11-3老狗移植版.rar


哪一个适合带弓MM?
期待弓箭手AI

[ 本帖最后由 I钱I米 于 2008-1-18 11:54 编辑 ]
作者: yzj    时间: 2008-1-18 12:18

下了狗狗的ai
我的生命体还是打玩家,要使这个玩家不走就会一直跟着
作者: leakely    时间: 2008-1-18 12:21

我的果冻依然"打"传送点`玩家\NPC

不知道怎么设置,只有等高手的补丁了

谢谢LZ
作者: 飞雪の轨迹    时间: 2008-1-18 12:35

原帖由 南都夜夜 于 2008-1-18 09:14 发表

A10:59:18
fuland是福州?
B10:59:26
…没啊…  
B11:00:10
福州你个头  
A 11:00:14
= =
A 11:00:17
那是啥
B11:00:21
…我没在山区打野战的爱好

我什么都不知道……[m_走开]
作者: yzj    时间: 2008-1-18 12:41

有时他打怪跑的太远或有障碍物的话都会卡在那,希望这个也修正下
作者: 蜡烛鞭二郎    时间: 2008-1-18 13:12

这些都是韩国官方ai本身的bug,我会去修复的……
作者: natineprince    时间: 2008-1-18 13:18

老狗加油...有空帮你看看..
作者: 蜡烛鞭二郎    时间: 2008-1-18 13:20

下午要跑客户,刚才一直在选布板……晚上再说吧
作者: yzj    时间: 2008-1-18 14:35

原帖由 蜡烛鞭二郎 于 2008-1-18 13:20 发表
下午要跑客户,刚才一直在选布板……晚上再说吧



等你的好消息哈
作者: chenfang    时间: 2008-1-18 14:37

顶顶顶顶巨顶暴顶狂顶XXX顶~

等你好消息!
作者: 拿黄瓜敲桌子    时间: 2008-1-18 21:31

偷偷水一下沉到不知名地区的帖子
作者: QQending    时间: 2008-1-18 21:47

厉害啊``楼主``````纯支持
作者: 星の封印    时间: 2008-1-18 21:52

7级弓兵还是蛮不错的..
佣兵就是防低......
能自动2连就好了..
GVG SG们.ZZ们全部带个弓兵.

作者: dsy163    时间: 2008-1-18 22:02

好东西!!!!!!!!
作者: upsangel    时间: 2008-1-19 00:48

好东西不顶有罪
作者: SY:为爱而生    时间: 2008-1-19 02:38

改完后


佣兵是见玩家就跟随....不理人..也不会过一会移动到玩家身边...


最要命的...打的过打不过的它都打....=_=

最好哪位高手..能看看改哪里是让佣兵优先使用技能打怪的??
作者: sfgn_1989    时间: 2008-5-31 10:51

喵喵太厉害。- -虽然我什么都看不懂
作者: jy0933    时间: 2008-8-21 15:31

如果说要让佣兵攻击不在视野内的怪
是不是

IsOutOfSight

下的改称attack状态

或者是改哪里了

说实话  开个佣兵就是为了没空手工练的时候用的
作者: 钱先生    时间: 2008-8-21 16:09

求弓兵远距离攻击AI_M
作者: 当猪爬上月亮    时间: 2008-8-21 16:13

我近距离都不能自动攻击 。。已经把A和B修改了- -
作者: jy0933    时间: 2008-8-21 16:20

ms我的版本弓兵本来就可以远程==  昨天半夜在花区混了一下  3级的弓兵打花miss
作者: ?命?    时间: 2008-8-21 16:43

我的佣兵完全不能控制走路,只能使用技能让他走上去释放 ALT+左右键都不行,生命体倒走上去了。

另外问问为什么装了杰的补丁使用补丁就一直AI跳框出错?我每次用完佣兵又改回去。
作者: jy0933    时间: 2008-8-21 18:01

我挖出了脚本里面的乱码 显示出韩文了。。。。

8过  有米人会韩文 翻译下。。。。。

현재 이동중인 목적지와 같은 곳이면 처리하지 않는다

车轮印实在看8懂
作者: 破月_解    时间: 2009-8-19 03:18

能不能自动放技能呢
作者: IceAgeII    时间: 2009-8-19 08:19

if (type >= ARCHER01 and type <=ARCHER03 or type >= LANCER01 and type <=LANCER03 or type >= SWORDMAN01 and type <=SWORDMAN03 ) then
  result = GetMyEnemyA (myid)
elseif (type >= ARCHER04 and type <=ARCHER10 or type >= LANCER04 and type <=LANCER10 or type >= SWORDMAN04 and type <=SWORDMAN10) then
  result = GetMyEnemyB (myid)
end

红字部分多余了把
作者: 喵喵の狗狗    时间: 2009-8-19 09:40

只是保持数据的冗余性而已。你觉得不严谨大可删除。
作者: 任雨悠    时间: 2009-8-19 14:38

看的头晕`~~还是不明白`~~~有直接能用的最好了~~
作者: 嗆口の爱    时间: 2009-11-7 10:32

看不太明白啊...是不是去老狗空间下11-3那个rar 然后任一生命体里面的AI_M和 Const覆盖到ro目录下的USER_AI
然后再打开ro目录下的USER_AI 里面的 AI_M  把它修改掉成下面的?
可是我这样弄了还是没有主动攻击......请教下我是不是弄错了 = =!!!
这里可以修改成:
if (type >= ARCHER01 and type <=ARCHER03 or type >= LANCER01 and type <=LANCER03 or type >= SWORDMAN01 and type <=SWORDMAN03 ) then
  result = GetMyEnemyA (myid)
elseif (type >= ARCHER04 and type <=ARCHER10 or type >= LANCER04 and type <=LANCER10 or type >= SWORDMAN04 and type <=SWORDMAN10) then
  result = GetMyEnemyB (myid)
end

意思是大于或等于4级的所有种类佣兵主动攻击,低于或等于3级的不主动攻击。

针对你的佣兵的级别你可以适量修改上面的佣兵编码来对应你的需求,或者找我定制。

如果你想所有等级的佣兵都主动攻击,那么请修改成
if (type >= ARCHER01 and type <= SWORDMAN10) then
  result = GetMyEnemyB (myid)
else
  result = GetMyEnemyA (myid)
end
作者: 喵喵の狗狗    时间: 2009-11-7 10:56

启动自定义佣兵ai的指令是/merai
作者: 嗆口の爱    时间: 2009-11-7 11:35

哦 谢谢.我刚弄了一下
我是吧AI_M覆盖到 AI目录下了 然后就成功了
就是佣兵容易跑到视线外面容易发呆....不怎么好用...
作者: 喵喵の狗狗    时间: 2009-11-7 11:36

可以改搜敌范围的,不过个人推荐不要随便改主动,很容易死机,比生命体还吃内存




欢迎光临 浆糊论坛-RO小站 (http://bbs.rohome.cn/) Powered by Discuz! 7.2