using UnityEngine; using UnityEngine.InputSystem; /// /// Connects player input events to animation triggers. /// Focused on the 8 core animations: Jab, Haymaker, BasicKick, SumoSlap, SpinningBackfist, ElbowSmash, AirPunch, LowKick /// public class InputToAnimation : MonoBehaviour { private AnimationManager animManager; private PlayerInput playerInput; private WeaponManager weaponManager; [SerializeField] private PlayerScript playerScript; // for gating attacks/pause // TeamMember reference for control type checking private TeamMember _teamMember; [Header("Animation Triggers")] [SerializeField] private string jabInputAction = "Jab"; [SerializeField] private string haymakerInputAction = "Haymaker"; [SerializeField] private string spinningBackfistInputAction = "SpinningBackfist"; [SerializeField] private string elbowSmashInputAction = "ElbowSmash"; [SerializeField] private string airPunchInputAction = "AirPunch"; [SerializeField] private string lowKickInputAction = "LowKick"; [SerializeField] private string basicKickInputAction = "BasicKick"; [SerializeField] private string sumoSlapInputAction = "SumoSlap"; [SerializeField] private string genericAttackInputAction = "Attack"; // Fallback single attack action private void Awake() { animManager = GetComponent(); playerInput = GetComponent(); weaponManager = GetComponent(); _teamMember = GetComponent(); if (playerScript == null) { playerScript = GetComponent(); } if (animManager == null) { animManager = gameObject.AddComponent(); Debug.Log("Added AnimationManager component automatically"); } if (playerInput == null) { Debug.LogError("PlayerInput component is required on this GameObject"); } } private void OnEnable() { if (playerInput != null) { // Connect action events SetupInputCallbacks(); } } private void OnDisable() { // Cleanup if needed } /// /// Sets up the callbacks from input actions to animations /// private void SetupInputCallbacks() { // Register callbacks for our 8 core animations RegisterActionCallback(jabInputAction, AnimationNames.Jab); RegisterActionCallback(haymakerInputAction, AnimationNames.Haymaker); RegisterActionCallback(spinningBackfistInputAction, AnimationNames.SpinningBackfist); RegisterActionCallback(elbowSmashInputAction, AnimationNames.ElbowSmash); RegisterActionCallback(airPunchInputAction, AnimationNames.AirPunch); RegisterActionCallback(lowKickInputAction, AnimationNames.LowKick); RegisterActionCallback(basicKickInputAction, AnimationNames.BasicKick); RegisterActionCallback(sumoSlapInputAction, AnimationNames.SumoSlap); // Also support a single generic "Attack" action by mapping it to a default attack (Jab) RegisterActionCallback(genericAttackInputAction, AnimationNames.Jab); // Basic fallbacks for common inputs RegisterActionCallback("Punch", AnimationNames.Jab); RegisterActionCallback("Kick", AnimationNames.LowKick); RegisterActionCallback("Strike", AnimationNames.Haymaker); } /// /// Registers a callback for an input action to trigger an animation /// private void RegisterActionCallback(string actionName, string animationName) { if (playerInput == null) return; // Use throwIfNotFound=false to gracefully handle missing actions InputAction action = playerInput.actions.FindAction(actionName, false); if (action != null) { action.performed += ctx => PlayAnimation(animationName); } // Silently ignore missing actions - not all input assets have all actions } /// /// Plays an animation using the AnimationManager, allowing weapon overrides /// private void PlayAnimation(string animationName) { if (animManager == null) return; // CRITICAL FIX: Only respond to input if this character is HumanControlled // This prevents AI teammates from triggering attacks when the player presses buttons if (_teamMember != null && _teamMember.CurrentControlType != TeamMember.ControlType.HumanControlled) { return; } // Also check if PlayerInput is enabled (double safety) if (playerInput != null && !playerInput.enabled) { return; } // Respect PlayerScript gameplay state to prevent duplicate/invalid triggers if (playerScript != null) { // Only allow when attacks are enabled and player isn't blocking or dodging if (!playerScript.attack || playerScript.block || playerScript.dodge) return; } // If a weapon is equipped, resolve to the weapon's animation set if (weaponManager != null && weaponManager.IsWeaponEquipped) { animationName = weaponManager.ResolveAnimation(animationName); } animManager.PlayAnimation(animationName); } // Public method to manually trigger animations from other scripts public void TriggerAnimation(string animationName) { PlayAnimation(animationName); } }