fix: 3rd person and first person views

This commit is contained in:
DottsGit
2026-06-06 11:51:28 -04:00
parent 909b25548c
commit 3488b8e005
3 changed files with 124 additions and 11 deletions
+56
View File
@@ -167,6 +167,50 @@ func update_state(state: String, speed: float, is_crouching: bool = false) -> vo
if is_crouching and current_state == "ground":
current_state = "crouch"
var is_holding_weapon: bool = false
func set_weapon(script_path: String) -> void:
# Clear existing weapons from root_pivot
for child in root_pivot.get_children():
if child.has_meta("is_third_person_weapon"):
child.queue_free()
if script_path == "":
is_holding_weapon = false
return
is_holding_weapon = true
var script = load(script_path)
if not script:
return
var w = script.new()
w.name = "ThirdPersonWeapon"
w.set_meta("is_third_person_weapon", true)
# Connect to ready so we can override the weapon's own _ready() calls
w.ready.connect(func():
w.set_process(false)
w.set_process_input(false)
if shadows_only:
_set_shadows_recursive(w)
# Force position after the weapon's _build_model() sets it for 1st person
# root_pivot is rotated 180 deg around Y, so local +Z is FORWARD and local -X is RIGHT
w.position = Vector3(-0.15, 1.0, 0.4)
w.rotation_degrees = Vector3(0, 180, 0)
)
# Attach to root_pivot so it stays steady and points perfectly forward
root_pivot.add_child(w)
func _set_shadows_recursive(node: Node) -> void:
if node is GeometryInstance3D:
node.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_SHADOWS_ONLY
for child in node.get_children():
_set_shadows_recursive(child)
func _process(delta: float) -> void:
var anim_speed = 1.0
if current_state == "ground" and movement_speed > 1.0:
@@ -319,6 +363,18 @@ func _process(delta: float) -> void:
t_calf_l_rot.x = 0.0
t_thigh_r_rot.x = deg_to_rad(10)
t_calf_r_rot.x = 0.0
# Override right arm (and left) if holding a weapon
if is_holding_weapon and current_state != "death":
# Pose the right arm to look like it's holding the weapon handle
t_upper_arm_r_rot.x = -0.6
t_upper_arm_r_rot.z = 0.15
t_lower_arm_r_rot.x = -1.0
# Pose the left arm to look like it's holding the foregrip
t_upper_arm_l_rot.x = -0.5
t_upper_arm_l_rot.z = -0.15
t_lower_arm_l_rot.x = -1.1
var lerp_speed = 40.0 * delta
root_pivot.position = root_pivot.position.lerp(t_root_pos, lerp_speed)