using Emgu.CV; using Emgu.CV.Structure; using RichCreator.Maps; using RichCreator.Utility; using RichCreator.Utility.Captures; using RichCreator.Utility.CV; using RichCreator.Utility.Structs; using RichCreator.Utilitys; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RichCreator.StateMachines { /// /// 频道状态机 /// public class ChannelStateMachine:StateMachineBase { //默认状态 private ChannelStates currentState = ChannelStates.Start; //频道选择文字的位置 private ZTRectangle channelChoiceTextRect = ZTRectangle.Empty; //目前仅支持寂静城 private const Int32 channelIndex = 1;//0:时空之门,1:寂静城 //频道距离“频道选择文字”的偏移 private static ZTPoint[] channelOffsets = new ZTPoint[] { new ZTPoint(-270,252), new ZTPoint(-270,293) }; //首次进入标记 private bool FirstEntryHouse = true; /// /// 开始工作 /// public ZTResult Work(ZTRectangle gameRect,bool isGroupMode,CancellationToken cancelToken,Int64 timeoutMillSecond) { if (timeoutMillSecond <= 0) { throw new ArgumentOutOfRangeException("过期时间不能小于等于0"); } DateTime timeoutTime = DateTime.Now.AddMilliseconds(timeoutMillSecond); while (true) { G.Instance.InfoWriter("states:" + currentState.ToString()); if (currentState == ChannelStates.Complete) { //完成 break; } if (cancelToken.IsCancellationRequested) { //取消 return ZTResult.Cancel; } if (DateTime.Now > timeoutTime) { //超时 return ZTResult.Timeout; } switch (currentState) { case ChannelStates.Start: //开始 currentState = ChannelStates.CheckSailiyaHouse; break; case ChannelStates.CheckSailiyaHouse: //检测是否赛丽亚的房间 if (DnfCVHelper.IsInSaiLiYaHouse(gameRect)) { //检测是否组队模式 currentState = ChannelStates.IsFirstEntry; } else { currentState = ChannelStates.IsChoiceRolePage; } break; case ChannelStates.IsFirstEntry: //是否初次进入 if (this.FirstEntryHouse) { this.FirstEntryHouse = false; currentState = ChannelStates.CloseAllWindow1; } else { currentState = ChannelStates.CheckGroupMode; } break; case ChannelStates.CloseAllWindow1: //关闭所有窗口1 GameUtils.CloseAllAlertWindowByX(cancelToken, gameRect); currentState = ChannelStates.CheckGroupMode; break; case ChannelStates.IsChoiceRolePage: //检测是否角色选择界面 ZTRectangle startGameButtonRect = ZTRectangle.Empty; if (DnfCVHelper.IsSelectRoleWindow(out startGameButtonRect)) { currentState = ChannelStates.ConfirmAutoChange; } else { currentState = ChannelStates.CheckSailiyaHouse; Thread.Sleep(1000); } break; case ChannelStates.ConfirmAutoChange: //查找“确认”按钮并点击,并等待2秒 ZTRectangle confirmButtonRect = ZTRectangle.Empty; if (ChannelCVHelper.HasConnectionErrorInChoiceRole(out confirmButtonRect)) { G.Instance.InputControl.MoveToAndClick(confirmButtonRect.GetCenterPoint()); } currentState = ChannelStates.CheckSailiyaHouse; Thread.Sleep(2000); break; case ChannelStates.CheckGroupMode: //是否组队模式 if (isGroupMode) { currentState = ChannelStates.CheckChannel; } else { currentState = ChannelStates.CheckConnectIsValid; } break; case ChannelStates.CheckConnectIsValid: //是否有效网络连接 ZTPoint validButtonPoint = ZTPoint.Empty; if (ChannelCVHelper.HasConnectIsVaildWindow(out validButtonPoint, gameRect)) { G.Instance.InputControl.MoveToAndClick(validButtonPoint); currentState = ChannelStates.ChangeChannelPageIsOpen; Thread.Sleep(2000); } else { currentState = ChannelStates.CloseAllWindow; } break; case ChannelStates.CheckChannel: //是否指定频道 if (ChannelCVHelper.IsInJijingchengChannel(gameRect)) { currentState = ChannelStates.CheckConnectIsValid; } else { currentState = ChannelStates.ChangeChannelPageIsOpen; } break; case ChannelStates.ChangeChannelPageIsOpen: //切换频道界面是否打开 if (ChannelCVHelper.IsOpenChannelChoiceWindow(out channelChoiceTextRect, gameRect)) { currentState = ChannelStates.ChangeChannel; } else { currentState = ChannelStates.OpenChangeChannelPage; } break; case ChannelStates.ChangeChannel: //双击切换频道,等待两秒 ZTPoint textCenterPoint = channelChoiceTextRect.GetCenterPoint(); ZTPoint clickPoint = textCenterPoint.Add(channelOffsets[channelIndex]); G.Instance.InputControl.MoveToAndDClick(clickPoint); Thread.Sleep(2000); currentState = ChannelStates.CheckSailiyaHouse; break; case ChannelStates.OpenChangeChannelPage: //打开切换频道界面 G.Instance.InputControl.MoveToAndClick(new ZTPoint(gameRect.Start.X +690, gameRect.Start.Y + 11)); Thread.Sleep(2000); currentState = ChannelStates.ChangeChannelPageIsOpen; break; case ChannelStates.CloseAllWindow: //关闭所有窗口 GameUtils.CloseAllAlertWindowByX(cancelToken,gameRect); currentState = ChannelStates.Complete; break; default: return ZTResult.Failed; } } return ZTResult.Success; } /// /// 频道状态 /// public enum ChannelStates { Start,//开始 CheckSailiyaHouse,//检测是否赛丽亚的房间 IsChoiceRolePage,//检测是否角色选择界面 ConfirmAutoChange,//查找“确认”按钮并点击 CheckGroupMode,//是否组队模式 CheckConnectIsValid,//是否有效网络连接 CheckChannel,//是否指定频道 ChangeChannelPageIsOpen,//切换频道界面是否打开 ChangeChannel,//双击切换频道,等待两秒 OpenChangeChannelPage,//打开切换频道界面 CloseAllWindow,//关闭所有窗口 IsFirstEntry,//是否首次进入赛丽亚的房间 CloseAllWindow1,//关闭所有窗口1 Complete//完成 } } }