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); } } }