diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 556064d102..387b90d6b2 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -68,6 +68,7 @@ namespace CSNetwork /// Raised when server sends PROTOCOL_GETFRIENDS_RE(207). public event Action FriendListReceived; + public event Action FriendDeletedReceived; /// Raised when server sends PROTOCOL_FRIENDSTATUS(214). Args: roleid, status. public event Action FriendStatusChanged; @@ -633,12 +634,26 @@ namespace CSNetwork OnFriendStatus((friendstatus)protocol); break; + case ProtocolType.PROTOCOL_DELFRIEND_RE: + OnDelFriendRe((delfriend_re)protocol); + break; + default: _logger.Log(LogType.Warning, $"Received unhandled protocol type: {protocol.GetPType()}"); break; } } + private void OnDelFriendRe(delfriend_re p) + { + PostToUnityContext(() => + { + FriendDeletedReceived?.Invoke(p); + if (p != null && p.retcode == 0) + Friend_GetList(); + }); + } + private void HandlePlayerLogout(playerlogout protocol) { // old code of HUNGDK @@ -2538,7 +2553,6 @@ namespace CSNetwork p.Friendid = friendId; p.Localsid = (int)_localsid; SendProtocol(p); - Friend_GetList(); } public void c2s_SendCmdTeamKickMember(int idMember) diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend_re.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend_re.cs new file mode 100644 index 0000000000..f901eec9ed --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend_re.cs @@ -0,0 +1,42 @@ +namespace CSNetwork.Protocols +{ + /// PROTOCOL_DELFRIEND_RE(213). Delete friend response. + public class delfriend_re : Protocol + { + public byte retcode { get; set; } + public int roleid { get; set; } + public int friendid { get; set; } + public uint srclsid { get; set; } + + public delfriend_re() : base(ProtocolType.PROTOCOL_DELFRIEND_RE) { } + + public override Protocol Clone() => new delfriend_re + { + retcode = retcode, + roleid = roleid, + friendid = friendid, + srclsid = srclsid + }; + + public override void Marshal(OctetsStream os) + { + os.Write(retcode); + os.Write(roleid); + os.Write(friendid); + os.Write(srclsid); + } + + public override void Unmarshal(OctetsStream os) + { + retcode = os.ReadByte(); + roleid = os.ReadInt32(); + friendid = os.ReadInt32(); + srclsid = os.ReadUInt32(); + } + + public override int PriorPolicy() => 1; + + public override bool SizePolicy(int size) => size <= 32; + } +} + diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend_re.cs.meta b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend_re.cs.meta new file mode 100644 index 0000000000..ec990c57c9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/Protocols/delfriend_re.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2c7fd991e4b531e48856e282ffee5cf2 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgFriendList.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgFriendList.cs index ba44ae801e..4ad0b7e7b0 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgFriendList.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgFriendList.cs @@ -130,12 +130,7 @@ namespace BrewMonster if (m_deleteBtn != null) { m_deleteBtn.onClick.RemoveAllListeners(); - m_deleteBtn.onClick.AddListener(() => - { - if (_session == null) return; - if (_selectedFriendId <= 0) return; - _session.Friend_Del(_selectedFriendId); - }); + m_deleteBtn.onClick.AddListener(OnDeleteFriendClicked); } if (m_fuctionBtn != null) @@ -329,6 +324,13 @@ namespace BrewMonster _selectedRowOriginalColor = default; } + /// Delete friend: send PROTOCOL_DELFRIEND and wait for server to refresh list. + private void OnDeleteFriendClicked() + { + if (_session == null || _selectedFriendId <= 0) return; + _session.Friend_Del(_selectedFriendId); + } + private void EnsureAddNameInput() { if (_addNameInput != null) return;