Files
voxel/Player.cs
2025-09-30 10:58:12 +02:00

121 lines
3.3 KiB
C#

using OpenTK.Mathematics;
using OpenTK.Windowing.GraphicsLibraryFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace Voxel
{
public class Player : Entity
{
private World _world;
public double lastClick = 0;
public readonly float mouseCooldown = 0.2f;
private int _blockIndex = 0;
private Blocks _selectedBlock = Blocks.Dirt;
public Player(Vector3 startPos, World world) : base(startPos, 0.5f, 1.8f, world)
{
}
public void PlaceBlock()
{
var (success, hit, x, y, z, normal) = _world.Raycast(Camera.Position, Camera.Front.Normalized(), 8);
if (!success) return;
x += normal.X;
y += normal.Y;
z += normal.Z;
_world.SetBlock(x, y, z, _selectedBlock);
}
public void BreakBlock()
{
var (success, hit, x, y, z, normal) = _world.Raycast(Camera.Position, Camera.Front.Normalized(), 8);
if (!success) return;
_world.SetBlock(x, y, z, Blocks.Air);
}
public void Update(float deltaTime)
{
Camera.Position = Position + Vector3.UnitY * 0.5f;
Rotation = Camera.Yaw;
if (lastClick > 0)
{
lastClick -= deltaTime;
if (lastClick < 0) lastClick = 0;
}
if (!Input.GetMouseButton(MouseButton.Right) && !Input.GetMouseButton(MouseButton.Left))
{
lastClick = 0;
}
if (Input.GetMouseButton(MouseButton.Right) && lastClick == 0)
{
lastClick = mouseCooldown;
PlaceBlock();
}
if (Input.GetMouseButton(MouseButton.Left) && lastClick == 0)
{
lastClick = mouseCooldown;
BreakBlock();
}
if (Input.GetKey(Keys.W))
ApplyLocalVelocity(0, -5 * deltaTime);
if (Input.GetKey(Keys.Space) && OnGround)
{
Velocity = new Vector3(Velocity.X, 0.5f, Velocity.Z);
OnGround = false;
Console.WriteLine("Jump");
}
}
public void ApplyLocalVelocity(float x, float z)
{
Vector3 localVelocity = new Vector3(x, 0, z);
float yaw = MathHelper.DegreesToRadians(Rotation);
float cos = MathF.Cos(yaw); // yaw in radians
float sin = MathF.Sin(yaw);
Vector3 worldVelocity = new Vector3(
localVelocity.X * cos - localVelocity.Z * sin,
Velocity.Y,
localVelocity.X * sin + localVelocity.Z * cos
);
Velocity = worldVelocity;
}
public void SwitchBlock(bool inverted)
{
var keys = BlockDefinitions.Blocks.Keys.ToList();
if (inverted)
if (_blockIndex == 0)
_blockIndex = keys.Count -1;
else
_blockIndex -= 1;
else
_blockIndex += 1;
_blockIndex = _blockIndex % keys.Count;
_selectedBlock = keys[_blockIndex];
Console.WriteLine(_selectedBlock);
}
}
}