2024-08-05 11:08:28 +00:00
|
|
|
using CodingLand.Scripts.Logic;
|
2024-08-04 15:00:26 +00:00
|
|
|
using Godot;
|
|
|
|
|
|
|
|
namespace CodingLand.Scripts;
|
|
|
|
|
|
|
|
public partial class Player : CharacterBody2D
|
|
|
|
{
|
2024-08-05 11:08:28 +00:00
|
|
|
private int _currentPlayerId = 1;
|
2024-08-05 15:54:22 +00:00
|
|
|
|
2024-08-04 15:00:26 +00:00
|
|
|
[Export] public float MaxSpeed = 400f;
|
|
|
|
[Export] public float Acceleration = 500f;
|
|
|
|
[Export] public float Deceleration = 500f;
|
|
|
|
[Export] public float RotationSpeed = 5f;
|
|
|
|
|
2024-08-05 15:54:22 +00:00
|
|
|
[Export] public int Reach = 5;
|
|
|
|
|
2024-08-04 15:00:26 +00:00
|
|
|
[Export] public Camera2D PlayerCamera;
|
2024-08-05 11:08:28 +00:00
|
|
|
|
|
|
|
[Export] public PlayerInput PlayerInput;
|
|
|
|
|
2024-08-05 08:30:50 +00:00
|
|
|
[Export] public float PlayerDashAcceleration = 2f;
|
2024-08-04 15:00:26 +00:00
|
|
|
|
2024-08-05 15:54:22 +00:00
|
|
|
[Export]
|
|
|
|
public int PlayerId
|
2024-08-05 11:08:28 +00:00
|
|
|
{
|
|
|
|
get => _currentPlayerId;
|
|
|
|
set
|
|
|
|
{
|
|
|
|
_currentPlayerId = value;
|
|
|
|
PlayerInput.SetMultiplayerAuthority(value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SetPlayerId(int id)
|
2024-08-04 15:00:26 +00:00
|
|
|
{
|
2024-08-05 11:08:28 +00:00
|
|
|
PlayerId = id;
|
|
|
|
PlayerInput.SetMultiplayerAuthority(id);
|
|
|
|
}
|
2024-08-05 15:54:22 +00:00
|
|
|
|
|
|
|
private TilesManager _tilesMgr;
|
2024-08-05 11:08:28 +00:00
|
|
|
|
|
|
|
public override void _Ready()
|
|
|
|
{
|
|
|
|
if (PlayerId == Multiplayer.GetUniqueId())
|
|
|
|
PlayerCamera.Enabled = true;
|
2024-08-05 15:54:22 +00:00
|
|
|
_tilesMgr = GetNode<TilesManager>("../Tiles");
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void _Process(double delta)
|
|
|
|
{
|
|
|
|
var vec = GetGlobalMousePosition();
|
|
|
|
if (PlayerInput.BuildingAt == Vector2.Zero) return;
|
|
|
|
var distance = Position.DistanceTo(vec);
|
|
|
|
if (distance <= Reach * _tilesMgr.TileSize)
|
|
|
|
{
|
|
|
|
// Able to build
|
|
|
|
Rpc(nameof(AddTile), vec);
|
|
|
|
}
|
|
|
|
|
|
|
|
PlayerInput.BuildingAt = Vector2.Zero;
|
2024-08-05 11:08:28 +00:00
|
|
|
}
|
2024-08-04 15:00:26 +00:00
|
|
|
|
2024-08-05 11:08:28 +00:00
|
|
|
public override void _PhysicsProcess(double delta)
|
|
|
|
{
|
|
|
|
var input = PlayerInput.MovementDirection;
|
2024-08-04 15:00:26 +00:00
|
|
|
|
|
|
|
if (input != Vector2.Zero)
|
|
|
|
{
|
2024-08-05 11:08:28 +00:00
|
|
|
input = input.Normalized();
|
2024-08-04 15:00:26 +00:00
|
|
|
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);
|
|
|
|
}
|
2024-08-05 08:30:50 +00:00
|
|
|
|
2024-08-05 15:54:22 +00:00
|
|
|
var dashCountdown = GetNode<Timer>("DashCountdown");
|
|
|
|
if (PlayerInput.IsDashing && dashCountdown.IsStopped())
|
2024-08-05 08:30:50 +00:00
|
|
|
{
|
2024-08-05 11:08:28 +00:00
|
|
|
PlayerInput.IsDashing = false;
|
2024-08-05 08:30:50 +00:00
|
|
|
Velocity *= PlayerDashAcceleration;
|
2024-08-05 15:54:22 +00:00
|
|
|
dashCountdown.Start();
|
2024-08-05 08:30:50 +00:00
|
|
|
}
|
2024-08-05 11:08:28 +00:00
|
|
|
|
2024-08-04 15:00:26 +00:00
|
|
|
Position += Velocity * (float)delta;
|
|
|
|
MoveAndSlide();
|
|
|
|
}
|
2024-08-05 15:54:22 +00:00
|
|
|
|
|
|
|
[Rpc(mode: MultiplayerApi.RpcMode.AnyPeer, CallLocal = true)]
|
|
|
|
public void AddTile(Vector2 pos)
|
|
|
|
{
|
|
|
|
if (_tilesMgr.GetTileByPosition<Node2D>(pos) != null) return;
|
|
|
|
|
|
|
|
var tileVec = new Vector2(_tilesMgr.TileSize, _tilesMgr.TileSize);
|
|
|
|
var blueprint = GD.Load<PackedScene>("res://Scenes/Tiles/Brick.tscn");
|
|
|
|
var instance = blueprint.Instantiate<Node2D>();
|
|
|
|
instance.Position = pos.Snapped(tileVec);
|
|
|
|
_tilesMgr.AddChild(instance);
|
|
|
|
}
|
2024-08-04 15:00:26 +00:00
|
|
|
}
|