public static void UpdateJoinButton() { //if (!Instance || !Instance.isActiveAndEnabled) { return; } if (!SteamAPI.IsHost() && SteamAPI.GetLobbyData().Screen == LobbyPacket.SCREEN_TYPE.MENU) { bodyText.text = "Waiting for host to select a song"; } if (SteamAPI.GetLobbyData().Screen != LobbyPacket.SCREEN_TYPE.IN_GAME) { return; } bodyText.text = $"Currently playing {SteamAPI.GetSongName()} @ {Math.Floor(SteamAPI.GetSongOffset() / 60f)}:{Math.Floor(SteamAPI.GetSongOffset() % 60f)}"; if (SteamAPI.GetLobbyData().CurrentSongOffset > 0f) { rejoin.interactable = true; } else { rejoin.interactable = false; } }
public void OnLobbyDataUpdate(LobbyDataUpdate_t pCallback) { if (pCallback.m_ulSteamIDLobby == pCallback.m_ulSteamIDMember) { LobbyInfo info = new LobbyInfo(SteamMatchmaking.GetLobbyData(new CSteamID(pCallback.m_ulSteamIDLobby), "LOBBY_INFO")); if (pCallback.m_ulSteamIDLobby == 0) { return; } Logger.Debug($"Received: {info.ToString()}"); if (pCallback.m_ulSteamIDLobby == SteamAPI.getLobbyID().m_SteamID) { SteamAPI.UpdateLobbyInfo(info); if (DidScreenChange(info.Screen, LobbyInfo.SCREEN_TYPE.WAITING)) { currentScreen = info.Screen; Logger.Debug($"Song has been selected, going to the waiting screen"); WaitingMenu.Instance.Present(); } else if (DidScreenChange(info.Screen, LobbyInfo.SCREEN_TYPE.MENU)) { currentScreen = info.Screen; Logger.Debug($"Song has finished, updating state to menu"); GameController.Instance.SongFinished(null, null, null, null); } else if (DidScreenChange(info.Screen, LobbyInfo.SCREEN_TYPE.PLAY_SONG)) { currentScreen = info.Screen; Logger.Debug($"Host requested to play the current song {info.CurrentSongId}"); LevelSO song = SongListUtils.GetInstalledSong(); if (SteamAPI.IsHost()) { SteamAPI.setLobbyStatus("Playing " + song.songName + " by " + song.songAuthorName); } SteamAPI.ClearPlayerReady(new CSteamID(SteamAPI.GetUserID()), true); SongListUtils.StartSong(song, SteamAPI.GetSongDifficulty(), info.GameplayModifiers); } } else { SteamAPI.SetOtherLobbyData(pCallback.m_ulSteamIDLobby, info); } } else { string status = SteamMatchmaking.GetLobbyMemberData(new CSteamID(pCallback.m_ulSteamIDLobby), new CSteamID(pCallback.m_ulSteamIDMember), "STATUS"); if (status == "DISCONNECTED") { SteamAPI.DisconnectPlayer(pCallback.m_ulSteamIDMember); } else if (status.StartsWith("KICKED")) { ulong playerId = Convert.ToUInt64(status.Substring(7)); if (playerId != 0 && playerId == SteamAPI.GetUserID()) { SteamAPI.Disconnect(); } } } }
public void UpsertPlayer(PlayerInfo info) { if (info.playerId == _playerInfo.playerId) { return; } try { if (!_connectedPlayers.Keys.Contains(info.playerId)) { _connectedPlayers.Add(info.playerId, info); if ((Config.Instance.AvatarsInLobby && Plugin.instance.CurrentScene == "Menu") || (Config.Instance.AvatarsInGame && Plugin.instance.CurrentScene == "GameCore")) { AvatarController avatar = new GameObject("AvatarController").AddComponent <AvatarController>(); avatar.SetPlayerInfo(info, new Vector3(0, 0, 0), info.playerId == _playerInfo.playerId); _connectedPlayerAvatars.Add(info.playerId, avatar); } MultiplayerLobby.RefreshScores(); Scoreboard.Instance.UpsertScoreboardEntry(info.playerId, info.playerName); return; } if (_connectedPlayers.ContainsKey(info.playerId)) { if (info.playerScore != _connectedPlayers[info.playerId].playerScore || info.playerComboBlocks != _connectedPlayers[info.playerId].playerComboBlocks) { Scoreboard.Instance.UpsertScoreboardEntry(info.playerId, info.playerName, (int)info.playerScore, (int)info.playerComboBlocks); MultiplayerLobby.RefreshScores(); } if (_connectedPlayerAvatars.ContainsKey(info.playerId) && (Config.Instance.AvatarsInLobby && Plugin.instance.CurrentScene == "Menu") || (Config.Instance.AvatarsInGame && Plugin.instance.CurrentScene == "GameCore")) { Vector3 offset = new Vector3(0, 0, 0); if (Plugin.instance.CurrentScene == "GameCore") { ulong[] playerInfosByID = new ulong[_connectedPlayers.Count + 1]; playerInfosByID[0] = _playerInfo.playerId; _connectedPlayers.Keys.ToList().CopyTo(playerInfosByID, 1); Array.Sort(playerInfosByID); offset = new Vector3((Array.IndexOf(playerInfosByID, info.playerId) - Array.IndexOf(playerInfosByID, _playerInfo.playerId)) * 2f, 0, Math.Abs((Array.IndexOf(playerInfosByID, info.playerId) - Array.IndexOf(playerInfosByID, _playerInfo.playerId)) * 2.5f)); } _connectedPlayerAvatars[info.playerId].SetPlayerInfo(info, offset, info.playerId == _playerInfo.playerId); } bool changedDownloading = (_connectedPlayers[info.playerId].Downloading != info.Downloading || _connectedPlayers[info.playerId].playerProgress != info.playerProgress); _connectedPlayers[info.playerId] = info; if (changedDownloading) { if (SteamAPI.IsHost()) { if (info.Downloading) { if (_connectedPlayers.Values.ToList().All(u => u.Downloading)) { Data.Logger.Debug($"Everyone has confirmed that they are ready to play, broadcast that we want them all to start playing"); SteamAPI.StartPlaying(); } WaitingMenu.RefreshData(); } else { if (_connectedPlayers.Values.ToList().All(u => !u.Downloading)) { Data.Logger.Debug($"Everyone has confirmed they are in game, set the lobby screen to in game"); SteamAPI.StartGame(); } } } else { WaitingMenu.RefreshData(); } } } } catch (Exception e) { Data.Logger.Error(e); } }