hch
19 小时以前 14566ef9298fb5ef38792f644b42673058dd07c3
515 【挑战】PVP群英榜
13个文件已修改
14个文件已添加
1001 ■■■■■ 已修改文件
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerTop3Cell.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/GeneralConfig/GeneralDefine.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYAchievementCell.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYAchievementCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYAchievementWin.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYAchievementWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYBattleFailWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYFighterCell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYNoteCell.cs 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYNoteCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYNoteWin.cs 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYNoteWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYPlayerTop3Cell.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYRankAwardCell.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYRankAwardCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYRankAwardWin.cs 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYRankAwardWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYStoreWin.cs 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYStoreWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QYWin.cs 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Qunying/QunyingManager.cs 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Store/SkinStoreCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Store/SkinStoreLineCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Store/SkinStoreWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Store/StoreModel.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/TimeUtility.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs
@@ -9,5 +9,6 @@
        HA009_tagSCGameRecInfo vNetData = vNetPack as HA009_tagSCGameRecInfo;
        ArenaManager.Instance.UpdateGameRecInfo(vNetData);
        HeroDebutManager.Instance.UpdateGameRecInfo(vNetData);
        QunyingManager.Instance.UpdateGameRecInfo(vNetData);
    }
}
Main/System/BillboardRank/PlayerTop3Cell.cs
@@ -26,7 +26,22 @@
        }
        officialTitleCell.SetActive(true);
        //rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue2 + rankData.cmpValue * Constants.ExpPointValue));
        rankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue);
        if (rankType == QunyingManager.rankType)
        {
            //区服
            if (GeneralDefine.IsRobot((int)rankData.id))
            {
                rankValueText.text = Language.Get("Qunying15");
            }
            else
            {
                rankValueText.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(rankData.name2));
            }
        }
        else
        {
            rankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue);
        }
        nameText.text = rankData.name1;
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, rank == 1 ? 1f : 0.8f);
Main/System/GeneralConfig/GeneralDefine.cs
@@ -315,6 +315,12 @@
    public static long GetFactValue(uint value, uint valueEx)
    {
        return (long)valueEx * (long)Constants.ExpPointValue +(long)value;
        return (long)valueEx * (long)Constants.ExpPointValue + (long)value;
    }
    //约定:playerID<1000000为机器人 实际请参考机器人表
    public static bool IsRobot(int playerID)
    {
        return playerID < 1000000;
    }
}
Main/System/Qunying/QYAchievementCell.cs
New file
@@ -0,0 +1,76 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class QYAchievementCell : CellView
{
    [SerializeField] Text rankText;
    [SerializeField] Image rankImg;
    [SerializeField] ItemCell[] itemCells;
    [SerializeField] Transform notActiveText;
    [SerializeField] Button getBtn;
    [SerializeField] Transform finishImg;
    public void Display(int rank)
    {
        var rankAwards = QunyingManager.Instance.achievementAwards[rank];
        if (rank <= 3)
        {
            rankImg.SetActive(true);
            rankText.SetActive(false);
            rankImg.SetSprite($"Rank{rank}");
        }
        else
        {
            rankImg.SetActive(false);
            rankText.SetActive(true);
            rankText.text = rank.ToString();
        }
        for (int i = 0; i < itemCells.Length; i++)
        {
            var itemCell = itemCells[i];
            if (i < rankAwards.Length)
            {
                itemCell.SetActive(true);
                int itemID = rankAwards[i][0];
                itemCell.Init(new ItemCellModel(itemID, true, rankAwards[i][1]));
                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
            }
            else
            {
                itemCell.SetActive(false);
            }
        }
        var state = QunyingManager.Instance.GetAchievementState(rank);
        if (state == 1)
        {
            notActiveText.SetActive(false);
            getBtn.SetActive(true);
            finishImg.SetActive(false);
        }
        else if (state == 2)
        {
            notActiveText.SetActive(false);
            getBtn.SetActive(false);
            finishImg.SetActive(true);
        }
        else
        {
            notActiveText.SetActive(true);
            getBtn.SetActive(false);
            finishImg.SetActive(false);
        }
        getBtn.AddListener(() =>
        {
            var pack = new CA504_tagCMPlayerGetReward();
            pack.RewardType = 7;
            GameNetSystem.Instance.SendInfo(pack);
        });
    }
}
Main/System/Qunying/QYAchievementCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 367255ddd03841c48b32d105723c0c29
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Qunying/QYAchievementWin.cs
New file
@@ -0,0 +1,62 @@
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using LitJson;
using UnityEngine;
using UnityEngine.UI;
public class QYAchievementWin : UIBase
{
    [SerializeField] ScrollerController scroller;
    [SerializeField] Button closeBtn;
    protected override void InitComponent()
    {
        closeBtn.AddListener(() =>
        {
            CloseWindow();
        });
    }
    protected override void OnPreOpen()
    {
        scroller.OnRefreshCell += OnRefreshCell;
        QunyingManager.Instance.OnUpdateQunyingInfoEvent += OnUpdateQunyingInfo;
        scroller.Refresh();
        var keys = QunyingManager.Instance.achievementAwards.Keys.ToList();
        keys.Sort();
        int jumpIndex = 0;
        for (int i = 0; i < keys.Count; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, keys[i]);
            if (QunyingManager.Instance.GetAchievementState(keys[i]) == 1)
            {
                jumpIndex = i;
            }
        }
        scroller.Restart();
        scroller.JumpIndex(jumpIndex - 5);
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
        QunyingManager.Instance.OnUpdateQunyingInfoEvent -= OnUpdateQunyingInfo;
    }
    private void OnRefreshCell(ScrollerDataType type, CellView cellView)
    {
        var cell = cellView as QYAchievementCell;
        cell.Display(cell.index);
    }
    void OnUpdateQunyingInfo()
    {
        scroller.m_Scorller.RefreshActiveCellViews();
    }
}
Main/System/Qunying/QYAchievementWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5a46d946f42d0ae40929cfb07cc095a4
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Qunying/QYBattleFailWin.cs
@@ -70,9 +70,9 @@
    // itemInfo:奖励物品列表,可能为空
    void Display()
    {
        if (!jsonData.ContainsKey("tagID"))
        if (!jsonData.ContainsKey("tagPlayerID"))
            return;
        uint tagPlayerID = (uint)jsonData["tagID"];
        uint tagPlayerID = (uint)jsonData["tagPlayerID"];
        if (!QunyingManager.Instance.TryGetPlayerInfo(tagPlayerID, out QunyingMatchInfo info))
            return;
Main/System/Qunying/QYFighterCell.cs
@@ -42,7 +42,7 @@
        queryPlayerBtn.AddListener(() =>
        {
            if (matchInfo.PlayerID < 1000000) return;
            if (GeneralDefine.IsRobot((int)matchInfo.PlayerID)) return;
            AvatarHelper.TryViewOtherPlayerInfo((int)matchInfo.PlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
        });
@@ -122,7 +122,7 @@
        nameText.text = UIHelper.ServerStringTrim(matchInfo.PlayerName);
        if (matchInfo.ServerID == 0)
        if (GeneralDefine.IsRobot((int)matchInfo.PlayerID))
        {
            serverText.text = Language.Get("Qunying15");
        }
Main/System/Qunying/QYNoteCell.cs
New file
@@ -0,0 +1,74 @@
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;
public class QYNoteCell : CellView
{
    [SerializeField] ImageEx atkTypeImg;
    [SerializeField] Text atkTypeTxt;
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] TextEx lvTxt;
    [SerializeField] TextEx nameTxt;
    [SerializeField] TextEx rankTxt;
    [SerializeField] TextEx serverTxt;
    [SerializeField] Image stateImg;    //胜负
    [SerializeField] AvatarCell tagAvatarCell;
    [SerializeField] TextEx tagLVTxt;
    [SerializeField] TextEx tagNameTxt;
    [SerializeField] TextEx tagRankTxt;
    [SerializeField] TextEx tagServerTxt;
    [SerializeField] Image tagStateImg;
    // [SerializeField] ButtonEx replayBtn; //需要GUID
    QunyingGameRec arenaGameRec;
    public void Display(int index)
    {
        uint playerID = PlayerDatas.Instance.baseData.PlayerID;
        QunyingManager.Instance.TryGetSortedGameRecList(playerID, out List<QunyingGameRec> sortedList);
        if (sortedList.IsNullOrEmpty() || index < 0 || index >= sortedList.Count)
            return;
        arenaGameRec = sortedList[index];
        atkTypeImg.SetSprite("QYAtkType" + arenaGameRec.Value2);
        atkTypeTxt.text = arenaGameRec.Value2 == 1 ? Language.Get("mainui2") : Language.Get("herocard28");
        //取玩家自己的数据
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                        PlayerDatas.Instance.baseData.face,
                                        PlayerDatas.Instance.baseData.facePic));
        lvTxt.text = PlayerDatas.Instance.baseData.LV.ToString();
        nameTxt.text = PlayerDatas.Instance.baseData.PlayerName;
        serverTxt.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID));
        stateImg.SetSprite("QYResult" + (arenaGameRec.Value4 == 1 ? 1 : 2));
        rankTxt.text = Language.Get("Qunying20") + arenaGameRec.CurRank;
        tagAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6));
        tagAvatarCell.SetListener(() =>
        {
            if (GeneralDefine.IsRobot((int)arenaGameRec.Value3)) return;
            AvatarHelper.TryViewOtherPlayerInfo((int)arenaGameRec.Value3, viewPlayerLineupType: (int)BattlePreSetType.Arena);
        });
        tagLVTxt.text = arenaGameRec.Value8.ToString();
        tagNameTxt.text = arenaGameRec.Name;
        if (GeneralDefine.IsRobot((int)arenaGameRec.Value3))
        {
            tagServerTxt.text = Language.Get("Qunying15");
        }
        else
        {
            tagServerTxt.text = ServerListCenter.Instance.GetServerName((int)arenaGameRec.Value1);
        }
        tagRankTxt.text = Language.Get("Qunying20") + arenaGameRec.TagRank;
        tagStateImg.SetSprite("QYResult" + (arenaGameRec.Value4 == 1 ? 2 : 1));
    }
}
Main/System/Qunying/QYNoteCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fd46d4292beb1db4589734bcafc14387
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Qunying/QYNoteWin.cs
New file
@@ -0,0 +1,63 @@
using System.Collections.Generic;
using UnityEngine;
public class QYNoteWin : UIBase
{
    [SerializeField] ScrollerController scrollerController;
    protected override void OnPreOpen()
    {
        SendRec();
        scrollerController.OnRefreshCell += OnRefreshCell;
        QunyingManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
        Display();
    }
    protected override void OnPreClose()
    {
        scrollerController.OnRefreshCell -= OnRefreshCell;
        QunyingManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
    }
    private void OnUpdateGameRecInfo()
    {
        Display();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<QYNoteCell>();
        _cell?.Display(cell.index);
    }
    private void CreateScroller()
    {
        scrollerController.Refresh();
        uint playerID = PlayerDatas.Instance.baseData.PlayerID;
        QunyingManager.Instance.TryGetSortedGameRecList(playerID, out List<QunyingGameRec> sortedList);
        if (!sortedList.IsNullOrEmpty())
        {
            for (int i = 0; i < sortedList.Count; i++)
            {
                scrollerController.AddCell(ScrollerDataType.Header, i);
            }
        }
        scrollerController.Restart();
    }
    void Display()
    {
        CreateScroller();
    }
    void SendRec()
    {
        CA008_tagCSViewGameRec pack = new CA008_tagCSViewGameRec();
        pack.RecType = 312;
        pack.RecID = PlayerDatas.Instance.baseData.PlayerID;
        GameNetSystem.Instance.SendInfo(pack);
    }
}
Main/System/Qunying/QYNoteWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b8031772edc07284dac0925efb26aaf7
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Qunying/QYPlayerTop3Cell.cs
@@ -24,8 +24,7 @@
            return;
        }
        officialTitleCell.SetActive(true);
        var sid = UIHelper.GetServerIDByAccount(rankData.name2);
        if (sid == 0)
        if (GeneralDefine.IsRobot((int)rankData.id))
        {
            serverText.text = Language.Get("Qunying15");
        }
@@ -39,7 +38,7 @@
        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, 0.9f);
        queryPlayerBtn.SetListener(() =>
        {
            if (rankData.id < 1000000) return;
            if (GeneralDefine.IsRobot((int)rankData.id)) return;
            AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
        });
        fightPowerText.text = UIHelper.ReplaceLargeArtNum(rankData.fightPower);
Main/System/Qunying/QYRankAwardCell.cs
New file
@@ -0,0 +1,54 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class QYRankAwardCell : CellView
{
    [SerializeField] ImageEx imgRank;
    [SerializeField] TextEx txtRank;
    [SerializeField] ItemCell[] itemCells;
    public void Display(int index, int order)
    {
        Dictionary<int, int[][]> rewardDict = QunyingManager.Instance.GetRankAwardDict(order);
        if (rewardDict.IsNullOrEmpty())
            return;
        var list = rewardDict.Keys.ToList();
        list.Sort();
        int rank = list[index];
        if (rank <= 3)
        {
            imgRank.SetActive(true);
            txtRank.SetActive(false);
            imgRank.SetSprite($"Rank{rank}");
            txtRank.text = rank.ToString();
        }
        else
        {
            imgRank.SetActive(false);
            txtRank.SetActive(true);
            int lastIndex = index - 1;
            txtRank.text = lastIndex > 0 && lastIndex < list.Count ? Language.Get("Arena15", list[lastIndex] + 1, rank) : string.Empty;
        }
        int key = list[index];
        int[][] rewardArr = rewardDict[key];
        for (int i = 0; i < itemCells.Length; i++)
        {
            var itemCell = itemCells[i];
            if (!rewardArr.IsNullOrEmpty() && i < rewardArr.Length)
            {
                int itemCellIndex = i;
                itemCell.SetActive(true);
                itemCell.Init(new ItemCellModel(rewardArr[i][0], true, rewardArr[i][1]));
                itemCell.button.SetListener(() => ItemTipUtility.Show(rewardArr[itemCellIndex][0]));
            }
            else
            {
                itemCell.SetActive(false);
            }
        }
    }
}
Main/System/Qunying/QYRankAwardCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2b2a9b63aec1f704190eeccbb5a7228b
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Qunying/QYRankAwardWin.cs
New file
@@ -0,0 +1,140 @@
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class QYRankAwardWin : UIBase
{
    [SerializeField] Text titleText;
    [SerializeField] ScrollerController scroller;
    [SerializeField] Text myRankText;
    [SerializeField] ItemCell[] itemCells;
    [SerializeField] Transform unRankText;
    [SerializeField] Text noAwardText;
    [SerializeField] Text timeText;
    [SerializeField] GroupButtonEx weekBtn;
    [SerializeField] GroupButtonEx dayBtn;
    protected override void InitComponent()
    {
        weekBtn.AddListener(()=>
        {
            functionOrder = 0;
            Display();
        });
        dayBtn.AddListener(()=>
        {
            functionOrder = 1;
            Display();
        });
    }
    protected override void OnPreOpen()
    {
        if (functionOrder == 0)
        {
            weekBtn.SelectBtn();
        }
        else
        {
            dayBtn.SelectBtn();
        }
        scroller.OnRefreshCell += OnRefreshCell;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        Display();
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
    }
    private void OnRefreshCell(ScrollerDataType type, CellView cellView)
    {
        var cell = cellView as QYRankAwardCell;
        cell.Display(cell.index, functionOrder);
    }
    private void OnSecondEvent()
    {
        if (functionOrder == 0)
        {
            timeText.text = Language.Get("Arena14", QunyingManager.Instance.GetEndSecondStr());
        }
        else
        {
            timeText.text = Language.Get("Arena14", TimeUtility.SecondsToDHMS((int)(TimeUtility.GetCommTodayEndTime(0) -
                            TimeUtility.GetCommServerNow(GuildManager.Instance.zoneID)).TotalSeconds));
        }
    }
    void Display()
    {
        scroller.Refresh();
        if (functionOrder == 1)
        {
            titleText.text = Language.Get("Qunying18");
        }
        else
        {
            titleText.text = Language.Get("Qunying19");
        }
        var keys = QunyingManager.Instance.GetRankAwardDict(functionOrder).Keys.ToList();
        keys.Sort();
        for (int i = 0; i < keys.Count; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, i);
        }
        scroller.Restart();
        OnSecondEvent();
        var myMatch = QunyingManager.Instance.GetMyMatchInfo(out var index);
        if (myMatch != null)
        {
            myRankText.SetActive(true);
            unRankText.SetActive(false);
            myRankText.text = myMatch.Rank.ToString();
            var awards = QunyingManager.Instance.GetMyRankAwards(functionOrder, myMatch.Rank);
            if (awards.IsNullOrEmpty())
            {
                noAwardText.SetActive(true);
                for (int i = 0; i < itemCells.Length; i++)
                {
                    itemCells[i].SetActive(false);
                }
            }
            else
            {
                noAwardText.SetActive(false);
                for (int i = 0; i < itemCells.Length; i++)
                {
                    if (i < awards.Length)
                    {
                        itemCells[i].SetActive(true);
                        int itemID = awards[i][0];
                        itemCells[i].Init(new ItemCellModel(itemID, false, awards[i][1]));
                        itemCells[i].button.SetListener(() => ItemTipUtility.Show(itemID));
                    }
                    else
                    {
                        itemCells[i].SetActive(false);
                    }
                }
            }
        }
        else
        {
            myRankText.SetActive(false);
            unRankText.SetActive(true);
            noAwardText.SetActive(true);
        }
    }
}
Main/System/Qunying/QYRankAwardWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 40adbfa987c6b18468007c00c7d14d4e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Qunying/QYStoreWin.cs
New file
@@ -0,0 +1,73 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class QYStoreWin : UIBase
{
    [SerializeField] ScrollerController scroller;
    protected override void OnPreOpen()
    {
        StoreModel.Instance.selectStoreFuncType = StoreFunc.Qunying;
        scroller.OnRefreshCell += OnRefreshCell;
        StoreModel.Instance.RefreshShopEvent += Display;
        StoreModel.Instance.RefreshBuyShopLimitEvent += Display;
        Display();
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
        StoreModel.Instance.RefreshShopEvent -= Display;
        StoreModel.Instance.RefreshBuyShopLimitEvent -= Display;
    }
    void Display()
    {
        CreateScroller();
    }
    void CreateScroller()
    {
        if (!StoreModel.Instance.storeTypeDict.ContainsKey((int)StoreModel.Instance.selectStoreFuncType))
        {
            return;
        }
        scroller.Refresh();
        int jumpIndex = -1;
        var list = StoreModel.Instance.storeTypeDict[(int)StoreModel.Instance.selectStoreFuncType];
        for (int i = 0; i < list.Count; i++)
        {
            if (i % 3 == 0)
            {
                scroller.AddCell(ScrollerDataType.Header, i);
            }
            if (jumpIndex == -1 && list[i].shopId == StoreModel.Instance.jumpShopID)
            {
                jumpIndex = i / 3;
            }
        }
        scroller.Restart();
        scroller.lockType = EnhanceLockType.KeepVertical;
        if (StoreModel.Instance.jumpShopID != 0)
        {
            scroller.JumpIndex(jumpIndex);
            StoreModel.Instance.jumpShopID = 0;
        }
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as StoreLineCell;
        _cell.Display(cell.index);
    }
}
Main/System/Qunying/QYStoreWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 47a5fdf362707eb469b6cab4d016a64b
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Qunying/QYWin.cs
@@ -13,9 +13,68 @@
    [SerializeField] ScrollRect battleScrollRect;
    [SerializeField] Button closeBtn;
    [SerializeField] Text gameTimeText;
    [SerializeField] Button buyTicketBtn;
    [SerializeField] Text ticketCountText;
    [SerializeField] Text ticketTimeText;
    [SerializeField] Button achievementBtn;
    [SerializeField] Text achievementTargetText;
    [SerializeField] Text rankText;
    [SerializeField] Button defentPosBtn;
    [SerializeField] Button attackPosBtn;
    [SerializeField] Button refreshBtn;
    [SerializeField] Text refreshMoneyText;
    [SerializeField] Image refreshMoneyImg;
    [SerializeField] Text refreshCntText;
    [SerializeField] Button storeBtn;
    [SerializeField] Button rankBtn;
    [SerializeField] Button awardBtn;
    [SerializeField] Button noteBtn;
    protected override void InitComponent()
    {
        closeBtn.AddListener(CloseWindow);
        buyTicketBtn.AddListener(() =>
        {
            StoreModel.Instance.ShowBuyItem(QunyingManager.challengeShopID);
        });
        achievementBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<QYAchievementWin>();
        });
        defentPosBtn.AddListener(() =>
        {
            FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.Qunying);
        });
        attackPosBtn.AddListener(() =>
        {
            FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.Story);
        });
        refreshBtn.AddListener(() =>
        {
            RefreshFighters();
        });
        storeBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<QYStoreWin>();
        });
        rankBtn.AddListener(() =>
        {
            RankModel.Instance.ResetQueryParam();
            RankModel.Instance.QueryRankByPage(QunyingManager.rankType);
            UIManager.Instance.OpenWindow<PlayerRankWin>(QunyingManager.rankType);
        });
        awardBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<QYRankAwardWin>(1);
        });
        noteBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<QYNoteWin>();
        });
    }
    protected override void OnPreOpen()
@@ -35,6 +94,9 @@
        RankModel.Instance.onRankRefresh += OnRankRefresh;
        QunyingManager.Instance.OnMatchListEvent += OnMatchListEvent;
        PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefresh;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        QunyingManager.Instance.OnUpdateQunyingInfoEvent += OnUpdateQunyingInfoEvent;
        Display();
    }
@@ -64,14 +126,45 @@
    {
        RankModel.Instance.onRankRefresh -= OnRankRefresh;
        QunyingManager.Instance.OnMatchListEvent -= OnMatchListEvent;
        PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
        QunyingManager.Instance.OnUpdateQunyingInfoEvent -= OnUpdateQunyingInfoEvent;
        QunyingManager.Instance.openQYWinNeedRoll = true;
    }
    void OnSecondEvent()
    {
        ShowGameTime();
    }
    void Display()
    {
        DisplayFighers();
        DisplayPlayerTop3();
        ShowGameTime();
        ShowTicketCnt();
        OnUpdateQunyingInfoEvent();
    }
    //活动时间
    void ShowGameTime()
    {
        gameTimeText.text = QunyingManager.Instance.GetEndSecondStr();
        if (QunyingManager.Instance.m_LastRecoverTime == 0)
        {
            ticketTimeText.text = "";
        }
        else
        {
            ticketTimeText.text = Language.Get("Qunying6", TimeUtility.SecondsToDHMS(QunyingManager.Instance.restoreTicketMinute * 60 - (TimeUtility.GetCommServerTick() - (int)QunyingManager.Instance.m_LastRecoverTime)));
        }
    }
    void ShowTicketCnt()
    {
        ticketCountText.text = UIHelper.GetMoneyCnt(QunyingManager.challengeMoneyType) + "/" + QunyingManager.Instance.challengeMaxCnt;
    }
@@ -83,11 +176,37 @@
        }
    }
    void OnPlayerDataRefresh(PlayerDataType type)
    {
        if (type == PlayerDataType.QunyingWDL)
        {
            DisplayFighers();
            ShowTicketCnt();
        }
    }
    void OnRankRefresh(int type)
    {
        if (type != QunyingManager.rankType)
            return;
        DisplayPlayerTop3();
    }
    void OnUpdateQunyingInfoEvent()
    {
        var nextRank = QunyingManager.Instance.GetNextAchievementRank();
        if (nextRank == 0)
        {
            achievementTargetText.text = Language.Get("Qunying17");
        }
        else
        {
            achievementTargetText.text = Language.Get("Qunying4", nextRank);
        }
        refreshMoneyText.text = UIHelper.ShowUseMoney(QunyingManager.Instance.refreshMoneyType, QunyingManager.Instance.refreshMoneyValue);
        refreshMoneyImg.SetIconWithMoneyType(QunyingManager.Instance.refreshMoneyType);
        refreshCntText.text = QunyingManager.Instance.m_RefreshCnt + "/" + QunyingManager.Instance.refreshMaxCnt;
    }
    void DisplayFighers()
@@ -101,14 +220,40 @@
    void OnMatchListEvent()
    {
        //滚动到自己的位置
        var myMatch = QunyingManager.Instance.GetMyMatchInfo(out int index);
        if (QunyingManager.Instance.openQYWinNeedRoll)
        {
            var myMatch = QunyingManager.Instance.GetMyMatchInfo(out int index);
            SmoothScrollToBottom(myMatch == null ? 0.1f : (4 - index) * 0.15f + 0f).Forget();
        }
        if (myMatch != null)
        {
            rankText.text = Language.Get("Qunying5", myMatch.Rank);
        }
        else
        {
            rankText.text = Language.Get("L1045");
        }
        DisplayFighers();
    }
    void RefreshFighters()
    {
        //验证钱和次数
        if (!UIHelper.CheckMoneyCount(QunyingManager.Instance.refreshMoneyType, QunyingManager.Instance.refreshMoneyValue, 1))
        {
            return;
        }
        if (QunyingManager.Instance.m_RefreshCnt >= QunyingManager.Instance.refreshMaxCnt)
        {
            SysNotifyMgr.Instance.ShowTip("Qunying1");
            return;
        }
        QunyingManager.Instance.RequestRefreshFighters(1);
    }
}
Main/System/Qunying/QunyingManager.cs
@@ -2,10 +2,11 @@
using UnityEngine;
using LitJson;
using System;
using System.Linq;
public class QunyingManager : GameSystemManager<QunyingManager>
{
    public const int challengeMoneyType = 56;
    public const int challengeMoneyType = 56;   //挑战 问鼎令
    public const int challengeShopID = 16;
    public const int rankType = 10;
    public const int recType = 312;  // 挑战记录类型 
@@ -15,13 +16,19 @@
    public List<QunyingMatchInfo> matchInfoList = new List<QunyingMatchInfo>();
    //用于用来拿战斗胜利失败的头像信息
    public Dictionary<uint, QunyingMatchInfo> allFaceInfoDict = new Dictionary<uint, QunyingMatchInfo>();
    public Dictionary<uint, List<QunyingGameRec>> gameRecDict = new Dictionary<uint, List<QunyingGameRec>>(); // <RecID,QunyingGameRec>
    public Dictionary<uint, List<QunyingGameRec>> gameRecDict = new Dictionary<uint, List<QunyingGameRec>>(); // <玩家ID,QunyingGameRec>
    public uint atkPlayerId;
    public int tagRank; //挑战目标的排名 结果显示用
    public event Action OnUpdateGameRecInfo;
    public bool openQYWinNeedRoll = true; //打开群英界面需要滚动的情况
    public uint m_RefreshCnt;    // 本周已刷新匹配次数
    public uint m_LastRecoverTime;    // 上次免费恢复挑战令时间戳,为0时可不用倒计时
    public ushort m_RankHighest;    // 历史最高名次,第1名为最高
    public uint m_RankSuccAward;    // 历史最高名次成就领奖记录,按奖励记录索引位运算记录是否已领取
    public event Action OnUpdateQunyingInfoEvent;
    public override void Init()
@@ -48,7 +55,7 @@
    public Dictionary<int, int[][]> weekRankAwards = new Dictionary<int, int[][]>();
    public Dictionary<int, int[][]> achievementAwards = new Dictionary<int, int[][]>();
    public Dictionary<int, int> achievementIndexs = new Dictionary<int, int>();
    void InitTable()
    {
        var config = FuncConfigConfig.Get("QunyingSet");
@@ -76,16 +83,15 @@
    {
        matchInfoList.Clear();
    }
    private void PlayerDataRefresh(PlayerDataType type)
    {
        UpdateRedPonit();
        if (type == PlayerDataType.QunyingWDL)
        {
            UpdateRedPonit();
        }
    }
    public void UpdateRedPonit()
    {
    }
    public void UpdateQunyingMatchInfo(HA924_tagSCQunyingMatchList vNetData)
@@ -116,12 +122,20 @@
            allFaceInfoDict[item.PlayerID] = matchInfo;
        }
        matchInfoList.Sort((a, b) => a.Rank.CompareTo(b.Rank));
        UpdateRedPonit();
        OnMatchListEvent?.Invoke();
    }
    public void UpdateQunyingInfo(HA925_tagSCQunyingPlayerInfo vNetData)
    {
        m_RefreshCnt = vNetData.RefreshCnt;
        m_LastRecoverTime = vNetData.LastRecoverTime;
        m_RankHighest = vNetData.RankHighest;
        m_RankSuccAward = vNetData.RankSuccAward;
        UpdateRedPonit();
        OnUpdateQunyingInfoEvent?.Invoke();
    }
    public void UpdateGameRecInfo(HA009_tagSCGameRecInfo vNetData)
@@ -265,15 +279,137 @@
        //判断功能开启天是否在当前周内
        isThisWeek = openFuncDay >= currentWeekStart && openFuncDay <= currentWeekEnd;
        if (isThisWeek)
        {
            weekDay = openFuncDay - currentWeekStart + 1;
        }
        return true;
    }
    public string GetEndSecondStr()
    {
        TryGetOpenWeek(out bool isThisWeek, out int openWeekDay);
        if (isThisWeek && resetOpenDay - FuncOpenLVConfig.Get((int)FuncOpenEnum.Qunying).OpenDay - 1 > 7 - openWeekDay)
        {
            //本周开启时间不足 则和下周的合并
            return TimeUtility.SecondsToDHMS(TimeUtility.GetCommonWeekEndTime() + 7 * 24 * 60 * 60);
        }
        else
        {
            return  TimeUtility.SecondsToDHMS(TimeUtility.GetCommonWeekEndTime());
        }
    }
    //获取下一个成就的排名奖励
    //0 没有下一个 最高
    public int GetNextAchievementRank()
    {
        var keys = achievementAwards.Keys.ToList();
        if (m_RankHighest == 0)
            return keys[keys.Count - 1];
        keys.Sort();
        for (int i = 0; i < keys.Count; i++)
        {
            if (m_RankHighest <= keys[i])
            {
                if (i == 0)
                {
                    return 0;
                }
                return keys[i - 1];
            }
        }
        return keys[keys.Count - 1];
    }
    //0 未达成 1 达成 2 已领取
    public int GetAchievementState(int rank)
    {
        if (m_RankHighest == 0)
            return 0;
        if (m_RankHighest > rank)
            return 0;
        var awardIndex = achievementIndexs[rank];
        bool isGot = (m_RankSuccAward & (1 << awardIndex)) != 0;
        return isGot ? 2 : 1;
    }
    public Dictionary<int, int[][]> GetRankAwardDict(int functionOrder)
    {
        return functionOrder == 0 ? weekRankAwards : dayRankAwards;
    }
    public int[][] GetMyRankAwards(int functionOrder, int rank)
    {
        if (rank == 0)
        {
            return null;
        }
        var awardDict = GetRankAwardDict(functionOrder);
        var keys = awardDict.Keys.ToList();
        keys.Sort();
        for (int i = 0; i < keys.Count; i++)
        {
            if (rank <= keys[i])
            {
                return awardDict[keys[i]];
            }
        }
        return null;
    }
    /// <summary>
    /// 根据recID获取按时间从大到小排序的List<QunyingGameRec>
    /// </summary>
    /// <param name="recID">记录ID</param>
    /// <param name="sortedList">输出参数:按时间从大到小排序的QunyingGameRec列表</param>
    /// <returns>如果recID存在且成功获取列表返回true,否则返回false</returns>
    public bool TryGetSortedGameRecList(uint recID, out List<QunyingGameRec> sortedList)
    {
        sortedList = null;
        if (!gameRecDict.ContainsKey(recID))
            return false;
        sortedList = new List<QunyingGameRec>(gameRecDict[recID]);
        sortedList.Sort((a, b) => b.Time.CompareTo(a.Time)); // 按时间从大到小排序
        return true;
    }
    #region 红点
    public Redpoint parentRedpoint = new Redpoint(MainRedDot.Qunying);
    Redpoint awardRedpoint = new Redpoint(MainRedDot.Qunying, MainRedDot.Qunying * 10 + 1);
    Redpoint matchRedpoint = new Redpoint(MainRedDot.Qunying, MainRedDot.Qunying * 10 + 2);
    public void UpdateRedPonit()
    {
        awardRedpoint.state = RedPointState.None;
        matchRedpoint.state = RedPointState.None;
        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Qunying))
        {
            return;
        }
        var keys = achievementAwards.Keys.ToList();
        for (int i = 0; i < keys.Count; i++)
        {
            if (GetAchievementState(keys[i]) == 1)
            {
                awardRedpoint.state = RedPointState.Simple;
                break;
            }
        }
        if (UIHelper.GetMoneyCnt(challengeMoneyType) >= challengeMaxCnt)
        {
            matchRedpoint.state = RedPointState.Simple;
        }
    }
    #endregion
}
public class QunyingMatchInfo
@@ -297,7 +433,7 @@
public class QunyingGameRec
{
    public uint Time;        //战斗时间戳
    public uint Value1;        //无
    public uint Value1;        //sid
    public uint Value2;        //攻击类型 1-发起攻击的,2-被攻击的
    public uint Value3;        //相对攻击类型的目标玩家ID
    public uint Value4;        //是否获胜 1-获胜;2-失败
Main/System/Store/SkinStoreCell.cs
@@ -19,7 +19,7 @@
    public void Display(int index)
    {
        var list = StoreModel.Instance.storeTypeDict[StoreModel.skinStoreType];
        var list = StoreModel.Instance.storeTypeDict[(int)StoreFunc.HeroSkin];
        var storeData = list[index];
        int shopID = storeData.shopId;
        var itemID = storeData.storeConfig.ItemID;
Main/System/Store/SkinStoreLineCell.cs
@@ -10,7 +10,7 @@
    public void Display(int index)
    {
        var list = StoreModel.Instance.storeTypeDict[StoreModel.skinStoreType];
        var list = StoreModel.Instance.storeTypeDict[(int)StoreFunc.HeroSkin];
        for (int i = 0; i < storeCells.Length; i++)
        {
Main/System/Store/SkinStoreWin.cs
@@ -48,14 +48,14 @@
    void CreateScroller()
    {
        if (!StoreModel.Instance.storeTypeDict.ContainsKey(StoreModel.skinStoreType))
        if (!StoreModel.Instance.storeTypeDict.ContainsKey((int)StoreFunc.HeroSkin))
        {
            return;
        }
        int jumpIndex = -1;
        scroller.Refresh();
        var list = StoreModel.Instance.storeTypeDict[StoreModel.skinStoreType];
        var list = StoreModel.Instance.storeTypeDict[(int)StoreFunc.HeroSkin];
        for (int i = 0; i < list.Count; i++)
        {
            if (i % 4 == 0)
Main/System/Store/StoreModel.cs
@@ -41,7 +41,7 @@
    public Dictionary<int, List<int>> freeShopDict = new Dictionary<int, List<int>>();  //免费商品 商店类型:商品列表
    public Dictionary<int, int> shopMoneyTypeDict = new Dictionary<int, int>();
    public const int skinStoreType = 16;
    public override void Init()
    {
@@ -621,9 +621,11 @@
    DailySpecialsFree = 8, //8: 每日特惠-每日特惠免费
    DailyGiftFree = 9, //9: 每日特惠-每日礼包免费
    WeeklyGiftFree = 10, //10: 每日特惠-每周礼包免费
    HeroSkin = 16, //16: 时装商店
    OSBeautyMM = 17, //17: 红颜冲榜礼包
    OSHeroTrain = 18, //18: 武将冲榜礼包
    OSMingge = 19, //19: 命格冲榜礼包
    Qunying = 20, //20: 群英积分商店
}
Main/Utility/TimeUtility.cs
@@ -132,7 +132,7 @@
    //开服时间戳
    public static int openServerTick
        {
    {
        get; private set;
    }
@@ -412,7 +412,7 @@
            return StringUtility.Concat(hours.ToString(), Language.Get("L1072"), mins.ToString(), Language.Get("L1073"));
        }
        else if (mins > 0)
        {
        {
            return StringUtility.Concat(mins.ToString(), Language.Get("L1073"));
        }
        return StringUtility.Concat(seconds.ToString(), Language.Get("L1075"));
@@ -518,7 +518,7 @@
    }
    // 今日到x点还要多少秒,如果已经过了x点,返回0
    public static int GetToTheHourSeconds(int hour=10)
    public static int GetToTheHourSeconds(int hour = 10)
    {
        var now = ServerNow;
        if (now.Hour < hour)
@@ -588,5 +588,21 @@
        var now = GetCommServerNow(zoneID).AddDays(1);
        return new DateTime(now.Year, now.Month, now.Day);
    }
    //获取当前周几,1-7
    public static int GetCommonWeekday(int zoneID = 0)
    {
        var day = GetCommServerNow(zoneID).DayOfWeek;
        return day == DayOfWeek.Sunday ? 7 : (int)day;
    }
    //本周结束时间 秒
    public static int GetCommonWeekEndTime(int zoneID = 0)
    {
        var now = GetCommServerNow(zoneID);
        var weekDay = GetCommonWeekday(zoneID);
        var endDay = now.AddDays(7 - weekDay + 1);
        return (int)(new DateTime(endDay.Year, endDay.Month, endDay.Day) - now).TotalSeconds;
    }
    #endregion
}