From b35575539989c9f77e2b7af94c7dc33a2d63168a Mon Sep 17 00:00:00 2001 From: ipodtouch0218 Date: Tue, 9 Jan 2024 00:14:02 -0500 Subject: [PATCH] nightly v1.8.0.0 (1/8) --- Assets/Scripts/BuildInfo.cs | 2 +- Assets/Scripts/Camera/CameraController.cs | 56 ++++++++++++++----- Assets/Scripts/GameManager.cs | 21 +++++-- .../Networking/AuthenticationHandler.cs | 28 +++++----- .../Networking/Fusion/NetworkHandler.cs | 21 ++++--- .../Scripts/Networking/Fusion/SessionData.cs | 5 ++ Assets/Scripts/TileManager.cs | 34 +++++++---- Assets/Scripts/UI/Menu/MainMenuManager.cs | 11 ++-- Assets/Scripts/UI/Menu/RoomListManager.cs | 21 ++++--- ProjectSettings/ProjectSettings.asset | 3 +- 10 files changed, 136 insertions(+), 66 deletions(-) diff --git a/Assets/Scripts/BuildInfo.cs b/Assets/Scripts/BuildInfo.cs index e70283bc50..15ad361396 100644 --- a/Assets/Scripts/BuildInfo.cs +++ b/Assets/Scripts/BuildInfo.cs @@ -1 +1 @@ -public static class BuildInfo{public static string BUILD_TIME = "1/8/2024 5:02:13 AM";} +public static class BuildInfo{public static string BUILD_TIME = "1/8/2024 11:29:05 PM";} diff --git a/Assets/Scripts/Camera/CameraController.cs b/Assets/Scripts/Camera/CameraController.cs index e58e24fdcf..43117d8119 100644 --- a/Assets/Scripts/Camera/CameraController.cs +++ b/Assets/Scripts/Camera/CameraController.cs @@ -5,6 +5,7 @@ using NSMB.Entities.Player; using NSMB.Game; using NSMB.Utils; +using NSMB.Extensions; //[OrderBefore(typeof(Powerup))] public class CameraController : NetworkBehaviour { @@ -17,8 +18,9 @@ public class CameraController : NetworkBehaviour { public static float ScreenShake { get => _screenShake; set { - if (CurrentController && !CurrentController.controller.IsOnGround) + if (CurrentController && !CurrentController.controller.IsOnGround) { return; + } _screenShake = value; } @@ -51,11 +53,10 @@ public bool IsControllingCamera { //---Private Variables private readonly List secondaryPositioners = new(); private PropertyReader currentPositionReader; + private Vector2 previousCurrentPosition; public void OnValidate() { - if (!controller) controller = GetComponentInParent(); - - currentPositionReader = GetPropertyReader(nameof(CurrentPosition)); + this.SetIfNull(ref controller, UnityExtensions.GetComponentType.Parent); } public void Awake() { @@ -63,14 +64,29 @@ public void Awake() { TargetCamera.GetComponentsInChildren(secondaryPositioners); } + public override void Spawned() { + currentPositionReader = GetPropertyReader(nameof(CurrentPosition)); + Object.RenderTimeframe = !controller.IsProxy ? RenderTimeframe.Auto : RenderTimeframe.Remote; + } + public override void Render() { - if (!IsControllingCamera) + if (!IsControllingCamera) { return; + } Vector3 newPosition; if (TryGetSnapshotsBuffers(out var from, out var to, out float alpha)) { - (var fromVector, var toVector) = currentPositionReader.Read(from, to); + Vector2 fromVector, toVector; + + if (Object.RenderTimeframe == RenderTimeframe.Remote) { + // Weird interpolation stuff taken from EntityMover + fromVector = previousCurrentPosition; + toVector = CurrentPosition; + previousCurrentPosition = CurrentPosition; + } else { + (fromVector, toVector) = currentPositionReader.Read(from, to); + } Utils.UnwrapLocations(fromVector, toVector, out var fromVectorRelative, out var toVectorRelative); Vector2 lerped = Vector2.Lerp(fromVectorRelative, toVectorRelative, alpha); @@ -83,8 +99,9 @@ public override void Render() { } Vector3 shakeOffset = Vector3.zero; - if ((_screenShake -= Time.deltaTime) > 0) + if ((_screenShake -= Time.deltaTime) > 0) { shakeOffset = new Vector3((Random.value - 0.5f) * _screenShake, (Random.value - 0.5f) * _screenShake); + } SetPosition(newPosition + shakeOffset); } @@ -100,12 +117,14 @@ public void Recenter(Vector2 pos) { } private void SetPosition(Vector3 position) { - if (!IsControllingCamera) + if (!IsControllingCamera) { return; + } TargetCamera.transform.position = position; - if (BackgroundLoop.Instance) + if (BackgroundLoop.Instance) { BackgroundLoop.Instance.Reposition(); + } secondaryPositioners.RemoveAll(scp => !scp); secondaryPositioners.ForEach(scp => scp.UpdatePosition()); @@ -115,21 +134,25 @@ private Vector3 CalculateNewPosition(float delta) { float minY = GameManager.Instance.cameraMinY, heightY = GameManager.Instance.cameraHeightY; float minX = GameManager.Instance.cameraMinX, maxX = GameManager.Instance.cameraMaxX; - if (!controller.IsDead && !controller.IsRespawning) + if (!controller.IsDead && !controller.IsRespawning) { PlayerPos = AntiJitter(controller.transform.position); + } float vOrtho = TargetCamera.orthographicSize; float xOrtho = vOrtho * TargetCamera.aspect; Vector3 newCameraPosition = CurrentPosition; // Lagging camera movements - if (controller.IsOnGround) + if (controller.IsOnGround) { LastFloorHeight = PlayerPos.y; + } + bool validFloor = controller.IsOnGround || LastFloorHeight < PlayerPos.y; // Floor height - if (validFloor) + if (validFloor) { newCameraPosition.y = Mathf.Max(newCameraPosition.y, LastFloorHeight + floorOffset); + } // Smoothing Vector3 smoothDamp = SmoothDampVel; @@ -170,13 +193,15 @@ private Vector3 CalculateNewPosition(float delta) { right = newCameraPosition.x > PlayerPos.x; } - if (xDifference > 0.25f) + if (xDifference > 0.25f) { newCameraPosition.x += (0.25f - xDifference - 0.01f) * (right ? 1 : -1); + } // Clamping to within level bounds float maxY = heightY == 0 ? (minY + vOrtho) : (minY + heightY - vOrtho); - if (newCameraPosition.y > maxY) + if (newCameraPosition.y > maxY) { SmoothDampVel = Vector3.zero; + } newCameraPosition.x = Mathf.Clamp(newCameraPosition.x, minX + xOrtho, maxX - xOrtho); newCameraPosition.y = Mathf.Clamp(newCameraPosition.y, minY + vOrtho, maxY); @@ -197,8 +222,9 @@ private static Vector2 AntiJitter(Vector3 vec) { #if UNITY_EDITOR private static Vector3 HalfRight = Vector3.right * 0.5f; public void OnDrawGizmos() { - if (!controller || !controller.Object) + if (!controller || !controller.Object) { return; + } Gizmos.color = Color.red; Gizmos.DrawWireCube(new(PlayerPos.x, LastFloorHeight), HalfRight); diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index 4bfea5c514..d904920cb0 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -217,6 +217,10 @@ public override void Spawned() { public override void Render() { base.Render(); + if (!SessionData.Instance) { + return; + } + if (GameState == Enums.GameState.Playing) { HandleMusic(); } @@ -355,7 +359,7 @@ public void PauseEndMatch() { public void PauseQuitGame() { sfx.PlayOneShot(Enums.Sounds.UI_Decide); - _ = NetworkHandler.ConnectToRegion(); + NetworkHandler.Instance.runner.Shutdown(false, ShutdownReason.Ok); } public void PauseOpenOptions() { @@ -681,7 +685,6 @@ private IEnumerator EndGame(int winningTeam) { GameState = Enums.GameState.Ended; IsMusicEnabled = false; - PlaySounds = false; endSoundPlayed = true; // End "WaitForGameEnd" objects @@ -694,6 +697,8 @@ private IEnumerator EndGame(int winningTeam) { yield return new WaitForSecondsRealtime(1); + PlaySounds = false; + TranslationManager tm = GlobalController.Instance.translationManager; bool draw = winningTeam == -1; string resultText; @@ -784,6 +789,10 @@ private IEnumerator EndGame(int winningTeam) { } private void HandleMusic() { + if (!SessionData.Instance) { + return; + } + bool invincible = false; bool mega = false; bool speedup = false; @@ -879,13 +888,17 @@ private bool AttemptSpawnBigStar() { } private void ResetAvailableStarSpawns() { - AvailableStarSpawns.RawSet(unchecked((ulong) ~0L)); + AvailableStarSpawns.RawSet(unchecked(~0UL)); } /// /// Sets the game timestamps for Discord RPC /// - private void SetGameTimestamps() { + public void SetGameTimestamps() { + if (!SessionData.Instance) { + return; + } + double now = DateTime.UtcNow.Subtract(DateTime.UnixEpoch).TotalSeconds; float secondsSinceStart = Runner.SimulationTime - GameStartTime; gameStartTimestamp = now - secondsSinceStart; diff --git a/Assets/Scripts/Networking/AuthenticationHandler.cs b/Assets/Scripts/Networking/AuthenticationHandler.cs index 8bf4fdd6ac..1e98668af2 100644 --- a/Assets/Scripts/Networking/AuthenticationHandler.cs +++ b/Assets/Scripts/Networking/AuthenticationHandler.cs @@ -18,27 +18,27 @@ public async static Task Authenticate(string userid, strin IsAuthenticating = true; - string request = URL + "?"; + string requestUrl = URL + "?"; if (userid != null) { - request += "&userid=" + userid; + requestUrl += "&userid=" + userid; } if (token != null) { - request += "&token=" + token; + requestUrl += "&token=" + token; } byte args = 0; Utils.BitSet(ref args, 0, !Settings.Instance.generalUseNicknameColor); - request += "&args=" + args; + requestUrl += "&args=" + args; - UnityWebRequest client = UnityWebRequest.Get(request); + UnityWebRequest webRequest = UnityWebRequest.Get(requestUrl); + webRequest.certificateHandler = new MvLCertificateHandler(); + webRequest.disposeCertificateHandlerOnDispose = true; + webRequest.disposeDownloadHandlerOnDispose = true; + webRequest.disposeUploadHandlerOnDispose = true; + webRequest.timeout = 10; - client.certificateHandler = new MvLCertificateHandler(); - client.disposeCertificateHandlerOnDispose = true; - client.disposeDownloadHandlerOnDispose = true; - client.disposeUploadHandlerOnDispose = true; + await webRequest.SendWebRequest(); - await client.SendWebRequest(); - - if (client.result != UnityWebRequest.Result.Success) { + if (webRequest.result != UnityWebRequest.Result.Success) { IsAuthenticating = false; return null; } @@ -47,9 +47,9 @@ public async static Task Authenticate(string userid, strin AuthType = CustomAuthenticationType.Custom, UserId = userid, }; - values.AddAuthParameter("data", client.downloadHandler.text.Trim().Replace("\"", "")); + values.AddAuthParameter("data", webRequest.downloadHandler.text.Trim().Replace("\"", "")); - client.Dispose(); + webRequest.Dispose(); IsAuthenticating = false; return values; diff --git a/Assets/Scripts/Networking/Fusion/NetworkHandler.cs b/Assets/Scripts/Networking/Fusion/NetworkHandler.cs index 9586020713..f1f6c6c5e6 100644 --- a/Assets/Scripts/Networking/Fusion/NetworkHandler.cs +++ b/Assets/Scripts/Networking/Fusion/NetworkHandler.cs @@ -156,7 +156,7 @@ void INetworkRunnerCallbacks.OnDisconnectedFromServer(NetworkRunner runner, NetD ReturnToMainMenu(() => { OnDisconnectedFromServer?.Invoke(runner, reason); - RecreateInstance(); + //RecreateInstance(); }); } @@ -304,8 +304,9 @@ void INetworkRunnerCallbacks.OnPlayerLeft(NetworkRunner runner, PlayerRef player if (data) { Debug.Log($"[Network] {data.GetNickname()} ({data.GetUserIdString()}) left the room"); ChatManager.Instance.AddSystemMessage("ui.inroom.chat.player.quit", "playername", data.GetNickname()); - if (Runner.IsServer) { + if (runner.IsServer) { runner.Despawn(data.Object); + runner.PushHostMigrationSnapshot(); } playerDatas.Remove(data); } @@ -420,11 +421,6 @@ public static async Task ConnectToRegion(string region = "") { // Exit if we're already in a room if (Runner && (Runner.SessionInfo.IsValid || Runner.LobbyInfo.IsValid) && !Runner.IsShutdown) { await Runner.Shutdown(); - } else { - if (Runner) { - DestroyImmediate(Runner); - } - Instance.runner = Instance.gameObject.AddComponent(); } if (string.IsNullOrEmpty(region)) { @@ -650,6 +646,17 @@ private static void HostMigrationResume(NetworkRunner runner) { continue; } + // Don't respawn invalid PlayerDatas + if (pd.UserId == default) { + continue; + } + + // Don't respawn duplicate PlayerDatas (idk why they even exist???) + // Like we despawn them on player leave and they just pop back up... + if (Instance.playerDatas.Any(other => other.UserId == pd.UserId)) { + continue; + } + // Oh, and immediately assign our own. We're greedy :) // (not doing it breaks stuff cuz EnterRoom is called first...) PlayerRef? player = null; diff --git a/Assets/Scripts/Networking/Fusion/SessionData.cs b/Assets/Scripts/Networking/Fusion/SessionData.cs index 219bf918fc..c11de8b3a0 100644 --- a/Assets/Scripts/Networking/Fusion/SessionData.cs +++ b/Assets/Scripts/Networking/Fusion/SessionData.cs @@ -8,6 +8,7 @@ using NSMB.Extensions; using NSMB.UI.MainMenu; using NSMB.Utils; +using NSMB.Game; public class SessionData : NetworkBehaviour { @@ -102,6 +103,10 @@ public override void Spawned() { if (MainMenuManager.Instance) { MainMenuManager.Instance.roomSettingsCallbacks.UpdateAllSettings(Instance, false); } + + if (GameManager.Instance) { + GameManager.Instance.SetGameTimestamps(); + } } public override void Render() { diff --git a/Assets/Scripts/TileManager.cs b/Assets/Scripts/TileManager.cs index 16f5171347..94ff120426 100644 --- a/Assets/Scripts/TileManager.cs +++ b/Assets/Scripts/TileManager.cs @@ -40,13 +40,15 @@ public override void Spawned() { } public void AddChunk(TilemapChunk chunk) { - if (chunks.Contains(chunk)) + if (chunks.Contains(chunk)) { return; + } chunks.Add(chunk); chunks.Sort((chunkA, chunkB) => { - if (chunkA.ChunkY == chunkB.ChunkY) + if (chunkA.ChunkY == chunkB.ChunkY) { return chunkA.ChunkX - chunkB.ChunkX; + } return chunkA.ChunkY - chunkB.ChunkY; }); @@ -55,11 +57,13 @@ public void AddChunk(TilemapChunk chunk) { public void ResetMap() { GameManager.Instance.BigStarRespawnTimer = TickTimer.CreateFromSeconds(Runner, 10.4f - GameManager.Instance.RealPlayerCount * 0.2f); - foreach (TilemapChunk chunk in chunks) + foreach (TilemapChunk chunk in chunks) { chunk.ResetMap(); + } - foreach (FloatingCoin coin in GameManager.coins) + foreach (FloatingCoin coin in GameManager.coins) { coin.ResetCoin(); + } foreach (KillableEntity enemy in GameManager.enemies) { if (enemy.checkForNearbyPlayersWhenRespawning) { @@ -75,8 +79,9 @@ public void ResetMap() { public TileBase GetTile(int x, int y) { TilemapChunk chunk = GetChunkAtTileLocation(x, y); - if (!chunk) + if (!chunk) { return GameManager.tilemap.GetTile(new(x, y)); + } ushort tileId = chunk.GetTile(TileLocationToChunkIndex(x, y)); return GameManager.GetTileInstanceFromTileId(tileId); @@ -111,8 +116,9 @@ public void SetTilesBlock(Vector2Int loc, Vector2Int dimensions, ushort[] tileId public void SetTilesBlock(int x, int y, int width, int height, TileBase[] tiles) { ushort[] tileIds = new ushort[tiles.Length]; - for (int i = 0; i < tiles.Length; i++) + for (int i = 0; i < tiles.Length; i++) { tileIds[i] = GameManager.GetTileIdFromTileInstance(tiles[i]); + } SetTilesBlock(x, y, width, height, tileIds); } @@ -138,12 +144,14 @@ public void SetTile(int x, int y, TileBase tile) { } public void SetTile(int x, int y, ushort tileId) { - if (tileId > GameManager.sceneTiles.Length) + if (tileId > GameManager.sceneTiles.Length) { return; + } TilemapChunk chunk = GetChunkAtTileLocation(x, y); - if (!chunk) + if (!chunk) { return; + } chunk.SetTile(TileLocationToChunkIndex(x, y), tileId); } @@ -158,17 +166,21 @@ private TilemapChunk GetChunkAtTileLocation(int x, int y) { int chunkX = (x - WorldOriginX) >> 4; int chunkY = (y - WorldOriginY) >> 4; - if (chunkX < 0 || chunkX >= ChunksX || chunkY < 0 || chunkY >= ChunksY) + int index = chunkX + (chunkY * ChunksX); + + if (chunkX < 0 || chunkX >= ChunksX || chunkY < 0 || chunkY >= ChunksY || index >= chunks.Count) { return null; + } - return chunks[chunkX + (chunkY * ChunksX)]; + return chunks[index]; } #if UNITY_EDITOR private static Vector3 ChunkSize = new(8, 8, 0); public void OnDrawGizmos() { - if (!GameManager) + if (!GameManager) { return; + } Gizmos.color = Color.black; for (int x = 0; x < ChunksX; x++) { diff --git a/Assets/Scripts/UI/Menu/MainMenuManager.cs b/Assets/Scripts/UI/Menu/MainMenuManager.cs index 07804327fa..d08c021642 100644 --- a/Assets/Scripts/UI/Menu/MainMenuManager.cs +++ b/Assets/Scripts/UI/Menu/MainMenuManager.cs @@ -332,8 +332,7 @@ public void OpenRoomListMenu() { Reconnect(); } - //roomManager.RefreshRooms(); - + roomManager.RefreshRooms(); EventSystem.current.SetSelectedGameObject(lobbySelected); } @@ -432,12 +431,12 @@ public void ConnectToDropdownRegion() { _ = NetworkHandler.ConnectToRegion(targetRegion); } - public async void Reconnect() { + public void Reconnect() { Debug.Log("[Network] (Re)connecting to the master server"); - await NetworkHandler.ConnectToSameRegion(); + _ = NetworkHandler.ConnectToSameRegion(); } - public async void QuitRoom() { + public void QuitRoom() { OpenRoomListMenu(); if (playerPingUpdateCoroutine != null) { @@ -445,7 +444,7 @@ public async void QuitRoom() { playerPingUpdateCoroutine = null; } - await NetworkHandler.ConnectToRegion(); + _ = NetworkHandler.ConnectToRegion(); GlobalController.Instance.discordController.UpdateActivity(); } diff --git a/Assets/Scripts/UI/Menu/RoomListManager.cs b/Assets/Scripts/UI/Menu/RoomListManager.cs index 8139dde639..ff0b32c7b8 100644 --- a/Assets/Scripts/UI/Menu/RoomListManager.cs +++ b/Assets/Scripts/UI/Menu/RoomListManager.cs @@ -14,13 +14,15 @@ public class RoomListManager : MonoBehaviour { public RoomIcon SelectedRoom { get => _selectedRoom; private set { - if (_selectedRoom != null) + if (_selectedRoom != null) { _selectedRoom.Unselect(); + } _selectedRoom = value; - if (_selectedRoom != null) + if (_selectedRoom != null) { _selectedRoom.Select(); + } } } @@ -56,8 +58,9 @@ public void SelectRoom(RoomIcon room) { } public async void JoinSelectedRoom() { - if (!SelectedRoom) + if (!SelectedRoom) { return; + } await NetworkHandler.JoinRoom(SelectedRoom.session.Name); } @@ -67,21 +70,24 @@ public void OpenPrivateRoomPrompt() { } public void RefreshRooms() { - foreach (RoomIcon room in rooms.Values) + foreach (RoomIcon room in rooms.Values) { room.UpdateUI(room.session); + } } public void RemoveRoom(RoomIcon icon) { Destroy(icon.gameObject); rooms.Remove(icon.session.Name); - if (SelectedRoom == icon) + if (SelectedRoom == icon) { SelectedRoom = null; + } } public void ClearRooms() { - foreach (RoomIcon room in rooms.Values) + foreach (RoomIcon room in rooms.Values) { Destroy(room.gameObject); + } rooms.Clear(); SelectedRoom = null; @@ -136,8 +142,9 @@ private void OnSessionListUpdated(NetworkRunner runner, List sessio } foreach (string key in invalidRooms) { - if (!rooms.ContainsKey(key)) + if (!rooms.ContainsKey(key)) { continue; + } Destroy(rooms[key].gameObject); rooms.Remove(key); diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index eb67d04276..e94a506ead 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -134,7 +134,8 @@ PlayerSettings: vulkanEnableCommandBufferRecycling: 1 loadStoreDebugModeEnabled: 0 bundleVersion: 1.8.0.0 - preloadedAssets: [] + preloadedAssets: + - {fileID: 11400000, guid: 49335f30d253220488d2d332ade6e901, type: 2} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1