yyl
2025-10-20 6a105ff34adac6be5e71e17554e9eb3a3bc1b86c
Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts
2 文件已重命名
36个文件已修改
6个文件已删除
32 文件已复制
35个文件已添加
4908 ■■■■ 已修改文件
Main/Config/PartialConfigs/FamilyEmblemConfig.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/FamilyEmblemConfig.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/GameEngine/Player/PlayerBaseData.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/GameEngine/Player/PlayerDatas.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA513_tagMCFamilyActionInfo.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA705_tagSCQueryPlayerCacheResult.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | 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 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Main.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena.meta 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardCell.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardWin.cs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaAwardWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleFailWin.cs 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleFailWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleVictoryWin.cs 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleVictoryWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeCell.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeVoucher.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeVoucher.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeWin.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaHeroHead.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaHeroHead.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaManager.cs 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaManager.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerRankCell.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerRankCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerTop3Cell.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerTop3Cell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordCell.cs 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordWin.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaWin.cs 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/BuyItemWin.cs 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/BuyItemWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/HeroCountryComponent.cs 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/HeroCountryComponent.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/ArenaBattleWin.cs 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/ArenaBattleWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleConst.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/ArenaBattleField.cs 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/ArenaBattleField.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleFieldFactory.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/StoryBossBattleWin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerTop3Cell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ChallengeTab/ChallengeTabWin.cs 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/EquipExchangeCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Equip/EquipTipWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/EmblemHelper.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/EmblemHelper.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildBaseWin.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildCreateWin.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildCreateWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemCell.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemModel.cs 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemSelectCell.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemSelectCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemSelectListCell.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemSelectListCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemWin.cs 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildJoinWin.cs 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildManager.cs 364 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildPreviewWin.cs 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildPreviewWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildViewListCell.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/PlayerFairyData.cs 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HappyXB/HeroCallResultWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HappyXB/HeroCallWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroAwakePrivewWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroAwakeSuccessWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroBestWin.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroLVBreakSuccessWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroLVBreakWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/HeroUI/HeroTrainWin.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/MainWin.cs 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Redpoint/MainRedDot.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/RoleParticulars/OtherPlayerDetailManager.cs 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/RoleParticulars/OtherPlayerDetailManager.cs.meta 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/RoleParticulars/RoleParticularModel.cs 558 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Tip/MarqueeWin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Tip/ServerTipDetails.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/EnumHelper.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/TimeUtility.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/UIHelper.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/FamilyEmblemConfig.cs
New file
@@ -0,0 +1,27 @@
using System.Collections.Generic;
public partial class FamilyEmblemConfig : ConfigBase<int, FamilyEmblemConfig>
{
    private static List<int> defaultEmblemList = new List<int>();
    protected override void OnConfigParseCompleted()
    {
        if (UnlockFamilyLV == 1)
        {
            if (defaultEmblemList.Contains(EmblemID))
                return;
            defaultEmblemList.Add(EmblemID);
        }
    }
    public static int GetRandomEmblem()
    {
        if (defaultEmblemList.Count == 0)
            return -1; //
        System.Random random = new System.Random();
        return defaultEmblemList[random.Next(defaultEmblemList.Count)];
    }
}
Main/Config/PartialConfigs/FamilyEmblemConfig.cs.meta
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Config/PartialConfigs/FamilyEmblemConfig.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 8ade65428632cd94681e3561a9e78cb5
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/Core/GameEngine/Player/PlayerBaseData.cs
@@ -113,6 +113,7 @@
    public int mapRealmSelect;  //地图境界难度
    public int leaveFamilyTime; //离开家族时间
    public int leaveGuildInfo; //公会:主动离开次数*100 + 被踢次数*10  + 最后一次是否主动离开的,暂时最多累计记录到9次
    public bool IsActive90Off = true; //代表默认激活0.1折
    public long treasurePotentialSp
@@ -180,6 +181,7 @@
        spExtend = _serverInfo.ExAttr8;
        bubbleId = _serverInfo.ExAttr10;
        ExAttr11 = _serverInfo.ExAttr11;
        leaveGuildInfo = (int)_serverInfo.ExAttr12;
        ExAttr16 = _serverInfo.ExAttr16;
        ServerGroupId = _serverInfo.ExAttr13;
        faction = _serverInfo.Faction;
Main/Core/GameEngine/Player/PlayerDatas.cs
@@ -514,6 +514,9 @@
            case PlayerDataType.CDBPlayerRefresh_SkillReducePerG:
                baseData.skillReducePerG = (int)value;
                break;
            case PlayerDataType.ExAttr12:
                baseData.leaveGuildInfo = (int)value;
                break;
            case PlayerDataType.default9:
                baseData.mapRealmSelect = (int)value;
                break;
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/ClientPack/CA0_Sys/CA008_tagCSViewGameRec.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: b6a48b9769ab25a47adb4313ea3e1711
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/Core/NetworkPackage/ClientPack/CA2_Interaction/CA212_tagCMViewPlayerInfo.cs
@@ -1,23 +1,20 @@
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()
    {
        WriteBytes(PlayerID, NetDataType.DWORD);
        WriteBytes(EquipClassLV, NetDataType.BYTE);
    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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB209_tagCSArenaMatch.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: e768d709b4503ed47a18dad52f32422e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA0_Sys/DTCA009_tagSCGameRecInfo.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: ef9a2a1877a033e4198a1343e4eb8dea
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs
File was deleted
Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3A1_tagMCModuleFightPowerInfo.cs.meta
File was deleted
Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA513_tagMCFamilyActionInfo.cs
@@ -1,11 +1,12 @@
using UnityEngine;
using System.Collections;
using UnityEngine;
using System.Collections;
// A5 13 家族行为信息 #tagMCFamilyActionInfo
public class DTCA513_tagMCFamilyActionInfo : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack) {
        base.Done(vNetPack);
        HA513_tagMCFamilyActionInfo vNetData = vNetPack as HA513_tagMCFamilyActionInfo;
        GuildManager.Instance.UpdateFamilyAction(vNetData);
    }
}
Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA705_tagSCQueryPlayerCacheResult.cs
@@ -8,6 +8,6 @@
    {
        base.Done(vNetPack);
        HA705_tagSCQueryPlayerCacheResult vNetData = vNetPack as HA705_tagSCQueryPlayerCacheResult;
        RoleParticularModel.Instance.OnRevRoleEquip(vNetData);
        OtherPlayerDetailManager.Instance.OnRevRoleEquip(vNetData);
    }
}
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA922_tagSCArenaMatchList.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 3018194b7bdafa24c9855f1880bb15a2
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA923_tagSCArenaPlayerInfo.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: fe3971f96b149f14b8adf6e9c4e1ba5f
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -51,7 +51,6 @@
        Register(typeof(H0111_tagOnlineReply), typeof(DTC0111_tagOnlineReply));
        Register(typeof(H0608_tagNPCDie), typeof(DTC0608_tagNPCDie));
        Register(typeof(H0612_tagClearObjBuff), typeof(DTC0612_tagClearObjBuff));
        Register(typeof(HA3A1_tagMCModuleFightPowerInfo), typeof(DTCA3A1_tagMCModuleFightPowerInfo));
        Register(typeof(HA110_tagMCCoinToGoldCountInfo), typeof(DTCA110_tagMCCoinToGoldCountInfo));
        Register(typeof(HA008_tagGCPlayerRecInfo), typeof(DTCA008_tagGCPlayerRecInfo));
        Register(typeof(HAA02_tagSCFirstChargeInfo), typeof(DTCAA02_tagSCFirstChargeInfo));
@@ -114,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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/ServerPack/HA0_Sys/HA009_tagSCGameRecInfo.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 77ee48f6b77c0f34499e2cbd2546a944
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs
File was deleted
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 2b4642cd36b59424c907081f1ea9e173
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/Core/NetworkPackage/ServerPack/HA9_Function/HA923_tagSCArenaPlayerInfo.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 9a2b69f1fef30664080e787544234dab
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/Main.cs
@@ -49,9 +49,8 @@
        // 初始化游戏系统
        managers.Add(BattleManager.Instance);
        managers.Add(VirtualPackManager.Instance);
        managers.Add(RoleParticularModel.Instance);
        managers.Add(OtherPlayerDetailManager.Instance);
        managers.Add(RechargeManager.Instance);
        managers.Add(RoleParticularModel.Instance);
        managers.Add(StoreModel.Instance);
        managers.Add(PhantasmPavilionModel.Instance);
        managers.Add(GuildManager.Instance);
@@ -83,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
File was renamed from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 1af032a349424c84fae27b64da3a604e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaAwardWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 261402b40fdeef54b88c11e75dddd897
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaBattleFailWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: e168451406b9e004180f67432eb30f58
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaBattleVictoryWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 4b85bbac1964abf45a57115812f0b39b
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaChallengeCell.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 241dd54b1d574284b97aeb85cfed40a2
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaChallengeVoucher.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 5aabcebb83427c645b22e283276e1d00
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaChallengeWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 1ab89feb7fe3f5e4695c1cf39769fc60
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaHeroHead.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: f37aea19aa098294f825fa0dfea4a44e
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaManager.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 7a403f8e8b73bb443acd4352e1c1c00f
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaPlayerRankCell.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 88b05b28e044ffc4cbe09e000d6a5a08
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaPlayerTop3Cell.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 478726dd88ca04047a63760c746634e5
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaRecordCell.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: e830b4133d825fc4086c135f1446b842
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaRecordWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 91107595693c34d46aeb83c7fac01f39
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/ArenaWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: c2491f5ebae5bc041a14d081fd07e801
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/BuyItemWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 5627605d78de2a748b34bdb33137ab7c
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Arena/HeroCountryComponent.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 3ac0bc04463e5ef45a04c61ca9698fe9
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Battle/ArenaBattleWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: d2609ee6f8b8f4b4896c3963c15924d2
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Battle/BattleField/ArenaBattleField.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: c1f4142e50b5caf4cbdc39364d3c8f85
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
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/Battle/StoryBossBattleWin.cs
@@ -94,7 +94,8 @@
        UIManager.Instance.CloseWindow<BattleHUDWin>();
        BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
        UIManager.Instance.OpenWindow<MainWin>(0);
        if (!UIManager.Instance.IsOpened<MainWin>())
            UIManager.Instance.OpenWindow<MainWin>();
    }
    private void OnCreateBattleField(string arg1, BattleField field)
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
@@ -3,18 +3,12 @@
public class ChallengeTabWin : UIBase
{
    [SerializeField] ClickScreenOtherSpace clickScreenOtherSpace;
    [SerializeField] ChallengeTabButton btnBoneField;
    [SerializeField] ChallengeTabButton btnArena;
    public static Action OnCloseChallengeTabWin;
    protected override void InitComponent()
    {
        base.InitComponent();
        clickScreenOtherSpace.RemoveAllListeners();
        clickScreenOtherSpace.AddListener(() =>
        {
            UIManager.Instance.CloseWindow<ChallengeTabWin>();
        });
    }
    protected override void OnPreOpen()
    {
@@ -23,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();
@@ -45,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()
@@ -79,6 +106,7 @@
        string lockInfo = !isLock ? Language.Get("Challenge02") : string.Empty;
        btnBoneField.Display(index, redpointId, isLock, countInfo, lockInfo, () =>
        {
            UIManager.Instance.CloseWindow<ChallengeTabWin>();
            if (!FuncOpen.Instance.IsFuncOpen(funcId, true))
                return;
            UIManager.Instance.OpenWindow<BoneFieldWin>();
Main/System/Equip/EquipExchangeCell.cs
@@ -71,7 +71,7 @@
        equipImage.SetOrgSprite(equip.config.IconKey);
        itemName.text = UIHelper.AppendColor(equip.config.ItemColor, equip.config.ItemName, true, 1);
        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("equipQualityFormat"));
        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("L1039"));
        itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
        qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
        placeName.text = EquipModel.Instance.GetEquipPlaceName(equip.config.EquipPlace);
Main/System/Equip/EquipTipWin.cs
@@ -80,7 +80,7 @@
        equipImage.SetOrgSprite(equip.config.IconKey);
        itemName.text = UIHelper.AppendColor(equip.config.ItemColor, equip.config.ItemName, true, 1);
        itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("equipQualityFormat"));
        qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("L1039"));
        qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
        placeName.text = EquipModel.Instance.GetEquipPlaceName(equip.config.EquipPlace);
        lvText.text = Language.Get("EquipExchangeWin7", EquipModel.Instance.GetEquipLV(equip));
@@ -136,7 +136,7 @@
        equipImage.SetOrgSprite(itemConfig.IconKey);
        itemName.text = UIHelper.AppendColor(itemConfig.ItemColor, itemConfig.ItemName, true, 1);
        itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(itemConfig.ItemColor);
        qualityName.text = UIHelper.GetQualityNameWithColor(itemConfig.ItemColor, Language.Get("equipQualityFormat"));
        qualityName.text = UIHelper.GetQualityNameWithColor(itemConfig.ItemColor, Language.Get("L1039"));
        qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(itemConfig.ItemColor);
        placeName.text = EquipModel.Instance.GetEquipPlaceName(itemConfig.EquipPlace);
        lvText.text = Language.Get("EquipExchangeWin7", appointItemConfig.ItemLV);
Main/System/Guild/EmblemHelper.cs
File was deleted
Main/System/Guild/EmblemHelper.cs.meta
File was deleted
Main/System/Guild/GuildBaseWin.cs
@@ -8,16 +8,37 @@
/// </summary>
public class GuildBaseWin : UIBase
{
    [SerializeField] Button guildBtn;
    [SerializeField] GuildEmblemCell emblemCell;
    [SerializeField] Text guildNameText;
    [SerializeField] Text guildMemberCountText;
    [SerializeField] Button rankBtn;
    [SerializeField] Button requestBtn;
    protected override void InitComponent()
    {
        guildBtn.AddListener(() =>
        {
            // UIManager.Instance.OpenWindow<GuildWin>();
        });
        requestBtn.AddListener(() =>
        {
            // UIManager.Instance.OpenWindow<GuildRequestWin>();
        });
    }
    protected override void OnPreOpen()
    {
        if (PlayerDatas.Instance.fairyData.fairy == null)
            return;
        Display();
    }
    protected override void OnPreClose()
@@ -25,10 +46,17 @@
    }
    public override void Refresh()
    void Display()
    {
        ShowGuildInfo();
    }
    void ShowGuildInfo()
    {
        emblemCell.Display(PlayerDatas.Instance.fairyData.fairy.EmblemID, PlayerDatas.Instance.fairyData.fairy.EmblemWord);
        guildNameText.text = PlayerDatas.Instance.fairyData.fairy.FamilyName;
        var config = FamilyConfig.Get(PlayerDatas.Instance.fairyData.fairy.FamilyLV);
        guildMemberCountText.text = PlayerDatas.Instance.fairyData.fairy.MemberCount + "/" + config.MemberMax;
    }
}
Main/System/Guild/GuildCreateWin.cs
New file
@@ -0,0 +1,62 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 创建公会界面
/// </summary>
public class GuildCreateWin : UIBase
{
    [SerializeField] GuildEmblemCell emblemCell;
    [SerializeField] Button changeEmblemBtn;
    [SerializeField] InputField guildNameText;
    [SerializeField] Image moneyIcon;
    [SerializeField] Text moneyText;
    [SerializeField] Button createBtn;
    protected override void InitComponent()
    {
        changeEmblemBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<GuildEmblemWin>(1);
        });
        createBtn.AddListener(CreateGuild);
    }
    protected override void OnPreOpen()
    {
        GuildEmblemModel.Instance.CreateSelectEmblemIdChangeEvent += CreateSelectEmblemEvent;
        if (GuildEmblemModel.Instance.createEmblemWord == "")
            GuildEmblemModel.Instance.createEmblemWord = PlayerDatas.Instance.baseData.PlayerName[0].ToString();
        if (GuildEmblemModel.Instance.createSelectEmblemId <= 0)
            GuildEmblemModel.Instance.createSelectEmblemId = FamilyEmblemConfig.GetRandomEmblem();
        Display();
    }
    protected override void OnPreClose()
    {
        GuildEmblemModel.Instance.CreateSelectEmblemIdChangeEvent -= CreateSelectEmblemEvent;
    }
    void Display()
    {
        emblemCell.Display(GuildEmblemModel.Instance.createSelectEmblemId, GuildEmblemModel.Instance.createEmblemWord, 1.5f);
        moneyIcon.SetIconWithMoneyType(GuildManager.Instance.createMoneyType);
        moneyText.text = UIHelper.ShowUseMoney(GuildManager.Instance.createMoneyType, GuildManager.Instance.createFairyCost);
    }
    void CreateGuild()
    {
        GuildManager.Instance.CreateGuild(guildNameText.text,
                    GuildEmblemModel.Instance.createSelectEmblemId,
                    GuildEmblemModel.Instance.createEmblemWord);
    }
    void CreateSelectEmblemEvent()
    {
        Display();
    }
}
Main/System/Guild/GuildCreateWin.cs.meta
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Guild/GuildCreateWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: dd7026ea67a350847b14f34adc2d9090
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Guild/GuildEmblemCell.cs
New file
@@ -0,0 +1,54 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//公会徽章
//需增加UIFrame,UIEffectPlayer
[RequireComponent(typeof(UIFrame))]
[RequireComponent(typeof(UIEffectPlayer))]
public class GuildEmblemCell : MonoBehaviour
{
    [SerializeField] ImageEx emblemIcon;
    [SerializeField] UIFrame frame;
    [SerializeField] UIEffectPlayer uiEffect;
    [Header("字 F9E29F 包边 683C00 字号36 Y:-9")]
    [SerializeField] Text emblemNameText;   //字 F9E29F 包边 683C00 字号36 Y-9
    public void Display(int emblemID, string emblemName, float _scale = 1f)
    {
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemID);
        if (config == null)
        {
            return;
        }
        // 徽章动态效果按帧处理,如果后续要改成spine特效,则再商议修改
        // 目前特效为附加表现
        if (GuildEmblemModel.Instance.TryGetEffectID(emblemID, out int effectID))
        {
            if (effectID != 0)
            {
                uiEffect.effectId = effectID;
                uiEffect.isPlaySpineLoop = true;
                uiEffect.Play();
            }
        }
        if (UIFrameMgr.Inst.ContainsDynamicImage(config.Image))
        {
            frame.ResetFrame(config.Image);
            frame.enabled = true;
        }
        else
        {
            if (frame != null)
                frame.enabled = false;
            emblemIcon.SetSprite(config.Image);
            emblemIcon.SetNativeSize();
        }
        emblemIcon.rectTransform.localScale = new Vector3(_scale, _scale, _scale);
        emblemNameText.text = emblemName;
    }
}
Main/System/Guild/GuildEmblemCell.cs.meta
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Guild/GuildEmblemCell.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: c2e9e5e7d4929dd42b4e441ae3c75190
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Guild/GuildEmblemModel.cs
@@ -13,14 +13,11 @@
public class GuildEmblemModel : GameSystemManager<GuildEmblemModel>
{
    public readonly int MaxItemRowCount = 6;    // 一行展示x个徽章
    public readonly int FamilyActionsType = 15;     // 徽章类型15
    public readonly int FuncId = 237;
    public int defaultFamilyEmblemId;           // 默认徽章ID
    public readonly int FamilyActionsType = 15;     // 公会记录徽章类型15
    public bool isSendA408Pack = false;
    private int m_NowChooseEmblemId;
    public event Action ChooseEmblemIdChangeEvent;      //切换徽章
    public int nowChooseEmblemId
    {
        get { return m_NowChooseEmblemId; }
@@ -32,19 +29,46 @@
    }
    public event Action ChooseEmblemIdChangeEvent;      //切换标签页
    //创建公会时,选择的徽章
    int m_CreateSelectEmblemId;
    public event Action CreateSelectEmblemIdChangeEvent;
    public int createSelectEmblemId
    {
        get { return m_CreateSelectEmblemId; }
        set
        {
            m_CreateSelectEmblemId = value;
            CreateSelectEmblemIdChangeEvent?.Invoke();
        }
    }
    public string createEmblemWord = ""; //创建公会时,输入的旗号
    Redpoint entranceRedPoint = new Redpoint(10702, MainRedDot.FairyEmbleManageRepoint); //仙盟管理面板入口红点
    // 旧的显示列表,用于判断是否有变化, 对比红点显示
    public List<int> oldShowActiveList = new List<int>();   // 旧的激活列表,点击新的徽章时会更新,或者关闭的时候更新
    public List<int> showList = new List<int>();
    public override void Init()
    {
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
        defaultFamilyEmblemId = int.Parse(FuncConfigConfig.Get("FairyEmblem").Numerical1);
        GuildManager.Instance.FamilyActionInfoEvent += OnFamilyActionInfoEvent;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
    }
    public override void Release()
    {
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
        GuildManager.Instance.FamilyActionInfoEvent -= OnFamilyActionInfoEvent;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
    }
    public void OnBeforePlayerDataInitialize()
    {
        m_NowChooseEmblemId = 0;
        m_CreateSelectEmblemId = 0;
        createEmblemWord = "";
        oldShowActiveList.Clear();
        showList.Clear();
    }
    private void OnRefreshFairyInfo()
@@ -59,97 +83,67 @@
        // 仅盟主能看到
        if (!IsCaptain())
            return;
        // 仙盟2级出现
        if (PlayerDatas.Instance.fairyData == null || PlayerDatas.Instance.fairyData.fairy.FamilyLV != 2)
            return;
        // 只出现一次
        if (GetRedPointShow())
        if (!GetRedPointShow())
            return;
        entranceRedPoint.state = RedPointState.Simple;
    }
    string localStr = "FairyEmblemEntranceRedPoint_";
    // 新旧列表对比显示红点
    public bool GetRedPointShow()
    {
        return LocalSave.GetBool(localStr + PlayerDatas.Instance.PlayerId);
    }
        if (oldShowActiveList.IsNullOrEmpty())
            return false;
    public void SetRedPointShow()
    {
        LocalSave.SetBool(localStr + PlayerDatas.Instance.PlayerId, true);
    }
    public bool TryGetNowEmblemID(out int nowID)
    {
        nowID = 0;
        int emblemID = (int)PlayerDatas.Instance.fairyData.fairy.EmblemID;
        if (FamilyEmblemConfig.HasKey(emblemID) && IsUnLock(emblemID))
        for (int i = 0; i < showList.Count; i++)
        {
            nowID = (int)emblemID;
            return true;
        }
        if (FamilyEmblemConfig.HasKey(defaultFamilyEmblemId))
        {
            nowID = defaultFamilyEmblemId;
            return true;
        }
        nowID = 0;
        return false;
    }
    // 展示指定徽章 表中找不到徽章就显示默认的
    public void ShowEmblem(int emblemID, ImageEx imgTitle, float scale = 1.0f)
    {
        int nowEmblemID = emblemID;
        if (!FamilyEmblemConfig.HasKey(nowEmblemID))
        {
            nowEmblemID = defaultFamilyEmblemId;
        }
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(nowEmblemID);
        UIFrame frame = imgTitle.GetComponent<UIFrame>();
        if (UIFrameMgr.Inst.ContainsDynamicImage(config.Image))
        {
            if (frame == null)
                frame = imgTitle.gameObject.AddComponent<UIFrame>();
            List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(config.Image);
            if (!spriteList.IsNullOrEmpty())
            //已解锁的
            if (!oldShowActiveList.Contains(showList[i]) && IsUnLock(showList[i]))
            {
                imgTitle.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);
                return true;
            }
            imgTitle.raycastTarget = false;
            frame.ResetFrame(config.Image);
            frame.enabled = true;
        }
        else
        {
            if (frame != null)
                frame.enabled = false;
            imgTitle.SetSprite(config.Image);
            imgTitle.SetNativeSize();
        }
        imgTitle.rectTransform.localScale = new Vector3(scale, scale, scale);
        return false;
    }
    public List<int> GetShowList()
    public List<int> SortShowList()
    {
        List<int> showList = new List<int>();
        List<int> keys = FamilyEmblemConfig.GetKeys();
        for (int i = 0; i < keys.Count; i++)
        if (showList.IsNullOrEmpty())
        {
            showList.Add(keys[i]);
            List<int> keys = FamilyEmblemConfig.GetKeys();
            for (int i = 0; i < keys.Count; i++)
            {
                showList.Add(keys[i]);
            }
        }
        showList.Sort(Cmp);
        if (oldShowActiveList.IsNullOrEmpty())
        {
            // 初始化时,刷新旧的激活列表
            RefreshOldShowActiveList();
        }
        return showList;
    }
    // 刷新旧的激活列表,用于对比红点显示
    public void RefreshOldShowActiveList()
    {
        for (int i = 0; i < showList.Count; i++)
        {
            //已解锁的
            if (IsUnLock(showList[i]))
            {
                if (!oldShowActiveList.Contains(showList[i]))
                {
                    oldShowActiveList.Add(showList[i]);
                }
            }
        }
    }
    // 已激活>未激活
    private int Cmp(int a, int b)
@@ -180,12 +174,10 @@
        }
        return a.CompareTo(b);
    }
        }
    public int GetSortNum(int emblemID)
    {
        if (!FamilyEmblemConfig.HasKey(emblemID))
            return 0;
        return FamilyEmblemConfig.Get(emblemID).SortNum;
    }
@@ -200,7 +192,7 @@
        return config.UnlockFamilyLV > 0 ? FairyEmblemUnlockMethodType.LV : FairyEmblemUnlockMethodType.Active;
    }
    // 指定的徽章解锁了吗
    // 徽章是否解锁,未加入公会的也可以调用判断
    public bool IsUnLock(int emblemId)
    {
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);
@@ -220,8 +212,13 @@
                return true;
            case FairyEmblemUnlockMethodType.LV:
                int lv = 1; //没有公会的情况
                if (PlayerDatas.Instance.fairyData.fairy != null)
                {
                    lv = PlayerDatas.Instance.fairyData.fairy.FamilyLV;
                }
                //所在仙盟等级小于徽章要求等级 未解锁
                if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < config.UnlockFamilyLV)
                if (lv < config.UnlockFamilyLV)
                    return false;
                return true;
@@ -238,13 +235,10 @@
        }
    }
    public bool IsUsing(int emblemId)
    void OnFamilyActionInfoEvent(int familyId, int actionType)
    {
        if (!TryGetNowEmblemID(out int Id))
        {
            return false;
        }
        return emblemId == Id;
        UpdateRedPoint();
    }
    public bool IsLimitTime(int emblemId, out HA513_tagMCFamilyActionInfo.tagMCFamilyAction familyAction)
@@ -272,10 +266,10 @@
    public bool IsCaptain()
    {
        return (int)PlayerDatas.Instance.fairyData.mine.FmLV == 3;
        return PlayerDatas.Instance.fairyData.mine.FmLV == 3;
    }
    // 尝试从封包中得到指定的徽章时效信息(活动途径获取的徽章,定制徽章)
    // 获得徽章记录信息信息(活动途径获取的徽章,定制徽章),value1是徽章ID,value2是徽章到期时间
    private bool TryGetfamilyAction(int emblemId, out HA513_tagMCFamilyActionInfo.tagMCFamilyAction familyAction)
    {
        familyAction = new HA513_tagMCFamilyActionInfo.tagMCFamilyAction();
@@ -297,8 +291,6 @@
    public bool TryGetEffectID(int emblemId, out int effectID)
    {
        effectID = 0;
        if (!FamilyEmblemConfig.HasKey(emblemId))
            return false;
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);
        if (!EffectConfig.HasKey(config.EffectID))
            return false;
@@ -308,15 +300,3 @@
}
public class EmblemModel
{
    public int emblemID { get; private set; }
    public int emblemUIEffectID { get; private set; }
    public EmblemModel(int emblemID, int emblemUIEffectID)
    {
        this.emblemID = emblemID;
        this.emblemUIEffectID = emblemUIEffectID;
    }
}
Main/System/Guild/GuildEmblemSelectCell.cs
New file
@@ -0,0 +1,58 @@
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
//公会徽章 选择查看
public class GuildEmblemSelectCell : MonoBehaviour
{
    [SerializeField] GuildEmblemCell emblemIcon;
    [SerializeField] Image useImg;
    [SerializeField] Image lockImg;
    [SerializeField] Image selectImg;
    [SerializeField] Button selectBtn;
    [SerializeField] Image redPoint;
    public void Display(int index)
    {
        var id = GuildEmblemModel.Instance.showList[index];
        emblemIcon.Display(id, "");
        if (PlayerDatas.Instance.fairyData.fairy == null)
        {
            useImg.SetActive(false);
        }
        else
        {
            useImg.SetActive(id == PlayerDatas.Instance.fairyData.fairy.EmblemID);
        }
        lockImg.SetActive(!GuildEmblemModel.Instance.IsUnLock(id));
        selectImg.SetActive(id == GuildEmblemModel.Instance.nowChooseEmblemId);
        redPoint.SetActive(IsShowRedpoint(id));
        selectBtn.AddListener(() => OnClick(id));
    }
    bool IsShowRedpoint(int emblemID)
    {
        if (GuildEmblemModel.Instance.oldShowActiveList.Contains(emblemID))
        {
            return false;
        }
        if (!GuildEmblemModel.Instance.IsUnLock(emblemID))
        {
            return false;
        }
        return true;
    }
    void OnClick(int id)
    {
        GuildEmblemModel.Instance.RefreshOldShowActiveList();
        GuildEmblemModel.Instance.nowChooseEmblemId = id;
    }
}
Main/System/Guild/GuildEmblemSelectCell.cs.meta
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Guild/GuildEmblemSelectCell.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 824673e7b90bc33439e9e945e56eacfb
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Guild/GuildEmblemSelectListCell.cs
New file
@@ -0,0 +1,27 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//公会徽章列表
public class GuildEmblemListCell : CellView
{
    [SerializeField] List<GuildEmblemSelectCell> cells;
    public void Display(int index)
    {
        for (int i = 0; i < cells.Count; i++)
        {
            if (i + index < GuildEmblemModel.Instance.showList.Count)
            {
                cells[i].SetActive(true);
                cells[i].Display(index + i);
            }
            else
            {
                cells[i].SetActive(false);
            }
        }
    }
}
Main/System/Guild/GuildEmblemSelectListCell.cs.meta
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Guild/GuildEmblemSelectListCell.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 2246d0eca2920224aa0a20d7ca0e1767
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Guild/GuildEmblemWin.cs
New file
@@ -0,0 +1,153 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 公会徽章界面 :functionOrder 0 代表有公会的情况下打开,1 代表没有公会的情况下创建时打开
/// </summary>
public class GuildEmblemWin : UIBase
{
    [SerializeField] GuildEmblemCell guildEmblem;
    [SerializeField] ScrollerController emblemScroller;
    [SerializeField] Text emblemInfoText;
    [SerializeField] Text timeDescText;
    [SerializeField] InputField flagNameText;
    [SerializeField] Text nowTimeText;
    [SerializeField] Button changeBtn;
    string emblemWord;
    protected override void InitComponent()
    {
        flagNameText.onValueChanged.AddListener(OnFlagNameChange);
        changeBtn.AddListener(ChangeEmblem);
    }
    protected override void OnPreOpen()
    {
        GuildEmblemModel.Instance.ChooseEmblemIdChangeEvent += ChooseEmblemEvent;
        emblemScroller.OnRefreshCell += OnRefreshCell;
        if (functionOrder == 1)
        {
            GuildEmblemModel.Instance.nowChooseEmblemId = GuildEmblemModel.Instance.createSelectEmblemId;
            emblemWord = GuildEmblemModel.Instance.createEmblemWord;
        }
        else
        {
            GuildEmblemModel.Instance.nowChooseEmblemId = PlayerDatas.Instance.fairyData.fairy.EmblemID;
            emblemWord = PlayerDatas.Instance.fairyData.fairy.EmblemWord;
        }
        flagNameText.text = emblemWord;
        GuildEmblemModel.Instance.SortShowList();
        CreateEmblemScroller();
        Display();
    }
    protected override void OnPreClose()
    {
        GuildEmblemModel.Instance.ChooseEmblemIdChangeEvent -= ChooseEmblemEvent;
        emblemScroller.OnRefreshCell -= OnRefreshCell;
        GuildEmblemModel.Instance.RefreshOldShowActiveList();
    }
    void CreateEmblemScroller()
    {
        emblemScroller.Refresh();
        for (int i = 0; i < GuildEmblemModel.Instance.showList.Count; i++)
        {
            if (i % 5 == 0)
            {
                emblemScroller.AddCell(ScrollerDataType.Header, i);
            }
        }
        emblemScroller.Restart();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<GuildEmblemListCell>();
        _cell.Display(cell.index);
    }
    void Display()
    {
        guildEmblem.Display(GuildEmblemModel.Instance.nowChooseEmblemId, emblemWord, 2f);
        emblemScroller.m_Scorller.RefreshActiveCellViews();
        var config = FamilyEmblemConfig.Get(GuildEmblemModel.Instance.nowChooseEmblemId);
        emblemInfoText.text = config.Descriptive;
        if (config.ExpireMinutes == 0)
        {
            timeDescText.text = "";
        }
        else
        {
            timeDescText.text = Language.Get("Mail12", TimeUtility.SecondsToShortDHMS(config.ExpireMinutes * 60));
        }
        if (functionOrder == 1)
        {
            nowTimeText.text = "";
        }
        else
        {
            // 公会徽章过期时间
            if (GuildEmblemModel.Instance.IsLimitTime(GuildEmblemModel.Instance.nowChooseEmblemId, out var familyAction))
            {
                int time = (int)familyAction.Value2 - TimeUtility.AllSeconds;
                if (time > 0)
                    nowTimeText.text = Language.Get("GoldRush29", TimeUtility.SecondsToShortDHMS(time));
                else
                    nowTimeText.text = "";
            }
            else
            {
                nowTimeText.text = "";
            }
        }
        if (functionOrder == 1)
        {
            changeBtn.SetInteractable(GuildEmblemModel.Instance.IsUnLock(GuildEmblemModel.Instance.nowChooseEmblemId));
        }
        else
        {
            changeBtn.SetInteractable(GuildEmblemModel.Instance.IsCaptain() && GuildEmblemModel.Instance.IsUnLock(GuildEmblemModel.Instance.nowChooseEmblemId));
        }
    }
    void OnFlagNameChange(string value)
    {
        emblemWord = value;
        guildEmblem.Display(GuildEmblemModel.Instance.nowChooseEmblemId, emblemWord, 2f);
    }
    void ChooseEmblemEvent()
    {
        Display();
    }
    void ChangeEmblem()
    {
        if (functionOrder == 1)
        {
            GuildEmblemModel.Instance.createEmblemWord = emblemWord;
            GuildEmblemModel.Instance.createSelectEmblemId = GuildEmblemModel.Instance.nowChooseEmblemId;
        }
        else
        {
            var pack = new CA624_tagCMChangeFamilyEmblem();
            pack.EmblemID = (byte)GuildEmblemModel.Instance.nowChooseEmblemId;
            pack.EmblemWord = emblemWord;
            GameNetSystem.Instance.SendInfo(pack);
        }
        CloseWindow();
    }
}
Main/System/Guild/GuildEmblemWin.cs.meta
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Guild/GuildEmblemWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: 54febdd3c6a7d1c4cbc460b76e0aa240
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Guild/GuildJoinWin.cs
@@ -4,7 +4,7 @@
using UnityEngine.UI;
/// <summary>
/// 加入公会界面
/// 加入公会界面 :公会查找列表,也是排行榜
/// </summary>
public class GuildJoinWin : UIBase
{
@@ -19,7 +19,7 @@
    int lastPage = 0;
    protected override void InitComponent()
    {
        findBtn.AddListener(OnFindBtnClick);
        findBtn.AddListener(() => OnFindBtnClick());
        createGuildBtn.AddListener(OnCreateGuildBtnClick);
        quicklyJoinGuildBtn.AddListener(OnQuicklyJoinGuildBtnClick);
    }
@@ -27,9 +27,34 @@
    {
        findText.text = "";
        //打开界面默认请求,滚动的时候需要处理页数
        OnFindBtnClick();
        QueryGuild();
        GuildManager.Instance.OnRefreshFairyList += OnRefreshGuildList;
        GuildManager.Instance.MyRequestJoinEvent += MyRequestJoinEvent;
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
        guildListScroller.OnRefreshCell += RefreshCell;
        Display();
    }
    protected override void OnPreClose()
    {
        GuildManager.Instance.OnRefreshFairyList -= OnRefreshGuildList;
        GuildManager.Instance.MyRequestJoinEvent -= MyRequestJoinEvent;
        guildListScroller.OnRefreshCell -= RefreshCell;
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
        var win = UIManager.Instance.GetUI<MainWin>();
        if (win)
            win.RestoreFuncBtn();
    }
    void OnRefreshFairyInfo()
    {
        //当前界面下有刷新自家的公会数据,说明一定是加入了公会,需主动跳转到公会界面
        CloseWindow();
        var win = UIManager.Instance.GetUI<MainWin>();
        if (win)
            win.ClickFunc(4);
    }
    void Display()
@@ -37,10 +62,24 @@
        CreateScroller();
    }
    void MyRequestJoinEvent()
    {
        guildListScroller.m_Scorller.RefreshActiveCellViews();
    }
    
    //列表变小的话 重新创建;列表变大的话,只添加
    void CreateScroller()
    {
        if (GuildManager.Instance.pageIndexList.Count == 0)
        {
            noGuildTf.SetActive(true);
            guildListScroller.SetActive(false);
            return;
        }
        noGuildTf.SetActive(false);
        guildListScroller.SetActive(true);
        var startCount = guildListScroller.GetNumberOfCells();
        if (startCount > GuildManager.Instance.pageIndexList.Count)
        {
@@ -53,12 +92,6 @@
        guildListScroller.Restart();
    }
    protected override void OnPreClose()
    {
        GuildManager.Instance.OnRefreshFairyList -= OnRefreshGuildList;
    }
    void OnRefreshGuildList()
@@ -66,9 +99,36 @@
        CreateScroller();
    }
    void RefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<GuildViewListCell>();
        _cell.Display(cell.index);
    }
    private void OnFindBtnClick()
    {
        lastQuery = findText.text;
        var nowQuery = findText.text;
        if (string.IsNullOrEmpty(nowQuery) && string.IsNullOrEmpty(lastQuery))
        {
            SysNotifyMgr.Instance.ShowTip("GuildSys5");
            return;
        }
        if (nowQuery.Length < 2 && nowQuery.Length > 0)
        {
            SysNotifyMgr.Instance.ShowTip("GuildSys7");
            return;
        }
        lastQuery = nowQuery;
        lastPage = 0;
        guildListScroller.Refresh();
        GuildManager.Instance.SendFindGuild(lastQuery);
    }
    void QueryGuild()
    {
        lastQuery = "";
        lastPage = 0;
        guildListScroller.Refresh();
        GuildManager.Instance.SendFindGuild(lastQuery);
@@ -76,12 +136,17 @@
    private void OnCreateGuildBtnClick()
    {
        // TODO: 实现创建公会逻辑
        UIManager.Instance.OpenWindow<GuildCreateWin>();
    }
    private void OnQuicklyJoinGuildBtnClick()
    {
        // TODO: 实现快速加入公会逻辑
        if (GuildManager.Instance.pageIndexList.Count == 0)
        {
            SysNotifyMgr.Instance.ShowTip("QuickEnterFamilyFail");
            return;
        }
        GuildManager.Instance.SendApplyGuild(0, 0);
    }
Main/System/Guild/GuildManager.cs
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
@@ -10,10 +10,10 @@
{
    // 申请的公会列表
    private List<int> m_FairyRequesteds = new List<int>();
    // 公会附加数据,按类型存储
    // 公会自定义记录附加数据,按类型存储
    // 公会ID, 类型ID, 数据
    public Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>> familyActions = new Dictionary<int, Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction[]>>();
    public event Action<int, int> FamilyActionInfoEvent;
    public event Action<int, int> FamilyActionInfoEvent;    //公会自定义记录, 其他功能从这获取
    public override void Init()
    {
@@ -32,6 +32,9 @@
    {
        m_FairyRequesteds.Clear();
        familyActions.Clear();
        guildChanged = false;
        applyList.Clear();
        PlayerDatas.Instance.fairyData.ClearData();
    }
@@ -46,40 +49,9 @@
    }
    #region 发包
    public void SendKickFairy(uint playerID)
    {
        var pak = new CA605_tagCMDeleteFamilyMember();
        pak.MemberID = playerID;
        GameNetSystem.Instance.SendInfo(pak);
    }
    //申请/撤销 加入公会
    public void SendApplyFairy(uint id, int type)
    {
        if (FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy, true))
        {
            return;
        }
        if (PlayerDatas.Instance.fairyData.HasFairy)
        {
            ServerTipDetails.DisplayNormalTip(Language.Get("HasFairyTip"));
            return;
        }
        CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily();
        rqPack.Type = (byte)type;
        rqPack.TagFamilyID = id;
        GameNetSystem.Instance.SendInfo(rqPack);
    }
    #endregion
    #region 配置
    public int createFairyCost
    {
        get;
@@ -93,6 +65,18 @@
    // 权限ID: 1-收人,2-变更职位,3-发布公告,4-踢人
    // 职位: 0-成员,1-精英,2-副盟主,3-盟主
    public Dictionary<int, int> guildWorkToLevel = new Dictionary<int, int>();
    //退出惩罚
    public int[] quitGuildPunishTime;
    public int[] beQuitGuildPunishTime;
    public int quitGuildPunishMoneyType;
    public int[] quitGuildPunishMoney;
    public int[] beQuitGuildPunishMoney;
    //改名
    public int renameFairyNameCD;
    public int renameFairyNameCost;
    public int renameFairyNameMoneyType;
    void ParseConfig()
    {
@@ -110,13 +94,27 @@
        config = FuncConfigConfig.Get("FamilyPower");
        guildWorkToLevel = ConfigParse.ParseIntDict(config.Numerical1);
        config = FuncConfigConfig.Get("FamilyLeave");
        quitGuildPunishTime = JsonMapper.ToObject<int[]>(config.Numerical1);
        beQuitGuildPunishTime = JsonMapper.ToObject<int[]>(config.Numerical2);
        quitGuildPunishMoneyType = int.Parse(config.Numerical3);
        quitGuildPunishMoney = JsonMapper.ToObject<int[]>(config.Numerical4);
        beQuitGuildPunishMoney = JsonMapper.ToObject<int[]>(config.Numerical5);
        config = FuncConfigConfig.Get("FamilyRename");
        renameFairyNameCD = int.Parse(config.Numerical2);
        var arr = ConfigParse.GetMultipleStr<int>(config.Numerical1);
        renameFairyNameCost = arr[0];
        renameFairyNameMoneyType = arr[1];
    }
    #endregion
    //我的请求加入公会的列表
    public event Action MyRequestJoinEvent;
    public void UpdateFairyRequested(HA501_tagMCNotifyRequestJoinFamilyInfo _package)
    {
        m_FairyRequesteds.Clear();
@@ -124,10 +122,11 @@
        {
            m_FairyRequesteds.Add((int)_package.RequestJoinFamilyIDList[i]);
        }
        MyRequestJoinEvent?.Invoke();
    }
    public bool FairyRequested(int _fairyId)
    public bool IsGuildRequested(int _fairyId)
    {
        return m_FairyRequesteds.Contains(_fairyId);
    }
@@ -145,7 +144,7 @@
    #region 仙盟名限制
    #region 创建公会 改名
    public bool CheckFairyNameLimit(string _name, out int errorCode)
    {
        errorCode = 0;
@@ -160,19 +159,30 @@
            errorCode = 1;
            return false;
        }
        if (UIHelper.IsNumeric(_name))
        {
            errorCode = 2;
            return false;
        }
        return true;
    }
    public void ShowFairyNameErrorTip(int _errorCode)
    {
        switch (_errorCode)
        {
            case 0:
                //空
                SysNotifyMgr.Instance.ShowTip("FamilyNameChangeNoNull");
                break;
            case 1:
                SysNotifyMgr.Instance.ShowTip("FamilyNameChangeUnlegal");
                // 脏字
                SysNotifyMgr.Instance.ShowTip("NameSensitive");
                break;
            case 2:
                // 不能纯数字
                SysNotifyMgr.Instance.ShowTip("NameError3");
                break;
        }
    }
@@ -190,9 +200,90 @@
    }
    int GetJoinCD()
    {
        if (PlayerDatas.Instance.baseData.leaveFamilyTime == 0)
            return 0;
        var quitType = PlayerDatas.Instance.baseData.leaveGuildInfo % 10;
        int quitCount = 0;
        int punishTime = 0;
        if (quitType == 0)
        {
            //被踢
            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 10 % 10;
            if (beQuitGuildPunishTime.Length != 0)
                punishTime = beQuitGuildPunishTime[Math.Min(quitCount, beQuitGuildPunishTime.Length - 1)];
        }
        else if (quitType == 1)
        {
            //主动退出
            quitCount = PlayerDatas.Instance.baseData.leaveGuildInfo / 100;
            if (quitGuildPunishTime.Length != 0)
                punishTime = quitGuildPunishTime[Math.Min(quitCount, quitGuildPunishTime.Length - 1)];
        }
        return TimeUtility.AllSeconds - PlayerDatas.Instance.baseData.leaveFamilyTime - punishTime * 60;
    }
    // 创建公会
    public void CreateGuild(string name, int emblemID, string emblemWord)
    {
        var cdSeconds = GetJoinCD();
        if (cdSeconds > 0)
        {
            SysNotifyMgr.Instance.ShowTip("GuildSys4", TimeUtility.SecondsToHMSEx(cdSeconds));
            return;
        }
        if (!UIHelper.CheckMoneyCount(createMoneyType, createFairyCost, 2))
        {
            return;
        }
        if (emblemWord.Length > 1)
        {
            //预制体输入框限制,不限任意字符都只能输入1个字
            return;
        }
        int error;
        //获取name的字节长度,name可能是中文 或者其他占用3个字符的符号
        if (!UIHelper.SatisfyNameLength(name, out error))
        {
            // TODO 暂时按中文长度提示, 不同语言可根据情况修改
            if (error == 1)
            {
                SysNotifyMgr.Instance.ShowTip("NameError2", 7);
                return;
            }
            else if (error == 2)
            {
                SysNotifyMgr.Instance.ShowTip("NameError1", 2);
                return;
            }
        }
        if (!CheckFairyNameLimit(name, out error))
        {
            ShowFairyNameErrorTip(error);
            return;
        }
        var pack = new CA604_tagCMCreateFamily();
        pack.Name = name;
        pack.EmblemID = (ushort)emblemID;
        pack.EmblemWord = emblemWord;
        GameNetSystem.Instance.SendInfo(pack);
    }
    #endregion
    #region 仙盟商店开启
@@ -229,7 +320,7 @@
    // 公会自定义记录
    public void UpdateFamilyAction(HA513_tagMCFamilyActionInfo _package)
    {
@@ -258,7 +349,7 @@
            return false;
        return true;
    }
    #region 仙盟列表
@@ -305,6 +396,11 @@
        }
        var pack = new CA620_tagCMViewFamilyPage();
        if (!string.IsNullOrEmpty(msg) && UIHelper.IsNumeric(msg))
        {
            msg = DecryptGuildID(msg);
        }
        pack.Msg = msg;
        pack.MsgLen = (byte)msg.Length;
        pack.PageIndex = (byte)pageIndex;
@@ -317,15 +413,15 @@
    public static void SetFairyViewData(FairyData data, HA523_tagMCFamilyViewList.tagMCFamilyView view)
    {
        data.Rank = view.Rank;
        data.FamilyID = view.FamilyID;
        data.FamilyID = (int)view.FamilyID;
        data.FamilyName = view.FamilyName;
        data.LeaderID = view.LeaderID;
        data.LeaderID = (int)view.LeaderID;
        data.LeaderName = view.LeaderName;
        data.FamilyLV = view.FamilyLV;
        data.JoinReview = view.JoinReview;
        data.JoinLVMin = view.JoinLVMin;
        data.ServerID = view.ServerID;
        data.EmblemID = view.EmblemID;
        data.ServerID = (int)view.ServerID;
        data.EmblemID = (int)view.EmblemID;
        data.EmblemWord = view.EmblemWord;
        data.totalFightPower = view.FightPowerEx * Constants.ExpPointValue + view.FightPower;
        data.MemberCount = view.MemberCount;
@@ -348,16 +444,16 @@
        {
            FairyApply apply = new FairyApply();
            apply.Name = vNetData.ReqJoinList[i].Name;
            apply.PlayerID = vNetData.ReqJoinList[i].PlayerID;
            apply.ReqTime = vNetData.ReqJoinList[i].ReqTime;
            apply.PlayerID = (int)vNetData.ReqJoinList[i].PlayerID;
            apply.ReqTime = (int)vNetData.ReqJoinList[i].ReqTime;
            apply.LV = vNetData.ReqJoinList[i].LV;
            apply.Job = vNetData.ReqJoinList[i].Job;
            apply.RealmLV = vNetData.ReqJoinList[i].RealmLV;
            apply.Face = vNetData.ReqJoinList[i].Face;
            apply.FacePic = vNetData.ReqJoinList[i].FacePic;
            apply.TitleID = vNetData.ReqJoinList[i].TitleID;
            apply.Face = (int)vNetData.ReqJoinList[i].Face;
            apply.FacePic = (int)vNetData.ReqJoinList[i].FacePic;
            apply.TitleID = (int)vNetData.ReqJoinList[i].TitleID;
            apply.FightPower = vNetData.ReqJoinList[i].FightPower + vNetData.ReqJoinList[i].FightPowerEx * Constants.ExpPointValue;
            apply.ServerID = vNetData.ReqJoinList[i].ServerID;
            apply.ServerID = (int)vNetData.ReqJoinList[i].ServerID;
            apply.IsOnLine = vNetData.ReqJoinList[i].IsOnLine;
            applyList.Add(apply);
        }
@@ -384,7 +480,167 @@
    {
        return applyList;
    }
    //type 0申请/1撤销 加入公会
    //id 0 代表一键加入
    public void SendApplyGuild(int id, int type)
    {
        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy, true))
        {
            return;
        }
        if (PlayerDatas.Instance.fairyData.HasFairy)
        {
            SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_85890");
            return;
        }
        if (type == 0)
        {
            var cdSeconds = GetJoinCD();
            if (cdSeconds > 0)
            {
                SysNotifyMgr.Instance.ShowTip("GuildSys2", TimeUtility.SecondsToHMSEx(cdSeconds));
                return;
            }
            if (id != 0 && guildsDict.ContainsKey(id))
            {
                if (guildsDict[id].MemberCount >= FamilyConfig.Get(guildsDict[id].FamilyLV).MemberMax)
                {
                    SysNotifyMgr.Instance.ShowTip("jiazu_lhs_202580");
                    return;
                }
            }
        }
        CA602_tagCMRequesJoinFamily rqPack = new CA602_tagCMRequesJoinFamily();
        rqPack.Type = (byte)type;
        rqPack.TagFamilyID = (uint)id;
        GameNetSystem.Instance.SendInfo(rqPack);
    }
    //0 加入,1 申请 2 已申请
    public int GetRequestState(FairyData guildInfo)
    {
        if (IsGuildRequested(guildInfo.FamilyID))
        {
            return 2;
        }
        if (guildInfo.JoinReview != 0)
        {
            return 1;
        }
        return 0;
    }
    #endregion
    public bool guildChanged = false;
    //公会数据变化,请求新的公会信息,如在打开公会列表时请求,其他功能根据自身情况请求
    public void UpdateGuildDataChangeMark(HA521_tagMCFamilyChange netPack)
    {
        if (netPack.Type > 0)
        {
            guildChanged = true;
        }
    }
    public void RequestGuildData()
    {
        if (guildChanged)
        {
            guildChanged = false;
            var pack = new CA626_tagCMGetFamilyInfo();
            GameNetSystem.Instance.SendInfo(pack);
        }
    }
    public void SendKickFairy(uint playerID)
    {
        var pak = new CA605_tagCMDeleteFamilyMember();
        pak.MemberID = playerID;
        GameNetSystem.Instance.SendInfo(pak);
    }
    #region 加密数字
    //1. 将数字补充到10位,不足补0
    //2. 将每个位的数字结合索引 映射到映射表中
    //3. 将映射后的数字拼接成字符串
    //4. 另外一个解密函数,将字符串还原成数字
    int[] map = { 5, 2, 9, 1, 8, 3, 7, 0, 6, 4 };
    int[] reverseMap;
    public string EncryptGuildID(int num)
    {
        if (num < 0)
        {
            Debug.LogError("Invalid number: " + num);
            return "";
        }
        string str = num.ToString().PadLeft(10, '0');
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < str.Length; i++)
        {
            int digit = int.Parse(str[i].ToString());
            int encryptedDigit = map[(digit + i) % 10]; // 结合位置查表
            result.Append(encryptedDigit);
        }
        return "6" + result.ToString();
    }
    public string DecryptGuildID(string encryptedStr)
    {
        if (string.IsNullOrEmpty(encryptedStr) || encryptedStr.Length != 11)
        {
            // Debug.LogError("Invalid encrypted string: " + encryptedStr);
            SysNotifyMgr.Instance.ShowTip("GuildSys6");
            return "";
        }
        encryptedStr = encryptedStr.Substring(1);
        if (reverseMap.IsNullOrEmpty())
        {
            reverseMap = new int[10];
            reverseMap = GenerateReverseMap(map);
        }
        StringBuilder originalStr = new StringBuilder();
        for (int i = 0; i < encryptedStr.Length; i++)
        {
            int encryptedDigit = int.Parse(encryptedStr[i].ToString());
            int originalDigit = (reverseMap[encryptedDigit] - i + 10) % 10; // 反向查表并调整位置
            originalStr.Append(originalDigit);
        }
        return originalStr.ToString().TrimStart('0'); // 去除前导零
    }
    int[] GenerateReverseMap(int[] map)
    {
        for (int i = 0; i < map.Length; i++)
        {
            reverseMap[map[i]] = i; // 反向映射:map[i] -> i
        }
        return reverseMap;
    }
    #endregion
}
Main/System/Guild/GuildPreviewWin.cs
New file
@@ -0,0 +1,129 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 查看其他公会界面
/// </summary>
public class GuildPreviewWin : UIBase
{
    [SerializeField] GuildEmblemCell guildEmblem;
    [SerializeField] Text guildMemberCountText;
    [SerializeField] Text totalFightPowerText;
    [SerializeField] Text guildLevelText;
    [SerializeField] Text guildNameText; //加服务器信息
    [SerializeField] Text guildNumText; //加公会编号
    [SerializeField] Button copyBtn;
    [SerializeField] Text noticeText; //公告
    [SerializeField] AvatarCell leaderAvatar;
    [SerializeField] OfficialTitleCell leaderTitle;
    [SerializeField] Text leaderLevelText;
    [SerializeField] Text guildJobText;
    [SerializeField] Text leaderNameText;
    [SerializeField] Text leaderFightPowerText;
    [SerializeField] Button seePlayerBtn;
    [SerializeField] Button opearteBtn;
    [SerializeField] Text opearteBtnText;
    int guildID;
    int leaderID;
    protected override void InitComponent()
    {
        opearteBtn.AddListener(() =>
        {
            var guildInfo = GuildManager.Instance.guildsDict[guildID];
            if (guildInfo == null) return;
            var state = GuildManager.Instance.GetRequestState(guildInfo);
            GuildManager.Instance.SendApplyGuild(guildID, state == 2 ? 1 : 0);
        });
        copyBtn.AddListener(() =>
        {
            var guildInfo = GuildManager.Instance.guildsDict[guildID];
            if (guildInfo == null) return;
            UIHelper.CopyToClipboard(guildNumText.text);
            SysNotifyMgr.Instance.ShowTip("GuildSys8");
        });
        seePlayerBtn.AddListener(() =>
        {
            OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID);
        });
    }
    protected override void OnPreOpen()
    {
        OtherPlayerDetailManager.Instance.OnRevPackage += OnRevLeaderPackage;
        guildID = functionOrder;
        Display();
    }
    protected override void OnPreClose()
    {
        OtherPlayerDetailManager.Instance.OnRevPackage -= OnRevLeaderPackage;
    }
    void Display()
    {
        var guildInfo = GuildManager.Instance.guildsDict[guildID];
        if (guildInfo == null) return;
        leaderID = guildInfo.LeaderID;
        OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID, (int)ViewPlayerType.viewGuildLeader);
        var config = FamilyConfig.Get(guildInfo.FamilyLV);
        guildEmblem.Display(guildInfo.EmblemID, guildInfo.EmblemWord, 1.3f);
        guildMemberCountText.text = guildInfo.MemberCount + "/" + config.MemberMax;
        totalFightPowerText.text = UIHelper.ReplaceLargeArtNum(guildInfo.totalFightPower);
        guildLevelText.text = Language.Get("L1094") + guildInfo.FamilyLV;
        guildNameText.text = guildInfo.FamilyName + Language.Get("L1039", ServerListCenter.Instance.GetServerName(guildInfo.ServerID));
        guildNumText.text = GuildManager.Instance.EncryptGuildID(guildInfo.FamilyID);
        leaderNameText.text = guildInfo.LeaderName;
        noticeText.text = guildInfo.Broadcast;
        var state = GuildManager.Instance.GetRequestState(guildInfo);
        string key = "";
        switch (state)
        {
            case 1:
                key = "Guild_17";
                break;
            case 2:
                key = "Guild_21";
                break;
            default:
                key = "Guild_22";
                break;
        }
        opearteBtnText.text = Language.Get(key);
    }
    void OnRevLeaderPackage(int viewType, int playerID)
    {
        if (viewType != (int)ViewPlayerType.viewGuildLeader)
        {
            return;
        }
        if (playerID != leaderID)
        {
            return;
        }
        var leaderInfo = OtherPlayerDetailManager.Instance.GetViewPlayerData(playerID);
        leaderAvatar.InitUI(AvatarHelper.GetAvatarModel(0, leaderInfo.Face, leaderInfo.FacePic));
        leaderTitle.InitUI(leaderInfo.RealmLV, leaderInfo.TitleID);
        leaderLevelText.text = leaderInfo.LV.ToString();
        guildJobText.text = RichTextMsgReplaceConfig.GetRichReplace("FAMILY", 3);
        leaderFightPowerText.text = UIHelper.ReplaceLargeArtNum(leaderInfo.FightPower);
    }
}
Main/System/Guild/GuildPreviewWin.cs.meta
copy from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta copy to Main/System/Guild/GuildPreviewWin.cs.meta
File was copied from Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6fb2c77abf75d964d82b4b15659602b9
guid: fd9c288ff11ce574fa551ef39869d5ea
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Guild/GuildViewListCell.cs
@@ -2,20 +2,21 @@
using UnityEngine.UI;
//公会查找列表,也是排行榜
public class GuildViewListCell : CellView
{
    [SerializeField] Image rankImg;
    [SerializeField] Transform rankTextTf;
    [SerializeField] Text rankText;
    [SerializeField] Image guildEmblemImg;
    [SerializeField] GuildEmblemCell guildEmblem;
    [SerializeField] Text guildLevelText;
    [SerializeField] Text guildNameText;
    [SerializeField] Text leaderNameText;
    [SerializeField] Text totalFightPowerText;
    [SerializeField] Text limitText;
    [SerializeField] Button opearteBtn;
    [SerializeField] Text opearteBtnText;
    [SerializeField] Text guildMemberCountText;
    [SerializeField] Button seeGuildBtn;
    public void Display(int index)
@@ -27,6 +28,7 @@
        {
            rankImg.SetActive(true);
            rankImg.SetSprite("guildnum" + guildInfo.Rank);
            rankImg.SetNativeSize();
            rankTextTf.SetActive(false);
        }
        else
@@ -35,12 +37,44 @@
            rankTextTf.SetActive(true);
            rankText.text = guildInfo.Rank.ToString();
        }
        guildEmblem.Display(guildInfo.EmblemID, guildInfo.EmblemWord);
        guildLevelText.text = Language.Get("L1094") + guildInfo.FamilyLV;
        guildNameText.text = guildInfo.FamilyName;
        leaderNameText.text = guildInfo.LeaderName;
        totalFightPowerText.text = guildInfo.totalFightPower.ToString();
        totalFightPowerText.text = UIHelper.ReplaceLargeArtNum(guildInfo.totalFightPower);
        var config = FamilyConfig.Get(guildInfo.FamilyLV);
        guildMemberCountText.text = guildInfo.MemberCount + "/" + config.MemberMax;
        var state = GuildManager.Instance.GetRequestState(guildInfo);
        string key = "";
        switch (state)
        {
            case 1:
                key = "Guild_17";
                break;
            case 2:
                key = "Guild_21";
                break;
            default:
                key = "Guild_22";
                break;
        }
        opearteBtnText.text = Language.Get(key);
        int familyID = guildInfo.FamilyID;
        opearteBtn.AddListener(() =>
        {
            GuildManager.Instance.SendApplyGuild(familyID, state == 2 ? 1 : 0);
        });
        seeGuildBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<GuildPreviewWin>(guildID);
        });
    }
}
Main/System/Guild/PlayerFairyData.cs
@@ -7,17 +7,22 @@
/** 玩家仙盟相关信息缓存数据 */
public class PlayerFairyData
{
    private bool hasFairy = false;
    public bool HasFairy
    {
        get { return hasFairy; }
        get
        {
            if (fairy == null) return false;
            if (fairy.FamilyID == 0) return false;
            return true;
        }
    }
    public FairyData fairy = null;  //自己的公会数据
    public FairyMember mine = null;
    public event Action OnRefreshFairyInfo;
    public event Action OnRefreshFairyMine;
    public event Action OnRefreshFairyMine; //玩家在公会里的数据
    private Dictionary<int, FairyMember> memberDic = new Dictionary<int, FairyMember>();
    // 0-成员,1-精英,2-副盟主,3-盟主
@@ -33,19 +38,18 @@
        {
            fairy = new FairyData();
        }
        fairy.FamilyID = vNetData.FamilyID;
        if (fairy.FamilyID != 0) hasFairy = true;
        fairy.FamilyID = (int)vNetData.FamilyID;
        fairy.FamilyName = UIHelper.ServerStringTrim(vNetData.FamilyName);
        fairy.FamilyLV = vNetData.FamilyLV;
        fairy.FamilyLVExp = vNetData.FamilyLVExp;
        fairy.FamilyLVExp = (int)vNetData.FamilyLVExp;
        fairy.JoinReview = vNetData.JoinReview;
        fairy.JoinLVMin = vNetData.JoinLVMin;
        fairy.ServerID = vNetData.ServerID;
        fairy.EmblemID = vNetData.EmblemID;
        fairy.ServerID = (int)vNetData.ServerID;
        fairy.EmblemID = (int)vNetData.EmblemID;
        fairy.EmblemWord = vNetData.EmblemWord;
        fairy.totalFightPower = vNetData.FightPowerEx * Constants.ExpPointValue + vNetData.FightPower;
        fairy.Broadcast = vNetData.Broadcast;
        fairy.LeaderID = vNetData.LeaderID;
        fairy.LeaderID = (int)vNetData.LeaderID;
        fairy.MemberCount = vNetData.MemberCount;
        mine = null;
@@ -56,28 +60,29 @@
            FairyMember member = new FairyMember();
            memberDic[(int)vNetData.MemberList[i].PlayerID] = member;
            member.PlayerID = vNetData.MemberList[i].PlayerID;
            member.PlayerID = (int)vNetData.MemberList[i].PlayerID;
            member.Name = vNetData.MemberList[i].Name;
            member.JoinTime = vNetData.MemberList[i].JoinTime;
            member.JoinTime = (int)vNetData.MemberList[i].JoinTime;
            member.FmLV = vNetData.MemberList[i].FmLV;
            member.LV = vNetData.MemberList[i].LV;
            member.Job = vNetData.MemberList[i].Job;
            member.RealmLV = vNetData.MemberList[i].RealmLV;
            member.Face = vNetData.MemberList[i].Face;
            member.FacePic = vNetData.MemberList[i].FacePic;
            member.TitleID = vNetData.MemberList[i].TitleID;
            member.Face = (int)vNetData.MemberList[i].Face;
            member.FacePic = (int)vNetData.MemberList[i].FacePic;
            member.TitleID = (int)vNetData.MemberList[i].TitleID;
            member.FightPower = vNetData.MemberList[i].FightPower + vNetData.MemberList[i].FightPowerEx * Constants.ExpPointValue;
            member.ServerID = vNetData.MemberList[i].ServerID;
            member.ContribTotal = vNetData.MemberList[i].ContribTotal;
            member.ContribDay = vNetData.MemberList[i].ContribDay;
            member.DonateCntTotal = vNetData.MemberList[i].DonateCntTotal;
            member.ServerID = (int)vNetData.MemberList[i].ServerID;
            member.ContribTotal = (int)vNetData.MemberList[i].ContribTotal;
            member.ContribDay = (int)vNetData.MemberList[i].ContribDay;
            member.DonateCntTotal = (int)vNetData.MemberList[i].DonateCntTotal;
            member.DonateCntDay = vNetData.MemberList[i].DonateCntDay;
            member.OffTime = vNetData.MemberList[i].OffTime;
            member.OffTime = (int)vNetData.MemberList[i].OffTime;
            if (member.PlayerID == PlayerDatas.Instance.baseData.PlayerID)
            {
                //自己
                mine = member;
                OnRefreshFairyMine?.Invoke();
            }
            // 0-成员,1-精英,2-副盟主,3-盟主
@@ -118,6 +123,13 @@
    }
    #endregion
    public void ClearData()
    {
        fairy = null;
        mine = null;
        memberDic.Clear();
        leaderID = 0;
    }
}
@@ -125,19 +137,19 @@
//公会数据
public class FairyData
{
    public ushort Rank;        //名次,从1开始
    public uint FamilyID;
    public int Rank;        //名次,从1开始
    public int FamilyID;
    public string FamilyName;    //家族名称
    public byte FamilyLV;    //家族等级
    public uint FamilyLVExp;    //家族等级经验
    public byte JoinReview;    //成员加入是否需要审核,默认0自动加入
    public ushort JoinLVMin;    //限制最低可加入的玩家等级
    public uint ServerID;    //区服ID,创建时以族长的区服ID赋值
    public uint EmblemID;    //徽章ID
    public int FamilyLV;    //家族等级
    public int FamilyLVExp;    //家族等级经验
    public int JoinReview;    //成员加入是否需要审核,默认0自动加入
    public int JoinLVMin;    //限制最低可加入的玩家等级
    public int ServerID;    //区服ID,创建时以族长的区服ID赋值
    public int EmblemID;    //徽章ID
    public string EmblemWord;    //徽章文字
    public long totalFightPower;
    public string Broadcast;
    public uint LeaderID;    //族长玩家ID
    public int LeaderID;    //族长玩家ID
    public int MemberCount;
    //查找增加的字段
@@ -147,39 +159,39 @@
public class FairyMember
{
    public uint PlayerID;
    public int PlayerID;
    public string Name;        //size = NameLen
    public uint JoinTime;        //加入家族时时间戳
    public byte FmLV;        //家族职位: 0-成员;1-精英;2-副族长;3-族长
    public ushort LV;        //等级
    public byte Job;        //职业
    public byte RealmLV;        //境界
    public uint Face;        //基本脸型
    public uint FacePic;        //头像框
    public uint TitleID;        //称号
    public int JoinTime;        //加入家族时时间戳
    public int FmLV;        //家族职位: 0-成员;1-精英;2-副族长;3-族长
    public int LV;        //等级
    public int Job;        //职业
    public int RealmLV;        //境界
    public int Face;        //基本脸型
    public int FacePic;        //头像框
    public int TitleID;        //称号
    public long FightPower;        //战力,求余亿部分
    public uint ServerID;        //所属区服ID
    public uint ContribTotal;        //总贡献度
    public uint ContribDay;        //日贡献度
    public uint DonateCntTotal;        //总捐献次数
    public byte DonateCntDay;        //日捐献次数
    public uint OffTime;        // 0-在线; >0-/离线时间戳
    public int ServerID;        //所属区服ID
    public int ContribTotal;        //总贡献度
    public int ContribDay;        //日贡献度
    public int DonateCntTotal;        //总捐献次数
    public int DonateCntDay;        //日捐献次数
    public int OffTime;        // 0-在线; >0-/离线时间戳
}
public class FairyApply
{
    public uint PlayerID;
    public int PlayerID;
    public string Name;      
    public uint ReqTime;        //申请时间戳
    public ushort LV;        //等级
    public byte Job;        //职业
    public byte RealmLV;        //境界
    public uint Face;        //基本脸型
    public uint FacePic;        //头像框
    public uint TitleID;        //称号
    public int ReqTime;        //申请时间戳
    public int LV;        //等级
    public int Job;        //职业
    public int RealmLV;        //境界
    public int Face;        //基本脸型
    public int FacePic;        //头像框
    public int TitleID;        //称号
    public long FightPower;     
    public uint ServerID;        //所属区服ID
    public byte IsOnLine;        //是否在线
    public int ServerID;        //所属区服ID
    public int IsOnLine;        //是否在线
}
//权限ID: 1-收人,2-变更职位,3-发布公告,4-踢人
Main/System/HappyXB/HeroCallResultWin.cs
@@ -334,7 +334,7 @@
        List<string> qualityStrList = new List<string>();
        for (int i = 0; i < qualityList.Count; i++)
        {
            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("equipQualityFormat", Language.Get("CommonQuality" + qualityList[i]))));
            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("L1039", Language.Get("CommonQuality" + qualityList[i]))));
        }
        callTip.text = Language.Get("HeroCall6", needCount, string.Join(Language.Get("L1130"), qualityStrList.ToArray()));
    }
Main/System/HappyXB/HeroCallWin.cs
@@ -106,7 +106,7 @@
        List<string> qualityStrList = new List<string>();
        for (int i = 0; i < qualityList.Count; i++)
        {
            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("equipQualityFormat", Language.Get("CommonQuality" + qualityList[i]))));
            qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("L1039", Language.Get("CommonQuality" + qualityList[i]))));
        }
        callTip.text = Language.Get("HeroCall6", needCount, string.Join(Language.Get("L1130"), qualityStrList.ToArray()));
    }
Main/System/HeroUI/HeroAwakePrivewWin.cs
@@ -61,13 +61,13 @@
            else if (type == 2)
            {
                var skill = SkillConfig.Get(config.SkillID);
                awakeStr = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
                awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
            }
            else
            {
                for (int k = 0; k < config.AttrIDList.Length; k++)
                {
                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", config.SkillIName)) +PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}")) +
                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) +PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}")) +
                        (k == config.AttrIDList.Length - 1 ? "" : "\n");
                }
            }
Main/System/HeroUI/HeroAwakeSuccessWin.cs
@@ -68,10 +68,10 @@
            else
            {
                var beforeSkill = SkillConfig.GetSkillConfig(skill.SkillType, skill.SkillLV - 1);
                beforeSkillText.text = Language.Get("equipQualityFormat", beforeSkill.SkillName) + beforeSkill.Description;
                beforeSkillText.text = Language.Get("L1039", beforeSkill.SkillName) + beforeSkill.Description;
            }
            afterSkillText.text = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
            afterSkillText.text = Language.Get("L1039", skill.SkillName) + skill.Description;
        }
        else
Main/System/HeroUI/HeroBestWin.cs
@@ -312,7 +312,7 @@
                if (nextQualityBreakConfig.AttrIDList[j] == 0)
                    continue;
                string format = i < breakLevel ? "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}") : "{0}+{1}";
                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
                PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[j], nextQualityBreakConfig.AttrValueList[j], format));
            }
@@ -321,7 +321,7 @@
                var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
                if (skill != null)
                {
                    attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
                    attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
                }
                else
                {
@@ -452,13 +452,13 @@
            else if (type == 2)
            {
                var skill = SkillConfig.Get(config.SkillID);
                awakeStr = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
                awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
            }
            else
            {
                for (int k = 0; k < config.AttrIDList.Length; k++)
                {
                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", config.SkillIName)) +
                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) +
                    PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}"))
                    + (k == config.AttrIDList.Length - 1 ? "" : "\n");
                }
Main/System/HeroUI/HeroLVBreakSuccessWin.cs
@@ -76,13 +76,13 @@
            var id = nextQualityBreakConfig.AttrIDList[i];
            if (id == 0)
                continue;
            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
            PlayerPropertyConfig.GetFullDescription(id, nextQualityBreakConfig.AttrValueList[i]));
        }
        if (nextQualityBreakConfig.SkillID != 0)
        {
            var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
            attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
            attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
        }
        potentialText.text = Language.Get("L1100", Language.Get("herocard56"), string.Join(Language.Get("L1112"), attrStrArr));
    }
Main/System/HeroUI/HeroLVBreakWin.cs
@@ -81,7 +81,7 @@
            {
                continue;
            }
            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
            attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
            PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[i], nextQualityBreakConfig.AttrValueList[i]));
        }
        if (nextQualityBreakConfig.SkillID != 0)
@@ -89,7 +89,7 @@
            var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
            if (skill != null)
            {
                attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
                attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
            }
            else
            { 
Main/System/HeroUI/HeroTrainWin.cs
@@ -513,7 +513,7 @@
                if (nextQualityBreakConfig.AttrIDList[j] == 0)
                    continue;
                string format = i < hero.breakLevel ? "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}") : "{0}+{1}";
                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", nextQualityBreakConfig.SkillIName)) +
                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
                PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[j], nextQualityBreakConfig.AttrValueList[j], format));
            }
@@ -522,7 +522,7 @@
                var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
                if (skill != null)
                {
                    attrStrArr.Add(Language.Get("equipQualityFormat", skill.SkillName) + skill.Description);
                    attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
                }
                else
                {
@@ -682,13 +682,13 @@
            else if (type == 2)
            {
                var skill = SkillConfig.Get(config.SkillID);
                awakeStr = Language.Get("equipQualityFormat", skill.SkillName) + skill.Description;
                awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
            }
            else
            {
                for (int k = 0; k < config.AttrIDList.Length; k++)
                {
                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("equipQualityFormat", config.SkillIName)) +
                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) +
                    PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}"))
                    + (k == config.AttrIDList.Length - 1 ? "" : "\n");
                }
Main/System/Main/MainWin.cs
@@ -36,7 +36,6 @@
        base.InitComponent();
        avatarCell.button.AddListener(() => { });
    }
    public override void Refresh()
@@ -71,6 +70,18 @@
        tabButtons[3].UpdateButtonState();
    }
    //外部调用点击功能
    public void ClickFunc(int functionOrder)
    {
        tabButtons[functionOrder].onClick.Invoke();
    }
    //恢复功能按钮状态
    public void RestoreFuncBtn()
    {
        tabButtons[functionOrder].SelectBtn();
    }
    protected override void SelectBottomTab(int index)
    {
        if (index == 3)
@@ -98,6 +109,7 @@
        OpenSubUIByTabIndex();
    }
    //战斗按钮动画
    void ClickAnimation(int index)
    {
        if (isFirstOpen || (functionOrder != 0 && index == 0))
@@ -183,6 +195,14 @@
                AutoFightModel.Instance.StartFight();
            }
        }
        else if (index == 4 && !PlayerDatas.Instance.fairyData.HasFairy)
        {
            //未加入公会不切换标签,打开申请界面
            UIManager.Instance.OpenWindow<GuildJoinWin>();
            return;
        }
        SelectBottomTab(index);
    }
@@ -211,18 +231,15 @@
                    battleWin.SetBattleField(BattleManager.Instance.storyBattleField);
                }
                currentSubUI = UIManager.Instance.OpenWindow<HomeWin>();
                Debug.Log("打开主城界面");
                break;
            case 1:
                currentSubUI = UIManager.Instance.OpenWindow<AffairBaseWin>();
                Debug.Log("打开内政界面");
                break;
            case 2:
                currentSubUI = UIManager.Instance.OpenWindow<HeroBaseWin>(0);
                Debug.Log("打开武将界面");
                break;
            // case 3:
            //     // currentSubUI = UIManager.Instance.OpenUI<QuestUI>();
            //     挑战界面不跳转
            //     Debug.Log("打开挑战界面");
            //     break;
            case 4:
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/System/RoleParticulars/OtherPlayerDetailManager.cs
New file
@@ -0,0 +1,214 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.Linq;
//查看其他玩家的简短信息, 该模块处理数据,其他由各自功能模块处理 通过OnRevPackage
public class OtherPlayerDetailManager : GameSystemManager<OtherPlayerDetailManager>
{
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
    }
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
    }
    public void OnBeforePlayerDataInitialize()
    {
        viewPlayerType = -1;
    }
    public int viewPlayer { get; private set; }
    // 查询类型:根据类型做不同处理
    // 按功能自定义枚举值 EnumHelper的 ViewPlayerType
    public int viewPlayerType { get; private set; }
    private Dictionary<int, ViewPlayerData> viewPlayerDataDic = new Dictionary<int, ViewPlayerData>();
    // 查看类型,玩家ID
    public event Action<int, int> OnRevPackage; //尽量不要用第一个参数viewtype做判断,容易出错
    // 获取其他玩家本地缓存数据
    public ViewPlayerData GetViewPlayerData(int player)
    {
        ViewPlayerData viewPlayerData = null;
        viewPlayerDataDic.TryGetValue(player, out viewPlayerData);
        return viewPlayerData;
    }
    // 向服务端请求其他玩家数据
    public void ViewPlayerDetail(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData)
    {
        if (_playerId == PlayerDatas.Instance.baseData.PlayerID)
        {
            return;
        }
        viewPlayerType = viewType;
        ViewRoleParticulars(_playerId);
    }
    // 向服务端请求玩家数据
    void ViewRoleParticulars(int playerID)
    {
        if (playerID == 0)
        {
            return;
        }
        viewPlayer = playerID;
        if (viewPlayerDataDic.ContainsKey(playerID))
        {
            ViewPlayerData viewPlayerData = viewPlayerDataDic[playerID];
            if ((DateTime.Now - viewPlayerData.getTime).TotalSeconds < 30)
            {
                ShowRoleParticulars(playerID);
                return;
            }
        }
        //CC002_tagCGViewCrossPlayerInfo c002 = new CC002_tagCGViewCrossPlayerInfo();
        CA212_tagCMViewPlayerInfo pak = new CA212_tagCMViewPlayerInfo();
        pak.PlayerID = (uint)playerID;
        GameNetSystem.Instance.SendInfo(pak);
    }
    //本服竞技场假查询模拟封包,返回查看机器人数据 打开RoleParticularsWin界面,专用接口其他地方不要调用
    public void ViewFairyArenaRobot(int playerID, ViewPlayerData _viewPlayerData)
    {
        ViewPlayerData viewPlayerData = null;
        viewPlayer = playerID;
        if (!viewPlayerDataDic.TryGetValue(playerID, out viewPlayerData))
        {
            viewPlayerDataDic.Add(playerID, _viewPlayerData);
        }
        else
        {
            viewPlayerDataDic[playerID] = _viewPlayerData;
        }
        viewPlayerType = (int)ViewPlayerType.viewPlayerData;
        ShowRoleParticulars(playerID);
    }
    public void OnRevRoleEquip(HA705_tagSCQueryPlayerCacheResult package)
    {
        ViewPlayerData viewPlayerData = null;
        if (!viewPlayerDataDic.TryGetValue((int)package.PlayerID, out viewPlayerData))
        {
            viewPlayerData = new ViewPlayerData();
            viewPlayerData.getTime = DateTime.Now;
            viewPlayerDataDic.Add((int)package.PlayerID, viewPlayerData);
        }
        viewPlayerData.getTime = DateTime.Now;
        viewPlayerData.PlayerID = (int)package.PlayerID;
        viewPlayerData.Name = package.PlayerName;
        viewPlayerData.LV = package.LV;
        viewPlayerData.Job = package.Job;
        viewPlayerData.RealmLV = package.RealmLV;
        viewPlayerData.Face = (int)package.Face;
        viewPlayerData.FacePic = (int)package.FacePic;
        viewPlayerData.TitleID = (int)package.TitleID;
        viewPlayerData.ServerID = (int)package.ServerID;
        viewPlayerData.FightPower = package.FightPower + package.FightPowerEx * (long)Constants.ExpPointValue;
        viewPlayerData.FamilyID = (int)package.FamilyID;
        viewPlayerData.FamilyName = package.FamilyName;
        viewPlayerData.FamilyEmblemID = (int)package.FamilyEmblemID;
        if (viewPlayerData.rolePlusData == null)
        {
            //第一次初始化
            viewPlayerData.rolePlusData = new RolePlusData();
        }
        if (package.PlusDataSize != 0)
        {
            viewPlayerData.rolePlusData.AnalysisRolePlusData(package.PlusData);
        }
        ShowRoleParticulars((int)package.PlayerID);
    }
    //尽量不要用第一个参数viewtype做判断,容易出错,比如同时发送两个不同的viewPlayerType请求的时候
    private void ShowRoleParticulars(int playerID)
    {
        // if (viewPlayerType == (int)ViewPlayerType.viewPlayerData)
        // {
        //     if (!WindowCenter.Instance.IsOpen<RoleParticularsWin>())
        //     {
        //         RoleParticularsWin.viewType = viewPlayerType;
        //         WindowCenter.Instance.Open<RoleParticularsWin>();
        //     }
        // }
        OnRevPackage?.Invoke(viewPlayerType, playerID);
        viewPlayerType = -1;
    }
    public class ViewPlayerData
    {
        public int PlayerID;
        public int LV;
        public int RealmLV;
        public string Name;
        public string FamilyName;
        public int Job;
        public int FamilyID;
        public long FightPower;
        public int TitleID;
        public int ServerID;
        public int FamilyEmblemID;
        public int Face;    //脸型
        public int FacePic;    //脸型外框
        public RolePlusData rolePlusData;
        public DateTime getTime;
    }
    public class RolePlusData
    {
        public void AnalysisRolePlusData(string jsonStr)
        {
            try
            {
            }
            catch (Exception e)
            {
                Debug.Log(e.StackTrace);
            }
        }
    }
}
Main/System/RoleParticulars/OtherPlayerDetailManager.cs.meta
Main/System/RoleParticulars/RoleParticularModel.cs
File was deleted
Main/System/Tip/MarqueeWin.cs
@@ -61,7 +61,8 @@
    {
        base.OnOpen();
        // 窗口打开时的逻辑
        m_Effect.Play();
        if (m_Effect.effectId > 0)
            m_Effect.Play();
        cacheCoroutine = StartCoroutine(Co_StartTween());
    }
Main/System/Tip/ServerTipDetails.cs
@@ -27,10 +27,10 @@
            return;
        }
        if (!UIManager.Instance.IsOpened<MarqueeWin>())
        {
            UIManager.Instance.OpenWindow<MarqueeWin>();
        }
        // if (!UIManager.Instance.IsOpened<MarqueeWin>())
        // {
        //     UIManager.Instance.OpenWindow<MarqueeWin>();
        // }
    }
    public static void OnStageLoadFinish()
@@ -40,7 +40,7 @@
        //     m_Marquees.Clear();
        //     return;
        // }
        Co_StageLoadFinish().Forget();
        // Co_StageLoadFinish().Forget();
    }
    private static async UniTask Co_StageLoadFinish()
Main/Utility/EnumHelper.cs
@@ -419,7 +419,7 @@
    Wristband = 8,              //护腕
    Shawl = 9,               //披肩
    Neck = 10,      //项链
    Ring= 11,      //戒指
    Ring = 11,      //戒指
    Amulet = 12,              //护符
    retMax,
@@ -557,7 +557,7 @@
    ModelMark = 119,                       //变形模型Mark  119
    PrizeCoin = 120,                       //奖励点券数   120
    ExAttr11 = 121,                       //扩展属性11  121 现金代币(代金券)
    ExAttr12 = 122,                       //扩展属性12 退出仙盟时间
    ExAttr12 = 122,                       //扩展属性12 记录离开信息,主动离开次数*100 + 被踢次数*10  + 最后一次是否主动离开的,暂时最多累计记录到9次
    ExAttr13 = 123,                       //扩展属性13 服务器组ID
    ExAttr14 = 124,                       //扩展属性14  124
@@ -671,10 +671,10 @@
    default4,   //  环保值 232
    default5,   // 233仙玉负数 
    default6,   // 234灵石负数
    default7,
    default7,
    default8,
    default9,   // 237 地图境界难度
    default10,  // 238 离开仙盟时间戳(包含主动退出或被踢
    default10,  // 238 记录离开时间戳,被踢或主动退出均会更新该值
    default11,  // 239 代表魅力等级
    default12,
    default13,  // 241 古神货币
@@ -691,7 +691,7 @@
    default24,
    default25,
    default26,  // 254 战锤
    default27,
    default27,
    default28,
    default29,
    default30,
@@ -710,6 +710,7 @@
    default43,  // 271 幻境阁积分
    default44,  // 272 武将招募积分
    GoldRush = 285, // 淘金令
    ChallengeVoucher = 286,//挑战凭证
};
@@ -775,7 +776,7 @@
    Guard_1 = 114,                  // 灵守 1
    Guard_2 = 115,                   //灵守 2
    Hero = 150,                 //武将
}
@@ -1152,7 +1153,7 @@
    BatchAlchemyFairy = 36,//批量炼制仙丹
    BossHomeBuyTimes = 37,//boss之家购买次数
    SelfBossBuyTims = 38, //个人boss购买次数
}
@@ -1229,7 +1230,7 @@
    Def_RewardType_HolidayLogin = 37,//节日登录奖励
    Def_RewardType_HolidayTravel = 38,//节日游历奖励
}
@@ -1282,7 +1283,7 @@
    FashionDress = 24,//时装
    JadeDynastyEquip = 25, //诛仙装备
}
@@ -1343,7 +1344,7 @@
    RushAttack = 34,//34 冲锋+伤害,然后效果半径配0时=单攻伤害,配>0时=群攻格子数,配5就等于说群攻5*5
    //35 蓄力模板,搭配效果值 效果ID 1206  A值为能量次数 
    default35,
}
@@ -1649,7 +1650,7 @@
    default1, //升阶
    default2,
    default3,
}
@@ -1817,16 +1818,7 @@
//查询其他玩家数据 用途类型
public enum ViewPlayerType
{
    viewPlayerEquip = 0,    //查看玩家基本信息(装备由请求大境界阶决定),并打开界面
    viewPlayerFightPower = 1,  //查看玩家战力详情,并打开界面
    viewPlayerData = 2,  //查看玩家基本信息,公用
    viewPlayerDataZZ = 3,  //助战场景使用
    viewPlayerDataArena = 4,  //本服竞技场场景使用
    viewPlayerDataFairyKing = 5,  //仙盟联赛王者UI使用
    viewPlayerData = 0,  //查看玩家基本信息,公用打开界面
    viewGuildLeader = 1,  //查看玩家的公会族长信息
    //查询跨服数据从100开始
    viewCrossPlayerEquip = 100,    //查看玩家基本信息(装备由请求大境界阶决定),并打开界面
    viewCrossPlayerFightPower = 101,  //查看玩家战力详情,并打开界面
    viewCrossPlayerData = 102,  //查看玩家基本信息,公用
    viewCrossPlayerDataBlessedLand = 103,  //福地驱赶
}
Main/Utility/TimeUtility.cs
@@ -369,8 +369,8 @@
    }
    //极简显示
    // x天x小时
    // x小时x分
    // x天 或者 x天x小时
    // x小时 或者 x小时x分
    // x分
    // x秒
    public static string SecondsToShortDHMS(int _seconds)
@@ -381,10 +381,18 @@
        int seconds = _seconds % 60;
        if (days > 0)
        {
            if (hours == 0)
            {
                return StringUtility.Contact(days, Language.Get("L1074"));
            }
            return StringUtility.Contact(days, Language.Get("L1074"), hours, Language.Get("L1072"));
        }
        else if (hours > 0)
        {
            if (mins == 0)
            {
                return StringUtility.Contact(hours, Language.Get("L1072"));
            }
            return StringUtility.Contact(hours, Language.Get("L1072"), mins, Language.Get("L1073"));
        }
        else if (mins > 0)
Main/Utility/UIHelper.cs
@@ -325,6 +325,13 @@
        return false;
    }
    // 检查字符串是不是纯整数
    public static bool IsNumeric(string input)
    {
        return int.TryParse(input, out _);
    }
    public static string GetColorNameByItemColor(int itemColor)
    {
        switch (itemColor)
@@ -969,7 +976,7 @@
        {3, PlayerDataType.Silver},
        {41, PlayerDataType.default26},
        {42, PlayerDataType.default33},
        {53, PlayerDataType.ChallengeVoucher},
    };
    public static long GetMoneyCnt(int moneyType)
@@ -1110,6 +1117,11 @@
                {
                    //淘金令
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.GoldRush);
                }
            case 53:
                {
                    //挑战凭证
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.ChallengeVoucher);
                }
            case 98:
                {
@@ -1256,13 +1268,15 @@
        return content;
    }
    //检查名字长度,玩家名和公会名
    //不同国家长度不同,排版不同
    public static bool SatisfyNameLength(string name, out int error)
    {
        error = 0;
        //bool pureChinese = Regex.IsMatch(name, "^[\u4e00-\u9fa5]+$");
        //var chsCount = GetChsCount(name);
        int length = Encoding.Default.GetBytes(name).Length;
        var maxlength = 20;
        var maxlength = 14;  //纯中文不建议超过7个字
        var minlength = 3;
        if (length > maxlength)
        {
@@ -1362,9 +1376,24 @@
    public static string RemoveColor(string content)
    {
    {
        content = WordAnalysis.Color_Start_Regex.Replace(content, string.Empty);
        content = WordAnalysis.Color_End_Regex.Replace(content, string.Empty);
        return content;
    }
    //复制到剪贴板
    // TODO 暂不支持web后续补充
    public static void CopyToClipboard(string text)
    {
        GUIUtility.systemCopyBuffer = text;
        Debug.Log("文字已复制到剪贴板: " + text);
    }
    //获取剪切板内容
    public static string GetClipboardText()
    {
        return GUIUtility.systemCopyBuffer;
    }
}