neon-sprawl-archived/client/scripts/main.gd

46 lines
1.4 KiB
GDScript

extends Node3D
## NS-14: client-only click-to-move. Provisional until authoritative movement sync (server / MoveCommand).
@onready var _camera: Camera3D = $World/Camera3D
@onready var _player: CharacterBody3D = $Player
func _input(event: InputEvent) -> void:
if event is InputEventMouseButton:
var mb := event as InputEventMouseButton
if mb.button_index == MOUSE_BUTTON_LEFT and mb.pressed:
_try_set_move_target(get_viewport().get_mouse_position())
func _try_set_move_target(screen_pos: Vector2) -> void:
var cam: Camera3D = get_viewport().get_camera_3d()
if cam == null:
cam = _camera
var origin: Vector3 = cam.project_ray_origin(screen_pos)
var ray_dir: Vector3 = cam.project_ray_normal(screen_pos)
var to: Vector3 = origin + ray_dir * 2000.0
var query := PhysicsRayQueryParameters3D.create(origin, to)
query.collision_mask = 1
var space: PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
var hit: Dictionary = space.intersect_ray(query)
if hit.is_empty():
return
var collider: Variant = hit.get("collider")
if not _collider_is_walkable(collider):
return
var hit_pos: Variant = hit.get("position")
if hit_pos is Vector3:
_player.set_move_goal(hit_pos as Vector3)
func _collider_is_walkable(collider: Variant) -> bool:
var n: Node = collider as Node
while n:
if n.is_in_group("walkable"):
return true
n = n.get_parent()
return false