using Godot; public partial class Player1 : Character { [Export] private float _speed = 5.0f; [Export] private PackedScene _fireProjectile; [Export] private PackedScene _altFireProjectile; private GameManager _gameManager; public bool CanShoot { get; private set; } public override void _Ready() { CanShoot = true; _gameManager = GetTree().Root.GetNode("Main/GameManager"); _gameManager.SetP1GameOver(false); } public override void _PhysicsProcess(double delta) { if (!_gameManager.IsP1SelectingCharacter) { Velocity = CalculateCharacterMovement(delta); MoveAndSlide(); } } public override void _UnhandledInput(InputEvent @event) { if (Input.IsActionJustPressed("exit")) GetTree().Quit(); if (!_gameManager.IsP1SelectingCharacter) { if (Input.IsActionJustPressed("p1_fire") && CanShoot) Fire(); if (Input.IsActionJustPressed("p1_altfire") && CanShoot) AltFire(); } } private Vector3 CalculateCharacterMovement(double delta) { var velocity = Velocity; var inputDir = Input.GetVector("p1_left", "p1_right", "p1_up", "p1_down"); var direction = (Transform.Basis * new Vector3(inputDir.X, 0, inputDir.Y)).Normalized(); if (direction != Vector3.Zero) { velocity.X = direction.X * _speed; velocity.Z = direction.Z * _speed; GetNode("Pivot").LookAt(Position + direction, Vector3.Up); } else { velocity.X = Mathf.MoveToward(Velocity.X, 0, _speed); velocity.Z = Mathf.MoveToward(Velocity.Z, 0, _speed); } return velocity; } private async void Fire() { var projectile = _fireProjectile.Instantiate(); projectile.Position = Position + new Vector3(0f, 1f, 0f); GetParent().AddChild(projectile); CanShoot = false; await ToSignal(GetTree().CreateTimer(projectile.Cooldown), "timeout"); CanShoot = true; } private async void AltFire() { var projectile = _altFireProjectile.Instantiate(); projectile.Position = Position + new Vector3(0f, 1f, 0f); GetParent().AddChild(projectile); CanShoot = false; await ToSignal(GetTree().CreateTimer(projectile.Cooldown), "timeout"); CanShoot = true; } private void HitDebug() { var node = new Node3D(); OnHit(node); } private void OnHit(Node3D node) { _gameManager.RemoveP1Character(); if (_gameManager._p1Characters.Count == 0) { GD.Print("Game over for P1"); _gameManager.SetP1GameOver(true); } } }