public void ConnectToServer(string nickname) { Log.Print("Hello"); Log.Print(String.Format("Connecting to the server {0}:{1}", _ip, Settings.Port), LogType.Network); var config = new NetPeerConfiguration(Settings.GameIdentifier); Client = new NetClient(config); Client.RegisterReceivedCallback(GotMessage); Client.Start(); NetOutgoingMessage hail = Client.CreateMessage("Hail message"); Log.Print("Before connect", LogType.Network); Client.Connect(_ip, Settings.Port, hail); // TODO: Сделать вразумительное ожидание завершения подключения... Thread.Sleep(400); Log.Print("NetStatus: " + Client.ConnectionStatus, LogType.Network); var nc = new NetCommand(NetCommandType.Connect, nickname); Send(nc, NetDeliveryMethod.ReliableOrdered); }
private void CallPlayerUpgrade(UpgradeEventArgs args) { string command = ""; switch (args.Upgrade) { case AcccountUpgrade.Attack: command = "upgradeAttack"; break; case AcccountUpgrade.Hp: command = "upgradeHp"; break; case AcccountUpgrade.Speed: command = "upgradeSpeed"; break; case AcccountUpgrade.Class: command = "upgradeClass"; break; } var nc = new NetCommand(NetCommandType.CallPlayerMethod, command); _netGameClient.Send(nc, NetDeliveryMethod.ReliableOrdered); }
private void OnKeyReleased(CCEventKeyboard e) { Input.OnKeyRelease(e.Keys); if (e.Keys == CCKeys.C) { _netGameClient.SendChatMessage("Hello!"); } if (e.Keys == CCKeys.X) { var nc = new NetCommand(NetCommandType.CallPlayerMethod, "attack.100.100"); _netGameClient.Send(nc, NetDeliveryMethod.ReliableOrdered); } if (e.Keys == CCKeys.Escape) { NetGameClient.Client.Shutdown("Exit by client"); Window.DefaultDirector.PopScene(); } if (e.Keys == CCKeys.T) { Console.WriteLine(MyPlayer.Mask.ToString()); Console.WriteLine(GameLayer.MyAccountState.HpLevel); Console.WriteLine(GameLayer.MyAccountState.AttackLevel); Console.WriteLine(GameLayer.MyAccountState.SpeedLevel); Console.WriteLine(GameLayer.MyAccountState.ClassLevel); } }
/// <summary> /// Формирует состояние своего игрока и отсылает его на сервер /// Если игрок клиента не найден - ищет его /// </summary> private void UpdateMyState() { if (MyPlayer != null) { EntityState myps = EntityState.ParseEntity(MyPlayer); var nc = new NetCommand(NetCommandType.UpdatePlayerstate, myps.Serialize()); _netGameClient.Send(nc, NetDeliveryMethod.Unreliable); } else { Entity myPl = GameLayer.FindEntityById(Id); if (myPl != null) { MyPlayer = (Player) myPl; } } }
private void UpdateControl(float dt) { if (MyPlayer != null) { MyPlayer.Control(dt); // поправка на камеру: if (GameLayer.Camera != null) { var camx = (int) (GameLayer.Camera.TargetInWorldspace.X - Settings.ScreenWidth/2); var camy = (int) (GameLayer.Camera.TargetInWorldspace.Y - Settings.ScreenHeight/2); if (Input.IsMousePressed(CCMouseButton.LeftButton) && MyPlayer.AttackCooldownCounter == 0) { // Стреляем при нажатой левой кнопке var nc = new NetCommand(NetCommandType.CallPlayerMethod, "attack." + (_mousePosX + camx) + "." + (_mousePosY + camy)); _netGameClient.Send(nc, NetDeliveryMethod.ReliableOrdered); MyPlayer.AttackCooldownCounter = MyPlayer.AttackCooldown; Log.Print(GameLayer.TileAt(_mousePosX + camx, _mousePosY + camy)); } } } }
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 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 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 void SendChatMessage(string text) { var nc = new NetCommand(NetCommandType.Say, text); Send(nc, NetDeliveryMethod.ReliableUnordered); }
/// <summary> /// Оптравляет пакет серверу указанным методом /// </summary> public void Send(NetCommand command, NetDeliveryMethod method) { NetOutgoingMessage om = Client.CreateMessage(command.Serialize()); Client.SendMessage(om, method); }