44 lines
1.2 KiB
GDScript
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),.001,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()
|