Files
DailyDungeon/Scripts/arrow.gd
2025-06-27 14:02:22 -05:00

44 lines
1.2 KiB
GDScript

extends Projectile
class_name Arrow
@onready var hit_ray: RayCast3D = $HitRay
@onready var land_depth: Marker3D = $LandDepth
@onready var arrow: MeshInstance3D = $Arrow
@onready var pickup_collision: Area3D = $PickupCollision
var follow_target
var spawn_out = false
const SPEED_DRAIN_RATE : float = 10.0
func _ready() -> void:
pickup_collision.monitorable = false
func _physics_process(delta: float) -> void:
if !despawn:
if hit_ray.is_colliding():
despawn = true
var body_hit = hit_ray.get_collider()
if body_hit is EnemyCharacter:
body_hit.hit(damage)
reparent(body_hit)
var stick_point = hit_ray.get_collision_point()
if land_depth.global_position.distance_to(stick_point) > .2:
arrow_move(delta)
else:
arrow_move(delta)
else:
pickup_collision.monitorable = true
pickup_follow(delta)
func arrow_move(delta):
current_speed = clamp(current_speed - (delta * SPEED_DRAIN_RATE),0,1000)
var applied_gravity = -9.8 * ((start_speed - current_speed) / current_speed)
global_position += global_transform.basis * Vector3(0,applied_gravity,-current_speed) * delta
func pickup_follow(delta):
if follow_target != null:
follow_target.arrows += 1
queue_free()