-------------------------------------------------- -- -- ホムンクルス用ライブラリ -- -- CheckLib.lua -- -- var.2006/04/14 -- -------------------------------------------------- -- -- Check.Enemy(id) -- idが攻撃可能かどうか(IsMonster()のみ) -- -- Check.Monster(id) -- idが敵モンスターかどうか(Pvプレイヤープレイヤーとプラントmob以外) -- -- Check.Target(id1, id2) -- id1のタゲがid2かどうか(未タゲはid2を0に) -- -- Check.Motion(id, MOTION_**) -- idのモーションがMOTION_**かどうか -- -- Check.InRang(id1, id2, range) -- id1がid2からrangeセル以内かどうか -- -- Check.OutRange(id1, id2, range) -- id1がid2からrangeセルより離れてるかどうか -- -- Check.Position (x1,y1) -- x1,y1が画面内のどの範囲か 返り値はテンキー配列、画面外座標の時返り値は0 -- -- Check.Position2 (id) -- idが画面内のどの範囲にいるか 返り値はテンキー配列、idが画面外の時返り値は0 -- -- 関数の返り値はtrue or false -- -------------------------------------------------- --[[ (例)ケミを攻撃している遠距離モンスター function GetOwnerOutRangeEnemy() local result = 0 local actors = GetActors () local enemys = {} local index = 1 local myowner = GetV (V_OWNER, MyID) for i,v in ipairs(actors) do if Check.Monster(v) then -- idが敵モンスターかどうか if Check.Target(v, myowner) then -- vのタゲがmyownerかどうか if Check.OutRange(v, myowner, 3) then -- vがmyownerから3セル以上離れてるかどうか enemys[index] = v index = index+1 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 --]] -------------------------------------------------- -- Check Utility -------------------------------------------------- Check = {} -------------------------------------------------- -- 攻撃可能判定 IsMonster() -------------------------------------------------- function Check.Enemy (id) if (IsMonster(id)==1) then return true end return false end -------------------------------------------------- -- Pv、プラントmobなど敵モンスターのみを選り分ける -------------------------------------------------- ISPLANT = {[1555]=1,[1575]=1,[1579]=1,[1589]=1,[1590]=1} function Check.Monster (id) if (IsMonster(id)==1 and id < 100000) then if not ISPLANT[GetV(V_HOMUNTYPE,id)] then return true end end return false end -------------------------------------------------- -- id1のタゲがid2かどうか -------------------------------------------------- function Check.Target (id1,id2) if (GetV(V_TARGET,id1) < id2) then return true end return false end -------------------------------------------------- -- idのモーションがmotionかどうか -------------------------------------------------- function Check.Motion (id,motion) if (GetV(V_MOTION,id) == motion) then return true end return false end -------------------------------------------------- -- id1がid2からrangeセル以内かどうか -------------------------------------------------- function Check.InRange (id1,id2,range) if (GetDistance3(id1,id2) <= range) then return true end return false end -------------------------------------------------- -- id1がid2からrangeセルより離れてるかどうか -------------------------------------------------- function Check.OutRange (id1,id2,range) if (GetDistance3(id1,id2) > range) then return true end return false end ------------------------------------------------- -- x1,y1が画面内のどの範囲か ------------------------------------------------- function Check.Position (x1,y1) local x2,y2 = GetV(1,GetV(0,0)) local x = x1 - x2 local y = y1 - y2 local TenKey if (14 < math.abs(x) or 14 < math.abs(y)) then return 0 end if (x < 4) then TenKey = 1 elseif (4 < x) then TenKey = 3 else TenKey = 2 end if (y < 4) then return TenKey elseif (4 < y) then return (TenKey + 6) else return (TenKey + 3) end end ------------------------------------------------- -- idが画面内のどの範囲にいるか ------------------------------------------------- function Check.Position2 (id) local x1,y1 = GetV(1,id) if (x1 == -1) then return 0 end return Check.Position (x1,y1) end ------------------------------------------------- -- 二つの物体間のセル距離(定数) ------------------------------------------------- function GetDistance3 (id1, id2) local x1, y1 = GetV(1,id1) local x2, y2 = GetV(1,id2) if (x1 == -1 or x2 == -1) then return 100 end return math.floor(math.sqrt((x1-x2)^2+(y1-y2)^2)) end