少年修仙传客户端代码仓库
client_Hale
2019-05-16 469dbd2e5a06faab01e8190d038db83edb12cbe0
Merge branch 'master' of http://192.168.0.87:10010/r/snxxz_scripts
17个文件已修改
4个文件已添加
1043 ■■■■■ 已修改文件
Core/GameEngine/Model/Config/DungeonConfig.cs 414 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/DungeonConfig.cs.meta 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TaskFeedbackConfig.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TaskFeedbackConfig.cs.meta 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TaskFeedbackFuncConfig.cs 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TaskFeedbackFuncConfig.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/EquipGem/EquipStrengthModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/HazyRegion/HazyDemonKingModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/HazyRegion/HazyGrassModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/MainInterfacePanel/TaskFeedbackFuncWin.cs 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/MainInterfacePanel/TaskFeedbackFuncWin.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/MainInterfacePanel/TaskFeedbackModel.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Message/RichNormalEvent.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Mount/MountModel.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Pet/PetModel.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootModel.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootWin.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/ExpertSkillActiveRemindWin.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/ExpertSkillSelectWin.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/WindowJump/WindowJumpMgr.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/ConfigInitiator.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/DungeonConfig.cs
@@ -1,18 +1,18 @@
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           Wednesday, May 15, 2019
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
[XLua.LuaCallCSharp]
public partial class DungeonConfig
{
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           Thursday, May 16, 2019
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
[XLua.LuaCallCSharp]
public partial class DungeonConfig
{
    public readonly int ID;
    public readonly int DataMapID;
    public readonly int LineID;
@@ -28,24 +28,25 @@
    public readonly int SweepItemID;
    public readonly int SweepCostCnt;
    public readonly string StepTime;
    public readonly string RefreshNPC;
    public readonly int[] BossActorID;
    public readonly int[] Rewards;
    public readonly string[] RewardCountDescriptions;
    public readonly string Description;
    public readonly int AutomaticATK;
    public readonly int MapButton;
    public readonly int ShowNewItemTip;
    public DungeonConfig()
    {
    }
    public DungeonConfig(string input)
    {
        try
        {
            var tables = input.Split('\t');
    public readonly int ShowNewItemTip;
    public DungeonConfig()
    {
    }
    public DungeonConfig(string input)
    {
        try
        {
            var tables = input.Split('\t');
            int.TryParse(tables[0],out ID); 
            int.TryParse(tables[1],out DataMapID); 
@@ -81,198 +82,199 @@
            StepTime = tables[14];
            string[] BossActorIDStringArray = tables[15].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            RefreshNPC = tables[15];
            string[] BossActorIDStringArray = tables[16].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            BossActorID = new int[BossActorIDStringArray.Length];
            for (int i=0;i<BossActorIDStringArray.Length;i++)
            {
                 int.TryParse(BossActorIDStringArray[i],out BossActorID[i]);
            }
            string[] RewardsStringArray = tables[16].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            string[] RewardsStringArray = tables[17].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            Rewards = new int[RewardsStringArray.Length];
            for (int i=0;i<RewardsStringArray.Length;i++)
            {
                 int.TryParse(RewardsStringArray[i],out Rewards[i]);
            }
            RewardCountDescriptions = tables[17].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            RewardCountDescriptions = tables[18].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            Description = tables[18];
            Description = tables[19];
            int.TryParse(tables[19],out AutomaticATK);
            int.TryParse(tables[20],out AutomaticATK);
            int.TryParse(tables[20],out MapButton);
            int.TryParse(tables[21],out MapButton);
            int.TryParse(tables[21],out ShowNewItemTip);
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, DungeonConfig> configs = new Dictionary<string, DungeonConfig>();
    public static DungeonConfig Get(string id)
    {
        if (!inited)
        {
            Debug.Log("DungeonConfig 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        DungeonConfig config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new DungeonConfig(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static DungeonConfig Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<DungeonConfig> GetValues()
    {
        var values = new List<DungeonConfig>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        foreach (var key in keys)
        {
            values.Add(Get(key));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/Dungeon.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/Dungeon.txt");
        }
        configs.Clear();
        var tempConfig = new DungeonConfig();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new DungeonConfig(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new DungeonConfig(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
            int.TryParse(tables[22],out ShowNewItemTip);
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, DungeonConfig> configs = new Dictionary<string, DungeonConfig>();
    public static DungeonConfig Get(string id)
    {
        if (!inited)
        {
            Debug.Log("DungeonConfig 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        DungeonConfig config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new DungeonConfig(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static DungeonConfig Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<DungeonConfig> GetValues()
    {
        var values = new List<DungeonConfig>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        foreach (var key in keys)
        {
            values.Add(Get(key));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/Dungeon.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/Dungeon.txt");
        }
        var tempConfig = new DungeonConfig();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new DungeonConfig(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new DungeonConfig(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
Core/GameEngine/Model/Config/DungeonConfig.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 2ba0eb2bd821fca4884c500add41380d
timeCreated: 1557892172
timeCreated: 1557978286
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/GameEngine/Model/Config/TaskFeedbackConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           Wednesday, May 15, 2019
//    [  Date ]:           Thursday, May 16, 2019
//--------------------------------------------------------
using System.Collections.Generic;
@@ -19,8 +19,10 @@
    public readonly string equips;
    public readonly string items;
    public readonly string sideTasks;
    public readonly string reikiRoot;
    public readonly int[] succGuide;
    public readonly int[] failGuide;
    public readonly int[] failFuncs;
    public readonly string remind;
    public TaskFeedbackConfig()
@@ -45,21 +47,30 @@
            sideTasks = tables[5];
            string[] succGuideStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            reikiRoot = tables[6];
            string[] succGuideStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            succGuide = new int[succGuideStringArray.Length];
            for (int i=0;i<succGuideStringArray.Length;i++)
            {
                 int.TryParse(succGuideStringArray[i],out succGuide[i]);
            }
            string[] failGuideStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            string[] failGuideStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            failGuide = new int[failGuideStringArray.Length];
            for (int i=0;i<failGuideStringArray.Length;i++)
            {
                 int.TryParse(failGuideStringArray[i],out failGuide[i]);
            }
            remind = tables[8];
            string[] failFuncsStringArray = tables[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            failFuncs = new int[failFuncsStringArray.Length];
            for (int i=0;i<failFuncsStringArray.Length;i++)
            {
                 int.TryParse(failFuncsStringArray[i],out failFuncs[i]);
            }
            remind = tables[10];
        }
        catch (Exception ex)
        {
Core/GameEngine/Model/Config/TaskFeedbackConfig.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: b80a883f246077d46ab59d6938182ec9
timeCreated: 1557911827
timeCreated: 1557997420
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/GameEngine/Model/Config/TaskFeedbackFuncConfig.cs
New file
@@ -0,0 +1,208 @@
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           Thursday, May 16, 2019
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
[XLua.LuaCallCSharp]
public partial class TaskFeedbackFuncConfig
{
    public readonly int id;
    public readonly string name;
    public readonly int jump;
    public readonly int guide;
    public TaskFeedbackFuncConfig()
    {
    }
    public TaskFeedbackFuncConfig(string input)
    {
        try
        {
            var tables = input.Split('\t');
            int.TryParse(tables[0],out id);
            name = tables[1];
            int.TryParse(tables[2],out jump);
            int.TryParse(tables[3],out guide);
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, TaskFeedbackFuncConfig> configs = new Dictionary<string, TaskFeedbackFuncConfig>();
    public static TaskFeedbackFuncConfig Get(string id)
    {
        if (!inited)
        {
            Debug.Log("TaskFeedbackFuncConfig 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        TaskFeedbackFuncConfig config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new TaskFeedbackFuncConfig(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static TaskFeedbackFuncConfig Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<TaskFeedbackFuncConfig> GetValues()
    {
        var values = new List<TaskFeedbackFuncConfig>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        foreach (var key in keys)
        {
            values.Add(Get(key));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/TaskFeedbackFunc.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/TaskFeedbackFunc.txt");
        }
        var tempConfig = new TaskFeedbackFuncConfig();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new TaskFeedbackFuncConfig(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new TaskFeedbackFuncConfig(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
Core/GameEngine/Model/Config/TaskFeedbackFuncConfig.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b2d416872ed7b3048a5b2d4696c3541f
timeCreated: 1557994779
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/EquipGem/EquipStrengthModel.cs
@@ -645,7 +645,7 @@
                    {
                        strengthLevel = EquipStrengthDic[serverPlace].StrengthLevel;
                    }
                    var stage = strengthLevel / 20;
                    var stage = strengthLevel / 10;
                    if (minStage > stage)
                    {
System/HazyRegion/HazyDemonKingModel.cs
@@ -47,7 +47,7 @@
        public void OnPlayerLoginOk()
        {
            if (IsInDungeon)
            if (IsInDemonKingDungeon(PlayerDatas.Instance.baseData.MapID))
            {
                var config = HazyRegionConfig.Get(hazyRegionModel.processingIncidentId);
                ClientDungeonStageUtility.RequestStartClientDungeon(config.dungeonId, config.lineId);
System/HazyRegion/HazyGrassModel.cs
@@ -56,7 +56,7 @@
        public void OnPlayerLoginOk()
        {
            if (IsInDungeon)
            if (IsInGrassDungeon(PlayerDatas.Instance.baseData.MapID))
            {
                var config = HazyRegionConfig.Get(hazyRegionModel.processingIncidentId);
                ClientDungeonStageUtility.RequestStartClientDungeon(config.dungeonId, config.lineId);
System/MainInterfacePanel/TaskFeedbackFuncWin.cs
New file
@@ -0,0 +1,117 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Thursday, May 16, 2019
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class TaskFeedbackFuncWin : Window
    {
        [SerializeField] TaskFeedbackFunc[] m_Funcs;
        TaskFeedbackModel model { get { return ModelCenter.Instance.GetModel<TaskFeedbackModel>(); } }
        #region Built-in
        protected override void BindController()
        {
        }
        protected override void AddListeners()
        {
            for (int i = 0; i < m_Funcs.Length; i++)
            {
                var index = i;
                m_Funcs[i].button.AddListener(() =>
                {
                    OnFunc(index);
                });
            }
        }
        protected override void OnPreOpen()
        {
            Display();
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
        }
        protected override void OnAfterClose()
        {
        }
        #endregion
        void Display()
        {
            for (int i = 0; i < m_Funcs.Length; i++)
            {
                m_Funcs[i].button.gameObject.SetActive(i < model.taskFeedbackFuncs.Count);
                if (i < model.taskFeedbackFuncs.Count)
                {
                    var config = TaskFeedbackFuncConfig.Get(model.taskFeedbackFuncs[i]);
                    if (config != null)
                    {
                        m_Funcs[i].label.text = config.name;
                    }
                }
            }
        }
        private void OnFunc(int index)
        {
            CloseImmediately();
            if (index < model.taskFeedbackFuncs.Count)
            {
                var config = TaskFeedbackFuncConfig.Get(model.taskFeedbackFuncs[index]);
                if (config != null)
                {
                    if (config.jump != 0)
                    {
                        WindowJumpMgr.Instance.WindowJumpTo((JumpUIType)config.jump);
                    }
                    else if (config.guide != 0)
                    {
                        var guideConfig = GuideConfig.Get(config.guide);
                        if (guideConfig == null)
                        {
                            DebugEx.LogFormat("引导<color=#ff0000>{0}</color>未添加", config.guide);
                            return;
                        }
                        switch ((GuideType)guideConfig.Type)
                        {
                            case GuideType.Functional:
                                FunctionalGuideCenter.Instance.StartGuide(config.guide);
                                break;
                            default:
                                NewBieCenter.Instance.StartNewBieGuide(config.guide);
                                break;
                        }
                    }
                }
            }
        }
        [Serializable]
        public struct TaskFeedbackFunc
        {
            public Button button;
            public Text label;
        }
    }
}
System/MainInterfacePanel/TaskFeedbackFuncWin.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 4c045d6076e0f1f4abf90ccee2848dc9
timeCreated: 1557989419
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/MainInterfacePanel/TaskFeedbackModel.cs
@@ -7,6 +7,8 @@
    {
        Dictionary<int, TaskFeedback> m_TaskFeedbacks = new Dictionary<int, TaskFeedback>();
        public readonly List<int> taskFeedbackFuncs = new List<int>();
        ReikiRootModel reikiRootModel { get { return ModelCenter.Instance.GetModel<ReikiRootModel>(); } }
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        TaskModel taskModel { get { return ModelCenter.Instance.GetModel<TaskModel>(); } }
@@ -77,6 +79,25 @@
                            }
                        }
                        break;
                    case TaskFeedbackType.ReikiPoint:
                        {
                            if (!string.IsNullOrEmpty(config.reikiRoot))
                            {
                                var json = LitJson.JsonMapper.ToObject(config.reikiRoot);
                                feedback.reikiRoots = new Dictionary<int, List<int[]>>();
                                foreach (var jobKey in json.Keys)
                                {
                                    var job = int.Parse(jobKey);
                                    var intArray = LitJson.JsonMapper.ToObject<int[][]>(json[jobKey].ToJson());
                                    feedback.reikiRoots.Add(job, new List<int[]>());
                                    for (int i = 0; i < intArray.Length; i++)
                                    {
                                        feedback.reikiRoots[job].Add(intArray[i]);
                                    }
                                }
                            }
                        }
                        break;
                }
                m_TaskFeedbacks.Add(config.taskId, feedback);
@@ -102,6 +123,7 @@
                    case TaskFeedbackType.Guide:
                    case TaskFeedbackType.Equip:
                    case TaskFeedbackType.ItemCount:
                    case TaskFeedbackType.SkyTowerFightPoint:
                        {
                            int condition = 0;
                            if (IsSatisfyCondition(feedback, out condition))
@@ -117,6 +139,12 @@
                                if (!string.IsNullOrEmpty(config.remind))
                                {
                                    SysNotifyMgr.Instance.ShowTip(config.remind);
                                }
                                if (config.failFuncs != null && config.failFuncs.Length > 0)
                                {
                                    taskFeedbackFuncs.Clear();
                                    taskFeedbackFuncs.AddRange(config.failFuncs);
                                    WindowCenter.Instance.Open<TaskFeedbackFuncWin>();
                                }
                                if (config.failGuide != null
                                    && config.failGuide.Length > 0)
@@ -143,6 +171,12 @@
                                {
                                    SysNotifyMgr.Instance.ShowTip(config.remind);
                                }
                                if (config.failFuncs != null && config.failFuncs.Length > 0)
                                {
                                    taskFeedbackFuncs.Clear();
                                    taskFeedbackFuncs.AddRange(config.failFuncs);
                                    WindowCenter.Instance.Open<TaskFeedbackFuncWin>();
                                }
                                var index = feedback.IndexOfSideTasks(condition);
                                if (config.failGuide != null
                                    && index >= 0 && index < config.failGuide.Length)
@@ -168,6 +202,12 @@
                                if (!string.IsNullOrEmpty(config.remind))
                                {
                                    SysNotifyMgr.Instance.ShowTip(config.remind);
                                }
                                if (config.failFuncs != null && config.failFuncs.Length > 0)
                                {
                                    taskFeedbackFuncs.Clear();
                                    taskFeedbackFuncs.AddRange(config.failFuncs);
                                    WindowCenter.Instance.Open<TaskFeedbackFuncWin>();
                                }
                                if (!IsSatisfySideTask(feedback.sideTasks, out condition))
                                {
@@ -219,6 +259,20 @@
                case TaskFeedbackType.SideTask:
                    return IsSatisfySideTask(feedback.sideTasks, out condition);
                case TaskFeedbackType.ReikiPoint:
                    {
                        if (feedback.reikiRoots != null)
                        {
                            var job = PlayerDatas.Instance.baseData.Job;
                            var reikiRoots = feedback.reikiRoots[job];
                            foreach (var reikiRoot in reikiRoots)
                            {
                                if (reikiRootModel.GetReikiRootPoint(reikiRoot[0]) < reikiRoot[1])
                                {
                                    return false;
                                }
                            }
                        }
                    }
                    return reikiRootModel.GetReikiRootTotalPoint() >= config.condition;
                case TaskFeedbackType.Equip:
                    {
@@ -251,6 +305,15 @@
                        }
                        return true;
                    }
                case TaskFeedbackType.SkyTowerFightPoint:
                    {
                        var skyTowerConfig = SkyTowerConfig.Get(config.condition);
                        if (skyTowerConfig != null)
                        {
                            return PlayerDatas.Instance.baseData.FightPoint >= skyTowerConfig.fightPower;
                        }
                    }
                    break;
            }
            return false;
        }
@@ -281,6 +344,7 @@
        public List<int[]> sideTasks;
        public int[] equipCondition;
        public List<Item> items;
        public Dictionary<int, List<int[]>> reikiRoots;
        public int IndexOfSideTasks(int taskId)
        {
@@ -309,6 +373,7 @@
        Guide = 6,
        FightPowerSideTask = 7,
        ItemCount = 8,
        SkyTowerFightPoint = 9,
    }
}
System/Message/RichNormalEvent.cs
@@ -178,7 +178,26 @@
                        colorType = RichTextMgr.Inst.presentRichText.colorType == RichText.ColorType.Dark ? 0 : 1;
                    }
                    var fightPoint = PlayerDatas.Instance.baseData.FightPoint;
                    var targetValue = int.Parse(dic["myfightpoint"]);
                    var targetValue = 0;
                    var infoArray = dic["myfightpoint"].Split('_');
                    if (infoArray.Length > 1)
                    {
                        switch (infoArray[0])
                        {
                            case "skytower":
                                var config = SkyTowerConfig.Get(infoArray[1]);
                                if (config != null)
                                {
                                    targetValue = config.fightPower;
                                }
                                break;
                        }
                    }
                    else
                    {
                        int.TryParse(dic["myfightpoint"], out targetValue);
                    }
                    if (fightPoint < targetValue)
                    {
                        var label = dic.ContainsKey("replacelabel1") ? dic["replacelabel1"] : string.Empty;
System/Mount/MountModel.cs
@@ -53,6 +53,8 @@
    public bool IsOk = false;
    public List<int> ListEffectSkill = new List<int>();
    private int HorseDanExp = 0;//坐骑丹经验
    private int autoActiveHorseId = 0;
    private bool hasSendAutoActive = false;
    PackModel _playerPack;
    PackModel playerPack {
        get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PackModel>()); }
@@ -72,7 +74,8 @@
    {
        ToAddSorting();
        playerPack.refreshItemCountEvent += OnItemRefreshEvent;
        MountWin.RedPointMountDan += RedPointMountDan;
        MountWin.RedPointMountDan += RedPointMountDan;
        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
        MountSkillAndItem();
        MountNumberPreservation();
        string str = FuncConfigConfig.Get("MountSkillEffect").Numerical1;
@@ -98,6 +101,9 @@
                integrationSkills.Add(effectValue, intArray[i]);
            }
        }
        funcConfig = FuncConfigConfig.Get("AutoActivePetHorse");
        autoActiveHorseId = int.Parse(funcConfig.Numerical2);
        var _horseSkills = GetMountSkillAndItem.Keys;
        foreach (var skillId in _horseSkills)
@@ -125,6 +131,7 @@
    {
        MountWin.RedPointMountDan -= RedPointMountDan;
        playerPack.refreshItemCountEvent -= OnItemRefreshEvent;
        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
    }
@@ -132,6 +139,7 @@
    public void OnBeforePlayerDataInitialize()
    {
        IsOk = false;
        hasSendAutoActive = false;
        _HorseIDNow = string.Empty;
        HorseIDNow = 0;
        _DicHorse.Clear();
@@ -286,8 +294,43 @@
            }
            MountChangeRedPoint();
            MountDanRed();
            var config = HorseConfig.Get(autoActiveHorseId);
            if (config != null && id == config.UnlockItemID)
            {
                TryAutoActiveHorse();
            }
        }
    }
    private void OnFuncStateChangeEvent(int funcId)
    {
        if (funcId == (int)FuncOpenEnum.Mounts)
        {
            TryAutoActiveHorse();
        }
    }
    private void TryAutoActiveHorse()
    {
        if (IsOk && FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mounts)
            && !_DicHorse.ContainsKey(autoActiveHorseId) && !hasSendAutoActive)
        {
            var horseConfig = HorseConfig.Get(autoActiveHorseId);
            if (horseConfig != null)
            {
                var itemCount = playerPack.GetItemCountByID(PackType.Item, horseConfig.UnlockItemID);
                if (itemCount >= horseConfig.UnlockItemCnt)
                {
                    hasSendAutoActive = true;
                    var pak = new CA501_tagPlayerActivateHorse();
                    pak.HorseID = (uint)autoActiveHorseId;
                    GameNetSystem.Instance.SendInfo(pak);
                }
            }
        }
    }
    private void MountStoneRed()//坐骑魂石红点
    {
System/Pet/PetModel.cs
@@ -47,7 +47,7 @@
        public int PetStoneItemId = 0;//用来记录坐骑魂石的ID
        public bool IsOk = false;
        public bool isServerPrepare { get; private set; }
        private int PetDanExp = 0;//灵宠丹经验
        public List<int> ListEffectSkill = new List<int>();
        PackModel _playerPack;
@@ -59,6 +59,8 @@
        public Dictionary<int, string> petLvNameDict { get; private set; }
        public int curPetId { get; set; }
        public int petUpgradeToolId { get; set; }
        public int autoActivePetId { get; private set; }
        public bool hasSendAutoActive { get; private set; }
        public event Action PlayerLoginOkData;
        private Dictionary<int, int> DicDefaultPet = new Dictionary<int, int>();
@@ -113,6 +115,9 @@
                }
            }
            funcConfig = FuncConfigConfig.Get("AutoActivePetHorse");
            autoActivePetId = int.Parse(funcConfig.Numerical1);
            var configs = PetInfoConfig.GetValues();
            foreach (var config in configs)
            {
@@ -148,7 +153,8 @@
        public void OnBeforePlayerDataInitialize()
        {
            Wait = true;
            IsOk = false;
            isServerPrepare = false;
            hasSendAutoActive = false;
            _TagPetItem.Clear();
            _DicPetBack.Clear();
            PetNow = 0;
@@ -167,7 +173,7 @@
            {
                OnItemRefreshEvent(singPack.type, index, singPack.GetAllItems()[index].itemId);
            }
            IsOk = true;
            isServerPrepare = true;
            if (PlayerLoginOkData != null)
            {
                PlayerLoginOkData();
@@ -233,15 +239,41 @@
                PetActivateRedPoint();
                GetCultivateRedPoint();
                var config = PetInfoConfig.Get(autoActivePetId);
                if (config != null && id == config.UnLockNeedItemID)
                {
                    TryAutoActivePet();
                }
            }
        }
        private void OnFuncStateChange(int obj)
        private void OnFuncStateChange(int funcId)
        {
            if (obj == 6)
            if (funcId == (int)FuncOpenEnum.Pet)
            {
                PetStoneRed();
                PetActivateRedPoint();
                GetCultivateRedPoint();
                TryAutoActivePet();
            }
        }
        private void TryAutoActivePet()
        {
            if (isServerPrepare && FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Pet)
                && !_DicPetBack.ContainsKey(autoActivePetId) && !hasSendAutoActive)
            {
                var petConfig = PetInfoConfig.Get(autoActivePetId);
                if (petConfig != null)
                {
                    var itemCount = playerPack.GetItemCountByID(PackType.Item, petConfig.UnLockNeedItemID);
                    if (itemCount >= petConfig.UnLockNeedItemCnt)
                    {
                        hasSendAutoActive = true;
                        SendBreakPetLockQuest(autoActivePetId);
                    }
                }
            }
        }
@@ -645,7 +677,7 @@
                        }
                        _petBack.ItemPlace = petIndex;//宠物位置索引
                        _DicPetBack.Add(petId, _petBack);
                        if (Event_H0704Add != null && IsOk)
                        if (Event_H0704Add != null && isServerPrepare)
                        {
                            Event_H0704Add();
                        }
@@ -667,14 +699,14 @@
                        }
                        _DicPetBack[petId].ItemPlace = petIndex;
                        if (Event_H0704Update != null && IsOk)
                        if (Event_H0704Update != null && isServerPrepare)
                        {
                            Event_H0704Update(petId);
                        }
                        if (_DicPetBack[petId].PetStatus == 1)
                        {
                            PetNow = petId;
                            if (Event_SpiritPetPlay != null && IsOk)
                            if (Event_SpiritPetPlay != null && isServerPrepare)
                            {
                                Event_SpiritPetPlay(petState);
System/Role/ReikiRootModel.cs
@@ -77,6 +77,8 @@
        public int selectReikiRoot { get; set; }
        public bool openFromTreasureSkill { get; set; }
        public readonly Redpoint redpoint = new Redpoint(101, 10103);
        public event Action onCacheFreePointRefresh;
System/Role/ReikiRootWin.cs
@@ -22,6 +22,7 @@
        [SerializeField] Text m_FreePoint;
        [SerializeField] Button m_Reset;
        [SerializeField] Text m_ResetLabel;
        [SerializeField] Button m_GetPath;
        [SerializeField] Button m_Confirm;
        [SerializeField] Button m_Rule;
@@ -65,6 +66,7 @@
            m_Reset.AddListener(OnReset);
            m_Confirm.AddListener(Confirm);
            m_Rule.AddListener(OnRule);
            m_GetPath.AddListener(GetPath);
            m_NumKeyboard.onValueChange.AddListener(OnPointValChange);
            m_NumKeyboard.onConfirm.AddListener((bool isOk) =>
@@ -130,6 +132,7 @@
            }
            treasureSkillModel.newSatisfyActiveExpertDirty = false;
            model.openFromTreasureSkill = false;
            StopAllCoroutines();
        }
@@ -150,7 +153,7 @@
                }
            }
            if (treasureSkillModel.newSatisfyActiveExpertDirty)
            if (treasureSkillModel.newSatisfyActiveExpertDirty && !model.openFromTreasureSkill)
            {
                if (!WindowCenter.Instance.IsOpen<ReikiRootQualityPromoteWin>())
                {
@@ -334,6 +337,13 @@
            WindowCenter.Instance.Open<ReikiRootRuleWin>();
        }
        private void GetPath()
        {
            RealmRecommandEquipGetWayWin.equipGetWays.Clear();
            RealmRecommandEquipGetWayWin.equipGetWays.AddRange(model.reikiRootGetWays);
            WindowCenter.Instance.Open<RealmRecommandEquipGetWayWin>();
        }
        private void OnFlyComplete()
        {
            StartCoroutine(Co_DisplayReikis());
System/Skill/ExpertSkillActiveRemindWin.cs
@@ -14,9 +14,11 @@
    public class ExpertSkillActiveRemindWin : Window
    {
        [SerializeField] Text m_Reiki;
        [SerializeField] Text m_Remind;
        [SerializeField] Button m_GotoReiki;
        [SerializeField] Button m_GetPath;
        [SerializeField] Button m_Confirm;
        [SerializeField] Button m_Cancel;
        [SerializeField] Button m_Close;
        public static int skillId = 0;
@@ -32,7 +34,8 @@
        protected override void AddListeners()
        {
            m_GotoReiki.AddListener(GotoReiki);
            m_GetPath.AddListener(GetPath);
            m_Confirm.AddListener(Confirm);
            m_Cancel.AddListener(CloseClick);
            m_Close.AddListener(CloseClick);
        }
@@ -65,27 +68,50 @@
                var requireProperty = skillConfig.RequireProperty();
                var requireValue = skillConfig.RequirePropertyValue();
                var propertyConfig = PlayerPropertyConfig.Get(requireProperty);
                m_Remind.text = Language.Get("ExpertSkillActiveRemind", propertyConfig.Name, requireValue);
                if (reikiRootModel.freePoint + reikiRootModel.GetReikiRootPoint(requireProperty) >= requireValue)
                var point = requireValue - reikiRootModel.GetReikiRootPoint(requireProperty);
                if (reikiRootModel.freePoint >= point)
                {
                    m_GotoReiki.gameObject.SetActive(true);
                    m_GetPath.gameObject.SetActive(false);
                    m_Reiki.text = StringUtility.Contact(propertyConfig.Name, ":", requireValue);
                    m_Reiki.color = UIHelper.GetUIColor(TextColType.Green, true);
                    m_GotoReiki.gameObject.SetActive(false);
                    m_Confirm.gameObject.SetActive(true);
                    m_Cancel.gameObject.SetActive(true);
                    m_Remind.gameObject.SetActive(true);
                }
                else
                {
                    m_GotoReiki.gameObject.SetActive(false);
                    m_GetPath.gameObject.SetActive(true);
                    m_Reiki.text = StringUtility.Contact(propertyConfig.Name, ":", requireValue
                        , Language.Get("ExpertSkillActiveRemind", point));
                    m_Reiki.color = UIHelper.GetUIColor(TextColType.Red, true);
                    m_GotoReiki.gameObject.SetActive(true);
                    m_Confirm.gameObject.SetActive(false);
                    m_Cancel.gameObject.SetActive(false);
                    m_Remind.gameObject.SetActive(false);
                }
            }
        }
        private void GetPath()
        private void Confirm()
        {
            TreasurePotential expert;
            if (model.TryGetPotential(skillId, out expert))
            {
                var level = 0;
                model.TryGetExpertActiveLevel(skillId, out level);
                var skillConfig = SkillConfig.Get(skillId + level);
                var requireProperty = skillConfig.RequireProperty();
                var requireValue = skillConfig.RequirePropertyValue();
                var propertyConfig = PlayerPropertyConfig.Get(requireProperty);
                var point = requireValue - reikiRootModel.GetReikiRootPoint(requireProperty);
                if (reikiRootModel.freePoint >= point)
                {
                    reikiRootModel.SendAddPoint(new byte[1] { (byte)requireProperty }, new ushort[1] { (ushort)point });
                }
            }
            CloseImmediately();
            RealmRecommandEquipGetWayWin.equipGetWays.Clear();
            RealmRecommandEquipGetWayWin.equipGetWays.AddRange(reikiRootModel.reikiRootGetWays);
            WindowCenter.Instance.Open<RealmRecommandEquipGetWayWin>();
        }
        private void GotoReiki()
@@ -94,6 +120,7 @@
            WindowCenter.Instance.CloseImmediately("ExpertSkillSelectWin");
            var skillConfig = SkillConfig.Get(skillId);
            reikiRootModel.selectReikiRoot = skillConfig.RequireProperty();
            reikiRootModel.openFromTreasureSkill = true;
            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.RolePoint);
        }
    }
System/Skill/ExpertSkillSelectWin.cs
@@ -238,7 +238,7 @@
                m_Select.gameObject.SetActive(activeLevel > 0 && !satisfyActive && !used);
                m_Active.gameObject.SetActive(satisfyActive || error == 3);
                m_Active.SetColorful(m_ActiveLabel, satisfyActive);
                //m_Active.SetColorful(m_ActiveLabel, satisfyActive);
                if (satisfyActive || error == 3)
                {
System/WindowJump/WindowJumpMgr.cs
@@ -713,6 +713,7 @@
                SetJumpLogic<LootPreciousFrameWin>(_tagWinSearchModel.TABID);
                break;
            case JumpUIType.FairyAuction:
            case JumpUIType.FullServerAuction:
                SetJumpLogic<AuctionHouseWin>(_tagWinSearchModel.TABID);
                break;
            case JumpUIType.HazyRegion:
@@ -1677,6 +1678,7 @@
    Alchemy5 = 316,
    RealmEquip1 = 317,
    Alchemy6 = 318,
    FullServerAuction = 319,
    DhszTs = 1001,//定海神针功法提升界面
    HyqTs = 1002,//皓月枪功法提升界面
Utility/ConfigInitiator.cs
@@ -292,7 +292,8 @@
        normalTasks.Add(new ConfigInitTask("AlchemyCountConfig", () => { AlchemyCountConfig.Init(); }, () => { return AlchemyCountConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("CollectNpcConfig", () => { CollectNpcConfig.Init(); }, () => { return CollectNpcConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("TreasureChapterConfig", () => { TreasureChapterConfig.Init(); }, () => { return TreasureChapterConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("TaskFeedbackConfig", () => { TaskFeedbackConfig.Init(); }, () => { return TaskFeedbackConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("TaskFeedbackConfig", () => { TaskFeedbackConfig.Init(); }, () => { return TaskFeedbackConfig.inited; }));
        normalTasks.Add(new ConfigInitTask("TaskFeedbackFuncConfig", () => { TaskFeedbackFuncConfig.Init(); }, () => { return TaskFeedbackFuncConfig.inited; }));
    }
    static List<ConfigInitTask> doingTasks = new List<ConfigInitTask>();