少年修仙传客户端代码仓库
client_Wu Xijin
2019-01-08 64424067bd1fb1539503ee9a8e98673032f46e89
Merge branch 'master' into CrossServerBoss
35个文件已修改
2个文件已添加
1394 ■■■■ 已修改文件
Core/GameEngine/Login/LoginStage.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/GodWeaponEffectConfig.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/GodWeaponEffectConfig.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0109_tagServerPrepareOK.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA126_tagMCPrepareChangeMap.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA127_tagMCStartChangeMap.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/SDK/SDKUtility.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/State/SMB/SMB_Base.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/StageManager.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/ClientVersion/VersionConfig.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Compose/New/ComposeEquipWin.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/Logic/SelectBoxItemCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Login/CrossServerLogin.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Login/LoginModel.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Login/LoginWin.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/FlashSaleItemCell.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/OperationFlashRushToBuy.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/PlayerDead/PlayerDeadModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/PlayerDead/ReliveWin.cs 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Realm/ActivateShow.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Realm/RealmPropertyUpWin.cs 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/GodWeaponPreviewCell.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/GodWeaponPreviewCell.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/GodWeaponPreviewWin.cs 116 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/GodWeaponSkillBehaviour.cs 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/MagicianModel.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/MagicianWin.cs 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/PropertyBehaviour.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/SkillBehaviour.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Tip/SkillDetails.cs 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Tip/SkillDetailsWin.cs 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/FunctionUnlockFlyObject.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI/Common/UI3DModelExhibition.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI/Common/UIRoot.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/EnumHelper.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/StageLoadTimeOutCatcher.cs 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Login/LoginStage.cs
@@ -46,7 +46,12 @@
                {
                    if (!loginModel.sdkLogined)
                    {
                        SDKUtility.Instance.FreePlatformLogin();
                        if (SDKUtility.Instance.ChannelPlatform != SDKUtility.E_ChannelPlatform.Yj
                         || !SDKUtility.Yj_AppID.Equals("yybgame"))
                        {
                            SDKUtility.Instance.FreePlatformLogin();
                        }
                        OperationLogCollect.Instance.RecordLauchEvent(4);
                        OperationLogCollect.Instance.RecordEvent(4);
                    }
Core/GameEngine/Model/Config/GodWeaponEffectConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Tuesday, December 11, 2018
//    [  Date ]:           Monday, January 07, 2019
//--------------------------------------------------------
using UnityEngine;
@@ -16,7 +16,12 @@
        public int level { get ; private set ; }
        public string effect { get ; private set; } 
        public int fightPower { get ; private set ; }
        public string attr { get ; private set; }
        public string attr { get ; private set; }
        public string icon { get ; private set; }
        public string skillName { get ; private set; }
        public Vector3[] effectPosition;
        public Vector3[] effectAngles;
        public Vector3[] effectScale;
        public override string getKey()
        {
@@ -36,7 +41,32 @@
            
                fightPower=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0; 
            
                attr = rawContents[5].Trim();
                attr = rawContents[5].Trim();
                icon = rawContents[6].Trim();
                skillName = rawContents[7].Trim();
                string[] effectPositionStringArray = rawContents[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                effectPosition = new Vector3[effectPositionStringArray.Length];
                for (int i=0;i<effectPositionStringArray.Length;i++)
                {
                    effectPosition[i]=effectPositionStringArray[i].Vector3Parse();
                }
                string[] effectAnglesStringArray = rawContents[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                effectAngles = new Vector3[effectAnglesStringArray.Length];
                for (int i=0;i<effectAnglesStringArray.Length;i++)
                {
                    effectAngles[i]=effectAnglesStringArray[i].Vector3Parse();
                }
                string[] effectScaleStringArray = rawContents[10].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                effectScale = new Vector3[effectScaleStringArray.Length];
                for (int i=0;i<effectScaleStringArray.Length;i++)
                {
                    effectScale[i]=effectScaleStringArray[i].Vector3Parse();
                }
            }
            catch (Exception ex)
            {
Core/GameEngine/Model/Config/GodWeaponEffectConfig.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: c7a22e75f9a0eed49aed26e8171f8172
timeCreated: 1544496205
timeCreated: 1546866443
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
@@ -20,8 +20,7 @@
        base.Done(vNetPack);
        H0102_tagCDBPlayer vNetData = vNetPack as H0102_tagCDBPlayer;
        StageLoadTimeOutCatcher.got0102Time = DateTime.Now;
        StageLoadTimeOutCatcher.ReportChangeMapRecord(vNetPack.socketType, "0102", DateTime.Now);
        DEBUG_0102 = true;
        DTC0403_tagPlayerLoginLoadOK.finishedLogin = false;
@@ -242,6 +241,8 @@
        StatusMgr.Instance.ReleaseActor(PlayerDatas.Instance.PlayerId);
        GAMgr.Instance.UnInit();
        DEBUG_STEP = 9;
        StageLoadTimeOutCatcher.RecordProtocol(vNetPack.socketType, "0102", DateTime.Now);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0109_tagServerPrepareOK.cs
@@ -24,8 +24,7 @@
            return;
        }
        StageLoadTimeOutCatcher.got0109Time = DateTime.Now;
        StageLoadTimeOutCatcher.ReportChangeMapRecord(vNetData.socketType, "0109", DateTime.Now);
        StageLoadTimeOutCatcher.RecordProtocol(vNetData.socketType, "0109", DateTime.Now);
        //修改技能快捷设置发包顺序
        PlayerDatas.Instance.skill.CheckQuickSet();
@@ -43,8 +42,7 @@
                    GameNetSystem.Instance.SendInfo(mapOk);
                    DTCA127_tagMCStartChangeMap.isChangeLine = false;
                    StageLoadTimeOutCatcher.send0107Time = DateTime.Now;
                    StageLoadTimeOutCatcher.ReportChangeMapRecord(GameNetSystem.SocketType.Main, "0107", DateTime.Now);
                    StageLoadTimeOutCatcher.RecordProtocol(GameNetSystem.SocketType.Main, "0107", DateTime.Now);
                }
                break;
            case GameNetSystem.SocketType.CrossSever:
@@ -55,8 +53,7 @@
                    mapOk.Type = 0;
                    GameNetSystem.Instance.SendToCrossServer(mapOk);
                    StageLoadTimeOutCatcher.send0107Time = DateTime.Now;
                    StageLoadTimeOutCatcher.ReportChangeMapRecord(GameNetSystem.SocketType.CrossSever, "0107", DateTime.Now);
                    StageLoadTimeOutCatcher.RecordProtocol(GameNetSystem.SocketType.CrossSever, "0107", DateTime.Now);
                }
                break;
            default:
Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA126_tagMCPrepareChangeMap.cs
@@ -21,8 +21,7 @@
            return;
        }
        StageLoadTimeOutCatcher.gotA126Time = DateTime.Now;
        StageLoadTimeOutCatcher.ReportChangeMapRecord(package.socketType, "A126", DateTime.Now);
        StageLoadTimeOutCatcher.RecordProtocol(package.socketType, "A126", DateTime.Now);
#if UNITY_EDITOR
        string _content = string.Format("DTCA126_tagMCPrepareChangeMap => 准备切换地图");
Core/NetworkPackage/DTCFile/ServerPack/HA1_Sys/DTCA127_tagMCStartChangeMap.cs
@@ -49,8 +49,7 @@
        DEBUG_A127 = true;
        var package = vNetPack as HA127_tagMCStartChangeMap;
        StageLoadTimeOutCatcher.gotA127Time = DateTime.Now;
        StageLoadTimeOutCatcher.ReportChangeMapRecord(package.socketType, "A127", DateTime.Now);
        StageLoadTimeOutCatcher.RecordProtocol(package.socketType, "A127", DateTime.Now);
        DEBUG_STEP = 0;
Core/SDK/SDKUtility.cs
@@ -25,6 +25,7 @@
        Sp = 3,// 思璞
        Js = 4,// 极速
        Yj = 5,// 易接
        Yl = 6,// 易乐
    }
    public E_ChannelPlatform ChannelPlatform { get; set; }
@@ -35,6 +36,11 @@
    }
    public static string Yj_SpID
    {
        get; private set;
    }
    public static string Yj_BanHao
    {
        get; private set;
    }
@@ -339,6 +345,10 @@
                {
                    _result = "freeplatform";
                }
                else if (ChannelPlatform == E_ChannelPlatform.Yl)
                {
                    _result = "yileplatform";
                }
                break;
            case RuntimePlatform.IPhonePlayer:
                _result = "ios";//ios平台固定返回ios
@@ -430,19 +440,30 @@
                        else if (_channelPlatform.Equals("yj"))
                        {
                            ChannelPlatform = E_ChannelPlatform.Yj;
                        }
                        else if (_channelPlatform.Equals("yl"))
                        {
                            ChannelPlatform = E_ChannelPlatform.Yl;
                        }
                    }
                }
                if (_dict.Contains("yj_appid"))
                if (ChannelPlatform == E_ChannelPlatform.Yj)
                {
                    Yj_AppID = _json["yj_appid"].ToString();
                    if (_dict.Contains("yj_appid"))
                    {
                        Yj_AppID = _json["yj_appid"].ToString();
                    }
                    if (_dict.Contains("yj_spid"))
                    {
                        Yj_SpID = _json["yj_spid"].ToString();
                    }
                }
                if (_dict.Contains("yj_spid"))
                if (_dict.Contains("banhao"))
                {
                    Yj_SpID = _json["yj_spid"].ToString();
                    Yj_BanHao = _json["banhao"].ToString();
                }
                break;
@@ -512,6 +533,9 @@
                    onFreePlatformPayCancel();
                }
                break;
            case CodeA2U.ExitGame:
                Snxxz.UI.WindowCenter.Instance.Open<Snxxz.UI.ExitGameWin>();
                break;
        }
    }
@@ -565,6 +589,10 @@
         * 回调外部存储根目录地址
         */
        public const int ExternalStorage = 5;
        /**
         * 触发了退出游戏逻辑, 打开二次确认界面
         */
        public const int ExitGame = 6;
        #endregion
    }
@@ -631,6 +659,7 @@
        public const int CreateRole = 106;
        public const int RoleLogin = 107;
        public const int RoleLevelUp = 108;
        public const int TencentLogin = 109;
        /**
         * 极光推送
         * */
@@ -735,6 +764,19 @@
#endif
    }
    public void TencentLogin(string param)
    {
#if !UNITY_EDITOR
        m_Json.Clear();
        m_Json["code"] = CodeU2A.TencentLogin;
        if (!string.IsNullOrEmpty(param))
        {
            m_Json["param"] = param;
        }
        SendMessageToSDK(m_Json);
#endif
    }
    /// <summary>
    /// 自由SDK登出
    /// </summary>
@@ -803,6 +845,10 @@
        {
            m_PaymentTable["RechargeChannel"] = "5";
        }
        else if (ChannelPlatform == E_ChannelPlatform.Yl)
        {
            m_PaymentTable["RechargeChannel"] = "6";
        }
        var _stringBuilder = new System.Text.StringBuilder();
        var _md5Body = _stringBuilder.Append(m_PaymentTable["AppID"]).
Fight/Actor/State/SMB/SMB_Base.cs
@@ -156,7 +156,15 @@
                        _beatBack.NPCPosList[0].ObjID = (uint)target.ServerInstID;
                        _beatBack.NPCPosList[0].PosX = (ushort)(_checkPos.x * 2f + GA_Hero.MapOffset.x);
                        _beatBack.NPCPosList[0].PosY = (ushort)(_checkPos.z * 2f + GA_Hero.MapOffset.z);
                        GameNetSystem.Instance.SendInfo(_beatBack);
                        if (!GameNetSystem.Instance.crossServerSocketConnected)
                        {
                            GameNetSystem.Instance.SendInfo(_beatBack);
                        }
                        else
                        {
                            GameNetSystem.Instance.SendToCrossServer(_beatBack);
                        }
                    }
                }
                //else
Fight/Stage/StageManager.cs
@@ -348,8 +348,7 @@
        {
            if (!isClientChangeMap)
            {
                StageLoadTimeOutCatcher.send0107Time = DateTime.Now;
                StageLoadTimeOutCatcher.ReportChangeMapRecord(this.socketType, "0107", DateTime.Now);
                StageLoadTimeOutCatcher.RecordProtocol(this.socketType, "0107", DateTime.Now);
                var mapOk = new C0107_tagCInitMapOK();
                mapOk.MapID = PlayerDatas.Instance.baseData.MapID;
System/ClientVersion/VersionConfig.cs
@@ -122,7 +122,17 @@
    public Vector2 logoPosition { get { return m_LogoPosition; } }
    [SerializeField] string m_BanHao;
    public string banHao { get { return m_BanHao; } }
    public string banHao
    {
        get
        {
            if (!string.IsNullOrEmpty(SDKUtility.Yj_BanHao))
            {
                return SDKUtility.Yj_BanHao;
            }
            return m_BanHao;
        }
    }
    public void Read(string _data)
    {
System/Compose/New/ComposeEquipWin.cs
@@ -628,6 +628,7 @@
            List<ItemModel> unSelectItems = unfixedSelectItemDict.Values.ToList();
            unSelectItems.Sort(CompareByOverdueTime);
            for (int i = 0; i < unfixedDisplays.Length; i++)
            {
                var unfixedDisplay = unfixedDisplays[i];
@@ -638,7 +639,7 @@
                    {
                        for(int j = 0; j < unSelectItems.Count; j++)
                        {
                            ItemModel _model = unSelectItems[i];
                            ItemModel _model = unSelectItems[j];
                            if (!unfixeAddDict.ContainsKey(_model.itemInfo.ItemPlace))
                            {
                                selectModel.AddHaveUnfixedSelectItem(_model.itemInfo.ItemPlace);
@@ -707,7 +708,14 @@
            switch((RoleEquipType)itemConfig.EquipPlace)
            {
                case RoleEquipType.retSpiritAnimal:
                    WindowCenter.Instance.Open<GuardComposeConfirmWin>();
                    if (!composeWinModel.IsEnoughUnfixedMat(compoundModel))
                    {
                        MessageWin.Inst.ShowFixedTip(Language.Get("Compose101"));
                    }
                    else
                    {
                        WindowCenter.Instance.Open<GuardComposeConfirmWin>();
                    }
                    break;
                default:
                    SetFixedItemIndexDic();
System/KnapSack/Logic/SelectBoxItemCell.cs
@@ -33,7 +33,7 @@
            ItemConfig itemConfig = Config.Instance.Get<ItemConfig>(id);
            this.ItemId = id;
            nameText.text = itemConfig.ItemName;
            ItemCellModel cellModel = new ItemCellModel(id, false, (ulong)BoxModel.selectDict[id]);
            ItemCellModel cellModel = new ItemCellModel(id, false, (ulong)BoxModel.selectDict[id],0,"",PackType.rptDeleted,true);
            itemBaisc.Init(cellModel);
            if (itemConfig.Effect1 == 220)
            {
System/Login/CrossServerLogin.cs
@@ -179,11 +179,11 @@
            try
            {
                StopLoginOverTimeProcess();
                loginOverTimeClock = Clock.Create(DateTime.Now + new TimeSpan(10* TimeSpan.TicksPerSecond), () =>
                {
                    busy = false;
                    ReAccountLogin();
                });
                loginOverTimeClock = Clock.Create(DateTime.Now + new TimeSpan(10 * TimeSpan.TicksPerSecond), () =>
                 {
                     busy = false;
                     ReAccountLogin();
                 });
                GameNetSystem.Instance.BeginConnectCrossServer(ipBuf, gamePortBuf, OnGameServerConnected);
                NetLinkWin.Show();
            }
@@ -257,7 +257,14 @@
        {
            StopLoginOverTimeProcess();
            busy = false;
            ExceptionCatcher.ReportException("登录跨服出现异常", StringUtility.Contact("角色:", PlayerDatas.Instance.baseData.PlayerName));
            ExceptionCatcher.ReportException("登录跨服出现异常",
                StringUtility.Contact(
                    "角色:", PlayerDatas.Instance.baseData.PlayerName, ";",
                    "本机网络:", Application.internetReachability, ";",
                    "Socket链接状态:", GameNetSystem.Instance.crossServerSocketConnected, ";",
                    "0102记录:", StageLoadTimeOutCatcher.got0102Time.ToString())
                );
            var sendInfo = new CC003_tagCGForceQuitCrossState();
            GameNetSystem.Instance.SendInfo(sendInfo);
            GameNetSystem.Instance.crossServerConnected_Loigc = false;
System/Login/LoginModel.cs
@@ -315,6 +315,9 @@
                                       SDKUtility.Yj_AppID + "|" +
                                       SDKUtility.Instance.FreePlatformInfo.accountID);
                        send.ExtraLen = (byte)send.Extra.Length;
                    }else if(SDKUtility.Instance.ChannelPlatform == SDKUtility.E_ChannelPlatform.Yl)
                    {
                        send.IDType = 6;
                    }
                    send.AccID = sdkLoginResult.account;
                    send.Password = sdkLoginResult.token;
System/Login/LoginWin.cs
@@ -30,6 +30,8 @@
        [SerializeField] Text m_ServerName;
        [SerializeField] protected InputField m_Account;
        [SerializeField] Button m_EnterGame;
        [SerializeField] Button m_QQLogin;
        [SerializeField] Button m_WXLogin;
        [SerializeField] Button m_ServerSelect;
        [SerializeField] Button m_SwitchAccount;
        [SerializeField] Button m_Notice;
@@ -47,6 +49,8 @@
        protected override void AddListeners()
        {
            m_EnterGame.SetListener(EnterGame);
            m_QQLogin.SetListener(QQLogin);
            m_WXLogin.SetListener(WXLogin);
            m_ServerSelect.SetListener(OpenServerListWin);
            m_SwitchAccount.SetListener(SwitchAccount);
            m_Notice.SetListener(VeiwNotice);
@@ -103,6 +107,35 @@
            }
            ChangeUserInfo(model.localSaveAccountName);
            if (SDKUtility.Instance.ChannelPlatform == SDKUtility.E_ChannelPlatform.Yj
             && SDKUtility.Yj_AppID.Equals("yybgame")
             && !model.sdkLogined)
            {
                m_EnterGame.gameObject.SetActive(false);
                m_QQLogin.gameObject.SetActive(true);
                m_WXLogin.gameObject.SetActive(true);
                SDKUtility.Instance.onFreePlatformLoginOk += OnLoginOk;
            }
            else
            {
                m_EnterGame.gameObject.SetActive(true);
                m_QQLogin.gameObject.SetActive(false);
                m_WXLogin.gameObject.SetActive(false);
            }
        }
        private void OnLoginOk(SDKUtility.FP_LoginOk arg0)
        {
            if (SDKUtility.Instance.ChannelPlatform == SDKUtility.E_ChannelPlatform.Yj
             && SDKUtility.Yj_AppID.Equals("yybgame"))
            {
                m_EnterGame.gameObject.SetActive(true);
                m_QQLogin.gameObject.SetActive(false);
                m_WXLogin.gameObject.SetActive(false);
            }
        }
        protected override void OnAfterOpen()
@@ -120,6 +153,7 @@
        {
            ServerListCenter.Instance.serverSelectEvent -= OnServerChange;
            ServerListCenter.Instance.onServerListRefreshEvent -= OnServerListRefresh;
            SDKUtility.Instance.onFreePlatformLoginOk -= OnLoginOk;
        }
        protected override void OnActived()
@@ -202,6 +236,36 @@
            Login();
        }
        protected void QQLogin()
        {
            if (SDKUtility.Instance.ChannelPlatform != SDKUtility.E_ChannelPlatform.Yj)
            {
                return;
            }
            if (!SDKUtility.Yj_AppID.Equals("yybgame"))
            {
                return;
            }
            SDKUtility.Instance.TencentLogin("Login");
        }
        protected void WXLogin()
        {
            if (SDKUtility.Instance.ChannelPlatform != SDKUtility.E_ChannelPlatform.Yj)
            {
                return;
            }
            if (!SDKUtility.Yj_AppID.Equals("yybgame"))
            {
                return;
            }
            SDKUtility.Instance.TencentLogin("Loginwx");
        }
        protected void Login()
        {
            var allow = false;
System/OpenServerActivity/FlashSaleItemCell.cs
@@ -18,7 +18,7 @@
        [SerializeField] Text btnStateText;
        [SerializeField] Text cdText;
        [SerializeField] Text fullServerRemainNum;
        [SerializeField] Text personalRemainNum;
        public const int RefreshFullServerBuyType = 8;
        FlashRushToBuyModel rushToBuyModel { get { return ModelCenter.Instance.GetModel<FlashRushToBuyModel>(); } }
@@ -187,9 +187,12 @@
        private void UpdateSaleItemSellState()
        {
            int fullSeverRemain = 0;
            int sellState = GetSellSate(out fullSeverRemain);
            int personalRemain = 0;
            int sellState = GetSellSate(out fullSeverRemain,out personalRemain);
            string fullSeverRemainStr = fullSeverRemain > 0 ? fullSeverRemain.ToString() : UIHelper.AppendStringColor(TextColType.Red, fullSeverRemain.ToString());
            string personalRemainStr = personalRemain > 0 ? personalRemain.ToString() : UIHelper.AppendStringColor(TextColType.Red, personalRemain.ToString());
            fullServerRemainNum.text = fullSeverRemainStr;
            personalRemainNum.text = personalRemainStr;
            switch (sellState)
            {
                case 0:
@@ -210,34 +213,37 @@
        }
        /// <summary>
        /// 0 秒杀 1 已买到 2 已抢光
        /// 0 秒杀 1个人购买次数已用光  2 全服已抢光
        /// </summary>
        /// <returns></returns>
        private int GetSellSate(out int fullRemainNum)
        private int GetSellSate(out int fullRemainNum,out int personalRemainNum)
        {
            fullRemainNum = 0;
            personalRemainNum = 0;
            var buyInfo = storeModel.GetBuyShopLimit((uint)saleItem.shopId);
            var buyCount = 0;
            if (buyState != -1)
            {
                personalRemainNum = saleItem.limitNum;
                fullRemainNum = saleItem.fullServerLimitNum - rushToBuyModel.GetFullServerBuyCntById(saleItem.shopId);
                if (buyInfo != null)
                {
                    buyCount = buyInfo.BuyCnt;
                    personalRemainNum -= buyInfo.BuyCnt;
                }
                if (buyCount >= saleItem.limitNum)
                if (personalRemainNum <= 0)
                {
                    personalRemainNum = 0;
                    return 1;
                }
                if (fullRemainNum <= 0)
                {
                    fullRemainNum = 0;
                    return 2;
                }
            }
            else
            {
                personalRemainNum = saleItem.limitNum;
                fullRemainNum = saleItem.fullServerLimitNum;
            }
            return 0;
System/OpenServerActivity/OperationFlashRushToBuy.cs
@@ -174,7 +174,7 @@
            public int shopId;
            public int shopGuid;
            public int limitNum;//个人限购数量
            public int fullServerLimitNum; //个人限购数量
            public int fullServerLimitNum; //全服限购数量
            public int moneyType;
            public int moneyNumber;
            public int moneyOriginal;
System/PlayerDead/PlayerDeadModel.cs
@@ -176,11 +176,11 @@
            return;
        }
        _tagMapModel = Config.Instance.Get<MapConfig>(PlayerDatas.Instance.baseData.MapID);
        rebornTiredNum = RebornConditions[0];
        rebornPrice = RebornConditions[2];
        if (_tagMapModel.MapFBType == 0)
        {
            IsCanReborn = true;
            rebornTiredNum = RebornConditions[0];
            rebornPrice = RebornConditions[2];
            //isBossKill = StatusManager.Instance.IsExist((int)playerId,20022);
            if (!isKillByPlayer && localBossState)
            {
System/PlayerDead/ReliveWin.cs
@@ -16,6 +16,7 @@
        [SerializeField] Text dieDesText;
        [SerializeField] Text buffText;
        [SerializeField] Button inplaceRebornBtn;
        PlayerDeadModel _deadModel;
        PlayerDeadModel DeadModel
@@ -24,6 +25,7 @@
        }
        public const int ElderBattleMapID = 31160; //上古战场地图Id
        public const int UnionleagueMapID = 31220; //仙盟联赛地图
        int questTimes = 0;
        #region Built-in
        protected override void BindController()
@@ -32,7 +34,7 @@
        protected override void AddListeners()
        {
            inplaceRebornBtn.onClick.AddListener(OnClickInplaceRebornBtn);
        }
        protected override void OnPreOpen()
@@ -45,37 +47,16 @@
            MapConfig mapConfig = Config.Instance.Get<MapConfig>(curMapId);
            dieDesText.gameObject.SetActive(false);
            buffText.gameObject.SetActive(curMapId == ElderBattleMapID);
            if (curMapId == ElderBattleMapID)
            inplaceRebornBtn.gameObject.SetActive(curMapId == UnionleagueMapID);
            switch(curMapId)
            {
                List<int> buffIds = new List<int>();
                StatusMgr.Instance.GetBuffIds(PlayerDatas.Instance.PlayerId, ref buffIds);
                var skillConfigs = SkillConfig.GetSkillActConfigs(0,0,DeadModel.deadBuffId);
                string skillName = string.Empty;
                int buffLv = 0;
                bool isMaxBuff = false;
                if(buffIds.Count > 0)
                {
                    for(int i = 0; i < buffIds.Count; i++)
                    {
                        int buffId = buffIds[i];
                        SkillConfig skillConfig = Config.Instance.Get<SkillConfig>(buffId);
                        if(skillConfig.SkillTypeID == DeadModel.deadBuffId)
                        {
                            buffLv = skillConfig.SkillLV + 1;
                            isMaxBuff = buffLv > DeadModel.maxDeadBuffLV ? true : false;
                            break;
                        }
                    }
                }
                if(skillConfigs != null && skillConfigs.Count > 0)
                {
                    SkillConfig skillConfig = skillConfigs[0];
                    skillName = skillConfig.SkillName;
                }
                buffText.text = Language.Get("AncientBattlefield_Text_2",skillName);
                buffText.gameObject.SetActive(!isMaxBuff);
                case ElderBattleMapID:
                    SetBuffDes();
                    break;
                case UnionleagueMapID:
                    break;
            }
            for (int i = 0; i < DeadModel.dungeonKillArray.Length; i++)
            {
                if(DeadModel.dungeonKillArray[i] == curMapId)
@@ -101,6 +82,38 @@
        {
        }
        #endregion
        private void SetBuffDes()
        {
            List<int> buffIds = new List<int>();
            StatusMgr.Instance.GetBuffIds(PlayerDatas.Instance.PlayerId, ref buffIds);
            var skillConfigs = SkillConfig.GetSkillActConfigs(0, 0, DeadModel.deadBuffId);
            string skillName = string.Empty;
            int buffLv = 0;
            bool isMaxBuff = false;
            if (buffIds.Count > 0)
            {
                for (int i = 0; i < buffIds.Count; i++)
                {
                    int buffId = buffIds[i];
                    SkillConfig skillConfig = Config.Instance.Get<SkillConfig>(buffId);
                    if (skillConfig.SkillTypeID == DeadModel.deadBuffId)
                    {
                        buffLv = skillConfig.SkillLV + 1;
                        isMaxBuff = buffLv > DeadModel.maxDeadBuffLV ? true : false;
                        break;
                    }
                }
            }
            if (skillConfigs != null && skillConfigs.Count > 0)
            {
                SkillConfig skillConfig = skillConfigs[0];
                skillName = skillConfig.SkillName;
            }
            buffText.text = Language.Get("AncientBattlefield_Text_2", skillName);
            buffText.gameObject.SetActive(!isMaxBuff);
        }
        public void RefreshTime(int time)
        {
@@ -129,6 +142,12 @@
                }
            }
        }
        private void OnClickInplaceRebornBtn()
        {
            DeadModel.InpacleReborn();
        }
        private void CloseWin()
        {
            Close();
System/Realm/ActivateShow.cs
@@ -14,6 +14,7 @@
        public static int currentLv { get; private set; }
        public static int beforeLv { get; private set; }
        public static int godWeaponType { get; private set; }
        public static int godWeaponStage { get; private set; }
        public static int treasureSoulId { get; private set; }
        private static Dictionary<int, int> lastPropertyDict = new Dictionary<int, int>();
@@ -153,6 +154,7 @@
            activateType = ActivateFunc.GodWeaponEffect;
            currentLv = _level;
            godWeaponType = _type;
            godWeaponStage = stage;
            beforeLv = _beforeLevel;
            skills.Clear();
            propertyCompares.Clear();
@@ -363,7 +365,7 @@
        {
            if (prepareFlySkillEvent != null)
            {
                prepareFlySkillEvent(activateType, skills[0]);
                prepareFlySkillEvent(activateType, skills.Count > 0 ? skills[0] : 0);
            }
        }
System/Realm/RealmPropertyUpWin.cs
@@ -29,6 +29,7 @@
        [SerializeField] SkillBehaviour[] m_Skills;
        [SerializeField] RectTransform m_ContainerNewGotSkill;
        [SerializeField] SkillBehaviour m_NewGotSkill;
        [SerializeField] RectTransform m_NewGotSkillPoint;
        [SerializeField] RectTransform m_ContainerRealm;
        [SerializeField] RectTransform m_ContainerRealmUp;
        [SerializeField] RectTransform m_ContainerRealmActivity;
@@ -158,6 +159,7 @@
                    DisplayFightPower();
                    DisplayLv();
                    DisplayGodWeaponEffect();
                    DisplayNewGotSkill();
                    break;
            }
        }
@@ -230,17 +232,51 @@
        void DisplaySkill()
        {
            m_ContainerSkill.gameObject.SetActive(ActivateShow.skills.Count > 0);
            if (ActivateShow.skills.Count == 0)
            List<int> displaySkills;
            switch (ActivateShow.activateType)
            {
                case ActivateShow.ActivateFunc.GodWeapon:
                    var model = ModelCenter.Instance.GetModel<MagicianModel>();
                    displaySkills = model.TryGetDisplaySkillLevels(ActivateShow.godWeaponType);
                    break;
                default:
                    displaySkills = new List<int>();
                    displaySkills.AddRange(ActivateShow.skills);
                    break;
            }
            m_ContainerSkill.gameObject.SetActive(displaySkills.Count > 0);
            if (displaySkills.Count == 0)
            {
                return;
            }
            for (int i = 0; i < m_Skills.Length; i++)
            {
                if (i < ActivateShow.skills.Count)
                if (i < displaySkills.Count)
                {
                    m_Skills[i].gameObject.SetActive(true);
                    m_Skills[i].Display(ActivateShow.skills[i]);
                    switch (ActivateShow.activateType)
                    {
                        case ActivateShow.ActivateFunc.GodWeapon:
                            var model = ModelCenter.Instance.GetModel<MagicianModel>();
                            Dictionary<int, int> dict;
                            if (model.TryGetGodWeaponSkills(ActivateShow.godWeaponType, out dict)
                                && dict.ContainsKey(displaySkills[i]))
                            {
                                m_Skills[i].Display(dict[displaySkills[i]]);
                            }
                            else
                            {
                                var config = GodWeaponEffectConfig.Get(ActivateShow.godWeaponType, displaySkills[i]);
                                if (config != null)
                                {
                                    m_Skills[i].DisplayGodWeaponEffect(config);
                                }
                            }
                            break;
                        default:
                            m_Skills[i].Display(displaySkills[i]);
                            break;
                    }
                }
                else
                {
@@ -269,13 +305,33 @@
        void DisplayNewGotSkill()
        {
            m_ContainerNewGotSkill.gameObject.SetActive(ActivateShow.skills.Count > 0);
            if (ActivateShow.skills.Count == 0)
            switch (ActivateShow.activateType)
            {
                return;
                case ActivateShow.ActivateFunc.GodWeaponEffect:
                    {
                        m_ContainerNewGotSkill.gameObject.SetActive(true);
                        var model = ModelCenter.Instance.GetModel<MagicianModel>();
                        var requireLevel = model.GetGodWeaponStageRequireLevel(ActivateShow.godWeaponType, ActivateShow.godWeaponStage);
                        var config = GodWeaponEffectConfig.Get(ActivateShow.godWeaponType, requireLevel);
                        if (config != null)
                        {
                            m_NewGotSkill.DisplayGodWeaponEffect(config);
                            PrepareFly(config);
                        }
                    }
                    break;
                default:
                    {
                        m_ContainerNewGotSkill.gameObject.SetActive(ActivateShow.skills.Count > 0);
                        if (ActivateShow.skills.Count == 0)
                        {
                            return;
                        }
                        m_NewGotSkill.DisplayNewGot(ActivateShow.skills[0]);
                        PrepareFly(ActivateShow.skills[0]);
                    }
                    break;
            }
            m_NewGotSkill.DisplayNewGot(ActivateShow.skills[0]);
            PrepareFly(ActivateShow.skills[0]);
        }
        void DisplayTreasureSoul()
@@ -309,6 +365,23 @@
            flyObject.gameObject.SetActive(false);
        }
        void PrepareFly(GodWeaponEffectConfig config)
        {
            ActivateShow.PrepareSkillFly();
            var instance = UIUtility.CreateWidget("SkillUnlockFlyObject", "SkillUnlockFlyObject");
            instance.transform.SetParentEx(m_ContainerNewGotFly, Vector3.zero, Quaternion.identity, Vector3.one);
            flyObject = instance.GetComponent<FunctionUnlockFlyObject>();
            flyObject.SetContent(config);
            flyObject.gameObject.SetActive(false);
        }
        void SetFlyPosition()
        {
            var worldpos = m_NewGotSkillPoint.transform.TransformPoint(Vector3.zero);
            var localpos = transform.InverseTransformPoint(worldpos);
            m_ContainerNewGotFly.transform.localPosition = localpos;
        }
        private bool startFly = false;
        private void OnClickClose()
        {
@@ -333,6 +406,16 @@
                        CloseClick();
                    }
                    break;
                case ActivateShow.ActivateFunc.GodWeaponEffect:
                    {
                        if (startFly)
                        {
                            return;
                        }
                        startFly = true;
                        StartFlySkill();
                    }
                    break;
                default:
                    CloseClick();
                    break;
@@ -341,6 +424,7 @@
        private void StartFlySkill()
        {
            SetFlyPosition();
            if (flyObject != null)
            {
                flyObject.gameObject.SetActive(true);
System/Role/GodWeaponPreviewCell.cs
New file
@@ -0,0 +1,29 @@
using System.Collections;
using System.Collections.Generic;
using TableConfig;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    [XLua.Hotfix]
    public class GodWeaponPreviewCell : CellView
    {
        [SerializeField] Image m_Select;
        [SerializeField] Text m_GodWeaponName;
        [SerializeField] FunctionButtonConfig buttonConfig;
        public void Display(int type)
        {
            var config = GodWeaponConfig.GetConfig(type, 1);
            m_GodWeaponName.text = config.Name;
            m_Select.SetSprite(GodWeaponPreviewWin.selectGodWeaponType == type ?
                buttonConfig.selected.iconKey : buttonConfig.normal.iconKey);
            m_GodWeaponName.color = GodWeaponPreviewWin.selectGodWeaponType == type ?
                buttonConfig.selected.fontColor : buttonConfig.normal.fontColor;
            m_GodWeaponName.fontSize = GodWeaponPreviewWin.selectGodWeaponType == type ?
                buttonConfig.selected.fontSize : buttonConfig.normal.fontSize;
        }
    }
}
System/Role/GodWeaponPreviewCell.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: c6e8c76f636861144aec0e58c4e7387c
timeCreated: 1546829434
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Role/GodWeaponPreviewWin.cs
@@ -15,13 +15,19 @@
    [XLua.Hotfix]
    public class GodWeaponPreviewWin : Window
    {
        [SerializeField] Text m_Stage;
        [SerializeField] ScrollerController m_Controller;
        [SerializeField] Text m_RequireLevel;
        [SerializeField] Button[] m_SelectStages;
        [SerializeField] Transform[] m_EquipSigns;
        [SerializeField] Image m_Select;
        [SerializeField] RawImage m_RawModel;
        [SerializeField] PropertyBehaviour[] m_Propertys;
        [SerializeField] Text m_FightPower;
        [SerializeField] Text m_EffectName;
        [SerializeField] RawImage m_RawEffect;
        [SerializeField] RectTransform m_ContainerFuncs;
        [SerializeField] Button m_Equip;
        [SerializeField] Button m_Putoff;
        [SerializeField] Button m_Close;
        int selectStage = 1;
@@ -51,13 +57,15 @@
                    }
                });
            }
            m_Controller.OnRefreshCell += OnRefreshCell;
            m_Equip.onClick.AddListener(Equip);
            m_Putoff.onClick.AddListener(PutOff);
        }
        protected override void OnPreOpen()
        {
            var defaultStage = model.GetGodWeaponStage(selectGodWeaponType);
            defaultStage = Mathf.Clamp(defaultStage + 1, 1, 3);
            OnSelectStage(defaultStage);
            Display();
            DisplayGodWeaponTypes();
        }
        protected override void OnAfterOpen()
@@ -67,6 +75,7 @@
        protected override void OnPreClose()
        {
            UI3DModelExhibition.Instance.StopShow();
            UI3DModelExhibition.InstanceClone1.StopShow();
        }
        protected override void OnAfterClose()
@@ -74,21 +83,61 @@
        }
        #endregion
        void Display()
        {
            var defaultStage = model.GetGodWeaponStage(selectGodWeaponType);
            defaultStage = Mathf.Clamp(defaultStage + 1, 1, 3);
            OnSelectStage(defaultStage);
            DisplayEquip();
        }
        void DisplayGodWeaponTypes()
        {
            if (m_Controller.GetNumberOfCells(m_Controller.m_Scorller) == 0)
            {
                var list = model.godWeaponSorts;
                m_Controller.Refresh();
                for (int i = 0; i < list.Count; i++)
                {
                    if (model.godWeaponEffectTypes.Contains(list[i]))
                    {
                        m_Controller.AddCell(ScrollerDataType.Header, list[i], OnGodWeaponSelect);
                    }
                }
                m_Controller.Restart();
            }
            else
            {
                m_Controller.m_Scorller.RefreshActiveCellViews();
            }
        }
        private void OnRefreshCell(ScrollerDataType type, CellView cell)
        {
            var godWeaponCell = cell as GodWeaponPreviewCell;
            godWeaponCell.Display(cell.index);
        }
        private void OnGodWeaponSelect(CellView cell)
        {
            var type = cell.index;
            if (type != selectGodWeaponType)
            {
                selectGodWeaponType = type;
                m_Controller.m_Scorller.RefreshActiveCellViews();
                Display();
            }
        }
        private void OnSelectStage(int index)
        {
            m_Select.transform.localPosition = m_SelectStages[index - 1].transform.localPosition;
            selectStage = index;
            DisplayModel();
            DisplayStage();
            DisplayRequireLevel();
            DisplayProperty();
            DisplayFightPower();
        }
        private void DisplayStage()
        {
            var config = GodWeaponConfig.GetConfig(selectGodWeaponType, 1);
            m_Stage.text = StringUtility.Contact(config.Name, Language.Get("GodWeaponStage", selectStage));
            DisplayGodWeaponEffect();
        }
        private void DisplayRequireLevel()
@@ -96,6 +145,9 @@
            var requireLevel = model.GetGodWeaponStageRequireLevel(selectGodWeaponType, selectStage);
            var config = GodWeaponConfig.GetConfig(selectGodWeaponType, 1);
            m_RequireLevel.text = Language.Get("GodWeaponStageRequireLevel", config.Name, requireLevel);
            var godWeaponInfo = model.GetGodWeaponInfo(selectGodWeaponType);
            m_RequireLevel.gameObject.SetActive(godWeaponInfo != null && godWeaponInfo.level < requireLevel);
            m_ContainerFuncs.gameObject.SetActive(godWeaponInfo != null && godWeaponInfo.level >= requireLevel);
        }
        private void DisplayFightPower()
@@ -127,6 +179,42 @@
            {
                m_Propertys[i].gameObject.SetActive(false);
            }
        }
        void DisplayGodWeaponEffect()
        {
            var requireLevel = model.GetGodWeaponStageRequireLevel(selectGodWeaponType, selectStage);
            var config = GodWeaponEffectConfig.Get(selectGodWeaponType, requireLevel);
            if (config != null)
            {
                m_EffectName.text = config.skillName;
            }
            UI3DModelExhibition.InstanceClone1.ShowGodWeaponEffect(selectGodWeaponType, requireLevel, m_RawEffect);
        }
        void DisplayEquip()
        {
            var equipedLevel = 0;
            model.IsGodWeaponEffectEquip(selectGodWeaponType, out equipedLevel);
            for (int i = 0; i < m_EquipSigns.Length; i++)
            {
                var stage = i + 1;
                var requireLevel = model.GetGodWeaponStageRequireLevel(selectGodWeaponType, stage);
                m_EquipSigns[i].gameObject.SetActive(requireLevel == equipedLevel);
            }
            var selectLevel = model.GetGodWeaponStageRequireLevel(selectGodWeaponType, selectStage);
            m_Equip.gameObject.SetActive(selectLevel != equipedLevel);
            m_Putoff.gameObject.SetActive(selectLevel == equipedLevel);
        }
        private void Equip()
        {
        }
        private void PutOff()
        {
        }
        private void DisplayModel()
@@ -167,11 +255,15 @@
            {
                var type = model.godWeaponTypes[i];
                var godWeaponInfo = model.GetGodWeaponInfo(type);
                dict.Add(type, godWeaponInfo == null ? 0 : godWeaponInfo.level);
                var equipedLevel = 0;
                if (type == selectGodWeaponType)
                {
                    dict[type] = model.GetGodWeaponStageRequireLevel(selectGodWeaponType, selectStage);
                }
                else if (model.IsGodWeaponEffectEquip(type, out equipedLevel))
                {
                    dict[type] = equipedLevel;
                }
            }
            UI3DPlayerExhibitionData data = new UI3DPlayerExhibitionData()
System/Role/GodWeaponSkillBehaviour.cs
@@ -16,7 +16,8 @@
        [SerializeField] Button m_Func;
        [SerializeField] UIEffect m_Effect;
        GodWeaponConfig config = null;
        GodWeaponConfig godWeaponConfig = null;
        GodWeaponEffectConfig godWeaponEffectConfig = null;
        MagicianModel model { get { return ModelCenter.Instance.GetModel<MagicianModel>(); } }
@@ -27,13 +28,13 @@
        public void Display(GodWeaponConfig config)
        {
            this.config = config;
            this.godWeaponConfig = config;
            this.godWeaponEffectConfig = null;
            var skillConfig = Config.Instance.Get<SkillConfig>(config.SkillID);
            m_Effect.StopImediatly();
            if (config != null && skillConfig != null)
            {
                m_SkillIcon.SetSprite(skillConfig.IconName);
                m_SkillIcon.gameObject.SetActive(true);
                var active = PlayerDatas.Instance.skill.GetSKillById(skillConfig.SkillID) != null;
                m_ContainerLock.gameObject.SetActive(!active);
                m_SkillCondition.gameObject.SetActive(!active);
@@ -43,24 +44,48 @@
                {
                    m_SkillCondition.text = Language.Get("L1091", config.Lv);
                }
            }
        }
                var effectId = 0;
                if (model.TryGetGodWeaponSkillEffect(config.SkillID, out effectId))
        public void Display(GodWeaponEffectConfig config)
        {
            this.godWeaponEffectConfig = config;
            this.godWeaponConfig = null;
            m_Effect.StopImediatly();
            if (config != null)
            {
                m_SkillIcon.SetSprite(config.icon);
                var weaponInfo = model.GetGodWeaponInfo(config.type);
                bool active = weaponInfo != null && weaponInfo.level >= config.level;
                m_SkillCondition.gameObject.SetActive(!active);
                m_ContainerLock.gameObject.SetActive(!active);
                m_SkillIcon.material = active ? MaterialUtility.GetUIDefaultGraphicMaterial() :
                    MaterialUtility.GetDefaultSpriteGrayMaterial();
                if (!active)
                {
                    m_Effect.effect = effectId;
                    m_Effect.Play();
                    m_SkillCondition.text = Language.Get("L1091", config.level);
                }
                m_Effect.Play();
            }
        }
        private void OnFunc()
        {
            if (config != null)
            if (godWeaponConfig != null)
            {
                string extra = StringUtility.Contact("<color=#fa0101>", Language.Get("L1113", config.Name, config.Lv), "</color>");
                var skillConfig = Config.Instance.Get<SkillConfig>(config.SkillID);
                SkillDetails.ShowSkillDetails(config.SkillID, SkillDetails.SkillSourceType.MagicianSkill,
                    skillConfig != null ? skillConfig.FightPower : 0, config.Name, extra);
                string extra = StringUtility.Contact("<color=#fa0101>", Language.Get("L1113", godWeaponConfig.Name, godWeaponConfig.Lv), "</color>");
                var skillConfig = Config.Instance.Get<SkillConfig>(godWeaponConfig.SkillID);
                SkillDetails.ShowSkillDetails(godWeaponConfig.SkillID, SkillDetails.SkillSourceType.GodWeaponSkill,
                    skillConfig != null ? skillConfig.FightPower : 0, godWeaponConfig.Name, extra);
            }
            else if (godWeaponEffectConfig != null)
            {
                var stage = 0;
                var type = godWeaponEffectConfig.type;
                if (model.TryGetGodWeaponStage(type, godWeaponEffectConfig.level, out stage))
                {
                    SkillDetails.ShowGodWeaponEffectSkill(type, stage);
                }
            }
        }
    }
System/Role/MagicianModel.cs
@@ -78,6 +78,7 @@
        private Dictionary<int, int[]> godWeaponLevelUpCost = new Dictionary<int, int[]>();
        public List<int> godWeaponTypes { get; private set; }
        public List<int> godWeaponEffectTypes { get; private set; }
        public Dictionary<int, string> godWeaponIcons { get; private set; }
        public Dictionary<int, Dictionary<int, int>> godWeaponSkillDict = new Dictionary<int, Dictionary<int, int>>();
        Dictionary<int, List<GodWeaponCondition>> godWeaponConditions = new Dictionary<int, List<GodWeaponCondition>>();
@@ -91,6 +92,7 @@
        Dictionary<int, List<GodWeaponEffectProperty>> effectPropertyDict =
            new Dictionary<int, List<GodWeaponEffectProperty>>();
        Dictionary<int, Dictionary<int, int>> effectFightPower = new Dictionary<int, Dictionary<int, int>>();
        Dictionary<int, int> godWeaponEffectEquipDict = new Dictionary<int, int>();
        int[] autoHammerExpArea { get; set; }
        int[] autoHammerCount { get; set; }
@@ -224,6 +226,7 @@
                });
            }
            godWeaponEffectTypes = new List<int>();
            var godWeaponEffects = Config.Instance.GetAllValues<GodWeaponEffectConfig>();
            for (int i = 0; i < godWeaponEffects.Count; i++)
            {
@@ -253,6 +256,11 @@
                    effectFightPower.Add(config.type, dict);
                }
                dict.Add(config.level, config.fightPower);
                if (!godWeaponEffectTypes.Contains(config.type))
                {
                    godWeaponEffectTypes.Add(config.type);
                }
            }
            funcConfig = Config.Instance.Get<FuncConfigConfig>("MagicExterior");
@@ -681,6 +689,24 @@
            return 0;
        }
        public bool TryGetGodWeaponStage(int type, int level, out int stage)
        {
            List<int> list;
            stage = 0;
            if (TryGetGodWeaponStages(type, out list))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i] == level)
                    {
                        stage = i + 1;
                        return true;
                    }
                }
            }
            return false;
        }
        public bool TryGetGodWeaponStages(int type, out List<int> stages)
        {
            return godWeaponStageDict.TryGetValue(type, out stages);
@@ -714,6 +740,17 @@
        public bool TryGetGodWeaponSkillEffect(int skillId, out int effect)
        {
            return godWeaponSkillEffect.TryGetValue(skillId, out effect);
        }
        public bool IsGodWeaponEffectEquip(int type, out int level)
        {
            level = 0;
            if (godWeaponEffectEquipDict.ContainsKey(type))
            {
                level = godWeaponEffectEquipDict[type];
                return true;
            }
            return false;
        }
        public bool TryGetEffectProperty(int type, int level, out Dictionary<int, int> dict)
@@ -783,6 +820,23 @@
            }
            return propertyCacheDict;
        }
        public List<int> TryGetDisplaySkillLevels(int type)
        {
            List<int> displaySkillLevels = new List<int>();
            Dictionary<int, int> dict;
            if (TryGetGodWeaponSkills(type, out dict))
            {
                displaySkillLevels.AddRange(dict.Keys);
            }
            List<int> list;
            if (TryGetGodWeaponStages(type, out list))
            {
                displaySkillLevels.AddRange(list);
            }
            displaySkillLevels.Sort();
            return displaySkillLevels;
        }
    }
    public class GodWeaponInfo
System/Role/MagicianWin.cs
@@ -38,6 +38,11 @@
        [SerializeField] RectTransform m_ContainerSkill;
        [SerializeField] GodWeaponSkillBehaviour[] m_Skills;
        [SerializeField] HorizontalLayoutGroup m_SkillLayout;
        [SerializeField] ContentSizeFitter m_SkillSizeFitter;
        [SerializeField] ScrollRect m_SkillScroller;
        [SerializeField] RectTransform m_EffectPoint;
        [SerializeField] ItemCell[] m_Items;
        [SerializeField] Image m_Select;
@@ -144,6 +149,8 @@
            DisplaySelectItem();
            DisplayGodWeaponModel();
            m_SkillScroller.horizontalNormalizedPosition = 0f;
            if (flyObjectTarget != null)
            {
                Destroy(flyObjectTarget);
@@ -238,7 +245,8 @@
        private void ComplelteFlySkillEvent(ActivateShow.ActivateFunc type)
        {
            if (type == ActivateShow.ActivateFunc.GodWeapon)
            if (type == ActivateShow.ActivateFunc.GodWeapon
                || type == ActivateShow.ActivateFunc.GodWeaponEffect)
            {
                if (flyObjectTarget != null)
                {
@@ -250,19 +258,44 @@
        private void PrepareFlySkillEvent(ActivateShow.ActivateFunc type, int skillId)
        {
            var index = 0;
            if (type == ActivateShow.ActivateFunc.GodWeapon)
            {
                var godWeaponType = 0;
                var index = 0;
                if (TryGetGodWeaponType(skillId, out godWeaponType, out index))
                {
                    model.selectType = godWeaponType;
                    flyObjectTarget = m_Skills[index].AddMissingComponent<FunctionUnlockFlyObjectTarget>();
                    flyObjectTarget = m_EffectPoint.AddMissingComponent<FunctionUnlockFlyObjectTarget>();
                    flyObjectTarget.IdList = new int[] { skillId };
                    flyObjectTarget.Z_UnLockType = FunctionUnlockType.Skill;
                    FunctionUnlockFlyObjectTargetCenter.Register(FunctionUnlockType.Skill, new int[] { skillId }, flyObjectTarget);
                }
            }
            else if (type == ActivateShow.ActivateFunc.GodWeaponEffect)
            {
                var list = model.TryGetDisplaySkillLevels(ActivateShow.godWeaponType);
                var godWeaponType = ActivateShow.godWeaponType;
                var godWeaponStage = ActivateShow.godWeaponStage;
                var requireLevel = model.GetGodWeaponStageRequireLevel(godWeaponType, godWeaponStage);
                index = list.IndexOf(requireLevel);
                model.selectType = godWeaponType;
                flyObjectTarget = m_EffectPoint.AddMissingComponent<FunctionUnlockFlyObjectTarget>();
                flyObjectTarget.IdList = new int[] { requireLevel };
                flyObjectTarget.Z_UnLockType = FunctionUnlockType.GodWeaponEffect;
                FunctionUnlockFlyObjectTargetCenter.Register(FunctionUnlockType.GodWeaponEffect, new int[] { requireLevel }, flyObjectTarget);
            }
            var rt = m_SkillLayout.transform as RectTransform;
            var rt1 = m_SkillScroller.transform as RectTransform;
            var delta = m_Skills[index].transform.localPosition.x;
            var offset = rt.rect.width - rt1.rect.width;
            delta -= offset;
            m_SkillScroller.horizontalNormalizedPosition = Mathf.Clamp01(delta / offset);
            var worldpos = m_Skills[index].transform.TransformPoint(Vector3.zero);
            var localpos = transform.InverseTransformPoint(worldpos);
            m_EffectPoint.transform.localPosition = localpos;
        }
        private void WindowBeforeCloseEvent(Window window)
@@ -336,6 +369,8 @@
            DisplaySelectItem();
            DisplayGodWeaponModel();
            m_GodWeaponController.m_Scorller.RefreshActiveCellViews();
            m_SkillScroller.horizontalNormalizedPosition = 0f;
        }
        private void GodWeaponUpdate()
@@ -400,26 +435,52 @@
        private void DisplaySkills()
        {
            Dictionary<int, int> skills = null;
            List<int> displaySkillLevels = new List<int>();
            Dictionary<int, int> dict;
            var index = 0;
            if (model.TryGetGodWeaponSkills(model.selectType, out skills))
            if (model.TryGetGodWeaponSkills(model.selectType, out dict))
            {
                foreach (var level in skills.Keys)
                displaySkillLevels.AddRange(dict.Keys);
            }
            List<int> list;
            if (model.TryGetGodWeaponStages(model.selectType, out list))
            {
                displaySkillLevels.AddRange(list);
            }
            displaySkillLevels.Sort();
            foreach (var level in displaySkillLevels)
            {
                if (index < m_Skills.Length)
                {
                    if (index < m_Skills.Length)
                    m_Skills[index].gameObject.SetActive(true);
                    var godWeaponConfig = GodWeaponConfig.GetConfig(model.selectType, level);
                    var godWeaponEffectConfig = GodWeaponEffectConfig.Get(model.selectType, level);
                    if (dict != null && dict.ContainsKey(level))
                    {
                        m_Skills[index].gameObject.SetActive(true);
                        var config = GodWeaponConfig.GetConfig(model.selectType, level);
                        m_Skills[index].Display(config);
                        index++;
                        m_Skills[index].Display(godWeaponConfig);
                    }
                    else if (list != null && list.Contains(level))
                    {
                        m_Skills[index].Display(godWeaponEffectConfig);
                    }
                    index++;
                }
            }
            for (int i = index; i < m_Skills.Length; i++)
            {
                m_Skills[index].gameObject.SetActive(false);
                m_Skills[i].gameObject.SetActive(false);
            }
            m_ContainerSkill.gameObject.SetActive(skills != null && skills.Count > 0);
            m_ContainerSkill.gameObject.SetActive(displaySkillLevels.Count > 0);
            m_SkillSizeFitter.horizontalFit = displaySkillLevels.Count > 4 ?
                ContentSizeFitter.FitMode.PreferredSize : ContentSizeFitter.FitMode.Unconstrained;
            m_SkillLayout.childAlignment = displaySkillLevels.Count > 4 ?
                TextAnchor.MiddleLeft : TextAnchor.MiddleCenter;
            m_SkillScroller.horizontal = displaySkillLevels.Count > 4;
            if (displaySkillLevels.Count <= 4)
            {
                var rt = m_SkillLayout.transform as RectTransform;
                rt.sizeDelta = rt.sizeDelta.SetX(m_ContainerSkill.rect.width);
            }
        }
        private void DisplayItems()
@@ -682,7 +743,7 @@
                            addValue = addPropertyDict[key];
                        }
                    }
                    m_Propertys[i].DisplayAdd(displayPropertys[i], currentValue, addValue);
                    m_Propertys[i].DisplayGodWeaponAdd(displayPropertys[i], currentValue, addValue);
                }
                else
                {
@@ -758,15 +819,15 @@
            foreach (var key in model.godWeaponSkillDict.Keys)
            {
                var dict = model.godWeaponSkillDict[key];
                index = 0;
                var list = model.TryGetDisplaySkillLevels(key);
                foreach (var level in dict.Keys)
                {
                    if (dict[level] == skillId)
                    {
                        type = key;
                        index = list.IndexOf(level);
                        return true;
                    }
                    index++;
                }
            }
            return false;
@@ -1088,6 +1149,8 @@
            return false;
        }
        enum AutoHammerState
        {
            None,
System/Role/PropertyBehaviour.cs
@@ -70,6 +70,28 @@
            }
        }
        public void DisplayGodWeaponAdd(int _property, int _value, int _add)
        {
            var config = Config.Instance.Get<PlayerPropertyConfig>(_property);
            if (config != null)
            {
                m_PropertyName.text = config.Name;
                m_PropertyValue.text = StringUtility.Contact(UIHelper.ReplaceLargeNum(
                    UIHelper.ReplacePercentage(_value, config.ISPercentage, UIHelper.GetPropertyDecimalCount(_property))),
                    config.ISPercentage == 1 ? "%" : string.Empty);
                if (_add == 0)
                {
                    m_PropertyAdd.text = string.Empty;
                }
                else
                {
                    m_PropertyAdd.text = StringUtility.Contact("+", UIHelper.ReplaceLargeNum(
                        UIHelper.ReplacePercentage(_add, config.ISPercentage, UIHelper.GetPropertyDecimalCount(_property))),
                       config.ISPercentage == 1 ? "%" : string.Empty);
                }
            }
        }
        public void DisplayCompare(int _property, int _value, int _add)
        {
            var config = Config.Instance.Get<PlayerPropertyConfig>(_property);
System/Skill/SkillBehaviour.cs
@@ -15,6 +15,8 @@
        [SerializeField] Text m_SkillDescription;
        private int skillId = 0;
        GodWeaponEffectConfig godWeaponEffectConfig = null;
        public event Action<int> onClick;
        private void Awake()
@@ -25,6 +27,7 @@
        public void Display(int _skillId)
        {
            var config = Config.Instance.Get<SkillConfig>(_skillId);
            godWeaponEffectConfig = null;
            skillId = 0;
            if (config != null)
            {
@@ -33,9 +36,24 @@
            }
        }
        public void DisplayGodWeaponEffect(GodWeaponEffectConfig config)
        {
            godWeaponEffectConfig = config;
            m_SkillIcon.SetSprite(config.icon);
            if (m_SkillName != null)
            {
                m_SkillName.text = config.skillName;
            }
            if (m_SkillDescription != null)
            {
                m_SkillDescription.text = string.Empty;
            }
        }
        public void DisplayNewGot(int _skillId)
        {
            var config = Config.Instance.Get<SkillConfig>(_skillId);
            godWeaponEffectConfig = null;
            skillId = 0;
            if (config != null)
            {
@@ -67,7 +85,7 @@
                            }
                        }
                        var config = GodWeaponConfig.GetConfig(ActivateShow.godWeaponType, _lv);
                        SkillDetails.ShowSkillDetails(config.SkillID, SkillDetails.SkillSourceType.MagicianSkill, 0, config.Name, string.Empty);
                        SkillDetails.ShowSkillDetails(config.SkillID, SkillDetails.SkillSourceType.GodWeaponSkill, 0, config.Name, string.Empty);
                        break;
                }
@@ -76,6 +94,24 @@
                    onClick(skillId);
                }
            }
            if (godWeaponEffectConfig != null)
            {
                switch (ActivateShow.activateType)
                {
                    case ActivateShow.ActivateFunc.GodWeapon:
                        var _model = ModelCenter.Instance.GetModel<MagicianModel>();
                        if (godWeaponEffectConfig != null)
                        {
                            var stage = 0;
                            if (_model.TryGetGodWeaponStage(ActivateShow.godWeaponType, godWeaponEffectConfig.level, out stage))
                            {
                                SkillDetails.ShowGodWeaponEffectSkill(ActivateShow.godWeaponType, stage);
                            }
                        }
                        break;
                }
            }
        }
    }
}
System/Tip/SkillDetails.cs
@@ -2,70 +2,90 @@
using System.Collections.Generic;
using UnityEngine;
using TableConfig;
using System.Text;
namespace Snxxz.UI
{
    public class SkillDetails
    {
        public static SkillSourceType sourceType { get; private set; }
        public static SkillConfig skillModel { get; private set; }
        public static SkillConfig skillConfig { get; private set; }
        public static List<string> infoList = new List<string>();
        public static int godWeaponType { get; private set; }
        public static int godWeaponEffectStage { get; private set; }
        public static List<string> skillDescriptions = new List<string>();
        public static string skillSource { get; private set; }
        public static int fightPower { get; private set; }
        public static void ShowSkillDetails(int _skillid, SkillSourceType _type, int _fightPower, params string[] _infos)
        static MagicianModel godWeaponModel
        {
            fightPower = _fightPower;
            sourceType = _type;
            skillModel = Config.Instance.Get<SkillConfig>(_skillid);
            infoList.Clear();
            switch (_type)
            get { return ModelCenter.Instance.GetModel<MagicianModel>(); }
        }
        public static void ShowSkillDetails(int skillId, SkillSourceType type, int fightPower, params string[] infos)
        {
            SkillDetails.fightPower = fightPower;
            sourceType = type;
            skillConfig = Config.Instance.Get<SkillConfig>(skillId);
            skillDescriptions.Clear();
            switch (type)
            {
                case SkillSourceType.MagicianSkill:
                case SkillSourceType.GodWeaponSkill:
                    {
                        skillSource = _infos[0];
                        infoList.Add(skillModel.Description);
                        infoList.Add(_infos[1]);
                        skillSource = infos[0];
                        skillDescriptions.Add(skillConfig.Description);
                        skillDescriptions.Add(infos[1]);
                    }
                    break;
                case SkillSourceType.PlayerSkill:
                    skillSource = skillModel.SkillName;
                    infoList.Add(skillModel.Description);
                    {
                        skillSource = skillConfig.SkillName;
                        skillDescriptions.Add(skillConfig.Description);
                    }
                    break;
                case SkillSourceType.PetSkill:
                    if (_infos.Length <= 0)
                    {
                        infoList.Add(skillModel.Description);
                    }
                    else if (_infos.Length == 1)
                    {
                        infoList.Add(_infos[0]);
                    }
                    else if (_infos.Length == 2)
                    {
                        infoList.Add(_infos[0]);
                        infoList.Add(_infos[1]);
                        if (infos.Length <= 0)
                        {
                            skillDescriptions.Add(skillConfig.Description);
                        }
                        else if (infos.Length == 1)
                        {
                            skillDescriptions.Add(infos[0]);
                        }
                        else if (infos.Length == 2)
                        {
                            skillDescriptions.Add(infos[0]);
                            skillDescriptions.Add(infos[1]);
                    }
                    else if (_infos.Length == 3)
                    {
                        infoList.Add(skillModel.Description);
                        infoList.Add(_infos[2]);
                        }
                        else if (infos.Length == 3)
                        {
                            skillDescriptions.Add(skillConfig.Description);
                            skillDescriptions.Add(infos[2]);
                        }
                    }
                    break;
                case SkillSourceType.ViewHorsePet:
                    infoList.Add(skillModel.Description);
                    infoList.Add(_infos[0]);
                    {
                        skillDescriptions.Add(skillConfig.Description);
                        skillDescriptions.Add(infos[0]);
                    }
                    break;
                case SkillSourceType.BlastFurnace:
                    skillSource = _infos[0];
                    infoList.Add(skillModel.Description);
                    {
                        skillSource = infos[0];
                        skillDescriptions.Add(skillConfig.Description);
                    }
                    break;
                case SkillSourceType.DogzSkill:
                    infoList.Add(skillModel.Description);
                    {
                        skillDescriptions.Add(skillConfig.Description);
                    }
                    break;
            }
            if (!WindowCenter.Instance.IsOpen<SkillDetailsWin>())
@@ -74,14 +94,35 @@
            }
        }
        public static void ShowGodWeaponEffectSkill(int godWeaponType, int stage)
        {
            SkillDetails.godWeaponType = godWeaponType;
            godWeaponEffectStage = stage;
            sourceType = SkillSourceType.GodWeaponEffectSkill;
            skillDescriptions.Clear();
            var dict = godWeaponModel.GetEffectPropertyUpper(godWeaponType, stage);
            var level = godWeaponModel.GetGodWeaponStageRequireLevel(godWeaponType, stage);
            fightPower = 0;
            if (dict != null)
            {
                fightPower = UIHelper.GetFightPower(dict);
            }
            if (!WindowCenter.Instance.IsOpen<SkillDetailsWin>())
            {
                WindowCenter.Instance.Open<SkillDetailsWin>();
            }
        }
        public enum SkillSourceType
        {
            MagicianSkill = 0,
            PlayerSkill = 1,
            PetSkill = 2,
            BlastFurnace = 3,
            ViewHorsePet = 4,
            DogzSkill = 5,
            GodWeaponSkill,
            GodWeaponEffectSkill,
            PlayerSkill,
            PetSkill,
            BlastFurnace,
            ViewHorsePet,
            DogzSkill,
        }
    }
}
System/Tip/SkillDetailsWin.cs
@@ -9,120 +9,51 @@
using TableConfig;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI {
namespace Snxxz.UI
{
    [XLua.Hotfix]
    public class SkillDetailsWin : Window
    {
        private RectTransform winRt;
        private Button btnPopSkillClose;
        private Image imgSkill;
        private Text textSkillSource;
        private Text textSkillName;
        private Text destText;
        private ScrollerController m_Control;
        [SerializeField] Button m_Close;
        [SerializeField] Image m_SkillIcon;
        [SerializeField] Text m_SkillInfo1;
        [SerializeField] Text m_SkillInfo2;
        [SerializeField] RectTransform m_ContainerDescription;
        [SerializeField] Text[] m_Descriptions;
        [SerializeField] RectTransform m_ContaienrFightPower;
        [SerializeField] Text m_FightPower;
        [SerializeField] RectTransform m_ContainerGodWeaponEffectSkill;
        [SerializeField] PropertyBehaviour[] m_Propertys;
        [SerializeField] Text m_GodWeaponEffectCondition;
        [SerializeField] RectTransform m_ContainerPlayer;
        [SerializeField] RawImage m_RawPlayer;
        public void ShowSkillDetails()
        {
            textSkillName.gameObject.SetActive(true);
            imgSkill.SetSprite(SkillDetails.skillModel.IconName);
            switch (SkillDetails.sourceType) {
                case SkillDetails.SkillSourceType.MagicianSkill: {
                            textSkillName.text = SkillDetails.skillModel.SkillName;
                            textSkillSource.text = SkillDetails.skillSource;
                    }
                    break;
                case SkillDetails.SkillSourceType.PetSkill: {
                        if (SkillDetails.skillModel.CoolDownTime > 0)
                        {
                            textSkillName.text = StringUtility.Contact("CD:", (float)SkillDetails.skillModel.CoolDownTime / 1000, Language.Get("RealmWin_Bewrite_35"));
                        }
                        else
                        {
                            textSkillName.gameObject.SetActive(false);
                        }
                        textSkillSource.text = SkillDetails.skillModel.SkillName;
                    }
                    break;
                case SkillDetails.SkillSourceType.ViewHorsePet:
                    {
                        if (SkillDetails.skillModel.CoolDownTime > 0)
                        {
                            textSkillName.text = StringUtility.Contact("CD:", (float)SkillDetails.skillModel.CoolDownTime / 1000, Language.Get("RealmWin_Bewrite_35"));
                        }
                        else
                        {
                            textSkillName.gameObject.SetActive(false);
                        }
                        textSkillSource.text = SkillDetails.skillModel.SkillName;
                    }
                    break;
                case SkillDetails.SkillSourceType.BlastFurnace:
                    {
                        textSkillName.text = SkillDetails.skillModel.SkillName;
                        textSkillSource.text = SkillDetails.skillSource;
                    }
                    break;
                case SkillDetails.SkillSourceType.DogzSkill:
                    {
                        textSkillSource.text = SkillDetails.skillModel.SkillName;
                        textSkillName.text = Language.Get("PlayerDetail_Level", SkillDetails.skillModel.SkillLV);
                    }
                    break;
        MagicianModel godWeaponModel { get { return ModelCenter.Instance.GetModel<MagicianModel>(); } }
            }
            m_Control.Refresh();
            for (int i = 0; i < SkillDetails.infoList.Count; i++) {
                m_Control.AddCell(ScrollerDataType.Header, i);
            }
            m_Control.Restart();
            float size = 185;
            m_ContaienrFightPower.gameObject.SetActive(SkillDetails.fightPower > 0);
            if (SkillDetails.fightPower > 0)
            {
                m_FightPower.text = StringUtility.Contact("+", SkillDetails.fightPower);
                size += 100;
            }
            for (int i = 0; i < SkillDetails.infoList.Count; i++) {
                size += m_Control.GetCellViewSize(m_Control.m_Scorller, i);
            }
            if (size < 440) {
                m_Control.maxCellCnt = m_Control.GetNumberOfCells(m_Control.m_Scorller);
            }
            winRt.sizeDelta = new Vector2(winRt.sizeDelta.x, Mathf.Min(540, size));
        }
        #region Built-in
        protected override void BindController()
        {
            winRt = transform.Find("BG") as RectTransform;
            btnPopSkillClose = transform.Find("BG/Close").GetComponent<Button>();
            imgSkill = transform.Find("BG/SkillBG/Skill").GetComponent<Image>();
            textSkillSource = transform.Find("BG/Source").GetComponent<Text>();
            textSkillName = transform.Find("BG/SkillName").GetComponent<Text>();
            destText = this.GetComponent<Text>("BG/InfoCell");
            m_Control = this.GetComponent<ScrollerController>("BG/Controll");
            m_Control.OnRefreshCell += OnRefreshInfoCell;
            m_Control.OnGetDynamicSize += OnGetDynamicSize;
        }
        protected override void AddListeners()
        {
            btnPopSkillClose.onClick.AddListener(CloseClick);
            m_Close.onClick.AddListener(CloseClick);
        }
        protected override void OnPreOpen()
        {
            ShowSkillDetails();
            m_ContainerGodWeaponEffectSkill.gameObject.SetActive(false);
            m_ContainerDescription.gameObject.SetActive(false);
            m_ContainerPlayer.gameObject.SetActive(false);
            switch (SkillDetails.sourceType)
            {
                case SkillDetails.SkillSourceType.GodWeaponEffectSkill:
                    DisplayGodWeaponEffectSkill();
                    break;
                default:
                    DisplayNormal();
                    break;
            }
        }
        protected override void OnAfterOpen()
@@ -132,7 +63,7 @@
        protected override void OnPreClose()
        {
            UI3DModelExhibition.Instance.StopShow();
        }
        protected override void OnAfterClose()
@@ -141,20 +72,127 @@
        }
        #endregion
        private void OnRefreshInfoCell(ScrollerDataType type, CellView cell)
        void DisplayNormal()
        {
            if (cell.index < SkillDetails.infoList.Count) {
                Text text = cell.GetComponent<Text>();
                text.text = SkillDetails.infoList[cell.index];
            m_SkillInfo2.gameObject.SetActive(true);
            m_ContainerDescription.gameObject.SetActive(true);
            m_SkillIcon.SetSprite(SkillDetails.skillConfig.IconName);
            switch (SkillDetails.sourceType)
            {
                case SkillDetails.SkillSourceType.GodWeaponSkill:
                    {
                        m_SkillInfo2.text = SkillDetails.skillConfig.SkillName;
                        m_SkillInfo1.text = SkillDetails.skillSource;
                    }
                    break;
                case SkillDetails.SkillSourceType.PetSkill:
                    {
                        if (SkillDetails.skillConfig.CoolDownTime > 0)
                        {
                            m_SkillInfo2.text = StringUtility.Contact("CD:", (float)SkillDetails.skillConfig.CoolDownTime / 1000, Language.Get("RealmWin_Bewrite_35"));
                        }
                        else
                        {
                            m_SkillInfo2.gameObject.SetActive(false);
                        }
                        m_SkillInfo1.text = SkillDetails.skillConfig.SkillName;
                    }
                    break;
                case SkillDetails.SkillSourceType.ViewHorsePet:
                    {
                        if (SkillDetails.skillConfig.CoolDownTime > 0)
                        {
                            m_SkillInfo2.text = StringUtility.Contact("CD:", (float)SkillDetails.skillConfig.CoolDownTime / 1000, Language.Get("RealmWin_Bewrite_35"));
                        }
                        else
                        {
                            m_SkillInfo2.gameObject.SetActive(false);
                        }
                        m_SkillInfo1.text = SkillDetails.skillConfig.SkillName;
                    }
                    break;
                case SkillDetails.SkillSourceType.BlastFurnace:
                    {
                        m_SkillInfo2.text = SkillDetails.skillConfig.SkillName;
                        m_SkillInfo1.text = SkillDetails.skillSource;
                    }
                    break;
                case SkillDetails.SkillSourceType.DogzSkill:
                    {
                        m_SkillInfo1.text = SkillDetails.skillConfig.SkillName;
                        m_SkillInfo2.text = Language.Get("PlayerDetail_Level", SkillDetails.skillConfig.SkillLV);
                    }
                    break;
            }
            DisplayDescriptions();
            DisplayFightPower();
        }
        void DisplayGodWeaponEffectSkill()
        {
            m_ContainerGodWeaponEffectSkill.gameObject.SetActive(true);
            m_ContainerPlayer.gameObject.SetActive(true);
            var level = godWeaponModel.GetGodWeaponStageRequireLevel(SkillDetails.godWeaponType, SkillDetails.godWeaponEffectStage);
            var godWeaponEffectConfig = GodWeaponEffectConfig.Get(SkillDetails.godWeaponType, level);
            var config = GodWeaponConfig.GetConfig(SkillDetails.godWeaponType, 1);
            m_SkillIcon.SetSprite(godWeaponEffectConfig.icon);
            m_SkillInfo1.text = Language.Get("GodWeaponEffectSource", config.Name);
            m_SkillInfo2.text = godWeaponEffectConfig.skillName;
            var dict = godWeaponModel.GetEffectPropertyUpper(SkillDetails.godWeaponType, SkillDetails.godWeaponEffectStage);
            if (dict != null && dict.Count > 0)
            {
                var index = 0;
                foreach (var key in dict.Keys)
                {
                    m_Propertys[index].gameObject.SetActive(true);
                    m_Propertys[index].DisplayUpper(key, dict[key]);
                    index++;
                }
                for (int i = index; i < m_Propertys.Length; i++)
                {
                    m_Propertys[i].gameObject.SetActive(false);
                }
            }
            m_GodWeaponEffectCondition.text = Language.Get("L1113", config.Name, level);
            var job = PlayerDatas.Instance.baseData.Job;
            var godWeaponDict = new Dictionary<int, int>();
            godWeaponDict.Add(SkillDetails.godWeaponType, level);
            var data = new UI3DPlayerExhibitionData()
            {
                job = job,
                godWeapons = godWeaponDict,
            };
            UI3DModelExhibition.Instance.ShowOtherPlayer(m_RawPlayer, data);
            DisplayFightPower();
        }
        void DisplayDescriptions()
        {
            for (int i = 0; i < m_Descriptions.Length; i++)
            {
                m_Descriptions[i].gameObject.SetActive(i < SkillDetails.skillDescriptions.Count);
                if (i < SkillDetails.skillDescriptions.Count)
                {
                    m_Descriptions[i].text = SkillDetails.skillDescriptions[i];
                }
            }
        }
        private bool OnGetDynamicSize(ScrollerDataType type, int index, out float height)
        void DisplayFightPower()
        {
            var _content=SkillDetails.infoList[index];
            destText.text = _content;
            height = destText.preferredHeight + 3;
            return true;
            m_ContaienrFightPower.gameObject.SetActive(SkillDetails.fightPower > 0);
            if (SkillDetails.fightPower > 0)
            {
                m_FightPower.text = StringUtility.Contact("+", SkillDetails.fightPower);
            }
        }
    }
System/Treasure/FunctionUnlockFlyObject.cs
@@ -106,6 +106,27 @@
            }
        }
        public void SetContent(GodWeaponEffectConfig config)
        {
            m_UnLockType = FunctionUnlockType.GodWeaponEffect;
            m_Id = config.level;
            m_FunctionIcon.SetSprite(config.icon);
            originalScale = 1f;
            this.transform.localScale = Vector3.one * originalScale;
            if (m_Effect != null)
            {
                m_Effect.Play();
            }
            target = FunctionUnlockFlyObjectTargetCenter.GetTarget(m_UnLockType, m_Id);
            if (target != null)
            {
                target.Prepare();
                beginMove = false;
            }
        }
        public void SetSpeed(float _speed)
        {
            speed = _speed;
UI/Common/UI3DModelExhibition.cs
@@ -20,6 +20,7 @@
        [SerializeField] Transform m_NPCShowPoint;
        [SerializeField] Transform m_DialogPoint;
        [SerializeField] Transform m_EquipmentPoint;
        [SerializeField] Transform m_GodWeaponEffectPoint;
        [SerializeField] Camera m_ShowCamera;
        [SerializeField] bool m_Interactable = false;
        [SerializeField] UI3DModelInteractProcessor m_InteractProcessor;
@@ -56,6 +57,8 @@
        int m_EquipmentModelId = 0;
        GameObject equipmentModel = null;
        SFXController godWeaponEffect = null;
        bool isShowingPlayer = false;
        bool isShowingHorse = false;
@@ -616,6 +619,40 @@
        }
        public void ShowGodWeaponEffect(int type, int level, RawImage _rawImage)
        {
            StopShow();
            m_ShowCamera.enabled = true;
            var job = PlayerDatas.Instance.baseData.Job;
            var config = GodWeaponEffectConfig.Get(type, level);
            var effectJson = LitJson.JsonMapper.ToObject(config.effect);
            var effectId = int.Parse(effectJson[job.ToString()].ToString());
            godWeaponEffect = SFXPlayUtility.Instance.PlayBattleEffect(effectId, m_GodWeaponEffectPoint);
            if (godWeaponEffect != null)
            {
                var index = Mathf.Max(0, job - 1);
                godWeaponEffect.transform.localPosition = index < config.effectPosition.Length ?
                    config.effectPosition[index] : Vector3.zero;
                godWeaponEffect.transform.localEulerAngles = index < config.effectAngles.Length ?
                    config.effectAngles[index] : Vector3.zero;
                godWeaponEffect.transform.localScale = index < config.effectScale.Length ?
                    config.effectScale[index] : Vector3.one;
            }
            if (_rawImage != null)
            {
                var x = _rawImage.rectTransform.rect.height * 4f / 3;
                var y = _rawImage.rectTransform.rect.height;
                _rawImage.rectTransform.sizeDelta = new Vector2(x, y);
                _rawImage.texture = m_ShowCamera.targetTexture;
                _rawImage.material = MaterialUtility.GetGUIRenderTextureMaterial();
                m_InteractProcessor.rectTransform = _rawImage.rectTransform;
            }
        }
        public void StopShow()
        {
            m_ShowCamera.enabled = false;
@@ -691,6 +728,12 @@
            }
            m_EquipmentModelId = 0;
            isShowinEquipment = false;
            if (godWeaponEffect != null)
            {
                SFXPlayUtility.Instance.Release(godWeaponEffect);
                godWeaponEffect = null;
            }
            interactable = false;
        }
@@ -837,7 +880,6 @@
        public bool gray;
        public bool isDialogue;
    }
}
UI/Common/UIRoot.cs
@@ -63,13 +63,16 @@
            if (StageManager.Instance.CurrentStage != null)
            {
                if (Input.GetKeyDown(KeyCode.Escape))
                if (SDKUtility.Instance.ChannelPlatform != SDKUtility.E_ChannelPlatform.Yj)
                {
                    if (Input.GetKeyDown(KeyCode.Escape))
                    {
#if UNITY_EDITOR
                    WindowCenter.Instance.Open<ExitGameWin>();
                        WindowCenter.Instance.Open<ExitGameWin>();
#elif UNITY_ANDROID
                    WindowCenter.Instance.Open<ExitGameWin>();
                        WindowCenter.Instance.Open<ExitGameWin>();
#endif
                    }
                }
            }
@@ -84,7 +87,8 @@
        private void EnableCanvas(Transform parent, bool _enabled)
        {
            Canvas canvas = parent.GetComponent<Canvas>();
            if (canvas != null) canvas.enabled = _enabled;
            if (canvas != null)
                canvas.enabled = _enabled;
            foreach (Transform child in parent)
            {
                EnableCanvas(child, _enabled);
Utility/EnumHelper.cs
@@ -1082,6 +1082,7 @@
    TreasureSkill = 3,
    Skill = 4,
    TreasureFunc = 5,
    GodWeaponEffect,
}
public enum RedPointState
Utility/StageLoadTimeOutCatcher.cs
@@ -8,11 +8,11 @@
    const int timeOut = 20;//秒
    public static DateTime got0102Time = DateTime.MinValue;
    public static DateTime gotA126Time = DateTime.MinValue;
    public static DateTime gotA127Time = DateTime.MinValue;
    public static DateTime got0109Time = DateTime.MinValue;
    public static DateTime send0107Time = DateTime.MinValue;
    public static ProtocolRecorder got0102Time;
    public static ProtocolRecorder gotA126Time;
    public static ProtocolRecorder gotA127Time;
    public static ProtocolRecorder got0109Time;
    public static ProtocolRecorder send0107Time;
    public static StageLoadTimeOutCatcher Begin(int stageId)
    {
@@ -48,24 +48,45 @@
            var description = StringUtility.Contact(
                                        "开始时间:", startTime.ToString("HH:mm:ss"), ";",
                                        "超时时间:", DateTime.Now.ToString("HH:mm:ss"),
                                        "0102时间:", got0102Time.ToString("HH:mm:ss"), ";",
                                        "A126时间:", gotA126Time.ToString("HH:mm:ss"), ";",
                                        "A127时间:", gotA127Time.ToString("HH:mm:ss"), ";",
                                        "0109时间:", got0109Time.ToString("HH:mm:ss"), ";",
                                        "0107时间:", send0107Time.ToString("HH:mm:ss"));
                                        "0102记录:", got0102Time.ToString(), ";",
                                        "A126记录:", gotA126Time.ToString(), ";",
                                        "A127记录:", gotA127Time.ToString(), ";",
                                        "0109记录:", got0109Time.ToString(), ";",
                                        "0107记录:", send0107Time.ToString());
            ExceptionCatcher.ReportException(title, description);
            Stop();
        }
    }
    public static void ReportChangeMapRecord(GameNetSystem.SocketType socketType, string protocol, DateTime time)
    public static void RecordProtocol(GameNetSystem.SocketType socketType, string number, DateTime time)
    {
        var recorder = new ProtocolRecorder(number, time, socketType);
        switch (number)
        {
            case "0102":
                got0102Time = recorder;
                break;
            case "A126":
                gotA126Time = recorder;
                break;
            case "A127":
                gotA127Time = recorder;
                break;
            case "0109":
                got0109Time = recorder;
                break;
            case "0107":
                send0107Time = recorder;
                break;
            default:
                break;
        }
        try
        {
            var title = StringUtility.Contact("地图加载记录-->协议编号:", protocol);
            var description = StringUtility.Contact("服务器:", socketType, ";",
                "协议编号:", protocol, ";", "时间:", time.ToString("HH:mm:ss"), "玩家:", PlayerDatas.Instance.baseData.PlayerName);
            var title = StringUtility.Contact("地图加载记录-->封包编号:", number);
            var description = StringUtility.Contact(recorder.ToString(), "玩家:", PlayerDatas.Instance.baseData.PlayerName);
            ExceptionCatcher.ReportException(title, description);
        }
@@ -73,7 +94,25 @@
        {
        }
    }
    public struct ProtocolRecorder
    {
        public string number;
        public DateTime time;
        public GameNetSystem.SocketType socketType;
        public ProtocolRecorder(string number, DateTime time, GameNetSystem.SocketType socketType)
        {
            this.number = number;
            this.time = time;
            this.socketType = socketType;
        }
        public override string ToString()
        {
            return StringUtility.Contact("封包:", number, ";", "时间:", time.ToString("HH:mm:ss"), ";", "服务器:", socketType);
        }
    }
}