/// <summary> /// コンストラクタ /// </summary> /// <param name="iSettings"></param> public UpdateDBTool(Settings iSettings) { settings = iSettings; fishDB = new FishDB(); historyDB = new FishHistoryDB(DUMMY_PLAYER_NAME, DateTime.Today); serverName = "http://" + settings.Global.UpdateDB.ServerName; }
/// <summary> /// 履歴に追加 /// </summary> /// <param name="iPlayername">プレイヤー名</param> /// <param name="iHistory">FishHistoryDBFishModel</param> /// <returns>True:成功</returns> public bool Add(string iPlayerName, DateTime iEarthDate, string iVanaDate, string iFishName, string iItemName) { HarakiriDBModel harakiriDB = getHarakiriDB(); harakiriDB.Version = VERSION; if (harakiriDB.Fishes.Contains(new HarakiriDBFishModel(iFishName))) { HarakiriDBFishModel fish = harakiriDB.Fishes[harakiriDB.Fishes.IndexOf(new HarakiriDBFishModel(iFishName))]; fish.Count++; if (iItemName != string.Empty) { if (fish.Items.Contains(new HarakiriDBItemModel(iItemName))) { //Items更新 HarakiriDBItemModel item = fish.Items[fish.Items.IndexOf(new HarakiriDBItemModel(iItemName))]; item.Count++; } else { //Items追加 HarakiriDBItemModel item = new HarakiriDBItemModel(); item.ItemName = iItemName; item.Count = 1; fish.Items.Add(item); } } } else { //Fishes追加 HarakiriDBFishModel fish = new HarakiriDBFishModel(); fish.FishName = iFishName; fish.Count = 1; if (iItemName != string.Empty) { HarakiriDBItemModel item = new HarakiriDBItemModel(); item.ItemName = iItemName; item.Count = 1; fish.Items.Add(item); } harakiriDB.Fishes.Add(fish); } //ソート harakiriDB.Fishes.Sort(HarakiriDBFishModel.SortTypeCount); for (int i = 0; i < harakiriDB.Fishes.Count; i++) { harakiriDB.Fishes[i].Items.Sort(HarakiriDBItemModel.SortTypeCount); } //履歴DBに保存 FishHistoryDB historyDB = new FishHistoryDB(iPlayerName, iEarthDate); if (historyDB.AddHarakiri(iPlayerName, new FishHistoryDBHarakiriModel(iEarthDate.ToString("yyyy/MM/dd HH:mm:ss"), iVanaDate, iFishName, iItemName))) { //ハラキリDBに保存 return(putHarakiriDB(harakiriDB)); } return(false); }
/// <summary> /// 履歴に追加 /// </summary> /// <param name="iPlayername">プレイヤー名</param> /// <param name="iHistory">FishHistoryDBFishModel</param> /// <returns>True:成功</returns> public bool Add(string iPlayerName, DateTime iEarthDate, string iVanaDate, string iFishName, string iItemName) { HarakiriDBModel harakiriDB = getHarakiriDB(); harakiriDB.Version = VERSION; if (harakiriDB.Fishes.Contains(new HarakiriDBFishModel(iFishName))) { HarakiriDBFishModel fish = harakiriDB.Fishes[harakiriDB.Fishes.IndexOf(new HarakiriDBFishModel(iFishName))]; fish.Count++; if (iItemName != string.Empty) { if (fish.Items.Contains(new HarakiriDBItemModel(iItemName))) { //Items更新 HarakiriDBItemModel item = fish.Items[fish.Items.IndexOf(new HarakiriDBItemModel(iItemName))]; item.Count++; } else { //Items追加 HarakiriDBItemModel item = new HarakiriDBItemModel(); item.ItemName = iItemName; item.Count = 1; fish.Items.Add(item); } } } else { //Fishes追加 HarakiriDBFishModel fish = new HarakiriDBFishModel(); fish.FishName = iFishName; fish.Count = 1; if (iItemName != string.Empty) { HarakiriDBItemModel item = new HarakiriDBItemModel(); item.ItemName = iItemName; item.Count = 1; fish.Items.Add(item); } harakiriDB.Fishes.Add(fish); } //ソート harakiriDB.Fishes.Sort(HarakiriDBFishModel.SortTypeCount); for (int i = 0; i < harakiriDB.Fishes.Count; i++) { harakiriDB.Fishes[i].Items.Sort(HarakiriDBItemModel.SortTypeCount); } //履歴DBに保存 FishHistoryDB historyDB = new FishHistoryDB(iPlayerName, iEarthDate, logger); if(historyDB.AddHarakiri(iPlayerName, new FishHistoryDBHarakiriModel(iEarthDate.ToString("yyyy/MM/dd HH:mm:ss"),iVanaDate,iFishName,iItemName))) { //ハラキリDBに保存 return putHarakiriDB(harakiriDB); } return false; }
/// <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; }
/// <summary> /// コンストラクタ処理部 /// </summary> /// <param name="iPol"></param> private void constructor(PolTool iPol) { //PolTool初期設定 pol = iPol; pol.ChangeStatus += new PolTool.ChangeStatusEventHandler(this.PolTool_ChangeStatus); //FFACE初期設定 fface = iPol.FFACE; //LoggerTool初期設定 logger = new LoggerTool(MiscTool.GetAppAssemblyName(), pol.FFACE.Player.Name); logger.Enable = args.LoggerEnable; logger.OutputLogLevel = args.LoggerLogLevel; logger.EnableVarDump = args.LoggerVarDumpEnable; logger.Output(LogLevelKind.INFO, string.Format("===== {0} {1} =====", MiscTool.GetAppAssemblyName(), MiscTool.GetAppVersion())); logger.Output(LogLevelKind.INFO, string.Format("デバッグログ:{0} ログレベル:{1} 変数出力:{2}", args.LoggerEnable, args.LoggerLogLevel, args.LoggerVarDumpEnable)); logger.Output(LogLevelKind.INFO, string.Format("プロセス({0})にアタッチしました", pol.ProcessID)); //Settings初期設定 settings = new Settings(iPol.FFACE.Player.Name); //ChatTool初期設定 chat = new ChatTool(iPol.FFACE); chat.ReceivedCommand += new ChatTool.ReceivedCommandEventHandler(this.ChatTool_ReceivedCommand); logger.Output(LogLevelKind.DEBUG, "ChatTool起動"); //FishingTool初期設定 fishing = new FishingTool(iPol, chat, settings, logger); fishing.Fished += new FishingTool.FishedEventHandler(this.FishingTool_Fished); fishing.ChangeMessage += new FishingTool.ChangeMessageEventHandler(this.FishingTool_ChangeMessage); fishing.ChangeStatus += new FishingTool.ChangeStatusEventHandler(this.FishingTool_ChangeStatus); fishing.CaughtFishesUpdate += new FishingTool.CaughtFishesUpdateEventHandler(this.FishingTool_CaughtFishesUpdate); logger.Output(LogLevelKind.DEBUG, "FishingTool起動"); //HarakiriTool初期設定 harakiri = new HarakiriTool(iPol, chat, settings, logger); harakiri.HarakiriOnce += new HarakiriTool.HarakiriOnceEventHandler(this.HarakiriTool_HarakiriOnce); harakiri.ChangeMessage += new HarakiriTool.ChangeMessageEventHandler(this.HarakiriTool_ChangeMessage); harakiri.ChangeStatus += new HarakiriTool.ChangeStatusEventHandler(this.HarakiriTool_ChangeStatus); logger.Output(LogLevelKind.DEBUG, "HarakiriTool起動"); //FFACEControl初期設定 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; logger.Output(LogLevelKind.DEBUG, "FFACEControl起動"); //監視スレッド起動 thMonitor = new Thread(threadMonitor); thMonitor.Start(); logger.Output(LogLevelKind.DEBUG, "監視スレッド起動"); //DB fishDB = new FishDB(logger); fishHistoryDB = new FishHistoryDB(fishing.PlayerName, fishing.EarthDateTime, logger); harakiriDB = new HarakiriDB(logger); //古いデータをコンバート converter(); //DB更新 updatedb = new UpdateDBTool(settings, logger); updatedb.ReceiveMessage += new UpdateDBTool.ReceiveMessageEventHandler(this.UpdateDBTool_ReceiveMessage); updatedb.NewerVersion += new UpdateDBTool.NewerVersionEventHandler(this.UpdateDBTool_NewerVersion); }