133 lines
5.8 KiB
C#
133 lines
5.8 KiB
C#
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<GlobalParty>()?.getParty(notify.SummonPartyGuid);
|
|
if (null == party)
|
|
{
|
|
sendReplySummonPartyMemberAsync(notify.SummonPartyGuid, notify.SummonPartyGuid, notify.SummonUserGuid, SummonPartyMemberResultType.NotParty);
|
|
return;
|
|
}
|
|
|
|
// 1-1. 파티멤버 체크
|
|
var party_member_action = party.getEntityAction<GlobalPartyDetailMemberAction>();
|
|
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<SummonPartyMemberResultType> checkSummonUserConditionAsync(GlobalPartyDetail party, Player summon_user)
|
|
{
|
|
// 1. 파티원 체크
|
|
var party_member_attribute = party.getEntityAttribute<PartyMemberAttribute>();
|
|
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<UserAttribute>();
|
|
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);
|
|
}
|
|
} |