using AceField.Scripts.Effects; using AceField.Scripts.Logic; using Godot; namespace AceField.Scripts; public partial class Player : CharacterBody2D { private int _currentPlayerId = 1; [Export] public float MaxSpeed = 400f; [Export] public float Acceleration = 500f; [Export] public float Deceleration = 500f; [Export] public float RotationSpeed = 5f; [Export] public int Reach = 5; [Export] public double Health = 100; [Export] public double MaxHealth = 100; [Export] public double ActionPoints = 20; [Export] public double MaxActionPoints = 20; [Export] public Camera2D PlayerCamera; [Export] public PlayerInput PlayerInput; [Export] public float PlayerDashAcceleration = 2f; [Export] public PackedScene BulletScene; [Export] public int PlayerId { get => _currentPlayerId; set { _currentPlayerId = value; PlayerInput.SetMultiplayerAuthority(value); } } public void SetPlayerId(int id) { PlayerId = id; PlayerInput.SetMultiplayerAuthority(id); } public override void _Ready() { Health = MaxHealth; ActionPoints = MaxActionPoints; if (PlayerId == Multiplayer.GetUniqueId()) PlayerCamera.Enabled = true; } public override void _Process(double delta) { if (PlayerInput.IsShooting) { Rpc(nameof(Shoot)); PlayerInput.IsShooting = false; } } public override void _PhysicsProcess(double delta) { var input = PlayerInput.MovementDirection; if (input != Vector2.Zero) { input = input.Normalized(); Velocity = Velocity.MoveToward(input * MaxSpeed, Acceleration * (float)delta); var finalRotation = input.Angle() + Mathf.Pi / 2; Rotation = Mathf.LerpAngle(Rotation, finalRotation, RotationSpeed * (float)delta); } else { Velocity = Velocity.MoveToward(Vector2.Zero, Deceleration * (float)delta); } var dashCountdown = GetNode("DashCountdown"); if (PlayerInput.IsDashing && dashCountdown.IsStopped()) { PlayerInput.IsDashing = false; Velocity *= PlayerDashAcceleration; dashCountdown.Start(); } Position += Velocity * (float)delta; MoveAndSlide(); } public void TakeDamage(double damage) { Rpc(nameof(GotDamage), damage); } [Rpc(MultiplayerApi.RpcMode.AnyPeer, CallLocal = true)] private void GotDamage(double damage) { Health -= damage; var shakableCamera = GetNode("Camera2D"); shakableCamera.AddTrauma(0.5f); } [Rpc(MultiplayerApi.RpcMode.AnyPeer, CallLocal = true)] private void Shoot() { var marker = GetNode("Muzzle"); var projectile = BulletScene.Instantiate(); projectile.Transform = marker.GlobalTransform; projectile.PlayerId = PlayerId; GetParent().AddChild(projectile); } }