From 830380ed2cd3e5a168c04e2df3167e22fda1f7fa Mon Sep 17 00:00:00 2001 From: Tore Bergebakken Date: Fri, 12 Jul 2024 12:24:44 +0200 Subject: [PATCH 1/6] Refactor player initialization --- .../Control&Input/Peer2PeerTransport.cs | 224 ++---------------- Assets/Scripts/Gamestate/PlayerFactory.cs | 164 ++++++++++++- Assets/Scripts/Gamestate/PlayerIdentity.cs | 4 +- .../PlayerSelect/PlayerSelectManager.cs | 2 +- 4 files changed, 172 insertions(+), 222 deletions(-) diff --git a/Assets/Scripts/Control&Input/Peer2PeerTransport.cs b/Assets/Scripts/Control&Input/Peer2PeerTransport.cs index 2b353f555..985786df0 100644 --- a/Assets/Scripts/Control&Input/Peer2PeerTransport.cs +++ b/Assets/Scripts/Control&Input/Peer2PeerTransport.cs @@ -27,6 +27,14 @@ public struct PlayerDetails public string body; public string barrel; public string extension; + + public string PlayerNameWithIndex() + { + var mySteamID = steamID; + if (Peer2PeerTransport.PlayerDetails.Count(p => p.steamID == mySteamID) > 1) + return $"{name} {localInputID + 1}"; + return name; + } } public struct PlayerConnectedMessage : NetworkMessage @@ -135,8 +143,6 @@ public class Peer2PeerTransport : NetworkManager private const int AIFPSPlayerPrefabIndex = 2; private const int TrainingPlayerPrefabIndex = 4; - private const int NetworkPlayerLayer = 3; - private PlayerFactory playerFactory; private static Transform[] spawnPoints; private static Stack spawnPointStack; @@ -701,8 +707,8 @@ private IEnumerator SendSpawnRequestsAfterSceneLoad(string originalSceneName) #endregion - #region Spawn FPS players + #region Spawn players private void SpawnPlayer(NetworkConnectionToClient connection, SpawnPlayerMessage message, int prefabIndexOffset = 0) { @@ -754,148 +760,9 @@ private void OnSpawnFPSPlayer(NetworkConnectionToClient connection, SpawnPlayerM private void InitializeFPSPlayer(InitializePlayerMessage message) { - StartCoroutine(WaitAndInitializeFPSPlayer(message)); - } - - // TODO move this somewhere else? - public static string PlayerNameWithIndex(PlayerDetails playerDetails) - { - var playerName = playerDetails.name; - if (players.Values.Count(p => p.steamID == playerDetails.steamID) > 1) - playerName = $"{playerName} {playerDetails.localInputID + 1}"; - return playerName; - } - - private void UpdateIdentityFromDetails(PlayerIdentity identity, PlayerDetails playerDetails) - { - identity.UpdateFromDetails(playerDetails, PlayerNameWithIndex(playerDetails)); - } - - private IEnumerator WaitAndInitializeFPSPlayer(InitializePlayerMessage message) - { - // Wait until player object is spawned - PlayerManager player = null; - while (player == null) - { - player = FindObjectsOfType() - .FirstOrDefault(p => p.id == message.id); - yield return null; - } - - if (!player) - { - Debug.LogError($"Could not find player object for id {message.id}"); - yield break; - } - - if (!players.TryGetValue(message.id, out var playerDetails)) - { - Debug.LogError($"Could not find player details for id {message.id}"); - yield break; - } - - var playerManager = player.GetComponent(); - - player.transform.position = message.position; - player.transform.rotation = message.rotation; - - var cameraOffset = player.transform.Find("CameraOffset"); - playerManager.GetComponent().enabled = true; - - if (playerDetails.type is PlayerType.Local) - { - Debug.Log($"Spawning local player {playerDetails.id}"); - var input = PlayerInputManagerController.Singleton.LocalPlayerInputs[playerDetails.localInputID]; - - // Reset camera transform (it may have been kerfluffled by the spectator cam thingy) - input.transform.localPosition = Vector3.zero; - input.transform.localRotation = Quaternion.identity; - input.PlayerCamera.transform.localRotation = Quaternion.identity; - input.PlayerCamera.transform.localPosition = Vector3.zero; - - // Make playerInput child of player it's attached to - input.transform.parent = player.transform; - // Set received playerInput (and most importantly its camera) at an offset from player's position - input.transform.localPosition = cameraOffset.localPosition; - input.transform.rotation = player.transform.rotation; - - // Enable Camera - input.PlayerCamera.enabled = true; - input.PlayerCamera.orthographic = false; - - playerManager.HUDController.gameObject.SetActive(true); - var movement = player.GetComponent(); - - // The identity sits on the input in this case, so edit that - var identity = input.GetComponent(); - UpdateIdentityFromDetails(identity, playerDetails); - - // Update player's movement script with which playerInput it should attach listeners to - playerManager.SetPlayerInput(input); - var gunHolder = input.transform.GetChild(0); - playerManager.SetGun(gunHolder); - - // Set unique layer for player - playerManager.SetLayer(input.playerInput.playerIndex); - movement.SetInitialRotation(message.rotation.eulerAngles.y * Mathf.Deg2Rad); - - if (GunFactory.TryGetGunAchievement(playerManager.identity.Body, playerManager.identity.Barrel, - playerManager.identity.Extension, out var achievement)) - SteamManager.Singleton.UnlockAchievement(achievement); - } - else if (playerDetails.type is PlayerType.AI && NetworkServer.active) - { - Debug.Log($"Spawning AI player {playerDetails.id}"); - AIManager manager = player.GetComponent(); - manager.SetLayer(NetworkPlayerLayer); - UpdateIdentityFromDetails(playerManager.identity, playerDetails); - manager.SetIdentity(playerManager.identity); - manager.GetComponent().SetInitialRotation(message.rotation.eulerAngles.y * Mathf.Deg2Rad); - } - else - { - Debug.Log($"Spawning network player {playerDetails.id}"); - - UpdateIdentityFromDetails(playerManager.identity, playerDetails); - - // TODO do some other version of disabling HUD completely - Destroy(playerManager.HUDController); - - // Disable physics - playerManager.GetComponent().isKinematic = true; - - // Create display gun structure - var gunHolderParent = new GameObject("DisplayGunParent").transform; - gunHolderParent.parent = player.transform; - gunHolderParent.position = cameraOffset.position; - gunHolderParent.rotation = player.transform.rotation; - var gunHolder = new GameObject("DisplayGunHolder").transform; - gunHolder.parent = gunHolderParent.transform; - gunHolder.localPosition = Vector3.zero; - gunHolder.localRotation = Quaternion.identity; - playerManager.SetLayer(NetworkPlayerLayer); - // Can't initialize quite like the AIs because of where the GunController network behaviour is located :( - playerManager.SetGun(gunHolder); - } - - playerManager.ApplyIdentity(); - - // This ensures that behaviours on the gun have identities. - // SHOULD be safe to initialize them here as this is at roughly the same point on all clients - player.GetComponent().InitializeNetworkBehaviours(); - - if (MatchController.Singleton) - { - MatchController.Singleton.RegisterPlayer(playerManager); - } - - playerInstances[player.id] = player; + StartCoroutine(WaitAndInitializePlayer(message, false)); } - #endregion - - #region Bidding spawning - private void OnSpawnBiddingPlayer(NetworkConnectionToClient connection, SpawnPlayerMessage message) { SpawnPlayer(connection, message, BiddingPlayerPrefabIndexOffset); @@ -903,12 +770,12 @@ private void OnSpawnBiddingPlayer(NetworkConnectionToClient connection, SpawnPla private void InitializeBiddingPlayer(InitializePlayerMessage message) { - StartCoroutine(WaitAndInitializeBiddingPlayer(message)); + StartCoroutine(WaitAndInitializePlayer(message, true)); } - private IEnumerator WaitAndInitializeBiddingPlayer(InitializePlayerMessage message) + private IEnumerator WaitAndInitializePlayer(InitializePlayerMessage message, bool isBidding = false) { - // Wait until players must've been spawned + // Wait until player object is spawned PlayerManager player = null; while (player == null) { @@ -929,70 +796,7 @@ private IEnumerator WaitAndInitializeBiddingPlayer(InitializePlayerMessage messa yield break; } - var playerManager = player.GetComponent(); - - player.transform.position = message.position; - player.transform.rotation = message.rotation; - - var cameraOffset = player.transform.Find("CameraOffset"); - playerManager.GetComponent().enabled = true; - - if (playerDetails.type is PlayerType.Local) - { - Debug.Log($"Spawning local player {playerDetails.id}"); - var input = PlayerInputManagerController.Singleton.LocalPlayerInputs[playerDetails.localInputID]; - - // Reset camera transform (ensuring we don't mess up in weapon building) - input.transform.localPosition = Vector3.zero; - input.transform.localRotation = Quaternion.identity; - input.PlayerCamera.transform.localRotation = Quaternion.identity; - input.PlayerCamera.transform.localPosition = Vector3.zero; - - // Make playerInput child of player it's attached to - input.transform.parent = player.transform; - // Set received playerInput (and most importantly its camera) at an offset from player's position - input.transform.localPosition = cameraOffset.localPosition; - input.transform.rotation = player.transform.rotation; - - // Disable Camera - input.PlayerCamera.enabled = false; - - // Update player's movement script with which playerInput it should attach listeners to - playerManager.SetPlayerInput(input); - player.GetComponent().enabled = false; - - // The identity sits on the input in this case, so edit that - var identity = input.GetComponent(); - UpdateIdentityFromDetails(identity, playerDetails); - } - else if (playerDetails.type is PlayerType.AI && NetworkServer.active) - { - Debug.Log($"Spawning AI player {playerDetails.id}"); - AIManager manager = player.GetComponent(); - manager.SetLayer(NetworkPlayerLayer); - UpdateIdentityFromDetails(playerManager.identity, playerDetails); - manager.SetIdentity(manager.identity); - } - else - { - Debug.Log($"Spawning network player {playerDetails.id}"); - - UpdateIdentityFromDetails(playerManager.identity, playerDetails); - - // Disable physics - playerManager.GetComponent().isKinematic = true; - } - - playerManager.ApplyIdentity(); - - // This ensures that behaviours on the gun have identities. - // SHOULD be safe to initialize them here as this is at roughly the same point on all clients - player.GetComponent().InitializeNetworkBehaviours(); - - if (MatchController.Singleton) - { - MatchController.Singleton.RegisterPlayer(playerManager); - } + PlayerFactory.InitializePlayer(message, player, playerDetails, isBidding); playerInstances[player.id] = player; } diff --git a/Assets/Scripts/Gamestate/PlayerFactory.cs b/Assets/Scripts/Gamestate/PlayerFactory.cs index 0b2c57d92..a9453ab4c 100644 --- a/Assets/Scripts/Gamestate/PlayerFactory.cs +++ b/Assets/Scripts/Gamestate/PlayerFactory.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using UnityEngine; using CollectionExtensions; +using Mirror; public class PlayerFactory : MonoBehaviour { @@ -10,9 +11,12 @@ public class PlayerFactory : MonoBehaviour private Transform[] spawnPoints; [SerializeField] private GameObject playerSelectItemPrefab; + private float spawnInterval = 0f; private PlayerInputManagerController playerInputManagerController; + private const int NetworkPlayerLayer = 3; + private void Awake() { if (PlayerInputManagerController.Singleton == null) @@ -29,14 +33,15 @@ private void Awake() playerInputManagerController.PlayerInputManager.splitScreen = true; } + #region Weapon construction spawning + public void InstantiatePlayerSelectItems() { playerInputManagerController.ChangeInputMaps("Menu"); InstantiateInputsOnSpawnpoints(InstantiateItemSelectPlayer); } - // TODO remove this from its mortal coil, we don't really use PlayerFactory anymore :) - private List InstantiateInputsOnSpawnpoints(Func instantiate, Func instantiateAI = null, int aiPlayerCount = 0) + private List InstantiateInputsOnSpawnpoints(Func instantiate) { var shuffledSpawnPoints = spawnPoints.ShuffledCopy(); @@ -45,13 +50,6 @@ private List InstantiateInputsOnSpawnpoints(Func().SpawnItems(inputManager)); return null; } + + #endregion + + + #region Initialization + + public static void InitializePlayer(InitializePlayerMessage message, PlayerManager player, PlayerDetails playerDetails, bool isBidding = false) + { + player.GetComponent().enabled = true; + + player.transform.position = message.position; + player.transform.rotation = message.rotation; + + Debug.Log($"Spawning {playerDetails.type} player {playerDetails.id}"); + + if (isBidding) + InitializeBiddingPlayer(message, player, playerDetails); + else + InitializeFPSPlayer(message, player, playerDetails); + + player.ApplyIdentity(); + + // This ensures that behaviours on the gun have identities. + // SHOULD be safe to initialize them here as this is at roughly the same point on all clients + player.GetComponent().InitializeNetworkBehaviours(); + + if (MatchController.Singleton) + { + MatchController.Singleton.RegisterPlayer(player); + } + } + + private static void InitializeFPSPlayer(InitializePlayerMessage message, PlayerManager player, PlayerDetails playerDetails) + { + var cameraOffset = player.transform.Find("CameraOffset"); + if (playerDetails.type is PlayerType.Local) + { + var input = SetupLocalPlayerInput(player, playerDetails); + + // Enable Camera + input.PlayerCamera.enabled = true; + input.PlayerCamera.orthographic = false; + + player.HUDController.gameObject.SetActive(true); + var movement = player.GetComponent(); + + // Update player's movement script with which playerInput it should attach listeners to + var gunHolder = input.transform.GetChild(0); + player.SetGun(gunHolder); + + // Set unique layer for player + player.SetLayer(input.playerInput.playerIndex); + movement.SetInitialRotation(message.rotation.eulerAngles.y * Mathf.Deg2Rad); + + if (GunFactory.TryGetGunAchievement(player.identity.Body, player.identity.Barrel, + player.identity.Extension, out var achievement)) + SteamManager.Singleton.UnlockAchievement(achievement); + } + else if (playerDetails.type is PlayerType.AI && NetworkServer.active) + { + InitializeAIPlayer(message, player, playerDetails); + } + else + { + player.identity.UpdateFromDetails(playerDetails); + + // TODO do some other version of disabling HUD completely + Destroy(player.HUDController); + + // Disable physics + player.GetComponent().isKinematic = true; + + // Create display gun structure + var gunHolderParent = new GameObject("DisplayGunParent").transform; + gunHolderParent.parent = player.transform; + gunHolderParent.position = cameraOffset.position; + gunHolderParent.rotation = player.transform.rotation; + var gunHolder = new GameObject("DisplayGunHolder").transform; + gunHolder.parent = gunHolderParent.transform; + gunHolder.localPosition = Vector3.zero; + gunHolder.localRotation = Quaternion.identity; + player.SetLayer(NetworkPlayerLayer); + // Can't initialize quite like the AIs because of where the GunController network behaviour is located :( + player.SetGun(gunHolder); + } + } + + private static void InitializeBiddingPlayer(InitializePlayerMessage message, PlayerManager player, PlayerDetails playerDetails) + { + if (playerDetails.type is PlayerType.Local) + { + var input = SetupLocalPlayerInput(player, playerDetails); + + // Disable camera + input.PlayerCamera.enabled = false; + + // Disable health + player.GetComponent().enabled = false; + } + else if (playerDetails.type is PlayerType.AI && NetworkServer.active) + { + InitializeAIPlayer(message, player, playerDetails); + } + else + { + player.identity.UpdateFromDetails(playerDetails); + + // Disable physics + player.GetComponent().isKinematic = true; + } + } + + private static InputManager SetupLocalPlayerInput(PlayerManager player, PlayerDetails playerDetails) + { + var input = PlayerInputManagerController.Singleton.LocalPlayerInputs[playerDetails.localInputID]; + var cameraOffset = player.transform.Find("CameraOffset"); + + // Reset camera transform (it may have been kerfluffled by the spectator cam thingy) + input.transform.localPosition = Vector3.zero; + input.transform.localRotation = Quaternion.identity; + input.PlayerCamera.transform.localRotation = Quaternion.identity; + input.PlayerCamera.transform.localPosition = Vector3.zero; + + // Make playerInput child of player it's attached to + input.transform.parent = player.transform; + // Set received playerInput (and most importantly its camera) at an offset from player's position + input.transform.localPosition = cameraOffset.localPosition; + input.transform.rotation = player.transform.rotation; + + // The identity sits on the input in this case, so edit that + var identity = input.GetComponent(); + identity.UpdateFromDetails(playerDetails); + + player.SetPlayerInput(input); + + return input; + } + + private static void InitializeAIPlayer(InitializePlayerMessage message, PlayerManager player, PlayerDetails playerDetails) + { + AIManager manager = player.GetComponent(); + manager.SetLayer(NetworkPlayerLayer); + player.identity.UpdateFromDetails(playerDetails); + manager.SetIdentity(player.identity); + manager.GetComponent().SetInitialRotation(message.rotation.eulerAngles.y * Mathf.Deg2Rad); + } + + #endregion } diff --git a/Assets/Scripts/Gamestate/PlayerIdentity.cs b/Assets/Scripts/Gamestate/PlayerIdentity.cs index 74ac8ec12..f8790bb66 100644 --- a/Assets/Scripts/Gamestate/PlayerIdentity.cs +++ b/Assets/Scripts/Gamestate/PlayerIdentity.cs @@ -199,11 +199,11 @@ public void SetLoadout(Item body, Item barrel, Item extension) this.extension = extension; } - public void UpdateFromDetails(PlayerDetails playerDetails, string name) + public void UpdateFromDetails(PlayerDetails playerDetails) { id = playerDetails.id; - playerName = name; + playerName = playerDetails.PlayerNameWithIndex(); color = playerDetails.color; Chips = playerDetails.chips; diff --git a/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs b/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs index ea44a34ec..c2f7e91de 100644 --- a/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs +++ b/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs @@ -95,7 +95,7 @@ public void SetupPlayerModel(PlayerDetails player, int index) playerModels[index].GetComponentInChildren().material.color = player.color; // Set player model color playerModels[index].SetActive(true); // Show corresponding player model playerModels[index].transform.LookAt(new Vector3(playerSelectCam.transform.position.x, playerModels[index].transform.position.y, playerSelectCam.transform.position.z)); // Orient player model to look at camera - nameTags[index].text = Peer2PeerTransport.PlayerNameWithIndex(player); + nameTags[index].text = player.PlayerNameWithIndex(); nameTags[index].enabled = true; joinText[index].enabled = false; } From 4eff6519764f6987d517abac38fa979b94a53e74 Mon Sep 17 00:00:00 2001 From: Tore Bergebakken Date: Fri, 12 Jul 2024 13:19:31 +0200 Subject: [PATCH 2/6] Fix orbit camera not tracking after outcome is decided --- Assets/Scripts/Control&Input/OrbitCamera.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Scripts/Control&Input/OrbitCamera.cs b/Assets/Scripts/Control&Input/OrbitCamera.cs index bcf2bfff1..1a2301c05 100644 --- a/Assets/Scripts/Control&Input/OrbitCamera.cs +++ b/Assets/Scripts/Control&Input/OrbitCamera.cs @@ -97,7 +97,7 @@ private void SwitchTarget(InputAction.CallbackContext ctx) private void StartTracking(PlayerManager nextTarget) { - if (!cameraTransform || !InputManager || !MatchController.Singleton.IsRoundInProgress) + if (!cameraTransform || !InputManager) return; isTracking = true; camera.enabled = true; From e158d98d4860ba22b3116b482f3bd9080a031fdf Mon Sep 17 00:00:00 2001 From: Tore Bergebakken Date: Fri, 12 Jul 2024 13:41:24 +0200 Subject: [PATCH 3/6] Fix annoying navmesh agent exceptions --- Assets/Scripts/Gamestate/AIManager.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Assets/Scripts/Gamestate/AIManager.cs b/Assets/Scripts/Gamestate/AIManager.cs index 9dbaaf929..aa958bc50 100644 --- a/Assets/Scripts/Gamestate/AIManager.cs +++ b/Assets/Scripts/Gamestate/AIManager.cs @@ -249,7 +249,8 @@ private void FindPlayers() agent.stoppingDistance = ShootingTarget ? shootingStoppingDistance : itemStoppingDistance; try { - agent.SetDestination(DestinationTarget.position); + if (agent.enabled) + agent.SetDestination(DestinationTarget.position); } catch { @@ -287,7 +288,9 @@ IEnumerator AnimateJumpCurve(float duration) normalizedTime += Time.deltaTime / duration; yield return null; } - agent.CompleteOffMeshLink(); + // TODO why is the agent sometimes not enabled here? + if (agent.enabled) + agent.CompleteOffMeshLink(); onLinkEnd?.Invoke(); } From c630a1776e9cc23ba8f69704323bf99d0adb893d Mon Sep 17 00:00:00 2001 From: Tore Bergebakken Date: Fri, 12 Jul 2024 13:56:02 +0200 Subject: [PATCH 4/6] wip respawning --- Assets/Scripts/Control&Input/OrbitCamera.cs | 30 +++++++++++++--- Assets/Scripts/Gamestate/PlayerManager.cs | 39 +++++++++++++++++++++ Assets/Scripts/RagdollController.cs | 35 ++++++++++++------ 3 files changed, 89 insertions(+), 15 deletions(-) diff --git a/Assets/Scripts/Control&Input/OrbitCamera.cs b/Assets/Scripts/Control&Input/OrbitCamera.cs index 1a2301c05..bbb5d4bb0 100644 --- a/Assets/Scripts/Control&Input/OrbitCamera.cs +++ b/Assets/Scripts/Control&Input/OrbitCamera.cs @@ -39,6 +39,8 @@ public Camera Camera private int targetIndex = 0; private PlayerManager player; + private Coroutine trackingRoutine; + private void Start() { player = GetComponent(); @@ -62,17 +64,27 @@ public void Activate() if (!MatchController.Singleton.IsRoundInProgress) return; otherPlayers = MatchController.Singleton.Players.Where(p => p != GetComponent()).ToArray(); - StartCoroutine(WaitAndStopTrackingRagdoll()); + trackingRoutine = StartCoroutine(WaitAndStopTrackingRagdoll()); + } + + public void Deactivate() + { + StopTracking(); + StopCoroutine(trackingRoutine); } private IEnumerator WaitAndStopTrackingRagdoll() { - yield return new WaitForSeconds(3f); - player.HUDController.DisplaySpectateHint(); InputManager.onSelect += SwitchTarget; InputManager.onFirePerformed += SwitchTarget; + // TODO remove + InputManager.onZoomPerformed += Respawn; + + yield return new WaitForSeconds(3f); + player.HUDController.DisplaySpectateHint(); + yield return new WaitForSeconds(3f); - var isStillOnPlayer = target == player.AiAimSpot; + var isStillOnPlayer = isTracking && target == player.AiAimSpot; if (isStillOnPlayer) { StopTracking(); @@ -81,6 +93,12 @@ private IEnumerator WaitAndStopTrackingRagdoll() } } + // TODO remove + private void Respawn(InputAction.CallbackContext ctx) + { + player.Respawn(FindObjectOfType().GetRandomSpawnpoints().First()); + } + private void SwitchTarget(InputAction.CallbackContext ctx) { if (!MatchController.Singleton.IsRoundInProgress) @@ -110,6 +128,10 @@ private void StopTracking() { if (!camera) return; + InputManager.onSelect -= SwitchTarget; + InputManager.onFirePerformed -= SwitchTarget; + // TODO remove + InputManager.onZoomPerformed -= Respawn; isTracking = false; camera.enabled = false; ResetCamera(); diff --git a/Assets/Scripts/Gamestate/PlayerManager.cs b/Assets/Scripts/Gamestate/PlayerManager.cs index ad2d4fc26..8094a6c68 100644 --- a/Assets/Scripts/Gamestate/PlayerManager.cs +++ b/Assets/Scripts/Gamestate/PlayerManager.cs @@ -238,6 +238,45 @@ protected void TurnIntoRagdoll(DamageInfo info) ragdollController.EnableRagdoll(force); } + public virtual void Respawn(Transform spawnpoint) + { + Debug.Log("RESPAWNING????"); + + isAlive = true; + aimAssistCollider.SetActive(true); + aiTargetCollider.gameObject.SetActive(true); + if (playerShadow) + playerShadow.gameObject.SetActive(true); + + // Disable components + GetComponent().enabled = true; + // TODO give back health + healthController.enabled = true; + playerIK.enabled = true; + if (gunController) + gunController.gameObject.SetActive(true); + GunHolder.gameObject.SetActive(true); + + if (inputManager) + { + var orbitCamera = GetComponent(); + orbitCamera.Deactivate(); + } + + // TODO: Make accurate hitbox forces for the different limbs of the player + var ragdollController = GetComponent(); + ragdollController.DisableRagdoll(); + + + // post orbit and ragdoll reset + inputManager.PlayerCamera.enabled = true; + + transform.position = spawnpoint.position; + transform.rotation = spawnpoint.rotation; + GetComponent().position = spawnpoint.position; + GetComponent().SetInitialRotation(spawnpoint.rotation.eulerAngles.y); + } + /// /// Function for setting a playerInput, adding movement related listeners to it /// and performing other necessary operations that require playerInput/-Identity. diff --git a/Assets/Scripts/RagdollController.cs b/Assets/Scripts/RagdollController.cs index d3c66bc1f..ed6bdbb9e 100644 --- a/Assets/Scripts/RagdollController.cs +++ b/Assets/Scripts/RagdollController.cs @@ -23,29 +23,42 @@ public class RagdollController : MonoBehaviour public void EnableRagdoll(Vector3 knockbackForce) { - animatorToDisable.enabled = false; + ToggleRagdoll(true); + + rigidbodyToPush.AddForce(knockbackForce, ForceMode.Impulse); + } + + public void DisableRagdoll() + { + ToggleRagdoll(false); + } + + public void ToggleRagdoll(bool shouldEnable = true) + { + animatorToDisable.enabled = !shouldEnable; foreach (var collider in collidersToDisable) { - collider.enabled = false; + collider.enabled = !shouldEnable; } foreach (var collider in collidersToEnable) { - collider.enabled = true; - collider.isTrigger = false; + collider.enabled = shouldEnable; + collider.isTrigger = !shouldEnable; } foreach (var rigidbody in rigidbodiesToDisable) { - rigidbody.isKinematic = true; - rigidbody.useGravity = false; - rigidbody.AddForce(-rigidbody.GetAccumulatedForce()); + rigidbody.isKinematic = shouldEnable; + rigidbody.useGravity = !shouldEnable; + if (shouldEnable) + rigidbody.AddForce(-rigidbody.GetAccumulatedForce()); } foreach (var rigidbody in rigidbodiesToEnable) { - rigidbody.isKinematic = false; - rigidbody.useGravity = true; + rigidbody.isKinematic = !shouldEnable; + rigidbody.useGravity = shouldEnable; + if (!shouldEnable) + rigidbody.AddForce(-rigidbody.GetAccumulatedForce()); } - - rigidbodyToPush.AddForce(knockbackForce, ForceMode.Impulse); } } From 5806127261c6d4a9a7d775fbb8aa5373e4082f5b Mon Sep 17 00:00:00 2001 From: Tore Bergebakken Date: Fri, 12 Jul 2024 15:04:55 +0200 Subject: [PATCH 5/6] wip more --- Assets/Scripts/Control&Input/OrbitCamera.cs | 4 ++++ Assets/Scripts/Gamestate/PlayerManager.cs | 26 +++++++++++++++++++++ Assets/Scripts/UI/PlayerHUDController.cs | 8 +++++++ 3 files changed, 38 insertions(+) diff --git a/Assets/Scripts/Control&Input/OrbitCamera.cs b/Assets/Scripts/Control&Input/OrbitCamera.cs index bbb5d4bb0..431eb376c 100644 --- a/Assets/Scripts/Control&Input/OrbitCamera.cs +++ b/Assets/Scripts/Control&Input/OrbitCamera.cs @@ -19,11 +19,14 @@ public class OrbitCamera : MonoBehaviour private Transform cameraTransform; private new Camera camera; + private LayerMask previousCullingMask; + public Camera Camera { set { camera = value; + previousCullingMask = camera.cullingMask; camera.cullingMask = cullingMask | (1 << (12 + player.LayerIndex)); cameraTransform = value.transform; } @@ -71,6 +74,7 @@ public void Deactivate() { StopTracking(); StopCoroutine(trackingRoutine); + camera.cullingMask = previousCullingMask; } private IEnumerator WaitAndStopTrackingRagdoll() diff --git a/Assets/Scripts/Gamestate/PlayerManager.cs b/Assets/Scripts/Gamestate/PlayerManager.cs index 8094a6c68..1896a8b36 100644 --- a/Assets/Scripts/Gamestate/PlayerManager.cs +++ b/Assets/Scripts/Gamestate/PlayerManager.cs @@ -273,6 +273,32 @@ public virtual void Respawn(Transform spawnpoint) transform.position = spawnpoint.position; transform.rotation = spawnpoint.rotation; + + playerIK.transform.localPosition = Vector3.zero; + playerIK.transform.localRotation = Quaternion.identity; + //inputManager.transform.position = Vector3.zero; + //inputManager.transform.localPosition = Vector3.zero; + inputManager.transform.rotation = Quaternion.identity; + inputManager.PlayerCamera.transform.rotation = Quaternion.identity; + GetComponent().position = spawnpoint.position; + GetComponent().SetInitialRotation(spawnpoint.rotation.eulerAngles.y); + + hudController.DisplayHUD(); + + SetPlayerInput(inputManager); + + StartCoroutine(SetTransformAfterRespawn(spawnpoint)); + } + + private IEnumerator SetTransformAfterRespawn(Transform spawnpoint) + { + yield return null; + + //playerIK.transform.localPosition = Vector3.zero; + //inputManager.transform.parent.position = Vector3.zero; + //inputManager.transform.parent.localPosition = Vector3.zero; + //inputManager.transform.parent.rotation = Quaternion.identity; + //inputManager.PlayerCamera.transform.rotation = Quaternion.identity; GetComponent().position = spawnpoint.position; GetComponent().SetInitialRotation(spawnpoint.rotation.eulerAngles.y); } diff --git a/Assets/Scripts/UI/PlayerHUDController.cs b/Assets/Scripts/UI/PlayerHUDController.cs index da758327d..7814fc678 100644 --- a/Assets/Scripts/UI/PlayerHUDController.cs +++ b/Assets/Scripts/UI/PlayerHUDController.cs @@ -314,6 +314,14 @@ public void DisplaySpectatorScreen(PlayerIdentity target) spectatorTargetText.color = target.color; } + public void DisplayHUD() + { + deathScreen.SetActive(false); + spectatorScreen.SetActive(false); + ammoHud.parent.gameObject.SetActive(true); + speedLines.gameObject.SetActive(true); + } + // x and y expected to be in range [-1, 1] public void MoveCrosshair(float x, float y) { From 693662b626284dc8f7eb9e851dcd982ac14bd6c6 Mon Sep 17 00:00:00 2001 From: Tore Bergebakken Date: Fri, 12 Jul 2024 15:45:28 +0200 Subject: [PATCH 6/6] try fix gun --- Assets/Scripts/Augment/GunController.cs | 6 ++++++ Assets/Scripts/Gamestate/PlayerManager.cs | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/Augment/GunController.cs b/Assets/Scripts/Augment/GunController.cs index 49fc1f079..8092f5df6 100644 --- a/Assets/Scripts/Augment/GunController.cs +++ b/Assets/Scripts/Augment/GunController.cs @@ -102,6 +102,12 @@ public void Initialize() localGunZOffset = transform.localPosition.z; } + public void Reset() + { + stats.Ammo = stats.MagazineSize; + isFiring = false; + } + private void OnDestroy() { if (!barrelAnimator) diff --git a/Assets/Scripts/Gamestate/PlayerManager.cs b/Assets/Scripts/Gamestate/PlayerManager.cs index 1896a8b36..20a6d065d 100644 --- a/Assets/Scripts/Gamestate/PlayerManager.cs +++ b/Assets/Scripts/Gamestate/PlayerManager.cs @@ -221,7 +221,7 @@ protected void TurnIntoRagdoll(DamageInfo info) playerIK.enabled = false; // TODO display guns falling to the floor if (gunController) - gunController.gameObject.SetActive(false); + gunController.enabled = false; GunHolder.gameObject.SetActive(false); if (inputManager) @@ -254,7 +254,11 @@ public virtual void Respawn(Transform spawnpoint) healthController.enabled = true; playerIK.enabled = true; if (gunController) - gunController.gameObject.SetActive(true); + { + gunController.enabled = false; + gunController.Reset(); + gunController.Reload(1); + } GunHolder.gameObject.SetActive(true); if (inputManager) @@ -285,8 +289,6 @@ public virtual void Respawn(Transform spawnpoint) hudController.DisplayHUD(); - SetPlayerInput(inputManager); - StartCoroutine(SetTransformAfterRespawn(spawnpoint)); }