예제 #1
0
        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);
        }
예제 #2
0
 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);
 }
예제 #3
0
        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);
            }
        }
예제 #4
0
        /// <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;
                }
            }
        }
예제 #5
0
        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));
                    }
                }
            }
        }
예제 #6
0
        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");
            }
        }
예제 #7
0
 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);
 }
예제 #8
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);
                        }
                    }
                }
            }
        }
예제 #9
0
 /// <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);
 }
예제 #10
0
 /// <summary>
 ///     Отправляет текстовое сообщение в чат на сервер
 /// </summary>
 public void SendChatMessage(string text) {
     var nc = new NetCommand(NetCommandType.Say, text);
     Send(nc, NetDeliveryMethod.ReliableUnordered);
 }
예제 #11
0
 /// <summary>
 ///     Оптравляет пакет серверу указанным методом
 /// </summary>
 public void Send(NetCommand command, NetDeliveryMethod method) {
     NetOutgoingMessage om = Client.CreateMessage(command.Serialize());
     Client.SendMessage(om, method);
 }