hch
13 小时以前 bd41d84bbd61de37bd880c591ecce690ebe294bd
65 子 【公会】基础主体 / 【公会】基础主体-客户端
28个文件已修改
6个文件已删除
6 文件已复制
8个文件已添加
2 文件已重命名
2379 ■■■■■ 已修改文件
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/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/DataToCtl/PackageRegedit.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Main.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/StoryBossBattleWin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | 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/GuildCreateWin.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildCreateWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemCell.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemModel.cs 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildEmblemSelectCell.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | 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 152 ●●●●● 补丁 | 查看 | 原始文档 | 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/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 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/TimeUtility.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/UIHelper.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | 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/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/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));
Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3A1_tagMCModuleFightPowerInfo.cs
File was deleted
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);
Main/System/Battle/StoryBossBattleWin.cs
@@ -81,7 +81,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/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/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,53 @@
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.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,65 @@
        // 仅盟主能看到
        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()
    {
        oldShowActiveList.Clear();
        for (int i = 0; i < showList.Count; i++)
        {
            //已解锁的
            if (IsUnLock(showList[i]))
            {
                oldShowActiveList.Add(showList[i]);
            }
        }
    }
    // 已激活>未激活
    private int Cmp(int a, int b)
@@ -180,12 +172,10 @@
        }
        return a.CompareTo(b);
    }
        }
    public int GetSortNum(int emblemID)
    {
        if (!FamilyEmblemConfig.HasKey(emblemID))
            return 0;
        return FamilyEmblemConfig.Get(emblemID).SortNum;
    }
@@ -200,7 +190,7 @@
        return config.UnlockFamilyLV > 0 ? FairyEmblemUnlockMethodType.LV : FairyEmblemUnlockMethodType.Active;
    }
    // 指定的徽章解锁了吗
    // 徽章是否解锁,未加入公会的也可以调用判断
    public bool IsUnLock(int emblemId)
    {
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);
@@ -220,8 +210,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 +233,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 +264,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 +289,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 +298,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,57 @@
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.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,152 @@
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;
    }
    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
File was renamed 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/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
@@ -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
@@ -674,7 +674,7 @@
    default7,   
    default8,
    default9,   // 237 地图境界难度
    default10,  // 238 离开仙盟时间戳(包含主动退出或被踢
    default10,  // 238 记录离开时间戳,被踢或主动退出均会更新该值
    default11,  // 239 代表魅力等级
    default12,
    default13,  // 241 古神货币
@@ -1817,16 +1817,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)
@@ -1256,13 +1263,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 +1371,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;
    }
}