]> purplebirdman git - frog-ninja.git/blob - asset/projectile/projectile_model.gd
Squashed commit of the following:
[frog-ninja.git] / asset / projectile / projectile_model.gd
1 extends Node3D
2 class_name ProjectileModel
3 ## Base class for all projectile models
4 ##
5 ## A projectile moves, can do damage, and can be hit. This model handles the movement,
6 ## collision layering and masking, hitboxes and hurtboxes
7
8 @onready var projectile: Projectile = $".."
9 @onready var hurtbox: Hurtbox = $Hurtbox
10 @onready var hitbox: Hitbox = $Hitbox
11
12
13 var last_movement_vector: Vector3:
14         set(v):
15                 last_movement_vector = v.normalized()
16                 rotate_toward_last_movement_vector()
17         get:
18                 return last_movement_vector
19
20 var collision_layer: int = 1:
21         set(c):
22                 collision_layer = c
23                 hitbox.set_collision_layer(collision_layer)
24                 hurtbox.set_collision_layer(collision_layer)
25         get:
26                 return collision_layer
27
28 var collision_mask: int = 1:
29         set(c):
30                 collision_mask = c
31                 hitbox.set_collision_mask(collision_mask)
32                 hurtbox.set_collision_mask(collision_mask)
33         get:
34                 return collision_mask
35
36
37 func _ready() -> void:
38         hurtbox.weapon = projectile.weapon
39         hurtbox.is_attacking = true
40         
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)
44
45
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
49
50
51 func update(delta: float) -> void:
52         if (global_position - projectile.global_position).length() > projectile.max_range:
53                 projectile.queue_free()
54         else:
55                 global_position = lerp(
56                         global_position, 
57                         global_position + projectile.speed * last_movement_vector, 
58                         delta
59                         )