------------------------------------------------------------------------- --additional.lua 2007/9/17 ------------------------------------------------------------------------- ------------------------------------------------- -- 対象の判別 ------------------------------------------------- -- 対象がプレイヤーか?(true/false) function IsPlayer(id) if id < 100000 then return false end -- 対象IDが100000より小さければ偽を返す local obj = GetV(V_HOMUNTYPE,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 --Lvアップしたかどうかの判定 function LvUpCheck() local hommaxhp = GetV(V_MAXHP,MyID) if hommaxhp > HomMaxHP then HomMaxHP = hommaxhp HomMaxSP = GetV(V_MAXSP,MyID) end local ownmaxhp = GetV(V_MAXHP,MyOwner) if ownmaxhp > OwnMaxHP then OwnMaxHP = ownmaxhp OwnMaxSP = GetV(V_MAXSP,MyOwner) end end -- 対象がホムンクルスか?(true/false) function IsHomunclus(id) if id > 0 and id <= 65535 then -- 対象IDが0より大きく、65535以下ならば local obj = GetV(V_HOMUNTYPE,id) -- 対象の種族IDを得る if 1 <= obj and obj <= 16 and IsMonster(id) == 0 then return true end -- 種族IDが1〜16で、モンスターでなければ真を返す end return false -- 偽を返す end -- 対象がバイオプラントか?(true/false) function IsPlant(id) local obj = GetV(V_HOMUNTYPE,id) -- 対象の種族IDを得る if obj == 1535 or obj == 1511 or obj == 1559 or obj == 1751 or obj == 1685 then return true -- 種族IDが1579,1575,1555,1590ならば真を返す else return false end -- それ以外は偽を返す end -- 対象が草・きのこか?(true/false) function IsHerb(id) local obj = GetV(V_HOMUNTYPE,id) -- 対象の種族IDを得る if obj >= 1078 and obj <= 1085 then return true -- 種族IDが1078〜1085ならば真を返す else return false end -- それ以外は偽を返す end -- 対象がモンスターか?(true/false) function IsEnemy(id) if IsMonster(id) == 1 then -- 対象がモンスターであれば if false == IsPlant(id) then return true end -- 対象がバイオプラントでなければ真を返す end return false -- 偽を返す end -- 対象が死亡モーションか?(true/false) function IsMotionDead(id) if GetV(V_MOTION,id) == MOTION_DEAD then return true -- 対象が死亡モーションならば真を返す else return false end -- それ以外は偽を返す end -- 対象の死体が存在するか?(true/false) function IsDead(id) for i,v in ipairs(Actors) do -- 全てのオブジェクトについて if v == 100000 - id then return true end -- 100000から対象のIDを引いたIDのオブジェクトが存在したら真を返す end return false -- 偽を返す end -- 敵のレベルを得る function GetMobLv(id) local result local obj = GetV(V_HOMUNTYPE,id) -- 目標の敵種類を特定する result = GetMobData2(M_V_LV,obj) -- 敵のLvを検索する return result -- 敵のLvを返す end ------------------------------------------------- -- 索敵/戦闘関係 ------------------------------------------------- -- 対象が攻撃範囲内にいるか?(true/false) function IsInAttackRange(id1,id2) local d = GetDistance2 (id1,id2) -- 2つのオブジェクトの距離を得る if d == -1 then --視界外なら偽を返す return false elseif ATK_RANGE >= d then --攻撃範囲内なら真を返す return true else --範囲外なら偽を返す return false end end -- 対象が索敵範囲にいるか?(true/false) function InSearchRange(id) local dis_homn = GetDistance2(MyID,id) -- 対象とホムの距離を得る local dis_owner = GetDistance2(MyOwner,id) -- 対象とケミの距離を得る if dis_owner == -1 then return false end -- 対象が視野外ならば偽を返す if dis_homn <= HOM_SEARCH_RANGE or dis_owner <= CHE_SEARCH_RANGE then return true -- 対象がホムの索敵範囲か、ケミの索敵範囲にいれば真を返す else return false end -- それ以外は偽を返す end -- 対象が攻撃可能かチェックする function MobAllCheck(id) -- 対象が戦闘可能範囲外なら除外 if GetDistance2(id,MyOwner) > BATTLE_RANGE then return false end -- 対象がモンスターでなければ除外 if IsMonster(id) == 0 then return false end -- 対象が召喚プラントであれば除外 if IsPlant(id) then return false end -- 対象が死亡モーションであれば除外 if IsMotionDead(id) then return false end -- 対象の死体オブジェクトがあれば除外 if IsDead(id) then return false end -- 対象が無視設定されていれば除外 if IGNORE[GetV(V_HOMUNTYPE,id)][2] == 1 then return false end -- 対象の横殴りチェックが偽なら除外 if SideAtkCheck(id) == false then return false end -- 対象がデータなしならば除外 local moblv = GetMobData(M_V_LV,id) if moblv == 0 or moblv == nil then return false end -- 対象のレベルが適正なら除外 if moblv >= PREDATOR_LV or moblv <= IDIOT_LV then return false end -- 攻撃対象なら真を返す return true end -- 横殴りチェック function SideAtkCheck(id) if NO_SIDE_ATK <= 0 then return true end -- 横殴りチェックを使用しない場合は真を返す local tag = GetV(V_TARGET,id) --目標の敵が攻撃しているキャラIDを得る for i,v in ipairs(Others) do -- 全てのPCについて if NEAR_PC >= 1 then -- 他PCの近くの敵を攻撃しない場合 if GetDistance2(id,v) <= NEAR_PC_RANGE then return false end -- 対象と敵の距離が近かったら偽を返す end if ATK_PC_TO_MOB >= 1 then -- 他PCが攻撃している敵を攻撃しない場合 if GetV(V_TARGET,v) == id then return false end -- 対象が敵を攻撃していたら偽を返す end if ATK_MOB_TO_PC >= 1 then -- 他PCを攻撃している敵を攻撃しない場合 if tag == v then return false end -- 敵のターゲットが他PCなら偽を返す end end return true -- 横殴りにならないので真を返す end ------------------------------------------------- -- 行動関係 ------------------------------------------------- -- ホムはアクティブ行動可能か?(true/false) function IsActive() if GetV(V_MOTION,MyOwner) == MOTION_SIT then return false end -- ケミが座っているなら行動しない if HomFullRecover() == false then return false end -- HPSP全快までは行動しない if ACT_TYPE <= 0 then return false end -- ノンアクティブ設定なら行動しない return true --それ以外なら行動する end -- 対象にスキル使用可能か?(true/false) function SkillTarget(id) local obj = GetV(V_HOMUNTYPE,id) local mobname = GetMobData2(M_V_NAME,obj) local moblv = GetMobData2(M_V_LV,obj) local mdef1 = GetMobData2(M_V_MDEFDIV,obj) local mdef2 = GetMobData2(M_V_MDEFSUB,obj) local element = GetMobData2(M_V_ATT,obj) local elementlv = GetMobData2(M_V_ATTLV,obj) if moblv <= NO_SKILL_LV then return false end -- 目標のLvが低ければ使わない if IGNORE[obj][3] == 1 then return false end -- 目標が無視リストにいれば使わない if mdef1 >= NO_SKILL_MDEF1 then return false end -- 目標のMDEFが高いので使わない if mdef2 >= NO_SKILL_MDEF2 then return false end -- 目標のMDEFが高いので使わない if element == 6 and elementlv >= NO_SKILL_HOLY then return false end --目標が聖属性だと使わない if element == 7 and elementlv >= NO_SKILL_DARK then return false end --目標が闇属性だと使わない return true -- それ以外はスキルを使う end -- ケミから離れているか?(true/false) function FollowMe() local dis = GetDistanceFromOwner(MyID) if dis >= WAIT_RANGE or dis == -1 then return true end return false end --攻撃モーションキャンセル function MotionCancel() if MC_Flag <= 0 then return end --モーションキャンセルしないなら抜ける if HomSP <= MC_SP or HomHP <= MC_HP then --キャンセル開始HP、SPがないなら Move(MyID,HomX,HomY) --ホムの現在地に移動 else local mcx,mcy = GetV(V_POSITION,MyEnemy) if MC_Place == 0 then Move(MyID,mcx+1,mcy) MC_Place = 1 elseif MC_Place == 1 then Move(MyID,mcx,mcy+1) MC_Place = 2 elseif MC_Place == 2 then Move(MyID,mcx-1,mcy) MC_Place = 3 elseif MC_Place == 3 then Move(MyID,mcx,mcy-1) MC_Place = 0 end end end ------------------------------------------------- -- ホム攻撃スキル関係 ------------------------------------------------- -- スキルを設定 function SkillSetting() local type = GetV(V_HOMUNTYPE,MyID) if type == FILIR or type == FILIR2 then -- フィーリルなら MySkill = 8009 -- ムーンライト MySkillLevel = AUTO_SKILL_LV return 1 end if type == FILIR_H or type == FILIR_H2 then -- フィーリルなら MySkill = 8009 -- ムーンライト MySkillLevel = AUTO_SKILL_LV return 1 end if type == VANILMIRTH or type == VANILMIRTH2 then -- バニルなら MySkill = 8013 -- カプリス MySkillLevel = AUTO_SKILL_LV return 1 end if type == VANILMIRTH_H or type == VANILMIRTH_H2 then -- バニルなら MySkill = 8013 -- カプリス MySkillLevel = AUTO_SKILL_LV return 1 end -- もふもふ、幼女なら MySkill = 0 MySkillLevel = 0 return 0 end -- 自動スキル function AutoSkill(id) if SKL == 0 then return end -- スキル設定が偽なら抜ける if SkillTarget(id) == false then return end -- 対象がスキル使用不可なら抜ける if AS_SWITCH <= OFF and FirstAtk <= 0 then return end -- 自動スキル使用禁止で、初弾でなければ偽を返す if HomSP < SKILL_SP then return end -- SPがスキル使用可能より小さければ local obj = GetV(V_HOMUNTYPE,id) -- 目標の敵種族を取得 local moblv = GetMobData2(M_V_LV,obj) -- データから敵Lvを検索 if FirstAtk >= 1 or moblv >= HATEFUL_LV or HomSP > SKILL_SPP then -- 初弾か、強敵か、SPが余っているなら SkillObject (MyID,MySkillLevel,MySkill,id) -- スキル攻撃 end end ------------------------------------------------- -- ポーションピッチャー関係 ------------------------------------------------- -- ホムへのポーションピッチャー function AutoHomPP() local app_flag = 0 -- PP可能フラグ if APP_SWITCH <= 0 then return end -- 自動PP使用禁止なら抜ける if Times <= Skilltime then return end -- スキル使用時間でないなら抜ける if NO_POTION == 1 then return end -- ポーション無しフラグがオンなら抜ける if APP_COUNT == 1 then HOM_HP = HomHP end -- 自動PP1回目ならホムのHPを保存 if HomHP <= APP_HP then app_flag = 1 -- ホムのHPがPP開始HP以下ならPP可能フラグをオン else APP_COUNT = 1 end -- ホムのHPがPP開始HPより大きければ使用回数をリセット if app_flag == 1 then -- 自動PP可能フラグがオンなら if GetDistanceFromOwner(MyID) >9 then -- PP範囲外にホムがいるなら手元に戻す MoveToOwner(MyID) return end SkillObject(MyID,APP_LV,231,MyID) -- PPを使用 Skilltime = Times + 500 --次のPP動作時間を記録 APP_COUNT = APP_COUNT+1 -- 自動PP使用回数をカウント end if APP_SAFETY >= 1 then if APP_COUNT > APP_STOP_COUNT then -- 自動PP使用回数が自動PP停止回数を超えた場合 if HomHP >= HOM_HP then -- ホムの現在のHPが保存したHP以下だったら NO_POTION = 1 -- ポーション無しフラグをオン end end end end -- ケミへのポーションピッチャー function AutoOwnPP() local app_own_flag = 0 -- PP可能フラグ if APP_OWN_SWITCH <= 0 then return end -- 自動PP使用禁止なら抜ける if Times <= Skilltime then return end -- スキル使用時間でないなら抜ける if NO_POTION == 1 then return end -- ポーション無しフラグがオンなら抜ける if APP_OWN_COUNT == 1 then OWN_HP = OwnHP end -- 自動PP1回目ならケミのHPを保存 if OwnHP <= APP_OWN_HP then app_own_flag = 1 -- ケミのHPがPP開始HP以下ならPP可能フラグをオン else APP_OWN_COUNT = 1 end -- ホムのHPがPP開始HPより大きければ使用回数をリセット if app_own_flag == 1 then -- 自動PP可能フラグがオンなら SkillObject(MyID,APP_OWN_LV,231,MyOwner) -- PPを使用 Skilltime = Times + 500 --次のPP動作時間を記録 APP_OWN_COUNT = APP_OWN_COUNT+1 -- 自動PP使用回数をカウント end if APP_SAFETY >= 1 then if APP_OWN_COUNT > APP_OWN_STOP_COUNT then -- 自動PP使用回数が自動PP停止回数を超えた場合 if OwnHP >= OWN_HP then -- ケミの現在のHPが保存したHP以下だったら NO_POTION = 1 -- ポーション無しフラグをオン end end end end ------------------------------------------------- -- テレポート・ADS・ログアウト関係 ------------------------------------------------- --id=敵のID・n=画面内の敵の数 function Teleport(code,id,n) if code == 0 then --POT切れログアウトの確認 if NO_POTION == 1 then os.exit() end --POT切れならクライアントを落とす elseif code == 1 then -- 強制テレポート・ログアウトの確認 if Times > Exittime then os.exit() end --時刻になったら強制ログアウト if TeleFlagA >=1 then if Times > TeletimeB then --時刻になったら強制でテレポート窓を出す Packtime = Packtime +2000 --ダブルテレポ防止で2秒の待機時間 SkillObject(MyID,1,26,MyOwner) return end end elseif code == 2 then -- 索敵テレポートの確認 if TeleFlagA >=1 then if Times > TeletimeA then --時刻になったらテレポート窓を出す Packtime = Packtime +2000 --ダブルテレポ防止で2秒の待機時間 SkillObject(MyID,1,26,MyOwner) return end end elseif code == 3 then -- 回避テレポート・回避ADSの確認 if TeleFlagB >=1 then if Lvtele <= GetMobData(M_V_LV,id) then --敵がテレポLv以上なら窓を開く Packtime = Packtime +2000 --ダブルテレポ防止で2秒の待機時間 SkillObject(MyID,1,26,MyOwner) return elseif n >= Mobflood then --Mobが指定以上の数だったらテレポ Packtime = Packtime +2000 --ダブルテレポ防止で2秒の待機時間 SkillObject(MyID,1,26,MyOwner) return end end if Times >= Skilltime and AutoADS >= 1 then --ADS使用についての確認 if LvADS <= GetMobData(M_V_LV,id) then --敵がADSLv以上なら投げる SkillObject(MyID,ADSL,490,id) Skilltime = Times + 1000*OwnDelay + 1000 end end end end