少年修仙传客户端代码仓库
lcy
2025-02-26 819d3e3f5366ed32d66b6a58c73d0f0624f285ce
10384 福地鼠管多发包修复

- 修复多发包问题(不超过当前空闲工人数,不超过当前体力,非自己的福地自己只能同时抢一个物品,体力不够不派遣)
- 福地手动拉取物品,如果体力不够派遣(1人1点体力),会弹提示
- 体力消耗完停止自动拉取,点击自动拉取,会弹提示
- 第一次打开福地界面会发CB033包,避免没点过寻觅就开始开始采集时,没有敌人福地和周围福地数据
5个文件已修改
241 ■■■■■ 已修改文件
System/BlessedLand/BlessedLandDetailsWin.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlessedLand/BlessedLandManageMouseModel.cs 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlessedLand/BlessedLandManageMouseWin.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlessedLand/BlessedLandModel.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlessedLand/BlessedLandWin.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlessedLand/BlessedLandDetailsWin.cs
@@ -320,6 +320,13 @@
                SysNotifyMgr.Instance.ShowTip("BlessedLand01");
                return;
            }
            //工人体力不足以派遣
            int nowCanUseEnergy = blessedLandModel.GetNowCanUseEnergy();
            if (chooseWorkerCount > nowCanUseEnergy + nowDispatchCount)
            {
                SysNotifyMgr.Instance.ShowTip("BlessedLand12");
                return;
            }
            //同时采集同一个人的多个资源
            if (blessedLandModel.showPlayerId != blessedLandModel.myPlayerId && blessedLandModel.IsSnatchItem())
            {
System/BlessedLand/BlessedLandManageMouseModel.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace vnxbqy.UI
{
@@ -16,7 +17,7 @@
        public int defaultLv;                   //默认勾选x级物品
        bool isLoginOk = false;
        bool isStart = false;
        public bool isTrigger = false;
        //<矿物ID,矿物LV>
        public Dictionary<int, int> nowChooseDict = new Dictionary<int, int>();
@@ -144,7 +145,7 @@
                    //福地物品表没这项
                    if (!MineAreaItemConfig.TryGetMineID(itemId, defaultLv, out int mineId1))
                        continue;
                    nowChooseDict[itemId] = defaultLv;
                    nowChooseDict[itemId] = defaultLv;
                }
            }
@@ -227,7 +228,10 @@
            int energyUsed = blessedLandModel.EnergyUsed;
            int totalEnergy = blessedLandModel.GetTotalEnergy();
            if (energyUsed >= totalEnergy)
            {
                Stop();
                return;
            }
            // 没有合适物品
            bool isHasSuitableItem = TrySend();
            if (!isHasSuitableItem)
@@ -254,6 +258,7 @@
                blessedLandModel.lastSurroundRefreshTime = TimeUtility.AllSeconds;
                blessedLandModel.SetTime(0);
                blessedLandModel.SaveAllTime();
                isTrigger = true;
            }
        }
@@ -331,83 +336,92 @@
        //是否有合适的物品
        private bool TrySend()
        {
            if (blessedLandModel.newAreaDataDict.IsNullOrEmpty())
                return false;
            var chooseMineIDList = GetChooseMineIDList();
            //没有用户勾选的物品列表
            if (chooseMineIDList.IsNullOrEmpty())
                return false;
            //一个福地信息也没有
            var newAreaDataDict = blessedLandModel.newAreaDataDict;
            if (newAreaDataDict.IsNullOrEmpty())
                return false;
            uint myPlayerId = blessedLandModel.myPlayerId;
            bool isHas = false;
            //当前空闲工人数量
            int nowFreeWorkerCount = blessedLandModel.GetNowFreeWorkerCount();
            //当前可用工人体力
            int nowCanUseEnergy = blessedLandModel.GetNowCanUseEnergy();
            //最大可发包数量 = 当前空闲工人数、剩余疲劳数, 两者取最小值
            int sandCntMax = Mathf.Min(nowCanUseEnergy, nowFreeWorkerCount);
            //当前发了多少包
            int nowSendCnt = 0;
            //敌对福地和周围福地已经发过包的玩家ID
            List<uint> sendPlayerIDList = new List<uint>();
            for (int i = 0; i < chooseMineIDList.Count; i++)
            for (int i = 0; i < sandCntMax; i++)
            {
                int mineID = chooseMineIDList[i];
                if (!MineAreaItemConfig.Has(mineID))
                    continue;
                MineAreaItemConfig mineAreaItemConfig = MineAreaItemConfig.Get(mineID);
                int itemId = mineAreaItemConfig.ItemID;
                int itemLv = mineAreaItemConfig.ItemLV;
                //先找个人福地
                if (blessedLandModel.newAreaDataDict.ContainsKey(blessedLandModel.myPlayerId) &&
                    !blessedLandModel.newAreaDataDict[blessedLandModel.myPlayerId].MineItems.IsNullOrEmpty())
                if (!isStart || nowSendCnt >= sandCntMax)
                    return isHas;
                for (int j = 0; j < chooseMineIDList.Count; j++)
                {
                    var mineItemsList = blessedLandModel.newAreaDataDict[blessedLandModel.myPlayerId].MineItems.Keys.ToList();
                    mineItemsList.Sort((int a, int b) => SortByItemLV(blessedLandModel.myPlayerId, a, b));
                    for (int j = 0; j < mineItemsList.Count; j++)
                    {
                        // 没有空闲老鼠
                        int allWorkerCount = blessedLandModel.WorkerCount;
                        int freeWorkerCount = allWorkerCount - blessedLandModel.GetWorkingCount();
                        if (freeWorkerCount < 0)
                            return isHas;
                        // 工人体力耗尽
                        int energyUsed = blessedLandModel.EnergyUsed;
                        int totalEnergy = blessedLandModel.GetTotalEnergy();
                        if (energyUsed >= totalEnergy)
                            return isHas;
                    if (!isStart || nowSendCnt >= sandCntMax)
                        return isHas;
                    int mineID = chooseMineIDList[j];
                    if (!MineAreaItemConfig.Has(mineID))
                        continue;
                    MineAreaItemConfig mineAreaItemConfig = MineAreaItemConfig.Get(mineID);
                    int itemId = mineAreaItemConfig.ItemID;
                    int itemLv = mineAreaItemConfig.ItemLV;
                        int index = mineItemsList[j];
                        var mineItem = blessedLandModel.newAreaDataDict[blessedLandModel.myPlayerId].MineItems[index];
                        if (!MineAreaItemConfig.Has(mineItem.MineID))
                            continue;
                        MineAreaItemConfig config = MineAreaItemConfig.Get(mineItem.MineID);
                        //不是指定的矿物
                        if (itemId != config.ItemID || config.ItemLV < itemLv)
                            continue;
                        //当前项已在拉取
                        if (mineItem.WorkerCount > 0)
                            continue;
                        blessedLandModel.SendCB030Pack(blessedLandModel.myPlayerId, (byte)index, (byte)1, 0);
                        isHas = true;
                    }
                }
                //找周围福地
                if (!blessedLandModel.typeToPlayerIDs.IsNullOrEmpty() && blessedLandModel.typeToPlayerIDs.ContainsKey(3))
                {
                    List<uint> keyList = blessedLandModel.typeToPlayerIDs[3];
                    for (int j = 0; j < keyList.Count; j++)
                    MineAreaInfo mineAreaInfo;
                    List<uint> playerIDList;
                    //先找个人福地
                    if (newAreaDataDict.TryGetValue(myPlayerId, out mineAreaInfo) && !mineAreaInfo.MineItems.IsNullOrEmpty())
                    {
                        uint playerId = keyList[j];
                        if (blessedLandModel.newAreaDataDict.ContainsKey(playerId))
                        var mineItemsList = mineAreaInfo.MineItems.Keys.ToList();
                        mineItemsList.Sort((int a, int b) => SortByItemLV(myPlayerId, a, b));
                        for (int k = 0; k < mineItemsList.Count; k++)
                        {
                            var mineItems = blessedLandModel.newAreaDataDict[playerId].MineItems;
                            if (!isStart || nowSendCnt >= sandCntMax)
                                return isHas;
                            int index = mineItemsList[k];
                            var mineItem = mineAreaInfo.MineItems[index];
                            if (!MineAreaItemConfig.Has(mineItem.MineID))
                                continue;
                            MineAreaItemConfig config = MineAreaItemConfig.Get(mineItem.MineID);
                            //当前项已在拉取
                            if (mineItem.WorkerCount > 0)
                                continue;
                            //不是指定的矿物
                            if (itemId != config.ItemID || config.ItemLV < itemLv)
                                continue;
                            blessedLandModel.SendCB030Pack(myPlayerId, (byte)index, (byte)1, 0);
                            isHas = true;
                            nowSendCnt += 1;
                        }
                    }
                    //找周围福地
                    if (!blessedLandModel.typeToPlayerIDs.IsNullOrEmpty() && blessedLandModel.typeToPlayerIDs.TryGetValue(3, out playerIDList))
                    {
                        for (int k = 0; k < playerIDList.Count; k++)
                        {
                            uint playerId = playerIDList[k];
                            if (!isStart || nowSendCnt >= sandCntMax)
                                return isHas;
                            if (!newAreaDataDict.TryGetValue(playerId, out mineAreaInfo))
                                continue;
                            if (sendPlayerIDList.Contains(playerId))
                                continue;
                            var mineItems = mineAreaInfo.MineItems;
                            var mineItemsList = mineItems.Keys.ToList();
                            mineItemsList.Sort((int a, int b) => SortByItemLV(playerId, a, b));
                            for (int k = 0; k < mineItemsList.Count; k++)
                            for (int l = 0; l < mineItemsList.Count; l++)
                            {
                                // 没有空闲老鼠
                                int allWorkerCount = blessedLandModel.WorkerCount;
                                int freeWorkerCount = allWorkerCount - blessedLandModel.GetWorkingCount();
                                if (freeWorkerCount < 0)
                                    return isHas;
                                // 工人体力耗尽
                                int energyUsed = blessedLandModel.EnergyUsed;
                                int totalEnergy = blessedLandModel.GetTotalEnergy();
                                if (energyUsed >= totalEnergy)
                                    return isHas;
                                int index = mineItemsList[k];
                                int index = mineItemsList[l];
                                var mineItem = mineItems[index];
                                if (!MineAreaItemConfig.Has(mineItem.MineID))
                                    continue;
@@ -422,40 +436,35 @@
                                bool isSnatchItem = blessedLandModel.IsSnatchItem(playerId);
                                if (isSnatchItem)
                                    break;
                                blessedLandModel.SendCB030Pack(playerId, (byte)index, (byte)1, 0);
                                isHas = true;
                                nowSendCnt += 1;
                                if (!sendPlayerIDList.Contains(playerId))
                                    sendPlayerIDList.Add(playerId);
                                break;
                            }
                        }
                    }
                }
                //找敌对福地
                if (!blessedLandModel.typeToPlayerIDs.IsNullOrEmpty() && blessedLandModel.typeToPlayerIDs.ContainsKey(2))
                {
                    List<uint> keyList = blessedLandModel.typeToPlayerIDs[2];
                    for (int j = 0; j < keyList.Count; j++)
                    //找敌对福地
                    if (!blessedLandModel.typeToPlayerIDs.IsNullOrEmpty() && blessedLandModel.typeToPlayerIDs.TryGetValue(2, out playerIDList))
                    {
                        uint playerId = keyList[j];
                        if (blessedLandModel.newAreaDataDict.ContainsKey(playerId))
                        for (int k = 0; k < playerIDList.Count; k++)
                        {
                            var mineItems = blessedLandModel.newAreaDataDict[playerId].MineItems;
                            uint playerId = playerIDList[k];
                            if (!isStart || nowSendCnt >= sandCntMax)
                                return isHas;
                            if (!newAreaDataDict.TryGetValue(playerId, out mineAreaInfo))
                                continue;
                            if (sendPlayerIDList.Contains(playerId))
                                continue;
                            var mineItems = mineAreaInfo.MineItems;
                            var mineItemsList = mineItems.Keys.ToList();
                            mineItemsList.Sort((int a, int b) => SortByItemLV(playerId, a, b));
                            for (int k = 0; k < mineItemsList.Count; k++)
                            for (int l = 0; l < mineItemsList.Count; l++)
                            {
                                // 没有空闲老鼠
                                int allWorkerCount = blessedLandModel.WorkerCount;
                                int freeWorkerCount = allWorkerCount - blessedLandModel.GetWorkingCount();
                                if (freeWorkerCount < 0)
                                    return isHas;
                                // 工人体力耗尽
                                int energyUsed = blessedLandModel.EnergyUsed;
                                int totalEnergy = blessedLandModel.GetTotalEnergy();
                                if (energyUsed >= totalEnergy)
                                    return isHas;
                                int index = mineItemsList[k];
                                int index = mineItemsList[l];
                                var mineItem = mineItems[index];
                                if (!MineAreaItemConfig.Has(mineItem.MineID))
                                    continue;
@@ -472,12 +481,15 @@
                                    break;
                                blessedLandModel.SendCB030Pack(playerId, (byte)index, (byte)1, 0);
                                isHas = true;
                                nowSendCnt += 1;
                                if (!sendPlayerIDList.Contains(playerId))
                                    sendPlayerIDList.Add(playerId);
                                break;
                            }
                        }
                    }
                }
            }
            return isHas;
        }
@@ -485,6 +497,15 @@
        private void OnSecondEvent()
        {
            // 工人体力耗尽 立刻停掉自动采集
            int energyUsed = blessedLandModel.EnergyUsed;
            int totalEnergy = blessedLandModel.GetTotalEnergy();
            if (energyUsed >= totalEnergy)
            {
                Stop();
                return;
            }
            timer += 1;
            if (timer >= timeS)
            {
@@ -497,6 +518,7 @@
        {
            isLoginOk = false;
            startState = false;
            isTrigger = false;
            timer = 0;
        }
System/BlessedLand/BlessedLandManageMouseWin.cs
@@ -51,6 +51,15 @@
            btnAuto.SetListener(() =>
            {
                // 工人体力耗尽
                int energyUsed = blessedLandModel.EnergyUsed;
                int totalEnergy = blessedLandModel.GetTotalEnergy();
                if (energyUsed >= totalEnergy)
                {
                    SysNotifyMgr.Instance.ShowTip("BlessedLand01");
                    return;
                }
                model.Start();
                DisplayTime();
            });
System/BlessedLand/BlessedLandModel.cs
@@ -685,6 +685,16 @@
            }
            return false;
        }
        //当前空闲工人数量
        public int GetNowFreeWorkerCount()
        {
            return Mathf.Max(WorkerCount - GetWorkingCount(), 0);
        }
        //当前可用工人体力
        public int GetNowCanUseEnergy()
        {
            return Mathf.Max(GetTotalEnergy() - EnergyUsed - GetWorkingCount(), 0);
        }
        public void SendCA504Pack(byte rewardType, uint dataEx, byte dataExStrLen = 0, string dataExStr = "")
        {
@@ -849,7 +859,7 @@
            //QueryValue = 0 - 普通刷新; 1 - 超级刷新
            QueryType = source.QueryType;
            QueryValue = (int)source.QueryValue;
            List<uint> playerIdList = new List<uint>();
            for (int i = 0; i < source.AreaList.Length; i++)
@@ -880,8 +890,11 @@
                case 3:
                    typeToPlayerIDs[3] = ProcessHB033PlayerIDs(source);
                    UpdateFellowAndSurroundAreaData?.Invoke();
                    if (blessedLandManageMouseModel.startState)
                    if (blessedLandManageMouseModel.startState && blessedLandManageMouseModel.isTrigger)
                    {
                        blessedLandManageMouseModel.isTrigger = false;
                        blessedLandManageMouseModel.StratAuto();
                    }
                    break;
                case 99:
                    PlayRefreshUIEffect?.Invoke(QueryValue);
System/BlessedLand/BlessedLandWin.cs
@@ -37,6 +37,7 @@
        BlessedLandManageMouseModel blessedLandManageMouseModel { get { return ModelCenter.Instance.GetModel<BlessedLandManageMouseModel>(); } }
        PackModel playerPack { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        bool isClickSeek = false;
        bool isFirst = true;
        protected override void BindController()
        {
@@ -105,6 +106,13 @@
            blessedLandModel.PlayRefreshUIEffect += OnPlayRefreshUIEffect;
            uiEffectRefresh.OnComplete += OnUIEffectRefreshComplete;
            ModelCenter.Instance.GetModel<BlessedLandModel>().showPlayerId = blessedLandModel.myPlayerId;
            //第一次进入时发包,避免鼠管没有敌对和周围福地的数据
            if (isFirst)
            {
                isFirst = false;
                blessedLandModel.SendCB033Pack(3);
                blessedLandModel.SendCB033Pack(2);
            }
            if (blessedLandModel.AwardType == 0)
                blessedLandModel.SendCB034Pack();
            Display();