Godot Version
4.5
Question
So i have a grapple and want to make it so it only works when looks at a specific “grapplezone” and I’m curious how to do that im assuming if i and an “and ray.iscolliding (with specific thing)” to the end of the input pressed what do you suggest???
extends Node
@export var ray: RayCast3D
@export var rest_length = 2.0
@export var stiffness = 10.0
@export var damping = 1.0
@export var rope: Node3D
@onready var player: RigidBody3D = get_parent()
var target: Vector3
var grappling = false
func _physics_process(delta: float) -> void:
if Input.is_action_just_pressed("grapple"):
launch()
if Input.is_action_just_released("grapple"):
retract()
if grappling:
handle_grapple(delta)
update_rope()
func launch():
if ray.is_colliding():
target = ray.get_collision_point()
grappling = true
func retract():
grappling = false
func handle_grapple(delta: float):
var target_dir = player.global_position.direction_to(target)
var target_dist = player.global_position.distance_to(target)
var displacement = target_dist - rest_length
var force = Vector3.ZERO
if displacement > 0:
var spring_force_magnitude = stiffness * displacement
var spring_force = target_dir * spring_force_magnitude
var vel_dot = player.linear_velocity.dot(target_dir)
@warning_ignore("confusable_local_usage", "shadowed_variable")
var damping = -damping * vel_dot * target_dir
force = spring_force + damping
player.linear_velocity += force * delta
func update_rope():
if !grappling:
rope.visible = false
return
rope.visible = true
var dist = player.global_position.distance_to(target)
rope.look_at(target)
rope.scale = Vector3(1, 1, dist)
