From 7de0801802c8247e27f54445dab5091d5473643c Mon Sep 17 00:00:00 2001
From: Zakarya <zakaryacarroll.contact@gmail.com>
Date: Fri, 1 Mar 2024 16:02:23 -0800
Subject: [PATCH] New reticle system

---
 addons/fpc/character.gd            | 15 +++++++++++++++
 addons/fpc/character.tscn          | 11 ++---------
 addons/fpc/reticles/reticle_1.tscn |  3 ++-
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/addons/fpc/character.gd b/addons/fpc/character.gd
index 1a531f0..0364b25 100644
--- a/addons/fpc/character.gd
+++ b/addons/fpc/character.gd
@@ -11,6 +11,7 @@ extends CharacterBody3D
 @export var jump_velocity : float = 4.5
 @export var mouse_sensitivity : float = 0.1
 @export var immobile : bool = false
+@export_file var default_reticle
 
 @export var initial_facing_direction : Vector3 = Vector3.ZERO
 
@@ -60,6 +61,8 @@ var state : String = "normal"
 var low_ceiling : bool = false # This is for when the cieling is too low and the player needs to crouch.
 var was_on_floor : bool = true
 
+var RETICLE : Control
+
 # Get the gravity from the project settings to be synced with RigidBody nodes
 var gravity : float = ProjectSettings.get_setting("physics/3d/default_gravity") # Don't set this as a const, see the gravity section in _physics_process
 
@@ -71,12 +74,24 @@ func _ready():
 	if initial_facing_direction:
 		HEAD.set_rotation_degrees(initial_facing_direction) # I don't want to be calling this function if the vector is zero
 	
+	if default_reticle:
+		change_reticle(default_reticle)
+	
 	# Reset the camera position
 	HEADBOB_ANIMATION.play("RESET")
 	JUMP_ANIMATION.play("RESET")
 	CROUCH_ANIMATION.play("RESET")
 
 
+func change_reticle(reticle):
+	if RETICLE:
+		RETICLE.queue_free()
+	
+	RETICLE = load(reticle).instantiate()
+	RETICLE.character = self
+	$UserInterface.add_child(RETICLE)
+
+
 func _physics_process(delta):
 	current_speed = Vector3.ZERO.distance_to(get_real_velocity())
 	$UserInterface/DebugPanel.add_property("Speed", snappedf(current_speed, 0.001), 1)
diff --git a/addons/fpc/character.tscn b/addons/fpc/character.tscn
index c413333..bd0174e 100644
--- a/addons/fpc/character.tscn
+++ b/addons/fpc/character.tscn
@@ -1,7 +1,6 @@
-[gd_scene load_steps=21 format=3 uid="uid://cc1m2a1obsyn4"]
+[gd_scene load_steps=20 format=3 uid="uid://cc1m2a1obsyn4"]
 
 [ext_resource type="Script" path="res://addons/fpc/character.gd" id="1_0t4e8"]
-[ext_resource type="PackedScene" uid="uid://3mij3cjhkwsm" path="res://addons/fpc/reticles/reticle_1.tscn" id="2_uuexm"]
 [ext_resource type="Script" path="res://addons/fpc/debug.gd" id="3_x1wcc"]
 
 [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_kp17n"]
@@ -386,6 +385,7 @@ MarginContainer/constants/margin_top = 10
 
 [node name="Character" type="CharacterBody3D" node_paths=PackedStringArray("HEAD", "CAMERA", "HEADBOB_ANIMATION", "JUMP_ANIMATION", "CROUCH_ANIMATION", "COLLISION_MESH")]
 script = ExtResource("1_0t4e8")
+default_reticle = "res://addons/fpc/reticles/reticle_1.tscn"
 HEAD = NodePath("Head")
 CAMERA = NodePath("Head/Camera")
 HEADBOB_ANIMATION = NodePath("Head/HeadbobAnimation")
@@ -435,11 +435,6 @@ grow_horizontal = 2
 grow_vertical = 2
 mouse_filter = 1
 
-[node name="Reticle_1" parent="UserInterface" node_paths=PackedStringArray("reticle_lines", "character") instance=ExtResource("2_uuexm")]
-layout_mode = 1
-reticle_lines = [NodePath("top"), NodePath("left"), NodePath("right"), NodePath("bottom")]
-character = NodePath("../..")
-
 [node name="DebugPanel" type="PanelContainer" parent="UserInterface"]
 visible = false
 layout_mode = 0
@@ -460,5 +455,3 @@ layout_mode = 2
 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
 shape = SubResource("SphereShape3D_k4wwl")
 target_position = Vector3(0, 0.5, 0)
-
-[editable path="UserInterface/Reticle_1"]
diff --git a/addons/fpc/reticles/reticle_1.tscn b/addons/fpc/reticles/reticle_1.tscn
index 82081cf..bb83b83 100644
--- a/addons/fpc/reticles/reticle_1.tscn
+++ b/addons/fpc/reticles/reticle_1.tscn
@@ -73,7 +73,7 @@ func update_reticle_settings():
 	reticle_lines[3].points[1].y = line_length + line_distance
 "
 
-[node name="Reticle" type="CenterContainer"]
+[node name="Reticle" type="CenterContainer" node_paths=PackedStringArray("reticle_lines")]
 anchors_preset = 8
 anchor_left = 0.5
 anchor_top = 0.5
@@ -82,6 +82,7 @@ anchor_bottom = 0.5
 grow_horizontal = 2
 grow_vertical = 2
 script = SubResource("GDScript_a8kpl")
+reticle_lines = [NodePath("top"), NodePath("left"), NodePath("right"), NodePath("bottom")]
 
 [node name="dot" type="Polygon2D" parent="."]
 polygon = PackedVector2Array(-1, -1, 1, -1, 1, 1, -1, 1)