summaryrefslogtreecommitdiff
path: root/player.gd
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2025-01-11 12:31:00 +0100
committerDaniel Weipert <git@mail.dweipert.de>2025-01-11 12:31:00 +0100
commitf448ca4259d7f76fc58bc3b5c12ea8d04ab49a87 (patch)
tree679e0b6186253a9becd8fbe5ade5bbb679ba06a0 /player.gd
parentb1d9bfe7e80b4d95acd26d0ab6a1ce34ad18d91c (diff)
next commit
Diffstat (limited to 'player.gd')
-rw-r--r--player.gd98
1 files changed, 80 insertions, 18 deletions
diff --git a/player.gd b/player.gd
index d010294..b45d0a0 100644
--- a/player.gd
+++ b/player.gd
@@ -1,14 +1,28 @@
+class_name Player
extends CharacterBody3D
-const SPEED = 20.0
-const JUMP_VELOCITY = 20.0
+var selection_block: MeshInstance3D
+var selection_block_data: Block
+var previous_looked_at_block_position: Vector3 = Vector3.ZERO
+
+const SPEED = 5.0#10.0#20.0
+const JUMP_VELOCITY = 5.0#10.0#20.0
var acc = 0
func _ready() -> void:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
+
+ selection_block = MeshInstance3D.new()
+ selection_block.visible = false
+ selection_block.top_level = true
+ selection_block.rotation = Vector3.ZERO
+ selection_block.scale = Vector3(1.001, 1.001, 1.001)
+ add_child(selection_block)
+ selection_block_data = Block.new()
+ selection_block_data.type = Block.Type.SELECTION
func _input(event: InputEvent) -> void:
@@ -20,36 +34,71 @@ func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
$CameraAnchor.rotate_y(deg_to_rad(clamp(-event.relative.x * 0.25, -45, 45)))
$CameraAnchor.rotate_object_local(Vector3(1,0,0), deg_to_rad(-event.relative.y * 0.25))
+
+ if event.is_action_pressed("right_click"):
+ if selection_block.visible:
+ var point = selection_block.global_position + $CameraAnchor/Camera/RayCast3D.get_collision_normal()
+ (get_tree().current_scene as World).add_block(point, $CanvasLayer/MarginContainer.active_type)
+
+ if event.is_action_pressed("left_click"):
+ if selection_block.visible:
+ var point = selection_block.global_position
+ var chunk_idx := Chunk.global_to_chunk(point)
+ if Chunk.chunk_exists(chunk_idx.x, chunk_idx.y, chunk_idx.z):
+ var chunk: Chunk = Chunk.chunks[chunk_idx.x][chunk_idx.y][chunk_idx.z]
+ var block_chunk_idx := Chunk.global_to_chunk_block(point)
+ chunk.remove_block(block_chunk_idx)
func _process(delta: float) -> void:
if $CameraAnchor/Camera/RayCast3D.is_colliding():
var collider = $CameraAnchor/Camera/RayCast3D.get_collider()
- var point = $CameraAnchor/Camera/RayCast3D.get_collision_point()
+ if collider is not StaticBody3D:
+ return
- var block_idx = floor(point / 2)
- var block_chunk_idx = Vector3(
- int(floor(point.x / 2)) % 16,
- int(floor(point.y / 2)) % 16,
- int(floor(point.z / 2)) % 16
+ var p = $CameraAnchor/Camera/RayCast3D.get_collision_point()
+ var n = $CameraAnchor/Camera/RayCast3D.get_collision_normal()
+ #var point = $CameraAnchor/Camera/RayCast3D.get_collision_point() - Vector3(1, 1, 1) - $CameraAnchor/Camera/RayCast3D.get_collision_normal()
+ #point = $CameraAnchor/Camera/RayCast3D.get_collision_point() - Vector3(0.5, 0.5, 0.5) - $CameraAnchor/Camera/RayCast3D.get_collision_normal()
+ var point = $CameraAnchor/Camera/RayCast3D.get_collision_point() - (
+ $CameraAnchor/Camera/RayCast3D.get_collision_normal() if $CameraAnchor/Camera/RayCast3D.get_collision_normal() > Vector3.ZERO else Vector3.ZERO
)
- var chunk_idx = floor(point / (16*2))
+ #point = $CameraAnchor/Camera/RayCast3D.get_collision_point().snapped(Vector3(0.5, 0.5, 0.5))
+
+ #var block_idx = floor(point)#floor(point / 2)
+ #var chunk_idx = floor(point / 16)#floor(point / (16*2))
+ #var block_chunk_idx = Vector3(
+ #int(floor(point.x / 2)) % 16,
+ #int(floor(point.y / 2)) % 16,
+ #int(floor(point.z / 2)) % 16
+ #)
+ #var block_chunk_idx = block_idx - 16 * chunk_idx
+
+ var chunk_idx := Chunk.global_to_chunk(point)
+ var block_chunk_idx := Chunk.global_to_chunk_block(point)
- acc += delta
- if acc / 5 > 1.0:
- acc = 0
- print(block_chunk_idx)
- print(chunk_idx)
- var chunk: Chunk = get_tree().current_scene.chunks[chunk_idx.x][chunk_idx.y][chunk_idx.z]
+ #acc += delta
+ #if acc / 5 > 1.0:
+ #acc = 0
+ #print(block_chunk_idx)
+ #print(chunk_idx)
+ if Chunk.chunk_exists(chunk_idx.x, chunk_idx.y, chunk_idx.z):
+ var chunk: Chunk = Chunk.chunks[chunk_idx.x][chunk_idx.y][chunk_idx.z]
var block: Block = chunk.blocks[block_chunk_idx.x][block_chunk_idx.y][block_chunk_idx.z]
- print(point, "==", block.position) #??
- print(Block.Type.keys()[block.type])
+ selection_block.visible = true
+ if previous_looked_at_block_position != block.position:
+ update_selection_block(block.position)
+ previous_looked_at_block_position = block.position
+ #print(point, "==", block.position) #??
+ #print(Block.Type.keys()[block.type])
+ else:
+ selection_block.visible = false
func _physics_process(delta: float) -> void:
# Add the gravity.
if not is_on_floor():
- velocity += get_gravity() * delta
+ velocity += get_gravity() * delta * 1.5
# Handle jump.
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
@@ -72,3 +121,16 @@ func _physics_process(delta: float) -> void:
velocity.z = move_toward(velocity.z, 0, SPEED)
move_and_slide()
+
+
+func update_selection_block(new_position: Vector3):
+ var material := preload("res://new_shader_material_selection.tres")
+ var st = SurfaceTool.new()
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
+ st.set_material(material)
+
+ for face in Block.Face.values():
+ selection_block_data.add_face(st, face)
+
+ selection_block.global_position = new_position
+ selection_block.mesh = st.commit()