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; using RichCreator.Utility.Maps; using RichCreator.Utility.Skills; using RichCreator.Dnf; namespace RichCreator.Maps.Lindong { /// /// 凛冬地图 /// public class LindongMap : ShikongzhimenMapBase { public LindongMap(ZTRectangle gameRect, CancellationToken cancelToken) :base(MapType.Lingdong,gameRect,cancelToken) { this.MiniMap = new LindongMiniMap(gameRect); } /// /// 地图的所有房间 /// NextIndex=-1,完成 /// NextIndex=-2,出错 /// private static readonly HouseInfo[] Houses = new HouseInfo[] { new HouseInfo (0 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (1 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (2 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (3 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (4 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (5 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (6 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (7 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (8 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (9 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (10,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (11,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (12,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (13,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (14,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (15,MapType.Lingdong,true ,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (16,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (17,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (18,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1), new HouseInfo (19,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null,-1) }; private Int32 runningStep = RunningStep.None; /// /// 开始 /// /// /// /// /// public override ZTResult Start(Int32 runningStep) { this.runningStep = runningStep; WindowUtils.SetDnfToTop(); if (runningStep < RunningStep.War) { if (!MoveToSunan()) { return ZTResult.Failed; } if (!MoveToShikongzhimen()) { return ZTResult.Failed; } if (!MoveToChoiceTaskPage()) { return ZTResult.Failed; } if (!IntoTaskRoom()) { return ZTResult.Failed; } G.Instance.InfoWriter("成功进入副本"); } while (true) { //重复刷,直到疲劳值不够了 if (this.CancelToken.IsCancellationRequested) { return ZTResult.Cancel; } DateTime startHouse = DateTime.Now; ZTResult killResult = KillMonster(); if (killResult==ZTResult.Success) { //捡东西 G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.V); Thread.Sleep(1000); for (int i = 0; i < 5; i++) { G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.X); Thread.Sleep(RandomUtils.KeyPressDuration * 3); } //卖装备并关闭商店 SaleEquipment(); Int32 houseTotalSecond = (Int32)(DateTime.Now - startHouse).TotalSeconds; G.Instance.InfoWriter("单次刷图成功,用时:"+(houseTotalSecond/60)+"分"+(houseTotalSecond%60)+"秒"); //查询疲劳值 Int32 pilaozhi =DnfCVHelper.GetPiLaoZhi(this.GameRect); G.Instance.InfoWriter("疲劳值:" + pilaozhi); if (pilaozhi <= 0) { ExitToTown(); return ZTResult.Success; } ReplayGame(); continue; } else { return killResult; } } } /// /// 是否进入打怪地图 /// /// public override bool IsEntryMap() { //查找顶端凛冬文字 bool findResult = FuncUtils.TimeoutCancelableWrap(2 * 60 * 1000, CancelToken, () => { using (Image image = ScreenCapture.Instance.CaptureScreenReturnImage()) { return LindongCVHelper.ExistLingdongText(image, this.GameRect); } }, 10); if (!findResult) { G.Instance.InfoWriter("未找到进入凛冬的文字"); } else { G.Instance.InfoWriter("进入凛冬"); } return findResult; } /// /// 进入每个房间前的工作 /// /// /// public override void EntryHousePrework(int houseIndex, int preHouseIndex) { G.Instance.InfoWriter("in lingdong"); //移动和发招 switch (houseIndex) { case 2: G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.LeftArrow); this.Role.SyncMove(new ZTPoint(-110, 0)); G.Instance.InputControl.PressKeys(HIDCode.LeftArrow, HIDCode.G); break; case 1: this.Role.SyncMove(new ZTPoint(-480, 80)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.W); break; case 5: //G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.R); Thread.Sleep(1000); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.T); break; case 4: this.Role.SyncMove(new ZTPoint(-1150, -50)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.E); //Thread.Sleep(1000); //G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.E); break; case 8: this.Role.SyncMove(new ZTPoint(-100, 110)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.G); //Thread.Sleep(300); //G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Z); break; case 9: this.Role.SyncMove(new ZTPoint(325, 65)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.R); Thread.Sleep(1000); this.Role.SyncMove(new ZTPoint(300, 0)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.T); break; case 10: G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Q); break; case 12: G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.R); Thread.Sleep(1000); this.Role.SyncMove(new ZTPoint(-110, 0)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.T); break; case 13: if (preHouseIndex == 12) { this.Role.SyncMove(new ZTPoint(600, 150)); } else { this.Role.SyncMove(new ZTPoint(-300, 200)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow); } G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Q); Thread.Sleep(1000); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.E); break; case 14: if (preHouseIndex == 13) { this.Role.SyncMove(new ZTPoint(400, 0)); } else { this.Role.SyncMove(new ZTPoint(0, 100)); } G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.W); break; case 15: this.Role.SyncMove(new ZTPoint(600, 0)); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.H); Thread.Sleep(5000); G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Y); break; case 18: G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.W); break; } } /// /// 刷房间 /// /// private ZTResult KillMonster() { bool ret = false; if (!IsEntryMap()) { G.Instance.InfoWriter("未找到进入凛冬"); return ZTResult.Failed; } G.Instance.InfoWriter("进入凛冬"); Int32 preHouseIndex = -1; Int32 houseIndex = -1; //技能加成 G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Space); //循环刷房间 while (true) { preHouseIndex = houseIndex; //看房间号 ret = this.MiniMap.GetCurrentHouseIndexWaitTimeout(out houseIndex, null, this.CancelToken, 3 * 1000); if (!ret) { G.Instance.InfoWriter("未找到人物所在房间"); return ZTResult.Failed; } G.Instance.InfoWriter("进入房间->" + houseIndex.ToString()); HouseInfo houseInfo = Houses[houseIndex]; this.Role.SetHouse(houseInfo); DateTime startTime = DateTime.Now; KillMonsterStateMachine kmsm = new KillMonsterStateMachine(this, houseInfo,this.Role); ZTResult smresult = kmsm.Work( 5 * 60 * 1000,preHouseIndex,this.runningStep); Int32 roomTotalSecond = (Int32)(DateTime.Now - startTime).TotalSeconds; G.Instance.InfoWriter("房间刷完,用时:" + (roomTotalSecond / 60) + "分" + (roomTotalSecond % 60) + "秒"); runningStep = RunningStep.None; if (smresult == ZTResult.Success) { if (houseInfo.IsEnd) { //所有房间刷完 return ZTResult.Success; } //刷其它房间 continue; } else { return smresult; } } } /// /// 进入指定房间 /// /// private bool IntoTaskRoom() { bool result = false; //选择凛冬 G.Instance.InfoWriter("开始选择凛冬"); Int32 nandu = 0; if (!SelectLindong(out nandu)) { G.Instance.InfoWriter("选择凛冬失败"); return false; } G.Instance.InfoWriter("选择凛冬成功,难度:" + nandu); if (nandu != 4) { G.Instance.InfoWriter("开始选择难度"); result = SelectNandu(nandu); if (!result) { G.Instance.InfoWriter("选择难度失败"); return false; } G.Instance.InfoWriter("选择难度成功"); } //开始 G.Instance.InputControl.PressKey(80, HIDCode.Space); return true; } /// /// 选择凛冬 /// /// private bool SelectLindong(out Int32 nandu) { Image image = ScreenCapture.Instance.CaptureScreenReturnImage(); if (LindongCVHelper.GetChoiceLingdongNandu(out nandu, image, this.GameRect)) { return true; } G.Instance.InputControl.MoveToAndClick(new Utility.Structs.ZTPoint(this.GameRect.Start.X + 313, this.GameRect.Start.Y + 462)); Thread.Sleep(5000); image = ScreenCapture.Instance.CaptureScreenReturnImage(); if (LindongCVHelper.GetChoiceLingdongNandu(out nandu, image, this.GameRect)) { return true; } return false; } /// /// 选择难度 /// /// /// /// private bool SelectNandu(Int32 nandu) { Int32 count = 4 - nandu; for (int i = 0; i < Math.Abs(count); i++) { if (count < 0) { G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.LeftArrow); } else { G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow); } Thread.Sleep(400); } Image image = ScreenCapture.Instance.CaptureScreenReturnImage(); if (!LindongCVHelper.GetChoiceLingdongNandu(out nandu, image, this.GameRect)) { return false; } if (nandu == 4) { return true; } return false; } } }