2 class_name ProjectileModel
3 ## Base class for all projectile models
5 ## A projectile moves, can do damage, and can be hit. This model handles the movement,
6 ## collision layering and masking, hitboxes and hurtboxes
8 @onready var projectile: Projectile = $".."
9 @onready var hurtbox: Hurtbox = $Hurtbox
10 @onready var hitbox: Hitbox = $Hitbox
13 var last_movement_vector: Vector3:
15 last_movement_vector = v.normalized()
16 rotate_toward_last_movement_vector()
18 return last_movement_vector
20 var collision_layer: int = 1:
23 hitbox.set_collision_layer(collision_layer)
24 hurtbox.set_collision_layer(collision_layer)
26 return collision_layer
28 var collision_mask: int = 1:
31 hitbox.set_collision_mask(collision_mask)
32 hurtbox.set_collision_mask(collision_mask)
37 func _ready() -> void:
38 hurtbox.weapon = projectile.weapon
39 hurtbox.is_attacking = true
41 # manually set this to be the direction projectile is facing
42 if not last_movement_vector:
43 last_movement_vector = Vector3.BACK.rotated(Vector3.UP, projectile.global_rotation.y)
46 func rotate_toward_last_movement_vector():
47 var target_angle := Vector3.BACK.signed_angle_to(last_movement_vector, Vector3.UP)
48 global_rotation.y = target_angle
51 func update(delta: float) -> void:
52 if (global_position - projectile.global_position).length() > projectile.max_range:
53 projectile.queue_free()
55 global_position = lerp(
57 global_position + projectile.speed * last_movement_vector,