hch
2025-08-27 cc069d4dba57573a9c08811784edb613b91d127a
108 【主界面】仙树升级
15个文件已修改
16个文件已添加
866 ■■■■■ 已修改文件
Main/Component/UI/Effect/TimeMgr.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/ChestsAwardConfig.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB223_tagCMTreeLVUP.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB223_tagCMTreeLVUP.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB224_tagCMUseTreeLVUPTimeItem.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB224_tagCMUseTreeLVUPTimeItem.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB121_tagMCTreeInfo.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB121_tagMCTreeInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HB1_Role/HB121_tagMCTreeInfo.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HB1_Role/HB121_tagMCTreeInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Main.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVCell.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVManager.cs 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVManager.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVTimeUpWin.cs 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVTimeUpWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVWin.cs 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/BlessLVWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/HomeWin.cs 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/MoneyMoveByPath.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Message/ImgAnalysis.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Message/RichTextMgr.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Recharge/GotoChargeWin.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Redpoint/MainRedDot.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/ComponentExtersion.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/TimeUtility.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/UIHelper.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Effect/TimeMgr.cs
@@ -9,13 +9,11 @@
    private Dictionary<Component, TimeItem> timeItems = new Dictionary<Component, TimeItem>();
    private List<TimeItem> timeItemList = new List<TimeItem>();
    private int hourBuff = -1;
    private int minuteBuff = -1;
    public int dayBuff = -1;
    public int monthBuff { get { return LocalSave.GetInt("month"); } private set { LocalSave.SetInt("month", value); } }
    public int weekBuff { get { return LocalSave.GetInt("week"); } private set { LocalSave.SetInt("week", value); } }
    public event Action OnDayEvent;
    public event Action OnHourEvent;
    public event Action OnMinuteEvent;
    public event Action OnMonthAfterPlayerDataInitializeEvent;
    public event Action OnWeekAfterPlayerDataInitializeEvent;
@@ -55,14 +53,6 @@
                    OnHourEvent();
                }
                hourBuff = TimeUtility.ServerNow.Hour;
            }
            if (minuteBuff != TimeUtility.ServerNow.Minute)
            {
                if (OnMinuteEvent != null)
                {
                    OnMinuteEvent();
                }
                minuteBuff = TimeUtility.ServerNow.Minute;
            }
        }
        catch (Exception e)
Main/Config/PartialConfigs/ChestsAwardConfig.cs
@@ -1,9 +1,4 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Sunday, February 04, 2018
//--------------------------------------------------------
using System.Collections.Generic;
using System.Collections.Generic;
public partial class ChestsAwardConfig : ConfigBase<int, ChestsAwardConfig>
{
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB223_tagCMTreeLVUP.cs
New file
@@ -0,0 +1,18 @@
using UnityEngine;
using System.Collections;
// B2 23 仙树升级 #tagCMTreeLVUP
public class CB223_tagCMTreeLVUP : GameNetPackBasic {
    public byte Type;    // 0-开始升级(请求扣除消耗,开始升级倒计时);1-执行升级(前端自行倒计时,时间到后发送该类型)
    public CB223_tagCMTreeLVUP () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xB223;
    }
    public override void WriteToBytes () {
        WriteBytes (Type, NetDataType.BYTE);
    }
}
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB223_tagCMTreeLVUP.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 647b6a53269ebc54ba1cdbbd2d5d3c79
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB224_tagCMUseTreeLVUPTimeItem.cs
New file
@@ -0,0 +1,20 @@
using UnityEngine;
using System.Collections;
// B2 24 使用仙树升级减时物品 #tagCMUseTreeLVUPTimeItem
public class CB224_tagCMUseTreeLVUPTimeItem : GameNetPackBasic {
    public uint UseCount;    // 使用个数
    public byte IsAutoBuy;    // 不足个数是否自动购买
    public CB224_tagCMUseTreeLVUPTimeItem () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xB224;
    }
    public override void WriteToBytes () {
        WriteBytes (UseCount, NetDataType.DWORD);
        WriteBytes (IsAutoBuy, NetDataType.BYTE);
    }
}
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB224_tagCMUseTreeLVUPTimeItem.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7fc725d02eee6f745bb03e23287408a0
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB121_tagMCTreeInfo.cs
New file
@@ -0,0 +1,13 @@
using UnityEngine;
using System.Collections;
// B1 21 仙树信息 #tagMCTreeInfo
public class DTCB121_tagMCTreeInfo : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        HB121_tagMCTreeInfo vNetData = vNetPack as HB121_tagMCTreeInfo;
        BlessLVManager.Instance.UpdateBlessLVInfo(vNetData);
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB121_tagMCTreeInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b2ffbbf1287918e4f964b34b469a7fec
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -110,6 +110,7 @@
        Register(typeof(HA814_tagMCMakeItemAnswer), typeof(DTCA814_tagMCMakeItemAnswer));
        Register(typeof(HB122_tagSCHeroInfo), typeof(DTCB122_tagSCHeroInfo));
        Register(typeof(HA338_tagMCInvestInfo), typeof(DTCA338_tagMCInvestInfo));
        Register(typeof(HB121_tagMCTreeInfo), typeof(DTCB121_tagMCTreeInfo));
    }
    //主工程注册封包
Main/Core/NetworkPackage/ServerPack/HB1_Role/HB121_tagMCTreeInfo.cs
New file
@@ -0,0 +1,25 @@
using UnityEngine;
using System.Collections;
// B1 21 仙树信息 #tagMCTreeInfo
public class HB121_tagMCTreeInfo : GameNetPackBasic {
    public byte TreeLV;    // 当前仙树等级
    public byte LVUPState;    // 0-非升级中;1-升级中
    public uint LVUPRemainTime;    // 升级剩余时间,秒;当升级中且倒计时为0时可发送B223执行升级包进行升级
    public byte FreeTimeCnt;    // 今日已免费减时次数
    public uint FreeTimeLast;    // 上次免费减时时间戳
    public HB121_tagMCTreeInfo () {
        _cmd = (ushort)0xB121;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out TreeLV, vBytes, NetDataType.BYTE);
        TransBytes (out LVUPState, vBytes, NetDataType.BYTE);
        TransBytes (out LVUPRemainTime, vBytes, NetDataType.DWORD);
        TransBytes (out FreeTimeCnt, vBytes, NetDataType.BYTE);
        TransBytes (out FreeTimeLast, vBytes, NetDataType.DWORD);
    }
}
Main/Core/NetworkPackage/ServerPack/HB1_Role/HB121_tagMCTreeInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5d4fec1aa2a73b64086988aef86ec5c6
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Main.cs
@@ -76,6 +76,7 @@
        managers.Add(PlayerMainDate.Instance);
        managers.Add(HeroUIManager.Instance);
        managers.Add(InvestModel.Instance);
        managers.Add(BlessLVManager.Instance);
        foreach (var manager in managers)
        {
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -15,6 +15,10 @@
    public override bool IsFinished()
    {
        if (null == skillBase)
        {
            return true;
        }
        return skillBase.IsFinished();
    }
Main/System/Battle/Motion/MotionBase.cs
@@ -152,6 +152,7 @@
        if (anim == null)
        {
            BattleDebug.LogError($"找不到动画: {skillConfig.SkillMotionName}");
            _onComplete?.Invoke();
            return null;
        }
Main/System/Equip/BlessLVCell.cs
New file
@@ -0,0 +1,44 @@
using UnityEngine;
using UnityEngine.UI;
public class BlessLVCell : CellView
{
    [SerializeField] Text qualityName;
    [SerializeField] Text qualityRate;
    [SerializeField] Text qualityNextRate;
    [SerializeField] Image qualityIcon;
    [SerializeField] OutlineEx qualityNameOutline;
    public void Display(int index)
    {
        var startQuality = BlessLVManager.Instance.GetStartEquipQuality();
        var config = TreeLVConfig.Get(BlessLVManager.Instance.m_TreeLV);
        var nextConfig = TreeLVConfig.Get(BlessLVManager.Instance.m_TreeLV + 1);
        var quality = startQuality + index;
        qualityName.text = Language.Get("equipQuality" + quality);
        qualityName.color = UIHelper.GetUIColor(quality);
        float rate = 0;
        if (config != null)
        {
            if (quality - 1 < config.EquipColorRateList.Length)
                rate = config.EquipColorRateList[quality - 1] / 100.0f;
        }
        qualityRate.text = rate + "%";
        if (nextConfig != null)
        {
            if (quality - 1 < nextConfig.EquipColorRateList.Length)
                rate = nextConfig.EquipColorRateList[quality - 1] / 100.0f;
        }
        qualityNextRate.text = rate + "%";
        qualityIcon.SetSprite("TreeItemQuality_" + quality);
        qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(quality);
    }
}
Main/System/Equip/BlessLVCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bcbe9f8e3b41b3049be9a08f505fde26
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Equip/BlessLVManager.cs
New file
@@ -0,0 +1,177 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class BlessLVManager : GameSystemManager<BlessLVManager>
{
    public int m_TreeLV { get; private set; }    // 当前仙树等级
    public int m_LVUPState { get; private set; } // 0-非升级中;1-升级中
    public int m_LVUPRemainTime { get; private set; } // 升级剩余时间,秒;当升级中且倒计时为0时可发送B223执行升级包进行升级
    public int m_FreeTimeCnt { get; private set; }    // 今日已免费减时次数
    public int m_FreeTimeLast { get; private set; } // 上次免费减时时间戳
    public event Action OnBlessLVUpdateEvent;
    int m_LVPackTime; //收包时间用于计算剩余时间m_LVUPRemainTime
    public int upgradeTreeMoneyType; //升级仙树消耗的货币类型
    public int timeUpTreeItemID; //加速仙树升级的道具ID
    public int timeUpTreeItemSubTime; //减少仙树升级时间的道具减少的时间
    public int dayFreeMaxTimes; //每日免费升级次数
    public int freeTimeCD; //免费减少时间的冷却CD 分
    public int freeSubTime; //免费减少的时间 分
    public int lastTreeLV; //上一次树的等级 用于打开界面的时候播放下升级特效
    public override void Init()
    {
        m_TreeLV = 0;
        m_LVUPState = 0;
        m_LVUPRemainTime = 0;
        m_LVPackTime = 0;
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOK;
        GlobalTimeEvent.Instance.fiveSecondEvent += OnTimeEvent;
        ParseConfig();
    }
    public override void Release()
    {
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOK;
        GlobalTimeEvent.Instance.fiveSecondEvent -= OnTimeEvent;
    }
    void OnPlayerLoginOK()
    {
        lastTreeLV = 0;
        AutoUpgrade();
        UpdateTreeRedpoint();
    }
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("TreeLVUP");
        upgradeTreeMoneyType = int.Parse(config.Numerical1);
        var arr = config.Numerical2.Split('|');
        timeUpTreeItemID = int.Parse(arr[0]);
        timeUpTreeItemSubTime = int.Parse(arr[1]);
        dayFreeMaxTimes = int.Parse(config.Numerical3);
        freeTimeCD = int.Parse(config.Numerical4);
        freeSubTime = int.Parse(config.Numerical5);
    }
    public void UpdateBlessLVInfo(HB121_tagMCTreeInfo netPack)
    {
        m_TreeLV = netPack.TreeLV;
        m_LVUPState = netPack.LVUPState;
        m_LVUPRemainTime = (int)netPack.LVUPRemainTime;
        m_FreeTimeCnt = netPack.FreeTimeCnt;
        m_FreeTimeLast = (int)netPack.FreeTimeLast;
        m_LVPackTime = TimeUtility.AllSeconds;
        if (lastTreeLV == 0)
        {
            lastTreeLV = m_TreeLV;
        }
        OnBlessLVUpdateEvent?.Invoke();
        UpdateTreeRedpoint();
        AutoUpgrade();
    }
    public int GetLVUPRemainTime()
    {
        if (m_LVUPState == 0)
            return 0;
        return m_LVUPRemainTime - (TimeUtility.AllSeconds - m_LVPackTime);
    }
    public int GetFreeRemainTime()
    {
        if (m_LVUPState == 0)
            return 0;
        return m_FreeTimeLast + freeTimeCD * 60 - TimeUtility.AllSeconds;
    }
    Redpoint redpointTree = new Redpoint(MainRedDot.BlessLVRedpoint);
    Redpoint redpointTreeItem = new Redpoint(MainRedDot.BlessLVRedpoint, MainRedDot.BlessLVRedpoint * 10);
    Redpoint redpointTreeFree = new Redpoint(MainRedDot.BlessLVRedpoint, MainRedDot.BlessLVRedpoint * 10 + 1);
    void UpdateTreeRedpoint()
    {
        redpointTreeFree.state = RedPointState.None;
        redpointTreeItem.state = RedPointState.None;
        redpointTree.state = RedPointState.None;
        var config = TreeLVConfig.Get(m_TreeLV);
        if (config == null) return;
        //非升级中检查升级材料
        if (m_LVUPState == 0)
        {
            if (UIHelper.GetMoneyCnt(upgradeTreeMoneyType) >= config.LVUPNeedMoney)
            {
                redpointTree.state = RedPointState.Simple;
            }
        }
        else
        {
            //检查时间道具 和 免费的时间
            if (PackManager.Instance.GetSinglePack(PackType.Item).HasItem(timeUpTreeItemID))
            {
                redpointTreeItem.state = RedPointState.Simple;
                return;
            }
            if (m_FreeTimeCnt > 0 && GetFreeRemainTime() <= 0)
            {
                redpointTreeFree.state = RedPointState.Simple;
                return;
            }
        }
    }
    public void AutoUpgrade()
    {
        //时间结束自动通知服务端升级,或者打开界面时,或者上线 都做检查
        if (m_LVUPState == 0)
        {
            return;
        }
        if (GetLVUPRemainTime() > 0)
        {
            return;
        }
        var pack = new CB223_tagCMTreeLVUP();
        pack.Type = 1;
        GameNetSystem.Instance.SendInfo(pack);
    }
    void OnTimeEvent()
    {
        //升级中检查 倒计时结束;非升级中检查免费次数时间 红点
        if (m_LVUPState == 1)
        {
            //升级
            AutoUpgrade();
        }
        UpdateTreeRedpoint();
    }
    //装备品质的起始表现,最小1
    public int GetStartEquipQuality()
    {
        var rateList = TreeLVConfig.Get(m_TreeLV).EquipColorRateList;
        for (int i = 0; i < rateList.Length; i++)
        {
            if (rateList[i] != 0)
                return i + 1;
        }
        return 1;
    }
}
Main/System/Equip/BlessLVManager.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4ec372b43a4e10e4798aa452c7c1f6aa
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Equip/BlessLVTimeUpWin.cs
New file
@@ -0,0 +1,112 @@

using System;
using UnityEngine;
using UnityEngine.UI;
public class BlessLVTimeUpWin : UIBase
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] Text itemCntTxt;
    [SerializeField] LongPressButton subBtn;
    [SerializeField] LongPressButton addBtn;
    [SerializeField] Text timeText;
    [SerializeField] Button speedBtn;
    protected override void InitComponent()
    {
        addBtn.SetListener(OnClickPlus);
        addBtn.onPress.AddListener(OnClickPlus);
        subBtn.SetListener(OnClickReduce);
        subBtn.onPress.AddListener(OnClickReduce);
        speedBtn.AddListener(OnSpeedUP);
    }
    protected override void OnPreOpen()
    {
        int count = (int)PackManager.Instance.GetItemCountByID(PackType.Item, BlessLVManager.Instance.timeUpTreeItemID);
        itemCell.Init(new ItemCellModel(BlessLVManager.Instance.timeUpTreeItemID, false, count));
        itemCell.button.AddListener(() =>
        {
            ItemTipUtility.Show(BlessLVManager.Instance.timeUpTreeItemID);
        });
        var remainTime = BlessLVManager.Instance.GetLVUPRemainTime();
        int needCount = (int)Math.Ceiling((float)remainTime / BlessLVManager.Instance.timeUpTreeItemSubTime);
        showCount = Math.Min(count, needCount);
        RefreshCount(needCount, remainTime);
        RefreshBtn(showCount);
    }
    int showCount;
    void RefreshCount(int needCount, int remainTime)
    {
        itemCntTxt.text = showCount + "/" + needCount;
        timeText.text = Language.Get("L1100", Language.Get("BlessTree8"), TimeUtility.SecondsToDHMSEx(remainTime)) +
        UIHelper.AppendColor(TextColType.DarkGreen, "(" + TimeUtility.SecondsToDHMSEx(showCount * BlessLVManager.Instance.timeUpTreeItemSubTime) + ")");
    }
    void RefreshBtn(int maxCount)
    {
        if (showCount >= maxCount)
        {
            addBtn.interactable = false;
            addBtn.SetColorful(null, false);
        }
        else
        {
            addBtn.interactable = true;
            addBtn.SetColorful(null, true);
        }
        if (showCount == 0)
        {
            subBtn.interactable = false;
            subBtn.SetColorful(null, false);
        }
        else
        {
            subBtn.interactable = true;
            subBtn.SetColorful(null, true);
        }
    }
    void OnClickPlus()
    {
        int count = (int)PackManager.Instance.GetItemCountByID(PackType.Item, BlessLVManager.Instance.timeUpTreeItemID);
        var remainTime = BlessLVManager.Instance.GetLVUPRemainTime();
        int needCount = (int)Math.Ceiling((float)remainTime / BlessLVManager.Instance.timeUpTreeItemSubTime);
        if (showCount == Math.Min(count, needCount))
            return;
        showCount++;
        RefreshCount(needCount, remainTime);
        RefreshBtn(Math.Min(count, needCount));
    }
    void OnClickReduce()
    {
        if (showCount == 0)
            return;
        var remainTime = BlessLVManager.Instance.GetLVUPRemainTime();
        showCount--;
        itemCntTxt.text = showCount.ToString();
        int needCount = (int)Math.Ceiling((float)remainTime / BlessLVManager.Instance.timeUpTreeItemSubTime);
        RefreshCount(needCount, remainTime);
        int count = (int)PackManager.Instance.GetItemCountByID(PackType.Item, BlessLVManager.Instance.timeUpTreeItemID);
        RefreshBtn(Math.Min(count, needCount));
    }
    void OnSpeedUP()
    {
        var pack = new CB224_tagCMUseTreeLVUPTimeItem();
        pack.UseCount = (uint)showCount;
        GameNetSystem.Instance.SendInfo(pack);
        CloseWindow();
    }
}
Main/System/Equip/BlessLVTimeUpWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 71aa0a65d75dea04c9bded1f9bc01fc3
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Equip/BlessLVWin.cs
New file
@@ -0,0 +1,214 @@

using System;
using UnityEngine;
using UnityEngine.UI;
public class BlessLVWin : UIBase
{
    [SerializeField] Text curLVTxt;
    [SerializeField] Text nextLVTxt;
    [SerializeField] ScrollerController scroller;
    [SerializeField] Text leftTime;
    [SerializeField] Transform upgradeOnState;  //升级中按钮
    [SerializeField] Text itemCntTxt;
    [SerializeField] Image itemIcon;
    [SerializeField] Button timeUpBtn;  //加速时间按钮
    [SerializeField] Button freeBtn;
    [SerializeField] Text freeLeftTime;
    [SerializeField] Transform upgradeWaiteState; //待升级
    [SerializeField] Image processImg;  //进度
    [SerializeField] Text moneyText;
    [SerializeField] Image moneyTypeImg;
    [SerializeField] Button upgradeButton;
    [SerializeField] UIEffectPlayer upgradeEffect;
    [SerializeField] UIEffectPlayer btnEffect;
    protected override void InitComponent()
    {
        timeUpBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<BlessLVTimeUpWin>();
        });
        upgradeButton.AddListener(OnUpgrade);
        freeBtn.AddListener(() =>
        {
            var pack = new CA504_tagCMPlayerGetReward();
            pack.RewardType = 82;
            GameNetSystem.Instance.SendInfo(pack);
        });
    }
    protected override void OnPreOpen()
    {
        BlessLVManager.Instance.OnBlessLVUpdateEvent += Display;
        PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefreshEvent;
        GlobalTimeEvent.Instance.secondEvent += OnTimeEvent;
        scroller.OnRefreshCell += OnRefreshCell;
        CreateScroller();
        Display();
        BlessLVManager.Instance.AutoUpgrade();
    }
    protected override void OnPreClose()
    {
        BlessLVManager.Instance.OnBlessLVUpdateEvent -= Display;
        PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefreshEvent;
        GlobalTimeEvent.Instance.secondEvent -= OnTimeEvent;
        scroller.OnRefreshCell -= OnRefreshCell;
    }
    void DisplayLVUPEffect()
    {
        if (BlessLVManager.Instance.lastTreeLV != BlessLVManager.Instance.m_TreeLV)
        {
            BlessLVManager.Instance.lastTreeLV = BlessLVManager.Instance.m_TreeLV;
            upgradeEffect.Play();
        }
        else
        {
            upgradeEffect.Stop();
        }
    }
    void OnTimeEvent()
    {
        if (BlessLVManager.Instance.m_LVUPState == 1)
        {
            if (BlessLVManager.Instance.GetLVUPRemainTime() > 0)
            {
                TimeUpShow();
            }
        }
    }
    void Display()
    {
        curLVTxt.text = Language.Get("L1100", Language.Get("BlessTree2"), BlessLVManager.Instance.m_TreeLV);
        nextLVTxt.text = Language.Get("L1100", Language.Get("BlessTree3"), BlessLVManager.Instance.m_TreeLV + 1);
        var config = TreeLVConfig.Get(BlessLVManager.Instance.m_TreeLV);
        itemIcon.SetItemSprite(BlessLVManager.Instance.timeUpTreeItemID);
        //待升级
        if (BlessLVManager.Instance.m_LVUPState == 0)
        {
            upgradeOnState.SetActive(false);
            upgradeWaiteState.SetActive(true);
            leftTime.text = Language.Get("L1100", Language.Get("BlessTree8"), TimeUtility.SecondsToDHMSEx(config.LVUPNeedTime));
            ShowMoney();
            moneyTypeImg.SetIconWithMoneyType(BlessLVManager.Instance.upgradeTreeMoneyType);
        }
        else
        {
            upgradeOnState.SetActive(true);
            upgradeWaiteState.SetActive(false);
            TimeUpShow();
        }
        DisplayLVUPEffect();
        scroller.m_Scorller.RefreshActiveCellViews();
    }
    void TimeUpShow()
    {
        var remainTime = BlessLVManager.Instance.GetLVUPRemainTime();
        leftTime.text = Language.Get("L1100", Language.Get("BlessTree8"), TimeUtility.SecondsToDHMSEx(remainTime));
        long itemCnt = PackManager.Instance.GetItemCountByID(PackType.Item, BlessLVManager.Instance.timeUpTreeItemID);
        int needCount = (int)Math.Ceiling((float)remainTime / BlessLVManager.Instance.timeUpTreeItemSubTime);
        itemCntTxt.text = itemCnt + "/" + needCount;
        itemCntTxt.color = itemCnt >= needCount ? UIHelper.GetUIColor(TextColType.Green, true) : UIHelper.GetUIColor(TextColType.Red, true);
        if (BlessLVManager.Instance.m_FreeTimeCnt < BlessLVManager.Instance.dayFreeMaxTimes)
        {
            var freeeRemainTime = BlessLVManager.Instance.GetFreeRemainTime();
            if (freeeRemainTime > 0)
            {
                freeLeftTime.text = TimeUtility.SecondsToHMS(freeeRemainTime);
                freeBtn.interactable = false;
            }
            else
            {
                freeLeftTime.text = "";
                freeBtn.interactable = true;
            }
        }
        else
        {
            freeLeftTime.text = "";
            freeBtn.interactable = false;
        }
    }
    void CreateScroller()
    {
        scroller.Refresh();
        for (int i = 0; i < 13; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, i);
        }
        scroller.Restart();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as BlessLVCell;
        _cell.Display(cell.index);
    }
    private void OnPlayerDataRefreshEvent(PlayerDataType type)
    {
        if (type == UIHelper.moneyTypeToPlayerDataType[BlessLVManager.Instance.upgradeTreeMoneyType])
        {
            ShowMoney();
        }
    }
    void ShowMoney()
    {
        var config = TreeLVConfig.Get(BlessLVManager.Instance.m_TreeLV);
        string needMoney = config.LVUPNeedMoney.ToString();
        if (config.LVUPNeedMoney >= 1000000)
            needMoney = UIHelper.ReplaceLargeNum(config.LVUPNeedMoney);
        long lsMoney = UIHelper.GetMoneyCnt(BlessLVManager.Instance.upgradeTreeMoneyType);
        string money = lsMoney.ToString();
        if (lsMoney >= 1000000)
            money = UIHelper.ReplaceLargeNum(lsMoney);
        moneyText.text = money + "/" + needMoney;
        // moneyText.color = lsMoney >= config.LVUPNeedMoney ? UIHelper.GetUIColor(TextColType.Green, true) : UIHelper.GetUIColor(TextColType.Red, true);
        moneyTypeImg.SetIconWithMoneyType(BlessLVManager.Instance.upgradeTreeMoneyType);
        processImg.fillAmount = (float)lsMoney / config.LVUPNeedMoney;
    }
    void OnUpgrade()
    {
        var config = TreeLVConfig.Get(BlessLVManager.Instance.m_TreeLV);
        if (config.LVUPNeedMoney > UIHelper.GetMoneyCnt(BlessLVManager.Instance.upgradeTreeMoneyType))
        {
            ItemTipUtility.ShowMoneyTip(BlessLVManager.Instance.upgradeTreeMoneyType);
            return;
        }
        var pack = new CB223_tagCMTreeLVUP();
        pack.Type = 0;
        GameNetSystem.Instance.SendInfo(pack);
    }
}
Main/System/Equip/BlessLVWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e9b4d07c3a38a1b4cb30eea29e82efa5
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Main/HomeWin.cs
@@ -28,7 +28,8 @@
    [SerializeField] Button changeHeroPosBtn;
    [SerializeField] Button autoBtn;
    [SerializeField] Button  blessLVBtn;
    [SerializeField] Text blessLVText;
    //其他功能入口
    [SerializeField] Button monthCardBtn;
@@ -78,37 +79,41 @@
        {
            InvestModel.Instance.BuyInvest(InvestModel.monthCardType);
        });
        blessLVBtn.AddListener(()=>
        {
            UIManager.Instance.OpenWindow<BlessLVWin>();
        });
    }
    public override void Refresh()
    public void Display()
    {
        UpdatePlayerInfo();
        UpdateTask();
        RefreshRecharge();
        ShowBlessLV();
    }
    protected override void OnPreOpen()
    {
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        TaskManager.Instance.OnTaskUpdate += UpdateTask;
        Refresh();
        BlessLVManager.Instance.OnBlessLVUpdateEvent += ShowBlessLV;
        Display();
        // var battleWin = UIManager.Instance.OpenWindow<BattleWin>();
        // battleWin.SetBattleField(BattleManager.Instance.storyBattleField);
    }
    protected override void OnOpen()
    {
        base.OnOpen();
    }
    protected override void OnPreClose()
    {
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
        TaskManager.Instance.OnTaskUpdate -= UpdateTask;
        BlessLVManager.Instance.OnBlessLVUpdateEvent -= ShowBlessLV;
        //  关闭的时候把战斗界面也给关了 虽然是在外面开的
        UIManager.Instance.CloseWindow<BattleWin>();
@@ -135,6 +140,12 @@
        monthCardBtn.SetActive(!InvestModel.Instance.IsInvested(InvestModel.monthCardType));
    }
    void ShowBlessLV()
    {
        blessLVText.text = BlessLVManager.Instance.m_TreeLV.ToString();
    }
    /// <summary>
    /// 更新玩家信息
    /// </summary>
Main/System/Main/MoneyMoveByPath.cs
@@ -46,7 +46,7 @@
                //挂父节点
                imgMoney.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
                var moneyImg = imgMoney.GetComponent<ImageEx>();
                moneyImg.SetSprite(StringUtility.Contact("Money_Type_", moneyType));
                moneyImg.SetIconWithMoneyType(moneyType);
                moneyImg.raycastTarget = false;
                moneyImg.GetComponent<RectTransform>().sizeDelta = new Vector2(40, 40);
                imgMoneys.Add(moneyImg);
Main/System/Message/ImgAnalysis.cs
@@ -131,6 +131,11 @@
                        presentImgInfo.spriteName = array[1];
                    }
                    break;
                case "folder":
                    {
                        presentImgInfo.folderName = array[1];
                    }
                    break;
                case "face":
                    {
                        presentImgInfo.spriteName = array[1];
@@ -143,7 +148,7 @@
                                height = (int)RichTextMgr.Inst.presentRichText.FaceSize;
                            }
                            else
                            {
                            {
                                if (UIFrameMgr.Inst.ContainsDynamicImage(presentImgInfo.spriteName))
                                {
                                    var list = UIFrameMgr.Inst.GetDynamicImage(presentImgInfo.spriteName);
@@ -189,7 +194,14 @@
        if (presentImgInfo.IsFace) return;
        if (IconConfig.isInit)
        {
            presentImgInfo.sprite = UILoader.LoadSprite(presentImgInfo.spriteName);
            if (!string.IsNullOrEmpty(presentImgInfo.folderName))
            {
                presentImgInfo.sprite = UILoader.LoadSprite(presentImgInfo.folderName, presentImgInfo.spriteName);
            }
            else
            {
                presentImgInfo.sprite = UILoader.LoadSprite(presentImgInfo.spriteName);
            }
        }
        if (presentImgInfo.sprite != null)
Main/System/Message/RichTextMgr.cs
@@ -122,6 +122,7 @@
        public Sprite sprite;
        public string spriteName;
        public string folderName;  //没有在icon表中配置的,直接配置图片名,需配置文件夹路径
        public bool IsFace;
        public float scale; //缩放图片的同时,二次缩放了图片在文本钟的占位大小,查看函数InverseToRichText
Main/System/Recharge/GotoChargeWin.cs
@@ -1,8 +1,3 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Wednesday, May 09, 2018
//--------------------------------------------------------
using System;
using UnityEngine;
using UnityEngine.UI;
Main/System/Redpoint/MainRedDot.cs
@@ -78,7 +78,8 @@
    #region 仙盟活动红点
    public readonly Redpoint fairyActivityRedpoint = new Redpoint(218);
    #endregion
    public static int BlessLVRedpoint = 399;  //祝福等级红点
    public static int DailySpecialsRedpoint = 439;  //每日特惠入口红点
    public static int BlessedLandRedpoint = 444; //福地红点
Main/Utility/ComponentExtersion.cs
@@ -306,6 +306,40 @@
        _image.overrideSprite = sprite;
    }
    public static void SetItemSprite(this Image _image, int itemID)
    {
        if (_image == null)
        {
            return;
        }
        var itemConfig = ItemConfig.Get(itemID);
        if (itemConfig == null)
        {
            return;
        }
        var sprite = UILoader.LoadSprite("icon", itemConfig.IconKey);
        _image.overrideSprite = sprite;
    }
    public static void SetSkillSprite(this Image _image, int skillID)
    {
        if (_image == null)
        {
            return;
        }
        var skillConfig = SkillConfig.Get(skillID);
        if (skillConfig == null)
        {
            return;
        }
        var sprite = UILoader.LoadSprite("SkillIcon", skillConfig.IconName);
        _image.overrideSprite = sprite;
    }
    public static void SetActive(this Component compoent, bool active)
    {
        if (compoent != null)
Main/Utility/TimeUtility.cs
@@ -345,6 +345,21 @@
    }
    //例子
    //大于24小时显示:x天xx小时xx分
    //小于24小时显示:xx:xx:xx
    public static string SecondsToDHMSEx(int _seconds)
    {
        int days = _seconds / 86400;
        int hours = _seconds % 86400 / 3600;
        int mins = _seconds % 3600 / 60;
        int seconds = _seconds % 60;
        if (days > 0)
        {
            return StringUtility.Contact(days, Language.Get("L1074"), hours.ToString("D2"), Language.Get("L1072"), mins.ToString("D2"), Language.Get("L1073"));
        }
        return StringUtility.Contact(hours.ToString("D2"), ":", mins.ToString("D2"), ":", seconds.ToString("D2"));
    }
    //例子
    //x天
    //x时
    //x分x秒
Main/Utility/UIHelper.cs
@@ -69,20 +69,28 @@
    public static void SetIconWithMoneyType(this Image _image, int moneyType)
    {
        if (_image == null) return;
        string iconKey = StringUtility.Contact("Money_Type_", moneyType);
        _image.SetSprite(iconKey);
    }
    public static void SetSmallIconWithMoneyType(this Image _image, int moneyType)
    {
        if (_image == null) return;
        string iconKey = StringUtility.Contact("SmallMoney", moneyType);
        _image.SetSprite(iconKey);
        // string iconKey = StringUtility.Contact("Money_Type_", moneyType);
        if (GeneralDefine.MoneyDisplayModel.ContainsKey(moneyType))
        {
            _image.SetOrgSprite(ItemConfig.Get(GeneralDefine.MoneyDisplayModel[moneyType]).IconKey);
        }
        else
        {
            Debug.LogError("MoneyDisplayModel 为配置货币类型:" + moneyType);
        }
    }
    public static string GetIconNameWithMoneyType(int moneyType)
    {
        return StringUtility.Contact("Money_Type_", moneyType);
        if (GeneralDefine.MoneyDisplayModel.ContainsKey(moneyType))
        {
            return ItemConfig.Get(GeneralDefine.MoneyDisplayModel[moneyType]).IconKey;
        }
        else
        {
            Debug.LogError("MoneyDisplayModel 为配置货币类型:" + moneyType);
            return "";
        }
    }
    /// <summary>