Ejemplo n.º 1
0
 private void TimerOnElapsed(object sender, HighResolutionTimerElapsedEventArgs e)
 {
     if (observedCollections.Any(c => c.Count > 0))
     {
         executedAction();
     }
 }
Ejemplo n.º 2
0
        public virtual void BroadcastVoIPData(object sender, HighResolutionTimerElapsedEventArgs e)
        {
            if (!Settings.Instance.Server.AllowVoiceChat)
            {
                return;
            }

            NetOutgoingMessage outMsg = HubListener.ListenerServer.CreateMessage();

            outMsg.Write((byte)CommandType.UpdateVoIPData);
            outMsg.Write(roomClients.Count(x => x != null && x.playerVoIPQueue != null && x.playerVoIPQueue.Count > 0));

            for (int i = 0; i < roomClients.Count; i++)
            {
                if (roomClients.Count > i && roomClients[i] != null && roomClients[i].playerVoIPQueue != null && roomClients[i].playerVoIPQueue.Count > 0)
                {
                    while (roomClients[i].playerVoIPQueue.Count > 0)
                    {
                        roomClients[i].playerVoIPQueue.Dequeue().AddToMessage(outMsg);
                    }
                }
            }

            BroadcastPacket(outMsg, NetDeliveryMethod.UnreliableSequenced, 2);
        }
Ejemplo n.º 3
0
        private void _EndCheckTimerElapsed(object sender, HighResolutionTimerElapsedEventArgs e)
        {
            // To catch events that may trail after the timer's been disabled
            // due to it being a threaded timer and Stop being called between the
            // timer message being posted and acted upon.
            if (!_endCheckTimer.IsRunning)
            {
                return;
            }

            lock (_endCheckTimer)
            {
                if (_CheckForNaturalEnd() || !IsRunning)
                {
                    _endCheckTimer.Stop(false);
                }
            }
        }
Ejemplo n.º 4
0
        public virtual void RoomLoop(object sender, HighResolutionTimerElapsedEventArgs e)
        {
            NetOutgoingMessage outMsg = HubListener.ListenerServer.CreateMessage();

            switch (roomState)
            {
            case RoomState.InGame:
            {
                if ((DateTime.Now.Subtract(_songStartTime).TotalSeconds >= selectedSong.songDuration) ||
                    (DateTime.Now.Subtract(_songStartTime).TotalSeconds >= 10f && roomClients.All(x => x.playerInfo.updateInfo.playerState != PlayerState.Game)))
                {
                    roomState         = RoomState.Results;
                    _resultsStartTime = DateTime.Now;

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

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered, 0);

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

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

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

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

            case RoomState.SelectingSong:
            {
                switch (roomSettings.SelectionType)
                {
                case SongSelectionType.Random:
                {
                    if (!requestedRandomSong && roomClients.Count > 0 && roomClients.Any(x => roomHost.Equals(x.playerInfo)))
                    {
                        requestedRandomSong = true;

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

                        roomClients.First(x => roomHost.Equals(x.playerInfo)).playerConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);

                        BroadcastWebSocket(CommandType.GetRandomSongInfo, null);
                    }
                }
                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(roomSettings.ResultsShowTime);
            }
            break;
            }


            bool fullUpdate = false;

            int i = 0;

            for (i = 0; i < roomClients.Count; i++)
            {
                if (i < roomClients.Count)
                {
                    if (roomClients[i] != null)
                    {
                        if (roomClients[i].playerInfo.Equals(roomHost) && roomClients[i].playerInfo.updateInfo.playerNameColor.Equals(Color32.defaultColor))
                        {
                            roomClients[i].playerInfo.updateInfo.playerNameColor = Color32.roomHostColor;
                        }
                        fullUpdate |= roomClients[i].lastUpdateIsFull;
                        roomClients[i].lastUpdateIsFull = false;
                    }
                }
            }

            outMsg.Write(fullUpdate ? (byte)1 : (byte)0);

            outMsg.Write(roomClients.Count);

            if (fullUpdate)
            {
                for (i = 0; i < roomClients.Count; i++)
                {
                    if (i < roomClients.Count)
                    {
                        if (roomClients[i] != null)
                        {
                            outMsg.Write(roomClients[i].playerInfo.playerId);
                        }
                    }
                    roomClients[i].playerInfo.AddToMessage(outMsg);
                }
            }
            else
            {
                for (i = 0; i < roomClients.Count; i++)
                {
                    if (i < roomClients.Count)
                    {
                        if (roomClients[i] != null)
                        {
                            outMsg.Write(roomClients[i].playerInfo.playerId);
                            roomClients[i].playerInfo.updateInfo.AddToMessage(outMsg);
                            outMsg.Write((byte)roomClients[i].playerInfo.hitsLastUpdate.Count);
                            foreach (var hit in roomClients[i].playerInfo.hitsLastUpdate)
                            {
                                hit.AddToMessage(outMsg);
                            }
                            roomClients[i].playerInfo.hitsLastUpdate.Clear();
                        }
                    }
                }
            }

            if (roomClients.Count > 0)
            {
                BroadcastPacket(outMsg, NetDeliveryMethod.UnreliableSequenced, 1);

                BroadcastWebSocket(CommandType.UpdatePlayerInfo, roomClients.Select(x => x.playerInfo).ToArray());

                spectatorInRoom = roomClients.Any(x => x.playerInfo.updateInfo.playerState == PlayerState.Spectating);
                if (spectatorInRoom)
                {
                    outMsg = HubListener.ListenerServer.CreateMessage();

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

                    outMsg.Write(roomClients.Count(x => x.playerInfo.updateInfo.playerState == PlayerState.Game && x.playerUpdateHistory.Count > 0));

                    for (i = 0; i < roomClients.Count; i++)
                    {
                        if (i < roomClients.Count)
                        {
                            if (roomClients[i] != null && roomClients[i].playerInfo.updateInfo.playerState == PlayerState.Game && roomClients[i].playerUpdateHistory.Count > 0)
                            {
                                outMsg.Write(roomClients[i].playerInfo.playerId);

                                int historyLength = roomClients[i].playerUpdateHistory.Count;
                                outMsg.Write((byte)historyLength);

                                for (int j = 0; j < historyLength; j++)
                                {
                                    roomClients[i].playerUpdateHistory.Dequeue().AddToMessage(outMsg);
                                }
                                roomClients[i].playerUpdateHistory.Clear();

                                int hitCount = roomClients[i].playerHitsHistory.Count;
                                outMsg.Write((byte)hitCount);

                                for (int j = 0; j < hitCount; j++)
                                {
                                    roomClients[i].playerHitsHistory[i].AddToMessage(outMsg);
                                }
                                roomClients[i].playerHitsHistory.Clear();
                            }
                        }
                    }

                    BroadcastPacket(outMsg, NetDeliveryMethod.UnreliableSequenced, 2, roomClients.Where(x => x.playerInfo.updateInfo.playerState != PlayerState.Spectating).ToList());
                }
            }
        }
Ejemplo n.º 5
0
        public async void RadioLoop(object sender, HighResolutionTimerElapsedEventArgs e)
        {
            if (randomSongTask != null)
            {
                return;
            }

            channelInfo.playerCount = radioClients.Count;
            channelInfo.name        = Settings.Instance.Radio.RadioChannels[channelId].ChannelName;
            channelInfo.iconUrl     = Settings.Instance.Radio.RadioChannels[channelId].ChannelIconUrl;

            if (radioClients.Count == 0)
            {
                channelInfo.state = ChannelState.NextSong;
                return;
            }

            NetOutgoingMessage outMsg = HubListener.ListenerServer.CreateMessage();

            switch (channelInfo.state)
            {
            case ChannelState.InGame:      //--> Results
            {
                if (DateTime.Now.Subtract(songStartTime).TotalSeconds >= channelInfo.currentSong.songDuration)
                {
                    channelInfo.state = ChannelState.Results;
                    resultsStartTime  = DateTime.Now;

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

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

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered);

                    if (radioClients.Count > 0)
                    {
                        BroadcastWebSocket(CommandType.GetChannelInfo, channelInfo);
                    }
                }
            }
            break;

            case ChannelState.Results:     //--> NextSong
            {
                if (DateTime.Now.Subtract(resultsStartTime).TotalSeconds >= Settings.Instance.Radio.ResultsShowTime)
                {
                    channelInfo.state = ChannelState.NextSong;

                    if (radioQueue.Count > 0)
                    {
                        channelInfo.currentSong = radioQueue.Dequeue();
                        try
                        {
                            File.WriteAllText($"RadioQueue{channelId}.json", JsonConvert.SerializeObject(radioQueue, Formatting.Indented));
                        }
                        catch
                        {
                        }
                    }
                    else
                    {
                        if (defaultSongs.Count > 1)
                        {
                            channelInfo.currentSong = defaultSongs.Random(lastSong);
                        }
                        else
                        {
                            randomSongTask          = BeatSaver.GetRandomSong();
                            channelInfo.currentSong = await randomSongTask;
                            randomSongTask          = null;
                        }
                        lastSong = channelInfo.currentSong;
                    }

                    outMsg.Write((byte)CommandType.SetSelectedSong);
                    channelInfo.currentSong.AddToMessage(outMsg);

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered);
                    nextSongScreenStartTime = DateTime.Now;

                    if (radioClients.Count > 0)
                    {
                        BroadcastWebSocket(CommandType.SetSelectedSong, channelInfo.currentSong);
                    }
                }
            }
            break;

            case ChannelState.NextSong:      //--> InGame
            {
                if (DateTime.Now.Subtract(nextSongScreenStartTime).TotalSeconds >= Settings.Instance.Radio.NextSongPrepareTime)
                {
                    channelInfo.state = ChannelState.InGame;

                    outMsg.Write((byte)CommandType.StartLevel);
                    //outMsg.Write((byte)Settings.Instance.Radio.RadioChannels[channelId].PreferredDifficulty);
                    channelInfo.currentLevelOptions.AddToMessage(outMsg);

                    channelInfo.currentSong.songDuration = Misc.Math.Median(songDurationResponses.Values.ToArray());
                    songDurationResponses.Clear();
                    requestingSongDuration = false;

                    channelInfo.currentSong.AddToMessage(outMsg);

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered);
                    songStartTime = DateTime.Now;

                    if (radioClients.Count > 0)
                    {
                        BroadcastWebSocket(CommandType.StartLevel, new SongWithOptions(channelInfo.currentSong, channelInfo.currentLevelOptions));
                    }
                }
                else if (DateTime.Now.Subtract(nextSongScreenStartTime).TotalSeconds >= Settings.Instance.Radio.NextSongPrepareTime * 0.75 && !requestingSongDuration)
                {
                    outMsg.Write((byte)CommandType.GetSongDuration);
                    channelInfo.currentSong.AddToMessage(outMsg);
                    songDurationResponses.Clear();
                    requestingSongDuration = true;

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered);

                    if (radioClients.Count > 0)
                    {
                        BroadcastWebSocket(CommandType.GetSongDuration, channelInfo.currentSong);
                    }
                }
            }
            break;
            }

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

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

            switch (channelInfo.state)
            {
            case ChannelState.NextSong:
            {
                outMsg.Write((float)DateTime.Now.Subtract(nextSongScreenStartTime).TotalSeconds);
                outMsg.Write(Settings.Instance.Radio.NextSongPrepareTime);
            }
            break;

            case ChannelState.InGame:
            {
                outMsg.Write((float)DateTime.Now.Subtract(songStartTime).TotalSeconds);
                outMsg.Write(channelInfo.currentSong.songDuration);
            }
            break;

            case ChannelState.Results:
            {
                outMsg.Write((float)DateTime.Now.Subtract(resultsStartTime).TotalSeconds);
                outMsg.Write(Settings.Instance.Radio.ResultsShowTime);
            }
            break;
            }

            outMsg.Write(radioClients.Count);

            radioClients.ForEach(x => x.playerInfo.AddToMessage(outMsg));

            BroadcastPacket(outMsg, NetDeliveryMethod.UnreliableSequenced);

            if (radioClients.Count > 0)
            {
                BroadcastWebSocket(CommandType.UpdatePlayerInfo, radioClients.Select(x => x.playerInfo).ToArray());
            }
        }
Ejemplo n.º 6
0
 private void GameLoop(object sender, HighResolutionTimerElapsedEventArgs e)
 {
     Console.WriteLine($"Tick #{elapsedTicks}: {elapsedTicks * tickLengthMs}ms / {stopwatch.ElapsedMilliseconds}ms elapsed ({ Math.Abs((elapsedTicks * tickLengthMs) - stopwatch.ElapsedMilliseconds) }ms diff)");
     elapsedTicks++;
 }
Ejemplo n.º 7
0
        public void DoTick(object s, HighResolutionTimerElapsedEventArgs e)
        {
            //Console.WriteLine("Tick {0}", e.Delay);

            /* Loop over entities. Porbably not needed and also unoptimized
             * foreach (Entity entity in world.entities)
             * {
             *
             * }*/
            foreach (Entity entity in world.movedEntities)
            {
                if (entity.movedChunks)
                {
                    List <Game> toUncache = new List <Game>();
                    foreach (Game cacher in entity.cachedBy)
                    {
                        if (!world.InCacheRange(cacher.player, new Position(entity.pos.x >> 3, entity.pos.y >> 3), config))
                        {
                            toUncache.Add(cacher);
                        }
                    }
                    foreach (Game game in toUncache)
                    {
                        world.Uncache(game, entity);
                    }
                    //Entity moved chunks, we gotta update the caches.
                    for (int x = Math.Max(0, entity.chunk.pos.x - config.entityDistanceX); x <= Math.Min((world.width >> 3) - 1, entity.chunk.pos.x + config.entityDistanceX); x++)
                    {
                        for (int y = Math.Max(0, entity.chunk.pos.y - config.entityDistanceY); y <= Math.Min((world.height >> 3) - 1, entity.chunk.pos.y + config.entityDistanceY); y++)
                        {
                            // Possible optimization TODO: Chunks keep track of players specifically
                            foreach (Entity chunkEntity in world.GetChunk(new Position(x, y)).entities)
                            {
                                if (chunkEntity is Player && !entity.cachedBy.Contains(((Player)chunkEntity).game))
                                {
                                    world.Cache(((Player)chunkEntity).game, entity);
                                }
                            }
                        }
                    }
                }
                foreach (Game cacher in entity.cachedBy)
                {
                    if (!cacher.justCached)
                    {
                        cacher.UpdateEntityPos(entity);
                    }
                    else
                    {
                        cacher.justCached = false;
                    }
                }
                if (entity is Player)
                {
                    Player playerEntity = (Player)entity;
                    Game   playerGame   = playerEntity.game;
                    for (int x = Math.Max(0, entity.chunk.pos.x - config.entityDistanceX); x <= Math.Min((world.width >> 3) - 1, entity.chunk.pos.x + config.entityDistanceX); x++)
                    {
                        for (int y = Math.Max(0, entity.chunk.pos.y - config.entityDistanceY); y <= Math.Min((world.height >> 3) - 1, entity.chunk.pos.y + config.entityDistanceY); y++)
                        {
                            // Possible optimization TODO: Chunks keep track of players specifically
                            foreach (Entity chunkEntity in world.GetChunk(new Position(x, y)).entities)
                            {
                                if (!playerGame.cachedEntities.Contains(chunkEntity))
                                {
                                    world.Cache(playerGame, chunkEntity);
                                }
                            }
                        }
                    }
                }

                entity.moved       = false;
                entity.movedChunks = false;
            }
            world.movedEntities = new List <Entity>();
        }
Ejemplo n.º 8
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 ((msg = ListenerServer.ReadMessage()) != null)
            {
                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.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)
                            {
                                client.playerInfo = new PlayerInfo(msg);
                                if (Settings.Instance.Misc.PlayerColors.ContainsKey(client.playerInfo.playerId))
                                {
                                    client.playerInfo.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.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 StartLevelInfo(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)
                                {
                                    StartLevelInfo options = new StartLevelInfo(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);
            }
        }
Ejemplo n.º 9
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);
                    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());
            }
        }
Ejemplo n.º 10
0
 protected virtual void OnTick(object sender, HighResolutionTimerElapsedEventArgs e)
 {
     Tick?.Invoke(ellapsedTicks);
     ++ellapsedTicks;
 }
Ejemplo n.º 11
0
 void displayTimer_Elapsed(object sender, HighResolutionTimerElapsedEventArgs e)
 {
     PrintVariables();
 }
Ejemplo n.º 12
0
 private void Timer_Elapsed(object sender, HighResolutionTimerElapsedEventArgs e)
 {
     CmdNext_Click(sender, e);
 }
Ejemplo n.º 13
0
        public virtual void RoomLoop(object sender, HighResolutionTimerElapsedEventArgs e)
        {
            NetOutgoingMessage outMsg = HubListener.ListenerServer.CreateMessage();

            switch (roomState)
            {
            case RoomState.InGame:
            {
                if ((DateTime.Now.Subtract(_songStartTime).TotalSeconds >= selectedSong.songDuration) ||
                    (DateTime.Now.Subtract(_songStartTime).TotalSeconds >= 10f && roomClients.All(x => x.playerInfo.playerState != PlayerState.Game)))
                {
                    roomState         = RoomState.Results;
                    _resultsStartTime = DateTime.Now;

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

                    BroadcastPacket(outMsg, NetDeliveryMethod.ReliableOrdered, 0);

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

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

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

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

            case RoomState.SelectingSong:
            {
                switch (roomSettings.SelectionType)
                {
                case SongSelectionType.Random:
                {
                    if (!requestedRandomSong && roomClients.Count > 0 && roomClients.Any(x => roomHost.Equals(x.playerInfo)))
                    {
                        requestedRandomSong = true;

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

                        roomClients.First(x => roomHost.Equals(x.playerInfo)).playerConnection.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered, 0);

                        BroadcastWebSocket(CommandType.GetRandomSongInfo, null);
                    }
                }
                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(roomSettings.ResultsShowTime);
            }
            break;
            }

            outMsg.Write(roomClients.Count);

            for (int i = 0; i < roomClients.Count; i++)
            {
                if (i < roomClients.Count)
                {
                    if (roomClients[i] != null)
                    {
                        if (roomClients[i].playerInfo.Equals(roomHost) && roomClients[i].playerInfo.playerNameColor.Equals(Color32.defaultColor))
                        {
                            roomClients[i].playerInfo.playerNameColor = Color32.roomHostColor;
                        }
                        roomClients[i].playerInfo.AddToMessage(outMsg);
                    }
                }
            }

            BroadcastPacket(outMsg, NetDeliveryMethod.UnreliableSequenced, 1);

            if (roomClients.Count > 0)
            {
                BroadcastWebSocket(CommandType.UpdatePlayerInfo, roomClients.Select(x => x.playerInfo).ToArray());
            }
        }