My build_mode code
unknown
python
a year ago
5.6 kB
2
Indexable
#BuildModeHandler.gd #@tool #class_name BuildModeHandler extends Node3D #docstring # Load your building scene #region Variables #signals #enums #constants #@export variables #public variables var foundation = preload("res://foundation.tscn") var camera var shifted var preview var build_mode : bool = false: set(value): build_mode = value Galy.build_mode = value $"../../../UI/VBoxContainer/Build_Mode".visible = value $"../../../UI/VBoxContainer/Build_Scale".visible = value $"../../../UI/VBoxContainer/Build_Rotation".visible = value var buildscale: float = 1: set(value): buildscale = clamp(value,1,10) $"../../../UI/VBoxContainer/Build_Scale".text = str("Scale: ", clamp(value,1,10)) if preview != null: preview.scale = Vector3(clamp(value,1,10),clamp(value,1,10),clamp(value,1,10)) var buildrotation: float = 0: set(value): buildrotation = value + 360 if value < 0 else value if value < 360 else value - 360 $"../../../UI/VBoxContainer/Build_Rotation".text = str("Rotation: ", buildrotation) if preview != null: preview.rotation_degrees.y = buildrotation var scale_mode = true: set(value): scale_mode = value if value: $"../../../UI/VBoxContainer/Build_Mode".text = "Build Mode: Scale" var rotate_mode = false: set(value): rotate_mode = value if value: $"../../../UI/VBoxContainer/Build_Mode".text = "Build Mode: Rotate" #private variables #@onready variables #endregion #region Functions #optional built-in virtual _init method #optional built-in virtual _enter_tree() method #optional built-in virtual _ready method - Called when the node enters the scene tree for the first time. func _ready(): pass #region remaining built-in virtual methods # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): _handle_build_mode() func _physics_process(delta): handle_build_preview() func _input(event): if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed and build_mode: place_building_at_mouse() if event.is_action_pressed("build_mode"): build_mode = !build_mode if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_WHEEL_UP and build_mode: if shifted: print("shift-scroll") #endregion #region public methods func place_building_at_mouse(): var result = raycast_to_mouse() if result and not (result.collider.collision_layer & 24) and result.has("position"): var foundation = foundation.instantiate() foundation.scale = Vector3(buildscale,buildscale,buildscale) foundation.rotation_degrees.y = buildrotation get_tree().current_scene.add_child(foundation) foundation.global_position = result.position elif result: print("this is a wall or a building") func place_preview_at_mouse(result): preview = foundation.instantiate() preview.get_node("CollisionShape3D").queue_free() preview.scale = Vector3(buildscale,buildscale,buildscale) preview.rotation_degrees.y = buildrotation get_tree().current_scene.add_child(preview) preview.global_position = result.position func move_preview_to_mouse(mouseraypos): if mouseraypos.has("position"): if !(preview.position == mouseraypos.position): preview.position = mouseraypos.position func raycast_to_mouse(): var mouse_pos = get_viewport().get_mouse_position() camera = Galy.my_cam.camera var from = camera.project_ray_origin(mouse_pos) var to = from + camera.project_ray_normal(mouse_pos) * 50.0 var space_state = camera.get_world_3d().direct_space_state var rayparams = PhysicsRayQueryParameters3D.create(from, to, 28) var result = space_state.intersect_ray(rayparams) return result func handle_build_preview(): var mouseraypos = raycast_to_mouse() if build_mode else null if not build_mode or not mouseraypos.has("position") or (mouseraypos.collider.collision_layer & 24): if preview: preview.queue_free() preview = null elif preview: move_preview_to_mouse(mouseraypos) else: place_preview_at_mouse(mouseraypos) #endregion #region private methods func _handle_build_mode(): if !build_mode: return if Input.is_action_just_pressed("build_mode_switch_mode"): scale_mode = !scale_mode rotate_mode = !rotate_mode if scale_mode: if Input.is_action_just_pressed("build_scale_up"): buildscale += 1 if Input.is_action_pressed("shift") else 0.1 if Input.is_action_pressed("ctrl") else 0.01 elif Input.is_action_just_pressed("build_scale_down"): buildscale -= 1 if Input.is_action_pressed("shift") else 0.1 if Input.is_action_pressed("ctrl") else 0.01 elif rotate_mode: if Input.is_action_just_pressed("build_scale_up"): buildrotation += 10 if Input.is_action_pressed("shift") else 5 if Input.is_action_pressed("ctrl") else 1 elif Input.is_action_just_pressed("build_scale_down"): buildrotation -= 10 if Input.is_action_pressed("shift") else 5 if Input.is_action_pressed("ctrl") else 1 #endregion #region subclasses #endregion #endregion #region Auto_Include_Functions #endregion
Editor is loading...
Leave a Comment