/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var dmGuid = entity.DMGuid; // 首先跳转到擂台赛界面 WlyViewMgr.GoTo(dmGuid, WlyViewType.日常_擂台赛); // 找一个位置 var wait = FlowLogicHelper.RepeatRun(() => { if (DMService.Instance.FindStr(dmGuid, new WxRect(329, 112, 953, 496), "擂", "feff99-000000", out var x, out var y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); return(true); } Thread.Sleep(1000); return(false); }, TimeSpan.FromSeconds(10)); if (!wait) { throw new InvalidOperationException(); } // 点击报名 var signupPoint = new WxPoint(393, 551); DMService.Instance.LeftClick(dmGuid, signupPoint); return(new WlyTaskInfo(ID, true)); }
/// <summary> /// 创建角色 /// </summary> /// <param name="name"></param> private void CreateRole(string name) { // 等待进入创建角色界面 var wait = FlowLogicHelper.RepeatRun(() => DMService.Instance.FindPic(DMGuid, WlyPicType.择国家, WlyUtilityBiz.GameWndRect), TimeSpan.FromSeconds(30)); if (!wait) { throw new InvalidOperationException("进入创建角色界面失败"); } // 选择吴国 var wu = new WxPoint(630, 400); DMService.Instance.LeftClick(DMGuid, wu); // 输入名称 var namePoint = new WxPoint(517, 504); DMService.Instance.LeftDoubleClick(DMGuid, namePoint, 100); DMService.Instance.LeftDoubleClick(DMGuid, namePoint, 100); var guid = DMService.Instance.CreateDMSoft(); DMService.Instance.BindWindowIME(guid, WndHwnd); DMService.Instance.SendStringIme(guid, name); Thread.Sleep(1000); DMService.Instance.ReleaseDMSoft(guid); // 确定 var okPoint = new WxPoint(493, 556); DMService.Instance.LeftClick(DMGuid, okPoint); throw new InvalidOperationException("角色创建完毕需要重启"); }
/// <summary> /// 加入指定名称的军团 /// </summary> /// <param name="dmGuid"></param> /// <param name="name"></param> /// <returns></returns> public static bool Join(string dmGuid, string name) { WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_军团); while (true) { // 查找当页的海潮军团 var result = DMService.Instance.FindStrEx(dmGuid, new WxRect(195, 293, 798, 448), "海潮军团", "ffffb3-000000"); if (!string.IsNullOrEmpty(result)) { foreach (var group in result.Split('|')) { var pos = group.Split(','); var point = new WxPoint(int.Parse(pos[1]), int.Parse(pos[2])); DMService.Instance.LeftClick(dmGuid, point, TimeSpan.FromSeconds(2)); // 确认点击到的军团名称是否符合 if (DMService.Instance.FindStr(dmGuid, new WxRect(384, 182, 452, 209), name, "e9e7cf-000000")) { return(JoinCore(dmGuid, name)); } } } // 翻页 var pageStr = DMService.Instance.GetWords(dmGuid, new WxRect(482, 466, 512, 487), "ffffff-000000"); var pageStrs = pageStr.Split('/'); if (pageStrs[0] == pageStrs[1]) { throw new InvalidOperationException($"未找到军团{name}"); } DMService.Instance.LeftClick(dmGuid, new WxPoint(533, 475)); } }
/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var dmGuid = entity.DMGuid; // 进入城池争夺战界面 WlyViewMgr.GoTo(dmGuid, WlyViewType.日常_城池争夺战); // 等待所有UI加载完成 Thread.Sleep(2000); if (!DMService.Instance.FindStr(dmGuid, new WxRect(625, 558, 690, 590), "一键挂机", "cccccc-000000")) { // 点击一键 var oneClickPoint = new WxPoint(659, 574); DMService.Instance.LeftClick(dmGuid, oneClickPoint); // 点击确定 var okPoint = new WxPoint(451, 330); DMService.Instance.LeftClick(dmGuid, okPoint); // 点击领取 var getPoint = new WxPoint(544, 440); DMService.Instance.LeftClick(dmGuid, getPoint); // 点击退出 var exitPoint = new WxPoint(949, 571); DMService.Instance.LeftClick(dmGuid, exitPoint); } return(new WlyTaskInfo(ID, true)); }
/// <summary> /// 重复点击 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> /// <param name="times"></param> public void RepeatLeftClick(string dmGuid, WxPoint point, int times, int sleep) { for (int i = 0; i < times; i++) { LeftClick(dmGuid, point, TimeSpan.FromMilliseconds(sleep)); } }
/// <summary> /// 重复点击 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> /// <param name="times"></param> public void RepeatLeftClick(string dmGuid, WxPoint point, int times) { for (int i = 0; i < times; i++) { LeftClick(dmGuid, point); } }
/// <summary> /// 移动鼠标到指定位置 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> /// <param name="sleep"></param> public void MoveTo(string dmGuid, WxPoint point, int sleep) { var dm = GetDM(dmGuid); dm.MoveTo(point.X, point.Y); Thread.Sleep(sleep); }
/// <summary> /// 构造函数 /// </summary> public WxRect(WxPoint center, int width, int height) { Left = center.X - (width / 2); Top = center.Y - (height / 2); Right = center.X + (width / 2); Bottom = center.Y + (height / 2); }
/// <summary> /// 鼠标左键按下 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> public void LeftDown(string dmGuid, WxPoint point) { var dm = GetDM(dmGuid); dm.MoveTo(point.X, point.Y); dm.LeftDown(); Thread.Sleep(500); }
/// <summary> /// 左键双击 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> /// <param name="sleep"></param> public void LeftDoubleClick(string dmGuid, WxPoint point, TimeSpan sleep) { var dm = GetDM(dmGuid); dm.MoveTo(point.X, point.Y); dm.LeftDoubleClick(); Thread.Sleep(sleep); }
/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var endTime = new DateTime(2018, 7, 16, 4, 0, 0); if (DateTime.Now > endTime) { return(new WlyTaskInfo(ID, true)); } var dmGuid = entity.DMGuid; WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_厉兵秣马); // 领取两个大包厢 DMService.Instance.LeftClick(dmGuid, new WxPoint(228, 227)); DMService.Instance.LeftClick(dmGuid, new WxPoint(227, 328)); // 循环领取七天的奖励 var start = new WxPoint(375, 177); for (var i = 0; i < 7; i++) { DMService.Instance.LeftClick(dmGuid, start.Shift(70 * i, 0), TimeSpan.FromSeconds(1)); FlowLogicHelper.RepeatRun(() => { var rect = new WxRect(733, 290, 790, 312); var point = new WxPoint(761, 299); Thread.Sleep(1000); if (DMService.Instance.FindStr(dmGuid, new WxRect(357, 300, 436, 320), "打猎", "fffdd4-000000")) { rect = new WxRect(732, 378, 792, 400); point = new WxPoint(759, 388); } if (DMService.Instance.FindStr(dmGuid, rect, "领取奖励", WlyColor.Normal, WlyColor.White)) { DMService.Instance.LeftClick(dmGuid, point); return(false); } if (DMService.Instance.FindStr(dmGuid, rect, "前往", WlyColor.Normal)) { return(true); } if (DMService.Instance.FindStr(dmGuid, new WxRect(485, 317, 518, 342), "确定", WlyColor.Normal)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(495, 330)); } return(false); }, TimeSpan.FromSeconds(10)); } return(new WlyTaskInfo(ID, true)); }
/// <summary> /// 攻击指定位置的NPC /// </summary> /// <param name="dmGuid"></param> /// <param name="target"></param> private void Attack(string dmGuid, WxPoint target) { DMService.Instance.LeftClick(dmGuid, target, TimeSpan.FromMilliseconds(200)); if (DMService.Instance.FindStr(dmGuid, new WxRect(479, 316, 517, 346), "确定", WlyColor.Normal)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(502, 331), TimeSpan.FromMilliseconds(200)); } if (DMService.Instance.FindStr(dmGuid, new WxRect(565, 328, 601, 351), "强攻", WlyColor.Normal)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(640, 183), TimeSpan.FromMilliseconds(200)); } DMService.Instance.LeftClick(dmGuid, new WxPoint(584, 306), TimeSpan.FromMilliseconds(200)); }
/// <summary> /// 升级军团科技 /// </summary> /// <param name="dmGuid"></param> public static bool Upgrade(string dmGuid) { WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_军团科技); // 检测科技等级 var res = WlyUtilityBiz.GetAmount(dmGuid, new WxRect(739, 340, 783, 364), "20ef4c-000000", out var l); if (res && (l < 100)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(516, 474)); DMService.Instance.LeftClick(dmGuid, new WxPoint(609, 476)); DMService.Instance.LeftClick(dmGuid, new WxPoint(587, 287)); DMService.Instance.LeftClick(dmGuid, new WxPoint(436, 364)); return(false); } var startPoint = new WxPoint(237, 256); for (int i = 0; i < 6; i++) { DMService.Instance.LeftClick(dmGuid, startPoint.Shift(74 * i, 0)); // 检测科技等级 var result = WlyUtilityBiz.GetAmount(dmGuid, new WxRect(739, 340, 783, 364), "20ef4c-000000", out var level); if (!result) { throw new InvalidOperationException("无法检测到科技等级"); } if (level < 100) { DMService.Instance.LeftClick(dmGuid, new WxPoint(516, 474)); DMService.Instance.LeftClick(dmGuid, new WxPoint(609, 476)); DMService.Instance.LeftClick(dmGuid, new WxPoint(587, 287)); DMService.Instance.LeftClick(dmGuid, new WxPoint(436, 364)); return(false); } } return(true); }
/// <summary> /// 更换指定部位的装备 /// </summary> /// <param name="dmGuid"></param> /// <param name="staff"></param> /// <param name="type"></param> /// <param name="staffLevel"></param> public static void ChangeEquipmenet(string dmGuid, WlyStaffType staff, WlyEquipType type, int staffLevel) { WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_装备); WlyUtilityBiz.SelectStaffInList(dmGuid, staff); var p = _equipSpaceMap[type]; DMService.Instance.LeftClick(dmGuid, p); var currentInfo = GetEquipInfo(dmGuid); var startPoint = new WxPoint(551, 240); for (var j = 0; j < 4; j++) { for (var i = 0; i < 2; i++) { var clickPoint = startPoint.Shift(i * 60, j * 60); if (DMService.Instance.FindColor(dmGuid, "0a1215-000000", new WxRect(clickPoint, 10))) { return; } DMService.Instance.LeftClick(dmGuid, clickPoint); var equipInfo = GetEquipInfo(dmGuid); if (equipInfo.EquipLevel > staffLevel) { continue; } // 符合更换条件则进行更换 if ((equipInfo.Quality > currentInfo.Quality) || ((equipInfo.Quality == currentInfo.Quality) && (equipInfo.EquipLevel > currentInfo.EquipLevel))) { // 点击更换 DMService.Instance.LeftClick(dmGuid, new WxPoint(590, 473)); return; } } } }
/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var dmGuid = entity.DMGuid; WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_普通砸罐); Thread.Sleep(2000); var startPoint = new WxPoint(428, 261); while (!DMService.Instance.FindStr(dmGuid, new WxRect(801, 351, 842, 384), "需要", WlyColor.Selected)) { for (var i = 0; i < 2; i++) { for (var j = 0; j < 4; j++) { var point = startPoint.Shift(i * 86, j * 88); DMService.Instance.LeftClick(dmGuid, point, TimeSpan.FromMilliseconds(600)); } } } return(new WlyTaskInfo(ID, true)); }
/// <summary> /// 升级科技到指定的策略府等级 /// </summary> /// <param name="level"></param> /// <param name="dmGuid"></param> public static bool UpgradeTechnology(int level, string dmGuid) { WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_升级科技); var startPoint = new WxPoint(239, 249); for (int column = 0; column < 6; column++) { for (int row = 0; row < 2; row++) { DMService.Instance.LeftClick(dmGuid, startPoint.Shift(column * 72, row * 72)); if (!FlowLogicHelper.RunToTarget(() => { var str = DMService.Instance.GetWords(dmGuid, new WxRect(719, 358, 800, 382), "33ffff-000000"); return(int.Parse(str.Substring(3, str.Length - 4))); }, current => current > level, () => DMService.Instance.LeftClick(dmGuid, new WxPoint(613, 472)))) { return(false); } } } return(true); }
/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var dmGuid = entity.DMGuid; WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_活跃); Thread.Sleep(1000); DMService.Instance.LeftClick(dmGuid, new WxPoint(756, 361)); var startPoint = new WxPoint(543, 302); for (var i = 0; i < 6; i++) { DMService.Instance.LeftClick(dmGuid, startPoint.Shift(52 * i, 0), TimeSpan.FromMilliseconds(150)); } startPoint = new WxPoint(270, 441); for (var i = 0; i < 7; i++) { DMService.Instance.LeftClick(dmGuid, startPoint.Shift(86 * i, 0), TimeSpan.FromMilliseconds(100)); } return(new WlyTaskInfo(ID, true)); }
/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var dmGuid = entity.DMGuid; WlyViewMgr.GoTo(dmGuid, WlyViewType.场景_世界地图); FlowLogicHelper.RepeatRun(() => { WlyViewMgr.GoTo(dmGuid, WlyViewType.场景_主城); if (DMService.Instance.FindColor("f7654f-000000|e6b3d2-000000", WlyUtilityBiz.GameWndRect, dmGuid, out var x, out var y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); return(true); } Thread.Sleep(500); return(false); }, TimeSpan.FromSeconds(60)); var leftRect = new WxRect(436, 138, 563, 496); Thread.Sleep(2000); if (DMService.Instance.FindStr(dmGuid, new WxRect(467, 94, 537, 125), "辅政大臣", WlyColor.Normal)) { for (var i = 0; i < 4; i++) { int x, y; while (DMService.Instance.FindStr(dmGuid, new WxRect(585, 137, 677, 498), "开启", WlyColor.Normal, out x, out y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); } if (DMService.Instance.FindStr(dmGuid, leftRect, "征兵", "f3f3da-000000", out x, out y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); } if (DMService.Instance.FindStr(dmGuid, new WxRect(582, 139, 634, 497), "暴击率", "f3f3da-000000", out x, out y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); } if (DMService.Instance.FindStr(dmGuid, leftRect, "俸禄", "f3f3da-000000", out x, out y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); } if (DMService.Instance.FindStr(dmGuid, leftRect, "自动免费", "f3f3da-000000", out x, out y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); } if (DMService.Instance.FindStr(dmGuid, leftRect, "自动免费", "f3f3da-000000", out x, out y)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(x, y)); } // 设置出航贸易 if (DMService.Instance.FindStr(dmGuid, new WxRect(406, 146, 486, 498), "出航贸易", "ffffcc-000000", out x, out y)) { var start = new WxPoint(x, y); DMService.Instance.LeftClick(dmGuid, start.Shift(170, 28)); DMService.Instance.LeftClick(dmGuid, start.Shift(149, 207)); DMService.Instance.LeftClick(dmGuid, start.Shift(170, 53)); DMService.Instance.LeftClick(dmGuid, start.Shift(148, 231)); DMService.Instance.LeftClick(dmGuid, start.Shift(170, 75)); DMService.Instance.LeftClick(dmGuid, start.Shift(148, 60)); DMService.Instance.LeftClick(dmGuid, start.Shift(170, 101)); DMService.Instance.LeftClick(dmGuid, start.Shift(148, 85)); } FlowLogicHelper.RepeatRun(() => DMService.Instance.LeftClick(dmGuid, new WxPoint(806, 481), TimeSpan.FromMilliseconds(100)), 18); } // 保存 DMService.Instance.LeftClick(dmGuid, new WxPoint(297, 468)); if (DMService.Instance.FindStr(dmGuid, new WxRect(482, 312, 523, 346), "确定", WlyColor.Normal)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(503, 333)); DMService.Instance.LeftClick(dmGuid, new WxPoint(804, 123)); // 保存成功 return(new WlyTaskInfo(ID, true)); } } // 重启测试 throw new InvalidOperationException(); }
/// <summary> /// 寻找首攻 /// </summary> private bool FindFirstAttack() { // 处理加入失败,关闭军团战界面,防止被bug消耗军令 var view = WlyViewMgr.GetView(WlyViewType.略_加入失败); if (view.IsCurrentView(DMGuid)) { view.Exit(DMGuid); WlyViewMgr.ExitCurrentView(DMGuid, TimeSpan.FromSeconds(5)); } // 组队框 var teamRect = new WxRect(632, 206, 807, 449); string GetTargetStr() { if (AccountInfo.Point > AccountInfo.PointReserved) { return($"加|区|(首|攻)|不耗|首攻|{AccountInfo.SelectedGroupType.ToString()}"); } return("加|区|(首|攻)|不耗|首攻"); } bool Handler() { // 在聊天框寻找首攻 var chatRect = new WxRect(0, 470, 277, 600); var str = DMService.Instance.FindStrEx(DMGuid, chatRect, GetTargetStr(), "fff71c-000000|fcffa9-000000|00ff00-000000"); if (string.IsNullOrEmpty(str)) { return(false); } // 字符串分析 var sp = str.Split('|'); if (sp.Count(p => p[0] == '0') > 1) { // 加字数量过多,需要关闭聊天窗 return(false); } // 激活 if (sp.Any(p => p[0] == '1')) { KeepAlive(); } // 找到了一次军团副本 if (sp.Any(p => p[0] == '6')) { AccountInfo.Point--; } // 有首攻标识,进行加入 if (sp.Any(p => int.Parse(p[0].ToString()) > 1)) { var join = sp.FirstOrDefault(o => o[0] == '0'); if (!string.IsNullOrEmpty(join)) { var pos = join.Split(','); var point = new WxPoint(int.Parse(pos[1]) + 5, int.Parse(pos[2]) + 5); DMService.Instance.LeftClick(DMGuid, point, TimeSpan.FromSeconds(2)); } } Thread.Sleep(1000); if (DMService.Instance.FindStr(DMGuid, teamRect, "海潮", "e9e7cf-000000")) { return(true); } return(false); } var result = FlowLogicHelper.RepeatRun(Handler, TimeSpan.FromSeconds(5)); if (result) { FlowLogicHelper.RepeatRun(() => { Thread.Sleep(200); return(DMService.Instance.FindStr(DMGuid, teamRect, "海潮", "e9e7cf-000000")); }, TimeSpan.FromSeconds(5)); return(true); } return(false); }
/// <summary> /// 左键双击 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> public void LeftClick(string dmGuid, WxPoint point) { LeftClick(dmGuid, point, TimeSpan.FromMilliseconds(400)); }
/// <summary> /// 登录到服务器 /// </summary> /// <returns>返回null表示登录失败,需要重新尝试</returns> public static void Login(WlyEntity entity) { // 登录并发保护 lock (_loginLocker) { var guid = DMService.Instance.CreateDMSoft(); var hwndStr = string.Empty; // 程序保护 var fileInfo = new FileInfo(ProgramPath); if (fileInfo.Length < 10240) { File.Delete(ProgramPath); File.Copy(BaseProgramPath, ProgramPath); } // 启动程序 var process = Process.Start(new ProcessStartInfo { UseShellExecute = true, FileName = ProgramPath }); try { // 获取窗口句柄,进程有时不会立即打开,做一个循环获取,保证成功率 Thread.Sleep(400); if (!FlowLogicHelper.RepeatRun(() => { hwndStr = DMService.Instance.EnumWindowByProcessId(guid, process.Id, "", "Internet Explorer_Server", 2); if (string.IsNullOrEmpty(hwndStr)) { Thread.Sleep(300); return(false); } return(true); }, TimeSpan.FromSeconds(5))) { throw new InvalidOperationException("打开游戏进程失败"); } // 绑定窗口,开始登录 var loginHwnd = int.Parse(hwndStr); DMService.Instance.BindWindow(guid, loginHwnd); // 确认登录界面完全显示 if (!FlowLogicHelper.RepeatRun(() => { if (!DMService.Instance.FindPic(guid, WlyPicType.进入游戏, GameWndRect)) { Thread.Sleep(500); return(false); } return(true); }, TimeSpan.FromSeconds(5))) { WxLog.Debug($"WlyUtilityBiz.Login Cannot Find Login Wnd <{loginHwnd}>"); throw new InvalidOperationException("登录界面不显示"); } // 输入账号 var accountPoint = new WxPoint(324, 258); DMService.Instance.LeftDoubleClick(guid, accountPoint, 200); DMService.Instance.SendString(guid, loginHwnd, entity.Account); Thread.Sleep(200); // 输入密码 var pswPoint = new WxPoint(234, 291); DMService.Instance.LeftDoubleClick(guid, pswPoint, 200); DMService.Instance.SendString(guid, loginHwnd, entity.Password); Thread.Sleep(200); // 点击登录,等待登录成功 var loginPoint = new WxPoint(482, 322); if (!FlowLogicHelper.RepeatRun(() => { if (!DMService.Instance.FindPic(guid, WlyPicType.登录成功, GameWndRect)) { if (DMService.Instance.FindPic(guid, WlyPicType.进入游戏, GameWndRect)) { DMService.Instance.LeftClick(guid, loginPoint); } Thread.Sleep(500); return(false); } return(true); }, TimeSpan.FromSeconds(5))) { throw new InvalidOperationException("Need Restart"); } DMService.Instance.LeftClick(guid, new WxPoint(230, 159)); DMService.Instance.SendString(guid, loginHwnd, "6117"); Thread.Sleep(400); DMService.Instance.LeftClick(guid, new WxPoint(365, 158)); entity.EntityProcess = process; } catch { if (process != null) { process.Kill(); process.Dispose(); } throw; } finally { DMService.Instance.ReleaseDMSoft(guid); } } }
/// <summary> /// 左键双击 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> public void LeftDoubleClick(string dmGuid, WxPoint point) { LeftDoubleClick(dmGuid, point, TimeSpan.Zero); }
/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var dmGuid = entity.DMGuid; // 前往海盗活动界面 WlyViewMgr.GoTo(dmGuid, WlyViewType.日常_海盗); if (DMService.Instance.FindStr(dmGuid, new WxRect(523, 280, 559, 299), "海战", "e9e7cf-000000")) { DMService.Instance.LeftClick(dmGuid, new WxPoint(500, 331)); return(new WlyTaskInfo(ID, true)); } // 等待活动开始 var startRect = new WxRect(7, 223, 65, 244); var wait = FlowLogicHelper.RepeatRun(() => { Thread.Sleep(400); return(DMService.Instance.FindStr(dmGuid, startRect, "剩余时间", "ffff00-101010")); }, TimeSpan.FromMinutes(1)); if (!wait) { throw new InvalidOperationException("海盗活动未正常开始"); } // 剩余时间 var lastTimeRect = new WxRect(66, 226, 105, 245); // 冷却时间 var coolTimeRect = new WxRect(65, 205, 105, 224); // 得到的分数 var pointRect = new WxRect(972, 94, 994, 113); // 活动结束 var finalRect = new WxRect(488, 416, 522, 438); // 攻击 void Attack() { var fr = DMService.Instance.FindPic(dmGuid, WlyPicType.超强炮舰, WlyUtilityBiz.GameWndRect, out var xx, out var yy); if (fr) { var p = new WxPoint(xx, yy); DMService.Instance.LeftClick(dmGuid, p); } Thread.Sleep(100); // 如果需要金币进行冷却,则确定 var r = new WxRect(436, 342, 472, 365); if (DMService.Instance.FindStr(dmGuid, r, "确定", WlyColor.Normal)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(454, 354)); } } // 活动运行 bool Run() { var lt = WlyUtilityBiz.GetTime(dmGuid, lastTimeRect, "ffffff-000000"); var ct = WlyUtilityBiz.GetTime(dmGuid, coolTimeRect, "ffffff-000000"); // 冷却时间到,开始攻击 if (ct == TimeSpan.Zero) { Attack(); } else { // 计算已经得到的分数,确定是否需要进行强攻 WlyUtilityBiz.GetAmount(dmGuid, pointRect, "ffffff-000000", out var point); var times = point / 33; // 需要在1分30秒之前完成10次攻打 if (lt.Add(TimeSpan.FromSeconds(30 * times)) < TimeSpan.FromMinutes(6).Add(TimeSpan.FromSeconds(30))) { Attack(); } else { // 等待冷却完成 Thread.Sleep(ct.Add(TimeSpan.FromMilliseconds(100))); } } // 检测活动是否结束 if (DMService.Instance.FindStr(dmGuid, finalRect, "确定", WlyColor.Normal)) { DMService.Instance.LeftClick(dmGuid, new WxPoint(505, 430)); return(true); } return(false); } // 开始攻打海盗 FlowLogicHelper.RepeatRun(Run, TimeSpan.FromMinutes(7)); return(new WlyTaskInfo(ID, true)); }
/// <summary> /// 左键双击 /// </summary> /// <param name="dmGuid"></param> /// <param name="point"></param> /// <param name="sleep">单位:毫秒</param> public void LeftDoubleClick(string dmGuid, WxPoint point, int sleep) { LeftDoubleClick(dmGuid, point, TimeSpan.FromMilliseconds(sleep)); }
/// <summary> /// 构造函数 /// </summary> public WxRect(WxPoint center, int length) : this(center, length, length) { }
private static WlyProgressNode GetSubPoint(string dmGuid, int index, string previousID) { var location = new WxPoint(0, 0); if (previousID == "wly17_347_127") { location = new WxPoint(394, 94); } else { var wait = FlowLogicHelper.RepeatRun(() => { var find = DMService.Instance.FindPic(dmGuid, WlyPicType.可攻击目标, WlyUtilityBiz.GameWndRect, out var x, out var y); if (find) { location = new WxPoint(x + 7, y + 14); return(true); } Thread.Sleep(500); var view = WlyViewMgr.GetView(WlyViewType.导航_日常按钮栏); if (view.IsCurrentView(dmGuid)) { view.Exit(dmGuid); } view = WlyViewMgr.GetView(WlyViewType.右侧提示); if (view.IsCurrentView(dmGuid)) { view.Exit(dmGuid); } view = WlyViewMgr.GetView(WlyViewType.略_点击继续); if (view.IsCurrentView(dmGuid)) { view.Exit(dmGuid); } Thread.Sleep(100); return(false); }, TimeSpan.FromSeconds(5)); if (!wait) { if (index == 11) { location = new WxPoint(909, 213); } if (index == 17) { location = new WxPoint(347, 127); } } } // 判断是否寻到攻击目标 if ((location.X == 0) && (location.Y == 0)) { throw new InvalidOperationException("找不到攻击目标"); } // 构建攻击节点 var node = new WlyProgressNode { Location = location, Progress = index }; return(node); }
/// <summary> /// 攻击指定位置的npc,获取攻击结果 /// </summary> /// <param name="point"></param> /// <param name="dmGuid"></param> /// <returns></returns> private static bool?Attack(WxPoint point, string dmGuid) { var wait = FlowLogicHelper.RepeatRun(() => { var v = WlyViewMgr.GetView(WlyViewType.导航_日常按钮栏); if (v.IsCurrentView(dmGuid)) { v.Exit(dmGuid); } v = WlyViewMgr.GetView(WlyViewType.右侧提示); if (v.IsCurrentView(dmGuid)) { v.Exit(dmGuid); } v = WlyViewMgr.GetView(WlyViewType.略_点击继续); if (v.IsCurrentView(dmGuid)) { v.Exit(dmGuid); } Thread.Sleep(100); WlyViewMgr.GoTo(dmGuid, WlyViewType.场景_副本); DMService.Instance.LeftClick(dmGuid, point); return(DMService.Instance.FindStr(dmGuid, new WxRect(556, 290, 608, 318), "攻击", WlyColor.Normal)); }, TimeSpan.FromSeconds(5)); if (!wait) { if (DMService.Instance.FindStr(dmGuid, new WxRect(566, 297, 605, 314), "攻击", "cccccc-000000")) { DMService.Instance.LeftClick(dmGuid, new WxPoint(638, 183)); return(null); } throw new InvalidOperationException("无法点开NPC"); } // 判断NPC是否已经完成攻击 if (DMService.Instance.FindStr(dmGuid, new WxRect(587, 401, 624, 422), "战斗", "66ff00-000000")) { DMService.Instance.LeftClick(dmGuid, new WxPoint(638, 183)); return(null); } DMService.Instance.LeftClick(dmGuid, new WxPoint(584, 304)); var view = WlyViewMgr.GetView(WlyViewType.场景_战斗); wait = FlowLogicHelper.RepeatRun(() => { Thread.Sleep(2000); return(view.IsCurrentView(dmGuid)); }, TimeSpan.FromSeconds(30)); if (!wait) { throw new InvalidOperationException("无法进去战斗画面"); } //if (!DMService.Instance.FindStr(dmGuid, new WxRect(791, 566, 826, 591), "关闭", "f3f3da-000000")) //{ // DMService.Instance.LeftClick(dmGuid, new WxPoint(817, 576)); //} // 等待战斗结果 bool key = true; wait = FlowLogicHelper.RepeatRun(() => { if (DMService.Instance.FindStr(dmGuid, new WxRect(723, 560, 768, 591), "结果", "f3f3da-000000")) { DMService.Instance.LeftClick(dmGuid, new WxPoint(751, 576)); } if (DMService.Instance.FindStr(dmGuid, new WxRect(439, 205, 560, 238), "获得胜利", "e9e7cf-000000")) { return(true); } if (DMService.Instance.FindStr(dmGuid, new WxRect(517, 211, 552, 234), "失败", "e9e7cf-000000")) { key = false; return(true); } return(false); }, TimeSpan.FromSeconds(60)); if (!wait) { throw new InvalidOperationException("等待不到战斗结果"); } WlyViewMgr.ExitCurrentView(dmGuid, TimeSpan.FromSeconds(10)); return(key); }
/// <summary> /// 强化所有的装备 /// </summary> /// <param name="entity"></param> public static void UpgradeAllEquipmenets(WlyEntity entity) { // 清理装备 var dmGuid = entity.DMGuid; var cityLevel = entity.AccountInfo.GetBuildingInfo(WlyBuildingType.主城).Level; foreach (var staff in entity.AccountInfo.StaffInfoDict.Values) { if ((staff.Level == cityLevel) && (staff.GrowLevel > cityLevel)) { continue; } staff.Level = WlyStaffMgr.GetStaffLevel(dmGuid, staff.Name); if ((cityLevel >= 100) && (staff.Level < 80)) { WlyStaffMgr.Upgrade(staff.Name, 80, dmGuid); staff.Level = WlyStaffMgr.GetStaffLevel(dmGuid, staff.Name); } } ClearEquipments(entity); var r = WlyUtilityBiz.GetAmount(dmGuid, new WxRect(274, 47, 321, 72), "f3f3da-000000", out var aa); if (r && (aa >= 500000)) { // 遍历进行装备交换 var staffs = entity.AccountInfo.StaffInfoDict.Values; foreach (var a in staffs.ToList()) { foreach (var b in staffs.ToList()) { if (a.Name == b.Name) { continue; } // 遍历装备 foreach (var e1 in a.EquipInfoDict.Values) { var e2 = b.GetEquipInfo(e1.Type); if (a.EquipmentRequestDict[e1.Type] && !b.EquipmentRequestDict[e2.Type] && ((e1.Quality < e2.Quality) || ((e1.Quality == e2.Quality) && (e1.EquipLevel < e2.EquipLevel)))) { WlyStaffMgr.SwitchEquipment(dmGuid, a, b, e1.Type); } } } } entity.AccountInfo.Save(); } if (WlyUtilityBiz.GetAmount(dmGuid, new WxRect(133, 26, 217, 47), "f3f3da-000000", out var amount)) { if ((amount < 10000000) && (entity.AccountInfo.GetBuildingInfo(WlyBuildingType.主城).Level >= 100)) { return; } } var shopLevel = entity.AccountInfo.GetBuildingInfo(WlyBuildingType.商铺).Level; var ss = new List <WlyStaffType>(); foreach (var s in entity.AccountInfo.StaffInfoDict.Values) { foreach (var e in s.EquipInfoDict.Values) { if (s.EquipmentRequestDict[e.Type] && (e.Level < shopLevel) && (e.Quality != WlyQualityType.Unknow)) { ss.Add(s.Name); break; } } } if (!ss.Any()) { return; } var staffstr = string.Join("|", ss.Select(o => o.ToString())); // 切换到功能 WlyViewMgr.GoTo(dmGuid, WlyViewType.功能_强化装备); for (int i = 0; i < 3; i++) { var result = DMService.Instance.FindStrEx(dmGuid, new WxRect(188, 201, 417, 439), staffstr, WlyColor.White); var list = result.Split('|'); foreach (var pos in list) { var ps = pos.Split(','); var index = int.Parse(ps[0]); var point = new WxPoint(int.Parse(ps[1]), int.Parse(ps[2])); var info = entity.AccountInfo.GetStaffInfo(ss[index]); // 点击辨别装备 DMService.Instance.LeftClick(dmGuid, point); var equipInfo = WlyEquipMgr.GetEquipInfo(dmGuid); if (info.EquipmentRequestDict[equipInfo.Type] && (equipInfo.Level < shopLevel)) { // 开始强化 DMService.Instance.LeftDown(dmGuid, new WxPoint(563, 354)); var res = FlowLogicHelper.RunToTarget(() => GetEquipLevelCore(dmGuid), current => current >= shopLevel, () => Thread.Sleep(500)); DMService.Instance.LeftUp(dmGuid, new WxPoint(563, 354)); info.SaveEquipInfo(WlyEquipMgr.GetEquipInfo(dmGuid)); if (!res) { // 银币耗尽,直接返回 entity.AccountInfo.Save(); return; } } } // 往下翻一页 DMService.Instance.RepeatLeftClick(dmGuid, new WxPoint(426, 427), 14, 100); } entity.AccountInfo.Save(); }
protected bool Equals(WxPoint other) { return((X == other.X) && (Y == other.Y)); }