using ET; using FairyGUI; using System; using System.Collections.Generic; namespace ET { public class FriendUIAwakeSyatem : AwakeSystem { public override void Awake(FriendUI self) { self.Awake(); } } public class FriendUIDestroySyatem : DestroySystem { public override void Destroy(FriendUI self) { self.Destroy(); } } public class FriendUI : Entity { public FUI_FriendUI ui; private List familyMemberList = new List(); private List friendList = new List(); private List requestList = new List(); private List familyRequestList = new List(); private Scene zoneScene; public void Awake() { zoneScene = this.ZoneScene(); ui = GetParent(); AwakeAsync().Coroutine(); } private async ETVoid AwakeAsync() { //!临时变量 int page = 0; ui.m_pageList.selectedIndex = 0; ShowPage(ui, page); ui.m_pageList.onClickItem.Set(() => { page = ui.m_pageList.selectedIndex; ShowPage(ui, page); }); ui.m_friendList.itemRenderer = FriendListItemRender; ui.m_famailyList.itemRenderer = FamilyListItemRender; //!+列表点击事件 ui.m_friendList.onClickItem.Set1(context => { if (!context.inputEvent.isDoubleClick) return; int btnIndex = ui.m_friendList.GetChildIndex(context.data as GButton); btnIndex = ui.m_friendList.ChildIndexToItemIndex(btnIndex); FriendInfo friendInfo = friendList[btnIndex]; Game.EventSystem.Publish_Sync(new ET.EventType.MenuPopup { list = new Dictionary> { ["私聊"] = _ => { MainUI.PrivateChat(friendInfo.Id); }, ["删除好友"] = _ => { DeleteFriend(friendInfo); }, } }); }); //!+添加好友 ui.m_btnFindFriend.self.onClick.Set(() => { FUI_TipUI tipUI = TipHelper.OpenUI("请输入您要添加的好友的昵称:", tipType: TipType.DoubleInput); tipUI.m_btnYes.self.onClick.Set(TipYesCallBack); tipUI.AddEventCallBack(TipYesCallBack); async void TipYesCallBack() { string str = tipUI.m_IptTxt.text; if (str.IsNullOrEmpty()) { return; } M2C_FindFriend ret = await zoneScene.GetComponent().Call(new C2M_FindFriend { Name = str }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); return; } AddFriend(this.zoneScene, ret.Id).Coroutine(); } }); //!+申请列表 ui.m_btnRequest.self.onClick.Set(OpRequestUI); #region 家族 ui.m_famailyList.onClickItem.Set1(context => { if (!context.inputEvent.isDoubleClick) return; int btnIndex = ui.m_famailyList.GetChildIndex(context.data as GButton); btnIndex = ui.m_famailyList.ChildIndexToItemIndex(btnIndex); FamilyMemberInfo memberInfo = familyMemberList[btnIndex]; Game.EventSystem.Publish_Sync(new ET.EventType.MenuPopup { list = new Dictionary> { ["私聊"] = _ => { MainUI.PrivateChat(memberInfo.Id); }, ["踢出家族"] = _ => { DeleteMember(memberInfo); }, } }); }); //!创建家族 ui.m_btnCreateFamily.self.onClick.Set(() => { FUI_TipUI tip = TipHelper.OpenUI("请输入家族名称:", true, TipType.DoubleInput); tip.m_btnYes.self.onClick.Set(async () => { string str = tip.m_IptTxt.text; if (str.IsNullOrEmpty()) return; if (str.Length > 9) { TipHelper.OpenUI("名称过长"); return; } if (IllegalWordHelper.DetectIllegalWords(str).Count > 0) { TipHelper.OpenUI("含有敏感字"); return; } M2C_CrateFamily ret = await zoneScene.GetComponent().Call(new C2M_CrateFamily { Name = str }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); return; } RefreshFamilyList(ui, ret.FamilyMemberInfoList, null, ret.Info); }); }); //!解散 ui.m_btnDeleteFamily.self.onClick.Set(async () => { M2C_DeleteFamily ret = await zoneScene.GetComponent().Call(new C2M_DeleteFamily { }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); return; } ClearPage(ui, 1); }); //!申请加入家族 ui.m_btnRequestFamily.self.onClick.Set(() => { Game.EventSystem.Publish(new ET.EventType.ShowTipUI { zoneScene = ui.ZoneScene(), tip = "请输入您想要查找的家族名称:", isClearIpt = true, tipType = TipType.DoubleInput, okAction = (string inpt) => { RequestEnterFamily(inpt).Coroutine(); }, }).Coroutine(); }); //!处理申请列表 ui.m_btnHandleFamilyRequest.self.onClick.Set(OpFamilyRequestUI); //!退出家族 ui.m_btnQuitFamily.self.onClick.Set(QuitFamily); //!家族boss ui.m_btnFamilyBoss.self.onClick.Set(async () => { await FUIHelper.Open(ui.ZoneScene(), FUIPackage.Friend_FamilyBossUI, WindowPos.Center, null); }); //!申请进入家族 async ETVoid RequestEnterFamily(string inpt) { M2C_FindFamily ret = await zoneScene.GetComponent().Call(new C2M_FindFamily { Name = inpt }); if (!ret.Message.IsNullOrEmpty()) { Game.EventSystem.Publish(new ET.EventType.ShowTipUI { zoneScene = ui.ZoneScene(), tip = ret.Message, tipType = TipType.Single }).Coroutine(); return; } M2C_RequestEnterFamily _ret = await zoneScene.GetComponent().Call(new C2M_RequestEnterFamily { Name = ret.Info.Name }); if (!_ret.Message.IsNullOrEmpty()) { Game.EventSystem.Publish(new ET.EventType.ShowTipUI { zoneScene = ui.ZoneScene(), tip = _ret.Message, tipType = TipType.Single }).Coroutine(); return; } } #endregion await ETTask.CompletedTask; } private void DeleteMember(FamilyMemberInfo memberInfo) { FUI_TipUI tipUI = TipHelper.OpenUI("是否从家族移除此成员", tipType: TipType.Double); tipUI.m_btnYes.self.onClick.Set(TipYesCallBack); tipUI.AddEventCallBack(TipYesCallBack); async void TipYesCallBack() { M2C_DeleteFamilyMember ret = await zoneScene.GetComponent().Call(new C2M_DeleteFamilyMember { UnitId = memberInfo.Id }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); return; } ShowFamilyList(ui).Coroutine(); } } private void DeleteFriend(FriendInfo friendInfo) { FUI_TipUI tipUI = TipHelper.OpenUI("是否删除此好友", tipType: TipType.Double); tipUI.m_btnYes.self.onClick.Set(TipYesCallBack); tipUI.AddEventCallBack(TipYesCallBack); async void TipYesCallBack() { M2C_DeleteFriend ret = await zoneScene.GetComponent().Call(new C2M_DeleteFriend { Id = friendInfo.Id }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); return; } ShowFriendList(ui).Coroutine(); } } private void ShowPage(FUI_FriendUI ui, int page) { ui.m_page.selectedIndex = page; switch (page) { default: break; case 0: //!展示好友 ShowFriendList(ui).Coroutine(); break; case 1: //!展示家族 ShowFamilyList(ui).Coroutine(); break; } } private void ClearPage(FUI_FriendUI ui, int page) { switch (page) { default: break; case 0: //!好友 不会把 break; case 1: //!家族 familyMemberList.Clear(); familyRequestList.Clear(); //!+设置好友虚拟列表 ui.m_famailyList.numItems = 0; ui.m_famailyList.RefreshVirtualList(); //!设置信息 ui.m_txtFamilyName.text = "您还没有家族"; ui.m_txtFamilyNotice.text = null; ui.m_txtFamilyInfo.text = null; ui.m_txtFamilyHornor.text = null; ui.m_txtFamilyCount.text = null; ui.m_txtFamilyLevel.text = null; break; } } #region 家族 private async ETVoid ShowFamilyList(FUI_FriendUI ui) { M2C_GetFamily ret = await zoneScene.GetComponent().Call(new C2M_GetFamily { }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); ClearPage(ui, 1); return; } RefreshFamilyList(ui, ret.FamilyMemberInfoList, ret.RequestInfoList, ret.Info); } private void RefreshFamilyList(FUI_FriendUI ui, List familyMemberInfoList, List requestList, FamilyInfo info) { familyMemberList.Clear(); familyRequestList.Clear(); if (familyMemberInfoList != null) familyMemberList.AddRange(familyMemberInfoList); if (requestList != null) familyRequestList.AddRange(requestList); //!+设置好友虚拟列表 ui.m_famailyList.numItems = familyMemberList.Count; ui.m_famailyList.RefreshVirtualList(); //!设置信息 ui.m_txtFamilyName.text = info.Name; ui.m_txtFamilyNotice.text = " " + info.Notice; string positionStr = null; foreach (FamilyPositionMap item in info.PositinMapList) { switch (item.Position) { case FamilyPosition.FamilyLeader: positionStr += $"族长:{item.Name}"; break; case FamilyPosition.FamilyDeputyLeader: positionStr += $"副族长:{item.Name}"; break; case FamilyPosition.FamilyMember: break; default: break; } } ui.m_txtFamilyInfo.text = positionStr; ui.m_txtFamilyHornor.text = $"荣誉值:{info.Hornor}"; ui.m_txtFamilyCount.text = $"家族人数:{familyMemberList.Count}"; ui.m_txtFamilyLevel.text = $"等级:{info.Level}"; } private void FamilyListItemRender(int index, GObject item) { GButton btn = item.asButton; FUI_ButtonFamilyItem btnItem = FUI_ButtonFamilyItem.GetFormPool(this.ui, btn); FamilyMemberInfo familyInfo = familyMemberList[index]; btnItem.m_txtName.text = familyInfo.Name; btnItem.m_txtLevel.text = familyInfo.Level + ""; if (!familyInfo.dic.TryGetValue(familyInfo.Id, out int value)) value = 0; btnItem.m_txtContribution.text = value + string.Empty; btnItem.m_txtJob.text = TabHelper.GetStrJob(familyInfo.Job); string state; switch (familyInfo.LastLginTime) { default: state = (DateTime.UtcNow - DateTimeOffset.FromUnixTimeMilliseconds(familyInfo.LastLginTime).DateTime).ToString("hh\\:mm") + "前"; break; case -1: state = "未知"; break; case 0: state = "在线"; break; } btnItem.m_txtState.text = state; } private void QuitFamily() { Game.EventSystem.Publish(new ET.EventType.ShowTipUI { zoneScene = ui.ZoneScene(), tip = "是否退出家族", tipType = TipType.Double, okAction = async str => { M2C_LeaveFamily ret = await zoneScene.GetComponent().Call(new C2M_LeaveFamily { }); if (!ret.Message.IsNullOrEmpty()) { Game.EventSystem.Publish(new ET.EventType.ShowTipUI { zoneScene = ui.ZoneScene(), tip = ret.Message, tipType = TipType.Single }).Coroutine(); } }, }).Coroutine(); } private void OpFamilyRequestUI() { if (!(FUIComponent.Instance.Get(FUIPackage.Friend_RequestFriendUI) is FUI_RequestFriendUI ui)) { ui = FUI_RequestFriendUI.CreateInstance(this.ui); ui.Name = FUIPackage.Friend_RequestFriendUI; FUIComponent.Instance.Add(ui, true); ui.m_itemList.SetVirtual(); } ui.m_frame.self.title = "家族申请"; FUIWindowComponent window = ui.GetOrAddComponent(); if (window.IsShowing) return; window.Show(); //ui.m_Effect.Play(); window.Window.Center(); ui.m_itemList.itemRenderer = RequestFamilyListItemRender; //!+设置申请虚拟列表 ui.m_itemList.numItems = familyRequestList.Count; ui.m_itemList.RefreshVirtualList(); } private void RequestFamilyListItemRender(int index, GObject item) { GLabel label = item.asLabel; FUI_LabelRequestItem labelItem = FUI_LabelRequestItem.GetFormPool(ui, label); RequestAddFriendInfo friendInfo = familyRequestList[index]; labelItem.self.title = $"昵称:{friendInfo.Name}\r\n[size=16]职业:{TabHelper.GetStrJob(friendInfo.Job)} 等级:{friendInfo.Level} 性别:{CharacterHelper.SexToSTring(friendInfo.Sex)}[/size]"; labelItem.m_btnAgree.onClick.Set(async () => { await SendProto(friendInfo.Id, true); }); labelItem.m_btnRefuse.onClick.Set(async () => { await SendProto(friendInfo.Id, false); }); async ETTask SendProto(long id, bool isAgree) { M2C_HandleEnterFamiy ret = await zoneScene.GetComponent().Call(new C2M_HandleEnterFamiy { Id = id, IsAgree = isAgree }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); return; } } } #endregion #region 好友 private async ETVoid ShowFriendList(FUI_FriendUI ui) { M2C_GetFriend response = await zoneScene.GetComponent().Call(new C2M_GetFriend { }); if (!response.Message.IsNullOrEmpty()) { TipHelper.OpenUI(response.Message); return; } friendList.Clear(); requestList.Clear(); friendList.AddRange(response.FriendInfoList); requestList.AddRange(response.RequestInfoList); //!+设置好友虚拟列表 ui.m_friendList.numItems = friendList.Count; ui.m_friendList.RefreshVirtualList(); } public static async ETVoid AddFriend(Scene zoneScene ,long id) { M2C_AddFriend addret = await zoneScene.GetComponent().Call(new C2M_AddFriend { Id = id }); if (!addret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(addret.Message); return; } TipHelper.OpenUI("已经发送好友申请,请等待对方同意"); } private void OpRequestUI() { if (!(FUIComponent.Instance.Get(FUIPackage.Friend_RequestFriendUI) is FUI_RequestFriendUI ui)) { ui = FUI_RequestFriendUI.CreateInstance(this.ui); ui.Name = FUIPackage.Friend_RequestFriendUI; FUIComponent.Instance.Add(ui, true); ui.m_itemList.SetVirtual(); } FUIWindowComponent window = ui.GetOrAddComponent(); if (window.IsShowing) return; window.Show(); //ui.m_Effect.Play(); window.Window.Center(); ui.m_itemList.itemRenderer = RequestListItemRender; //!+设置申请虚拟列表 ui.m_itemList.numItems = requestList.Count; ui.m_itemList.RefreshVirtualList(); } private void FriendListItemRender(int index, GObject item) { GButton btn = item.asButton; FUI_ButtonFriendItem btnItem = FUI_ButtonFriendItem.GetFormPool(ui, btn); FriendInfo friendInfo = friendList[index]; btnItem.m_txtName.text = friendInfo.Name; btnItem.m_txtLevel.text = friendInfo.Level + ""; btnItem.m_txtJob.text = TabHelper.GetStrJob(friendInfo.Job); string state; switch (friendInfo.LastLginTime) { default: state = (DateTime.UtcNow - DateTimeOffset.FromUnixTimeMilliseconds(friendInfo.LastLginTime).DateTime).ToString("hh\\:mm") + "前"; break; case -1: state = "未知"; break; case 0: state = "在线"; break; } btnItem.m_txtState.text = state; } private void RequestListItemRender(int index, GObject item) { GLabel label = item.asLabel; FUI_LabelRequestItem labelItem = FUI_LabelRequestItem.GetFormPool(ui, label); RequestAddFriendInfo friendInfo = requestList[index]; labelItem.self.title = $"昵称:{friendInfo.Name}\r\n[size=16]职业:{TabHelper.GetStrJob(friendInfo.Job)} 等级:{friendInfo.Level} 性别:{CharacterHelper.SexToSTring(friendInfo.Sex)}[/size]"; labelItem.m_btnAgree.onClick.Set(async () => { await SendProto(friendInfo.Id, true); }); labelItem.m_btnRefuse.onClick.Set(async () => { await SendProto(friendInfo.Id, false); }); async ETTask SendProto(long id, bool isAgree) { M2C_HandleAddFriend ret = await zoneScene.GetComponent().Call(new C2M_HandleAddFriend { Id = id, IsAgree = isAgree }); if (!ret.Message.IsNullOrEmpty()) { TipHelper.OpenUI(ret.Message); return; } } } #endregion public void Destroy() { } } }