Board logo

标题: [历史] 转自巴哈姆特 會自動使用技能的人工AI [打印本页]

作者: xppx    时间: 2006-1-7 20:06     标题: 转自巴哈姆特 會自動使用技能的人工AI

完成了~~~會自動使用技能的人工AI改好了~~!!
我一直在想到底要不要分享上來,因為不知道會不會被當成BB而刪文!
若是要把我修改的程式拿去別的地方以自己的名義PO我也沒話說.....
因為現在人工AI是過渡時期的程式,聽說末來RO會出連不會寫程式的人也可以修改AI的相關程式,所以我想分享給你們也沒差,只是暫時性而以!

先分享我的飛里樂吧^^

名字:雪風
LV30 (因為都在想程式及考試,沒時間練)
Atk Matk Hit cri Def Mdef Flee Aspd Hp  Sp
144 37  78  10  16  7   89  149  1885 148
親密度:※非常親密※^^
(因為寫程式時隨時都要TEST,所以RO是開著的,順便慢慢餵)

AI.lua的RAR壓縮檔http://zerogo2000.myweb.hinet.net/AI.rar
基本上我是以各類型的人工生命都可以使用為出發點而修改!
修改的內容:
1.所有類型生命體皆改為主動攻擊,但可介由按ALT+T暫時更改為被動(主人被打時才攻擊)
2.自動使用技能

自動使用技能條件:
1.麗芙:玩家或自己HP低於25%時自動補血
2.小羊:玩家或自己HP低於25%時使用位置互換(被攻擊時)
3.飛里樂和果凍:自己SP滿時或自己HP低於25%時自動對魔物使用攻擊技能,攻擊技能在切換為跟隨模式時所使用的技能等級限制為1級

注意事項:
1.請把AI.lua放在Program Files\Gravity\RO\AI\USER_AI資料夾下(原來的AI記得備份喔),遊戲中在對話欄輸入/hoai從基本人工AI切換成使用者人工AI,再把生命體重新召喚出來就可以了!
2.若發生錯誤一直沒辦法正常動作,請關掉RO程式,把我的AI換回原本RO附上的AI就好了!
3.要使用我的AI時,基本技能等級一定要5級,沒有點到5級我不保證不會發生錯誤!
4.因為小弟我是用飛里樂TEST,我保證飛里樂不會發生錯誤,其他玩家若有錯誤的話請回報一下錯誤時跳出的訊息視窗,好讓我再修改

[ 本帖最后由 xppx 于 2006-1-7 23:19 编辑 ]
作者: lvke19890624    时间: 2006-1-7 20:08     标题: ...

复制下载地址
在IE的地址栏中输入。。。
作者: xppx    时间: 2006-1-7 20:20

要是谁能下在 能不能再发个上来
作者: 看客    时间: 2006-1-7 20:36

的确不能下载
不过根据底下台湾网友的回帖,说明他们可以下载
作者: らёгαρん    时间: 2006-1-7 21:42

估计是HI-NET的空间....
大陆的IP是无法连接的
用代理的朋友试试看下载吧

另寒那只鸟的名字
作者: 非注册用户    时间: 2006-1-7 22:26

  1. require "./AI/Const.lua"
  2. require "./AI/Util.lua"                                       

  3. -----------------------------
  4. -- RO的技能常数
  5. -----------------------------
  6. --[[
  7. 丽芙-治癒之手                = 8001
  8. 丽芙-轻捷移动                = 8002
  9. 丽芙-脑手术                = 8003
  10. 丽芙-智力变换                = 8004(未开放)
  11. 艾咪斯可鲁-位置互换        = 8005
  12. 艾咪斯可鲁-防御力        = 8006
  13. 艾咪斯可鲁-活命之肤        = 8007
  14. 艾咪斯可鲁-血的贪求        = 8008(未开放)
  15. 飞里乐-月光                = 8009
  16. 飞里乐-横越速度                = 8010
  17. 飞里乐-紧急回避                = 8011
  18. 飞里乐-S.B.R.44                = 8012(未开放)
  19. 巴尼米乐斯-善变                = 8013
  20. 巴尼米乐斯-混乱的祈福        = 8014
  21. 巴尼米乐斯-变更指示        = 8015
  22. 巴尼米乐斯-生物爆炸        = 8016(未开放)
  23. --]]
  24. -----------------------------
  25. -----------------------------
  26. -- state
  27. -----------------------------
  28. IDLE_ST                                = 0                -- 休息(发呆)
  29. FOLLOW_ST                        = 1                -- 跟随
  30. CHASE_ST                        = 2                -- 追纵
  31. ATTACK_ST                        = 3                -- 攻击中
  32. MOVE_CMD_ST                        = 4                -- 移动
  33. STOP_CMD_ST                        = 5                -- 停止
  34. ATTACK_OBJECT_CMD_ST                = 6                -- 攻击某物的状态
  35. ATTACK_AREA_CMD_ST                = 7                -- 攻击某区域
  36. PATROL_CMD_ST                        = 8                -- 侦查中
  37. HOLD_CMD_ST                        = 9                -- 死守中
  38. SKILL_OBJECT_CMD_ST                = 10                -- 对某物使用技能时
  39. SKILL_AREA_CMD_ST                = 11                -- 对某区域使用技能时
  40. FOLLOW_CMD_ST                        = 12                -- 跟随某物
  41. ----------------------------
  42. ------------------------------------------
  43. -- Global variable
  44. ------------------------------------------
  45. MyState                                = IDLE_ST        -- 最初的状态是 休息
  46. MyEnemy                                = 0                -- 敌人的 id
  47. MyDestX                                = 0                -- 目前位置 x
  48. MyDestY                                = 0                -- 目前位置 y
  49. MyPatrolX                        = 0                -- 侦查 目的地 x
  50. MyPatrolY                        = 0                -- 侦查 目的地 y
  51. ResCmdList                        = List.new()        -- 预约 命令 清单
  52. MyID                                = 0                -- 生命体 id
  53. MySkill                                = 0                -- 生命体技能
  54. MySkillLevel                        = 0                -- 生命体技能等级
  55. ------------------------------------------


  56. ------------- command process  ---------------------

  57. function        OnMOVE_CMD (x,y)
  58.        
  59.         TraceAI ("OnMOVE_CMD")

  60.         if ( x == MyDestX and y == MyDestY and MOTION_MOVE == GetV(V_MOTION,MyID)) then
  61.                 return                --
  62.         end

  63.         local curX, curY = GetV (V_POSITION,MyID)
  64.         if (math.abs(x-curX)+math.abs(y-curY) > 15) then                -- 迹瞳虽陛 橾姜 剪葬 桧鼻桧贼 (怃帼缣怃 试剪葬朝 籀葬虽 强晦 阳侥缣)
  65.                 List.pushleft (ResCmdList,{MOVE_CMD,x,y})                        -- 锰楚 迹瞳虽煎暧 桧翕击 蕨擒棻.        
  66.                 x = math.floor((x+curX)/2)                                                        -- 酝除虽薄戏煎 试荡 桧翕棻.  
  67.                 y = math.floor((y+curY)/2)                                                        --
  68.         end

  69.         Move (MyID,x,y)       
  70.        
  71.         MyState = MOVE_CMD_ST
  72.         MyDestX = x
  73.         MyDestY = y
  74.         MyEnemy = 0
  75.         MySkill = 0

  76. end




  77. function        OnSTOP_CMD ()

  78.         TraceAI ("OnSTOP_CMD")

  79.         if (GetV(V_MOTION,MyID) ~= MOTION_STAND) then
  80.                 Move (MyID,GetV(V_POSITION,MyID))
  81.         end
  82.         MyState = IDLE_ST
  83.         MyDestX = 0
  84.         MyDestY = 0
  85.         MyEnemy = 0
  86.         MySkill = 0

  87. end




  88. function        OnATTACK_OBJECT_CMD (id)

  89.         TraceAI ("OnATTACK_OBJECT_CMD")

  90.         MySkill = 0
  91.         MyEnemy = id
  92.         MyState = CHASE_ST

  93. end




  94. function        OnATTACK_AREA_CMD (x,y)

  95.         TraceAI ("OnATTACK_AREA_CMD")

  96.         if (x ~= MyDestX or y ~= MyDestY or MOTION_MOVE ~= GetV(V_MOTION,MyID)) then
  97.                 Move (MyID,x,y)       
  98.         end
  99.         MyDestX = x
  100.         MyDestY = y
  101.         MyEnemy = 0
  102.         MyState = ATTACK_AREA_CMD_ST
  103.        
  104. end



  105. function        OnPATROL_CMD (x,y)

  106.         TraceAI ("OnPATROL_CMD")

  107.         MyPatrolX , MyPatrolY = GetV (V_POSITION,MyID)
  108.         MyDestX = x
  109.         MyDestY = y
  110.         Move (MyID,x,y)
  111.         MyState = PATROL_CMD_ST

  112. end




  113. function        OnHOLD_CMD ()

  114.         TraceAI ("OnHOLD_CMD")

  115.         MyDestX = 0
  116.         MyDestY = 0
  117.         MyEnemy = 0
  118.         MyState = HOLD_CMD_ST

  119. end




  120. function        OnSKILL_OBJECT_CMD (level,skill,id)

  121.         TraceAI ("OnSKILL_OBJECT_CMD")

  122.         MySkillLevel = level
  123.         MySkill = skill
  124.         MyEnemy = id
  125.         MyState = CHASE_ST

  126. end




  127. function        OnSKILL_AREA_CMD (level,skill,x,y)

  128.         TraceAI ("OnSKILL_AREA_CMD")

  129.         Move (MyID,x,y)
  130.         MyDestX = x
  131.         MyDestY = y
  132.         MySkillLevel = level
  133.         MySkill = skill
  134.         MyState = SKILL_AREA_CMD_ST
  135.        
  136. end




  137. function        OnFOLLOW_CMD ()

  138.         -- 系统接收到RO的ALT+T
  139.         if (MyState ~= FOLLOW_CMD_ST) then
  140.                 MoveToOwner (MyID)
  141.                 MyState = FOLLOW_CMD_ST
  142.                 MyDestX, MyDestY = GetV (V_POSITION,GetV(V_OWNER,MyID))
  143.                 MyEnemy = 0
  144.                 MySkill = 0
  145.                 TraceAI ("OnFOLLOW_CMD")
  146.         else
  147.                 MyState = IDLE_ST
  148.                 MyEnemy = 0
  149.                 MySkill = 0
  150.                 TraceAI ("FOLLOW_CMD_ST --> IDLE_ST")
  151.         end

  152. end




  153. function        ProcessCommand (msg)

  154.         if                (msg[1] == MOVE_CMD) then
  155.                 OnMOVE_CMD (msg[2],msg[3])
  156.                 TraceAI ("MOVE_CMD")
  157.         elseif        (msg[1] == STOP_CMD) then
  158.                 OnSTOP_CMD ()
  159.                 TraceAI ("STOP_CMD")
  160.         elseif        (msg[1] == ATTACK_OBJECT_CMD) then
  161.                 OnATTACK_OBJECT_CMD (msg[2])
  162.                 TraceAI ("ATTACK_OBJECT_CMD")
  163.         elseif        (msg[1] == ATTACK_AREA_CMD) then
  164.                 OnATTACK_AREA_CMD (msg[2],msg[3])
  165.                 TraceAI ("ATTACK_AREA_CMD")
  166.         elseif        (msg[1] == PATROL_CMD) then
  167.                 OnPATROL_CMD (msg[2],msg[3])
  168.                 TraceAI ("PATROL_CMD")
  169.         elseif        (msg[1] == HOLD_CMD) then
  170.                 OnHOLD_CMD ()
  171.                 TraceAI ("HOLD_CMD")
  172.         elseif        (msg[1] == SKILL_OBJECT_CMD) then
  173.                 OnSKILL_OBJECT_CMD (msg[2],msg[3],msg[4],msg[5])
  174.                 TraceAI ("SKILL_OBJECT_CMD")
  175.         elseif        (msg[1] == SKILL_AREA_CMD) then
  176.                 OnSKILL_AREA_CMD (msg[2],msg[3],msg[4],msg[5])
  177.                 TraceAI ("SKILL_AREA_CMD")
  178.         elseif        (msg[1] == FOLLOW_CMD) then
  179.                 OnFOLLOW_CMD ()
  180.                 TraceAI ("FOLLOW_CMD")
  181.         end
  182. end




  183. -------------- state process  --------------------


  184. --------------------------------------------------
  185. -- 休息(发呆) ST
  186. --------------------------------------------------
  187. function        OnIDLE_ST ()
  188.        
  189.         TraceAI ("OnIDLE_ST")

  190.         local cmd = List.popleft(ResCmdList)
  191.         if (cmd ~= nil) then               
  192.                 ProcessCommand (cmd)        -- 执行预约命令
  193.                 return
  194.         end

  195.         local        object = GetOwnerEnemy (MyID)
  196.         if (object ~= 0) then                -- 取得主人的敌人ID
  197.                 MyState = CHASE_ST
  198.                 MyEnemy = object
  199.                 TraceAI ("IDLE_ST -> CHASE_ST : MYOWNER_ATTACKED_IN")
  200.                 return
  201.         end

  202.         object = GetMyEnemy (MyID)
  203.         if (object ~= 0) then                -- 取得自己的敌人ID
  204.                 MyState = CHASE_ST
  205.                 MyEnemy = object
  206.                 TraceAI ("IDLE_ST -> CHASE_ST : ATTACKED_IN")
  207.                 return
  208.         end

  209.         local distance = GetDistanceFromOwner(MyID)
  210.         if ( distance > 2 or distance == -1) then        -- 与主人的距离 > 2格时开始跟随
  211.                 MyState = FOLLOW_ST
  212.                 TraceAI ("IDLE_ST -> FOLLOW_ST")
  213.                 return;
  214.         end

  215. end

  216. --------------------------------------------------------------
  217. --     没事时自动跟随主人
  218. --------------------------------------------------------------
  219. function        OnFOLLOW_ST ()

  220.         TraceAI ("OnFOLLOW_ST")

  221.         if (GetDistanceFromOwner(MyID) <= 2) then        --  DESTINATION_ARRIVED_IN
  222.                 MyState = IDLE_ST
  223.                 TraceAI ("FOLLOW_ST -> IDLW_ST")
  224.                 return;
  225.         elseif (GetV(V_MOTION,MyID) == MOTION_STAND) then
  226.                 MoveToOwner (MyID)
  227.                 TraceAI ("FOLLOW_ST -> FOLLOW_ST")
  228.                 return;
  229.         end

  230. end

  231. ---------------------------------------------------------------
  232. --                   追踪中ST
  233. ---------------------------------------------------------------
  234. function        OnCHASE_ST ()
  235.        
  236.         TraceAI ("OnCHASE_ST")

  237.         if (true == IsOutOfSight(MyID,MyEnemy)) then        -- IF人工生命和魔物为不可视距离
  238.                 MyState = IDLE_ST
  239.                 MyEnemy = 0
  240.                 MyDestX, MyDestY = 0,0
  241.                 TraceAI ("CHASE_ST -> IDLE_ST : ENEMY_OUTSIGHT_IN")
  242.                 return
  243.         end

  244.         if (true == IsInAttackSight(MyID,MyEnemy)) then -- IF人工生命正在对目标攻击或使用技能
  245.                 MyState = ATTACK_ST
  246.                 TraceAI ("CHASE_ST -> ATTACK_ST : ENEMY_INATTACKSIGHT_IN")
  247.                 return
  248.         end

  249.         local x, y = GetV (V_POSITION,MyEnemy)
  250.         if (MyDestX ~= x or MyDestY ~= y) then                -- 改变现在的位置到目标的位置去
  251.                 MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
  252.                 Move (MyID,MyDestX,MyDestY)
  253.                 TraceAI ("CHASE_ST -> CHASE_ST : DESTCHANGED_IN")
  254.                 return
  255.         end

  256. end

  257. ---------------------------------------------------------------
  258. --                   攻击中 ST
  259. ---------------------------------------------------------------
  260. function        OnATTACK_ST ()

  261.         TraceAI ("OnATTACK_ST")
  262.         local         HPp = GetV (V_HP,MyID) / GetV (V_MAXHP,MyID)        -- HP%
  263.         local         SPp = GetV (V_SP,MyID) / GetV (V_MAXSP,MyID)        -- SP%
  264.         local         owner = GetV (V_OWNER,MyID)
  265.         local         OHPp = GetV (V_HP,owner) / GetV (V_MAXHP,owner)        -- OWNER HP%
  266.         local         OSPp = GetV (V_SP,owner) / GetV (V_MAXSP,owner)        -- OWNER SP%
  267.         local         type = GetV (V_HOMUNTYPE,MyID)
  268.         if (true == IsOutOfSight(MyID,MyEnemy)) then        -- IF敌人和人工生命为不可视距离
  269.                 MyState = IDLE_ST
  270.                 TraceAI ("ATTACK_ST -> IDLE_ST")
  271.                 return
  272.         end

  273.         if (MOTION_DEAD == GetV(V_MOTION,MyEnemy)) then  -- 敌人死亡
  274.                 MyState = IDLE_ST
  275.                 TraceAI ("ATTACK_ST -> IDLE_ST")
  276.                 return
  277.         end
  278.                
  279.         if (false == IsInAttackSight(MyID,MyEnemy)) then  -- 敌人逃跑时追过去
  280.                 MyState = CHASE_ST
  281.                 MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
  282.                 Move (MyID,MyDestX,MyDestY)
  283.                 TraceAI ("ATTACK_ST -> CHASE_ST  : ENEMY_OUTATTACKSIGHT_IN")
  284.                 return
  285.         end

  286.         if (MySkill == 0) then                                -- 非使用技能状态
  287.         ---------------------自动使用技能区块----------------------------------------------------------
  288.                 if (GetV (V_SP,MyID) >= 25) then
  289.                         if (type == AMISTR or type == AMISTR_H) then
  290.                                 if ((OHPp <= 0.25 or HPp <= 0.25) and MOTION_ATTACK == GetV(V_MOTION,GetMyEnemy (MyID))) then
  291.                                         MySkill = AutoSkillSet (MyID)        -- 羊
  292.                                         MySkillLevel = 5                -- 技能等级请自行设定
  293.                                         SkillObject (MyID,MySkillLevel,MySkill,owner)
  294.                                         TraceAI ("OnAutoSkill")
  295.                                 end
  296.                         elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
  297.                                 if (HPp <= 0.25 or SPp == 1) then
  298.                                         MySkill = AutoSkillSet (MyID)        -- 飞里乐 和 布丁
  299.                                         MySkillLevel = 5                -- 技能等级请自行设定
  300.                                         SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
  301.                                         TraceAI ("OnAutoSkill")
  302.                                 end
  303.                         end
  304.                         MySkill = 0
  305.                 end
  306.         -----------------------------------------------------------------------------------------------
  307.                 Attack (MyID,MyEnemy)
  308.         else                                                -- 技能使用状态
  309.                 SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
  310.                 TraceAI (string.format("MySkillLevel: %d,MySkill:%d",MySkillLevel,MySkill))
  311.                 MySkill = 0
  312.         end
  313.         TraceAI ("ATTACK_ST -> ATTACK_ST  : ENERGY_RECHARGED_IN")
  314.         return

  315. end

  316. ----------------------------------------------------------------
  317. --                 移动到指定位置
  318. ----------------------------------------------------------------
  319. function        OnMOVE_CMD_ST ()

  320.         TraceAI ("OnMOVE_CMD_ST")

  321.         local x, y = GetV (V_POSITION,MyID)
  322.         if (x == MyDestX and y == MyDestY) then        -- 到达指定位置时
  323.                 MyState = IDLE_ST                -- 可改成指定ST
  324.         end
  325. end

  326. ----------------------------------------------------------------
  327. --                 STOP (可程式)
  328. ----------------------------------------------------------------
  329. function         OnSTOP_CMD_ST ()

  330.         -- TraceAI ("OnSTOP_CMD_ST")
  331.         -- MyState = HOLD_CMD_ST

  332. end

  333. ----------------------------------------------------------------
  334. --                 攻击目标命令 (可程式)
  335. ----------------------------------------------------------------
  336. function OnATTACK_OBJECT_CMD_ST ()



  337. end

  338. ----------------------------------------------------------------
  339. --                 区域攻击
  340. ----------------------------------------------------------------
  341. function OnATTACK_AREA_CMD_ST ()

  342.         TraceAI ("OnATTACK_AREA_CMD_ST")

  343.         local        object = GetOwnerEnemy (MyID)
  344.         if (object == 0) then                                                       
  345.                 object = GetMyEnemy (MyID)
  346.         end

  347.         if (object ~= 0) then                                                        -- MYOWNER_ATTACKED_IN or ATTACKED_IN
  348.                 MyState = CHASE_ST
  349.                 MyEnemy = object
  350.                 return
  351.         end

  352.         local x , y = GetV (V_POSITION,MyID)
  353.         if (x == MyDestX and y == MyDestY) then                        -- DESTARRIVED_IN
  354.                         MyState = IDLE_ST
  355.         end

  356. end

  357. ----------------------------------------------------------------
  358. --                 侦查中
  359. ----------------------------------------------------------------
  360. function OnPATROL_CMD_ST ()

  361.         TraceAI ("OnPATROL_CMD_ST")

  362.         local        object = GetOwnerEnemy (MyID)
  363.         if (object == 0) then                                                       
  364.                 object = GetMyEnemy (MyID)
  365.         end

  366.         if (object ~= 0) then                                                        -- MYOWNER_ATTACKED_IN or ATTACKED_IN
  367.                 MyState = CHASE_ST
  368.                 MyEnemy = object
  369.                 TraceAI ("PATROL_CMD_ST -> CHASE_ST : ATTACKED_IN")
  370.                 return
  371.         end

  372.         local x , y = GetV (V_POSITION,MyID)
  373.         if (x == MyDestX and y == MyDestY) then                        -- DESTARRIVED_IN
  374.                 MyDestX = MyPatrolX
  375.                 MyDestY = MyPatrolY
  376.                 MyPatrolX = x
  377.                 MyPatrolY = y
  378.                 Move (MyID,MyDestX,MyDestY)
  379.         end

  380. end

  381. ----------------------------------------------------------------
  382. -- 守候(死守)..游戏中指令控制是否进入,程式不会自动进入此回圈
  383. ----------------------------------------------------------------
  384. function OnHOLD_CMD_ST ()

  385.         TraceAI ("OnHOLD_CMD_ST")
  386.        
  387.         if (MyEnemy ~= 0) then
  388.                 local d = GetDistance(MyEnemy,MyID)
  389.                 if (d ~= -1 and d <= GetV(V_ATTACKRANGE,MyID)) then
  390.                                 Attack (MyID,MyEnemy)
  391.                 else
  392.                         MyEnemy = 0;
  393.                 end
  394.                 return
  395.         end

  396.         local        object = GetOwnerEnemy (MyID)
  397.         if (object == 0) then                                                       
  398.                 object = GetMyEnemy (MyID)
  399.                 if (object == 0) then                                               
  400.                         return
  401.                 end
  402.         end

  403.         MyEnemy = object

  404. end

  405. ----------------------------------------------------------------
  406. -- 对物体目标使用技能(可程式)
  407. ----------------------------------------------------------------
  408. function OnSKILL_OBJECT_CMD_ST ()
  409.        
  410. end

  411. ----------------------------------------------------------------
  412. -- 对区域使用技能
  413. ----------------------------------------------------------------
  414. function OnSKILL_AREA_CMD_ST ()

  415.         TraceAI ("OnSKILL_AREA_CMD_ST")

  416.         local x , y = GetV (V_POSITION,MyID)
  417.         if (GetDistance(x,y,MyDestX,MyDestY) <= GetV(V_SKILLATTACKRANGE,MyID,MySkill)) then        -- DESTARRIVED_IN
  418.                 SkillGround (MyID,MySkillLevel,MySkill,MyDestX,MyDestY)
  419.                 MyState = IDLE_ST
  420.                 MySkill = 0
  421.         end

  422. end


  423. ----------------------------------------------------------------
  424. -- 跟随主人(系统指令)   相当於ALT+T
  425. ----------------------------------------------------------------
  426. function OnFOLLOW_CMD_ST ()

  427.         local        object = GetOwnerEnemy (MyID)
  428.         local         x, y
  429.         local         SPp = GetV (V_SP,MyID) / GetV (V_MAXSP,MyID)        -- SP%
  430.         local         type = GetV (V_HOMUNTYPE,MyID)
  431.         if (object ~= 0) then                -- 取得主人的敌人ID
  432.                 MyEnemy = object
  433.                 if (false == IsInAttackSight(MyID,MyEnemy)) then -- IF人工生命正在对目标攻击或使用技能
  434.                         MyDestX, MyDestY = GetV (V_POSITION,MyEnemy)
  435.                         Move (MyID,MyDestX,MyDestY)
  436.                         return
  437.                 end
  438.                 if (MySkill == 0) then                                -- 非使用技能状态
  439.         ----------------------------------自动使用技能区块---------------------------------
  440.                         if (GetV (V_SP,MyID) >= 25) then
  441.                                 if (type == AMISTR or type == AMISTR_H) then
  442.                                         if ((OHPp <= 0.25 or HPp <= 0.25) and MOTION_ATTACK == GetV(V_MOTION,GetMyEnemy (MyID))) then
  443.                                                 MySkill = AutoSkillSet (MyID)        -- 羊
  444.                                                 MySkillLevel = 5                -- 技能等级请自行设定
  445.                                                 SkillObject (MyID,MySkillLevel,MySkill,owner)
  446.                                         TraceAI ("OnAutoSkill")
  447.                                         end
  448.                                 elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
  449.                                         if (SPp == 1) then
  450.                                                 MySkill = AutoSkillSet (MyID)        -- 飞里乐 和 布丁
  451.                                                 MySkillLevel = 1                -- 技能等级请自行设定
  452.                                                 SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
  453.                                                 TraceAI ("OnAutoSkill")
  454.                                         end
  455.                                 end
  456.                                 MySkill = 0
  457.                         end
  458.         -----------------------------------------------------------------------------------
  459.                         Attack (MyID,MyEnemy)
  460.                 else                                                -- 技能使用状态
  461.                         SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
  462.                         TraceAI (string.format("MySkillLevel: %d,MySkill:%d",MySkillLevel,MySkill))
  463.                         MySkill = 0
  464.                 end
  465.                 return
  466.         end

  467.         TraceAI ("OnFOLLOW_CMD_ST")
  468.         local ownerX, ownerY, myX, myY
  469.         ownerX, ownerY = GetV (V_POSITION,GetV(V_OWNER,MyID))         -- 主人ID位置
  470.         myX, myY = GetV (V_POSITION,MyID)                        -- 生命体ID位置
  471.        
  472.         local d = GetDistance (ownerX,ownerY,myX,myY)

  473.         if ( d <= 2) then                                                                          -- 3捻 桧 剪葬贼
  474.                 return
  475.         end

  476.         local motion = GetV (V_MOTION,MyID)
  477.         if (motion == MOTION_MOVE) then                               -- 生命体为移动中时
  478.                 d = GetDistance (ownerX, ownerY, MyDestX, MyDestY)
  479.                 if ( d > 2 ) then                                -- 距离大於2格时
  480.                         MoveToOwner (MyID)
  481.                         MyDestX = ownerX
  482.                         MyDestY = ownerY
  483.                         return
  484.                 end
  485.         else                                                  -- 棻艇 翕蒙
  486.                 MoveToOwner (MyID)
  487.                 MyDestX = ownerX
  488.                 MyDestY = ownerY
  489.                 return
  490.         end
  491.        
  492. end
  493. -------------------------------------------
  494. -- 人工生命体自动依类型选择技能设定 AutoSkillSet (myid)
  495. -------------------------------------------

  496. function        AutoSkillSet (myid)
  497.         local result = 0
  498.         local skilltype
  499.         local type = GetV (V_HOMUNTYPE,myid)
  500.         if (type == LIF or type == LIF_H) then
  501.                 skilltype = 8001
  502.         elseif (type == AMISTR or type == AMISTR_H) then
  503.                 skilltype = 8005
  504.         elseif (type == FILIR or type == FILIR_H) then
  505.                 skilltype = 8009
  506.         elseif (type == VANILMIRTH or type == VANILMIRTH_H) then
  507.                 skilltype = 8013
  508.         end
  509.         result = skilltype
  510.         return result
  511. end

  512. -------------------------------------------
  513. -- 取得主人的敌人 GetOwnerEnemy(被攻击时锁定)
  514. -------------------------------------------
  515. function        GetOwnerEnemy (myid)
  516.         local result = 0
  517.         local owner  = GetV (V_OWNER,myid)
  518.         local actors = GetActors ()
  519.         local enemys = {}
  520.         local index = 1
  521.         local target
  522.         for i,v in ipairs(actors) do
  523.                 if (v ~= owner and v ~= myid) then
  524.                         target = GetV (V_TARGET,v)
  525.                         if (target == owner) then
  526.                                 if (IsMonster(v) == 1) then
  527.                                         enemys[index] = v
  528.                                         index = index+1
  529.                                 else
  530.                                         local motion = GetV(V_MOTION,i)
  531.                                         if (motion == MOTION_ATTACK or motion == MOTION_ATTACK2) then
  532.                                                 enemys[index] = v
  533.                                                 index = index+1
  534.                                         end
  535.                                 end
  536.                         end
  537.                 end
  538.         end

  539.         local min_dis = 100
  540.         local dis
  541.         for i,v in ipairs(enemys) do
  542.                 dis = GetDistance2 (myid,v)
  543.                 if (dis < min_dis) then
  544.                         result = v
  545.                         min_dis = dis
  546.                 end
  547.         end
  548.        
  549.         return result
  550. end
  551. --[[
  552. -------------------------------------------
  553. -- 攻击型态选择(以生命体类型为条件) GetMyEnemy
  554. -------------------------------------------
  555. function        GetMyEnemy (myid)
  556.         local result = 0

  557.         local type = GetV (V_HOMUNTYPE,myid)
  558.         if (type == LIF or type == LIF_H or type == AMISTR or type == AMISTR_H) then
  559.                 result = GetMyEnemyA (myid)
  560.         elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
  561.                 result = GetMyEnemyB (myid)
  562.         end
  563.         return result
  564. end

  565. -------------------------------------------
  566. -- 非主动攻击型 GetMyEnemyA
  567. -------------------------------------------
  568. function        GetMyEnemyA (myid)
  569.         local result = 0
  570.         local owner  = GetV (V_OWNER,myid)
  571.         local actors = GetActors ()
  572.         local enemys = {}
  573.         local index = 1
  574.         local target
  575.         for i,v in ipairs(actors) do
  576.                 if (v ~= owner and v ~= myid) then
  577.                         target = GetV (V_TARGET,v)
  578.                         if (target == myid) then
  579.                                 enemys[index] = v
  580.                                 index = index+1
  581.                         end
  582.                 end
  583.         end

  584.         local min_dis = 100
  585.         local dis
  586.         for i,v in ipairs(enemys) do
  587.                 dis = GetDistance2 (myid,v)
  588.                 if (dis < min_dis) then
  589.                         result = v
  590.                         min_dis = dis
  591.                 end
  592.         end

  593.         return result
  594. end

  595. --]]
  596. -------------------------------------------
  597. -- 主动攻击型 GetMyEnemyB
  598. -------------------------------------------
  599. function        GetMyEnemy (myid)
  600.         local result = 0
  601.         local owner  = GetV (V_OWNER,myid)
  602.         local actors = GetActors ()
  603.         local enemys = {}
  604.         local index = 1
  605.         local type
  606.         for i,v in ipairs(actors) do
  607.                 if (v ~= owner and v ~= myid) then
  608.                         -- 这里可以插入判断怪物属性的程式
  609.                         if (1 == IsMonster(v))        then
  610.                                 enemys[index] = v
  611.                                 index = index+1
  612.                         end
  613.                 end
  614.         end

  615.         local min_dis = 100
  616.         local dis
  617.         for i,v in ipairs(enemys) do
  618.                 dis = GetDistance2 (myid,v)
  619.                 if (dis < min_dis) then
  620.                         result = v
  621.                         min_dis = dis
  622.                 end
  623.         end

  624.         return result
  625. end





  626. --------------------------------------------------------------------
  627. -- 人工AI主程式
  628. --------------------------------------------------------------------
  629. function AI(myid)

  630.         MyID = myid

  631.         local         owner = GetV (V_OWNER,MyID)
  632.         local         HPp = GetV (V_HP,MyID) / GetV (V_MAXHP,MyID)        -- HP%
  633.         local         OHPp = GetV (V_HP,owner) / GetV (V_MAXHP,owner)        -- OWNER HP%
  634.         local         type = GetV (V_HOMUNTYPE,MyID)
  635.         if (type == LIF or type == LIF_H) then
  636.                 if (GetV (V_SP,MyID) >= 25) then
  637.                         if (OHPp <= 0.25) then
  638.                                 MySkill = AutoSkillSet (MyID)        -- 丽芙(对玩家)
  639.                                 MySkillLevel = 5                -- 技能等级请自行设定
  640.                                 SkillObject (MyID,MySkillLevel,MySkill,owner)
  641.                                 TraceAI ("OnAutoSkill")
  642.                         elseif (HPp <= 0.25) then
  643.                                 MySkill = AutoSkillSet (MyID)        -- 丽芙(对自己)
  644.                                 MySkillLevel = 5                -- 技能等级请自行设定
  645.                                 SkillObject (MyID,MySkillLevel,MySkill,MyID)
  646.                                 TraceAI ("OnAutoSkill")
  647.                         end
  648.                 end
  649.         end

  650.         local msg        = GetMsg (myid)                        -- 立即命令
  651.         local rmsg        = GetResMsg (myid)                -- 预约的命令

  652.         if msg[1] == NONE_CMD then
  653.                 if rmsg[1] ~= NONE_CMD then
  654.                         if List.size(ResCmdList) < 15 then
  655.                                 List.pushright (ResCmdList,rmsg) -- 储存预约命令
  656.                         end
  657.                 end
  658.         else
  659.                 List.clear (ResCmdList)        -- 当有立即命令时,清除预约命令清单  
  660.                 ProcessCommand (msg)        -- 执行命令
  661.         end

  662.                
  663.         -- 鼻鹧 籀葬
  664.         if (MyState == IDLE_ST) then
  665.                 OnIDLE_ST ()
  666.         elseif (MyState == CHASE_ST) then                                       
  667.                 OnCHASE_ST ()
  668.         elseif (MyState == ATTACK_ST) then
  669.                 OnATTACK_ST ()
  670.         elseif (MyState == FOLLOW_ST) then
  671.                 OnFOLLOW_ST ()
  672.         elseif (MyState == MOVE_CMD_ST) then
  673.                 OnMOVE_CMD_ST ()
  674.         elseif (MyState == STOP_CMD_ST) then
  675.                 OnSTOP_CMD_ST ()
  676.         elseif (MyState == ATTACK_OBJECT_CMD_ST) then
  677.                 OnATTACK_OBJECT_CMD_ST ()
  678.         elseif (MyState == ATTACK_AREA_CMD_ST) then
  679.                 OnATTACK_AREA_CMD_ST ()
  680.         elseif (MyState == PATROL_CMD_ST) then
  681.                 OnPATROL_CMD_ST ()
  682.         elseif (MyState == HOLD_CMD_ST) then
  683.                 OnHOLD_CMD_ST ()
  684.         elseif (MyState == SKILL_OBJECT_CMD_ST) then
  685.                 OnSKILL_OBJECT_CMD_ST ()
  686.         elseif (MyState == SKILL_AREA_CMD_ST) then
  687.                 OnSKILL_AREA_CMD_ST ()
  688.         elseif (MyState == FOLLOW_CMD_ST) then
  689.                 OnFOLLOW_CMD_ST ()
  690.         end

  691. end
复制代码


--PS:我给转成简体的。这个文件另存为AI.lua

[ 本帖最后由 非注册用户 于 2006-1-7 23:43 编辑 ]
作者: xppx    时间: 2006-1-7 22:29

謝謝樓上的各位
作者: xppx    时间: 2006-1-7 22:32

为萨台服那么多人喜欢养果冻
作者: geeseno1    时间: 2006-1-7 22:41

-.-只能满SP才能使用技能,SP数值怎么修改内……
作者: 非注册用户    时间: 2006-1-7 22:57

原帖由 geeseno1 于 2006-1-7 22:41 发表
-.-只能满SP才能使用技能,SP数值怎么修改内……

应该是这段
---------------------自动使用技能区块----------------------------------------------------------
                if (GetV (V_SP,MyID) >= 25) then
                        if (type == AMISTR or type == AMISTR_H) then
                                if ((OHPp <= 0.25 or HPp <= 0.25) and MOTION_ATTACK == GetV(V_MOTION,GetMyEnemy (MyID))) then
                                        MySkill = AutoSkillSet (MyID)        -- 羊
                                        MySkillLevel = 5                -- 技能等级请自行设定
                                        SkillObject (MyID,MySkillLevel,MySkill,owner)
                                        TraceAI ("OnAutoSkill")
                                end
                        elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
                                if (HPp <= 0.25 or SPp == 1) then
                                        MySkill = AutoSkillSet (MyID)        -- 飞里乐 和 布丁
                                        MySkillLevel = 5                -- 技能等级请自行设定
                                        SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
                                        TraceAI ("OnAutoSkill")
                                end
                        end
                        MySkill = 0
                end
        -----------------------------------------------------------------------------------------------

[ 本帖最后由 非注册用户 于 2006-1-7 23:37 编辑 ]
作者: geeseno1    时间: 2006-1-7 23:17

嗯,改好了,开始刷蓝练-0-
作者: WAKATA    时间: 2006-1-7 23:25

请问一下  怎么样打开LUA文件???

AI文件里   AI.lua  Const.lua  Util.lua

是否要和USER_AI文件里的AI.lua  Const.lua  Util.lua  一样??

[ 本帖最后由 WAKATA 于 2006-1-7 23:28 编辑 ]
作者: 非注册用户    时间: 2006-1-7 23:29

原帖由 WAKATA 于 2006-1-7 23:25 发表
请问一下  怎么样打开LUA文件???

AI文件里   AI.lua  Const.lua  Util.lua

是否要和USER_AI文件里的AI.lua  Const.lua  Util.lua  一样??


记事本就可以打开。
你覆盖的时候记得备份一下你的那个AI。LUA
作者: 看客    时间: 2006-1-7 23:29

原帖由 らёгαρん 于 2006-1-7 21:42 发表
估计是HI-NET的空间....
大陆的IP是无法连接的
用代理的朋友试试看下载吧

另寒那只鸟的名字

的确寒,居然是战妖老大....
orz
作者: xppx    时间: 2006-1-7 23:31

原帖由 らёгαρん 于 2006-1-7 21:42 发表
估计是HI-NET的空间....
大陆的IP是无法连接的
用代理的朋友试试看下载吧

另寒那只鸟的名字

差点被我读成雪崩了
作者: 我欲成魔    时间: 2006-1-7 23:45

居然要玩家自己改AI……orz
作者: WAKATA    时间: 2006-1-7 23:48

还有  我想问一下

大于等于30%SP   用加血技能   LIF的

还有不主动攻击怪物  要我按ALT+T才攻击  或者我被打时  才攻击  

这2个  在哪设置?
作者: 非注册用户    时间: 2006-1-7 23:54

原帖由 WAKATA 于 2006-1-7 23:48 发表
还有  我想问一下

大于等于30%SP   用加血技能   LIF的

还有不主动攻击怪物  要我按ALT+T才攻击  或者我被打时  才攻击  

这2个  在哪设置?

LIF的加血应该是这段
function AI(myid)

        MyID = myid

        local         owner = GetV (V_OWNER,MyID)
        local         HPp = GetV (V_HP,MyID) / GetV (V_MAXHP,MyID)        -- HP%
        local         OHPp = GetV (V_HP,owner) / GetV (V_MAXHP,owner)        -- OWNER HP%
        local         type = GetV (V_HOMUNTYPE,MyID)
        if (type == LIF or type == LIF_H) then
                if (GetV (V_SP,MyID) >= 25) then
                        if (OHPp <= 0.25) then
                                MySkill = AutoSkillSet (MyID)        -- 丽芙(对玩家)
                                MySkillLevel = 5                -- 技能等级请自行设定
                                SkillObject (MyID,MySkillLevel,MySkill,owner)
                                TraceAI ("OnAutoSkill")
                        elseif (HPp <= 0.25) then
                                MySkill = AutoSkillSet (MyID)        -- 丽芙(对自己)
                                MySkillLevel = 5                -- 技能等级请自行设定
                                SkillObject (MyID,MySkillLevel,MySkill,MyID)
                                TraceAI ("OnAutoSkill")
                        end
                end
        end
作者: WAKATA    时间: 2006-1-7 23:57

function AI(myid)

        MyID = myid

        local         owner = GetV (V_OWNER,MyID)
        local         HPp = GetV (V_HP,MyID) / GetV (V_MAXHP,MyID)        -- HP%
        local         OHPp = GetV (V_HP,owner) / GetV (V_MAXHP,owner)        -- OWNER HP%
        local         type = GetV (V_HOMUNTYPE,MyID)
        if (type == LIF or type == LIF_H) then
                if (GetV (V_SP,MyID) >= 30) then
                        if (OHPp <= 0.25) then
                                MySkill = AutoSkillSet (MyID)        -- 丽芙(对玩家)
                                MySkillLevel = 5                -- 技能等级请自行设定
                                SkillObject (MyID,MySkillLevel,MySkill,owner)
                                TraceAI ("OnAutoSkill")
                        elseif (HPp <= 0.25) then
                                MySkill = AutoSkillSet (MyID)        -- 丽芙(对自己)
                                MySkillLevel = 5                -- 技能等级请自行设定
                                SkillObject (MyID,MySkillLevel,MySkill,MyID)
                                TraceAI ("OnAutoSkill")
                        end
                end
        end

是这样改吗??    大于等于30%SP 用技能


不主动攻击怪物  要我按ALT+T才攻击  或者我被打时  才攻击  在哪里改?

[ 本帖最后由 WAKATA 于 2006-1-8 00:01 编辑 ]
作者: 非注册用户    时间: 2006-1-8 00:05

你试下,应该就是那样改。
你说的不主动攻击,我在研究中。感觉好像要把哪一段去掉才可以。
因为转化的时候有些没转好,还是乱码。所以不知道大概的意思……
不知道是韩文的,还是繁体。理解中。
作者: WAKATA    时间: 2006-1-8 00:07

恩  谢谢你了

我看不太懂  这个  呵呵

让你多费心了
作者: 單純    时间: 2006-1-8 00:13

問一下,自動刷水,刷撒水?白?黃?
作者: WAKATA    时间: 2006-1-8 00:17

原帖由 單純 于 2006-1-8 00:13 发表
問一下,自動刷水,刷撒水?白?黃?


哪里有自动刷水??

LIF的治愈之手  用的是纤细红
作者: 非注册用户    时间: 2006-1-8 00:25

现在有些后悔了。纤红不好做呀。上哪找这些个仙人掌。
晕了。果冻又不喜欢。长大了不好看。羊吧。也不帅。
只有LIF和鸟了。但是鸟又太勇了。啥事都敢上……
LIF看来只能用加速了。逛街技能。晕了。
作者: WAKATA    时间: 2006-1-8 00:29

要仙人掌刺   可以去苍蝇王那张地图   有很多的
作者: 非注册用户    时间: 2006-1-8 00:30

ASD的炼金成功率多少?:)
作者: WAKATA    时间: 2006-1-8 00:31

。。。  那  是高不了的  呵呵
作者: SOLBADGUY    时间: 2006-1-8 02:49

1.麗芙:玩家或自己HP低於25%時自動補血


不明白,这个技能不是只可以对主人使用吗?怎么可以对LIF自己使用?
作者: Flamoon    时间: 2006-1-8 05:07

看来还是向日葵小班里面的人工比较先进
作者: 恶→莉莉丝    时间: 2006-1-8 08:39

战斗妖精雪风?


的确是好名字...
作者: 夜桜    时间: 2006-1-8 09:34

想找个生命体拉怪的AI脚本~自动用技能的话....感觉还是不够
作者: roropig    时间: 2006-1-8 10:43

能选择性地让生命体打怪就好了.......我的丽芙超爱打草啊``~~~~Orz
作者: WAKATA    时间: 2006-1-8 12:00

原帖由 Flamoon 于 2006-1-8 05:07 发表
看来还是向日葵小班里面的人工比较先进


小班的AI在哪有?

有联接吗?
作者: らёгαρん    时间: 2006-1-8 17:38

向日葵小班是FLASH啊...............
无语
作者: deutsch0230    时间: 2006-1-8 19:51

请教下如何设置当sp大于20%时使用技能,或者怎么让它不断使用技能攻击,我在自动使用技能那栏中弄了好几次,就是不对,麻烦指教,多谢
作者: WAKATA    时间: 2006-1-8 23:49

原帖由 らёгαρん 于 2006-1-8 17:38 发表
向日葵小班是FLASH啊...............
无语


我还以为有论坛  看AI呢   哈哈
作者: geeseno1    时间: 2006-1-8 23:56

原帖由 deutsch0230 于 2006-1-8 19:51 发表
请教下如何设置当sp大于20%时使用技能,或者怎么让它不断使用技能攻击,我在自动使用技能那栏中弄了好几次,就是不对,麻烦指教,多谢



>=0.20
作者: 夏海棠    时间: 2006-1-14 18:16

飞里乐那个,一定要满sp才能施法么?怎么改成只要sp足够就施法?
作者: xppx    时间: 2006-1-14 18:23

原帖由 夏海棠 于 2006-1-14 18:16 发表
飞里乐那个,一定要满sp才能施法么?怎么改成只要sp足够就施法?

上面不是都有的吗 设置成sp大于百分之多少就用技能
作者: 夏海棠    时间: 2006-1-14 18:35

不行啊,还是满sp才出。
作者: xppx    时间: 2006-1-14 18:40

---------------------自动使用技能区块----------------------------------------------------------
                if (GetV (V_SP,MyID) >= 25) then
                        if (type == AMISTR or type == AMISTR_H) then
                                if ((OHPp <= 0.25 or HPp <= 0.25) and MOTION_ATTACK == GetV(V_MOTION,GetMyEnemy (MyID))) then
                                        MySkill = AutoSkillSet (MyID)        -- 羊
                                        MySkillLevel = 5                -- 技能等级请自行设定
                                        SkillObject (MyID,MySkillLevel,MySkill,owner)
                                        TraceAI ("OnAutoSkill")
                                end
                        elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
                                if (HPp <= 0.25 or SPp <= 1) then
                                        MySkill = AutoSkillSet (MyID)        -- 飞里乐 和 布丁
                                        MySkillLevel = 5                -- 技能等级请自行设定
                                        SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
                                        TraceAI ("OnAutoSkill")
                                end
                        end
                        MySkill = 0
                end
应该是这样的 我没试过
我用的是hp小于100%用技能就是把HPp<=0.25改成HPp<=1

[ 本帖最后由 xppx 于 2006-1-14 18:42 编辑 ]
作者: 夏海棠    时间: 2006-1-14 18:41

有两处,是不是都要改?
作者: xppx    时间: 2006-1-14 18:43

飞里乐 和 布丁的话只要改红色的地方




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