using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer; public class NotifyInvitePartyReplyHandler { public async Task recvInvitePartyReply(ServerMessage.Types.ReplyInvitePartyNoti notify) { var result = new Result(); // 1. party 체크 var global_party = GameServerApp.getServerLogic().findGlobalEntity(); ArgumentNullException.ThrowIfNull(global_party); var global_party_action = global_party.getEntityAction(); ArgumentNullException.ThrowIfNull(global_party_action); var party_info = await global_party_action.getPartyLeaderGuidAndMemberCount(notify.InvitePartyGuid); if (string.IsNullOrEmpty(party_info.leader_guid)) return; // 2. leader 체크 var leader_login_cache = await PartyHelper.getOtherUserLoginCache(party_info.leader_guid); if (null == leader_login_cache) return; // 3. 리더가 다른 서버로 이동했으면, 그쪽으로 전송 var server_message = new ServerMessage(); if (leader_login_cache.CurrentServer != GameServerApp.getServerLogic().getServerName()) { server_message = new ServerMessage { ReplyInvitePartyNoti = new ServerMessage.Types.ReplyInvitePartyNoti { InvitePartyGuid = notify.InvitePartyGuid, InviteUserGuid = notify.InviteUserGuid, Result = notify.Result } }; PartyHelper.sendToServer(server_message, leader_login_cache.CurrentServer); return; } // 4. send list 삭제 var party = global_party.getParty(notify.InvitePartyGuid); ArgumentNullException.ThrowIfNull(party); server_message = new ServerMessage(); server_message.NtfDeletePartyInviteSend = new(); server_message.NtfDeletePartyInviteSend.PartyGuid = notify.InvitePartyGuid; server_message.NtfDeletePartyInviteSend.InviteUserGuid = notify.InviteUserGuid; PartyHelper.BroadcastToServers(party, server_message, false); // 5. 승락이면서, member 가 2명이면, leader 는 p2pGroup 에 join해야 한다. if (notify.Result == BoolType.True) { var party_action = party.getEntityAction(); ArgumentNullException.ThrowIfNull(party_action); if (party_info.member_count == 2) { _ = await party_action.joinPartyP2PGroup(party_info.leader_guid); _ = await party_action.checkPartyP2PState(party_info.leader_guid, true, true); } return; } // 6. client 에 전송 var player_manager = GameServerApp.getServerLogic().getPlayerManager(); ArgumentNullException.ThrowIfNull(player_manager); if (!player_manager.tryGetUserByPrimaryKey(party_info.leader_guid, out var player)) { Log.getLogger().error($"Failed to get recv user !! - leader[{party_info.leader_guid}] / invite[{notify.InviteUserGuid}] / {nameof(recvInvitePartyReply)}"); return; } var client_message = new ClientToGame { Message = new ClientToGameMessage { ReplyInvitePartyNoti = new ClientToGameMessage.Types.ReplyInvitePartyNoti { InviteUserGuid = notify.InviteUserGuid, InviteUserNickname = notify.InviteUserNickname, Result = notify.Result } } }; PartyHelper.sendToClient(client_message, player.getHostId()); } }