Main/Component/UI/Common/ClickScreenOtherSpace.cs
@@ -5,6 +5,7 @@ using System; using UnityEngine.Events; //点击其他区域触发控制显隐 可附加事件 [RequireComponent(typeof(RectTransform))] public class ClickScreenOtherSpace : MonoBehaviour { Main/Component/UI/Common/ClickScreenOtherSpaceEvent.cs
New file @@ -0,0 +1,60 @@ using UnityEngine; using System; //点击其他区域触发事件,无显隐逻辑 [RequireComponent(typeof(RectTransform))] public class ClickScreenOtherSpaceEvent : MonoBehaviour { [SerializeField] RespondType m_RespondType = RespondType.Out; public RespondType respondType { get { return m_RespondType; } set { m_RespondType = value; } } Action m_ClickOtherEvent; public void AddListener(Action _callBack) { m_ClickOtherEvent = null; m_ClickOtherEvent += _callBack; } public void RemoveAllListeners() { m_ClickOtherEvent = null; } private void LateUpdate() { if (Input.GetMouseButtonDown(0)) { var sp = Input.mousePosition; switch (m_RespondType) { case RespondType.In: if (RectTransformUtility.RectangleContainsScreenPoint(this.transform as RectTransform, sp, CameraManager.uiCamera)) { m_ClickOtherEvent?.Invoke(); } break; case RespondType.Out: if (!RectTransformUtility.RectangleContainsScreenPoint(this.transform as RectTransform, sp, CameraManager.uiCamera)) { m_ClickOtherEvent?.Invoke(); } break; } } } public enum RespondType { In, Out, } } Main/Component/UI/Common/ClickScreenOtherSpaceEvent.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 1b96e2cd2e0ab2d43ac77b19db166efe MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/ConfigManager.cs
@@ -46,6 +46,7 @@ typeof(DungeonConfig), typeof(DungeonOpenTimeConfig), typeof(FaceConfig), typeof(FamilyDonateConfig), typeof(FightPowerRatioConfig), typeof(FirstChargeConfig), typeof(GoldRushCampConfig), @@ -237,6 +238,8 @@ ClearConfigDictionary<DungeonOpenTimeConfig>(); // 清空 FaceConfig 字典 ClearConfigDictionary<FaceConfig>(); // 清空 FamilyDonateConfig 字典 ClearConfigDictionary<FamilyDonateConfig>(); // 清空 FightPowerRatioConfig 字典 ClearConfigDictionary<FightPowerRatioConfig>(); // 清空 FirstChargeConfig 字典 Main/Config/Configs/FamilyDonateConfig.cs
New file @@ -0,0 +1,53 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: 2025年10月23日 //-------------------------------------------------------- using System.Collections.Generic; using System; using UnityEngine; using LitJson; public partial class FamilyDonateConfig : ConfigBase<int, FamilyDonateConfig> { static FamilyDonateConfig() { // 访问过静态构造函数 visit = true; } public int DonateType; public string Name; public int DailyCnt; public int MoneyType; public int MoneyValue; public int[][] AwardItemList; public override int LoadKey(string _key) { int key = GetKey(_key); return key; } public override void LoadConfig(string input) { try { string[] tables = input.Split('\t'); int.TryParse(tables[0],out DonateType); Name = tables[1]; int.TryParse(tables[2],out DailyCnt); int.TryParse(tables[3],out MoneyType); int.TryParse(tables[4],out MoneyValue); AwardItemList = JsonMapper.ToObject<int[][]>(tables[5].Replace("(", "[").Replace(")", "]")); } catch (Exception exception) { Debug.LogError(exception); } } } Main/Config/Configs/FamilyDonateConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: b1247462ec68a8c4aa0263dc8fd7c189 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Core/GameEngine/Player/PlayerBaseData.cs
@@ -1,4 +1,5 @@ using System; using Cysharp.Threading.Tasks; public class PlayerBaseData { @@ -12,7 +13,28 @@ public uint ExpPoint; //扩充经验点数(亿) public uint TotalExp; //总经验(小于亿部分) public long curExp { get { return TotalExp + ExpPoint * Constants.ExpPointValue; } } public uint FamilyId; //家族 uint m_FamilyId; public uint FamilyId { get { return m_FamilyId; } set { var beforeFamilyId = m_FamilyId; m_FamilyId = value; if (beforeFamilyId == 0 && m_FamilyId != 0) { GuildManager.Instance.AfterEnterGuild().Forget(); } else if (beforeFamilyId != 0 && m_FamilyId == 0) { GuildManager.Instance.AfterQuitGuild(); } } } public string FamilyName; //家族名称 public uint diamond; //仙玉 public uint bindDiamond; //灵石 Main/Core/GameEngine/Player/PlayerDatas.cs
@@ -105,10 +105,7 @@ break; case PlayerDataType.Family: baseData.FamilyId = value; if (value == 0) { GuildManager.Instance.ClearGuildWhenQuit(); } // if (LocalSave.GetInt("FimilyReport" + PlayerDatas.Instance.baseData.PlayerID) == 0) // { // SDKUtils.Instance.TraceEvent("joinalliance", "", false); Main/Core/NetworkPackage/DTCFile/ServerPack/HA5_Family/DTCA502_tagSCDonateCntInfo.cs
@@ -1,11 +1,12 @@ using UnityEngine; using System.Collections; using UnityEngine; using System.Collections; // A5 02 捐献次数信息 #tagSCDonateCntInfo public class DTCA502_tagSCDonateCntInfo : DtcBasic { public override void Done(GameNetPackBasic vNetPack) { base.Done(vNetPack); HA502_tagSCDonateCntInfo vNetData = vNetPack as HA502_tagSCDonateCntInfo; GuildManager.Instance.UpdateDonateInfo(vNetData); } } Main/System/Chat/ChatWin.cs
@@ -218,7 +218,7 @@ { case ChatInfoType.Fairy: { int limit = FuncOpenLVConfig.Get((int)FuncOpenEnum.Fairy).LimitLV; int limit = FuncOpenLVConfig.Get((int)FuncOpenEnum.Guild).LimitLV; if (PlayerDatas.Instance.baseData.LV < limit) { ServerTipDetails.DisplayNormalTip(Language.Get("L1136", limit)); Main/System/Guild/GuildDonateCell.cs
New file @@ -0,0 +1,77 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; //公会捐赠 public class GuildDonateCell : MonoBehaviour { [SerializeField] int donateType; [SerializeField] Text nameText; [SerializeField] Image nameBg; [SerializeField] ItemCell[] itemCells; [SerializeField] Text countText; [SerializeField] Text moneyText; [SerializeField] Image moneyIcon; [SerializeField] Button donateBtn; [SerializeField] Text donateText; public void Display() { var config = FamilyDonateConfig.Get(donateType); nameText.text = config.Name; nameBg.SetSprite("DonateType" + donateType); for (int i = 0; i < itemCells.Length; i++) { if (i < config.AwardItemList.Length) { itemCells[i].SetActive(true); int itemID = config.AwardItemList[i][0]; itemCells[i].Init(new ItemCellModel(itemID, false, config.AwardItemList[i][1])); itemCells[i].button.AddListener(() => { ItemTipUtility.Show(itemID); }); } else { itemCells[i].SetActive(false); } } int donateCnt = 0; if (GuildManager.Instance.donateCntList != null && GuildManager.Instance.donateCntList.Length > 0) { donateCnt = GuildManager.Instance.donateCntList[donateType - 1]; } countText.text = Language.Get("Guild_65") + donateCnt + "/" + config.DailyCnt; moneyText.text = config.MoneyValue.ToString(); moneyIcon.SetIconWithMoneyType(config.MoneyType); if (donateCnt >= config.DailyCnt) { donateBtn.SetInteractable(false); donateText.text = Language.Get("Guild_67"); } else { donateBtn.SetInteractable(true); donateText.text = Language.Get("Guild_66"); donateBtn.AddListener(Donate); } } void Donate() { var config = FamilyDonateConfig.Get(donateType); if (!UIHelper.CheckMoneyCount(config.MoneyType, config.MoneyValue, 2)) { return; } var pack = new CA612_tagCMFamilyMoneyDonate(); pack.DonateType = (byte)donateType; GameNetSystem.Instance.SendInfo(pack); } } Main/System/Guild/GuildDonateCell.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 893ac8f335bb7bb449f4693404144c6f MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/Guild/GuildDonateDetailCell.cs
New file @@ -0,0 +1,35 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 捐赠成员详情 /// </summary> public class GuildDonateDetailCell : CellView { [SerializeField] AvatarCell avatarCell; [SerializeField] OfficialTitleCell titleCell; [SerializeField] Text lvText; [SerializeField] Text nameText; [SerializeField] Text donateTodayCntText; [SerializeField] Text totalDonateCntText; public void Display(int index) { var playerID = PlayerDatas.Instance.fairyData.memberIDList[index]; var playerInfo = PlayerDatas.Instance.fairyData.GetMember(playerID); nameText.text = playerInfo.Name; avatarCell.InitUI(AvatarHelper.GetAvatarModel(0, playerInfo.Face, playerInfo.FacePic)); titleCell.InitUI(playerInfo.RealmLV, playerInfo.TitleID); lvText.text = playerInfo.LV.ToString(); } } Main/System/Guild/GuildDonateDetailCell.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: e069026445990574982a4908325e3282 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/Guild/GuildDonateDetailWin.cs
New file @@ -0,0 +1,30 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 公会捐赠详情界面:排序后做排名显示 /// </summary> public class GuildDonateDetailWin : UIBase { [SerializeField] ScrollerController scroller; [SerializeField] Text myRankText; [SerializeField] Text myTotalCountText; protected override void OnPreOpen() { Display(); } protected override void OnPreClose() { } void Display() { } } Main/System/Guild/GuildDonateDetailWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: ad72ddf0c61dc1a45a3123a16caf119d MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/Guild/GuildDonateWin.cs
New file @@ -0,0 +1,48 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 公会捐赠界面 /// </summary> public class GuildDonateWin : UIBase { [SerializeField] GuildDonateCell[] donateCells; [SerializeField] Button detailBtn; protected override void InitComponent() { detailBtn.AddListener(() => { // UIManager.Instance.OpenWindow<GuildDonateDetailWin>(); }); } protected override void OnPreOpen() { GuildManager.Instance.DonateCntListEvent += DonateCntListEvent; Display(); } protected override void OnPreClose() { GuildManager.Instance.DonateCntListEvent -= DonateCntListEvent; } void Display() { for (int i = 0; i < donateCells.Length; i++) { donateCells[i].Display(); } } void DonateCntListEvent() { Display(); } } Main/System/Guild/GuildDonateWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 9ccfafd7fa206b44fae987f55ce0da86 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/Guild/GuildHallWin.cs
@@ -56,7 +56,7 @@ donateBtn.AddListener(() => { // UIManager.Instance.OpenWindow<GuildDonateWin>(); UIManager.Instance.OpenWindow<GuildDonateWin>(); }); } Main/System/Guild/GuildManager.cs
@@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Text; using Cysharp.Threading.Tasks; using LitJson; using UnityEngine; @@ -28,20 +29,41 @@ } } public byte[] donateCntList; public event Action DonateCntListEvent; public event Action<bool> EnterOrQuitGuildEvent; //进入或退出公会事件 public override void Init() { ParseConfig(); DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk; PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent; } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk; PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent; } public void OnBeforePlayerDataInitialize() void OnBeforePlayerDataInitialize() { ClearGuildData(); } void OnPlayerLoginOk() { UpdateDonateRedPoint(); } void PlayerDataRefreshEvent(PlayerDataType type) { if(type == PlayerDataType.default33) { UpdateDonateRedPoint(); } } void ClearGuildData() @@ -53,15 +75,25 @@ PlayerDatas.Instance.fairyData.ClearData(); } public void ClearGuildWhenQuit() //退出公会 public void AfterQuitGuild() { //退出公会 ClearGuildData(); //需要转到HomeWin界面 且关闭公会相关界面(父子继承关闭) UIManager.Instance.GetUI<MainWin>()?.ClickFunc(0); UpdateDonateRedPoint(); EnterOrQuitGuildEvent?.Invoke(false); } public async UniTask AfterEnterGuild() { //这里还没有公会数据, 后续的包会更新公会数据 await UniTask.Delay(100); UpdateDonateRedPoint(); EnterOrQuitGuildEvent?.Invoke(true); } #region 配置 @@ -524,7 +556,7 @@ //id 0 代表一键加入 public void SendApplyGuild(int id, int type) { if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Fairy, true)) if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Guild, true)) { return; } @@ -674,6 +706,52 @@ } #region 捐赠 public void UpdateDonateInfo(HA502_tagSCDonateCntInfo netPack) { donateCntList = netPack.DonateCntList; DonateCntListEvent?.Invoke(); UpdateDonateRedPoint(); } #endregion #region 红点 Redpoint hallRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.guildHallRedpointID); Redpoint donateRedpoint = new Redpoint(MainRedDot.guildHallRedpointID, MainRedDot.MainGuildRedpoint * 100); void UpdateDonateRedPoint() { if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Guild)) { return; } donateRedpoint.state = RedPointState.None; if (PlayerDatas.Instance.fairyData.fairy == null) { return; } //只有第一档的才需要红点 var config = FamilyDonateConfig.Get(1); if (donateCntList == null) { if (UIHelper.CheckMoneyCount(config.MoneyType, config.MoneyValue)) donateRedpoint.state = RedPointState.Simple; return; } if (donateCntList != null && donateCntList.Length > 0) { if (donateCntList[0] < config.DailyCnt) { if (UIHelper.CheckMoneyCount(config.MoneyType, config.MoneyValue)) donateRedpoint.state = RedPointState.Simple; } } } #endregion #region 加密数字 //1. 将数字补充到10位,不足补0 Main/System/Guild/GuildMemberCell.cs
@@ -16,7 +16,6 @@ [SerializeField] Image guildJobImg; [SerializeField] Text nameText; [SerializeField] Text fightPowerText; [SerializeField] Button seePlayerBtn; [SerializeField] Text contribText; [SerializeField] Text loginTimeText; @@ -47,10 +46,9 @@ fightPowerText.text = UIHelper.ReplaceLargeArtNum(playerInfo.FightPower); seePlayerBtn.AddListener(() => avatarCell.button.AddListener(() => { OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerID); GuildManager.Instance.memberOPIndex = -1; //附带关闭职位调整操作 }); contribText.text = playerInfo.ContribDay + "/" + playerInfo.ContribTotal; Main/System/Guild/GuildMemberOPCell.cs
@@ -8,8 +8,6 @@ /// </summary> public class GuildMemberOPCell : CellView { [SerializeField] Button kickBtn; [SerializeField] Button opearteJobBtn; Main/System/Guild/GuildPreviewWin.cs
@@ -22,7 +22,6 @@ [SerializeField] Text guildJobText; [SerializeField] Text leaderNameText; [SerializeField] Text leaderFightPowerText; [SerializeField] Button seePlayerBtn; [SerializeField] Button opearteBtn; [SerializeField] Text opearteBtnText; @@ -46,7 +45,7 @@ SysNotifyMgr.Instance.ShowTip("GuildSys8"); }); seePlayerBtn.AddListener(() => leaderAvatar.button.AddListener(() => { OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID); }); Main/System/Redpoint/MainRedDot.cs
@@ -54,8 +54,8 @@ public const int RedPoint_OfficialKey = 101; #region 仙盟公用红点 public const int FAIRY_REDPOINT_KEY2 = 10701; #region 仙盟红点 public const int guildHallRedpointID = MainGuildRedpoint * 10; #endregion Main/Utility/EnumHelper.cs
@@ -607,7 +607,7 @@ Rune = 170, //符印碎片 170 RealmPoint = 171, //境界修炼点 171 MagicEssence = 172,//魔精 172 UnionLiven = 173, //仙盟活跃令 UnionLiven = 173, // 公会贡献币 FBHelpPoint = 174, //副本助战积分 174 PlayerPKState = 175, //战斗状态 IsAttackBossState = 176, //是否在打Boss 1 在 0 不在 @@ -818,7 +818,7 @@ Challenge = 2,//挑战 Official = 3,//内政 Realm = 10, //境界 官职 Fairy = 11,// 仙盟 Guild = 11,// 公会 BlessLV = 12, //祝福等级 Store = 16,//商城 HappyFindTreasure = 18,// 英雄招募 Main/Utility/UIHelper.cs
@@ -1010,6 +1010,7 @@ } case 15: { // 公会贡献币 return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.UnionLiven); //return (ulong)ModelCenter.Instance.GetModel<StoreModel>().GetTCBPlayerData(PlayerDataType.UnionLiven); }