//攻击
        int AttackAndTrophyPolicy(int curTickCount)
        {
            int nMonsterCount = 0;
            List <SMonsterInfo> NearbyMonster = null;

            if (Program.config.bPriorityAttack)//优先攻击策略
            {
                SMonsterInfo targetMonster = SearchMonsterAndLootNew(out nMonsterCount, out NearbyMonster);
                if (targetMonster != null)
                {
                    KillMonsterNew(targetMonster, nMonsterCount, NearbyMonster, curTickCount);
                    return(0);
                }
                TrophyInfo trophy = SearchLoot();
                if (trophy != null)
                {
                    ActLootTrophy(trophy);
                    return(0);
                }
            }
            else
            {
                SMonsterInfo targetMonster = SearchMonsterAndLoot(out nMonsterCount);
                if (targetMonster != null)
                {
                    KillMonster(targetMonster, nMonsterCount, curTickCount);
                    return(0);
                }
                TrophyInfo trophy = SearchLoot();
                if (trophy != null)
                {
                    ActLootTrophy(trophy);
                    return(0);
                }
            }
            return(1);
        }
Exemple #2
0
        const sbyte PollutantGateType = 9; //地图连接门

        void UpdateGameInfo()
        {
            round = Program.client.GetRoundList();
            monsterList.Clear();
            boxList.Clear();
            doorList.Clear();
            trophyList.Clear();
            trophyIDList.Clear();
            NearbyPollutantGatePos = null;
            foreach (var item in round)
            {
                //掉落物品
                //门
                //桶箱
                //传送门
                switch (item.Type)
                {
                case MonsterType:
                    SMonsterInfo monster = new SMonsterInfo(item);
                    monsterList.Add(monster);
                    break;

                case ChestType:
                    SBox box = new SBox(item);
                    boxList.Add(box);
                    break;

                case DoorType:
                    SDoor door = new SDoor(item);
                    doorList.Add(door);
                    break;

                case TrophyType:
                    TrophyBaseInfo trophy = new TrophyBaseInfo();
                    trophy.ObjPtr = item.ObjPtr;
                    trophy.X      = (short)item.X;
                    trophy.Y      = (short)item.Y;
                    trophyIDList.Add(trophy);
                    break;

                case AreaCrossType:
                    AreaCrossInfo areaCross = new AreaCrossInfo(item);
                    areaCrossList.Add(areaCross);
                    break;

                case WaypointType:
                    break;

                case PollutantGateType:
                    NearbyPollutantGatePos   = new GPoint();
                    NearbyPollutantGatePos.x = (ushort)item.X;
                    NearbyPollutantGatePos.y = (ushort)item.Y;
                    break;
                }
            }
            CurMapID   = Program.client.GetCurrentMapID();
            trophyList = Program.client.GetTrophyList(trophyIDList);

            PlayerInfo tempPlayer = Program.client.GetPlayerInfo();

            player.Level  = tempPlayer.Level;
            player.HP     = tempPlayer.HP;
            player.MaxHP  = tempPlayer.MaxHP;
            player.MP     = tempPlayer.MP;
            player.Shield = tempPlayer.Shield;
            player.MaxMP  = tempPlayer.MaxMP;
            player.Pos.x  = (ushort)tempPlayer.X;
            player.Pos.y  = (ushort)tempPlayer.Y;
        }
Exemple #3
0
        int HandMissionAnalysis()
        {
            //如果不在任务地点,去任务地点

            //如果在城里,如果需要去传送门,则去传送门,否则去传送点
            if (InTown())
            {
                MessageBox.Show("輔助模式,請在目標探索地圖開啟輔助程式");
                return(0);
            }



            if (CurMapID != LoadBattleMapID)
            {
                Program.client.Update();
                Thread.Sleep(1000);
                UpdateMap(bGroupExploreModel);


                LoadBattleMapID = CurMapID;
                FilterMonsterList.Clear();
                PassedDoor.Clear();
                areaCrossList.Clear();
                AddedCrossPoint.Clear();
                ClickedBoxList.Clear();
                LootFilter.Clear();
                curGroup = -1;

                Program.client.ClearTrophyFilter();

                //    bGroupExploreModel = false;//判断
                bNeedCross = false; //判断探索还是穿越
                bCrossing  = false; //判断穿越中还是移动到穿越点
                bNeedCastBattleOnceSkill = true;
                //    Thread.Sleep(1000);
            }
            int curTickCount = System.Environment.TickCount;

            //贫血小退
            if (Program.config.LogoutType == 0)
            {
                int data = player.HP;
                if (data < Program.config.LogOutData)
                {
                    ReturnRolePolicy();
                    if ((curTickCount - lastReturnTime) < 1000 * 60)
                    {
                        LogoutCount++;
                    }
                    else
                    {
                        LogoutCount = 0;
                    }
                    lastReturnTime = curTickCount;
                    if (LogoutCount > 5)
                    {
                        LogoutCount = 0;
                        curStatus   = Status.GotoBack;
                        SetNeedGoBack();
                        bNeedResetBattleMapInfo = true;
                        ChangeToNextMissionMap();
                        //bNeedResetBattleMapID = true;
                        //pollutantMapID = 0;//污染地穴地图ID
                        //LoadPollutantMapID = 0;
                        //pollutantGatePos = null;//门位置
                        //pollutantComplete = false;//已经刷完
                        //bEnterPollutanting = false;//正在进入污染地穴
                    }
                    Thread.Sleep(1000);
                    return(0);
                }
            }
            else if (Program.config.LogoutType == 1)
            {
                int data = player.Shield;
                if (data < Program.config.LogOutData)
                {
                    ReturnRolePolicy();
                    if ((curTickCount - lastReturnTime) < 1000 * 60)
                    {
                        LogoutCount++;
                    }
                    else
                    {
                        LogoutCount = 0;
                    }
                    lastReturnTime = curTickCount;
                    if (LogoutCount > 5)
                    {
                        LogoutCount = 0;
                        curStatus   = Status.GotoBack;
                        SetNeedGoBack();
                        bNeedResetBattleMapInfo = true;
                        ChangeToNextMissionMap();
                        //bNeedResetBattleMapID = true;
                        //ChangeToNextMissionMap();

                        //pollutantMapID = 0;//污染地穴地图ID
                        //LoadPollutantMapID = 0;
                        //pollutantGatePos = null;//门位置
                        //pollutantComplete = false;//已经刷完
                        //bEnterPollutanting = false;//正在进入污染地穴
                    }
                    Thread.Sleep(1000);
                    return(0);
                }
            }
            //如果需要施放光环
            if ((curTickCount - LastCheckHaloTime) > (5 * 1000))
            {
                if (Program.config.bAutoUpSkill)
                {
                    Program.client.UpSkill();
                }
                if (Program.config.haloSkill.Count > 0)
                {
                    foreach (var item in Program.config.haloSkill)
                    {
                        if (Program.client.IsBuffExists(item) == false)
                        {
                            Program.client.CastUntargetSkill((short)player.Pos.x, (short)player.Pos.y, (short)item, 8);
                            Thread.Sleep(1000);
                        }
                    }
                }
                LastCheckHaloTime = curTickCount;
            }
            if (bNeedCastBattleOnceSkill)
            {
                if (Program.config.battleOnceSkill.Count > 0)
                {
                    foreach (var item in Program.config.battleOnceSkill)
                    {
                        Program.client.CastUntargetSkill((short)player.Pos.x, (short)player.Pos.y, (short)item, 8);
                        Thread.Sleep(1000);
                    }
                }
                bNeedCastBattleOnceSkill = false;
            }
            //区域传送点
            if (bGroupExploreModel)
            {
                //
                if (curGroup != -1)
                {
                    foreach (var item in areaCrossList)
                    {
                        //如果没被处理过
                        if (AddedCrossPoint.Contains(item.Pos))
                        {
                            continue;
                        }
                        CrossPoint crossPoint = new CrossPoint();
                        crossPoint.firstGroup = GetCurGroup(player.Pos.x, player.Pos.y);
                        crossPoint.firstPos.x = item.Pos.x;
                        crossPoint.firstPos.y = item.Pos.y;
                        allCrossPoint.Add(crossPoint);
                        AddedCrossPoint.Add(item.Pos);
                        SetPassAbleArea(item.Pos.x, item.Pos.y);
                    }
                }
            }


            ////////////////////////////////药剂

            ActDrinkFlask(curTickCount);

            ////////////////////////////////////
            // //如果有门在身边,则点
            SDoor Door = SearchDoor();

            if (Door != null)
            {
                //  Program.client.ActiveTarget(DoorObjPtr);
                ActOpenDoor(Door);
                return(0);
            }

            /////////////////////////////////////
            int nMonsterCount = 0;
            List <SMonsterInfo> NearbyMonster = null;
            SMonsterInfo        targetMonster = SearchMonsterAndLootNew(out nMonsterCount, out NearbyMonster);

            if (targetMonster != null)
            {
                KillMonsterNew(targetMonster, nMonsterCount, NearbyMonster, curTickCount);
                return(0);
            }
            TrophyInfo trophy = SearchLoot();

            if (trophy != null)
            {
                ActHandLootTrophy(trophy);
                return(0);
            }



            SBox Box = null;

            if (TargetBox.ID != 0)
            {
                Box = TargetBox;
            }
            else
            {
                Box = SearchBox();
                if (Box != null)
                {
                    TargetBox.ID     = Box.ID;
                    TargetBox.ObjPtr = Box.ObjPtr;
                    TargetBox.Pos.x  = Box.Pos.x;
                    TargetBox.Pos.y  = Box.Pos.y;
                }
            }
            //如果有宝箱
            if (Box != null)
            {
                //检测阻塞
                if (player.Pos == lastPlayerPos && Box.Pos == lastTargetPoint)
                {
                    blockCount++;
                    nSleepTime = 50;
                }
                else
                {
                    blockCount = 0;
                }
                lastPlayerPos.x   = player.Pos.x;
                lastPlayerPos.y   = player.Pos.y;
                lastTargetPoint.x = Box.Pos.x;
                lastTargetPoint.y = Box.Pos.y;
                if (blockCount > 3)
                {
                    ClickedBoxList.Add(Box.ID);
                    TargetBox.ID = 0;
                    nSleepTime   = 50;
                    return(0);
                }
                //获取A*距离,过大的走过去
                double dis = CalcDis(Box.Pos, player.Pos);
                if (dis > 15)
                {
                    ActSafeMove(Box.Pos);
                }
                else
                {
                    if (Box.Color > 0)
                    {
                        //釋放圖騰
                        CastTTSkillNow(curTickCount);

                        //釋放陷阱
                        CastTrapSkillNow(curTickCount, player.Pos);

                        //施放护盾技能
                        CastShieldSkillNow(curTickCount);
                    }
                    // 否则点击
                    Program.client.ActiveTarget(Box.ObjPtr);
                    //   ClickedBoxList.Add(Box.ID);
                    TargetBox.ID = 0;
                }

                nSleepTime = 50;
                return(0);
            }

            ////卡位检测

            //////////////////////////////////////////打怪探索
            ActDrinkSpeedFlask(curTickCount);

            //if (bGroupExploreModel)
            //{
            //    return GroupExplore();
            //}
            return(ActHandNormalExplore());
        }
        int SearchLootAndMonster(out SMonsterInfo monster, out TrophyInfo trophy, out int MonsterRoundCount)
        {
            //过滤列表中的不要
            //优先搜索怪物,如果小于10,则直接攻击.
            double NearestDis = 50.0;//攻击距离,不太合适,以后修改

            MonsterRoundCount = 0;

            bool bNearByMonster = false;

            //     GPoint attPos = null;
            monster = null;
            trophy  = null;
            double SearchNearByDis = NEARBY_DIS;
            GPoint searchCenter    = new GPoint();

            searchCenter.x = player.Pos.x;
            searchCenter.y = player.Pos.y;
            //搜索近距离怪物
            foreach (var item in monsterList)
            {
                if (item.MaxHP == 0 || item.HP == 0)
                {
                    continue;
                }
                if (FilterMonsterList.Contains(item.Pos))
                {
                    continue;
                }

                double dis = CalcDis(searchCenter, item.Pos);
                if (dis > SearchNearByDis)
                {
                    continue;
                }
                MonsterRoundCount++;
                if (MonsterRoundCount > Program.config.MultiCount)
                {
                    break;
                }
                if (bNearByMonster)
                {
                    continue;
                }
                searchCenter.x  = item.Pos.x;
                searchCenter.y  = item.Pos.y;
                SearchNearByDis = 20.0;
                bNearByMonster  = true;
                monster         = item;
            }
            if (bNearByMonster)
            {
                return(MONSTER_TYPE);
            }
            //如果距离大于10,搜索拾取,拾取小于10的,直接返回
            double NearestTrophyDis = 50.0;

            foreach (var item in trophyList)
            {
                if (LootFilter.Contains(item.ObjPtr))
                {
                    continue;
                }
                double dis = CalcDis(player.Pos, item.X, item.Y);
                if (dis < NEARBY_DIS)
                {
                    trophy = item;
                    return(TROPHY_TYPE);
                }
                if (dis < NearestTrophyDis)
                {
                    //   double Astardis = GetAstarDis(player.Pos.x, player.Pos.y, (ushort)item.X, (ushort)item.Y);

                    double Astardis = GGetAstarDis(player.Pos.x, player.Pos.y, (ushort)item.X, (ushort)item.Y);

                    double bi = Astardis / dis;
                    if (bi < 2.0)
                    {
                        trophy           = item;
                        NearestTrophyDis = dis;
                    }
                }
            }
            if (trophy != null)
            {
                return(TROPHY_TYPE);
            }
            //如果战力品为空,返回怪物,否则优先战利品

            //搜索远处怪物数量
            //再遍历一次怪物
            foreach (var item in monsterList)
            {
                if (item.MaxHP == 0 || item.HP == 0)
                {
                    continue;
                }
                if (FilterMonsterList.Contains(item.Pos))
                {
                    continue;
                }

                double dis = CalcDis(player.Pos, item.Pos);
                if (dis > 50.0)//SearchAttDis
                {
                    continue;
                }
                if (dis < NearestDis)
                {
                    double Astardis = GGetAstarDis(player.Pos.x, player.Pos.y, item.Pos.x, item.Pos.y);
                    double bi       = Astardis / dis;
                    if (bi < 1.0)
                    {
                        monster    = item;
                        NearestDis = dis;
                    }
                }
            }
            if (monster == null)
            {
                return(0);
            }
            //搜索目标旁边的怪物
            foreach (var item in monsterList)
            {
                if (item.MaxHP == 0 || item.HP == 0)
                {
                    continue;
                }
                if (FilterMonsterList.Contains(item.Pos))
                {
                    continue;
                }
                if (monster == item)
                {
                    continue;
                }
                double dis = CalcDis(monster.Pos, item.Pos);
                if (dis < 20.0)
                {
                    MonsterRoundCount++;
                }
                if (MonsterRoundCount > Program.config.MultiCount)
                {
                    break;
                }
            }
            return(MONSTER_TYPE);
        }
        SMonsterInfo SearchMonsterAndLootNew(out int MonsterRoundCount, out List <SMonsterInfo> NearbyMonster)
        {
            NearbyMonster = new List <SMonsterInfo>();
            //搜索周围战利品,加入到记忆列表
            //    double NearestTrophyDis = 50.0;
            foreach (var item in trophyList)
            {
                if (LootFilter.Contains(item.ObjPtr))
                {
                    continue;
                }
                GPoint tpos = new GPoint();
                tpos.x = (ushort)item.X;
                tpos.y = (ushort)item.Y;
                if (LootMemory.Contains(tpos) == false)
                {
                    LootMemory.Add(tpos);
                }
            }
            //优先攻击怪,近身怪,目标怪身边数量
            //金色和优先攻击怪物的放弃时间加长
            //   double SearchNearByDis = NEARBY_DIS;
            MonsterRoundCount = 0;
            GPoint searchCenter = new GPoint();

            searchCenter.x = player.Pos.x;
            searchCenter.y = player.Pos.y;
            double       NearestMonsterDis = 1000.0;
            SMonsterInfo targetMonster     = null;

            //搜索怪物,找最近的,再找最近的身边的
            foreach (var item in monsterList)
            {
                if (item.MaxHP == 0 || item.HP == 0)
                {
                    continue;
                }
                if (FilterMonsterList.Contains(item.Pos))
                {
                    continue;
                }
                if (LastTargetMonster != null)
                {
                    if (LastTargetMonster.ID == item.ID)
                    {
                        targetMonster = item;
                        break;
                    }
                }
                double dis = CalcDis(player.Pos, item.Pos);
                if (item.Priority == 0)
                {
                    if (dis > 60.0)
                    {
                        continue;
                    }
                }
                else if (item.Priority > 0)
                {
                    if (dis > 90.0)
                    {
                        continue;
                    }
                }

                if (dis < 17.0)
                {
                    NearbyMonster.Add(item);
                }
                //if (dis > NearestMonsterDis)
                //    continue;
                double Astardis = GGetAstarDis(player.Pos.x, player.Pos.y, (ushort)item.Pos.x, (ushort)item.Pos.y);

                double bi = Astardis / dis;
                if (bi < 1.3)
                {
                    //已经有目标
                    if (targetMonster != null)
                    {
                        if (targetMonster.Priority < item.Priority)
                        {
                            targetMonster     = item;
                            NearestMonsterDis = dis;
                        }
                        else if (targetMonster.Priority == item.Priority)
                        {
                            if (dis < NearestMonsterDis)
                            {
                                targetMonster     = item;
                                NearestMonsterDis = dis;
                            }
                        }
                    }
                    else//没有目标的话
                    {
                        targetMonster     = item;
                        NearestMonsterDis = dis;
                    }
                }
            }
            if (targetMonster == null)
            {
                LastTargetMonster = null;
                return(null);
            }
            foreach (var item in monsterList)
            {
                if (item.MaxHP == 0 || item.HP == 0)
                {
                    continue;
                }
                if (FilterMonsterList.Contains(item.Pos))
                {
                    continue;
                }
                if (targetMonster.ID == item.ID)
                {
                    continue;
                }
                double dis = CalcDis(targetMonster.Pos, item.Pos);
                if (dis < 25.0)
                {
                    MonsterRoundCount++;
                }
            }
            LastTargetMonster = targetMonster;
            return(targetMonster);
        }
        SMonsterInfo SearchMonsterAndLoot(out int MonsterRoundCount)
        {
            //搜索周围战利品,加入到记忆列表
            //    double NearestTrophyDis = 50.0;
            foreach (var item in trophyList)
            {
                if (LootFilter.Contains(item.ObjPtr))
                {
                    continue;
                }
                GPoint tpos = new GPoint();
                tpos.x = (ushort)item.X;
                tpos.y = (ushort)item.Y;
                if (LootMemory.Contains(tpos) == false)
                {
                    LootMemory.Add(tpos);
                }
            }

            //   double SearchNearByDis = NEARBY_DIS;
            MonsterRoundCount = 0;
            GPoint searchCenter = new GPoint();

            searchCenter.x = player.Pos.x;
            searchCenter.y = player.Pos.y;
            double       NearestMonsterDis = 1000.0;
            SMonsterInfo targetMonster     = null;

            //搜索怪物,找最近的,再找最近的身边的
            foreach (var item in monsterList)
            {
                if (item.MaxHP == 0 || item.HP == 0)
                {
                    continue;
                }
                if (FilterMonsterList.Contains(item.Pos))
                {
                    continue;
                }
                double dis = CalcDis(player.Pos, item.Pos);
                if (dis > 50.0)
                {
                    continue;
                }
                if (dis < 17.0)
                {
                    targetMonster = item;
                    break;
                }
                if (dis > NearestMonsterDis)
                {
                    continue;
                }
                double Astardis = GGetAstarDis(player.Pos.x, player.Pos.y, (ushort)item.Pos.x, (ushort)item.Pos.y);

                double bi = Astardis / dis;
                if (bi < 1.3)
                {
                    targetMonster     = item;
                    NearestMonsterDis = dis;
                }
            }
            if (targetMonster == null)
            {
                return(null);
            }
            foreach (var item in monsterList)
            {
                if (item.MaxHP == 0 || item.HP == 0)
                {
                    continue;
                }
                if (FilterMonsterList.Contains(item.Pos))
                {
                    continue;
                }
                if (targetMonster.ID == item.ID)
                {
                    continue;
                }
                double dis = CalcDis(targetMonster.Pos, item.Pos);
                if (dis < 17.0)
                {
                    MonsterRoundCount++;
                }
            }
            return(targetMonster);
        }