Files
2025-05-01 07:20:41 +09:00

98 lines
3.1 KiB
C#

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 NICKNAME = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
namespace GameServer
{
public class PlayerManager : UserManagerBase<USER_GUID, NICKNAME, Player>
{
public PlayerManager() { }
public async Task logoutUserAllByKick()
{
var users = getUsers().Values.ToList();
foreach (var user in users)
{
await kickUserByUserGuid(user.getUserGuid(), LogoutReasonType.ExitToService);
}
}
public async Task<bool> kickUserByNickname(string name)
{
await Task.CompletedTask;
if (false == tryGetUserBySubKey(name, out var found_user))
{
var err_msg = $"Already dicsonnected User !!! : nickname:{name}";
Log.getLogger().warn(err_msg);
return false;
}
ArgumentNullException.ThrowIfNull(found_user);
await kickUser(found_user);
return true;
}
public async Task<bool> kickUserByUserGuid(USER_GUID userGuid, LogoutReasonType reason = LogoutReasonType.DuplicatedLogin, string reasonDescription = "")
{
await Task.CompletedTask;
if (false == tryGetUserByPrimaryKey(userGuid, out var found_user))
{
var err_msg = $"Already dicsonnected User !!! : userGuid:{userGuid}";
Log.getLogger().warn(err_msg);
return false;
}
ArgumentNullException.ThrowIfNull(found_user);
await kickUser(found_user, reason, reasonDescription);
return true;
}
private async Task kickUser(Player toKickUser, LogoutReasonType reason = LogoutReasonType.DuplicatedLogin, string reasonDescription = "")
{
ArgumentNullException.ThrowIfNull(toKickUser);
sendLogoutNoti(toKickUser, reason, reasonDescription);
var game_logout_action = toKickUser.getEntityAction<GameLogoutAction>();
ArgumentNullException.ThrowIfNull(game_logout_action);
await game_logout_action.logoutUser();
}
public void sendLogoutNoti(Player player, LogoutReasonType reason, string reasonDescription)
{
ClientToGame gs2cMessage = new ClientToGame();
gs2cMessage.Message = new ClientToGameMessage();
gs2cMessage.Message.NtfLogout = new ClientToGameMessage.Types.GS2C_NTF_LOGOUT();
gs2cMessage.Message.NtfLogout.LogoutReason = reason;
gs2cMessage.Message.NtfLogout.ReasonMessage = reasonDescription;
player.sendPacket(gs2cMessage);
}
}
}