lcy
3 天以前 247c64258e0102a1028199f14866a1fd1c1a205f
143 子 【挑战】演武场 / 【挑战】演武场-客户端
11个文件已修改
53个文件已添加
2692 ■■■■■ 已修改文件
Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Main.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena.meta 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardCell.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardWin.cs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleFailWin.cs 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleFailWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleVictoryWin.cs 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleVictoryWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeCell.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeVoucher.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeVoucher.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeWin.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaHeroHead.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaHeroHead.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaManager.cs 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaManager.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerRankCell.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerRankCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerTop3Cell.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerTop3Cell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordCell.cs 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordWin.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaWin.cs 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/BuyItemWin.cs 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/BuyItemWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/HeroCountryComponent.cs 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/HeroCountryComponent.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/ArenaBattleWin.cs 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/ArenaBattleWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleConst.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/ArenaBattleField.cs 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/ArenaBattleField.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleFieldFactory.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerTop3Cell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ChallengeTab/ChallengeTabWin.cs 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Redpoint/MainRedDot.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/EnumHelper.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/UIHelper.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs
New file
@@ -0,0 +1,20 @@
using UnityEngine;
using System.Collections;
// A0 08 查看通用记录 #tagCSViewGameRec
public class CA008_tagCSViewGameRec : GameNetPackBasic {
    public ushort RecType;    //记录类型
    public uint RecID;    //自定义记录ID
    public CA008_tagCSViewGameRec () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xA008;
    }
    public override void WriteToBytes () {
        WriteBytes (RecType, NetDataType.WORD);
        WriteBytes (RecID, NetDataType.DWORD);
    }
}
Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b6a48b9769ab25a47adb4313ea3e1711
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
@@ -1,21 +1,18 @@
using UnityEngine;
using System.Collections;
//A2 12 查看玩家详细信息#tagCMViewPlayerInfo
//A2 12 查看玩家详细信息#tagCMViewPlayerInfo
public class CA212_tagCMViewPlayerInfo : GameNetPackBasic
{
public class CA212_tagCMViewPlayerInfo : GameNetPackBasic {
    public uint PlayerID;
    public byte EquipClassLV;    //大于0为查看指定境界阶装备信息,  0为查看默认信息
    public byte EquipClassLV;    //大于0为查看指定境界阶装备信息,  0为查看默认信息
    public CA212_tagCMViewPlayerInfo()
    {
    public CA212_tagCMViewPlayerInfo () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xA212;
    }
    public override void WriteToBytes()
    {
    public override void WriteToBytes () {
        WriteBytes(PlayerID, NetDataType.DWORD);
        WriteBytes(EquipClassLV, NetDataType.BYTE);
    }
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs
New file
@@ -0,0 +1,18 @@
using UnityEngine;
using System.Collections;
// B2 09 演武场匹配玩家 #tagCSArenaMatch
public class CB209_tagCSArenaMatch : GameNetPackBasic {
    public byte IsRefresh;    // 0-打开界面无匹配数据时查询,1-强制刷新匹配列表
    public CB209_tagCSArenaMatch () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xB209;
    }
    public override void WriteToBytes () {
        WriteBytes (IsRefresh, NetDataType.BYTE);
    }
}
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e768d709b4503ed47a18dad52f32422e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs
New file
@@ -0,0 +1,12 @@
using UnityEngine;
using System.Collections;
// A0 09 通用记录信息 #tagSCGameRecInfo
public class DTCA009_tagSCGameRecInfo : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA009_tagSCGameRecInfo vNetData = vNetPack as HA009_tagSCGameRecInfo;
        ArenaManager.Instance.UpdateGameRecInfo(vNetData);
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ef9a2a1877a033e4198a1343e4eb8dea
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs
New file
@@ -0,0 +1,12 @@
using UnityEngine;
using System.Collections;
// A9 22 演武场匹配玩家列表 #tagSCArenaMatchList
public class DTCA922_tagSCArenaMatchList : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA922_tagSCArenaMatchList vNetData = vNetPack as HA922_tagSCArenaMatchList;
        ArenaManager.Instance.OnArenaMatchList(vNetData);
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3018194b7bdafa24c9855f1880bb15a2
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs
New file
@@ -0,0 +1,12 @@
using UnityEngine;
using System.Collections;
// A9 23 演武场玩家信息 #tagSCArenaPlayerInfo
public class DTCA923_tagSCArenaPlayerInfo : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA923_tagSCArenaPlayerInfo vNetData = vNetPack as HA923_tagSCArenaPlayerInfo;
        ArenaManager.Instance.UpdateArenaPlayerInfo(vNetData);
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fe3971f96b149f14b8adf6e9c4e1ba5f
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -113,7 +113,9 @@
        Register(typeof(HA521_tagMCFamilyChange), typeof(DTCA521_tagMCFamilyChange));
        Register(typeof(HA522_tagMCFamilyReqJoinInfo), typeof(DTCA522_tagMCFamilyReqJoinInfo));
        Register(typeof(HA523_tagMCFamilyViewList), typeof(DTCA523_tagMCFamilyViewList));
        Register(typeof(HA009_tagSCGameRecInfo), typeof(DTCA009_tagSCGameRecInfo));
        Register(typeof(HA922_tagSCArenaMatchList), typeof(DTCA922_tagSCArenaMatchList));
        Register(typeof(HA923_tagSCArenaPlayerInfo), typeof(DTCA923_tagSCArenaPlayerInfo));
    }
    //主工程注册封包
Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs
New file
@@ -0,0 +1,51 @@
using UnityEngine;
using System.Collections;
// A0 09 通用记录信息 #tagSCGameRecInfo
public class HA009_tagSCGameRecInfo : GameNetPackBasic {
    public ushort RecType;    //记录类型
    public uint RecID;    //自定义记录ID
    public ushort Count;    //数量
    public  tagSCGameRec[] RecList;
    public HA009_tagSCGameRecInfo () {
        _cmd = (ushort)0xA009;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out RecType, vBytes, NetDataType.WORD);
        TransBytes (out RecID, vBytes, NetDataType.DWORD);
        TransBytes (out Count, vBytes, NetDataType.WORD);
        RecList = new tagSCGameRec[Count];
        for (int i = 0; i < Count; i ++) {
            RecList[i] = new tagSCGameRec();
            TransBytes (out RecList[i].Time, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value1, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value2, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value3, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value4, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value5, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value6, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value7, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].Value8, vBytes, NetDataType.DWORD);
            TransBytes (out RecList[i].UserDataLen, vBytes, NetDataType.WORD);
            TransBytes (out RecList[i].UserData, vBytes, NetDataType.Chars, RecList[i].UserDataLen);
        }
    }
    public class tagSCGameRec {
        public uint Time;        //时间
        public uint Value1;        //值1
        public uint Value2;        //值2
        public uint Value3;        //值3
        public uint Value4;        //值4
        public uint Value5;        //值5
        public uint Value6;        //值6
        public uint Value7;        //值7
        public uint Value8;        //值8
        public ushort UserDataLen;        //扩展数据长度
        public string UserData;        //扩展数据
    }
}
Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 77ee48f6b77c0f34499e2cbd2546a944
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA705_tagSCQueryPlayerCacheResult.cs
@@ -11,6 +11,7 @@
    public byte RealmLV;
    public uint Face;
    public uint FacePic;
    public uint ModelMark;    //变形模型mark
    public uint TitleID;    //佩戴的称号
    public uint ServerID;
    public uint FightPower;
@@ -18,6 +19,7 @@
    public uint FamilyID;
    public string FamilyName;
    public uint FamilyEmblemID;    //仙盟徽章ID
    public string FamilyEmblemWord;    //徽章文字
    public uint PlusDataSize;
    public string PlusData;    //扩展记录    
@@ -33,6 +35,7 @@
        TransBytes (out RealmLV, vBytes, NetDataType.BYTE);
        TransBytes (out Face, vBytes, NetDataType.DWORD);
        TransBytes (out FacePic, vBytes, NetDataType.DWORD);
        TransBytes (out ModelMark, vBytes, NetDataType.DWORD);
        TransBytes (out TitleID, vBytes, NetDataType.DWORD);
        TransBytes (out ServerID, vBytes, NetDataType.DWORD);
        TransBytes (out FightPower, vBytes, NetDataType.DWORD);
@@ -40,6 +43,7 @@
        TransBytes (out FamilyID, vBytes, NetDataType.DWORD);
        TransBytes (out FamilyName, vBytes, NetDataType.Chars, 33);
        TransBytes (out FamilyEmblemID, vBytes, NetDataType.DWORD);
        TransBytes (out FamilyEmblemWord, vBytes, NetDataType.Chars, 3);
        TransBytes (out PlusDataSize, vBytes, NetDataType.DWORD);
        TransBytes (out PlusData, vBytes, NetDataType.Chars, PlusDataSize);
    }
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs
New file
@@ -0,0 +1,43 @@
using UnityEngine;
using System.Collections;
// A9 22 演武场匹配玩家列表 #tagSCArenaMatchList
public class HA922_tagSCArenaMatchList : GameNetPackBasic {
    public byte MatchCount;
    public  tagSCArenaMatchInfo[] MatchList;    // 匹配列表,从高分到低分
    public HA922_tagSCArenaMatchList () {
        _cmd = (ushort)0xA922;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out MatchCount, vBytes, NetDataType.BYTE);
        MatchList = new tagSCArenaMatchInfo[MatchCount];
        for (int i = 0; i < MatchCount; i ++) {
            MatchList[i] = new tagSCArenaMatchInfo();
            TransBytes (out MatchList[i].PlayerID, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].PlayerName, vBytes, NetDataType.Chars, 33);
            TransBytes (out MatchList[i].LV, vBytes, NetDataType.WORD);
            TransBytes (out MatchList[i].RealmLV, vBytes, NetDataType.WORD);
            TransBytes (out MatchList[i].FightPower, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].FightPowerEx, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].Face, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].FacePic, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].TitleID, vBytes, NetDataType.DWORD);
        }
    }
    public class tagSCArenaMatchInfo {
        public uint PlayerID;        //目标玩家ID
        public string PlayerName;
        public ushort LV;        // 玩家等级
        public ushort RealmLV;        //境界,机器人读境界表取等级对应境界
        public uint FightPower;        //战力求余亿部分
        public uint FightPowerEx;        //战力整除亿部分
        public uint Face;        //基本脸型
        public uint FacePic;        //头像框
        public uint TitleID;        //称号
    }
}
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2b4642cd36b59424c907081f1ea9e173
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs
New file
@@ -0,0 +1,17 @@
using UnityEngine;
using System.Collections;
// A9 23 演武场玩家信息 #tagSCArenaPlayerInfo
public class HA923_tagSCArenaPlayerInfo : GameNetPackBasic {
    public uint Score;    //当前积分
    public HA923_tagSCArenaPlayerInfo () {
        _cmd = (ushort)0xA923;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out Score, vBytes, NetDataType.DWORD);
    }
}
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9a2b69f1fef30664080e787544234dab
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Main.cs
@@ -82,7 +82,7 @@
        managers.Add(NewBieCenter.Instance);
        managers.Add(AdsManager.Instance);
        managers.Add(BoneFieldManager.Instance);
        managers.Add(ArenaManager.Instance);
        foreach (var manager in managers)
        {
            manager.Init();
Main/System/Arena.meta
New file
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2bada89d61080494cadb1e44f3ea3bf3
folderAsset: yes
DefaultImporter:
  externalObjects: {}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaAwardCell.cs
New file
@@ -0,0 +1,55 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class ArenaAwardCell : CellView
{
    [SerializeField] ImageEx imgRank;
    [SerializeField] TextEx txtRank;
    [SerializeField] ItemCell[] itemCells;
    public void Display(int index, CellView cellView)
    {
        int functionOrder = cellView.info.Value.infoInt1;
        Dictionary<int, int[][]> rewardDict = ArenaManager.Instance.GetArenaAwardDict(functionOrder);
        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(StringUtility.Contact("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], true));
            }
            else
            {
                itemCell.SetActive(false);
            }
        }
    }
}
Main/System/Arena/ArenaAwardCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1af032a349424c84fae27b64da3a604e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaAwardWin.cs
New file
@@ -0,0 +1,121 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class ArenaAwardWin : FunctionsBaseWin
{
    [SerializeField] ButtonEx btnClose;
    [SerializeField] TextEx txtCountdown;
    [SerializeField] ScrollerController scrAward;
    [SerializeField] ArenaPlayerRankCell myRankCell;
    [HideInInspector] public string valueFormat = "{0}";
    protected override void InitComponent()
    {
        base.InitComponent();
        btnClose.SetListener(() => UIManager.Instance.CloseWindow<ArenaAwardWin>());
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        tabButtons[functionOrder].SelectBtn(true);
        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
        RankModel.Instance.onRankRefresh -= OnRankRefresh;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        scrAward.OnRefreshCell += OnRefreshCell;
        Display();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
        RankModel.Instance.onRankRefresh -= OnRankRefresh;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
        scrAward.OnRefreshCell -= OnRefreshCell;
    }
    private void OnSecondEvent()
    {
        ArenaManager.Instance.GetCurrentSeasonDates(out DateTime seasonStartDate, out DateTime seasonEndDate);
        TimeSpan remainingTime = seasonEndDate - TimeUtility.ServerNow;
        int remainingSeconds = (int)remainingTime.TotalSeconds;
        if (remainingSeconds > 0)
        {
            string countdownText = TimeUtility.SecondsToDHMSCHS(remainingSeconds);
            txtCountdown.SetActive(true);
            txtCountdown.text = Language.Get("Arena14", countdownText);
        }
        else
        {
            txtCountdown.SetActive(false);
        }
    }
    protected override void OpenSubUIByTabIndex()
    {
        ArenaManager.Instance.nowAwardTabIndex = functionOrder;
        Display();
    }
    private void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<ArenaAwardCell>();
        _cell?.Display(cell.index, cell);
    }
    private void OnUpdateArenaPlayerInfo()
    {
        Display();
    }
    private void OnArenaMatchListEvent()
    {
        Display();
    }
    private void OnUpdateGameRecInfo()
    {
        Display();
    }
    void OnRankRefresh(int type)
    {
        DisplayMyRank();
    }
    private void Display()
    {
        CreateScroller();
        DisplayMyRank();
        OnSecondEvent();
    }
    private void CreateScroller()
    {
        scrAward.Refresh();
        Dictionary<int, int[][]> rewardDict = ArenaManager.Instance.GetArenaAwardDict(functionOrder);
        if (!rewardDict.IsNullOrEmpty())
        {
            var list = rewardDict.Keys.ToList();
            list.Sort();
            for (int i = 0; i < list.Count; i++)
            {
                CellInfo cellInfo = new CellInfo();
                cellInfo.infoInt1 = (int)functionOrder;
                scrAward.AddCell(ScrollerDataType.Header, i, cellInfo);
            }
        }
        scrAward.Restart();
    }
    private void DisplayMyRank()
    {
        myRankCell.Display(ArenaManager.Instance.rankType, 0, valueFormat);
    }
}
Main/System/Arena/ArenaAwardWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 261402b40fdeef54b88c11e75dddd897
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaBattleFailWin.cs
New file
@@ -0,0 +1,110 @@
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using LitJson;
using UnityEngine;
//战场结算界面,存在多个的情况
public class ArenaBattleFailWin : UIBase
{
    [SerializeField] AvatarCell myAvatarCell;
    [SerializeField] AvatarCell enemyAvatarCell;
    [SerializeField] TextEx txtMyName;
    [SerializeField] TextEx txtEnemyName;
    [SerializeField] TextEx txtMyScore;
    [SerializeField] TextEx txtEnemyScore;
    [SerializeField] ScrollerController scroller;
    JsonData jsonData;
    string guid;
    protected override void InitComponent()
    {
    }
    protected override void OnPreOpen()
    {
        scroller.OnRefreshCell += OnRefreshCell;
        guid = BattleSettlementManager.Instance.notifyGuid;
        jsonData = BattleSettlementManager.Instance.GetBattleSettlement(guid);
        if (jsonData == null)
        {
            DelayCloseWindow().Forget();
            return;
        }
        Display();
        CreateScroller();
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
        BattleSettlementManager.Instance.WinShowOver(guid);
    }
    // B4 20 回合制战斗状态 #tagMCTurnFightState  通用的结算状态 State 4-结算奖励
    // Msg 中额外信息
    // "tagPlayerID":对战的目标ID,
    // "atkAddScore":发起方增加的积分,可能为0,
    // "defDecScore":被击方减少的积分,可能为0,
    // itemInfo:奖励物品列表,可能为空
    void Display()
    {
        if (!jsonData.ContainsKey("tagPlayerID") || !jsonData.ContainsKey("atkAddScore") || !jsonData.ContainsKey("defDecScore"))
            return;
        uint tagPlayerID = (uint)jsonData["tagPlayerID"];
        int atkAddScore = (int)jsonData["atkAddScore"];
        int defDecScore = (int)jsonData["defDecScore"];
        if (!ArenaManager.Instance.TryGetPlayerInfo(tagPlayerID, out ArenaMatchInfo info))
            return;
        uint enemyFace = info.Face;
        uint enemyFacePic = info.FacePic;
        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                PlayerDatas.Instance.baseData.face,
                                                PlayerDatas.Instance.baseData.facePic));
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
        txtMyScore.text = Language.Get("Arena17", atkAddScore);
        txtEnemyScore.text = Language.Get("Arena21", defDecScore);
    }
    List<Item> showItems = new List<Item>();
    void CreateScroller()
    {
        showItems.Clear();
        scroller.Refresh();
        if (!jsonData.ContainsKey("itemInfo"))
        {
            return;
        }
        var resultStr = jsonData["itemInfo"];
        for (int i = 0; i < resultStr.Count; i++)
        {
            showItems.Add(new Item((int)resultStr[i]["ItemID"], (long)resultStr[i]["Count"]));
        }
        showItems.Sort(SortItem);
        for (int i = 0; i < showItems.Count; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, i);
        }
        scroller.Restart();
    }
    int SortItem(Item itemA, Item itemB)
    {
        var itemConfigA = ItemConfig.Get(itemA.id);
        var itemConfigB = ItemConfig.Get(itemB.id);
        return itemConfigB.ItemColor - itemConfigA.ItemColor;
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as SettlementAwardCell;
        var item = showItems[cell.index];
        _cell?.Display(item.id, item.countEx);
    }
}
Main/System/Arena/ArenaBattleFailWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e168451406b9e004180f67432eb30f58
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaBattleVictoryWin.cs
New file
@@ -0,0 +1,170 @@
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using LitJson;
using UnityEngine;
// 【战斗结算】
// 当收到 // B4 20 回合制战斗状态 #tagMCTurnFightState    State 为 4-结算,时,代表本场战斗已结束并结算
// char Msg[Len]; //size = Len   Msg信息为
// {"winFaction":获胜阵营, "statInfo":统计信息, “itemInfo“:[奖励物品信息列表]}
// 获胜阵营:   一般为1或者2,当玩家发起的战斗时,如果获胜阵营不等于1代表玩家失败了
// 统计信息: 格式  {"阵营编号":{"阵容编号":{"站位编号":{该武将统计信息字典}, ...}, ...}, ...}
// 阵营编号: 一般时1或2, 对应 B424 同步下去的阵营
// 阵容编号: 隶属于某个阵营的阵容编号,一般是从1开始,一个阵营在多V多的情况下可以有多个阵容
// 站位编号: 某个阵容中武将战斗实例的站位编号,一般从1开始,代表站位1
// 武将统计信息字典: 格式: {"ObjID":实例ID, "HeroID":玩家阵容武将ID, "NPCID":npc表ID, "AtkHurt":总输出, "DefHurt":总承伤, "CureHP":总治疗}
// 处理战斗结束逻辑
// IsBattleFinish = true;
// 结算逻辑
// {
// "itemInfo": [],
// "winFaction": 1,//获胜阵营:   一般为1或者2,当玩家发起的战斗时,如果获胜阵营不等于1代表玩家失败了
// "statInfo": {
//     "1": {
//     "1": {
//         "5": {
//         "NPCID": 0,
//         "DefHurt": 633,
//         "CureHP": 0,
//         "AtkHurt": 169247,
//         "ObjID": 1,
//         "HeroID": 510006
//         }
//     }
//     },
//     "2": {
//     "1": {
//         "2": {
//         "NPCID": 10101001,
//         "DefHurt": 169246,
//         "CureHP": 143096,
//         "AtkHurt": 999952,
//         "ObjID": 2,
//         "HeroID": 0
//         },
//         "4": {
//         "NPCID": 10101001,
//         "DefHurt": 0,
//         "CureHP": 0,
//         "AtkHurt": 0,
//         "ObjID": 3,
//         "HeroID": 0
//         },
//         "6": {
//         "NPCID": 10101001,
//         "DefHurt": 1,
//         "CureHP": 0,
//         "AtkHurt": 0,
//         "ObjID": 4,
//         "HeroID": 0
//         }
//     }
//     }
// }
// }
//"Msg":{"itemInfo":[{"ItemID":5,"Count":2},{"ItemID":3,"Count":40}],"winFaction":1,"statInfo":{"1":{"1":{"1":{"NPCID":0,"DefHurt":727,"CureHP":0,"AtkHurt":1891,"ObjID":1,"HeroID":530004},"3":{"NPCID":0,"DefHurt":483,"CureHP":1511,"AtkHurt":782,"ObjID":6,"HeroID":520001},"2":{"NPCID":0,"DefHurt":953,"CureHP":0,"AtkHurt":1712,"ObjID":5,"HeroID":510003}}},"2":{"1":{"1":{"NPCID":10101091,"DefHurt":638,"CureHP":0,"AtkHurt":140,"ObjID":2,"HeroID":610001},"3":{"NPCID":10101092,"DefHurt":625,"CureHP":0,"AtkHurt":126,"ObjID":3,"HeroID":610001},"5":{"NPCID":10101093,"DefHurt":3122,"CureHP":0,"AtkHurt":1897,"ObjID":4,"HeroID":510003}}}}}
//战场结算界面,存在多个的情况
public class ArenaBattleVictoryWin : UIBase
{
    [SerializeField] AvatarCell myAvatarCell;
    [SerializeField] AvatarCell enemyAvatarCell;
    [SerializeField] TextEx txtMyName;
    [SerializeField] TextEx txtEnemyName;
    [SerializeField] TextEx txtMyScore;
    [SerializeField] TextEx txtEnemyScore;
    [SerializeField] ScrollerController scroller;
    JsonData jsonData;
    string guid;
    protected override void OnPreOpen()
    {
        scroller.OnRefreshCell += OnRefreshCell;
        guid = BattleSettlementManager.Instance.notifyGuid;
        jsonData = BattleSettlementManager.Instance.GetBattleSettlement(guid);
        if (jsonData == null)
        {
            DelayCloseWindow().Forget();
            return;
        }
        Display();
        CreateScroller();
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
        BattleSettlementManager.Instance.WinShowOver(guid);
    }
    // B4 20 回合制战斗状态 #tagMCTurnFightState  通用的结算状态 State 4-结算奖励
    // Msg 中额外信息
    // "tagPlayerID":对战的目标ID,
    // "atkAddScore":发起方增加的积分,可能为0,
    // "defDecScore":被击方减少的积分,可能为0,
    // itemInfo:奖励物品列表,可能为空
    void Display()
    {
        if (!jsonData.ContainsKey("tagPlayerID") || !jsonData.ContainsKey("atkAddScore") || !jsonData.ContainsKey("defDecScore"))
            return;
        uint tagPlayerID = (uint)jsonData["tagPlayerID"];
        int atkAddScore = (int)jsonData["atkAddScore"];
        int defDecScore = (int)jsonData["defDecScore"];
        if (!ArenaManager.Instance.TryGetPlayerInfo(tagPlayerID, out ArenaMatchInfo info))
            return;
        uint enemyFace = info.Face;
        uint enemyFacePic = info.FacePic;
        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                PlayerDatas.Instance.baseData.face,
                                                PlayerDatas.Instance.baseData.facePic));
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
        txtMyScore.text = Language.Get("Arena17", atkAddScore);
        txtEnemyScore.text = Language.Get("Arena21", defDecScore);
    }
    List<Item> showItems = new List<Item>();
    void CreateScroller()
    {
        showItems.Clear();
        scroller.Refresh();
        if (!jsonData.ContainsKey("itemInfo"))
        {
            return;
        }
        var resultStr = jsonData["itemInfo"];
        for (int i = 0; i < resultStr.Count; i++)
        {
            showItems.Add(new Item((int)resultStr[i]["ItemID"], (long)resultStr[i]["Count"]));
        }
        showItems.Sort(SortItem);
        for (int i = 0; i < showItems.Count; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, i);
        }
        scroller.Restart();
    }
    int SortItem(Item itemA, Item itemB)
    {
        var itemConfigA = ItemConfig.Get(itemA.id);
        var itemConfigB = ItemConfig.Get(itemB.id);
        return itemConfigB.ItemColor - itemConfigA.ItemColor;
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as SettlementAwardCell;
        var item = showItems[cell.index];
        _cell?.Display(item.id, item.countEx);
    }
}
Main/System/Arena/ArenaBattleVictoryWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4b85bbac1964abf45a57115812f0b39b
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaChallengeCell.cs
New file
@@ -0,0 +1,59 @@
using System.Collections.Generic;
using UnityEngine;
public class ArenaChallengeCell : MonoBehaviour
{
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] TextEx txtName;
    [SerializeField] TextEx txtAddScore;
    [SerializeField] TextEx txtFightPoint;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] List<ItemCell> itemCells;
    [SerializeField] ButtonEx btnChallenge;
    ArenaMatchInfo arenaMatchInfo;
    void Start()
    {
        btnChallenge.SetListener(() =>
        {
            if (arenaMatchInfo == null)
                return;
            // 货币不足
            if (!UIHelper.CheckMoneyCount(ArenaManager.Instance.ChallengeMoneyType, ArenaManager.Instance.NeedChallengeMoneyCnt, 1))
                return;
            ArenaManager.Instance.atkPlayerId = arenaMatchInfo.PlayerID;
            ArenaManager.Instance.SendTurnFight(arenaMatchInfo.PlayerID);
        });
    }
    public void Display(int index)
    {
        List<ArenaMatchInfo> list = ArenaManager.Instance.matchInfoList;
        if (list.IsNullOrEmpty() || index < 0 || index >= list.Count)
            return;
        arenaMatchInfo = list[index];
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaMatchInfo.PlayerID, (int)arenaMatchInfo.Face, (int)arenaMatchInfo.FacePic));
        txtName.text = UIHelper.ServerStringTrim(arenaMatchInfo.PlayerName);
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaMatchInfo.FightPower);
        txtAddScore.text = Language.Get("Arena16", ArenaManager.Instance.GetChallengePoints(index));
        officialTitleCell.InitUI(arenaMatchInfo.RealmLV, (int)arenaMatchInfo.TitleID);
        int[][] rewards = ArenaManager.Instance.fixedChallengeRewards;
        for (int i = 0; i < itemCells.Count; i++)
        {
            var itemCell = itemCells[i];
            if (!rewards.IsNullOrEmpty() && i < rewards.Length)
            {
                int itemCellIndex = i;
                itemCell.SetActive(true);
                itemCell.Init(new ItemCellModel(rewards[i][0], true, rewards[i][1]));
                itemCell.button.SetListener(() => ItemTipUtility.Show(rewards[itemCellIndex][0], true));
            }
            else
            {
                itemCell.SetActive(false);
            }
        }
    }
}
Main/System/Arena/ArenaChallengeCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 241dd54b1d574284b97aeb85cfed40a2
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaChallengeVoucher.cs
New file
@@ -0,0 +1,24 @@
using UnityEngine;
public class ArenaChallengeVoucher : MonoBehaviour
{
    [SerializeField] ImageEx imgChallengeMoneyIcon;
    [SerializeField] TextEx txtChallengeMoneyCount;
    [SerializeField] ButtonEx btnBuy;
    void Awake()
    {
        btnBuy.SetListener(() =>
        {
        });
    }
    public void Display()
    {
        int type = ArenaManager.Instance.ChallengeMoneyType;
        int maxChallengeCount = ArenaManager.Instance.GetMaxChallengeCount();
        imgChallengeMoneyIcon.SetIconWithMoneyType(type);
        txtChallengeMoneyCount.text = Language.Get("BoneField09", UIHelper.GetMoneyCnt(type), maxChallengeCount);
    }
}
Main/System/Arena/ArenaChallengeVoucher.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5aabcebb83427c645b22e283276e1d00
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaChallengeWin.cs
New file
@@ -0,0 +1,91 @@
using System.Collections.Generic;
using UnityEngine;
public class ArenaChallengeWin : UIBase
{
    [SerializeField] ArenaChallengeVoucher voucher;
    [SerializeField] ButtonEx btnRefresh;
    [SerializeField] TextEx txtFightPoint;
    [SerializeField] ImageEx imgMoneyIcon;
    [SerializeField] TextEx txtMoneyCount;
    [SerializeField] ScrollerController scrollerController;
    protected override void InitComponent()
    {
        base.InitComponent();
        btnRefresh.SetListener(() =>
        {
            // 货币不足
            if (!UIHelper.CheckMoneyCount(ArenaManager.Instance.currencyType, ArenaManager.Instance.currencyValue, 1))
                return;
            ArenaManager.Instance.SendArenaMatch(true);
        });
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        // RankModel.Instance.onRankRefresh += OnRankRefresh;
        scrollerController.OnRefreshCell += OnRefreshCell;
        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        // ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
        // ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
        // Display();
        Display();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        // RankModel.Instance.onRankRefresh -= OnRankRefresh;
        scrollerController.OnRefreshCell -= OnRefreshCell;
        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
        // ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
        // ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
    }
    private void PlayerDataRefresh(PlayerDataType type)
    {
        if (type != PlayerDataType.ChallengeVoucher)
            return;
        Display();
    }
    private void OnArenaMatchListEvent()
    {
        Display();
    }
    private void CreateScroller()
    {
        scrollerController.Refresh();
        List<ArenaMatchInfo> list = ArenaManager.Instance.matchInfoList;
        if (!list.IsNullOrEmpty())
        {
            for (int i = 0; i < list.Count; i++)
            {
                scrollerController.AddCell(ScrollerDataType.Header, i);
            }
        }
        scrollerController.Restart();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<ArenaChallengeCell>();
        _cell?.Display(cell.index);
    }
    void Display()
    {
        CreateScroller();
        voucher.Display();
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
        imgMoneyIcon.SetIconWithMoneyType(ArenaManager.Instance.currencyType);
        txtMoneyCount.text = UIHelper.ShowUseMoney(ArenaManager.Instance.currencyType, ArenaManager.Instance.currencyValue);
    }
}
Main/System/Arena/ArenaChallengeWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1ab89feb7fe3f5e4695c1cf39769fc60
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaHeroHead.cs
New file
@@ -0,0 +1,30 @@
using UnityEngine;
public class ArenaHeroHead : MonoBehaviour
{
    [SerializeField] ImageEx imgQuality;
    [SerializeField] ImageEx imgHeadIcon;
    [SerializeField] TextEx txtHeroLv;
    public void Display(int heroID, int skinID, int heroLv)
    {
        if (!HeroConfig.HasKey(heroID) || !HeroSkinConfig.HasKey(skinID))
            return;
        var heroConfig = HeroConfig.Get(heroID);
        var heroSkinConfig = HeroSkinConfig.Get(skinID);
        imgQuality.SetSprite("heroheadBG" + heroConfig.Quality);
        var sprite = UILoader.LoadSprite("HeroHead", heroSkinConfig.SquareIcon);
        if (sprite == null)
        {
            // 内网未配置时
            imgHeadIcon.SetSprite("herohead_default");
        }
        else
        {
            imgHeadIcon.overrideSprite = sprite;
        }
        txtHeroLv.text = Language.Get("Arena22", heroLv);
    }
}
Main/System/Arena/ArenaHeroHead.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f37aea19aa098294f825fa0dfea4a44e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaManager.cs
New file
@@ -0,0 +1,347 @@
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System;
public class ArenaManager : GameSystemManager<ArenaManager>
{
    public readonly int rankType = 1;    // 榜单类型
    public readonly int funcId = 27;    // 功能Id
    public readonly int recType = 308;  // 演武场玩家挑战记录类型 308
    public readonly int ChallengeMoneyType = 53;
    public readonly int NeedChallengeMoneyCnt = 1;
    public readonly int RecordType = 308;   // 演武场玩家挑战记录
    public int initialPoints;   // 玩家初始积分
    public int challengeRecordCount;    // 被挑战记录条数(不超过50)
    public int challengeTicketLimit;    // 挑战券基础存储上限
    public int[][] fixedChallengeRewards;   // 固定挑战奖励 [[物品ID,个数], ...]
    public int[][] matchVictoryPoints;  // 匹配位置挑战胜利对应增减积分 [[挑战方增加积分, 防守方扣除积分], ...],长度即为匹配的人数,从最高分开始配置
    public int lowerRankStart;  // 从比自己低几个段的名次开始匹配
    public int rankStep;    // 每个匹配段跨x名,如配置 2|10,即代表从自己名次向后20名开始匹配,每跨10名匹配1人
    public Dictionary<int, int[]> robotMatchCounts; // 玩家所在小于等于该名次对应匹配机器人数 {名次:[匹配机器人数下限, 上限], ...}
    public int currencyType;    // 刷新匹配固定消耗货币类型
    public int currencyValue;   // 刷新匹配固定消耗货币值
    public Dictionary<int, int[][]> dailyRankRewards; // 每日排行奖励 {"名次":[[物品ID, 个数,是否拍品], ...], ...} 配置的名次key,自动按小于等于对应名次给奖励
    public Dictionary<int, int[][]> seasonRankRewards;  // 赛季排行奖励 {"名次":[[物品ID, 个数,是否拍品], ...], ...}
    public uint score;    // 当前积分
    public List<ArenaMatchInfo> matchInfoList = new List<ArenaMatchInfo>();
    //用于用来拿战斗胜利失败的头像信息
    public Dictionary<uint, ArenaMatchInfo> allFaceInfoDict = new Dictionary<uint, ArenaMatchInfo>();
    public Dictionary<uint, List<ArenaGameRec>> gameRecDict = new Dictionary<uint, List<ArenaGameRec>>(); // <RecID,ArenaGameRec>
    public uint atkPlayerId;
    public Redpoint parentRedpoint = new Redpoint(MainRedDot.MainChallengeRedpoint, MainRedDot.ArenaRepoint);
    public Redpoint challengeButtonRedpoint;
    public int nowAwardTabIndex = 0;
    public event Action OnArenaMatchListEvent;
    public event Action OnUpdateArenaPlayerInfo;
    public event Action OnUpdateGameRecInfo;
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        InitTable();
        InitRedpoint();
    }
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
    }
    public void OnBeforePlayerDataInitializeEvent()
    {
        matchInfoList.Clear();
        gameRecDict.Clear();
        allFaceInfoDict.Clear();
    }
    void InitRedpoint()
    {
        challengeButtonRedpoint = new Redpoint(MainRedDot.ArenaRepoint, GetRedPonitId(1));
    }
    void InitTable()
    {
        FuncConfigConfig config = FuncConfigConfig.Get("ArenaSet");
        initialPoints = int.Parse(config.Numerical1);
        challengeRecordCount = int.Parse(config.Numerical2);
        challengeTicketLimit = int.Parse(config.Numerical3);
        fixedChallengeRewards = JsonMapper.ToObject<int[][]>(config.Numerical4);
        config = FuncConfigConfig.Get("ArenaMatch");
        matchVictoryPoints = JsonMapper.ToObject<int[][]>(config.Numerical1);
        string[] matchParams = config.Numerical2.Split('|');
        lowerRankStart = int.Parse(matchParams[0]);
        rankStep = int.Parse(matchParams[1]);
        robotMatchCounts = ConfigParse.GetDic<int, int[]>(config.Numerical3);
        string[] costParams = config.Numerical4.Split('|');
        currencyType = int.Parse(costParams[0]);
        currencyValue = int.Parse(costParams[1]);
        config = FuncConfigConfig.Get("ArenaBillboradAward");
        dailyRankRewards = ConfigParse.ParseIntArray2Dict(config.Numerical1);
        seasonRankRewards = ConfigParse.ParseIntArray2Dict(config.Numerical2);
    }
    public void UpdateRedPonit()
    {
        parentRedpoint.state = RedPointState.None;
        challengeButtonRedpoint.state = RedPointState.None;
        if (!FuncOpen.Instance.IsFuncOpen(funcId))
            return;
        if (UIHelper.GetMoneyCnt(ChallengeMoneyType) > 0)
        {
            challengeButtonRedpoint.state = RedPointState.Simple;
        }
    }
    public bool TryGetPlayerInfo(uint playerID, out ArenaMatchInfo info)
    {
        return allFaceInfoDict.TryGetValue(playerID, out info);
    }
    // 1 挑战按钮
    public int GetRedPonitId(int num)
    {
        return MainRedDot.ArenaRepoint * 10 + num;
    }
    private void PlayerDataRefresh(PlayerDataType type)
    {
        if (type != PlayerDataType.ChallengeVoucher)
            return;
        UpdateRedPonit();
    }
    public int GetMaxChallengeCount()
    {
        return challengeTicketLimit;
    }
    public void OnArenaMatchList(HA922_tagSCArenaMatchList vNetData)
    {
        if (vNetData == null || vNetData.MatchList.IsNullOrEmpty())
            return;
        matchInfoList.Clear();
        foreach (var item in vNetData.MatchList)
        {
            var matchInfo = new ArenaMatchInfo
            {
                PlayerID = item.PlayerID,
                PlayerName = item.PlayerName,
                Lv = item.LV,
                RealmLV = item.RealmLV,
                FightPower = (ulong)item.FightPowerEx * 100000000 + (ulong)item.FightPower,
                Face = item.Face,
                FacePic = item.FacePic
            };
            matchInfoList.Add(matchInfo);
            allFaceInfoDict[item.PlayerID] = matchInfo;
        }
        matchInfoList.Reverse();
        OnArenaMatchListEvent?.Invoke();
    }
    public void UpdateArenaPlayerInfo(HA923_tagSCArenaPlayerInfo vNetData)
    {
        if (vNetData == null)
            return;
        this.score = vNetData.Score;
        OnUpdateArenaPlayerInfo?.Invoke();
    }
    public void UpdateGameRecInfo(HA009_tagSCGameRecInfo vNetData)
    {
        if (vNetData == null || vNetData.RecType != recType)
            return;
        gameRecDict.Clear();
        uint recID = vNetData.RecID;
        if (!gameRecDict.ContainsKey(recID))
            gameRecDict[recID] = new List<ArenaGameRec>();
        foreach (var rec in vNetData.RecList)
        {
            try
            {
                var userData = JsonMapper.ToObject(rec.UserData);
                string name = userData["Name"].ToString();
                int addScore = int.Parse(userData["AddScore"].ToString());
                ulong fightPower = ulong.Parse(userData["FightPower"].ToString());
                var arenaGameRec = new ArenaGameRec
                {
                    Time = rec.Time,
                    Value1 = rec.Value1,
                    Value2 = rec.Value2,
                    Value3 = rec.Value3,
                    Value4 = rec.Value4,
                    Value5 = rec.Value5,
                    Value6 = rec.Value6,
                    Value7 = rec.Value7,
                    Value8 = rec.Value8,
                    Name = name,
                    AddScore = addScore,
                    FightPower = fightPower
                };
                gameRecDict[recID].Add(arenaGameRec);
                if (recID == PlayerDatas.Instance.baseData.PlayerID)
                {
                    allFaceInfoDict[rec.Value3] = new ArenaMatchInfo
                    {
                        Face = rec.Value5,
                        FacePic = rec.Value6,
                        RealmLV = (ushort)rec.Value7,
                        Lv = (ushort)rec.Value8,
                        PlayerName = name,
                        FightPower = fightPower,
                    };
                }
            }
            catch (Exception ex)
            {
                Debug.LogError($"JSON解析错误: {ex.Message}, UserData: {rec.UserData}");
                continue;
            }
        }
        OnUpdateGameRecInfo?.Invoke();
    }
    public Dictionary<int, int[][]> GetArenaAwardDict(int functionOrder)
    {
        return functionOrder == 0 ? dailyRankRewards : seasonRankRewards;
    }
    public void SendViewGameRecPack()
    {
        CA008_tagCSViewGameRec pack = new CA008_tagCSViewGameRec();
        pack.RecType = (ushort)RecordType;
        GameNetSystem.Instance.SendInfo(pack);
    }
    public void SendArenaMatch(bool isRefresh = false)
    {
        CB209_tagCSArenaMatch pack = new CB209_tagCSArenaMatch();
        pack.IsRefresh = isRefresh ? (byte)1 : (byte)0;
        GameNetSystem.Instance.SendInfo(pack);
    }
    public void SendTurnFight(uint playerID)
    {
        CB410_tagCMTurnFight pack = new CB410_tagCMTurnFight();
        pack.MapID = 3;
        pack.TagType = 1;
        pack.TagID = playerID;
        GameNetSystem.Instance.SendInfo(pack);
    }
    public bool IsTimeInvalid(uint time)
    {
        DateTime dateTime = TimeUtility.GetTime(time);
        GetCurrentSeasonDates(out DateTime seasonStartDate, out DateTime seasonEndDate);
        return dateTime < seasonStartDate || dateTime > seasonEndDate;
    }
    /// <summary>
    /// 根据索引和排序方向获取积分
    /// </summary>
    /// <param name="index">索引位置(从0开始)</param>
    /// <param name="isAscending">true-正序,false-倒序</param>
    /// <param name="isChallenger">true-挑战方增加积分,false-防守方扣除积分</param>
    /// <returns>对应的积分值</returns>
    public int GetChallengePoints(int index, bool isAscending = false, bool isChallenger = true)
    {
        // 检查索引是否在有效范围内
        if (matchVictoryPoints.IsNullOrEmpty() || index < 0 || index >= matchVictoryPoints.Length)
            return 0;
        int targetIndex = isAscending ? index : matchVictoryPoints.Length - 1 - index;
        return matchVictoryPoints[targetIndex][isChallenger ? 0 : 1];
    }
    /// <summary>
    /// 获得当前赛季的起止日期。赛季从周一 00:00:00 开始,到周日 23:59:59 结束。
    /// 服务端定义周一为每周的第一天。
    /// </summary>
    /// <param name="seasonStartDate">输出参数:赛季的起始日期(本周一 00:00:00)</param>
    /// <param name="seasonEndDate">输出参数:赛季的结束日期(本周日 23:59:59)</param>
    public void GetCurrentSeasonDates(out DateTime seasonStartDate, out DateTime seasonEndDate)
    {
        DateTime now = TimeUtility.ServerNow;
        // 在 .NET 中,DayOfWeek 枚举 Sunday = 0, Monday = 1, ..., Saturday = 6。
        // 为了符合周一是一周第一天的计算标准,我们将周日视为一周的第7天。
        int currentDayOfWeek = (int)now.DayOfWeek;
        if (currentDayOfWeek == 0) // 如果是周日 (Sunday = 0)
        {
            currentDayOfWeek = 7;
        }
        // 从当前日期减去相应的天数,得到周一的日期。
        // 例如,如果是周三(3),则需要减去 3-1=2 天。
        // 如果是周日(7),则需要减去 7-1=6 天。
        DateTime monday = now.AddDays(-(currentDayOfWeek - 1));
        // 设置赛季的起始时间为周一的 0点0分0秒
        seasonStartDate = new DateTime(monday.Year, monday.Month, monday.Day, 0, 0, 0);
        // 赛季的结束日期是开始日期(周一)加上6天,即周日
        DateTime sunday = seasonStartDate.AddDays(6);
        // 设置赛季的结束时间为周日的 23点59分59秒
        seasonEndDate = new DateTime(sunday.Year, sunday.Month, sunday.Day, 23, 59, 59);
    }
    /// <summary>
    /// 根据recID获取按时间从大到小排序的List<ArenaGameRec>
    /// </summary>
    /// <param name="recID">记录ID</param>
    /// <param name="sortedList">输出参数:按时间从大到小排序的ArenaGameRec列表</param>
    /// <returns>如果recID存在且成功获取列表返回true,否则返回false</returns>
    public bool TryGetSortedArenaGameRecList(uint recID, out List<ArenaGameRec> sortedList)
    {
        sortedList = null;
        if (!gameRecDict.ContainsKey(recID))
            return false;
        sortedList = new List<ArenaGameRec>(gameRecDict[recID]);
        sortedList.Sort((a, b) => b.Time.CompareTo(a.Time)); // 按时间从大到小排序
        return true;
    }
}
public class ArenaMatchInfo
{
    public uint PlayerID;        //目标玩家ID
    public string PlayerName;
    public ushort Lv;             //等级
    public ushort RealmLV;        //境界,机器人读境界表取等级对应境界
    public uint TitleID;
    public ulong FightPower;        //战力
    public uint Face;        //基本脸型
    public uint FacePic;        //头像框
}
public class ArenaGameRec
{
    public uint Time;        //战斗时间戳
    public uint Value1;        //更新积分,战斗后的最终积分
    public uint Value2;        //攻击类型 1-发起攻击的,2-被攻击的
    public uint Value3;        //相对攻击类型的目标玩家ID
    public uint Value4;        //是否获胜 1-获胜;2-失败
    public uint Value5;        //目标头像
    public uint Value6;        //目标头像框
    public uint Value7;        //目标官职
    public uint Value8;        //目标等级
    public string Name;         //目标名称
    public int AddScore;        //本次自己变更的积分,有正负
    public ulong FightPower;    //目标战力
    public int TitileId; //未来接入
}
Main/System/Arena/ArenaManager.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7a403f8e8b73bb443acd4352e1c1c00f
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaPlayerRankCell.cs
New file
@@ -0,0 +1,70 @@
using UnityEngine;
using UnityEngine.UI;
public class ArenaPlayerRankCell : MonoBehaviour
{
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] Text rankText;
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    // rank 为0 代表玩家自己
    public void Display(int rankType, int rank, string valueFormat)
    {
        RankData rankData = null;
        if (rank != 0)
        {
            rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
        }
        else
        {
            rankData = RankModel.Instance.GetMyRank(rankType);
            if (rankData == null)
            {
                //取玩家自己的数据
                avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                PlayerDatas.Instance.baseData.face,
                                                PlayerDatas.Instance.baseData.facePic));
                rankText.text = Language.Get("L1045");
                rankValueText.text = ArenaManager.Instance.score.ToString();
                nameText.text = PlayerDatas.Instance.baseData.PlayerName;
                officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
                return;
            }
            rank = rankData.rank;
        }
        if (rankData == null)
        {
            officialTitleCell.SetActive(false);
            avatarCell.SetActive(false);
            nameText.text = Language.Get("L1124");
            rankValueText.text = "0";//Language.Get("L1125");
        }
        else
        {
            officialTitleCell.SetActive(true);
            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
            avatarCell.SetActive(true);
            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
            nameText.text = rankData.name1;
            rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
        }
        rankText.text = rank.ToString();
        if (queryPlayerBtn != null)
        {
            queryPlayerBtn.AddListener(() =>
            {
            });
        }
    }
}
Main/System/Arena/ArenaPlayerRankCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 88b05b28e044ffc4cbe09e000d6a5a08
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaPlayerTop3Cell.cs
New file
@@ -0,0 +1,35 @@
using UnityEngine;
using UnityEngine.UI;
public class ArenaPlayerTop3Cell : MonoBehaviour
{
    //[SerializeField] Model 显示NPC 武将模型
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    [SerializeField] UIHeroController model;
    public void Display(int rankType, int rank, string valueFormat = "{0}")
    {
        var rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
        if (rankData == null)
        {
            rankValueText.text = "0";//Language.Get("L1125");
            nameText.text = Language.Get("L1124");
            officialTitleCell.SetActive(false);
            return;
        }
        officialTitleCell.SetActive(true);
        rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
        nameText.text = rankData.name1;
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
        model.Create((int)rankData.value5, 1);
    }
}
Main/System/Arena/ArenaPlayerTop3Cell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 478726dd88ca04047a63760c746634e5
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaRecordCell.cs
New file
@@ -0,0 +1,98 @@
using System.Collections.Generic;
using UnityEngine;
using System;
public class ArenaRecordCell : MonoBehaviour
{
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] TextEx txtName;
    [SerializeField] TextEx txtDate;
    [SerializeField] TextEx txtFightPoint;
    [SerializeField] TextEx txtState;
    [SerializeField] TextEx txtAdd;
    [SerializeField] TextEx txtTimeInvalid;
    [SerializeField] TextEx txtNeedCount;
    [SerializeField] ImageEx imgMoneyIcon;
    [SerializeField] ImageEx imgType;
    [SerializeField] Transform transChallenge;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] ButtonEx btnChallenge;
    ArenaGameRec arenaGameRec;
    void Start()
    {
        btnChallenge.SetListener(() =>
        {
            if (arenaGameRec == null)
                return;
            ArenaManager.Instance.SendTurnFight(arenaGameRec.Value3);
            ArenaManager.Instance.atkPlayerId = arenaGameRec.Value3;
        });
    }
    public void Display(int index)
    {
        uint playerID = PlayerDatas.Instance.baseData.PlayerID;
        ArenaManager.Instance.TryGetSortedArenaGameRecList(playerID, out List<ArenaGameRec> sortedList);
        if (sortedList.IsNullOrEmpty() || index < 0 || index >= sortedList.Count)
            return;
        arenaGameRec = sortedList[index];
        imgType.SetSprite(arenaGameRec.Value2 == 1 ? "ArenaRecordTypeAtk" : "ArenaRecordTypeDef");
        txtDate.text = FormatTime(arenaGameRec.Time);
        // true 已失效 false 未失效
        bool isTimeInvalid = ArenaManager.Instance.IsTimeInvalid(arenaGameRec.Time);
        // 发起攻击,打赢有积分,打输没有
        //被攻击的,打赢没有积分,打输扣积分
        // 0 打别人胜利 1 打别人输 2 被打,我赢 3 被打,我输
        int state = GetState(arenaGameRec.Value2, arenaGameRec.Value4);
        transChallenge.SetActive(!isTimeInvalid && state == 3);
        txtTimeInvalid.SetActive(isTimeInvalid);
        if (state == 0 || state == 2)
        {
            txtState.text = UIHelper.AppendColor(TextColType.Green, Language.Get("Arena09"));
            txtAdd.text = UIHelper.AppendColor(TextColType.Green, Language.Get("Arena17", arenaGameRec.AddScore));
        }
        else
        {
            txtState.text = UIHelper.AppendColor(TextColType.Red, Language.Get("Arena10"));
            if (arenaGameRec.AddScore == 0)
            {
                txtAdd.text = UIHelper.AppendColor(TextColType.Red, Language.Get("Arena21", arenaGameRec.AddScore));
            }
            else
            {
                txtAdd.text = UIHelper.AppendColor(TextColType.Red, Language.Get("Arena18", arenaGameRec.AddScore));
            }
        }
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6));
        txtName.text = arenaGameRec.Name;
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaGameRec.FightPower);
        officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
        imgMoneyIcon.SetIconWithMoneyType(ArenaManager.Instance.ChallengeMoneyType);
        txtNeedCount.text = ArenaManager.Instance.NeedChallengeMoneyCnt.ToString();
    }
    // 0 打别人胜利 1 打别人输 2 被打,我赢 3 被打,我输
    public int GetState(uint isAtk, uint isWin)
    {
        if (isAtk == 1) // 发起攻击
        {
            return isWin == 1 ? 0 : 1;
        }
        else // 被攻击
        {
            return isWin == 1 ? 2 : 3;
        }
    }
    /// <summary>
    /// 格式化时间戳为 "月-日 时:分:秒" 格式
    /// </summary>
    /// <param name="timeStamp">时间戳</param>
    /// <returns>格式化后的时间字符串</returns>
    private string FormatTime(uint timeStamp)
    {
        DateTime dateTime = TimeUtility.GetTime(timeStamp);
        return dateTime.ToString("MM-dd HH:mm:ss");
    }
}
Main/System/Arena/ArenaRecordCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e830b4133d825fc4086c135f1446b842
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaRecordWin.cs
New file
@@ -0,0 +1,87 @@
using System.Collections.Generic;
using UnityEngine;
public class ArenaRecordWin : UIBase
{
    [SerializeField] ArenaChallengeVoucher voucher;
    [SerializeField] TextEx txtFightPoint;
    [SerializeField] ScrollerController scrollerController;
    [SerializeField] Transform transNoRecord;
    protected override void InitComponent()
    {
        base.InitComponent();
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        scrollerController.OnRefreshCell += OnRefreshCell;
        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        transNoRecord.SetActive(false);
        Display();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        scrollerController.OnRefreshCell -= OnRefreshCell;
        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
    }
    private void OnSecondEvent()
    {
        scrollerController.m_Scorller.RefreshActiveCellViews();
    }
    private void OnUpdateGameRecInfo()
    {
        Display();
    }
    private void PlayerDataRefresh(PlayerDataType type)
    {
        if (type != PlayerDataType.ChallengeVoucher)
            return;
        Display();
    }
    private void OnArenaMatchListEvent()
    {
        Display();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<ArenaRecordCell>();
        _cell?.Display(cell.index);
    }
    private void CreateScroller()
    {
        scrollerController.Refresh();
        uint playerID = PlayerDatas.Instance.baseData.PlayerID;
        ArenaManager.Instance.TryGetSortedArenaGameRecList(playerID, out List<ArenaGameRec> sortedList);
        if (!sortedList.IsNullOrEmpty())
        {
            transNoRecord.SetActive(false);
            for (int i = 0; i < sortedList.Count; i++)
            {
                scrollerController.AddCell(ScrollerDataType.Header, i);
            }
        }
        scrollerController.Restart();
    }
    void Display()
    {
        CreateScroller();
        voucher.Display();
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
    }
}
Main/System/Arena/ArenaRecordWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 91107595693c34d46aeb83c7fac01f39
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaWin.cs
New file
@@ -0,0 +1,141 @@
using System.Collections.Generic;
using UnityEngine;
public class ArenaWin : UIBase
{
    [SerializeField] ButtonEx btnClose;
    [SerializeField] ButtonEx btnRecord;
    [SerializeField] ButtonEx btnAward;
    [SerializeField] ButtonEx btnChallage;
    [SerializeField] RedpointBehaviour rpChallage;
    [SerializeField] ButtonEx btnDeployTroops;
    [SerializeField] List<ArenaPlayerTop3Cell> playerTop3Cells;
    [SerializeField] ScrollerController scrollerController;
    [SerializeField] ArenaPlayerRankCell myRankCell;
    [SerializeField] ArenaChallengeVoucher voucher;
    [HideInInspector] public int groupValue1 = 0;   //一般用于跨服
    [HideInInspector] public int groupValue2 = 0;   //一般用于跨服
    [HideInInspector] public string valueFormat = "{0}";
    protected override void InitComponent()
    {
        base.InitComponent();
        btnClose.SetListener(() => UIManager.Instance.CloseWindow<ArenaWin>());
        btnAward.SetListener(() => UIManager.Instance.OpenWindow<ArenaAwardWin>());
        btnRecord.SetListener(() =>
        {
            ArenaManager.Instance.SendViewGameRecPack();
            UIManager.Instance.OpenWindow<ArenaRecordWin>();
        });
        btnChallage.SetListener(() =>
        {
            ArenaManager.Instance.SendArenaMatch();
            UIManager.Instance.OpenWindow<ArenaChallengeWin>();
        });
        btnDeployTroops.SetListener(() =>
        {
            HeroUIManager.Instance.selectTeamType = TeamType.ArenaDefense;
            UIManager.Instance.OpenWindow<HeroPosWin>();
        });
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        RankModel.Instance.ResetQueryParam();
        RankModel.Instance.QueryRankByPage(ArenaManager.Instance.rankType, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
        rpChallage.redpointId = ArenaManager.Instance.GetRedPonitId(1);
    }
    protected override void NextFrameAfterOpen()
    {
        RankModel.Instance.onRankRefresh += OnRankRefresh;
        scrollerController.OnRefreshCell += OnRefreshCell;
        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        Display();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        RankModel.Instance.onRankRefresh -= OnRankRefresh;
        scrollerController.OnRefreshCell -= OnRefreshCell;
        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
    }
    private void PlayerDataRefresh(PlayerDataType type)
    {
        if (type != PlayerDataType.ChallengeVoucher)
            return;
        Display();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<ArenaPlayerRankCell>();
        _cell.Display(ArenaManager.Instance.rankType, cell.index + 1, valueFormat);
        RankModel.Instance.ListenRankPage(ArenaManager.Instance.rankType, cell.index, groupValue1, groupValue2);
    }
    private void OnUpdateArenaPlayerInfo()
    {
        Display();
    }
    private void OnArenaMatchListEvent()
    {
        Display();
    }
    private void OnUpdateGameRecInfo()
    {
        Display();
    }
    private void Display()
    {
        voucher.Display();
        CreateScroller();
        DisplayMyRank();
        DisplayTop3();
    }
    void CreateScroller()
    {
        scrollerController.Refresh();
        var cnt = RankModel.Instance.GetRankShowMaxCnt(ArenaManager.Instance.rankType);
        for (int i = 3; i < cnt; i++)
        {
            scrollerController.AddCell(ScrollerDataType.Header, i);
        }
        scrollerController.Restart();
    }
    void DisplayMyRank()
    {
        myRankCell.Display(ArenaManager.Instance.rankType, 0, ArenaManager.Instance.score.ToString());
    }
    void DisplayTop3()
    {
        for (int i = 0; i < playerTop3Cells.Count; i++)
        {
            playerTop3Cells[i].Display(ArenaManager.Instance.rankType, i + 1);
        }
    }
    void OnRankRefresh(int type)
    {
        if (type != ArenaManager.Instance.rankType)
            return;
        DisplayTop3();
        scrollerController.m_Scorller.RefreshActiveCellViews();
        DisplayMyRank();
    }
}
Main/System/Arena/ArenaWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c2491f5ebae5bc041a14d081fd07e801
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/BuyItemWin.cs
New file
@@ -0,0 +1,119 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BuyItemWin : UIBase
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] Text nameText;
    [SerializeField] Text descText;
    //[SerializeField] ScrollerController scroller;
    [SerializeField] SliderPanel sliderPanel;
    [SerializeField] Button openButton;
    //[SerializeField] CellView _InitCell;
    string guid;
    int itemID;
    int itemCount;
    int useCnt;
    List<Item> items;
    protected override void InitComponent()
    {
        openButton.AddListener(() =>
        {
            if (useCnt == 0)
            {
                CloseWindow();
                return;
            }
            if (ItemLogicUtility.Instance.UseItem(guid, useCnt))
            {
                CloseWindow();
            }
        });
    }
    protected override void Start()
    {
        //_InitCell.cellIdentifier = _InitCell.cellIdentifier + this.GetInstanceID().ToString();
    }
    protected override void OnPreOpen()
    {
        itemID = ItemTipUtility.mainTipData.baseInfo.itemId;
        itemCount = ItemTipUtility.mainTipData.baseInfo.count;
        guid = ItemTipUtility.mainTipData.guid;
        itemCell.Init(new ItemCellModel(itemID, false, itemCount));
        var itemConfig = ItemConfig.Get(itemID);
        nameText.text = itemConfig.ItemName;
        descText.text = itemConfig.Description;
        if (string.IsNullOrEmpty(guid))
        {
            openButton.SetActive(false);
            sliderPanel.SetActive(false);
        }
        else
        {
            openButton.SetActive(true);
            sliderPanel.SetActive(true);
        }
        sliderPanel.Init((value) => { useCnt = value; }, itemCount);
        // scroller.OnRefreshCell += OnRefreshCell;
        items = BoxGetItemModel.Instance.GetBoxItems(itemID);
        CreateScroller();
    }
    protected override void OnPreClose()
    {
        //scroller.OnRefreshCell -= OnRefreshCell;
    }
    void CreateScroller()
    {
        // scroller.Refresh();
        for (int i = 0; i < items.Count; i++)
        {
            if (i % 4 == 0)
            {
                List<Item> tmpIDs = new List<Item>();
                for (int j = 0; j < 4; j++)
                {
                    int index = i + j;
                    if (index >= items.Count)
                        break;
                    tmpIDs.Add(items[index]);
                }
                //  scroller.AddCell(ScrollerDataType.Header, i);
            }
        }
        // scroller.Restart();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as BoxItemLineCell;
        List<Item> tmpIDs = new List<Item>();
        for (int j = 0; j < 4; j++)
        {
            int index = cell.index + j;
            if (index >= items.Count)
                break;
            tmpIDs.Add(items[index]);
        }
        _cell.Display(tmpIDs);
    }
}
Main/System/Arena/BuyItemWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5627605d78de2a748b34bdb33137ab7c
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/HeroCountryComponent.cs
New file
@@ -0,0 +1,131 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class HeroCountryComponent : MonoBehaviour
{
    [SerializeField] Image countryOnImg;    //上阵阵型激活国家
    [SerializeField] UIEffectPlayer countryEffect;
    [SerializeField] List<Image> OnCountImgs;    //上阵数量激活
    /// <summary>
    /// 上阵队伍中各个国家的武将数量
    /// </summary>
    public Dictionary<HeroCountry, int> GetCountryHeroCountByTeamType(List<TeamHero> teamHeroes)
    {
        Dictionary<HeroCountry, int> heroCountryCount = new Dictionary<HeroCountry, int>();
        if (teamHeroes == null)
        {
            return heroCountryCount;
        }
        for (int i = 0; i < teamHeroes.Count; i++)
        {
            if (teamHeroes[i] == null)
                continue;
            var country = teamHeroes[i].Country;
            if (!heroCountryCount.ContainsKey(country))
            {
                heroCountryCount.Add(country, 1);
            }
            else
            {
                heroCountryCount[country] += 1;
            }
        }
        return heroCountryCount;
    }
    /// <summary>
    /// 获得上阵中武将数量最大的国家和数量
    /// </summary>
    public Int2 GetMaxCountHeroCountry(List<TeamHero> teamType)
    {
        var countryCountDict = GetCountryHeroCountByTeamType(teamType);
        //找到最大的国家和数量
        HeroCountry country = HeroCountry.None;
        int maxValue = 0;
        foreach (var data in countryCountDict)
        {
            if (data.Value > maxValue)
            {
                country = data.Key;
                maxValue = data.Value;
            }
        }
        return new Int2((int)country, maxValue);
    }
    //上阵武将国家光环激活
    public void RefreshOnTeamCountry(List<TeamHero> teamType, bool playEffect = false)
    {
        Int2 result = GetMaxCountHeroCountry(teamType);
        var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
        if (config == null)
        {
            countryOnImg.SetSprite("heroTeamCountry0");
            for (int i = 0; i < OnCountImgs.Count; i++)
            {
                OnCountImgs[i].SetActive(false);
            }
        }
        else
        {
            countryOnImg.SetSprite("heroTeamCountry" + result.x);
            for (int i = 0; i < OnCountImgs.Count; i++)
            {
                if (i < result.y)
                {
                    OnCountImgs[i].SetActive(true);
                    OnCountImgs[i].SetSprite("heroTeamCountryPoint" + result.x);
                }
                else
                {
                    OnCountImgs[i].SetActive(false);
                }
            }
            if (playEffect)
                countryEffect.Play();
        }
    }
    //上阵武将国家光环激活
    public void RefreshOnTeamCountry(TeamType selectTeamType, bool playEffect = false)
    {
        Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(selectTeamType, true);
        var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
        if (config == null)
        {
            countryOnImg.SetSprite("heroTeamCountry0");
            for (int i = 0; i < OnCountImgs.Count; i++)
            {
                OnCountImgs[i].SetActive(false);
            }
        }
        else
        {
            countryOnImg.SetSprite("heroTeamCountry" + result.x);
            for (int i = 0; i < OnCountImgs.Count; i++)
            {
                if (i < result.y)
                {
                    OnCountImgs[i].SetActive(true);
                    OnCountImgs[i].SetSprite("heroTeamCountryPoint" + result.x);
                }
                else
                {
                    OnCountImgs[i].SetActive(false);
                }
            }
            if (playEffect)
                countryEffect.Play();
        }
    }
}
Main/System/Arena/HeroCountryComponent.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3ac0bc04463e5ef45a04c61ca9698fe9
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/ArenaBattleWin.cs
New file
@@ -0,0 +1,285 @@
using System.Collections.Generic;
using LitJson;
using UnityEngine;
using UnityEngine.UI;
public class ArenaBattleWin : UIBase
{
    // 组件引用
    [SerializeField] Transform mountPoint;
    [SerializeField] Button btnSpeed;
    [SerializeField] Text textSpeed;
    [SerializeField] Button btnPass;
    [SerializeField] Button btnPause;
    [SerializeField] RendererAdjuster buttonsAdjuster;
    private BattleRootNode battleRootNode = null;
    private BattleField battleField;
    [SerializeField] HeroCountryComponent myCountry;
    [SerializeField] TextEx txtMyLV;
    [SerializeField] TextEx txtMyName;
    [SerializeField] TextEx txtMyHp;
    [SerializeField] ImageEx imgMyHp;
    [SerializeField] TextEx txtMyFightPonit;
    [SerializeField] AvatarCell myAvatarCell;
    [SerializeField] List<ArenaHeroHead> myHeroHeads;
    [SerializeField] HeroCountryComponent enemyCountry;
    [SerializeField] TextEx txtEnemyLV;
    [SerializeField] TextEx txtEnemyName;
    [SerializeField] TextEx txtEnemyHp;
    [SerializeField] ImageEx imgEnemyHp;
    [SerializeField] TextEx txtEnemyFightPonit;
    [SerializeField] AvatarCell enemyAvatarCell;
    [SerializeField] List<ArenaHeroHead> enemyHeroHeads;
    [SerializeField] TextEx txtWaveInfo;
    // 生命周期
    protected override void InitComponent()
    {
        base.InitComponent();
        // 初始化组件引用 绑定按钮等UI组件事件
        btnSpeed.AddListener(ChangeSpeed);
        btnPass.AddListener(OnClickPass);
        btnPause.AddListener(OnClickPause);
    }
    private void OnClickPause()
    {
        if (null == battleField)
            return;
        battleField.IsPause = !battleField.IsPause;
    }
    private void OnClickPass()
    {
        if (null == battleField)
            return;
        battleField.ForceFinish();
    }
    private void ChangeSpeed()
    {
        if (null == battleField)
            return;
        BattleManager.Instance.speedIndex = (BattleManager.Instance.speedIndex + 1) % BattleManager.Instance.speedGear.Length;
        battleField.SetSpeedRatio(BattleManager.Instance.speedGear[BattleManager.Instance.speedIndex]);
        textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString();
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        // SetBattleField(BattleManager.Instance.storyBattleField);
        BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
        EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
        EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
        //UIManager.Instance.CloseWindow<MainWin>();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        UIManager.Instance.CloseWindow<BattleHUDWin>();
        BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
        EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
        EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
        //UIManager.Instance.OpenWindow<MainWin>(0);
    }
    private void OnBattleEnd(string guid, JsonData endData)
    {
        if (battleField != null && guid == battleField.guid)
        {
            DisplayHpInfo();
        }
    }
    private void OnDamageTaken(BattleDmgInfo damageInfo)
    {
        if (battleField == null)
            return;
        if (damageInfo.battleFieldGuid == battleField.guid)
        {
            DisplayHpInfo();
        }
    }
    private void OnCreateBattleField(string arg1, BattleField field)
    {
        if (field.GetType() == battleField.GetType())
        {
            SetBattleField(field);
        }
    }
    protected override void OnOpen()
    {
        base.OnOpen();
    }
    protected override void OnClose()
    {
        base.OnClose();
        if (battleRootNode != null)
        {
            battleRootNode.transform.SetParent(Launch.Instance.transform);
            battleRootNode.transform.localPosition = new Vector3(-10000, -10000, 0);
        }
        battleField = null;
    }
    protected override void NextFrameAfterOpen()
    {
        base.NextFrameAfterOpen();
    }
    protected override void CompleteClose()
    {
        base.CompleteClose();
    }
    public void SetBattleField(BattleField _battleField)
    {
        battleField = _battleField;
        if (battleRootNode != null)
        {
            battleRootNode.transform.localPosition = Vector3.zero;
            battleRootNode.transform.SetParent(Launch.Instance.transform);
        }
        battleRootNode = battleField.battleRootNode;
        battleRootNode.transform.SetParent(mountPoint);
        battleRootNode.transform.localPosition = Vector3.zero;
        battleRootNode.transform.localScale = Vector3.one;
        BattleHUDWin ui = UIManager.Instance.GetUI<BattleHUDWin>();
        if (null == ui)
        {
            ui = UIManager.Instance.OpenWindow<BattleHUDWin>();
        }
        ui.SetBattleField(battleField);
        battleField.UpdateCanvas(canvas);
        buttonsAdjuster.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
        textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString();
        DisplayHpInfo();
        DisplayPlayerInfo();
    }
    private void DisplayHpInfo()
    {
        if (battleField == null)
            return;
        // 获取我方(红方)队伍数据
        List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
        // 获取敌方(蓝方)队伍数据
        List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue);
        ulong myMaxHp = GetMaxHP(myTeam);
        ulong enemyMaxHp = GetMaxHP(enemyTeam);
        ulong myNowHp = GetNowHP(myTeam);
        ulong enemyNowHp = GetNowHP(enemyTeam);
        txtMyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(myNowHp), UIHelper.ReplaceLargeArtNum(myMaxHp));
        txtEnemyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(enemyNowHp), UIHelper.ReplaceLargeArtNum(enemyMaxHp));
        imgMyHp.fillAmount = Mathf.Clamp01((myMaxHp > 0) ? (float)myNowHp / myMaxHp : 0f);
        imgEnemyHp.fillAmount = Mathf.Clamp01((enemyMaxHp > 0) ? (float)enemyNowHp / enemyMaxHp : 0f);
    }
    private void DisplayPlayerInfo()
    {
        if (battleField == null)
            return;
        if (!ArenaManager.Instance.TryGetPlayerInfo(ArenaManager.Instance.atkPlayerId, out ArenaMatchInfo info))
            return;
        // 获取我方(红方)队伍数据
        List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
        // 获取敌方(蓝方)队伍数据
        List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue);
        txtEnemyLV.text = Language.Get("Arena22", info.Lv);
        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
        txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(info.FightPower);
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic));
        var team = GetTeamHeroList(enemyTeam);
        enemyCountry.RefreshOnTeamCountry(team, true);
        txtMyLV.text = Language.Get("Arena22", PlayerDatas.Instance.baseData.LV);
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
        txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic));
        myCountry.RefreshOnTeamCountry(TeamType.Arena);
        for (int i = 0; i < myHeroHeads.Count; i++)
        {
            if (i < myTeam.Count)
            {
                myHeroHeads[i].SetActive(true);
                var teamHero = myTeam[i].teamHero;
                myHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
            }
            else
            {
                myHeroHeads[i].SetActive(false);
            }
        }
        // 敌方英雄显示(从右到左)
        for (int i = enemyHeroHeads.Count - 1; i >= 0; i--)
        {
            int teamIndex = enemyHeroHeads.Count - 1 - i;  // 建立反向映射
            if (teamIndex < enemyTeam.Count)
            {
                enemyHeroHeads[i].SetActive(true);
                var teamHero = enemyTeam[teamIndex].teamHero;  // 使用映射后的索引
                enemyHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
            }
            else
            {
                enemyHeroHeads[i].SetActive(false);
            }
        }
    }
    ulong GetMaxHP(List<BattleObject> battleObjects)
    {
        ulong sun = 0;
        if (!battleObjects.IsNullOrEmpty())
        {
            for (int i = 0; i < battleObjects.Count; i++)
            {
                sun += (ulong)battleObjects[i].teamHero.maxHp;
            }
        }
        return sun;
    }
    ulong GetNowHP(List<BattleObject> battleObjects)
    {
        ulong sun = 0;
        if (!battleObjects.IsNullOrEmpty())
        {
            for (int i = 0; i < battleObjects.Count; i++)
            {
                sun += (ulong)battleObjects[i].teamHero.curHp;
            }
        }
        return sun;
    }
    List<TeamHero> GetTeamHeroList(List<BattleObject> teams)
    {
        List<TeamHero> teamHeroes = new List<TeamHero>();
        if (teams.IsNullOrEmpty())
            return teamHeroes;
        foreach (var item in teams)
        {
            teamHeroes.Add(item.teamHero);
        }
        return teamHeroes;
    }
}
Main/System/Battle/ArenaBattleWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d2609ee6f8b8f4b4896c3963c15924d2
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/BattleConst.cs
@@ -8,6 +8,7 @@
    {
        typeof(BattleWin),
        typeof(StoryBossBattleWin),
        typeof(ArenaBattleWin),
    };
    public const int BattleStartEffectID = 1001; // Example effect ID for battle start
Main/System/Battle/BattleField/ArenaBattleField.cs
New file
@@ -0,0 +1,148 @@
using System;
using LitJson;
using UnityEngine;
using System.Collections.Generic;
public class ArenaBattleField : BattleField
{
    protected int chapter;//   章节
    protected int wave;//  波数
    protected int level;// 关卡
    protected JsonData extendData;
    protected MainChapterConfig chapterConfig;
    protected MainLevelConfig levelConfig;
    public ArenaBattleField(string _guid) : base(_guid)
    {
    }
    public override void Init(int MapID, int FuncLineID, JsonData _extendData,
        List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList)
    {
        base.Init(MapID, FuncLineID, extendData, _redTeamList, _blueTeamList);
        chapter = FuncLineID / 10000;
        wave = MapID == 1 ? FuncLineID % 100 : 1;//第几波怪
        level = (FuncLineID % 10000) / 100;
        extendData = _extendData;
        chapterConfig = MainChapterConfig.Get(chapter);
        levelConfig = MainLevelConfig.Get(level);
        SetBattleMode(BattleMode.Record);
    }
    public override void Release()
    {
        base.Release();
    }
    public override void AutoSetBattleMode()
    {
        SetBattleMode(BattleMode.Record);
    }
    public override void TurnFightState(int TurnNum, int State,
        uint FuncLineID, JsonData extendData)
    {
        base.TurnFightState(TurnNum, State, FuncLineID, extendData);
        switch (State)
        {
            //  起始状态标记
            case 0:
                break;
            case 1://准备完毕
                break;
            case 2://战斗中
                break;
            case 3://战斗结束
                break;
            case 4://结算奖励
                break;
            case 5://结束状态标记
                break;
            default:
                BattleDebug.LogError("recieve a unknown State");
                break;
        }
    }
    protected override void OnSettlement(JsonData turnFightStateData)
    {
        base.OnSettlement(turnFightStateData);
    }
    public override void WhaleFall()
    {
        UIManager.Instance.CloseWindow<ArenaBattleWin>();
        AutoFightModel.Instance.isPause = false;
        Destroy();
        UIManager.Instance.OpenWindow<ArenaWin>();
    }
    public override void HaveRest()
    {
        //  主线BOSS战斗没有休息
    }
    // public override void OnBattleEnd(JsonData turnFightStateData)
    // {
    //     base.OnBattleEnd(turnFightStateData);
    //     // HaveRest();
    // }
    public override void Run()
    {
        if (operationAgent == null)
        {
            //防范异常
            return;
        }
        base.Run();
    }
    public override void DistributeNextPackage()
    {
        if (IsBattleFinish)
            return;
        //  不要调用base的函数
        BattleManager.Instance.DistributeNextReportPackage(guid);
    }
    public override void ShowWindow(HB424_tagSCTurnFightInit vNetData)
    {
        ArenaBattleWin fsBattleWin = UIManager.Instance.GetUI<ArenaBattleWin>();// as FullScreenBattleWin;
        if (null == fsBattleWin)
        {
            fsBattleWin = UIManager.Instance.OpenWindow<ArenaBattleWin>();
        }
        fsBattleWin.SetBattleField(this);
        if (UIManager.Instance.IsOpened<ArenaRecordWin>())
        {
            UIManager.Instance.CloseWindow<ArenaRecordWin>();
        }
        if (UIManager.Instance.IsOpened<ArenaChallengeWin>())
        {
            UIManager.Instance.CloseWindow<ArenaChallengeWin>();
        }
        if (UIManager.Instance.IsOpened<ArenaWin>())
        {
            UIManager.Instance.CloseWindow<ArenaWin>();
        }
    }
}
Main/System/Battle/BattleField/ArenaBattleField.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c1f4142e50b5caf4cbdc39364d3c8f85
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/BattleFieldFactory.cs
@@ -20,6 +20,9 @@
            case 2:
                battleField = new StoryBossBattleField(guid);
                break;
            case 3:
                battleField = new ArenaBattleField(guid);
                break;
            case 30010:
                battleField = new BoneBattleField(guid);
                break;
Main/System/BillboardRank/PlayerTop3Cell.cs
@@ -29,7 +29,7 @@
        rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue2 + rankData.cmpValue * Constants.ExpPointValue));
        nameText.text = rankData.name1;
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
        model.Create(5100030, 1);  //测试
        model.Create((int)rankData.value5, 1);
    }
Main/System/ChallengeTab/ChallengeTabWin.cs
@@ -4,6 +4,7 @@
public class ChallengeTabWin : UIBase
{
    [SerializeField] ChallengeTabButton btnBoneField;
    [SerializeField] ChallengeTabButton btnArena;
    public static Action OnCloseChallengeTabWin;
    protected override void InitComponent()
    {
@@ -16,10 +17,19 @@
        AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
        TimeMgr.Instance.OnDayEvent += OnDayEvent;
        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        Display();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        OnCloseChallengeTabWin?.Invoke();
    }
    private void OnDayEvent()
    {
        Display();
@@ -38,26 +48,50 @@
        }
    }
    public void OnFuncStateChangeEvent(int funcId)
    {
        if (funcId == BoneFieldManager.Instance.funcId)
        {
            DisplayBoneFieldButton();
        }
        else if (funcId == ArenaManager.Instance.funcId)
        {
            DisplayArenaButton();
        }
    }
    protected override void OnPreClose()
    private void PlayerDataRefresh(PlayerDataType type)
    {
        base.OnPreClose();
        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
        OnCloseChallengeTabWin?.Invoke();
        if (type == PlayerDataType.ChallengeVoucher)
        {
            DisplayArenaButton();
    }
    }
    public void Display()
    {
        DisplayBoneFieldButton();
        DisplayArenaButton();
    }
    public void DisplayArenaButton()
    {
        int index = 1;
        int funcId = ArenaManager.Instance.funcId;
        int redpointId = MainRedDot.ArenaRepoint;
        bool isLock = FuncOpen.Instance.IsFuncOpen(funcId);
        int type = ArenaManager.Instance.ChallengeMoneyType;
        long nowCount = UIHelper.GetMoneyCnt(type);
        string countInfo = UIHelper.AppendColor(nowCount > 0 ? TextColType.Green : TextColType.Red, Language.Get("Challenge03", nowCount));
        string lockInfo = !isLock ? Language.Get("Challenge02") : string.Empty;
        btnArena.Display(index, redpointId, isLock, countInfo, lockInfo, () =>
        {
            UIManager.Instance.CloseWindow<ChallengeTabWin>();
            if (!FuncOpen.Instance.IsFuncOpen(funcId, true))
                return;
            UIManager.Instance.OpenWindow<ArenaWin>();
        });
    }
    public void DisplayBoneFieldButton()
Main/System/Redpoint/MainRedDot.cs
@@ -97,8 +97,7 @@
    public const int MailRepoint = 467; //邮箱
    public const int FirstChargeRepoint = 468; //首充
    public const int BoneFieldRepoint = 469; //白骨盈野
    public const int ArenaRepoint = 470; //演武场
    public void Register()
    {
Main/Utility/EnumHelper.cs
@@ -710,6 +710,7 @@
    default43,  // 271 幻境阁积分
    default44,  // 272 武将招募积分
    GoldRush = 285, // 淘金令
    ChallengeVoucher = 286,//挑战凭证
};
Main/Utility/UIHelper.cs
@@ -976,7 +976,7 @@
        {3, PlayerDataType.Silver},
        {41, PlayerDataType.default26},
        {42, PlayerDataType.default33},
        {53, PlayerDataType.ChallengeVoucher},
    };
    public static long GetMoneyCnt(int moneyType)
@@ -1118,6 +1118,11 @@
                    //淘金令
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.GoldRush);
                }
            case 53:
                {
                    //挑战凭证
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.ChallengeVoucher);
                }
            case 98:
                {
                    //过期型代金券