TowerGame/scripts/building_manager.gd

44 lines
1.9 KiB
GDScript

extends Node3D
class_name BuildingManager
@export_flags_3d_physics var buildings_layer_mask: int = 0b10
var placing_building: Building = null
func start_placement(scene: PackedScene) -> void:
var object: Node = scene.instantiate()
add_child(object)
if object is Building:
placing_building = object
placing_building._start_placement()
func _input(event: InputEvent) -> void:
if placing_building == null:
return
if event is InputEventMouseButton and event.is_action("building_place"):
placement_mouse_input((event as InputEventMouseButton).global_position, true)
get_viewport().set_input_as_handled()
elif event is InputEventMouseMotion:
placement_mouse_input((event as InputEventMouseMotion).global_position, false)
get_viewport().set_input_as_handled()
func placement_mouse_input(screen_position: Vector2, confirmed: bool) -> void:
# try to raycast to see what we clicked on/are hovering
var camera: Camera3D = get_viewport().get_camera_3d()
var ray_origin: Vector3 = camera.project_ray_origin(screen_position)
var ray_normal: Vector3 = ray_origin + camera.project_ray_normal(screen_position) * 200
var params: PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(ray_origin, ray_normal)
if placing_building.collision_shape != null:
params.exclude = [placing_building.get_rid()]
var result: Dictionary = get_world_3d().direct_space_state.intersect_ray(params)
var placment_feedback: int = 0
if result.has("collider") and result["collider"] is Building:
placment_feedback = placing_building._placement_select_building(result["collider"] as Building, confirmed)
elif result.has("position"):
DebugDraw3D.draw_sphere(result["position"] as Vector3)
placment_feedback = placing_building._placement_select_position(result["position"] as Vector3, confirmed)
if placment_feedback & Building.PLACEMENT_COMPLETED:
placing_building._end_placement()
placing_building = null