초기커밋
This commit is contained in:
61
GameServer/Contents/Party/Action/PartyAction.cs
Normal file
61
GameServer/Contents/Party/Action/PartyAction.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
using ServerCore; using ServerBase;
|
||||
using ServerCommon;
|
||||
|
||||
|
||||
using SESSION_ID = System.Int32;
|
||||
using WORLD_META_ID = System.UInt32;
|
||||
using META_ID = System.UInt32;
|
||||
using ENTITY_GUID = System.String;
|
||||
using ACCOUNT_ID = System.String;
|
||||
using OWNER_GUID = System.String;
|
||||
using USER_GUID = System.String;
|
||||
using CHARACTER_GUID = System.String;
|
||||
using ITEM_GUID = System.String;
|
||||
using PARTY_GUID = System.String;
|
||||
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class PartyAction : EntityActionBase
|
||||
{
|
||||
private PARTY_GUID m_party_guid = string.Empty;
|
||||
|
||||
|
||||
public PartyAction(Player owner)
|
||||
: base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public Task<Result> tryLoadParty()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
|
||||
public PARTY_GUID getPartyGuid() => m_party_guid;
|
||||
public void setPartyGuid(PARTY_GUID partyGuid) => m_party_guid = partyGuid;
|
||||
}
|
||||
}
|
||||
245
GameServer/Contents/Party/Action/PartyInviteAction.cs
Normal file
245
GameServer/Contents/Party/Action/PartyInviteAction.cs
Normal file
@@ -0,0 +1,245 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using PARTY_GUID = System.String;
|
||||
using USER_GUID = System.String;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class PartyInviteAction : EntityActionBase
|
||||
{
|
||||
public PartyInviteAction(PersonalParty owner) : base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public async Task<(Result result, Dictionary<USER_GUID, ServerErrorCode>? err_invites)> inviteParty(List<USER_GUID> invite_users)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var personal_party = getOwner() as PersonalParty;
|
||||
NullReferenceCheckHelper.throwIfNull(personal_party, () => $"personal_party is null !!!");
|
||||
var owner = getOwner().getRootParent() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
// 1. 파티 정보 획득
|
||||
var global_party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>();
|
||||
NullReferenceCheckHelper.throwIfNull(global_party, () => $"global_party is null !!!");
|
||||
var global_party_action = global_party.getEntityAction<GlobalPartyAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(global_party_action, () => $"global_party_action is null !!!");
|
||||
var party = global_party_action.getGlobalPartyDetail(personal_party.getPartyGuid());
|
||||
|
||||
// 2. 초대 조건 체크
|
||||
var check_invite_condition = await checkInviteConditions(party, invite_users);
|
||||
NullReferenceCheckHelper.throwIfNull(check_invite_condition.failed_invites, () => $"check_invite_condition.failed_invites is null !!!");
|
||||
var err_invites = inputInvitePartyErrorMembers(check_invite_condition.failed_invites);
|
||||
NullReferenceCheckHelper.throwIfNull(err_invites, () => $"err_invites is null !!!");
|
||||
|
||||
if (check_invite_condition.result.isFail() || check_invite_condition.failed_invites.Count == invite_users.Count)
|
||||
{
|
||||
return (check_invite_condition.result, err_invites);
|
||||
}
|
||||
|
||||
// 3. 파티 정보가 없으면 새로 생성
|
||||
if (null == party)
|
||||
{
|
||||
(result, party) = await createParty(owner, personal_party.getPartyGuid(), global_party_action);
|
||||
if (result.isFail()) return (result, err_invites);
|
||||
ArgumentNullException.ThrowIfNull(party);
|
||||
}
|
||||
|
||||
// 4. 초대하기
|
||||
var invite_party_send_action = party.getEntityAction<GlobalPartyInvitePartySendAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(invite_party_send_action, () => $"invite_party_send_action is null !!!");
|
||||
|
||||
result = await invite_party_send_action.sendInviteParty(check_invite_condition.success_invites);
|
||||
|
||||
return (result, err_invites);
|
||||
}
|
||||
|
||||
private async Task<(Result result, GlobalPartyDetail? detail)> createParty(Player owner, PARTY_GUID party_guid, GlobalPartyAction global_party_action)
|
||||
{
|
||||
// 1. LoginCache 갱신
|
||||
var user_login_cache_request = PartyHelper.getOwnUserLoginCacheRequest(owner);
|
||||
var user_login_cache = user_login_cache_request?.getLoginCache();
|
||||
NullReferenceCheckHelper.throwIfNull(user_login_cache_request, () => $"user_login_cache_request is null !!!");
|
||||
NullReferenceCheckHelper.throwIfNull(user_login_cache, () => $"user_login_cache is null !!!");
|
||||
|
||||
user_login_cache.PartyGuid = party_guid;
|
||||
|
||||
var result = await user_login_cache_request.upsertLogin();
|
||||
if (result.isFail())
|
||||
{
|
||||
var err_msg = $"Failed to set party guid to user attribute !!! : {nameof(inviteParty)}";
|
||||
result.setFail(ServerErrorCode.PartyCannotSetGuid, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
// 3. party 신규 생성
|
||||
result = await global_party_action.createParty(party_guid, owner.getUserGuid(), owner.getUserNickname());
|
||||
if (result.isFail()) return (result, null);
|
||||
|
||||
var detail = global_party_action.getGlobalPartyDetail(party_guid);
|
||||
ArgumentNullException.ThrowIfNull(detail);
|
||||
|
||||
return (result, detail);
|
||||
}
|
||||
|
||||
private async Task<(Result result, Dictionary<string, string>? success_invites, Dictionary<USER_GUID, ServerErrorCode>? failed_invites)> checkInviteConditions(GlobalPartyDetail? party, IReadOnlyList<USER_GUID> invite_users)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
var owner = getOwner().getRootParent() as Player;
|
||||
ArgumentNullException.ThrowIfNull(owner);
|
||||
|
||||
// 1. 파티장 확인
|
||||
var party_attribute = party?.getEntityAttribute<PartyAttribute>();
|
||||
if (party != null && party_attribute != null && owner.getUserGuid() != party_attribute.PartyLeaderCharGuid)
|
||||
{
|
||||
err_msg = $"Failed to invite users !!! : not party leader - {owner.getUserGuid()}";
|
||||
result.setFail(ServerErrorCode.NotPartyLeader,err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, null, null);
|
||||
}
|
||||
|
||||
// 2. 초대 인원수 확인
|
||||
var party_member_count = party?.getEntityAttribute<PartyMemberAttribute>()?.getPartyMemberCount() ?? 0;
|
||||
if (party != null && party_member_count >= MetaHelper.GameConfigMeta.MaxPartyMembers)
|
||||
{
|
||||
err_msg = $"Failed to invite user !!! : party is full - member count : {party_member_count}";
|
||||
result.set(ServerErrorCode.PartyIsFull, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, null, null);
|
||||
}
|
||||
|
||||
// 3. 초대할 유저 상태 체크
|
||||
var check_invitee_condition = await checkInviteesCondition(party, invite_users);
|
||||
ArgumentNullException.ThrowIfNull(check_invitee_condition);
|
||||
|
||||
return (result, check_invitee_condition.success_invites, check_invitee_condition.failed_invites);
|
||||
}
|
||||
|
||||
private async Task<(Dictionary<string, string> success_invites, Dictionary<string, ServerErrorCode> failed_invites)> checkInviteesCondition(GlobalPartyDetail? party, IReadOnlyList<USER_GUID> invite_users)
|
||||
{
|
||||
var success_invites = new Dictionary<string, string>();
|
||||
var failed_invites = new Dictionary<USER_GUID, ServerErrorCode>();
|
||||
var owner = getOwner().getRootParent() as UserBase;
|
||||
ArgumentNullException.ThrowIfNull(owner);
|
||||
|
||||
foreach (var invitee in invite_users)
|
||||
{
|
||||
var check = await checkCondition(party, owner, invitee);
|
||||
if (! check.isSuccess)
|
||||
{
|
||||
failed_invites.Add(invitee, check.err_code);
|
||||
continue;
|
||||
}
|
||||
|
||||
success_invites.Add(invitee, check.current_server);
|
||||
}
|
||||
|
||||
return (success_invites, failed_invites);
|
||||
}
|
||||
|
||||
private async Task<(bool isSuccess, ServerErrorCode err_code, string current_server)> checkCondition(GlobalPartyDetail? party, UserBase? owner, USER_GUID invitee)
|
||||
{
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
var login_cache = await PartyHelper.getOtherUserLoginCache(owner, invitee);
|
||||
|
||||
// 3-1. login 체크
|
||||
if (null == login_cache)
|
||||
{
|
||||
return (false, ServerErrorCode.TargetUserNotLogIn, string.Empty);
|
||||
}
|
||||
|
||||
// 3-2. concert 체크
|
||||
var location_action = owner.getEntityAction<LocationAction>();
|
||||
ArgumentNullException.ThrowIfNull(location_action);
|
||||
if (location_action.isInConcert())
|
||||
{
|
||||
return (false, ServerErrorCode.InvalidInvitePlace, string.Empty);
|
||||
}
|
||||
|
||||
// 3-3. user block 체크 ( invitor -> invitee )
|
||||
var block_action = owner.getEntityAction<BlockUserAgentAction>();
|
||||
ArgumentNullException.ThrowIfNull(block_action);
|
||||
if (block_action.isBlockUser(invitee))
|
||||
{
|
||||
return (false, ServerErrorCode.BlockedByOther, string.Empty);
|
||||
}
|
||||
|
||||
// 3-4. user block 체크 ( invitee -> invitor )
|
||||
var is_block = await block_action.amIBockedFromOthers(invitee);
|
||||
if (is_block.reuslt.isFail() || is_block.isBlock)
|
||||
{
|
||||
return (false, ServerErrorCode.BlockedFromTarget, string.Empty);
|
||||
}
|
||||
|
||||
// 3-5. 이미 보낸 초대자 인지 체크
|
||||
var send_action = party?.getEntityAction<GlobalPartyInvitePartySendAction>();
|
||||
if (null != party)
|
||||
{
|
||||
var check_send = await (send_action?.isExistCheck(invitee) ?? Task.FromResult(false));
|
||||
if (check_send)
|
||||
{
|
||||
return (false, ServerErrorCode.AlreadyInviteParty, string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
// 3-6. 파티원인지 체크
|
||||
var check_party_member = await checkPartyMember(login_cache.PartyGuid);
|
||||
if (check_party_member)
|
||||
{
|
||||
return (false, ServerErrorCode.JoiningParty, string.Empty);
|
||||
}
|
||||
|
||||
return (true, ServerErrorCode.Success, login_cache.CurrentServer);
|
||||
}
|
||||
|
||||
private async Task<bool> checkPartyMember(PARTY_GUID party_guid)
|
||||
{
|
||||
if (string.IsNullOrEmpty(party_guid)) return false;
|
||||
|
||||
var party_member_cache_request =
|
||||
new PartyMemberCacheRequest(party_guid, GameServerApp.getServerLogic().getRedisConnector());
|
||||
|
||||
var result = await party_member_cache_request.fetchPartyMemberCache();
|
||||
if (result.isFail()) return false;
|
||||
|
||||
var cache = party_member_cache_request.getPartyMemberCache();
|
||||
ArgumentNullException.ThrowIfNull(cache);
|
||||
|
||||
return cache.PartyMembers.Count > 1;
|
||||
}
|
||||
|
||||
private Dictionary<USER_GUID, ServerErrorCode>? inputInvitePartyErrorMembers(Dictionary<USER_GUID, ServerErrorCode>? failed_invites)
|
||||
{
|
||||
return failed_invites?.ToDictionary(fail => fail.Key, fail => fail.Value);
|
||||
}
|
||||
}
|
||||
129
GameServer/Contents/Party/Action/PartyInvitePartyRecvAction.cs
Normal file
129
GameServer/Contents/Party/Action/PartyInvitePartyRecvAction.cs
Normal file
@@ -0,0 +1,129 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using PARTY_GUID = System.String;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class PartyInvitePartyRecvAction : EntityActionBase
|
||||
{
|
||||
private PartyInvitePartyRecvCacheRequest? m_party_invite_party_recv_cache_request { get; set; } = null;
|
||||
|
||||
public PartyInvitePartyRecvAction(Player owner)
|
||||
: base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public async Task<Result> loadInvitePartyRecv()
|
||||
{
|
||||
var player = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(player);
|
||||
|
||||
var attribute = getOwner().getEntityAttribute<PartyInvitePartyRecvsAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(attribute);
|
||||
|
||||
m_party_invite_party_recv_cache_request ??= new(player, GameServerApp.getServerLogic().getRedisConnector());
|
||||
ArgumentNullException.ThrowIfNull(m_party_invite_party_recv_cache_request);
|
||||
|
||||
var result = await m_party_invite_party_recv_cache_request.fetchInvitePartyRecvCache();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromCaches(attribute, new List<CacheBase> { m_party_invite_party_recv_cache_request.getPartyInvitePartyRecvCache()! });
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, DateTime>> getPartyInvitePartyRecvs()
|
||||
{
|
||||
await organizeSendAttribute();
|
||||
|
||||
var attribute = getOwner().getEntityAttribute<PartyInvitePartyRecvsAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(attribute);
|
||||
|
||||
var invites = attribute.getPartyInvitePartyRecvs().ToDictionary(invite => invite.Key, invite => invite.Value);
|
||||
return invites;
|
||||
}
|
||||
|
||||
public async Task<DateTime?> getPartyInvitePartyRecvTime(PARTY_GUID party_guid)
|
||||
{
|
||||
await organizeSendAttribute();
|
||||
|
||||
var attribute = getOwner().getEntityAttribute<PartyInvitePartyRecvsAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(attribute);
|
||||
var invite_recv_time = attribute.getPartyInvitePartyRecvTime(party_guid);
|
||||
ArgumentNullException.ThrowIfNull(invite_recv_time);
|
||||
|
||||
return invite_recv_time;
|
||||
}
|
||||
|
||||
public async Task<Result> addInvitePartyRecv(PARTY_GUID party_guid)
|
||||
{
|
||||
var recv_time = DateTime.UtcNow;
|
||||
|
||||
// redis 저장
|
||||
NullReferenceCheckHelper.throwIfNull(m_party_invite_party_recv_cache_request, () => $"m_party_invite_party_recv_cache_request is null !!! - {party_guid}");
|
||||
var result = await m_party_invite_party_recv_cache_request.addInvitePartyRecvCache(party_guid, recv_time);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
// attribute 저장
|
||||
var attribute = getOwner().getEntityAttribute<PartyInvitePartyRecvsAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(attribute);
|
||||
attribute.addInvitePartyRecv(party_guid, recv_time);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> deleteInvitePartyRecv(PARTY_GUID party_guid)
|
||||
{
|
||||
NullReferenceCheckHelper.throwIfNull(m_party_invite_party_recv_cache_request, () => $"m_party_invite_party_recv_cache_request is null !!! - {party_guid}");
|
||||
var result =
|
||||
await m_party_invite_party_recv_cache_request.deleteInvitePartyRecvCache(new List<PARTY_GUID> { party_guid });
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var attribute = getOwner().getEntityAttribute<PartyInvitePartyRecvsAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(attribute);
|
||||
|
||||
attribute.deleteInvitePartyRecvs(new List<PARTY_GUID> { party_guid });
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task organizeSendAttribute()
|
||||
{
|
||||
NullReferenceCheckHelper.throwIfNull(m_party_invite_party_recv_cache_request, () => $"m_party_invite_party_recv_cache_request is null !!!");
|
||||
var delete_recvs = await m_party_invite_party_recv_cache_request.organizeInvitePartyRecvCache();
|
||||
if (null == delete_recvs) return;
|
||||
|
||||
var attribute = getOwner().getEntityAttribute<PartyInvitePartyRecvsAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(attribute);
|
||||
|
||||
attribute.deleteInvitePartyRecvs(delete_recvs);
|
||||
}
|
||||
}
|
||||
300
GameServer/Contents/Party/Action/PersonalPartyAction.cs
Normal file
300
GameServer/Contents/Party/Action/PersonalPartyAction.cs
Normal file
@@ -0,0 +1,300 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class PersonalPartyAction : EntityActionBase
|
||||
{
|
||||
private PersonalParty? m_party { get; set; }
|
||||
public PersonalPartyAction(Player owner)
|
||||
: base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public bool isParty() => m_party != null;
|
||||
|
||||
public async Task setPersonalParty(string party_guid)
|
||||
{
|
||||
var player = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(player);
|
||||
|
||||
m_party = new PersonalParty(player, party_guid);
|
||||
await m_party.onInit();
|
||||
}
|
||||
|
||||
public async Task<Result> setPersonalPartyGuid(string party_guid)
|
||||
{
|
||||
var owner = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(owner);
|
||||
|
||||
// 1. LoginCache 갱신
|
||||
var user_login_cache_request = PartyHelper.getOwnUserLoginCacheRequest(owner) ;
|
||||
ArgumentNullException.ThrowIfNull(user_login_cache_request);
|
||||
|
||||
var login_cache = user_login_cache_request.getLoginCache();
|
||||
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login cache is null !!! - {owner.toBasicString()}");
|
||||
|
||||
login_cache.PartyGuid = party_guid;
|
||||
var result = await user_login_cache_request.upsertLogin();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> clearPersonalParty()
|
||||
{
|
||||
var result = await setPersonalPartyGuid(string.Empty);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
m_party?.Dispose();
|
||||
m_party = null;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> sendPartyChat(string chat_message)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => "player is null !!");
|
||||
|
||||
// 1. Party 확인
|
||||
if (null == m_party)
|
||||
{
|
||||
var err_msg = $"Failed to send party chat !!! : not party member - {owner.getUserGuid()}";
|
||||
result.setFail(ServerErrorCode.NotPartyMember, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var global_party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>();
|
||||
NullReferenceCheckHelper.throwIfNull(global_party, () => "global party is null !!!");
|
||||
NullReferenceCheckHelper.throwIfNull(m_party, () => "personal party is null !!!");
|
||||
|
||||
var party = global_party.getParty(m_party.getPartyGuid());
|
||||
NullReferenceCheckHelper.throwIfNull(party, () => $"global party detail is null !!! - {m_party.getPartyGuid()} ");
|
||||
|
||||
// 2. 메시지 전송 ( to server )
|
||||
var server_message = new ServerMessage();
|
||||
server_message.NtfPartyChat = new();
|
||||
server_message.NtfPartyChat.PartyGuid = m_party.getPartyGuid();
|
||||
server_message.NtfPartyChat.PartySenderGuid = owner.getUserGuid();
|
||||
server_message.NtfPartyChat.PartySenderNickname = owner.getUserNickname();
|
||||
server_message.NtfPartyChat.PartySendMessage = chat_message;
|
||||
|
||||
PartyHelper.BroadcastToServers(party, server_message, true);
|
||||
|
||||
// 3. 메시지 전송 ( to client )
|
||||
var client_message = ChatNotifyHelper.makeChatMessage(ChatType.Party, owner.getUserNickname(), string.Empty,
|
||||
PlayerStateType.None, chat_message);
|
||||
|
||||
PartyHelper.BroadcastToClients(party, client_message, new List<string>() );
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
public PersonalParty? getPersonalParty() => m_party;
|
||||
|
||||
public async Task<Result> runPartyTick()
|
||||
{
|
||||
var result = new Result();
|
||||
var player = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(player);
|
||||
|
||||
// 1. 파티 상태 체크
|
||||
var party_guid = m_party?.getPartyGuid();
|
||||
if (string.IsNullOrEmpty(party_guid)) return result;
|
||||
|
||||
// 2. 해당 파티 정보 얻기
|
||||
var party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>()?.getParty(party_guid);
|
||||
ArgumentNullException.ThrowIfNull(party);
|
||||
|
||||
var party_action = party.getEntityAction<GlobalPartyDetailAction>();
|
||||
ArgumentNullException.ThrowIfNull(party_action);
|
||||
|
||||
// 3. 파티장 체크
|
||||
if (!party_action.isLeader(player.getUserGuid())) return result;
|
||||
|
||||
// 4. 파티 Keep 실행
|
||||
result = await party_action.keepParty();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<(bool in_party, string party_guid)> hasInParty()
|
||||
{
|
||||
var player = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(player);
|
||||
|
||||
var login_cache_request = PartyHelper.getOwnUserLoginCacheRequest(player);
|
||||
if(login_cache_request == null)
|
||||
{
|
||||
return (false, string.Empty);
|
||||
}
|
||||
|
||||
var login_cache = login_cache_request.getLoginCache();
|
||||
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login cache is null !!! - {player.toBasicString()}");
|
||||
|
||||
return await Task.FromResult((true != login_cache.PartyGuid.isNullOrWhiteSpace(), login_cache.PartyGuid));
|
||||
}
|
||||
|
||||
public async Task<Result> tryLoadParty()
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
var player = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(player);
|
||||
|
||||
// 1. user 의 Party invite recv 가져오기
|
||||
var party_invite_recv_action = player.getEntityAction<PartyInvitePartyRecvAction>();
|
||||
result = await party_invite_recv_action.loadInvitePartyRecv();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
// 2. 파티에 가입중인가?
|
||||
var has_in_party = await hasInParty();
|
||||
if (false == has_in_party.in_party)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// 3. party join 시키기
|
||||
var global_party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>();
|
||||
var global_party_action = global_party?.getEntityAction<GlobalPartyAction>();
|
||||
if (null == global_party_action)
|
||||
{
|
||||
err_msg = $"Fail to get entity action !!! : {nameof(GlobalPartyAction)}";
|
||||
result.setFail(ServerErrorCode.EntityActionNotFound, err_msg );
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var user = PartyHelper.makePartyMember(player.getUserGuid(), player.getUserNickname());
|
||||
result = await global_party_action.joinParty(has_in_party.party_guid, user);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
// 4. 파티 정보 설정
|
||||
await setPersonalParty(has_in_party.party_guid);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> createDefaultParty()
|
||||
{
|
||||
var result = new Result();
|
||||
var owner = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(owner);
|
||||
|
||||
// 1. 파티 존재 여부 체크
|
||||
if (null != m_party)
|
||||
{
|
||||
var err_msg = $"Failed to create party !!! : already party - {m_party.getPartyGuid()}";
|
||||
result.setFail(ServerErrorCode.AlreadyPartyMember, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// 2. 파티 생성
|
||||
var party_guid = Guid.NewGuid().ToString();
|
||||
await setPersonalParty(party_guid);
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
public async Task<Result> leaveParty()
|
||||
{
|
||||
var result = new Result();
|
||||
var log_invokers = new List<ILogInvoker>(3);
|
||||
|
||||
var owner = getOwner() as Player;
|
||||
ArgumentNullException.ThrowIfNull(owner);
|
||||
|
||||
// 1. 파티 상태 체크
|
||||
var party_guid = m_party?.getPartyGuid();
|
||||
if (string.IsNullOrEmpty(party_guid))
|
||||
{
|
||||
var err_msg = "Failed to get party !!! - not in party";
|
||||
result.setFail(ServerErrorCode.NotParty, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
// 2. 해당 파티 정보 얻기
|
||||
var global_party = GameServerApp.getServerLogic().findGlobalEntity<GlobalParty>();
|
||||
var global_party_action = global_party?.getEntityAction<GlobalPartyAction>();
|
||||
ArgumentNullException.ThrowIfNull(global_party_action);
|
||||
|
||||
var party = global_party_action.getGlobalPartyDetail(party_guid);
|
||||
if (null == party) return result;
|
||||
|
||||
var party_info = await global_party_action.getPartyLeaderGuidAndMemberCount(party_guid);
|
||||
|
||||
var party_log_data = PartyBusinessLogHelper.toPartyLogData(party_guid, false);
|
||||
party_log_data.PartyMemberCount -= 1;
|
||||
var party_business_log = new PartyBusinessLog(party_log_data);
|
||||
log_invokers.Add(party_business_log);
|
||||
|
||||
// 3. 파티장인 경우, 리더 전환
|
||||
if (party_info.leader_guid == owner.getUserGuid() && party_info.member_count > 2)
|
||||
{
|
||||
// 3-1. 소환 취소 요청
|
||||
var party_member_action = party.getEntityAction<GlobalPartyDetailMemberAction>();
|
||||
ArgumentNullException.ThrowIfNull(party_member_action);
|
||||
|
||||
var cancel_summon = await party_member_action.cancelAllSummonAsync();
|
||||
if (cancel_summon.result.isFail()) return cancel_summon.result;
|
||||
|
||||
// 3-2. 파티장 위임
|
||||
var party_action = party.getEntityAction<GlobalPartyDetailAction>();
|
||||
ArgumentNullException.ThrowIfNull(party_action);
|
||||
|
||||
(result, var change_leader_guid) = await party_action.changePartyLeader();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var party_leader_member_log_data = PartyBusinessLogHelper.toPartyMemberLogData(party_guid, change_leader_guid, PartyMemberActionType.PartyLeader);
|
||||
var party_leader_member_business_log = new PartyMemberBusinessLog(party_leader_member_log_data);
|
||||
log_invokers.Add(party_leader_member_business_log);
|
||||
}
|
||||
|
||||
var party_member_log_data = PartyBusinessLogHelper.toPartyMemberLogData(party_guid, owner.getUserGuid(), PartyMemberActionType.LeaveParty);
|
||||
var party_member_business_log = new PartyMemberBusinessLog(party_member_log_data);
|
||||
log_invokers.Add(party_member_business_log);
|
||||
|
||||
// 4. 파티 탈퇴 처리
|
||||
result = await global_party_action.leaveParty(party_guid, owner.getUserGuid(), BoolType.False);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
// 5. 개인 파티 정리
|
||||
await clearPersonalParty();
|
||||
|
||||
// 6. Business Log 기록
|
||||
BusinessLogger.collectLogs(new LogActionEx(LogActionType.LeaveParty), owner, log_invokers);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user