浆糊论坛-RO小站's Archiver

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,我保證飛里樂不會發生錯誤,其他玩家若有錯誤的話請回報一下錯誤時跳出的訊息視窗,好讓我再修改^_^

[[i] 本帖最后由 xppx 于 2006-1-7 23:19 编辑 [/i]]

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

[code]
require "./AI/Const.lua"
require "./AI/Util.lua"                                       

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


------------- command process  ---------------------

function        OnMOVE_CMD (x,y)
       
        TraceAI ("OnMOVE_CMD")

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

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

        Move (MyID,x,y)       
       
        MyState = MOVE_CMD_ST
        MyDestX = x
        MyDestY = y
        MyEnemy = 0
        MySkill = 0

end




function        OnSTOP_CMD ()

        TraceAI ("OnSTOP_CMD")

        if (GetV(V_MOTION,MyID) ~= MOTION_STAND) then
                Move (MyID,GetV(V_POSITION,MyID))
        end
        MyState = IDLE_ST
        MyDestX = 0
        MyDestY = 0
        MyEnemy = 0
        MySkill = 0

end




function        OnATTACK_OBJECT_CMD (id)

        TraceAI ("OnATTACK_OBJECT_CMD")

        MySkill = 0
        MyEnemy = id
        MyState = CHASE_ST

end




function        OnATTACK_AREA_CMD (x,y)

        TraceAI ("OnATTACK_AREA_CMD")

        if (x ~= MyDestX or y ~= MyDestY or MOTION_MOVE ~= GetV(V_MOTION,MyID)) then
                Move (MyID,x,y)       
        end
        MyDestX = x
        MyDestY = y
        MyEnemy = 0
        MyState = ATTACK_AREA_CMD_ST
       
end



function        OnPATROL_CMD (x,y)

        TraceAI ("OnPATROL_CMD")

        MyPatrolX , MyPatrolY = GetV (V_POSITION,MyID)
        MyDestX = x
        MyDestY = y
        Move (MyID,x,y)
        MyState = PATROL_CMD_ST

end




function        OnHOLD_CMD ()

        TraceAI ("OnHOLD_CMD")

        MyDestX = 0
        MyDestY = 0
        MyEnemy = 0
        MyState = HOLD_CMD_ST

end




function        OnSKILL_OBJECT_CMD (level,skill,id)

        TraceAI ("OnSKILL_OBJECT_CMD")

        MySkillLevel = level
        MySkill = skill
        MyEnemy = id
        MyState = CHASE_ST

end




function        OnSKILL_AREA_CMD (level,skill,x,y)

        TraceAI ("OnSKILL_AREA_CMD")

        Move (MyID,x,y)
        MyDestX = x
        MyDestY = y
        MySkillLevel = level
        MySkill = skill
        MyState = SKILL_AREA_CMD_ST
       
end




function        OnFOLLOW_CMD ()

        -- 系统接收到RO的ALT+T
        if (MyState ~= FOLLOW_CMD_ST) then
                MoveToOwner (MyID)
                MyState = FOLLOW_CMD_ST
                MyDestX, MyDestY = GetV (V_POSITION,GetV(V_OWNER,MyID))
                MyEnemy = 0
                MySkill = 0
                TraceAI ("OnFOLLOW_CMD")
        else
                MyState = IDLE_ST
                MyEnemy = 0
                MySkill = 0
                TraceAI ("FOLLOW_CMD_ST --> IDLE_ST")
        end

end




function        ProcessCommand (msg)

        if                (msg[1] == MOVE_CMD) then
                OnMOVE_CMD (msg[2],msg[3])
                TraceAI ("MOVE_CMD")
        elseif        (msg[1] == STOP_CMD) then
                OnSTOP_CMD ()
                TraceAI ("STOP_CMD")
        elseif        (msg[1] == ATTACK_OBJECT_CMD) then
                OnATTACK_OBJECT_CMD (msg[2])
                TraceAI ("ATTACK_OBJECT_CMD")
        elseif        (msg[1] == ATTACK_AREA_CMD) then
                OnATTACK_AREA_CMD (msg[2],msg[3])
                TraceAI ("ATTACK_AREA_CMD")
        elseif        (msg[1] == PATROL_CMD) then
                OnPATROL_CMD (msg[2],msg[3])
                TraceAI ("PATROL_CMD")
        elseif        (msg[1] == HOLD_CMD) then
                OnHOLD_CMD ()
                TraceAI ("HOLD_CMD")
        elseif        (msg[1] == SKILL_OBJECT_CMD) then
                OnSKILL_OBJECT_CMD (msg[2],msg[3],msg[4],msg[5])
                TraceAI ("SKILL_OBJECT_CMD")
        elseif        (msg[1] == SKILL_AREA_CMD) then
                OnSKILL_AREA_CMD (msg[2],msg[3],msg[4],msg[5])
                TraceAI ("SKILL_AREA_CMD")
        elseif        (msg[1] == FOLLOW_CMD) then
                OnFOLLOW_CMD ()
                TraceAI ("FOLLOW_CMD")
        end
end




-------------- state process  --------------------


--------------------------------------------------
-- 休息(发呆) ST
--------------------------------------------------
function        OnIDLE_ST ()
       
        TraceAI ("OnIDLE_ST")

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

        local        object = GetOwnerEnemy (MyID)
        if (object ~= 0) then                -- 取得主人的敌人ID
                MyState = CHASE_ST
                MyEnemy = object
                TraceAI ("IDLE_ST -> CHASE_ST : MYOWNER_ATTACKED_IN")
                return
        end

        object = GetMyEnemy (MyID)
        if (object ~= 0) then                -- 取得自己的敌人ID
                MyState = CHASE_ST
                MyEnemy = object
                TraceAI ("IDLE_ST -> CHASE_ST : ATTACKED_IN")
                return
        end

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

end

--------------------------------------------------------------
--     没事时自动跟随主人
--------------------------------------------------------------
function        OnFOLLOW_ST ()

        TraceAI ("OnFOLLOW_ST")

        if (GetDistanceFromOwner(MyID) <= 2) then        --  DESTINATION_ARRIVED_IN
                MyState = IDLE_ST
                TraceAI ("FOLLOW_ST -> IDLW_ST")
                return;
        elseif (GetV(V_MOTION,MyID) == MOTION_STAND) then
                MoveToOwner (MyID)
                TraceAI ("FOLLOW_ST -> FOLLOW_ST")
                return;
        end

end

---------------------------------------------------------------
--                   追踪中ST
---------------------------------------------------------------
function        OnCHASE_ST ()
       
        TraceAI ("OnCHASE_ST")

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

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

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

end

---------------------------------------------------------------
--                   攻击中 ST
---------------------------------------------------------------
function        OnATTACK_ST ()

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

        if (MOTION_DEAD == GetV(V_MOTION,MyEnemy)) then  -- 敌人死亡
                MyState = IDLE_ST
                TraceAI ("ATTACK_ST -> IDLE_ST")
                return
        end
               
        if (false == IsInAttackSight(MyID,MyEnemy)) then  -- 敌人逃跑时追过去
                MyState = CHASE_ST
                MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
                Move (MyID,MyDestX,MyDestY)
                TraceAI ("ATTACK_ST -> CHASE_ST  : ENEMY_OUTATTACKSIGHT_IN")
                return
        end

        if (MySkill == 0) then                                -- 非使用技能状态
        ---------------------自动使用技能区块----------------------------------------------------------
                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
        -----------------------------------------------------------------------------------------------
                Attack (MyID,MyEnemy)
        else                                                -- 技能使用状态
                SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
                TraceAI (string.format("MySkillLevel: %d,MySkill:%d",MySkillLevel,MySkill))
                MySkill = 0
        end
        TraceAI ("ATTACK_ST -> ATTACK_ST  : ENERGY_RECHARGED_IN")
        return

end

----------------------------------------------------------------
--                 移动到指定位置
----------------------------------------------------------------
function        OnMOVE_CMD_ST ()

        TraceAI ("OnMOVE_CMD_ST")

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

----------------------------------------------------------------
--                 STOP (可程式)
----------------------------------------------------------------
function         OnSTOP_CMD_ST ()

        -- TraceAI ("OnSTOP_CMD_ST")
        -- MyState = HOLD_CMD_ST

end

----------------------------------------------------------------
--                 攻击目标命令 (可程式)
----------------------------------------------------------------
function OnATTACK_OBJECT_CMD_ST ()



end

----------------------------------------------------------------
--                 区域攻击
----------------------------------------------------------------
function OnATTACK_AREA_CMD_ST ()

        TraceAI ("OnATTACK_AREA_CMD_ST")

        local        object = GetOwnerEnemy (MyID)
        if (object == 0) then                                                       
                object = GetMyEnemy (MyID)
        end

        if (object ~= 0) then                                                        -- MYOWNER_ATTACKED_IN or ATTACKED_IN
                MyState = CHASE_ST
                MyEnemy = object
                return
        end

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

end

----------------------------------------------------------------
--                 侦查中
----------------------------------------------------------------
function OnPATROL_CMD_ST ()

        TraceAI ("OnPATROL_CMD_ST")

        local        object = GetOwnerEnemy (MyID)
        if (object == 0) then                                                       
                object = GetMyEnemy (MyID)
        end

        if (object ~= 0) then                                                        -- MYOWNER_ATTACKED_IN or ATTACKED_IN
                MyState = CHASE_ST
                MyEnemy = object
                TraceAI ("PATROL_CMD_ST -> CHASE_ST : ATTACKED_IN")
                return
        end

        local x , y = GetV (V_POSITION,MyID)
        if (x == MyDestX and y == MyDestY) then                        -- DESTARRIVED_IN
                MyDestX = MyPatrolX
                MyDestY = MyPatrolY
                MyPatrolX = x
                MyPatrolY = y
                Move (MyID,MyDestX,MyDestY)
        end

end

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

        TraceAI ("OnHOLD_CMD_ST")
       
        if (MyEnemy ~= 0) then
                local d = GetDistance(MyEnemy,MyID)
                if (d ~= -1 and d <= GetV(V_ATTACKRANGE,MyID)) then
                                Attack (MyID,MyEnemy)
                else
                        MyEnemy = 0;
                end
                return
        end

        local        object = GetOwnerEnemy (MyID)
        if (object == 0) then                                                       
                object = GetMyEnemy (MyID)
                if (object == 0) then                                               
                        return
                end
        end

        MyEnemy = object

end

----------------------------------------------------------------
-- 对物体目标使用技能(可程式)
----------------------------------------------------------------
function OnSKILL_OBJECT_CMD_ST ()
       
end

----------------------------------------------------------------
-- 对区域使用技能
----------------------------------------------------------------
function OnSKILL_AREA_CMD_ST ()

        TraceAI ("OnSKILL_AREA_CMD_ST")

        local x , y = GetV (V_POSITION,MyID)
        if (GetDistance(x,y,MyDestX,MyDestY) <= GetV(V_SKILLATTACKRANGE,MyID,MySkill)) then        -- DESTARRIVED_IN
                SkillGround (MyID,MySkillLevel,MySkill,MyDestX,MyDestY)
                MyState = IDLE_ST
                MySkill = 0
        end

end


----------------------------------------------------------------
-- 跟随主人(系统指令)   相当於ALT+T
----------------------------------------------------------------
function OnFOLLOW_CMD_ST ()

        local        object = GetOwnerEnemy (MyID)
        local         x, y
        local         SPp = GetV (V_SP,MyID) / GetV (V_MAXSP,MyID)        -- SP%
        local         type = GetV (V_HOMUNTYPE,MyID)
        if (object ~= 0) then                -- 取得主人的敌人ID
                MyEnemy = object
                if (false == IsInAttackSight(MyID,MyEnemy)) then -- IF人工生命正在对目标攻击或使用技能
                        MyDestX, MyDestY = GetV (V_POSITION,MyEnemy)
                        Move (MyID,MyDestX,MyDestY)
                        return
                end
                if (MySkill == 0) then                                -- 非使用技能状态
        ----------------------------------自动使用技能区块---------------------------------
                        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 (SPp == 1) then
                                                MySkill = AutoSkillSet (MyID)        -- 飞里乐 和 布丁
                                                MySkillLevel = 1                -- 技能等级请自行设定
                                                SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
                                                TraceAI ("OnAutoSkill")
                                        end
                                end
                                MySkill = 0
                        end
        -----------------------------------------------------------------------------------
                        Attack (MyID,MyEnemy)
                else                                                -- 技能使用状态
                        SkillObject (MyID,MySkillLevel,MySkill,MyEnemy)
                        TraceAI (string.format("MySkillLevel: %d,MySkill:%d",MySkillLevel,MySkill))
                        MySkill = 0
                end
                return
        end

        TraceAI ("OnFOLLOW_CMD_ST")
        local ownerX, ownerY, myX, myY
        ownerX, ownerY = GetV (V_POSITION,GetV(V_OWNER,MyID))         -- 主人ID位置
        myX, myY = GetV (V_POSITION,MyID)                        -- 生命体ID位置
       
        local d = GetDistance (ownerX,ownerY,myX,myY)

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

        local motion = GetV (V_MOTION,MyID)
        if (motion == MOTION_MOVE) then                               -- 生命体为移动中时
                d = GetDistance (ownerX, ownerY, MyDestX, MyDestY)
                if ( d > 2 ) then                                -- 距离大於2格时
                        MoveToOwner (MyID)
                        MyDestX = ownerX
                        MyDestY = ownerY
                        return
                end
        else                                                  -- 棻艇 翕蒙
                MoveToOwner (MyID)
                MyDestX = ownerX
                MyDestY = ownerY
                return
        end
       
end
-------------------------------------------
-- 人工生命体自动依类型选择技能设定 AutoSkillSet (myid)
-------------------------------------------

function        AutoSkillSet (myid)
        local result = 0
        local skilltype
        local type = GetV (V_HOMUNTYPE,myid)
        if (type == LIF or type == LIF_H) then
                skilltype = 8001
        elseif (type == AMISTR or type == AMISTR_H) then
                skilltype = 8005
        elseif (type == FILIR or type == FILIR_H) then
                skilltype = 8009
        elseif (type == VANILMIRTH or type == VANILMIRTH_H) then
                skilltype = 8013
        end
        result = skilltype
        return result
end

-------------------------------------------
-- 取得主人的敌人 GetOwnerEnemy(被攻击时锁定)
-------------------------------------------
function        GetOwnerEnemy (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 == owner) then
                                if (IsMonster(v) == 1) then
                                        enemys[index] = v
                                        index = index+1
                                else
                                        local motion = GetV(V_MOTION,i)
                                        if (motion == MOTION_ATTACK or motion == MOTION_ATTACK2) then
                                                enemys[index] = v
                                                index = index+1
                                        end
                                end
                        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        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)
        end
        return result
end

-------------------------------------------
-- 非主动攻击型 GetMyEnemyA
-------------------------------------------
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

--]]
-------------------------------------------
-- 主动攻击型 GetMyEnemyB
-------------------------------------------
function        GetMyEnemy (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





--------------------------------------------------------------------
-- 人工AI主程式
--------------------------------------------------------------------
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

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

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

               
        -- 鼻鹧 籀葬
        if (MyState == IDLE_ST) then
                OnIDLE_ST ()
        elseif (MyState == CHASE_ST) then                                       
                OnCHASE_ST ()
        elseif (MyState == ATTACK_ST) then
                OnATTACK_ST ()
        elseif (MyState == FOLLOW_ST) then
                OnFOLLOW_ST ()
        elseif (MyState == MOVE_CMD_ST) then
                OnMOVE_CMD_ST ()
        elseif (MyState == STOP_CMD_ST) then
                OnSTOP_CMD_ST ()
        elseif (MyState == ATTACK_OBJECT_CMD_ST) then
                OnATTACK_OBJECT_CMD_ST ()
        elseif (MyState == ATTACK_AREA_CMD_ST) then
                OnATTACK_AREA_CMD_ST ()
        elseif (MyState == PATROL_CMD_ST) then
                OnPATROL_CMD_ST ()
        elseif (MyState == HOLD_CMD_ST) then
                OnHOLD_CMD_ST ()
        elseif (MyState == SKILL_OBJECT_CMD_ST) then
                OnSKILL_OBJECT_CMD_ST ()
        elseif (MyState == SKILL_AREA_CMD_ST) then
                OnSKILL_AREA_CMD_ST ()
        elseif (MyState == FOLLOW_CMD_ST) then
                OnFOLLOW_CMD_ST ()
        end

end

[/code]

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

[[i] 本帖最后由 非注册用户 于 2006-1-7 23:43 编辑 [/i]]

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

[quote]原帖由 [i]geeseno1[/i] 于 2006-1-7 22:41 发表
-.-只能满SP才能使用技能,SP数值怎么修改内…… [/quote]
应该是这段
---------------------自动使用技能区块----------------------------------------------------------
                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
        -----------------------------------------------------------------------------------------------

[[i] 本帖最后由 非注册用户 于 2006-1-7 23:37 编辑 [/i]]

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  一样??

[[i] 本帖最后由 WAKATA 于 2006-1-7 23:28 编辑 [/i]]

非注册用户 发表于 2006-1-7 23:29

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

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

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

记事本就可以打开。
你覆盖的时候记得备份一下你的那个AI。LUA

看客 发表于 2006-1-7 23:29

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

另寒那只鸟的名字 [/quote]
的确寒,居然是战妖老大....
orz

xppx 发表于 2006-1-7 23:31

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

另寒那只鸟的名字 [/quote]
差点被我读成雪崩了

我欲成魔 发表于 2006-1-7 23:45

居然要玩家自己改AI……orz

WAKATA 发表于 2006-1-7 23:48

还有  我想问一下

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

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

这2个  在哪设置?

非注册用户 发表于 2006-1-7 23:54

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

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

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

这2个  在哪设置? [/quote]
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) >= [color=red]30[/color]) 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才攻击  或者我被打时  才攻击  在哪里改?

[[i] 本帖最后由 WAKATA 于 2006-1-8 00:01 编辑 [/i]]

非注册用户 发表于 2006-1-8 00:05

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

WAKATA 发表于 2006-1-8 00:07

恩  谢谢你了

我看不太懂  这个  呵呵

让你多费心了

單純 发表于 2006-1-8 00:13

問一下,自動刷水,刷撒水?白?黃?

WAKATA 发表于 2006-1-8 00:17

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

哪里有自动刷水??

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

战斗妖精雪风?


的确是好名字...

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.