using RichCreator.Utility; using RichCreator.Utility.Captures; using RichCreator.Utility.CV; using RichCreator.Utility.InputControl; using RichCreator.Utility.Structs; using RichCreator.Utility.Utilitys; using Emgu.CV; using Emgu.CV.Structure; using RichCreator.Jobs; using RichCreator.Jobs.StateMachines; using System; using System.Collections.Generic; using System.Threading; namespace RichCreator.Maps { /// /// 组队 /// public class GroupMap : MapInfo { /// /// 游戏区域 /// public ZTRectangle GameRect { get; set; } public CancellationToken cancellationToken { get; set; } private const bool isCreateGroup = false; public override bool Start(ZTRectangle gameRect, CancellationToken cancelToken, Int32 runningStep) { this.GameRect = gameRect; this.cancellationToken = cancelToken; WindowUtils.SetDnfToTop(); string groupName = "aabbccddee"; if (isCreateGroup) { //创建队伍 if (!CreateGroup(groupName)) { G.Instance.InfoWriter("创建队伍失败"); return false; } } else { //加入队伍 if (!JoinGroup(groupName)) { G.Instance.InfoWriter("加入队伍失败"); return false; } } CloseAllAlertWindow(this.cancellationToken, this.GameRect); return true; } /// /// 切换频道 /// /// /// private bool ChangeChannel(ChannelItem channelItem) { return true; } /// /// 创建队伍 /// /// private bool CreateGroup(string groupName) { ZTRectangle mygroupButtonRect = ZTRectangle.Empty; //打开队伍信息窗口 ZTRectangle groupWindowTextRect = ZTRectangle.Empty; ZTRectangle searchButtonRect = ZTRectangle.Empty; ZTRectangle createGroupButtonRect = ZTRectangle.Empty; bool hasGroup = false; if (!OpenGroupWindow(out groupWindowTextRect,out searchButtonRect,out createGroupButtonRect,out hasGroup)) { G.Instance.InfoWriter("打开组队信息窗口失败"); return false; } if (hasGroup) { return true; } //打开创建队伍窗口 ZTRectangle createGroupWindowTextRect = ZTRectangle.Empty, okButtonRect = ZTRectangle.Empty; if (!OpenCreateGroupWindow(out createGroupWindowTextRect,out okButtonRect ,createGroupButtonRect)) { return false; } ZTPoint windowCenter = createGroupWindowTextRect.GetCenterPoint(); G.Instance.InputControl.MoveToAndClick(new ZTPoint(windowCenter.X + 50, windowCenter.Y + 80)); //清空文字 for (int i = 0; i < 15; i++) { G.Instance.InputControl.PressKey(false, false, false, false, false, false, false, false, HIDCode.Backspace); } //输入队伍名 G.Instance.InputControl.InputString(groupName); //点击创建 G.Instance.InputControl.MoveToAndClick(okButtonRect.GetCenterPoint()); bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => { //识别是否有我的队伍按钮 return GroupCVHelper.ExistsMyGroupButton(out mygroupButtonRect, this.GameRect); }); if (result) { G.Instance.InfoWriter("group ok"); return true; } return false; } /// /// 加入队伍 /// /// private bool JoinGroup(string groupName) { ZTRectangle mygroupButtonRect = ZTRectangle.Empty; //打开队伍信息窗口 ZTRectangle groupWindowTextRect = ZTRectangle.Empty; ZTRectangle searchButtonRect = ZTRectangle.Empty; ZTRectangle createGroupButtonRect = ZTRectangle.Empty; bool hasGroup = false; if (!OpenGroupWindow(out groupWindowTextRect,out searchButtonRect, out createGroupButtonRect, out hasGroup)) { G.Instance.InfoWriter("打开组队信息窗口失败"); return false; } if (hasGroup) { return true; } ZTPoint searchButtonCenerPoint = searchButtonRect.GetCenterPoint(); //输入组名 G.Instance.InputControl.MoveToAndClick(new ZTPoint (searchButtonCenerPoint.X-80,searchButtonCenerPoint.Y)); DeleteAllChar(groupName.Length + 3); G.Instance.InputControl.InputString(groupName); //点搜索 G.Instance.InputControl.MoveToAndClick(searchButtonCenerPoint); //查找组项 ZTRectangle groupItemRect = ZTRectangle.Empty; bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => { //识别组项 return GroupCVHelper.FindGroupItem(out groupItemRect, this.GameRect); }); if (!result) { G.Instance.InfoWriter("group item not finded"); return true; } //点组名打开窗口 G.Instance.InputControl.MoveToAndClick(groupItemRect.GetCenterPoint()); //查找是否打开成员列表窗 ZTRectangle joinButtonRect = ZTRectangle.Empty; result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => { //识别是否打开成员列表窗 return GroupCVHelper.FindGroupMemberWindow(out joinButtonRect, this.GameRect); }); if (!result) { G.Instance.InfoWriter("group member window not finded"); return true; } //点击加入队伍 G.Instance.InputControl.MoveToAndClick(joinButtonRect.GetCenterPoint()); //查找是否已经组队成功,30秒 result = FuncUtils.TimeoutCancelableWrap(30000, this.cancellationToken, () => { //识别是否有我的队伍按钮 return GroupCVHelper.ExistsMyGroupButton(out mygroupButtonRect, this.GameRect); }); if (result) { G.Instance.InfoWriter("group ok"); return true; } return false; } /// /// 打开技能窗 /// /// /// /// /// /// private bool OpenGroupWindow(out ZTRectangle groupWindowTextRect,out ZTRectangle searchButtonRect, out ZTRectangle createGroupButton,out bool hasGroup) { hasGroup = false; createGroupButton = ZTRectangle.Empty; groupWindowTextRect = ZTRectangle.Empty; searchButtonRect = ZTRectangle.Empty; bool innerHasGroup = false; ZTRectangle innerGroupWindowTextRect = ZTRectangle.Empty, innerSearchButtonRect = ZTRectangle.Empty, innerCreateGroupButton = ZTRectangle.Empty; for (int i = 0; i < 2; i++) { CloseAllAlertWindow(this.cancellationToken, this.GameRect); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightSquarebrackets); bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => { //识别队伍窗 return GroupCVHelper.FindGroupWindow(out innerGroupWindowTextRect, out innerSearchButtonRect, out innerCreateGroupButton,out innerHasGroup, this.GameRect); }); if (result) { groupWindowTextRect = innerGroupWindowTextRect; searchButtonRect = innerSearchButtonRect; createGroupButton = innerCreateGroupButton; hasGroup = innerHasGroup; return true; } } G.Instance.InfoWriter("打开队伍信息对话框失败"); return false; } /// /// 删除左右指定数量的字符 /// /// private void DeleteAllChar(int count) { for (int i = 0; i < count; i++) { G.Instance.InputControl.PressKey(false, false, false, false, false, false, false, false, HIDCode.Delete); G.Instance.InputControl.PressKey(false, false, false, false, false, false, false, false, HIDCode.Backspace); } } /// /// 打开创建队伍窗口 /// /// /// private bool OpenCreateGroupWindow(out ZTRectangle createGroupWindowTextRect,out ZTRectangle okButtonRect,ZTRectangle createGroupButtonRect) { createGroupWindowTextRect = ZTRectangle.Empty; okButtonRect = ZTRectangle.Empty; ZTRectangle innerCreateGroupWindowTextRect = ZTRectangle.Empty, innerOkButtonRect = ZTRectangle.Empty; for (int i = 0; i < 2; i++) { //点击创建队伍 G.Instance.InputControl.MoveToAndClick(createGroupButtonRect.GetCenterPoint()); bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => { //识别创建队伍窗 return GroupCVHelper.FindCreateGroupWindow(out innerCreateGroupWindowTextRect, out innerOkButtonRect, this.GameRect); }); if (result) { createGroupWindowTextRect = innerCreateGroupWindowTextRect; okButtonRect = innerOkButtonRect; return true; } } G.Instance.InfoWriter("打开创建队伍信息对话框失败"); return false; } /// /// 关闭所有弹出窗 /// /// /// /// private void CloseAllAlertWindow(CancellationToken cancelToken, ZTRectangle gameRect) { while (!cancelToken.IsCancellationRequested) { //G.Instance.InputControl.MoveTo(gameRect.Start.X,gameRect.Start.Y, false, false, false); //Thread.Sleep(10); //截图 Image image = ScreenCapture.Instance.CaptureScreenReturnImage(); ZTRectangle closeButtonRect = ZTRectangle.Empty; if (!DnfCVHelper.GetAlertWindow(out closeButtonRect, image, gameRect)) { return; } G.Instance.InputControl.MoveToAndClick(closeButtonRect.GetCenterPoint()); Thread.Sleep(500); } } //private bool InitSkills() //{ // //点击初始化 // ZTPoint initButton = new ZTPoint(this.upKeyRect.Start.X - 37, this.upKeyRect.Start.Y - 86); // G.Instance.InputControl.MoveToAndClick(initButton); // //是否已打开确认对话框 // ZTRectangle notificationRect = ZTRectangle.Empty; // bool result = FuncUtils.TimeoutCancelableWrap(3000, this.cancellationToken, () => { // return SkillCVHelper.ExistsNotificationText(out notificationRect,this.GameRect); // }); // if (!result) // { // G.Instance.DebugWriter("公告未找到"); // return false; // } // //点击确认 // G.Instance.InputControl.Move(0, 0, true, false, false); // Thread.Sleep(RandomUtils.MouseClickDuration); // G.Instance.InputControl.Move(0, 0, false, false, false); // //是否已打开完毕对话框 // result = FuncUtils.TimeoutCancelableWrap(3000, this.cancellationToken, () => { // return SkillCVHelper.ExistsNotificationText(out notificationRect, this.GameRect); // }); // if (!result) // { // G.Instance.DebugWriter("完毕公告未找到"); // return false; // } // //点击确认 // ZTPoint okPosition = new ZTPoint(notificationRect.GetCenterPoint().X, notificationRect.End.Y + 70); // G.Instance.InputControl.MoveToAndClick(okPosition); // Thread.Sleep(RandomUtils.G(500,800)); // return true; //} ///// ///// 设置顶端技能 ///// ///// //private bool SettingTopSkills() //{ // //物理暴击 // ZTPoint skillPoint = new ZTPoint(lvRect.End.X + 200, lvRect.Start.Y - 42); // SettingSkill(skillPoint); // //物理背击 // skillPoint = new ZTPoint(lvRect.End.X + 280, lvRect.Start.Y - 42); // SettingSkill(skillPoint); // return true; //} ///// ///// 要点的技能列表 ///// 内部为每个节所相对于节的相对位置 ///// //private List[] toAddLevelSkills = new List[] { // new List (){ // new ZTPoint(762-346,450-237),//疾风之棍棒精通 // }, // new List (){ // new ZTPoint(182,17),//朔风牵引 // new ZTPoint(274,17),//流风决 // new ZTPoint(481-251,342-262),//风鸣冲击 // new ZTPoint(323,82),//游离之风 // new ZTPoint(574-251,409-262),//双翼风刃 // new ZTPoint(574-251,477-262),//风暴之眼 // new ZTPoint(529-251,544-262),//真空旋风破 // }, // new List (){ // new ZTPoint(432-251,275-329),//风暴之拳 // new ZTPoint(479-251,342-329),//万象风龙阵 // new ZTPoint(572-251,340-329),//御风之力 // new ZTPoint(433-251,478-329),//风神决 // new ZTPoint(526-251,475-329),//风卷残云 // new ZTPoint(574-251,476-329),//游龙惊风破 // new ZTPoint(431-251,542-329),//九霄风雷 // new ZTPoint(663-295,545-331),//无限风域 // } //}; ///// ///// 设置SP技能 ///// ///// //private bool SettingSPSkills() //{ // //选中sp技能学习 // ZTPoint spPoint = new ZTPoint(lvRect.End.X + 55, lvRect.Start.Y - 80); // G.Instance.InputControl.MoveToAndClick(spPoint); // ZTRectangle numberLimitArea = new ZTRectangle(lvRect.Start.X-5,lvRect.End.Y,lvRect.End.X+21,lvRect.End.Y+340); // bool[] addedFlag = new bool[] {false,false,false }; // bool isdown = true; // for (int i = 0; i < 4; i++) // { // for (int count = 0; count < 10; count++) // { // if (this.cancellationToken.IsCancellationRequested) // { // return false; // } // //是否有数字 // bool result = FuncUtils.TimeoutCancelableWrap(1000, this.cancellationToken, () => { // return SkillCVHelper.HasNumberText(numberLimitArea); // }, 100); // if (!result) // { // continue; // } // //查找是否是某节, // Int32 numberSection = 0; // ZTRectangle sectionRect = ZTRectangle.Empty; // if (SkillCVHelper.IsNumberSections(out numberSection, out sectionRect, numberLimitArea)) // { // if (!addedFlag[numberSection]) // { // //没有添加,则循环把此节下的所有技能都加上 // foreach (var item in toAddLevelSkills[numberSection]) // { // SettingSkill(sectionRect.Start.Add(item)); // } // addedFlag[numberSection] = true; // } // if (count == 0) // { // if (numberSection == 0) // { // //一开始是1区则向下 // isdown = true; // } // if (numberSection == 2) // { // //一开始是3区则向上 // isdown = false; // } // } // } // if (isdown) // { // G.Instance.InputControl.MoveToAndClick(downKeyRect.GetCenterPoint()); // } // else // { // G.Instance.InputControl.MoveToAndClick(upKeyRect.GetCenterPoint()); // } // } // if (addedFlag[0] == true && addedFlag[1] == true && addedFlag[2] == true) // { // return true; // } // isdown = !isdown; // } // return false; //} ///// ///// 设置TP技能 ///// ///// //private bool SettingTPSkills() //{ // //选中tp技能学习 // ZTPoint spPoint = new ZTPoint(lvRect.End.X + 253, lvRect.Start.Y - 80); // G.Instance.InputControl.MoveToAndClick(spPoint); // ZTPoint[] skills = new ZTPoint[] { // new ZTPoint(334-296,277-251),//1.第一行第一个 // new ZTPoint(381-296,545-251),//2.第三行第二个 // new ZTPoint(664-296,413-251),//3.第二行倒数第三个 // new ZTPoint(567-296,410-251),//4.第二行倒数第五个 // new ZTPoint(758-296,411-251),//5.第二行倒数第一个 // }; // for (int i = 0; i < skills.Length; i++) // { // SettingSkill(lvRect.Start.Add(skills[i])); // } // return true; //} ///// ///// 学习 ///// ///// //private bool Studay() //{ // ZTPoint studayPoint = new ZTPoint(this.downKeyRect.Start.X-331,this.downKeyRect.End.Y+27); // G.Instance.InputControl.MoveToAndClick(studayPoint); // Thread.Sleep(1000); // //点击确认 // G.Instance.InputControl.Move(0, 0, true, false, false); // Thread.Sleep(RandomUtils.MouseClickDuration); // G.Instance.InputControl.Move(0, 0, false, false, false); // Thread.Sleep(RandomUtils.MouseClickDuration*3); // return true; //} ///// ///// 设置技能 ///// ///// ///// //private bool SettingSkill(ZTPoint skillPoint) //{ // //84,71 // ZTRectangle limitRect = new ZTRectangle(skillPoint.X-84,skillPoint.Y-71,skillPoint.X+84,skillPoint.Y+71); // bool result = false; // ZTRectangle addSkillLevelButton = ZTRectangle.Empty; // //选中技能,试两次 // int addTry = 0; // for (; addTry < 2; addTry++) // { // bool skillIsFull = false; // G.Instance.InputControl.MoveToAndClick(skillPoint); // Thread.Sleep(500); // result = FuncUtils.TimeoutCancelableWrap(3000, this.cancellationToken, () => { // return SkillCVHelper.IsSelectSkill(out addSkillLevelButton, out skillIsFull, limitRect); // }); // if (result) // { // if (skillIsFull) // { // return true; // } // break; // } // } // if (addTry >= 2) // { // return false; // } // //加技能点,试两次 // for (addTry = 0; addTry < 2; addTry++) // { // G.Instance.InputControl.MoveToAndClick(addSkillLevelButton.GetCenterPoint()); // result = FuncUtils.TimeoutCancelableWrap(3000, this.cancellationToken, () => { // return SkillCVHelper.SkillIsFullLevel(limitRect); // }); // if (result) // { // return true; // } // } // return false; //} ///// ///// 格式化摆放技能栏 ///// ///// //private bool FormatSkillColumn() //{ // //打开已学技能窗 // ZTRectangle studayTextRect = ZTRectangle.Empty; // if (!OpenStudaySkillWindow(out studayTextRect)) // { // G.Instance.DebugWriter("未指开已学技能窗口"); // return false; // } // //技能栏全部技能移动已学技能窗 // if (!MoveSkillToStudayWindow(studayTextRect)) // { // G.Instance.DebugWriter("移动至已学技能窗口失败"); // return false; // } // //技能窗内容分步移 // if (!MoveSkillToExpress(studayTextRect)) // { // G.Instance.DebugWriter("移动至快捷栏失败"); // return false; // } // return true; //} ///// ///// 打开已学技能窗口 ///// ///// //private bool OpenStudaySkillWindow(out ZTRectangle studayTextRect) //{ // studayTextRect = ZTRectangle.Empty; // ZTRectangle innerstudyTextRect = ZTRectangle.Empty; // ZTPoint openwindowButton = new ZTPoint(this.titleRect.Start.X + 194, this.titleRect.Start.Y + 517); // for (int i = 0; i < 2; i++) // { // if (this.cancellationToken.IsCancellationRequested) // { // return false; // } // G.Instance.InputControl.MoveToAndClick(openwindowButton); // bool result = FuncUtils.TimeoutCancelableWrap(3000, this.cancellationToken, () => { // return SkillCVHelper.StudaySkillWindowIsOpen(out innerstudyTextRect,this.GameRect); // }, 200); // if (result) // { // studayTextRect = innerstudyTextRect; // return true; // } // } // return false; //} ///// ///// 从快捷栏向已学技能栏移动技能 ///// ///// //private bool MoveSkillToStudayWindow(ZTRectangle studayTextRect) //{ // ZTRectangle targetRect = GetStudaySkillRect(studayTextRect, 27); // for (int i = 0; i < 12; i++) // { // ZTRectangle expressRect = GetExpressSkillRect(i); // MoveSkill(expressRect.GetCenterPoint(), targetRect.GetCenterPoint()); // } // return true; //} ///// ///// 识别出来的技能索引和在技能快捷栏中的对应关系 ///// 对应关系是-1的不放在快捷栏里 ///// //Dictionary skillToExpressMap = new Dictionary() { // { 4 ,0}, // { 13,1}, // { 8 ,2}, // { 9 ,3}, // { 15,4}, // { 12,5}, // { 6 ,6}, // { 10,7}, // { 7 ,8}, // { 11,9}, // { 14,10}, // { 16,11} //}; ///// ///// 从已学技能栏向快捷栏移动技能 ///// ///// ///// //private bool MoveSkillToExpress(ZTRectangle studayTextRect) //{ // int i = 0; // int count = 17; // while (i < count) // { // if (this.cancellationToken.IsCancellationRequested) // { // return false; // } // //获取位置,并将鼠标移到位置,显示出技能名 // ZTPoint studayPoint = GetStudaySkillRect(studayTextRect, i).GetCenterPoint(); // G.Instance.InputControl.MoveTo(studayPoint.X, studayPoint.Y, false, false, false); // Thread.Sleep(1000); // //识别 // Int32 skillIndex = 0;//技能索引 // ZTRectangle discenrnRect = new ZTRectangle(studayPoint.X - 150, this.GameRect.Start.Y, studayPoint.X, studayPoint.Y); // bool result = FuncUtils.TimeoutCancelableWrap(2000, this.cancellationToken, () => { // return SkillCVHelper.GetSkillName(out skillIndex, discenrnRect); // }, 200); // if (result) // { // if (skillToExpressMap.ContainsKey(skillIndex)) // { // //要放到技能栏的位置 // ZTPoint to = GetExpressSkillRect(skillToExpressMap[skillIndex]).GetCenterPoint(); // MoveSkill(studayPoint, to); // count--; // continue; // } // } // else // { // G.Instance.DebugWriter("识别技能错误,index=" + i.ToString()); // } // i++; // } // return true; //} ///// ///// 移动技能 ///// ///// ///// ///// //private bool MoveSkill(ZTPoint from, ZTPoint to) //{ // //移动指定位置 // G.Instance.InputControl.MoveTo(from.X, from.Y, false, false, false); // Thread.Sleep(RandomUtils.MouseClickDuration*2); // //按下 // G.Instance.InputControl.Move(0, 0, true, false, false); // Thread.Sleep(RandomUtils.MouseClickDuration * 3); // //移到目标位置 // G.Instance.InputControl.MoveTo(to.X, to.Y, true, false, false); // Thread.Sleep(RandomUtils.MouseClickDuration*2); // //松开 // G.Instance.InputControl.Move(0, 0, false, false, false); // Thread.Sleep(RandomUtils.MouseClickDuration * 2); // return true; //} ///// ///// 得到快捷栏技能定位 ///// ///// ///// //private ZTRectangle GetExpressSkillRect(int index) //{ // //x209,y488 // Int32 row = index / 6; // Int32 col = index % 6; // int x = this.titleRect.Start.X + 209 + col * 33; // int y = this.titleRect.Start.Y + 488 + row * 33; // return new ZTRectangle(x, y, x + 33, y + 33); //} ///// ///// 得到已学技能栏定位 ///// ///// ///// ///// //private ZTRectangle GetStudaySkillRect(ZTRectangle studayTextRect, Int32 index) //{ // //x:-122,y:44 // Int32 row = index / 7; // Int32 col = index % 7; // int x = studayTextRect.Start.X + (-122) + col * 31; // int y = studayTextRect.Start.Y + 44 + row * 31; // return new ZTRectangle(x, y, x + 31, y + 31); //} } }