private static void ConnectNewPlayer(NetIncomingMessage msg, string nickname) { // Проверяем что этот аккаунт еще не зайден: if (ServerGame.ServerScene.Accounts.FindIndex(x => x.nickname == nickname) == -1) { SendMap(msg.SenderConnection, Locations.Town); Log.Print("Creating new player: " + nickname); /* Создаем нового игрока в игре */ InitNewPlayer(GetId(msg.SenderConnection), nickname); /* Отдаем новому игроку его уникальный ид */ var nc = new NetCommand(NetCommandType.Connect, (GetId(msg.SenderConnection))); NetOutgoingMessage om = _server.CreateMessage(); om.Write(nc.Serialize()); _server.SendMessage(om, msg.SenderConnection, NetDeliveryMethod.ReliableOrdered); } else { // отвергаем соединение Log.Print("Connection deny. Nickname " + nickname); msg.SenderConnection.Deny("This account already in the game"); msg.SenderConnection.Disconnect("Bye"); } }
public static void SendMap(NetConnection client, Locations location) { // TODO: отдаём начальное состояние мира (карта) var nc = new NetCommand(NetCommandType.SendMap, ServerGame.ServerScene.GetGameLayer(location).SerializeMap()); NetOutgoingMessage om = _server.CreateMessage(); om.Write(nc.Serialize()); _server.SendMessage(om, client, NetDeliveryMethod.ReliableOrdered); }
/// <summary> /// Отсылает всем подключенным клиентам сообщение в чат /// </summary> public static void SendChatMessage(string chatMsg) { var nc = new NetCommand(NetCommandType.Say, chatMsg); NetOutgoingMessage om = _server.CreateMessage(); om.Write(nc.Serialize()); _server.SendMessage(om, _server.Connections, NetDeliveryMethod.ReliableOrdered, 0); }
/// <summary> /// Отсылает всем подключенным клиентам текущее игровое состояние /// </summary> public static void SendGameStateToAll() { if (_server.ConnectionsCount > 0) { foreach (NetConnection netConnection in _server.Connections) { // TODO: не формировать каждый раз одни и те же данные // TODO: Отсылать пакет с состоянием игры по частям (по 10 сущностей, например) if (netConnection.Status == NetConnectionStatus.Connected) { // TODO: Временное решение. Вместо убирания ненужных элементов из полного геймстейта, сразу формируем с нуля для каждого игрока GameState gs = ServerGame.ServerScene.GetGameState(GetId(netConnection)); var nc = new NetCommand(NetCommandType.UpdateGamestate, gs.Serialize()); NetOutgoingMessage om = _server.CreateMessage(); om.Write(nc.Serialize()); try { _server.SendMessage(om, netConnection, NetDeliveryMethod.Unreliable, 0); } catch (NetException e) { Log.Print("NETWORK ERROR: " + e.StackTrace, LogType.Error); } } } } }
/// <summary> /// Оптравляет пакет серверу указанным методом /// </summary> public void Send(NetCommand command, NetDeliveryMethod method) { NetOutgoingMessage om = Client.CreateMessage(command.Serialize()); Client.SendMessage(om, method); }