class_name Projectile
-@export var speed := 20.0
+## Linear speed of the projectile
+@export var speed := 10.0
+
+## Direction the projectile will travel in
+@export var direction: Vector3:
+ set(v):
+ model.last_movement_vector = v
+ get:
+ return model.last_movement_vector
+
+## Maximum distance from the origin point that the projectile will travel
@export var max_range := 30.0
-var last_movement_direction: Vector3
+## Weapon which emitted the projectile
var weapon: Weapon
-var collision_layer: int = 1
-var collision_mask: int = 1
-var _origin: Vector3
+## Collision layer for projectile
+var collision_layer: int:
+ set(c):
+ model.collision_layer = c
+ get:
+ return model.collision_layer
+
-@onready var hurtbox: Hurtbox = $Model/Hurtbox
+## Collision mask for projectile
+var collision_mask: int:
+ set(c):
+ model.collision_mask = c
+ get:
+ return model.collision_mask
-func _ready() -> void:
- if last_movement_direction:
- last_movement_direction = last_movement_direction.normalized()
- else:
- last_movement_direction = Vector3.BACK.rotated(Vector3.UP, global_rotation.y)
-
- hurtbox.weapon = weapon
- hurtbox.is_attacking = true
- hurtbox.set_collision_layer(collision_layer)
- hurtbox.set_collision_mask(collision_mask)
- _origin = global_position
-
- # TODO: if projectile gets reflected, this must be recalculated!
- var target_angle := Vector3.BACK.signed_angle_to(last_movement_direction, Vector3.UP)
- global_rotate(Vector3.UP, target_angle)
+@onready var model: ProjectileModel = $Model
func _process(delta: float) -> void:
- if (global_position - _origin).length() > max_range:
- queue_free()
- else:
- global_position = lerp(
- global_position,
- global_position + speed * last_movement_direction,
- delta
- )
+ model.update(delta)