extends Node3D class_name ProjectileModel ## Base class for all projectile models ## ## A projectile moves, can do damage, and can be hit. This model handles the movement, ## collision layering and masking, hitboxes and hurtboxes @onready var projectile: Projectile = $".." @onready var hurtbox: Hurtbox = $Hurtbox @onready var hitbox: Hitbox = $Hitbox var last_movement_vector: Vector3: set(v): last_movement_vector = v.normalized() rotate_toward_last_movement_vector() get: return last_movement_vector var collision_layer: int = 1: set(c): collision_layer = c hitbox.set_collision_layer(collision_layer) hurtbox.set_collision_layer(collision_layer) get: return collision_layer var collision_mask: int = 1: set(c): collision_mask = c hitbox.set_collision_mask(collision_mask) hurtbox.set_collision_mask(collision_mask) get: return collision_mask func _ready() -> void: hurtbox.weapon = projectile.weapon hurtbox.is_attacking = true # manually set this to be the direction projectile is facing if not last_movement_vector: last_movement_vector = Vector3.BACK.rotated(Vector3.UP, projectile.global_rotation.y) func rotate_toward_last_movement_vector(): var target_angle := Vector3.BACK.signed_angle_to(last_movement_vector, Vector3.UP) global_rotation.y = target_angle func update(delta: float) -> void: if (global_position - projectile.global_position).length() > projectile.max_range: projectile.queue_free() else: global_position = lerp( global_position, global_position + projectile.speed * last_movement_vector, delta )