/// <summary>
            /// Encrypt am outgoing message with this algorithm; no writing can be done to the message after encryption, or message will be corrupted
            /// </summary>
            public bool Encrypt(NetOutgoingMessage msg)
            {
                int payloadBitLength = msg.LengthBits;
                int numBytes = msg.LengthBytes;
                int blockSize = BlockSize;
                int numBlocks = (int)Math.Ceiling((double)numBytes / (double)blockSize);
                int dstSize = numBlocks * blockSize;

                msg.EnsureBufferSize(dstSize * 8 + (4 * 8)); // add 4 bytes for payload length at end
                msg.LengthBits = dstSize * 8; // length will automatically adjust +4 bytes when payload length is written

                for (int i = 0; i < numBlocks; i++)
                {
                    EncryptBlock(msg.m_data, (i * blockSize), m_tmp);
                    Buffer.BlockCopy(m_tmp, 0, msg.m_data, (i * blockSize), m_tmp.Length);
                }

                // add true payload length last
                msg.Write((UInt32)payloadBitLength);

                return true;
            }
 public override void WriteToBuffer(NetOutgoingMessage buffer)
 {
     buffer.Write(RequestId);
     buffer.Write(SessionId);
 }
Пример #3
0
 /// <summary>
 /// The encode.
 /// </summary>
 /// <param name="om">
 /// The om.
 /// </param>
 public void Encode(NetOutgoingMessage om)
 {
     om.Write(this.EntityID);
     om.Write(this.InfoID);
     om.Write(this.SenderColor);
 }
Пример #4
0
 public void WriteMessage(NetOutgoingMessage message)
 {
     message.Write(Position.X);
     message.Write(Position.Y);
     message.Write(Rotation);
 }
Пример #5
0
        /// <summary>
        /// Does collision detection between the shooter and the player
        /// </summary>
        /// <param name="shooter"></param>
        static void BulletToPlayer(ServerPlayer shooter)
        {
            // Get the distance between the player and the shooter
            foreach (ServerPlayer player in players)
            {
                // The shooter can't shoot themself, obviously.
                if (player != shooter)
                {
                    // If friendly fire is disabled and the player is
                    // on the same team, don't do collision detection
                    if (!friendlyFire && player.CurrentTeam == shooter.CurrentTeam)
                    {
                        continue;
                    }

                    // Get distance between the player and the enemy
                    Vector2 delta = player.Position - shooter.Position;

                    // Get -2Pi - 2Pi version of the shooter's angle
                    float angle = shooter.Rotation < 0 ? (float)(shooter.Rotation + (2 * Math.PI)) : shooter.Rotation;

                    // Get angle between shooter and player
                    float shooterToPlayerAngle = (float)Math.Atan2(delta.Y, delta.X);

                    // If the angle between the shooter and player is less than 0 radians
                    // add 2 Pi to convert it from -Pi - Pi domain to -2Pi - 2Pi domain
                    shooterToPlayerAngle = shooterToPlayerAngle < 0
                        ? (float)(shooterToPlayerAngle + (2 * Math.PI))
                        : shooterToPlayerAngle;

                    // If the angle of the shooter is within 0.2 radians of the
                    // angle between the shooter and the player, it means they are
                    // not aiming in the opposite direction of the player which would
                    // result in the collision detection returning true
                    if (angle > shooterToPlayerAngle - 0.2f &&
                        angle < shooterToPlayerAngle + 0.2f)
                    {
                        // Get the direction of the shooter
                        Vector2 direction = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));

                        // Get distance between the player and any possible obstacles in between the
                        // player and the enemy
                        RayCastResult result = raycaster.RayCastMethod(shooter.Position, direction, 1280,
                                                                       MapData.TileMap, MapData.MapArea, angle);

                        // Get the delta between the collision point and the shooter
                        Vector2 raycastDistance = result.CollisionPos - shooter.Position;

                        // If the raycast had collided with an object in between two players
                        // the distance of the raycast would be shorter, therefore, the player
                        // has no direct line of sight with the other player
                        if (raycastDistance.Length() > delta.Length())
                        {
                            // If the shot passes through the player and they are alive
                            if (Collision.NonAACollision(shooter.Position,
                                                         shooter.Rotation, new Rectangle(
                                                             (int)player.Position.X - 16, (int)player.Position.Y + 16,
                                                             32, 32), player.Rotation) && player.State == ServerClientInterface.PlayerState.Alive)
                            {
                                // Deal the correct amount of damage depending on the weapon
                                switch (shooter.CurrentWeapon.Weapon)
                                {
                                case WeaponData.Weapon.Knife:
                                    break;

                                case WeaponData.Weapon.Ak47:
                                    player.Damage(12, 0);
                                    break;

                                case WeaponData.Weapon.Glock:
                                    break;

                                case WeaponData.Weapon.Awp:
                                    break;

                                case WeaponData.Weapon.Usp:
                                    break;

                                case WeaponData.Weapon.M4A1:
                                    player.Damage(12, 0);
                                    break;
                                }

                                Console.WriteLine("\"" + shooter.UserName + "\" shot \"" + player.UserName + " with " +
                                                  shooter.CurrentWeapon.Weapon);

                                // If the player's health is less than zero, they died. Let everyone know.
                                if (player.Health <= 0)
                                {
                                    player.SetHealth(0);
                                    player.SetArmor(0);
                                    player.SetState(ServerClientInterface.PlayerState.Dead);
                                    Console.WriteLine(shooter.UserName + " killed " + player.UserName +
                                                      " with " + shooter.CurrentWeapon.Weapon);
                                }

                                // Send data to all players
                                outMsg = server.CreateMessage();
                                outMsg.Write(ServerClientInterface.DAMAGE);
                                outMsg.Write(player.Identifier);
                                outMsg.Write(player.Health);
                                outMsg.Write(player.Armor);
                                server.SendToAll(outMsg, NetDeliveryMethod.UnreliableSequenced);
                            }
                        }
                    }
                }
            }
        }
Пример #6
0
        /// <summary>
        /// Updates and processes requests by users
        /// </summary>
        public static void UpdateNetwork()
        {
            // TODO : Updates the network, recieves input.
            while ((msg = server.ReadMessage()) != null)
            {
                outMsg = server.CreateMessage();
                ServerPlayer player;
                byte         code;
                switch (msg.MessageType)
                {
                case NetIncomingMessageType.StatusChanged:
                    switch ((NetConnectionStatus)msg.ReadByte())
                    {
                    case NetConnectionStatus.Connected:
                        // If someone has successfully connected to the server, check
                        // if there are too many connected clients and prevent entry from
                        // the client if the number of users exceed the max number of players
                        if (numPlayers > maxPlayers)
                        {
                            msg.SenderConnection.Deny("Server Is Full");
                        }

                        // initialize handshake with the client. Give them a unique identifier
                        // which allows the server to differ between multiple clients
                        outMsg.Write(ServerClientInterface.HANDSHAKE);

                        // Send the message
                        server.SendMessage(outMsg, msg.SenderConnection, NetDeliveryMethod.ReliableSequenced);
                        break;

                    case NetConnectionStatus.Disconnected:
                        // Get the player that just disconnected
                        player =
                            players.Find(
                                ply => ply.ConnectionIdentifier == msg.SenderConnection.RemoteUniqueIdentifier);

                        // Tell everyone that the user disconnected
                        outMsg.Write(ServerClientInterface.PLAYER_DISCONNECTED);
                        outMsg.Write(player.Identifier);
                        server.SendToAll(outMsg, NetDeliveryMethod.ReliableSequenced);

                        // Subtract number of players of the associated team
                        switch (player.CurrentTeam)
                        {
                        case ServerClientInterface.Team.CounterTerrorist:
                            numCts--;
                            break;

                        case ServerClientInterface.Team.Terrorist:
                            numTs--;
                            break;
                        }
                        // Subtract one less player on the server
                        numPlayers--;

                        Console.WriteLine("\"" + player.UserName + "\" has left the server");

                        // Remove the player from the server
                        players.Remove(player);
                        break;
                    }
                    break;

                case NetIncomingMessageType.Data:
                    // Get identifier byte used to determine message type
                    code = msg.ReadByte();
                    switch (code)
                    {
                    // A user requested to retrieve information of all players on server
                    case ServerClientInterface.REQUEST_SYNC:
                        string username = msg.ReadString();
                        // Set up a new player in the server
                        player = new ServerPlayer(username, playerIdentifier, msg.SenderConnection.RemoteUniqueIdentifier);
                        players.Add(player);
                        playerIdentifier++;
                        numPlayers++;

                        // Let the client know their information was recieved and processed
                        outMsg.Write(ServerClientInterface.HANDSHAKE_COMPLETE);
                        outMsg.Write(player.Identifier);
                        server.SendMessage(outMsg, msg.SenderConnection, NetDeliveryMethod.ReliableSequenced);

                        // Resend data about players to everyone in order to stay in sync
                        SyncCurrentPlayers();
                        Console.WriteLine("\"" + username + "\" has joined the server");
                        break;

                    case ServerClientInterface.CHANGE_TEAM:
                        // Find the player with the matching unique identifier
                        player = players.Find(
                            ply => ply.ConnectionIdentifier == msg.SenderConnection.RemoteUniqueIdentifier);

                        // Change their team
                        player.SetTeam(msg.ReadByte());

                        // Increase the number of players currently on the
                        // associated team
                        switch (player.CurrentTeam)
                        {
                        case ServerClientInterface.Team.CounterTerrorist:
                            numCts++;
                            break;

                        case ServerClientInterface.Team.Terrorist:
                            numTs++;
                            break;
                        }

                        // Tell everyone else that the player had switched teams and
                        // what team they switched to
                        outMsg.Write(ServerClientInterface.CHANGE_TEAM);
                        outMsg.Write(player.Identifier);
                        outMsg.Write(ServerClientInterface.TeamToByte(player.CurrentTeam));
                        server.SendToAll(outMsg, NetDeliveryMethod.ReliableSequenced);

                        Console.WriteLine("\"" + player.UserName + "\" joined the " + player.CurrentTeam);
                        break;

                    // Movement Processing for 8 directions
                    case ServerClientInterface.MOVE_UP:
                    case ServerClientInterface.MOVE_DOWN:
                    case ServerClientInterface.MOVE_LEFT:
                    case ServerClientInterface.MOVE_RIGHT:
                    case ServerClientInterface.MOVE_UPLEFT:
                    case ServerClientInterface.MOVE_UPRIGHT:
                    case ServerClientInterface.MOVE_DOWNRIGHT:
                    case ServerClientInterface.MOVE_DOWNLEFT:
                        Move(code, msg.SenderConnection.RemoteUniqueIdentifier);
                        break;

                    // Rotation processing
                    case ServerClientInterface.ROTATE_PLAYER:
                        Rotate(msg.ReadFloat(), msg.SenderConnection.RemoteUniqueIdentifier);
                        break;

                    // Weapon buying processing
                    case ServerClientInterface.BUY_WEAPON:
                        byte wep = msg.ReadByte();
                        SpawnWeapon(msg.SenderConnection.RemoteUniqueIdentifier, wep);
                        break;

                    // Weapon firing processing
                    case ServerClientInterface.FIRE_WEAPON:
                        FireWeapon(msg.SenderConnection.RemoteUniqueIdentifier);
                        break;

                    // Flashbang exploding processing
                    case ServerClientInterface.EXPLODE_FLASHBANG:
                        outMsg.Write(ServerClientInterface.EXPLODE_FLASHBANG);
                        server.SendToAll(outMsg, NetDeliveryMethod.UnreliableSequenced);
                        break;

                    // User requested respawn
                    case ServerClientInterface.REQUEST_RESPAWN:
                        // Client requested respawn
                        player =
                            players.Find(
                                ply => ply.ConnectionIdentifier == msg.SenderConnection.RemoteUniqueIdentifier);

                        // If they are dead, respawn the player
                        if (player.State == ServerClientInterface.PlayerState.Dead)
                        {
                            RespawnPlayer(player);
                        }
                        break;
                    }
                    break;
                }
            }
        }
Пример #7
0
        static void Main(string[] args)
        {
            Dictionary <long, IPEndPoint[]> registeredHosts = new Dictionary <long, IPEndPoint[]>();

            NetPeerConfiguration config = new NetPeerConfiguration("master");

            config.SetMessageTypeEnabled(NetIncomingMessageType.UnconnectedData, true);
            config.EnableMessageType(NetIncomingMessageType.DiscoveryRequest);
            config.Port = 15002;

            NetPeer peer = new NetPeer(config);

            peer.Start();

            // keep going until ESCAPE is pressed
            Console.WriteLine("Press ESC to quit");
            while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape)
            {
                NetIncomingMessage msg;
                while ((msg = peer.ReadMessage()) != null)
                {
                    switch (msg.MessageType)
                    {
                    case NetIncomingMessageType.DiscoveryRequest:
                        Console.WriteLine("Discover message from: " + msg.SenderEndPoint);
                        // Create a response and write some example data to it
                        NetOutgoingMessage response = peer.CreateMessage();
                        response.Write("master");

                        // Send the response to the sender of the request
                        peer.SendDiscoveryResponse(response, msg.SenderEndPoint);
                        break;

                    case NetIncomingMessageType.UnconnectedData:
                        //
                        // We've received a message from a client or a host
                        //

                        // by design, the first byte always indicates action
                        switch ((MasterServerMessageType)msg.ReadByte())
                        {
                        case MasterServerMessageType.RegisterHost:

                            // It's a host wanting to register its presence
                            var id = msg.ReadInt64();         // server unique identifier

                            Console.WriteLine("Got registration for host " + id);
                            registeredHosts[id] = new IPEndPoint[]
                            {
                                msg.ReadIPEndPoint(),                                              // internal
                                    msg.SenderEndPoint                                             // external
                            };
                            break;

                        case MasterServerMessageType.RequestHostList:
                            // It's a client wanting a list of registered hosts
                            Console.WriteLine("Sending list of " + registeredHosts.Count + " hosts to client " + msg.SenderEndPoint);
                            // Clear original list.
                            NetOutgoingMessage outMsg = peer.CreateMessage();
                            outMsg.Write(true);
                            peer.SendUnconnectedMessage(outMsg, msg.SenderEndPoint);
                            foreach (var kvp in registeredHosts)
                            {
                                // send registered host to client
                                NetOutgoingMessage om = peer.CreateMessage();
                                om.Write(false);
                                om.Write(kvp.Key);
                                om.Write(kvp.Value[0]);
                                om.Write(kvp.Value[1]);
                                peer.SendUnconnectedMessage(om, msg.SenderEndPoint);
                            }

                            break;

                        case MasterServerMessageType.RequestIntroduction:
                            // It's a client wanting to connect to a specific (external) host
                            IPEndPoint clientInternal = msg.ReadIPEndPoint();
                            long       hostId         = msg.ReadInt64();
                            string     token          = msg.ReadString();

                            Console.WriteLine(msg.SenderEndPoint + " requesting introduction to " + hostId + " (token " + token + ")");

                            // find in list
                            IPEndPoint[] elist;
                            if (registeredHosts.TryGetValue(hostId, out elist))
                            {
                                // found in list - introduce client and host to eachother
                                Console.WriteLine("Sending introduction...");

                                peer.Introduce(
                                    elist[0],           // host internal
                                    elist[1],           // host external
                                    clientInternal,     // client internal
                                    msg.SenderEndPoint, // client external
                                    token               // request token
                                    );
                            }
                            else
                            {
                                Console.WriteLine("Client requested introduction to nonlisted host!");
                            }
                            break;

                        case MasterServerMessageType.RemoveHost:
                            long idRemove = msg.ReadInt64();
                            Console.WriteLine("De-register host " + idRemove);
                            registeredHosts.Remove(idRemove);
                            break;

                        case MasterServerMessageType.HostConnected:
                            long host = msg.ReadInt64();
                            Console.WriteLine("host: " + host + " is connected.");
                            registeredHosts.Remove(host);         // Remove this host.
                            break;
                        }
                        break;

                    case NetIncomingMessageType.DebugMessage:
                    case NetIncomingMessageType.VerboseDebugMessage:
                    case NetIncomingMessageType.WarningMessage:
                    case NetIncomingMessageType.ErrorMessage:
                        // print diagnostics message
                        Console.WriteLine(msg.ReadString());
                        break;
                    }
                }
            }

            peer.Shutdown("shutting down");
        }
 /// <summary>
 /// Puts data into message
 /// </summary>
 /// <param name="message">desination</param>
 protected override void Puts(NetOutgoingMessage message)
 {
     Byte[] bytes = this.B.ToByteArray();
     message.Write(bytes.Length);
     message.Write(bytes);
     message.Write(this.Salt.Length);
     message.Write(this.Salt);
 }
 internal override void InternalSerialize(NetOutgoingMessage lidgrenMsg)
 {
     lidgrenMsg.Write(ObjectId);
 }
Пример #10
0
        public virtual async void RoomLoopAsync(object sender, HighResolutionTimerElapsedEventArgs e)
        {
            if (randomSongTask != null)
            {
                return;
            }

            NetOutgoingMessage outMsg = HubListener.ListenerServer.CreateMessage();

            switch (roomState)
            {
            case RoomState.InGame:
            {
                if (DateTime.Now.Subtract(_songStartTime).TotalSeconds >= selectedSong.songDuration)
                {
                    roomState         = RoomState.Results;
                    _resultsStartTime = DateTime.Now;

                    outMsg.Write((byte)CommandType.GetRoomInfo);

                    outMsg.Write((byte)0);
                    GetRoomInfo().AddToMessage(outMsg);

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered);

                    if (roomClients.Count > 0)
                    {
                        BroadcastWebSocket(CommandType.GetRoomInfo, GetRoomInfo());
                    }
                }
            }
            break;

            case RoomState.Results:
            {
                if (DateTime.Now.Subtract(_resultsStartTime).TotalSeconds >= resultsShowTime)
                {
                    roomState    = RoomState.SelectingSong;
                    selectedSong = null;

                    outMsg.Write((byte)CommandType.SetSelectedSong);
                    outMsg.Write((int)0);

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered);
                    BroadcastWebSocket(CommandType.SetSelectedSong, null);
                }
            }
            break;

            case RoomState.SelectingSong:
            {
                switch (roomSettings.SelectionType)
                {
                case SongSelectionType.Random:
                {
                    roomState = RoomState.Preparing;
                    Random rand = new Random();

                    randomSongTask = BeatSaver.GetRandomSong();
                    selectedSong   = await randomSongTask;
                    randomSongTask = null;

                    outMsg.Write((byte)CommandType.SetSelectedSong);
                    selectedSong.AddToMessage(outMsg);

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered);

                    BroadcastWebSocket(CommandType.SetSelectedSong, selectedSong);
                    ReadyStateChanged(roomHost, true);
                }
                break;
                }
            }
            break;
            }

            if (outMsg.LengthBytes > 0)
            {
                outMsg = HubListener.ListenerServer.CreateMessage();
            }

            outMsg.Write((byte)CommandType.UpdatePlayerInfo);

            switch (roomState)
            {
            case RoomState.SelectingSong:
            {
                outMsg.Write((float)0);
                outMsg.Write((float)0);
            }
            break;

            case RoomState.Preparing:
            {
                outMsg.Write((float)0);
                outMsg.Write((float)0);
            }
            break;

            case RoomState.InGame:
            {
                outMsg.Write((float)DateTime.Now.Subtract(_songStartTime).TotalSeconds);
                outMsg.Write(selectedSong.songDuration);
            }
            break;

            case RoomState.Results:
            {
                outMsg.Write((float)DateTime.Now.Subtract(_resultsStartTime).TotalSeconds);
                outMsg.Write(resultsShowTime);
            }
            break;
            }

            outMsg.Write(roomClients.Count);

            for (int i = 0; i < roomClients.Count; i++)
            {
                if (i < roomClients.Count)
                {
                    if (roomClients[i] != null)
                    {
                        roomClients[i].playerInfo.AddToMessage(outMsg);
                    }
                }
            }

            BroadcastPacket(outMsg, NetDeliveryMethod.UnreliableSequenced);

            if (roomClients.Count > 0)
            {
                BroadcastWebSocket(CommandType.UpdatePlayerInfo, roomClients.Select(x => x.playerInfo).ToArray());
            }
        }
        public static void TestEncryption(NetEncryption algo, bool printName = true)
        {
            NetOutgoingMessage om = algo.Peer.CreateMessage();

            om.Write("Hallon");
            om.Write(42);
            om.Write(5, 5);
            om.Write(true);
            om.Write("kokos");

            int unencLen = om.BitLength;

            if (!om.Encrypt(algo))
            {
                throw new LidgrenException("failed to encrypt");
            }

            // convert to incoming message
            NetIncomingMessage im = Program.CreateIncomingMessage(
                om.GetBuffer().AsSpan(0, om.ByteLength).ToArray(), om.BitLength);

            if (im.GetBuffer().Length == 0)
            {
                throw new LidgrenException("bad im!");
            }

            if (!im.Decrypt(algo))
            {
                throw new LidgrenException("failed to decrypt");
            }

            if (im.GetBuffer().Length == 0 || im.BitLength != unencLen)
            {
                throw new LidgrenException("Length fail");
            }

            var str = im.ReadString();

            if (str != "Hallon")
            {
                throw new LidgrenException("fail");
            }
            if (im.ReadInt32() != 42)
            {
                throw new LidgrenException("fail");
            }
            if (im.ReadInt32(5) != 5)
            {
                throw new LidgrenException("fail");
            }
            if (im.ReadBool() != true)
            {
                throw new LidgrenException("fail");
            }
            if (im.ReadString() != "kokos")
            {
                throw new LidgrenException("fail");
            }

            if (printName)
            {
                Console.WriteLine(" - " + algo.GetType().Name + " OK");
            }
        }
Пример #12
0
 public override void PacketToNetOutgoingMessage(NetOutgoingMessage message)
 {
     message.Write((byte)PacketTypes.QueueForGame);
 }
Пример #13
0
        private static void HubLoop(object sender, HighResolutionTimerElapsedEventArgs e)
        {
            if (_ticksLength.Count > 30)
            {
                _ticksLength.RemoveAt(0);
            }
            _ticksLength.Add(DateTime.UtcNow.Subtract(_lastTick).Ticks / (float)TimeSpan.TicksPerMillisecond);
            _lastTick = DateTime.UtcNow;
            List <RoomInfo> roomsList = RoomsController.GetRoomInfosList();

            string titleBuffer = $"ServerHub v{Assembly.GetEntryAssembly().GetName().Version}: {roomsList.Count} rooms, {hubClients.Count} clients in lobby, {roomsList.Select(x => x.players).Sum() + hubClients.Count} clients total {(Settings.Instance.Server.ShowTickrateInTitle ? $", {Tickrate.ToString("0.0")} tickrate" : "")}";

            if (_currentTitle != titleBuffer)
            {
                _currentTitle = titleBuffer;
                Console.Title = _currentTitle;
            }

            List <Client> allClients = hubClients.Concat(RoomsController.GetRoomsList().SelectMany(x => x.roomClients)).Concat(RadioController.radioChannels.SelectMany(x => x.radioClients)).ToList();

            NetIncomingMessage msg;

            while (ListenerServer.ReadMessage(out msg))
            {
                try
                {
                    Program.networkBytesInNow += msg.LengthBytes;

                    switch (msg.MessageType)
                    {
                    case NetIncomingMessageType.ConnectionApproval:
                    {
                        byte[] versionBytes = msg.PeekBytes(4);
                        byte[] version      = msg.ReadBytes(4);

                        if (version[0] == 0 && version[1] == 0)
                        {
                            uint versionUint       = BitConverter.ToUInt32(version, 0);
                            uint serverVersionUint = ((uint)Assembly.GetEntryAssembly().GetName().Version.Major).ConcatUInts((uint)Assembly.GetEntryAssembly().GetName().Version.Minor).ConcatUInts((uint)Assembly.GetEntryAssembly().GetName().Version.Build).ConcatUInts((uint)Assembly.GetEntryAssembly().GetName().Version.Revision);
                            msg.SenderConnection.Deny($"Version mismatch!\nServer:{serverVersionUint}\nClient:{versionUint}");
                            Logger.Instance.Log($"Client version v{versionUint} tried to connect");
                            break;
                        }

                        byte[] serverVersion = new byte[4] {
                            (byte)Assembly.GetEntryAssembly().GetName().Version.Major, (byte)Assembly.GetEntryAssembly().GetName().Version.Minor, (byte)Assembly.GetEntryAssembly().GetName().Version.Build, (byte)Assembly.GetEntryAssembly().GetName().Version.Revision
                        };

                        if (version[0] != serverVersion[0] || version[1] != serverVersion[1] || version[2] != serverVersion[2])
                        {
                            msg.SenderConnection.Deny($"Version mismatch|{string.Join('.', serverVersion)}|{string.Join('.', version)}");
                            Logger.Instance.Log($"Client version v{string.Join('.', version)} tried to connect");
                            break;
                        }

                        PlayerInfo playerInfo = new PlayerInfo(msg);

                        if (Settings.Instance.Access.WhitelistEnabled)
                        {
                            if (!IsWhitelisted(msg.SenderConnection.RemoteEndPoint, playerInfo))
                            {
                                msg.SenderConnection.Deny("You are not whitelisted on this ServerHub!");
                                Logger.Instance.Warning($"Client {playerInfo.playerName}({playerInfo.playerId})@{msg.SenderConnection.RemoteEndPoint.Address} is not whitelisted!");
                                break;
                            }
                        }

                        if (IsBlacklisted(msg.SenderConnection.RemoteEndPoint, playerInfo))
                        {
                            msg.SenderConnection.Deny("You are banned on this ServerHub!");
                            Logger.Instance.Warning($"Client {playerInfo.playerName}({playerInfo.playerId})@{msg.SenderConnection.RemoteEndPoint.Address} is banned!");
                            break;
                        }

                        msg.SenderConnection.Approve();

                        Client client = new Client(msg.SenderConnection, playerInfo);
                        client.playerInfo.updateInfo.playerState = PlayerState.Lobby;

                        client.ClientDisconnected += ClientDisconnected;

                        hubClients.Add(client);
                        allClients.Add(client);
                        Logger.Instance.Log($"{playerInfo.playerName} connected!");
                    };
                        break;

                    case NetIncomingMessageType.Data:
                    {
                        Client client = allClients.FirstOrDefault(x => x.playerConnection.RemoteEndPoint.Equals(msg.SenderEndPoint));

                        switch ((CommandType)msg.ReadByte())
                        {
                        case CommandType.Disconnect:
                        {
                            if (client != null)
                            {
                                allClients.Remove(client);
                                ClientDisconnected(client);
                            }
                        }
                        break;

                        case CommandType.UpdatePlayerInfo:
                        {
                            if (client != null)
                            {
                                if (msg.PeekByte() == 1 || !client.lastUpdateIsFull)
                                {
                                    client.UpdatePlayerInfo(msg);
                                }

                                if (Settings.Instance.Misc.PlayerColors.ContainsKey(client.playerInfo.playerId))
                                {
                                    client.playerInfo.updateInfo.playerNameColor = Settings.Instance.Misc.PlayerColors[client.playerInfo.playerId];
                                }
                            }
                        }
                        break;

                        case CommandType.UpdateVoIPData:
                        {
                            if (!Settings.Instance.Server.AllowVoiceChat)
                            {
                                return;
                            }

                            if (client != null)
                            {
                                UnityVOIP.VoipFragment data = new UnityVOIP.VoipFragment(msg);
                                if (data.playerId == client.playerInfo.playerId)
                                {
                                    client.playerVoIPQueue.Enqueue(data);
                                }
                            }
                        }
                        break;

                        case CommandType.JoinRoom:
                        {
                            if (client != null)
                            {
                                uint roomId = msg.ReadUInt32();

                                BaseRoom room = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == roomId);

                                if (room != null)
                                {
                                    if (room.roomSettings.UsePassword)
                                    {
                                        if (RoomsController.ClientJoined(client, roomId, msg.ReadString()))
                                        {
                                            if (hubClients.Contains(client))
                                            {
                                                hubClients.Remove(client);
                                            }
                                            client.joinedRoomID = roomId;
                                        }
                                    }
                                    else
                                    {
                                        if (RoomsController.ClientJoined(client, roomId, ""))
                                        {
                                            if (hubClients.Contains(client))
                                            {
                                                hubClients.Remove(client);
                                            }
                                            client.joinedRoomID = roomId;
                                        }
                                    }
                                }
                                else
                                {
                                    RoomsController.ClientJoined(client, roomId, "");
                                }
                            }
                        }
                        break;

                        case CommandType.LeaveRoom:
                        {
                            if (client != null)
                            {
                                RoomsController.ClientLeftRoom(client);
                                client.joinedRoomID = 0;
                                client.playerInfo.updateInfo.playerState = PlayerState.Lobby;
                                if (!hubClients.Contains(client))
                                {
                                    hubClients.Add(client);
                                }
                            }
                        }
                        break;

                        case CommandType.GetRooms:
                        {
                            NetOutgoingMessage outMsg = ListenerServer.CreateMessage();
                            outMsg.Write((byte)CommandType.GetRooms);
                            RoomsController.AddRoomListToMessage(outMsg);

                            msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);
                            Program.networkBytesOutNow += outMsg.LengthBytes;
                        }
                        break;

                        case CommandType.CreateRoom:
                        {
                            if (client != null)
                            {
                                uint roomId = RoomsController.CreateRoom(new RoomSettings(msg), client.playerInfo);

                                NetOutgoingMessage outMsg = ListenerServer.CreateMessage(5);
                                outMsg.Write((byte)CommandType.CreateRoom);
                                outMsg.Write(roomId);

                                msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);
                                Program.networkBytesOutNow += outMsg.LengthBytes;
                            }
                        }
                        break;

                        case CommandType.GetRoomInfo:
                        {
                            if (client != null)
                            {
#if DEBUG
                                Logger.Instance.Log("GetRoomInfo: Client room=" + client.joinedRoomID);
#endif
                                if (client.joinedRoomID != 0)
                                {
                                    BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                    if (joinedRoom != null)
                                    {
                                        NetOutgoingMessage outMsg = ListenerServer.CreateMessage();

                                        outMsg.Write((byte)CommandType.GetRoomInfo);

                                        joinedRoom.GetRoomInfo().AddToMessage(outMsg);

                                        msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);
                                        Program.networkBytesOutNow += outMsg.LengthBytes;
                                    }
                                }
                            }
                        }
                        break;

                        case CommandType.SetSelectedSong:
                        {
                            if (client != null && client.joinedRoomID != 0)
                            {
                                BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                if (joinedRoom != null)
                                {
                                    if (msg.LengthBytes < 16)
                                    {
                                        joinedRoom.SetSelectedSong(client.playerInfo, null);
                                    }
                                    else
                                    {
                                        joinedRoom.SetSelectedSong(client.playerInfo, new SongInfo(msg));
                                    }
                                }
                            }
                        }
                        break;

                        case CommandType.SetLevelOptions:
                        {
                            if (client != null && client.joinedRoomID != 0)
                            {
                                BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                if (joinedRoom != null)
                                {
                                    joinedRoom.SetLevelOptions(client.playerInfo, new LevelOptionsInfo(msg));
                                }
                            }
                        }
                        break;

                        case CommandType.StartLevel:
                        {
#if DEBUG
                            Logger.Instance.Log("Received command StartLevel");
#endif

                            if (client != null && client.joinedRoomID != 0)
                            {
                                BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                if (joinedRoom != null)
                                {
                                    LevelOptionsInfo options = new LevelOptionsInfo(msg);
                                    SongInfo         song    = new SongInfo(msg);
                                    song.songDuration += 2.5f;
                                    joinedRoom.StartLevel(client.playerInfo, options, song);
                                }
                            }
                        }
                        break;

                        case CommandType.DestroyRoom:
                        {
                            if (client != null && client.joinedRoomID != 0)
                            {
                                BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                if (joinedRoom != null)
                                {
                                    joinedRoom.DestroyRoom(client.playerInfo);
                                }
                            }
                        }
                        break;

                        case CommandType.TransferHost:
                        {
                            if (client != null && client.joinedRoomID != 0)
                            {
                                BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                if (joinedRoom != null)
                                {
                                    joinedRoom.TransferHost(client.playerInfo, new PlayerInfo(msg));
                                }
                            }
                        }
                        break;

                        case CommandType.PlayerReady:
                        {
                            if (client != null && client.joinedRoomID != 0)
                            {
                                BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                if (joinedRoom != null)
                                {
                                    joinedRoom.ReadyStateChanged(client.playerInfo, msg.ReadBoolean());
                                }
                            }
                        }
                        break;

                        case CommandType.SendEventMessage:
                        {
                            if (client != null && client.joinedRoomID != 0 && Settings.Instance.Server.AllowEventMessages)
                            {
                                BaseRoom joinedRoom = RoomsController.GetRoomsList().FirstOrDefault(x => x.roomId == client.joinedRoomID);
                                if (joinedRoom != null)
                                {
                                    string header = msg.ReadString();
                                    string data   = msg.ReadString();

                                    joinedRoom.BroadcastEventMessage(header, data, new List <Client>()
                                            {
                                                client
                                            });
                                    joinedRoom.BroadcastWebSocket(CommandType.SendEventMessage, new EventMessage(header, data));

                                    EventMessageReceived?.Invoke(client, header, data);
#if DEBUG
                                    Logger.Instance.Log($"Received event message! Header=\"{header}\", Data=\"{data}\"");
#endif
                                }
                            }
                        }
                        break;

                        case CommandType.GetChannelInfo:
                        {
                            if (Settings.Instance.Radio.EnableRadio && RadioController.radioStarted)
                            {
                                int channelId = msg.ReadInt32();

                                NetOutgoingMessage outMsg = ListenerServer.CreateMessage();
                                outMsg.Write((byte)CommandType.GetChannelInfo);

                                if (RadioController.radioChannels.Count > channelId)
                                {
                                    RadioController.radioChannels[channelId].channelInfo.AddToMessage(outMsg);
                                }
                                else
                                {
                                    new ChannelInfo()
                                    {
                                        channelId = -1, currentSong = new SongInfo()
                                        {
                                            levelId = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
                                        }
                                    }.AddToMessage(outMsg);
                                }

                                msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);
                                Program.networkBytesOutNow += outMsg.LengthBytes;
                            }
                        }
                        break;

                        case CommandType.JoinChannel:
                        {
                            int channelId = msg.ReadInt32();

                            NetOutgoingMessage outMsg = ListenerServer.CreateMessage();
                            outMsg.Write((byte)CommandType.JoinChannel);

                            if (RadioController.ClientJoinedChannel(client, channelId))
                            {
                                outMsg.Write((byte)0);
                                hubClients.Remove(client);
                            }
                            else
                            {
                                outMsg.Write((byte)1);
                            }

                            msg.SenderConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);
                            Program.networkBytesOutNow += outMsg.LengthBytes;
                        }
                        break;

                        case CommandType.GetSongDuration:
                        {
                            foreach (RadioChannel channel in RadioController.radioChannels)
                            {
                                if (channel.radioClients.Contains(client) && channel.requestingSongDuration)
                                {
                                    SongInfo info = new SongInfo(msg);
                                    if (info.levelId == channel.channelInfo.currentSong.levelId)
                                    {
                                        channel.songDurationResponses.TryAdd(client, info.songDuration);
                                    }
                                }
                            }
                        }
                        break;

                        case CommandType.LeaveChannel:
                        {
                            if (RadioController.radioStarted && client != null)
                            {
                                RadioController.ClientLeftChannel(client);
                            }
                        }; break;
                        }
                    };
                        break;



                    case NetIncomingMessageType.WarningMessage:
                        Logger.Instance.Warning(msg.ReadString());
                        break;

                    case NetIncomingMessageType.ErrorMessage:
                        Logger.Instance.Error(msg.ReadString());
                        break;

                    case NetIncomingMessageType.StatusChanged:
                    {
                        NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();

                        Client client = allClients.FirstOrDefault(x => x.playerConnection.RemoteEndPoint.Equals(msg.SenderEndPoint));

                        if (client != null)
                        {
                            if (status == NetConnectionStatus.Disconnected)
                            {
                                allClients.Remove(client);
                                ClientDisconnected(client);
                            }
                        }
                    }
                    break;

#if DEBUG
                    case NetIncomingMessageType.VerboseDebugMessage:
                    case NetIncomingMessageType.DebugMessage:
                        Logger.Instance.Log(msg.ReadString());
                        break;

                    default:
                        Logger.Instance.Log("Unhandled message type: " + msg.MessageType);
                        break;
#endif
                    }
                }catch (Exception ex)
                {
                    Logger.Instance.Log($"Exception on message received: {ex}");
                }
                ListenerServer.Recycle(msg);
            }
        }
Пример #14
0
 private static void WriteNetworkValue(ref NetOutgoingMessage outgoingMessage, object networkValue)
 {
     if (networkValue == null)
     {
         throw new CoreException("NetworkValue is null");
     }
     else
     {
         if (networkValue is bool)
         {
             outgoingMessage.Write((bool)networkValue);
         }
         else if (networkValue is byte)
         {
             outgoingMessage.Write((byte)networkValue);
         }
         else if (networkValue is byte[])
         {
             var tempByteArray = (byte[])networkValue;
             outgoingMessage.Write(tempByteArray.Length);
             outgoingMessage.Write(tempByteArray);
         }
         else if (networkValue is char)
         {
             outgoingMessage.Write(BitConverter.GetBytes((char)networkValue));
         }
         else if (networkValue is char[])
         {
             var tempCharArray = (char[])networkValue;
             outgoingMessage.Write(tempCharArray.Length);
             for (int i = 0; i < tempCharArray.Length; i++)
             {
                 outgoingMessage.Write(BitConverter.GetBytes(tempCharArray[i]));
             }
         }
         else if (networkValue is Color)
         {
             outgoingMessage.Write(((Color)networkValue).ToVector4());
         }
         else if (networkValue is double)
         {
             outgoingMessage.Write((double)networkValue);
         }
         else if (networkValue is float)
         {
             outgoingMessage.Write((float)networkValue);
         }
         else if (networkValue is int)
         {
             outgoingMessage.Write((int)networkValue);
         }
         else if (networkValue is long)
         {
             outgoingMessage.Write((long)networkValue);
         }
         else if (networkValue is Matrix)
         {
             outgoingMessage.WriteMatrix((Matrix)networkValue);
         }
         else if (networkValue is Quaternion)
         {
             outgoingMessage.WriteRotation((Quaternion)networkValue, 24);
         }
         else if (networkValue is sbyte)
         {
             outgoingMessage.Write((sbyte)networkValue);
         }
         else if (networkValue is short)
         {
             outgoingMessage.Write((short)networkValue);
         }
         else if (networkValue is string)
         {
             outgoingMessage.Write((string)networkValue);
         }
         else if (networkValue is uint)
         {
             outgoingMessage.Write((uint)networkValue);
         }
         else if (networkValue is ulong)
         {
             outgoingMessage.Write((ulong)networkValue);
         }
         else if (networkValue is ushort)
         {
             outgoingMessage.Write((ushort)networkValue);
         }
         else if (networkValue is Vector2)
         {
             outgoingMessage.Write((Vector2)networkValue);
         }
         else if (networkValue is Vector3)
         {
             outgoingMessage.Write((Vector3)networkValue);
         }
         else if (networkValue is Vector4)
         {
             outgoingMessage.Write((Vector4)networkValue);
         }
         else
         {
             throw new CoreException("NetworkValue type isn't supported");
         }
     }
 }
 public override void WritePayload(NetOutgoingMessage message)
 {
     base.WritePayload(message);
     message.Write((byte)ResponseResult);
     message.Write((byte)DenyReason);
 }
 /// <summary>
 /// Puts data into message
 /// </summary>
 /// <param name="message">desination</param>
 protected override void Puts(NetOutgoingMessage message)
 {
     message.Write(this.Username);
     message.Write(this.OtherData.Length);
     if (this.OtherData.Length > 0)
         message.Write(this.OtherData);
     Byte[] bytes = this.A.ToByteArray();
     message.Write(bytes.Length);
     message.Write(bytes);
 }
Пример #17
0
 public override void EncodeMessage(NetOutgoingMessage msg)
 {
     msg.Write((byte)MessageType);
     msg.Write(ID);
 }
Пример #18
0
        public override void WriteToBuffer(NetOutgoingMessage buffer)
        {
            buffer.Write((byte)PlaceType);
            switch (PlaceType)
            {
            case PlacementManagerMessage.RequestPlacement:
                buffer.Write(Align);
                buffer.Write(IsTile);

                if (IsTile)
                {
                    buffer.Write(TileType);
                }
                else
                {
                    buffer.Write(EntityTemplateName);
                }

                buffer.Write(XValue);
                buffer.Write(YValue);
                buffer.Write((byte)DirRcv);
                break;

            case PlacementManagerMessage.StartPlacement:
                buffer.Write(Range);
                buffer.Write(IsTile);
                buffer.Write(ObjType);
                buffer.Write(AlignOption);
                break;

            case PlacementManagerMessage.CancelPlacement:
            case PlacementManagerMessage.PlacementFailed:
                throw new NotImplementedException();

            case PlacementManagerMessage.RequestEntRemove:
                buffer.Write((int)EntityUid);
                break;
            }
        }
Пример #19
0
        /// <summary>
        /// Encodes this state parameter to a network message
        /// </summary>
        /// <param name="msg">The message to encode to</param>
        public void Encode(NetOutgoingMessage msg)
        {
            if (isSynced)
            {
                // Write the name and type
                msg.Write(Name);
                msg.Write((byte)myType);

                // Write the value
                switch (myType)
                {
                case Type.Byte:
                    msg.Write((byte)myValue);
                    break;

                case Type.Char:
                    msg.Write((char)myValue);
                    break;

                case Type.Short:
                    msg.Write((short)myValue);
                    break;

                case Type.Int:
                    msg.Write((int)myValue);
                    break;

                case Type.Bool:
                    msg.Write((bool)myValue);
                    break;

                case Type.CardSuit:
                    msg.Write((byte)((CardSuit)myValue));
                    break;

                case Type.CardRank:
                    msg.Write((byte)((CardSuit)myValue));
                    break;

                case Type.String:
                    msg.Write((string)myValue);
                    break;

                case Type.PlayingCard:
                    msg.Write(myValue != null);

                    if (myValue != null)
                    {
                        msg.Write((byte)(myValue as PlayingCard).Rank);
                        msg.Write((byte)(myValue as PlayingCard).Suit);
                    }
                    break;

                case Type.CardCollection:
                    msg.Write((myValue as CardCollection).Count);

                    foreach (PlayingCard card in (myValue as CardCollection))
                    {
                        msg.Write(card != null);

                        if (card != null)
                        {
                            msg.Write((byte)card.Rank);
                            msg.Write((byte)card.Suit);
                        }
                    }
                    break;
                }

                // Write padding bits
                msg.WritePadBits();
            }
        }
Пример #20
0
        /// <summary>
        /// Simulates world logic
        /// </summary>
        public static void Simulate()
        {
            // TODO: Runs all server based logic
            switch (state)
            {
            case RoundState.Empty:
                // If someone joined a team, begin a new game
                if (numCts > 0 || numTs > 0)
                {
                    // If the timer has not started yet
                    if (!timer.IsRunning)
                    {
                        // start the timer
                        timer.Start();
                        Console.WriteLine("A game has begun");
                    }

                    // Give users a few seconds to join teams
                    // before reseting the round
                    if (timer.Elapsed.TotalSeconds >= AFTER_ROUND_TIME)
                    {
                        StartRound();
                        timer.Reset();
                    }
                }
                break;

            case RoundState.Buytime:
                if (!timer.IsRunning)
                {
                    timer.Start();
                    Console.WriteLine("Buytime...");
                }

                // If someone joins a team during buytime and they're dead, respawn them
                foreach (ServerPlayer player in players)
                {
                    if (player.State == ServerClientInterface.PlayerState.Dead &&
                        player.CurrentTeam != ServerClientInterface.Team.Spectator)
                    {
                        RespawnPlayer(player);
                    }
                }

                // If buytime is over, start the round
                if (timer.Elapsed.TotalSeconds >= FREEZE_TIME)
                {
                    // Let everyone know the round started
                    outMsg = server.CreateMessage();
                    outMsg.Write(ServerClientInterface.BEGIN_ROUND);
                    server.SendToAll(outMsg, NetDeliveryMethod.UnreliableSequenced);
                    state = RoundState.Play;
                }
                break;

            case RoundState.Play:

                break;

            case RoundState.AfterRound:
                break;
            }
        }
Пример #21
0
 public override void WriteTo(NetOutgoingMessage msg)
 {
     base.WriteTo(msg);
     msg.Write(HP);
 }
Пример #22
0
        /// <summary>
        /// Respwans a player at their spawn point
        /// </summary>
        /// <param name="player"></param>
        static void RespawnPlayer(ServerPlayer player)
        {
            // Default location
            Vector2 location = Vector2.Zero;

            // Randomly determine a spawn point depending on their team and
            // respawns them there
            int spawnPoint;

            switch (player.CurrentTeam)
            {
            case ServerClientInterface.Team.CounterTerrorist:
                while (true)
                {
                    // Get a random index in the CT spawn points
                    spawnPoint = rand.Next(0, MapData.CTTile.Count);

                    bool empty = true;
                    // Check if nobody is currently on that spawn point
                    foreach (ServerPlayer ply in players)
                    {
                        if (ply.Identifier != player.Identifier)
                        {
                            if (MapData.CTTile[spawnPoint].TileRect.Contains((int)ply.Position.X,
                                                                             (int)ply.Position.Y))
                            {
                                empty = false;
                                break;
                            }
                        }
                    }

                    if (empty)
                    {
                        location = new Vector2(MapData.CTTile[spawnPoint].TileRect.X + 16,
                                               MapData.CTTile[spawnPoint].TileRect.Y + 16);
                        break;
                    }
                }
                break;

            case ServerClientInterface.Team.Terrorist:
                while (true)
                {
                    // Get a random index in the T spawn points
                    spawnPoint = rand.Next(0, MapData.TTile.Count);

                    bool empty = true;
                    // Check if nobody is currently on that spawn point
                    foreach (ServerPlayer ply in players)
                    {
                        if (ply.Identifier != player.Identifier)
                        {
                            if (MapData.CTTile[spawnPoint].TileRect.Contains((int)ply.Position.X,
                                                                             (int)ply.Position.Y))
                            {
                                empty = false;
                                break;
                            }
                        }
                    }

                    // If the spawn point is empty, allow the player to spawn there
                    if (empty)
                    {
                        location = new Vector2(MapData.TTile[spawnPoint].TileRect.X + 16,
                                               MapData.TTile[spawnPoint].TileRect.Y + 16);
                        break;
                    }
                }
                break;
            }

            // Tell everyone the player respawned and their position
            outMsg = server.CreateMessage();
            player.Respawn(location);
            outMsg.Write(ServerClientInterface.RESPAWN_PLAYER);
            outMsg.Write(player.Identifier);
            outMsg.Write(player.Position.X);
            outMsg.Write(player.Position.Y);
            server.SendToAll(outMsg, NetDeliveryMethod.ReliableSequenced);
        }
Пример #23
0
        public void Update()
        {
            if (NetworkClient != null && NetworkClient.Status == NetPeerStatus.Running)
            {
                NetIncomingMessage msg;
                while ((msg = NetworkClient.ReadMessage()) != null)
                {
                    switch (msg.MessageType)
                    {
                    case NetIncomingMessageType.StatusChanged:
                    {
                        NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();

                        if (status == NetConnectionStatus.Connected)
                        {
                            NetOutgoingMessage outMsg = NetworkClient.CreateMessage();
                            outMsg.Write((byte)CommandType.GetChannelInfo);
                            outMsg.Write(channelInfos[currentChannel].channelId);

                            NetworkClient.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);
                        }
                        else if (status == NetConnectionStatus.Disconnected)
                        {
                            ChannelException?.Invoke(this, new Exception("Channel refused connection!"));
                            Abort();
                        }
                    };
                        break;

                    case NetIncomingMessageType.Data:
                    {
                        if ((CommandType)msg.ReadByte() == CommandType.GetChannelInfo)
                        {
                            ChannelInfo received = new ChannelInfo(msg);
                            if (received.channelId == -1)
                            {
                                ChannelException?.Invoke(this, new Exception($"Channel with ID {channelInfos[currentChannel].channelId} not found!"));
                                Abort();
                                return;
                            }
                            received.ip   = channelInfos[currentChannel].ip;
                            received.port = channelInfos[currentChannel].port;
                            ReceivedResponse?.Invoke(this, received);
                            if (channelInfos.Count - 1 > currentChannel)
                            {
                                currentChannel++;

                                NetOutgoingMessage outMsg = NetworkClient.CreateMessage();
                                outMsg.Write((byte)CommandType.GetChannelInfo);
                                outMsg.Write(channelInfos[currentChannel].channelId);

                                NetworkClient.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);
                            }
                            else
                            {
                                Abort();
                            }
                        }
                    };
                        break;

                    case NetIncomingMessageType.WarningMessage:
                        Misc.Logger.Warning(msg.ReadString());
                        break;

                    case NetIncomingMessageType.ErrorMessage:
                        Misc.Logger.Error(msg.ReadString());
                        break;

                    case NetIncomingMessageType.VerboseDebugMessage:
                    case NetIncomingMessageType.DebugMessage:
                        Misc.Logger.Info(msg.ReadString());
                        break;

                    default:
                        Console.WriteLine("Unhandled type: " + msg.MessageType);
                        break;
                    }
                }
            }
        }
Пример #24
0
 public override void WriteToBuffer(NetOutgoingMessage buffer)
 {
     buffer.Write(CanCall);
 }
Пример #25
0
 /// <summary>
 /// Write a Point
 /// </summary>
 public static void Write(this NetOutgoingMessage message, Point value)
 {
     message.Write(value.X);
     message.Write(value.Y);
 }
Пример #26
0
 public void PackInto(NetOutgoingMessage inMsg)
 {
     inMsg.WriteVariableUInt32((uint)textureID);
     inMsg.Write(moveSpeed);
 }
Пример #27
0
 /// <summary>
 /// Write a Single with half precision (16 bits)
 /// </summary>
 public static void WriteHalfPrecision(this NetOutgoingMessage message, float value)
 {
     message.Write(new HalfSingle(value).PackedValue);
 }
Пример #28
0
        internal override void InternalSerialize(NetOutgoingMessage lidgrenMsg)
        {
            base.InternalSerialize(lidgrenMsg);

            GuidUtil.Serialize(VesselId, lidgrenMsg);
            lidgrenMsg.Write(BodyIndex);

            for (var i = 0; i < 3; i++)
            {
                lidgrenMsg.Write(LatLonAlt[i]);
            }

            for (var i = 0; i < 3; i++)
            {
                lidgrenMsg.Write(NormalVector[i]);
            }

            for (var i = 0; i < 3; i++)
            {
                lidgrenMsg.Write(Com[i]);
            }

            for (var i = 0; i < 3; i++)
            {
                lidgrenMsg.Write(TransformPosition[i]);
            }

            for (var i = 0; i < 3; i++)
            {
                lidgrenMsg.Write(Velocity[i]);
            }

            for (var i = 0; i < 8; i++)
            {
                lidgrenMsg.Write(Orbit[i]);
            }

            for (var i = 0; i < 4; i++)
            {
                lidgrenMsg.Write(SrfRelRotation[i]);
            }

            lidgrenMsg.Write(HeightFromTerrain);
            lidgrenMsg.Write(TimeStamp);
            lidgrenMsg.Write(GameTime);
        }
Пример #29
0
 /// <summary>
 /// Writes a Vector3
 /// </summary>
 public static void Write(this NetOutgoingMessage message, Vector3 vector)
 {
     message.Write(vector.X);
     message.Write(vector.Y);
     message.Write(vector.Z);
 }
Пример #30
0
        public void AddToMessage(NetOutgoingMessage outMsg)
        {
            outMsg.Write(difficulty == BeatmapDifficulty.Normal || difficulty == BeatmapDifficulty.Expert);
            outMsg.Write(difficulty == BeatmapDifficulty.Hard || difficulty == BeatmapDifficulty.Expert);
            outMsg.Write(difficulty == BeatmapDifficulty.ExpertPlus);

            outMsg.Write(modifiers.songSpeed == GameplayModifiers.SongSpeed.Faster);
            outMsg.Write(modifiers.songSpeed == GameplayModifiers.SongSpeed.Slower);

            outMsg.Write(modifiers.noFail);
            outMsg.Write(modifiers.noObstacles);
            outMsg.Write(modifiers.noBombs);
            outMsg.Write(modifiers.noArrows);
            outMsg.Write(modifiers.instaFail);
            outMsg.Write(modifiers.batteryEnergy);
            outMsg.Write(modifiers.disappearingArrows);
            outMsg.Write(modifiers.ghostNotes);

            bool writeCharName = false;

            switch (characteristicName)
            {
            case "Standard":
                outMsg.Write(false);
                outMsg.Write(false);
                break;

            case "NoArrows":
                outMsg.Write(false);
                outMsg.Write(true);
                break;

            case "OneSaber":
                outMsg.Write(true);
                outMsg.Write(false);
                break;

            default:
                outMsg.Write(true);
                outMsg.Write(true);
                writeCharName = true;
                break;
            }

            outMsg.Write(false);

            if (writeCharName)
            {
                outMsg.Write(characteristicName);
            }
        }
Пример #31
0
 /// <summary>
 /// Writes a Vector3 at half precision
 /// </summary>
 public static void WriteHalfPrecision(this NetOutgoingMessage message, Vector3 vector)
 {
     message.Write(new HalfSingle(vector.X).PackedValue);
     message.Write(new HalfSingle(vector.Y).PackedValue);
     message.Write(new HalfSingle(vector.Z).PackedValue);
 }
Пример #32
0
        /// <summary>
        /// Write the events to the outgoing message. The recipient parameter is only needed for ServerEntityEventManager
        /// </summary>
        protected void Write(NetOutgoingMessage msg, List <NetEntityEvent> eventsToSync, Client recipient = null)
        {
            //write into a temporary buffer so we can write the number of events before the actual data
            NetBuffer tempBuffer = new NetBuffer();

            int eventCount = 0;

            foreach (NetEntityEvent e in eventsToSync)
            {
                //write into a temporary buffer so we can write the length before the actual data
                NetBuffer tempEventBuffer = new NetBuffer();
                try
                {
                    WriteEvent(tempEventBuffer, e, recipient);
                }

                catch (Exception exception)
                {
                    DebugConsole.ThrowError("Failed to write an event for the entity \"" + e.Entity + "\"", exception);
                    GameAnalyticsManager.AddErrorEventOnce("NetEntityEventManager.Write:WriteFailed" + e.Entity.ToString(),
                                                           GameAnalyticsSDK.Net.EGAErrorSeverity.Error,
                                                           "Failed to write an event for the entity \"" + e.Entity + "\"\n" + exception.StackTrace);

                    //write an empty event to avoid messing up IDs
                    //(otherwise the clients might read the next event in the message and think its ID
                    //is consecutive to the previous one, even though we skipped over this broken event)
                    tempBuffer.Write((UInt16)0);
                    tempBuffer.WritePadBits();
                    eventCount++;
                    continue;
                }

                if (msg.LengthBytes + tempBuffer.LengthBytes + tempEventBuffer.LengthBytes > NetPeerConfiguration.kDefaultMTU - 20)
                {
                    //no more room in this packet
                    break;
                }

                if (tempEventBuffer.LengthBytes > 255)
                {
                    DebugConsole.ThrowError("Too much data in network event for entity \"" + e.Entity.ToString() + "\" (" + tempEventBuffer.LengthBytes + " bytes");
                    GameAnalyticsManager.AddErrorEventOnce("NetEntityEventManager.Write:TooLong" + e.Entity.ToString(),
                                                           GameAnalyticsSDK.Net.EGAErrorSeverity.Error,
                                                           "Too much data in network event for entity \"" + e.Entity.ToString() + "\" (" + tempEventBuffer.LengthBytes + " bytes");
                }

                //the ID has been taken by another entity (the original entity has been removed) -> write an empty event
                else if (Entity.FindEntityByID(e.Entity.ID) != e.Entity || e.Entity.IdFreed)
                {
                    //technically the clients don't have any use for these, but removing events and shifting the IDs of all
                    //consecutive ones is so error-prone that I think this is a safer option
                    tempBuffer.Write((UInt16)0);
                    tempBuffer.WritePadBits();
                }
                else
                {
                    tempBuffer.Write((UInt16)e.Entity.ID);
                    tempBuffer.Write((byte)tempEventBuffer.LengthBytes);
                    tempBuffer.Write(tempEventBuffer);
                    tempBuffer.WritePadBits();
                }

                eventCount++;
            }

            if (eventCount > 0)
            {
                msg.Write(eventsToSync[0].ID);
                msg.Write((byte)eventCount);
                msg.Write(tempBuffer);
            }
        }
Пример #33
0
        internal override void InternalSerialize(NetOutgoingMessage lidgrenMsg)
        {
            base.InternalSerialize(lidgrenMsg);

            GuidUtil.Serialize(VesselId, lidgrenMsg);
            lidgrenMsg.Write(MainThrottle);
            lidgrenMsg.Write(WheelThrottle);
            lidgrenMsg.Write(WheelThrottleTrim);
            lidgrenMsg.Write(X);
            lidgrenMsg.Write(Y);
            lidgrenMsg.Write(Z);
            lidgrenMsg.Write(KillRot);
            lidgrenMsg.Write(GearUp);
            lidgrenMsg.Write(GearDown);
            lidgrenMsg.Write(Headlight);
            lidgrenMsg.Write(Pitch);
            lidgrenMsg.Write(Roll);
            lidgrenMsg.Write(Yaw);
            lidgrenMsg.Write(PitchTrim);
            lidgrenMsg.Write(RollTrim);
            lidgrenMsg.Write(YawTrim);
            lidgrenMsg.Write(WheelSteer);
            lidgrenMsg.Write(WheelSteerTrim);
            lidgrenMsg.Write(TimeStamp);
            lidgrenMsg.Write(TimeStamp);
        }
 /// <summary>
 /// Puts data in message
 /// </summary>
 /// <param name="message"></param>
 protected override void Puts(NetOutgoingMessage message)
 {
     message.Write(this.M.Length);
     message.Write(this.M);
 }
 private void WriteLocalHail(NetOutgoingMessage om)
 {
     if (m_localHailMessage != null)
     {
         byte[] hi = m_localHailMessage.Data;
         if (hi != null && hi.Length >= m_localHailMessage.LengthBytes)
         {
             if (om.LengthBytes + m_localHailMessage.LengthBytes > m_peerConfiguration.m_maximumTransmissionUnit - 10)
                 throw new NetException("Hail message too large; can maximally be " + (m_peerConfiguration.m_maximumTransmissionUnit - 10 - om.LengthBytes));
             om.Write(m_localHailMessage.Data, 0, m_localHailMessage.LengthBytes);
         }
     }
 }