using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using USER_GUID = System.String; namespace GameServer; public class NotifySummonPartyMemberHandler { public async Task recvSummonPartyMember(ServerMessage.Types.SummonPartyMemberNoti notify) { var server_logic = GameServerApp.getServerLogic(); string err_msg; ArgumentNullException.ThrowIfNull(server_logic); // 1. 파티 정보 체크 var party = GameServerApp.getServerLogic().findGlobalEntity()?.getParty(notify.SummonPartyGuid); if (null == party) { sendReplySummonPartyMemberAsync(notify.SummonPartyGuid, notify.SummonPartyGuid, notify.SummonUserGuid, SummonPartyMemberResultType.NotParty); return; } // 1-1. 파티멤버 체크 var party_member_action = party.getEntityAction(); ArgumentNullException.ThrowIfNull(party_member_action); await party_member_action.loadPartyMember(); var member = party_member_action.getMember(notify.SummonUserGuid); if (null == member) { err_msg = $"Failed to summon party member !!! - user is not party member - {notify.SummonUserGuid}"; Log.getLogger().error(err_msg); sendReplySummonPartyMemberAsync(notify.SummonServerName, notify.SummonPartyGuid, notify.SummonUserGuid, SummonPartyMemberResultType.NotPartyMember); return; } // 2. 유저 체크 var player_manager = server_logic.getPlayerManager(); ArgumentNullException.ThrowIfNull(player_manager); if (!player_manager.tryGetUserByPrimaryKey(notify.SummonUserGuid, out var summon_user)) { // 2-1. summon user login cache 체크 var login_cache_request = new LoginCacheOtherUserRequest(server_logic, server_logic.getRedisConnector(), notify.SummonUserGuid); var result = await login_cache_request.fetchLogin(); if(result.isFail()) { err_msg = $"Failed to fetchLogin() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return; } var login_cache = login_cache_request.getLoginCache(); if (null == login_cache) { err_msg = $"Failed to summon party member !!! - user not logged in - {notify.SummonUserGuid}"; Log.getLogger().error(err_msg); sendReplySummonPartyMemberAsync(notify.SummonServerName, notify.SummonPartyGuid, notify.SummonUserGuid, SummonPartyMemberResultType.LogOut); return; } // 2-2. target 서버로 전송 var server_message = new ServerMessage(); server_message.SummonPartyMemberNoti = new(); server_message.SummonPartyMemberNoti.SummonPartyGuid = notify.SummonPartyGuid; server_message.SummonPartyMemberNoti.SummonUserGuid = notify.SummonUserGuid; server_message.SummonPartyMemberNoti.SummonServerName = login_cache.CurrentServer; server_message.SummonPartyMemberNoti.SummonPos = notify.SummonPos; PartyHelper.sendToServer(server_message, login_cache.CurrentServer); return; } // 3. Summon User 상태 체크 var check_summon_user_condition = await checkSummonUserConditionAsync(party, summon_user); if (check_summon_user_condition != SummonPartyMemberResultType.Accept) { sendReplySummonPartyMemberAsync(notify.SummonServerName, notify.SummonPartyGuid, notify.SummonUserGuid, check_summon_user_condition); return; } // 3. Summon Message 전송 var client_message = new ClientToGame(); client_message.Message = new ClientToGameMessage(); client_message.Message.SummonPartyMemberNoti = new(); PartyHelper.sendToClient(client_message, summon_user.getHostId()); } private async Task checkSummonUserConditionAsync(GlobalPartyDetail party, Player summon_user) { // 1. 파티원 체크 var party_member_attribute = party.getEntityAttribute(); if (null == party_member_attribute) return SummonPartyMemberResultType.NotParty; var party_member = party_member_attribute.getPartyMember(summon_user.getUserGuid()); if (null == party_member) return SummonPartyMemberResultType.NotParty; // 2. 방해 금지 상태 체크 var user_attribute = summon_user.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!!"); if (user_attribute.PlayerState == PlayerStateType.DontDistrub) return SummonPartyMemberResultType.DoNotDisturb; // 3. 소환 상태 체크 if(false == party_member.Summon.IsAlreadySummon) return SummonPartyMemberResultType.NotSummon; return await Task.FromResult(SummonPartyMemberResultType.Accept); } private void sendReplySummonPartyMemberAsync(string summon_server, string summon_party_guid, USER_GUID summon_user_guid, SummonPartyMemberResultType reply) { var server_message = new ServerMessage(); server_message.ReplySummonPartyMemberNoti = new(); server_message.ReplySummonPartyMemberNoti.SummonPartyGuid = summon_party_guid; server_message.ReplySummonPartyMemberNoti.SummonUserGuid = summon_user_guid; server_message.ReplySummonPartyMemberNoti.Result = reply; PartyHelper.sendToServer(server_message, summon_server); } }