/// <summary> /// メインスレッド /// </summary> private void threadFishing() { bool firstTime = true; interrupt = new FishingInterrupt(false, false, false, false, false); noCatchCount = 0; lastRodName = string.Empty; lastBaitName = string.Empty; lastZoneName = string.Empty; chat.CurrentIndex = chat.MaxIndex; setFishingStatus(FishingStatusKind.Normal); FishHistoryDBFishModel fish = new FishHistoryDBFishModel(); logger.Output(LogLevelKind.DEBUG, "釣りスレッド開始"); setMessage("開始しました"); //メニュー開いていたら閉じる if (!control.CloseDialog()) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("メニューが閉じられない"); return; } //着替え setEquipGear(); //魚リスト更新 EventFished(FishResultStatusKind.Unknown); //釣りメインループ while (this.RunningStatus == RunningStatusKind.Running) { //日付が変わったら経過時間クリア if (DateTime.Now.Date != lastCastDate.Date) { fishHistoryDB = new FishHistoryDB(this.PlayerName, this.EarthDateTime, logger); FishHistoryDBModel history = fishHistoryDB.SelectDayly(this.PlayerName, this.EarthDateTime); this.TimeElapsed = history.TimeElapsed; } lastCastDate = DateTime.Now.Date; //チャット処理 FFACE.ChatTools.ChatLine cl = new FFACE.ChatTools.ChatLine(); while (chat.GetNextChatLine(out cl)) { List<string> chatKbnArgs = new List<string>(); ChatKbnKind chatKbn = getChatKbnFromChatline(cl, out chatKbnArgs); logger.Output(LogLevelKind.DEBUG, string.Format("Chat:{0} ChatKbn:{1}", cl.Text, chatKbn)); } //敵からの攻撃感知 if (this.RunningStatus != RunningStatusKind.Running) break; if (interrupt.EnemyAttack) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("敵から攻撃されたので停止"); //コマンド実行 if (settings.Fishing.EnemyAttackCmd) { fface.Windower.SendString(settings.Fishing.EnemyAttackCmdLine); } break; } //チャット感知 if (this.RunningStatus != RunningStatusKind.Running) break; if (interrupt.ChatReceive) { if (settings.Fishing.ChatRestart) { setFishingStatus(FishingStatusKind.Wait); double waitSec = (double)(settings.Fishing.ChatRestartMinute * 60); DateTime restartTime = DateTime.Now.AddMinutes(settings.Fishing.ChatRestartMinute); setMessage(string.Format("チャット感知:再始動待ち {0}(地球時間)まで待機", restartTime.ToString("HH:mm:ss"))); wait(waitSec, waitSec); //チャットバッファをクリア FFACE.ChatTools.ChatLine waitCl = new FFACE.ChatTools.ChatLine(); while (chat.GetNextChatLine(out waitCl)) { Thread.Sleep(10); } //チャット受信フラグクリア interrupt.ChatReceive = false; setFishingStatus(FishingStatusKind.Normal); } else { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("チャットを感知したので停止"); break; } } //入港警告感知 if (this.RunningStatus != RunningStatusKind.Running) break; if (settings.Fishing.EntryPort) { if (interrupt.ShipWarning) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("入港するので停止"); break; } } //エミネンスクリア if (this.RunningStatus != RunningStatusKind.Running) break; if (settings.Fishing.EminenceClear) { if (interrupt.ClearEminence) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("エミネンスをクリアしたので停止"); break; } } //エリア切り替わり感知 if (this.RunningStatus != RunningStatusKind.Running) break; if (this.lastZoneName.Length > 0 && this.lastZoneName != this.ZoneName) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("エリアが切り替わったので停止"); break; } //釣果数 if (this.RunningStatus != RunningStatusKind.Running) break; if (settings.Fishing.MaxCatch) { if (this.fishHistoryDB.CatchCount >= settings.Fishing.MaxCatchCount) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("本日の釣果数が規定値になったので停止"); break; } } //釣果無し if (this.RunningStatus != RunningStatusKind.Running) break; if (settings.Fishing.MaxNoCatch) { if (noCatchCount >= settings.Fishing.MaxNoCatchCount) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("連続釣果無しが規定値になったので停止"); break; } } //釣りスキル if (this.RunningStatus != RunningStatusKind.Running) break; if (settings.Fishing.MaxSkill) { if (this.FishingSkill >= settings.Fishing.MaxSkillValue) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("釣りスキルが規定値になったので停止"); break; } } //スニーク if (this.RunningStatus != RunningStatusKind.Running) break; if (settings.Fishing.SneakFishing && settings.UseCancel) { if (interrupt.SneakWarning || !control.IsBuff(StatusEffect.Sneak)) { setMessage("スニークをかけます"); castSneak(); interrupt.SneakWarning = false; } } //鞄1 if (this.RunningStatus != RunningStatusKind.Running) break; if (this.InventoryCount >= this.InventoryMax) { if (!putFish()) { if (settings.Fishing.InventoryFullCmd) { fface.Windower.SendString(settings.Fishing.InventoryFullCmdLine); } setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("鞄がいっぱいなので停止"); break; } } //竿 if (this.RunningStatus != RunningStatusKind.Running) break; if (this.RodName == string.Empty) { if (!string.IsNullOrEmpty(lastRodName) && !control.IsExistItem(lastRodName, FFACETools.InventoryType.Inventory) && !control.IsExistItem(lastRodName, FFACETools.InventoryType.Wardrobe)) { //予備の竿を鞄へ移動 if (!getRodBaitItem(lastRodName)) { //竿の修理 if (settings.Fishing.RepairRod && settings.UseItemizer) { if (!repairRod(lastRodName)) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); break; } Thread.Sleep(2000); } } } if (!setRod(lastRodName)) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("釣り竿を装備していないので停止"); //コマンド実行 if (settings.Fishing.NoBaitNoRodCmd) { fface.Windower.SendString(settings.Fishing.NoBaitNoRodCmdLine); } break; } } //エサ if (this.RunningStatus != RunningStatusKind.Running) break; if (this.BaitName == string.Empty) { if (!string.IsNullOrEmpty(lastBaitName) && !control.IsExistItem(lastBaitName, FFACETools.InventoryType.Inventory) && !control.IsExistItem(lastBaitName, FFACETools.InventoryType.Wardrobe)) { getRodBaitItem(lastBaitName); } if (!setBait(lastBaitName)) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("エサを装備していないので停止"); //コマンド実行 if (settings.Fishing.NoBaitNoRodCmd) { fface.Windower.SendString(settings.Fishing.NoBaitNoRodCmdLine); } break; } } //鞄2 if (this.RunningStatus != RunningStatusKind.Running) break; if (this.InventoryCount >= this.InventoryMax) { if (!putFish()) { if (settings.Fishing.InventoryFullCmd) { fface.Windower.SendString(settings.Fishing.InventoryFullCmdLine); } setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Normal); setMessage("鞄がいっぱいなので停止"); break; } } //エンチャントアイテム使用 if (this.RunningStatus != RunningStatusKind.Running) break; if (!useEnchantedItem()) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("エンチャントアイテムが使用できなかったので停止"); break; } //食事 if (this.RunningStatus != RunningStatusKind.Running) break; if (!useFood()) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("食事アイテムが使用できなかったので停止"); break; } //ヴァナ時間 if (this.RunningStatus != RunningStatusKind.Running) break; while (settings.Fishing.VanaTime && this.RunningStatus == RunningStatusKind.Running && !isHourInRange(this.VanaDateTime, settings.Fishing.VanaTimeFrom, settings.Fishing.VanaTimeTo)) { setFishingStatus(FishingStatusKind.Wait); setMessage(string.Format("{0}時(ヴァナ時間)になるまで待機中", settings.Fishing.VanaTimeFrom)); Thread.Sleep(settings.Global.WaitBase); } setFishingStatus(FishingStatusKind.Normal); //地球時間 if (this.RunningStatus != RunningStatusKind.Running) break; while (settings.Fishing.EarthTime && this.RunningStatus == RunningStatusKind.Running && !isHourInRange(this.EarthDateTime, settings.Fishing.EarthTimeFrom, settings.Fishing.EarthTimeTo)) { setFishingStatus(FishingStatusKind.Wait); setMessage(string.Format("{0}時(地球時間)になるまで待機中", settings.Fishing.EarthTimeFrom)); Thread.Sleep(settings.Global.WaitBase); } setFishingStatus(FishingStatusKind.Normal); //リキャスト時間待機(初回は判定しない) if (!firstTime && settings.Fishing.RecastTime) { wait(settings.Fishing.RecastTimeMin, settings.Fishing.RecastTimeMax, "リキャスト待機中:{0:0.0}s"); } //メニュー開いていたら閉じる if (this.RunningStatus != RunningStatusKind.Running) break; if (!control.CloseDialog()) { setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); setMessage("メニューが閉じられない"); break; } //魚を釣る if (this.RunningStatus != RunningStatusKind.Running) break; if (!FishingOnce(out fish)) { //エラー発生時処理 setRunningStatus(RunningStatusKind.Stop); setFishingStatus(FishingStatusKind.Error); break; } firstTime = false; Thread.Sleep(settings.Global.WaitBase); } logger.Output(LogLevelKind.DEBUG, "釣りスレッド終了"); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="iFFACE"></param> /// <param name="iChat"></param> /// <param name="iSettings"></param> /// <param name="iLogger"></param> public FishingTool(PolTool iPol, ChatTool iChat, Settings iSettings, LoggerTool iLogger) { pol = iPol; pol.ChangeStatus += new PolTool.ChangeStatusEventHandler(this.PolTool_ChangeStatus); fface = iPol.FFACE; chat = iChat; settings = iSettings; logger = iLogger; FishDB = new FishDB(logger); fishHistoryDB = new FishHistoryDB(this.PlayerName,this.EarthDateTime, logger); FishHistoryDBModel history = fishHistoryDB.SelectDayly(this.PlayerName, this.EarthDateTime); this.TimeElapsed = history.TimeElapsed; control = new FFACEControl(pol, chat, logger); control.MaxLoopCount = Constants.MAX_LOOP_COUNT; control.UseEnternity = settings.UseEnternity; control.BaseWait = settings.Global.WaitBase; control.ChatWait = settings.Global.WaitChat; this.RunningStatus = RunningStatusKind.Stop; this.FishingStatus = FishingStatusKind.Normal; }