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 { 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 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 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(); 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); } } }