// Use this for initialization void Start() { loadData = GetComponent <LoadSong>(); songData = loadData.ExtractData(songName, 7040); Debug.Log(songData.Count); GetTriggers(); }
private void startGame() { // sphere.SetActive(false); // Get the skin and set to delfault if not found. int skin = PlayerPrefs.GetInt("skin"); if (skin < 0 || skin > 2) { skin = 0; } // Assign the skin to the morin khuur sprite selectedMK.sprite = mkSprites[skin]; // Get the notes from each indiv song TextAsset lsFile = null; ls = new LoadSong(); string songChoice = PlayerPrefs.GetString("song_choice"); // Since we had resource folder problems we define the song and file when starting if (songChoice.Equals("song1")) { clip = songClip1; lsFile = lsFile1; } else if (songChoice.Equals("song2")) { clip = songClip2; lsFile = lsFile2; } else if (songChoice.Equals("song3")) { clip = songClip3; lsFile = lsFile3; } else { clip = songClip1; lsFile = lsFile1; PlayerPrefs.SetString("song_choice", "song1"); } ls.loadSong(lsFile); clip.LoadAudioData(); // Ensures the clip is loaded before we continue. do { } while (clip.loadState != AudioDataLoadState.Loaded); // Assign the clip to the auto source song = GetComponent <AudioSource>(); song.clip = clip; paused = false; timeR = song.clip.length; //song.time = song.clip.length - 10; song.Play(); }
private void Client_PacketRecieved(Packet packet) { if (packet.Type == PacketType.PlaySong) { PlaySong playSong = packet.SpecificPacket as PlaySong; var desiredLevel = Plugin.masterLevelList.First(x => x.levelID == playSong.levelId); var desiredCharacteristic = desiredLevel.previewDifficultyBeatmapSets.GetBeatmapCharacteristics().First(x => x.serializedName == playSong.characteristic.SerializedName); var desiredDifficulty = (BeatmapDifficulty)playSong.difficulty; SaberUtilities.PlaySong(desiredLevel, desiredCharacteristic, desiredDifficulty, playSong); } else if (packet.Type == PacketType.LoadSong) { LoadSong loadSong = packet.SpecificPacket as LoadSong; Action <IBeatmapLevel> SongLoaded = (loadedLevel) => { var loadedSong = new LoadedSong(); var beatmapLevel = new PreviewBeatmapLevel(); beatmapLevel.Characteristics = loadedLevel.beatmapLevelData.difficultyBeatmapSets.ToList().Select(x => { var characteristic = new Characteristic(); characteristic.SerializedName = x.beatmapCharacteristic.serializedName; characteristic.difficulties = loadedLevel.beatmapLevelData.difficultyBeatmapSets .First(y => y.beatmapCharacteristic.serializedName == x.beatmapCharacteristic.serializedName) .difficultyBeatmaps.Select(y => (Characteristic.BeatmapDifficulty)y.difficulty).ToArray(); return(characteristic); }).ToArray(); beatmapLevel.LevelId = loadedLevel.levelID; beatmapLevel.Name = loadedLevel.songName; beatmapLevel.Loaded = true; loadedSong.level = beatmapLevel; client.Send(new Packet(loadedSong).ToBytes()); }; LoadSong(loadSong.levelId, SongLoaded); } else if (packet.Type == PacketType.Command) { Command command = packet.SpecificPacket as Command; if (command.commandType == Command.CommandType.ReturnToMenu) { SaberUtilities.ReturnToMenu(); } } }
private void SongSelection_SongSelected(string levelId) { //Load the song, then display the detail info SongUtils.LoadSong(levelId, (loadedLevel) => { if (!_songDetail.isInViewControllerHierarchy) { PresentViewController(_songDetail, () => { _songDetail.DisableCharacteristicControl = !isHost; _songDetail.DisableDifficultyControl = !isHost; _songDetail.DisablePlayButton = !isHost; _songDetail.SetSelectedSong(loadedLevel); tempStat = loadedLevel; }); } else { _songDetail.DisableCharacteristicControl = !isHost; _songDetail.DisableDifficultyControl = !isHost; _songDetail.DisablePlayButton = !isHost; _songDetail.SetSelectedSong(loadedLevel); } //Tell the other players to download the song, if we're host if (isHost) { var loadSong = new LoadSong { LevelId = loadedLevel.levelID }; //Send updated download status (Plugin.client.Self as Player).DownloadState = Player.DownloadStates.Downloaded; var playerUpdate = new Event { Type = Event.EventType.PlayerUpdated, ChangedObject = Plugin.client.Self }; Plugin.client.Send(new Packet(playerUpdate)); //We don't want to recieve this since it would cause an infinite song loading loop. //Our song is already loaded inherently since we're selecting it as the host Plugin.client.Send(Match.Players.Except(new Player[] { Plugin.client.Self as Player }).Select(x => x.Id).ToArray(), new Packet(loadSong)); } }); }
private void songSelection_SongSelected(IPreviewBeatmapLevel level) { //Load the song, then display the detail info SongUtils.LoadSong(level.levelID, (loadedLevel) => { if (!_songDetail.isInViewControllerHierarchy) { PresentViewController(_songDetail, () => { _songDetail.SetHost(isHost); _songDetail.SetSelectedSong(loadedLevel); }); } else { _songDetail.SetHost(isHost); _songDetail.SetSelectedSong(loadedLevel); } //Tell the other players to download the song, if we're host if (isHost) { var loadSong = new LoadSong(); loadSong.LevelId = loadedLevel.levelID; //Send updated download status (Plugin.client.Self as Player).DownloadState = Player.DownloadStates.Downloaded; var playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Plugin.client.Self; Plugin.client.Send(new Packet(playerUpdate)); //We don't want to recieve this since it would cause an infinite song loading loop. //Our song is already loaded inherently since we're selecting it as the host Plugin.client.Send(Match.Players.Except(new Player[] { Plugin.client.Self as Player }).Select(x => x.Id).ToArray(), new Packet(loadSong)); } }); }
private void songListView_SelectedIndexChangedAsync(object sender, EventArgs e) { if (songListView.SelectedItems.Count >= 1) { var levelID = songListView.SelectedItems[0].ImageKey; PreviewBeatmapLevel level = masterLevelList.Where(x => x.LevelId == levelID).First(); //Clear out old info characteristicDropdown.Items.Clear(); difficultyDropdown.Items.Clear(); //Load IBeatmapLevel if (!level.Loaded) { var loadLevel = new LoadSong(); loadLevel.levelId = level.LevelId; server.Send(new Packet(loadLevel).ToBytes()); } else { SongLoaded(level); } } }
protected override void Client_PacketReceived(Packet packet) { base.Client_PacketReceived(packet); if (packet.Type == PacketType.PlaySong) { PlaySong playSong = packet.SpecificPacket as PlaySong; var desiredLevel = SongUtils.masterLevelList.First(x => x.levelID == playSong.GameplayParameters.Beatmap.LevelId); var desiredCharacteristic = desiredLevel.previewDifficultyBeatmapSets.FirstOrDefault(x => x.beatmapCharacteristic.serializedName == playSong.GameplayParameters.Beatmap.Characteristic.SerializedName).beatmapCharacteristic ?? desiredLevel.previewDifficultyBeatmapSets.First().beatmapCharacteristic; var desiredDifficulty = (BeatmapDifficulty)playSong.GameplayParameters.Beatmap.Difficulty; var playerData = Resources.FindObjectsOfTypeAll <PlayerDataModel>().First().playerData; var playerSettings = playerData.playerSpecificSettings; //Override defaults if we have forced options enabled if (playSong.GameplayParameters.PlayerSettings.Options != PlayerOptions.None) { playerSettings = new PlayerSpecificSettings( playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.StaticLights), playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.LeftHanded), playSong.GameplayParameters.PlayerSettings.PlayerHeight, playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.AutoPlayerHeight), playSong.GameplayParameters.PlayerSettings.SfxVolume, playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.ReduceDebris), playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.NoHud), playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.NoFailEffects), playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.AdvancedHud), playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.AutoRestart), playSong.GameplayParameters.PlayerSettings.SaberTrailIntensity, playSong.GameplayParameters.PlayerSettings.NoteJumpStartBeatOffset, playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.HideNoteSpawnEffect), playSong.GameplayParameters.PlayerSettings.Options.HasFlag(PlayerOptions.AdaptiveSfx) ); } var songSpeed = GameplayModifiers.SongSpeed.Normal; if (playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.SlowSong)) { songSpeed = GameplayModifiers.SongSpeed.Slower; } if (playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.FastSong)) { songSpeed = GameplayModifiers.SongSpeed.Faster; } var gameplayModifiers = new GameplayModifiers( playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.DemoNoFail), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.DemoNoObstacles), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.BatteryEnergy) ? GameplayModifiers.EnergyType.Battery : GameplayModifiers.EnergyType.Bar, playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.NoFail), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.InstaFail), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.FailOnClash), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.NoObstacles) ? GameplayModifiers.EnabledObstacleType.NoObstacles : GameplayModifiers.EnabledObstacleType.All, playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.NoBombs), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.FastNotes), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.StrictAngles), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.DisappearingArrows), songSpeed, playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.NoArrows), playSong.GameplayParameters.GameplayModifiers.Options.HasFlag(GameOptions.GhostNotes) ); var colorScheme = playerData.colorSchemesSettings.overrideDefaultColors ? playerData.colorSchemesSettings.GetSelectedColorScheme() : null; //Disable score submission if nofail is on. This is specifically for Hidden Sabers, though it may stay longer if (playSong.DisableScoresaberSubmission) { BS_Utils.Gameplay.ScoreSubmission.DisableSubmission(SharedConstructs.Name); } if (playSong.ShowNormalNotesOnStream) { var customNotes = IPA.Loader.PluginManager.GetPluginFromId("CustomNotes"); if (customNotes != null) { EnableHMDOnly(); } } PlaySong?.Invoke(desiredLevel, desiredCharacteristic, desiredDifficulty, gameplayModifiers, playerSettings, playerData.overrideEnvironmentSettings, colorScheme, playSong.FloatingScoreboard, playSong.StreamSync, playSong.DisablePause, playSong.DisableFail); } else if (packet.Type == PacketType.Command) { Command command = packet.SpecificPacket as Command; if (command.CommandType == Command.CommandTypes.ReturnToMenu) { if (SyncHandler.Instance != null) { ScreenOverlay.Instance.Clear(); } if ((Self as Player).PlayState == Player.PlayStates.InGame) { PlayerUtils.ReturnToMenu(); } } else if (command.CommandType == Command.CommandTypes.ScreenOverlay_ShowPng) { ScreenOverlay.Instance.ShowPng(); } else if (command.CommandType == Command.CommandTypes.DelayTest_Finish) { UnityMainThreadDispatcher.Instance().Enqueue(() => { ScreenOverlay.Instance.Clear(); SyncHandler.Instance.Resume(); SyncHandler.Destroy(); }); } } else if (packet.Type == PacketType.LoadSong) { LoadSong loadSong = packet.SpecificPacket as LoadSong; Action <IBeatmapLevel> SongLoaded = (loadedLevel) => { //Send updated download status (Self as Player).DownloadState = Player.DownloadStates.Downloaded; var playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Self; Send(new Packet(playerUpdate)); //Notify any listeners of the client that a song has been loaded LoadedSong?.Invoke(loadedLevel); }; if (OstHelper.IsOst(loadSong.LevelId)) { SongLoaded?.Invoke(SongUtils.masterLevelList.First(x => x.levelID == loadSong.LevelId) as BeatmapLevelSO); } else { if (SongUtils.masterLevelList.Any(x => x.levelID == loadSong.LevelId)) { SongUtils.LoadSong(loadSong.LevelId, SongLoaded); } else { Action <string, bool> loadSongAction = (hash, succeeded) => { if (succeeded) { SongUtils.LoadSong(loadSong.LevelId, SongLoaded); } else { (Self as Player).DownloadState = Player.DownloadStates.DownloadError; var playerUpdated = new Event(); playerUpdated.Type = Event.EventType.PlayerUpdated; playerUpdated.ChangedObject = Self; Send(new Packet(playerUpdated)); } }; (Self as Player).DownloadState = Player.DownloadStates.Downloading; var playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Self; Send(new Packet(playerUpdate)); SongDownloader.DownloadSong(loadSong.LevelId, songDownloaded: loadSongAction, downloadProgressChanged: (hash, progress) => Logger.Debug($"DOWNLOAD PROGRESS ({hash}): {progress}"), customHostUrl: loadSong.CustomHostUrl); } } } else if (packet.Type == PacketType.File) { File file = packet.SpecificPacket as File; if (file.Intent == File.Intentions.SetPngToShowWhenTriggered) { var pngBytes = file.Compressed ? CompressionUtils.Decompress(file.Data) : file.Data; ScreenOverlay.Instance.SetPngBytes(pngBytes); } else if (file.Intent == File.Intentions.ShowPngImmediately) { var pngBytes = file.Compressed ? CompressionUtils.Decompress(file.Data) : file.Data; ScreenOverlay.Instance.SetPngBytes(pngBytes); ScreenOverlay.Instance.ShowPng(); } Send(packet.From, new Packet(new Acknowledgement() { PacketId = packet.Id, Type = Acknowledgement.AcknowledgementType.FileDownloaded })); } }
protected override void Client_PacketRecieved(Packet packet) { base.Client_PacketRecieved(packet); if (packet.Type == PacketType.PlaySong) { PlaySong playSong = packet.SpecificPacket as PlaySong; PlaySong?.Invoke(playSong.Beatmap); } else if (packet.Type == PacketType.Command) { Command command = packet.SpecificPacket as Command; if (command.CommandType == Command.CommandTypes.ReturnToMenu) { if ((Self as Player).PlayState == Player.PlayStates.InGame) { ReturnToMenu?.Invoke(); } } } else if (packet.Type == PacketType.LoadSong) { LoadSong loadSong = packet.SpecificPacket as LoadSong; //Send updated download status (Self as Player).DownloadState = Player.DownloadStates.Downloading; var playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Self; Send(new Packet(playerUpdate)); var hash = HashFromLevelId(loadSong.LevelId); BeatSaverDownloader.DownloadSongInfoThreaded(hash, (successfulDownload) => { if (successfulDownload) { var song = new DownloadedSong(hash); var mapFormattedLevelId = $"custom_level_{hash.ToUpper()}"; var matchMap = new PreviewBeatmapLevel() { LevelId = mapFormattedLevelId, Name = song.Name }; List <Characteristic> characteristics = new List <Characteristic>(); foreach (var characteristic in song.Characteristics) { characteristics.Add(new Characteristic() { SerializedName = characteristic, Difficulties = song.GetBeatmapDifficulties(characteristic) }); } matchMap.Characteristics = characteristics.ToArray(); //Send updated download status (Self as Player).DownloadState = Player.DownloadStates.Downloaded; playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Self; Send(new Packet(playerUpdate)); LoadedSong?.Invoke(matchMap); Logger.Debug($"SENT DOWNLOADED SIGNAL {(playerUpdate.ChangedObject as Player).DownloadState}"); } else { //Send updated download status (Self as Player).DownloadState = Player.DownloadStates.DownloadError; playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Self; Send(new Packet(playerUpdate)); } } ); } }
public void exitGame() { ls = null; Time.timeScale = 1; SceneManager.LoadScene("Menu"); }
private void Client_PacketRecieved(Packet packet) { if (packet.Type == PacketType.PlaySong) { PlaySong playSong = packet.SpecificPacket as PlaySong; var desiredLevel = Plugin.masterLevelList.First(x => x.levelID == playSong.levelId); var desiredCharacteristic = desiredLevel.beatmapCharacteristics.First(x => x.serializedName == playSong.characteristic.SerializedName); var desiredDifficulty = (BeatmapDifficulty)playSong.difficulty; var playerSpecificSettings = new PlayerSpecificSettings(); playerSpecificSettings.advancedHud = playSong.playerSettings.advancedHud; playerSpecificSettings.leftHanded = playSong.playerSettings.leftHanded; playerSpecificSettings.noTextsAndHuds = playSong.playerSettings.noTextsAndHuds; playerSpecificSettings.reduceDebris = playSong.playerSettings.reduceDebris; playerSpecificSettings.staticLights = playSong.playerSettings.staticLights; var gameplayModifiers = new GameplayModifiers(); gameplayModifiers.batteryEnergy = playSong.gameplayModifiers.batteryEnergy; gameplayModifiers.disappearingArrows = playSong.gameplayModifiers.disappearingArrows; gameplayModifiers.failOnSaberClash = playSong.gameplayModifiers.failOnSaberClash; gameplayModifiers.fastNotes = playSong.gameplayModifiers.fastNotes; gameplayModifiers.ghostNotes = playSong.gameplayModifiers.ghostNotes; gameplayModifiers.instaFail = playSong.gameplayModifiers.instaFail; gameplayModifiers.noBombs = playSong.gameplayModifiers.noBombs; gameplayModifiers.noFail = playSong.gameplayModifiers.noFail; gameplayModifiers.noObstacles = playSong.gameplayModifiers.noObstacles; gameplayModifiers.songSpeed = (GameplayModifiers.SongSpeed)playSong.gameplayModifiers.songSpeed; SaberUtilities.PlaySong(desiredLevel, desiredCharacteristic, desiredDifficulty, gameplayModifiers, playerSpecificSettings); } else if (packet.Type == PacketType.LoadSong) { LoadSong loadSong = packet.SpecificPacket as LoadSong; Action <IBeatmapLevel> SongLoaded = (loadedLevel) => { var loadedSong = new LoadedSong(); var beatmapLevel = new PreviewBeatmapLevel(); beatmapLevel.Characteristics = loadedLevel.beatmapCharacteristics.ToList().Select(x => { var characteristic = new Characteristic(); characteristic.SerializedName = x.serializedName; characteristic.difficulties = loadedLevel.beatmapLevelData.difficultyBeatmapSets .First(y => y.beatmapCharacteristic.serializedName == x.serializedName) .difficultyBeatmaps.Select(y => (Characteristic.BeatmapDifficulty)y.difficulty).ToArray(); return(characteristic); }).ToArray(); beatmapLevel.LevelId = loadedLevel.levelID; beatmapLevel.Name = loadedLevel.songName; beatmapLevel.Loaded = true; loadedSong.level = beatmapLevel; client.Send(new Packet(loadedSong).ToBytes()); }; LoadSong(loadSong.levelId, SongLoaded); } else if (packet.Type == PacketType.Command) { Command command = packet.SpecificPacket as Command; if (command.commandType == Command.CommandType.ReturnToMenu) { SaberUtilities.ReturnToMenu(); } } }
protected override void Client_PacketRecieved(Packet packet) { base.Client_PacketRecieved(packet); if (packet.Type == PacketType.PlaySong) { PlaySong playSong = packet.SpecificPacket as PlaySong; var desiredLevel = SongUtils.masterLevelList.First(x => x.levelID == playSong.Beatmap.LevelId); var desiredCharacteristic = desiredLevel.previewDifficultyBeatmapSets.FirstOrDefault(x => x.beatmapCharacteristic.serializedName == playSong.Beatmap.Characteristic.SerializedName).beatmapCharacteristic ?? desiredLevel.previewDifficultyBeatmapSets.First().beatmapCharacteristic; var desiredDifficulty = (BeatmapDifficulty)playSong.Beatmap.Difficulty; var playerData = Resources.FindObjectsOfTypeAll <PlayerDataModel>().First().playerData; var playerSettings = playerData.playerSpecificSettings; //Override defaults if we have forced options enabled if (playSong.PlayerSettings.Options != PlayerOptions.None) { playerSettings = new PlayerSpecificSettings(); playerSettings.leftHanded = playSong.PlayerSettings.Options.HasFlag(PlayerOptions.LeftHanded); playerSettings.staticLights = playSong.PlayerSettings.Options.HasFlag(PlayerOptions.StaticLights); playerSettings.noTextsAndHuds = playSong.PlayerSettings.Options.HasFlag(PlayerOptions.NoHud); playerSettings.advancedHud = playSong.PlayerSettings.Options.HasFlag(PlayerOptions.AdvancedHud); playerSettings.reduceDebris = playSong.PlayerSettings.Options.HasFlag(PlayerOptions.ReduceDebris); } var gameplayModifiers = new GameplayModifiers(); gameplayModifiers.batteryEnergy = playSong.GameplayModifiers.Options.HasFlag(GameOptions.BatteryEnergy); gameplayModifiers.disappearingArrows = playSong.GameplayModifiers.Options.HasFlag(GameOptions.DisappearingArrows); gameplayModifiers.failOnSaberClash = playSong.GameplayModifiers.Options.HasFlag(GameOptions.FailOnClash); gameplayModifiers.fastNotes = playSong.GameplayModifiers.Options.HasFlag(GameOptions.FastNotes); gameplayModifiers.ghostNotes = playSong.GameplayModifiers.Options.HasFlag(GameOptions.GhostNotes); gameplayModifiers.instaFail = playSong.GameplayModifiers.Options.HasFlag(GameOptions.InstaFail); gameplayModifiers.noBombs = playSong.GameplayModifiers.Options.HasFlag(GameOptions.NoBombs); gameplayModifiers.noFail = playSong.GameplayModifiers.Options.HasFlag(GameOptions.NoFail); gameplayModifiers.noObstacles = playSong.GameplayModifiers.Options.HasFlag(GameOptions.NoObstacles); gameplayModifiers.noArrows = playSong.GameplayModifiers.Options.HasFlag(GameOptions.NoArrows); if (playSong.GameplayModifiers.Options.HasFlag(GameOptions.SlowSong)) { gameplayModifiers.songSpeed = GameplayModifiers.SongSpeed.Slower; } if (playSong.GameplayModifiers.Options.HasFlag(GameOptions.FastSong)) { gameplayModifiers.songSpeed = GameplayModifiers.SongSpeed.Faster; } var colorScheme = playerData.colorSchemesSettings.overrideDefaultColors ? playerData.colorSchemesSettings.GetSelectedColorScheme() : null; PlaySong?.Invoke(desiredLevel, desiredCharacteristic, desiredDifficulty, gameplayModifiers, playerSettings, playerData.overrideEnvironmentSettings, colorScheme, playSong.FloatingScoreboard, playSong.StreamSync, playSong.DisablePause, playSong.DisableFail); } else if (packet.Type == PacketType.Command) { Command command = packet.SpecificPacket as Command; if (command.CommandType == Command.CommandTypes.ReturnToMenu) { if (SyncHandler.Instance != null) { ScreenOverlay.Instance.Clear(); } if ((Self as Player).PlayState == Player.PlayStates.InGame) { PlayerUtils.ReturnToMenu(); } } else if (command.CommandType == Command.CommandTypes.ScreenOverlay_ShowPng) { ScreenOverlay.Instance.ShowPng(); } else if (command.CommandType == Command.CommandTypes.DelayTest_Finish) { UnityMainThreadDispatcher.Instance().Enqueue(() => { ScreenOverlay.Instance.Clear(); SyncHandler.Instance.Resume(); SyncHandler.Destroy(); }); } } else if (packet.Type == PacketType.LoadSong) { LoadSong loadSong = packet.SpecificPacket as LoadSong; Action <IBeatmapLevel> SongLoaded = (loadedLevel) => { //Send updated download status (Self as Player).DownloadState = Player.DownloadStates.Downloaded; var playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Self; Send(new Packet(playerUpdate)); //Notify any listeners of the client that a song has been loaded LoadedSong?.Invoke(loadedLevel); Logger.Debug($"SENT DOWNLOADED SIGNAL {(playerUpdate.ChangedObject as Player).DownloadState}"); }; if (OstHelper.IsOst(loadSong.LevelId)) { SongLoaded?.Invoke(SongUtils.masterLevelList.First(x => x.levelID == loadSong.LevelId) as BeatmapLevelSO); } else { if (SongUtils.masterLevelList.Any(x => x.levelID == loadSong.LevelId)) { SongUtils.LoadSong(loadSong.LevelId, SongLoaded); } else { Action <bool> loadSongAction = (succeeded) => { if (succeeded) { SongUtils.LoadSong(loadSong.LevelId, SongLoaded); } else { (Self as Player).DownloadState = Player.DownloadStates.DownloadError; var playerUpdated = new Event(); playerUpdated.Type = Event.EventType.PlayerUpdated; playerUpdated.ChangedObject = Self; Send(new Packet(playerUpdated)); Logger.Debug($"SENT DOWNLOADED SIGNAL {(playerUpdated.ChangedObject as Player).DownloadState}"); } }; (Self as Player).DownloadState = Player.DownloadStates.Downloading; var playerUpdate = new Event(); playerUpdate.Type = Event.EventType.PlayerUpdated; playerUpdate.ChangedObject = Self; Send(new Packet(playerUpdate)); Logger.Debug($"SENT DOWNLOAD SIGNAL {(playerUpdate.ChangedObject as Player).DownloadState}"); SongDownloader.DownloadSong(loadSong.LevelId, songDownloaded: loadSongAction, downloadProgressChanged: (progress) => Logger.Debug($"DOWNLOAD PROGRESS: {progress}")); } } } else if (packet.Type == PacketType.File) { File file = packet.SpecificPacket as File; if (file.Intention == File.Intentions.SetPngToShowWhenTriggered) { var pngBytes = file.Compressed ? CompressionUtils.Decompress(file.Data) : file.Data; ScreenOverlay.Instance.SetPngBytes(pngBytes); } else if (file.Intention == File.Intentions.ShowPngImmediately) { var pngBytes = file.Compressed ? CompressionUtils.Decompress(file.Data) : file.Data; ScreenOverlay.Instance.SetPngBytes(pngBytes); ScreenOverlay.Instance.ShowPng(); } Send(packet.From, new Packet(new Acknowledgement() { PacketId = packet.Id, Type = Acknowledgement.AcknowledgementType.FileDownloaded })); } }