From d527a8236d8263abcb16e1cd5c90cd338aac2943 Mon Sep 17 00:00:00 2001 From: Hazim Bin Ijaz Date: Wed, 29 Jan 2025 18:51:43 +0500 Subject: [PATCH] Fixed stamina bug --- Assets/Scripts/Gameplay/StaminaManager.cs | 60 ++++++++++++++++--- .../Gameplay/UserInput/ClientInputSender.cs | 22 +++---- 2 files changed, 64 insertions(+), 18 deletions(-) diff --git a/Assets/Scripts/Gameplay/StaminaManager.cs b/Assets/Scripts/Gameplay/StaminaManager.cs index 9dfe041..4c6d616 100644 --- a/Assets/Scripts/Gameplay/StaminaManager.cs +++ b/Assets/Scripts/Gameplay/StaminaManager.cs @@ -4,29 +4,39 @@ public class StaminaManager : MonoBehaviour { [SerializeField] private float maxStamina = 100f; [SerializeField] private float staminaRegenRate = 10f; - [SerializeField] private float staminaRegenDelay = 1f; + [SerializeField] private float staminaRegenDelay = 2f; private float currentStamina; private float staminaRegenTimer; + private bool isConsumingStamina; public float CurrentStamina => currentStamina; public float MaxStamina => maxStamina; + public bool IsStaminaDepleted => currentStamina <= 0; private void Start() { currentStamina = maxStamina; + Debug.Log($"[StaminaManager] Stamina initialized. Max Stamina: {maxStamina}"); } private void Update() { - if (staminaRegenTimer > 0) + if (isConsumingStamina) { - staminaRegenTimer -= Time.deltaTime; + staminaRegenTimer = staminaRegenDelay; // Reset regen delay if consuming stamina } - else if (currentStamina < maxStamina) + else { - currentStamina += staminaRegenRate * Time.deltaTime; - currentStamina = Mathf.Min(currentStamina, maxStamina); + // Start regen countdown after sprinting stops + if (staminaRegenTimer > 0) + { + staminaRegenTimer -= Time.deltaTime; + } + else if (currentStamina < maxStamina) + { + RegenerateStamina(); + } } } @@ -35,9 +45,45 @@ public class StaminaManager : MonoBehaviour if (currentStamina >= amount) { currentStamina -= amount; - staminaRegenTimer = staminaRegenDelay; + isConsumingStamina = true; + Debug.Log($"[StaminaManager] Consumed {amount} stamina. Remaining: {currentStamina}/{maxStamina}"); + + if (currentStamina <= 0) + { + currentStamina = 0; + Debug.Log("[StaminaManager] Stamina depleted! Stopping consumption."); + StopConsuming(); + } return true; } + + Debug.Log("[StaminaManager] Not enough stamina!"); return false; } + + public void StartConsuming() + { + isConsumingStamina = true; + staminaRegenTimer = staminaRegenDelay; // Reset regen delay when consumption starts + } + + public void StopConsuming() + { + isConsumingStamina = false; // Stop consuming and allow regen countdown + staminaRegenTimer = staminaRegenDelay; // Ensure regen starts after delay + Debug.Log("[StaminaManager] Stopped consuming. Regen will start after delay."); + } + + private void RegenerateStamina() + { + float previousStamina = currentStamina; + currentStamina += staminaRegenRate * Time.deltaTime; + currentStamina = Mathf.Min(currentStamina, maxStamina); + Debug.Log($"[StaminaManager] Regenerating: {previousStamina} → {currentStamina}/{maxStamina}"); + + if (currentStamina == maxStamina) + { + Debug.Log("[StaminaManager] Fully recovered!"); + } + } } diff --git a/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs b/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs index 4dec225..81ad69f 100644 --- a/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs +++ b/Assets/Scripts/Gameplay/UserInput/ClientInputSender.cs @@ -545,8 +545,8 @@ namespace Unity.BossRoom.Gameplay.UserInput { if (Input.GetKey(KeyCode.LeftShift)) { - float staminaCost = 50 * Time.deltaTime; - + float staminaCost = 50f * Time.deltaTime; + if (staminaManager.TryConsume(staminaCost)) { if (!isSprinting) @@ -556,31 +556,31 @@ namespace Unity.BossRoom.Gameplay.UserInput } else { - if (isSprinting) - { - StopSprintServerRPC(); - } + StopSprintServerRPC(); + staminaManager.StopConsuming(); // Allows regen after delay } } - else if (isSprinting) + else if (isSprinting) // Sprint key released { StopSprintServerRPC(); + staminaManager.StopConsuming(); // Allows regen after delay } } - + + + [ServerRpc] private void StartSprintServerRPC() { - isSprinting = true; m_ServerCharacter.Movement.SetSpeedModifier(2.5f); } + [ServerRpc] private void StopSprintServerRPC() { - isSprinting = false; m_ServerCharacter.Movement.SetSpeedModifier(1f); } - + private void ActivateAbilityIfAllowed(string abilityKey, string errorMessage = null) {