------------------------------------------------- -- コートAI Ver 1.10 最終更新日:2007/9/23 ------------------------------------------------- CoatLv = 5 --コートスキルレベル CoatID = 2 --コート方法(0:フルコ、1:鎧、2:鎧+武器) CoatNo = 20 --コートする最大人数 Packclock = 50 --プログラム全体の稼動クロック Resclock = 60000 --ターゲット初期化クロック Getclock = 1000 --ターゲット取得クロック Skillclock = 2500 --コートスキルのディレイ times = 0 --プログラムの経過時間 Packtime = 0 --プログラムの稼動予定時間 Restime = 0 --ターゲット初期化予定時間 Gettime = 0 --ターゲット取得予定時間 Skilltime = 0 --コートスキルの使用予定時間 MyID = 0 MyOwner = 0 Starget = {} --ケミターゲットIDを格納 Ctarget = {} --コート済みIDを格納 STNo = 0 --ケミターゲットの配列番号 CTNo = 0 --コート済みキャラの配列番号 XX,YY = 0,0 --ケミの位置 CoatPosi = 0 --コート進行部位を記録 ------------- ●ターゲット関数● -------------- -- 対象がプレイヤーか?(true/false) function IsPlayer(id) if id < 100000 then return false end -- 対象IDが100000より小さければ偽を返す if id == MyOwner then return false end -- 対象IDが本体ケミなら偽を返す local obj = GetV(7,id) -- 対象の種族IDを得る if 0 <= obj and obj <= 25 then return true -- 種族IDが0〜25なら真を返す elseif 4001 <= obj and obj <= 4049 then return true -- 種族IDが4001〜4049なら真を返す else return false end -- それ以外は偽を返す end ------------- ●以下、メイン関数● -------------- function AI(myid) if GetTick() < Packtime then return end --稼動時間までループ times = GetTick() --現在の時間を取得 Packtime = times + Packclock --次の動作時間を記録 MyID,MyOwner = myid,GetV(0,myid) --ホムとケミIDを取得 if times >= Restime then --キャラ初期化時間になったら Restime = times + Resclock --次の動作時間を記録 CTNo = 0 --コートキャラを初期化 for i=1,CoatNo do Ctarget[i] = 0 end --ターゲットを初期化 end if times >= Gettime then --オブジェクト取得時間になったら Gettime = times + Getclock --次のオブジェクト取得時間を記録 local actors = GetActors(MyID) --オブジェクト情報を取得 XX,YY = GetV(1,MyOwner) --自分の位置を取得 STNo = 0 --ターゲットを初期化 local ChaID = 0 --キャラ配列番号を初期化 for i,v in ipairs(actors) do --全オブジェクトに対して if IsPlayer(v) == true then --キャラクターならば local EX,EY = GetV(1,v) --対象キャラの現在地を取得 if EX-XX >0 then DX=EX-XX else DX=XX-EX end --ケミとの距離を測定 if EY-YY >0 then DY=EY-YY else DY=YY-EY end if DX+DY<=2 then --キャラがコート範囲内なら ChaID = ChaID + 1 --キャラ配列を1つシフト Starget[ChaID] = v --キャラリストにID格納 end end end TraceAI("オブジェクト取得") end if times >= Skilltime then --コート使用時間なら STNo = STNo+1 --ケミタゲを1つシフト if Starget[STNo] == nil then --ターゲットがいないなら STNo = 0 --ケミタゲをリセット return --抜ける end for i=1,CoatNo do --コート済みなら抜ける if Ctarget[i] == Starget[STNo] then return end end if CoatID == 0 then --フルコート指示なら SkillObject(MyID,CoatLv,479,Starget[STNo]) --フルコートを使用 CTNo = CTNo +1 --コート済みリストを1つシフト Ctarget[CTNo] = Starget[STNo] --コート済みキャラを登録 Skilltime = times + Skillclock --次のコートスキル時間を記録 elseif CoatID == 1 then --鎧コート指示なら SkillObject(MyID,CoatLv,236,Starget[STNo]) --鎧コートを使用 CTNo = CTNo +1 --コート済みリストを1つシフト Ctarget[CTNo] = Starget[STNo] --コート済みキャラを登録 Skilltime = times + Skillclock --次のコートスキル時間を記録 elseif CoatID == 2 and CoatPosi == 0 then --鎧+武器コート指示なら SkillObject(MyID,CoatLv,236,Starget[STNo]) --鎧コートを使用 CoatPosi = 1 Skilltime = times + Skillclock --次のコートスキル時間を記録 elseif CoatID == 2 and CoatPosi == 1 then --鎧+武器コート指示なら SkillObject(MyID,CoatLv,234,Starget[STNo]) --武器コートを使用 CoatPosi = 0 CTNo = CTNo +1 --コート済みリストを1つシフト Ctarget[CTNo] = Starget[STNo] --コート済みキャラを登録 Skilltime = times + Skillclock --次のコートスキル時間を記録 end end end -------------------------------------------------