private void HandleMessage(DisconnectClientMessage message) { WorldClient[] array = ServerBase <WorldServer> .Instance.FindClients((WorldClient client) => client.Account != null && client.Account.Id == message.AccountId); if (array.Length > 1) { IPCAccessor.logger.Error("Several clients connected on the same account ({0}). Disconnect them all", message.AccountId); } bool flag = false; for (int i = 0; i < array.Length; i++) { WorldClient worldClient = array[i]; if ((flag = (worldClient.Character != null)) && i == 0) { worldClient.Character.Saved += delegate(Character chr) { this.OnCharacterSaved(message); }; } worldClient.Disconnect(); } if (!flag) { base.ReplyRequest(new DisconnectedClientMessage(array.Any <WorldClient>()), message); } }
private void HandleMessage(DisconnectClientMessage message) { var clients = WorldServer.Instance.FindClients(client => client.Account != null && client.Account.Id == message.AccountId).ToArray(); if (clients.Length > 1) { logger.Error("Several clients connected on the same account ({0}). Disconnect them all", message.AccountId); } var isLogged = false; for (var index = 0; index < clients.Length; index++) { var client = clients[index]; isLogged = client.Character != null; // dirty but whatever if (isLogged && index == 0) { Action <Character> ev = null; ev = chr => { client.Character.Saved -= ev; OnCharacterSaved(message); }; client.Character.Saved += ev; } client.Disconnect(); } if (!isLogged && AccountManager.Instance.IsAccountBlocked(message.AccountId, out Character character)) { logger.Warn("Account {0} blocked, waiting release", message.AccountId); Action <Character> ev = null; ev = chr => { character.AccountUnblocked -= ev; ReplyRequest(new DisconnectedClientMessage(true), message); }; character.AccountUnblocked += ev; } else if (!isLogged) { ReplyRequest(new DisconnectedClientMessage(clients.Any()), message); } }
private void OnCharacterSaved(DisconnectClientMessage request) { ReplyRequest(new DisconnectedClientMessage(true), request); }