--[[ ID識別ライブラリ version 0.8 (2007/07/14) documentation by silica as 冬物語の人 http://winter.sgv417.jp/ 概要: WhatIsName(id): IDは何か? SaveActors(filename, mode): 視野範囲内のID情報をファイルに保存する。 IDが、それぞれの人・物かどうかを識別します。 識別内容は、[yes: 1, no: 0]です。 解説: http://pc3merchant.net/ai_antenna/index.php?AI%BB%F1%CE%C1%2FID%BC%B1%CA%CC%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA 参考: 姫野みこと http://himenomikoto.at.infoseek.co.jp/kulus_project/ BBlib.lua, playerjobdata.lua, mobdata.lua Glenelg http://tomose.dynalias.net/RO/ Util.lua --]] -- 以下のライブラリが必要です。 require 'AI/homunculusdata.lua' -- ホムンクルス用ホムンクルスデータライブラリ require 'AI/playerjobdata.lua' -- ホムンクルス用プレイヤー関連ライブラリ require 'AI/mobdata.lua' -- ホムンクルス用モンスターデータライブラリ -- グローバル MOBLISTLAST = 1812 -- モンスターリスト最後の番号 ISBIOPLANT = {[1579]=1, [1589]=1, [1575]=1, [1555]=1, [1590]=1} ISEGG = {[1008]=1, [1047]=1, [1097]=1, [1236]=1, [1142]=1, [1721]=1} -- NPC/オブジェクトのIDリスト OBJECTNAME = { [45]='ワープポイント', [46]='バーテンダー(グラス拭き中)', [47]='スロット青年', -- 眼鏡男 [48]='プラコン青年', [49]='錬金術青年', [50]='ジャージ男', -- 応急手当NPC [51]='吟遊詩人', [52]='爺さん(禿)', [53]='旅館従業員', [54]='シャツ爺さん', [55]='大臣/執事', [56]='騎士団団長', -- 神器2次のレベイレブ [57]='メガネヒゲオヤジ', -- ニコラス=プラメール [58]='商人(モロク)', [60]='主教', [61]='バーテンダー(爺さん)', [62]='子供', [63]='ハンマー親父', [64]='魔導師', [65]='騎士(青い前掛け)', [66]='女従業員', -- 神器2次のクアール [69]='お嬢さん', -- 神器2次のエマ・シアース [70]='白髪ポニテ女', -- 大統領第二部のラウラ [71]='ガイド(女)', [73]='スペシャルアイテム販売', [74]='お手伝いさん(女)', [79]='修道女', [81]='犬', [82]='紫髪鉢巻男', [83]='PvPドアマン', [84]='PvP ガイド', [85]='商人(たくましい男)', -- ホルグレン [86]='短髪男(町人)', [88]='商人', -- 道具商人 [89]='陰気な男', -- アルデバラン時計塔の管理人怪人A [90]='少女(プロンテラ)', -- The Signのセリン [92]='スマイルマスク職員', [93]='少女(モロク)', [95]='黒髪黒靴男', -- アッシュ [97]='町人(男)', [98]='男', [99]='青年(モロク)', [100]='金髪青スカーフ男', [101]='女性', [102]='女性(モロク宝石商人)', [105]='プロンテラ兵士', [110]='神父(禿)', [111]='吹き出しメッセージ', -- カーソルが変わる [112]='カプラW', [113]='カプラグラリス', [114]='カプラビニット', [115]='カプラソリン', [116]='カプラテーリング', [117]='カプラディフォルテー', -- 文字化け? [118]='男シーフ', [119]='男剣士(爺さん)', [120]='お爺さん(禿)', -- ?? [121]='禿鬚化学者', -- モルゲンシュタイン [123]='女マジシャン', [124]='ティミング商人', [122]='マスターアルケミスト', -- 四色髪男 [139]='イベントスイッチ', -- イベント進行 [700]='女', -- 数字当てNPCのニア [701]='布巾おばさん', [702]='女歴史学者', [704]='黒魔道師', [705]='案内要員(ゲフェン)', [706]='子供', [707]='ヘルメット兵士', [708]='案内要員(フェイヨン)', [709]='白髪煙草爺さん', [712]='白髪鬚パイプ作業服爺', [716]='熊帽子少女', [721]='コモドカプラ', [722]='旗', [724]='踊り子(コモド)', [725]='猫耳アサシン', -- ヒュッケ [726]='女ブラックスミス', -- ミットマイヤ [727]='女ハンターギルド員', -- ファラ、シェリン [728]='女騎士', [729]='妖精ノービス', -- 歴史学者助手 [731]='鍛冶', -- 鍛冶屋アルトアイゼン [732]='羽毛白髪男', -- デーモンハンター [733]='コイン投げ騎士団員', [734]='男クルセイダー(大剣)', [735]='ハイウィザード(フード)', -- 老古学者タイアース [738]='デビルチ', -- 離婚NPC、ハロウィン [740]='男アルケミスト', [741]='詩人(琴持ち)', [742]='学者(目が髪で隠れる)', [743]='魔法アカデミー学長', -- ケイロン=グリック [744]='女アルケミスト', [745]='女クルセイダー', [747]='女ローグ', [748]='頭を抱えるアルケミスト', [749]='薬を持つアルケミスト', [750]='研究者', -- アルケミストギルドのダルシア [751]='男クルセイダー', [752]='マスタークルセイダー', [753]='モンク', [754]='白目学者', [755]='学者', [757]='アマツ観光協会員', [779]='ヨーヨーローグ', [791]='ニブルカプラ', [798]='町人(フィーゲル)', [803]='マント女', -- ジスクリエ、アレックス [804]='メッツ(老古学者)', [806]='白髪眼鏡爺さん(貴族)', [810]='男ローグ(禿片目)', [811]='ヴァルキリー', [815]='チャイナドレス女(龍の城)', [826]='ドワーフ', [828]='レザー男 ロイヤルミスト', [831]='紙配り女', -- 秘書スウェイ・シュリオ [834]='お坊さん(アユタヤ)', [837]='案内板', [843]='ムエタイ(アユタヤ)', [844]='ブルプのマニュアル', -- イベント [845]='案内コンパニオン', -- レースクィーン [846]='長老(お婆さん)', [849]='倒れてる男', [850]='女(アインブロック)', [852]='アインブロック兵士', [853]='お金持ち(禿隻眼タバコ)', [858]='表示板', [859]='カプラ職員', -- アルデバランカプラ本社のベニス [860]='リヒタルゼンカプラ(ショート)', [861]='リヒタルゼンカプラ(ミニグラス)', [862]='少女(リヒタルゼン)', [863]='お婆さん(リヒタルゼン)', [866]='お爺さん(リヒタルゼン)', [867]='レッケンベル職員(丸眼鏡白髭)', [868]='警備兵(青年・リヒタルゼン)', [869]='従業員', -- ダイカツ [870]='浮浪者', -- マク、スリ [873]='飛行船船長', -- トロック、ペルロック [874]='ジョンダ投票広報職員', [877]='猫耳髑髏猫持ち少女', -- タオ [879]='フード女', [880]='ダンデリオン代', -- 表 [881]='マント少年(座)', [882]='少女(座)', [884]='男アサシンクロス', -- キド [885]='女アサシンクロス', -- リーン [897]='ハット鬚杖爺さん', -- 大統領第二部のヘリコ [889]='ブルブル(乳牛)', [891]='少女(赤服)', [892]='お婆さん', [893]='本を持った女', -- マナイン [896]='少年(フィーゲル)', [898]='男(フィゲル)', -- パーティーグッズ商人 [899]='赤逆毛グラサンスーツ', [900]='探検家爺さん', [928]='逆毛鬚男(ラヘル)', } -- 名前を取得 -- わからない名前は数字を出力します。 function GetObjectName(id) local type = GetV(V_HOMUNTYPE, id) for i, v in pairs(OBJECTNAME) do if(i == type) then return v end end return(string.format("NPC/Object:%5s", type)) -- リストにないとき end -- idはNPCか? function IsNPC(id) if(id > 100000) then return 0 end -- idがプレイヤーの範囲 local type = GetV(V_HOMUNTYPE, id) if (45 <= type and type <= 125) then return 1 elseif (700 <= type and type <= 999) then return 1 else return 0 end end -- idはペットか? from Glenelg Util.lua function IsPet(id) if(id > 100000) then return 0 end -- idがプレイヤーの範囲 local type = GetV(V_HOMUNTYPE, id) if (IsMonster(id) == 0 and 1001 <= type and type <= MOBLISTLAST) then return 1 else return 0 end end -- idはバイオプラントモンスターか? -- 1579: BPLv1 ヒドラ, 1589: BPLv2 マンドラゴラ -- 1575: BPLv3 フローラ, 1555: BPLv4 フェアリーフ -- 1590: BPLv5 ジオグラファー function IsBioPlant(id) if(id > 100000) then return 0 end -- idがプレイヤーの範囲 local type = GetV(V_HOMUNTYPE, id) if ISBIOPLANT[type] then return 1 else return 0 end end -- idはマリンスフィアーか? function IsMarineSphere(id) if(id > 100000) then return 0 end -- idがプレイヤーの範囲 local type = GetV(V_HOMUNTYPE, id) if (type == 1142) then return 1 else return 0 end end -- idは草か? -- 1078: 赤い草, 1079: 青い草, 1080: 緑色草 -- 1081: 黄色草, 1082: 白い草, 1083: 輝く草 function IsGrass(id) if(id > 100000) then return 0 end -- idがプレイヤーの範囲 local type = GetV(V_HOMUNTYPE, id) if (1078 <= type and type <= 1083) then return 1 else return 0 end end -- idはきのこか? -- 1084: 黒いきのこ, 1085: 赤いきのこ function IsMushroom(id) if(id > 100000) then return 0 end -- idがプレイヤーの範囲 local type = GetV(V_HOMUNTYPE, id) if (1084 <= type and type <= 1085) then return 1 else return 0 end end -- idは卵か? -- 1008: プパ, 1047: ペコペコの卵, 1048: 盜蟲の卵 -- 1097, 1236: 蟻の卵, 1142: マリンスフィアー, 1721: ドラゴンの卵 function IsEgg(id) if(id > 100000) then return 0 end -- idがプレイヤーの範囲 local type = GetV(V_HOMUNTYPE, id) if ISEGG[type] then return 1 else return 0 end end -- idは何か? function WhatIsName(id) -- 1.ID=100001以上 if(id > 100000) then -- idがプレイヤーの範囲 return GetPlayerJobName(id) -- ジョブを取得 -- 未定義: 'Not Player'を返す end -- 2.ID=100000以下 -- BP、イクラ、草、きのこ、卵(不要ならコメントアウト) if(IsBioPlant(id) == 1) then -- バイオプラント return 'BioPlant' elseif(IsMarineSphere(id) == 1) then -- マリンスフィアー -- 敵とケミスキルのマリンスフィアーは区別が付かない return 'MarineSphere' elseif(IsGrass(id) == 1) then -- 草 return 'Grass' elseif(IsMushroom(id) == 1) then -- きのこ return 'Mushroom' elseif(IsEgg(id) == 1) then -- 卵 return 'Egg' end -- 攻撃可能か? -- アルデバランアルケミストギルドのアラームNPC: 1 if(IsMonster(id) == 1) then -- idがモンスター -- 未定義: nilを返す。 -- プレイヤーはIDで既に判別が付く。 if(GetMobData(M_V_NAME, id) == nil) then return 'Monstar:No Data' else return GetMobData(M_V_NAME, id) -- モンスター名 end end -- 以後はIsMonstar(id)==0と同義 local type = GetV(V_HOMUNTYPE, id) if(0 <= type and type <= 16) then return HOMNAME[type] else -- 0-16以外の数字はNPC/ペット/その他 if(1001 <= type and type <= M_V_LASTDATA) then -- ペット if(GetMobData(M_V_NAME, id) == nil) then return 'Pet:No Data' else -- 名前があれば return(string.format("Pet:%s", GetMobData(M_V_NAME, id))) end else -- NPC/その他 return GetObjectName(id) end end return 'None' -- ここまで来たらどれにも当てはまらない。 end -- Actor情報保存 -- ID、名前、動作、座標、HPSPを出力 function SaveActors(filename, mode) local actors = GetActors() fp = io.open(filename, mode) -- "a"は追加書き込み if(fp == nil) then return end -- 書き込めないとき fp:write("ID | Job/Name/Object | X, Y | Motion\n") fp:write("--------+---------------------------------+----------+-------\n") for argActorsIndex, actorID in ipairs(actors) do -- IDリスト、座標 fp:write(string.format("%8d", actorID)) fp:write("| ") -- fp:write(string.format("%20s", GetPlayerJobName(actorID))) -- fp:write(string.format("%20s", GetHomunculusName(actorID))) fp:write(string.format("%-32s", WhatIsName(actorID))) fp:write("| ") fp:write(string.format("%3d, %3d ", GetV(V_POSITION, actorID))) fp:write("| ") fp:write(string.format("%3d", GetV(V_MOTION, actorID))) -- fp:write(string.format("HP:%5d", GetV(V_HP, actorID))) -- fp:write(string.format("SP:%4d", GetV(V_SP, actorID))) fp:write("\n") end fp:write("--------+---------------------------------+----------+-------\n") fp:close() end