mtd/Scripts/Towers/tower.gd

81 lines
2.0 KiB
GDScript

class_name Tower extends Node3D
@export var stats: CardText
@export var target_finder: TargetFinder
@export var animator: AnimationPlayer
@export var pitch_model: MeshInstance3D
@export var yaw_model: MeshInstance3D
@export var range_indicator: CSGSphere3D
@export var audio_player: AudioStreamPlayer3D
var owner_id: int
var damage_particle_scene: PackedScene = preload("res://Scenes/damage_particle.tscn")
var base_name: String
#var targeted_enemy: EnemyController
var time_since_firing: float = 0.0
var time_between_shots: float = 0.0
var damage: float = 0.0
var target_range: float = 0.0
func _ready() -> void:
time_between_shots = stats.get_attribute("Fire Delay")
damage = stats.get_attribute("Damage")
target_range = stats.get_attribute("Range")
range_indicator.radius = target_range
func preview_range(value: bool) -> void:
range_indicator.set_visible(value)
func _process(delta: float) -> void:
if !is_multiplayer_authority():
return
if time_since_firing < time_between_shots:
time_since_firing += delta
func _physics_process(_delta: float) -> void:
if !is_multiplayer_authority():
#only doing the graphical sort of stuff but not shoot logic
if target_finder.get_target():
aim()
return
if target_finder.get_target():
aim()
if time_since_firing >= time_between_shots:
time_since_firing -= time_between_shots
shoot()
func aim() -> void:
yaw_model.look_at(target_finder.get_target().global_position)
pitch_model.look_at(target_finder.get_target().global_position)
pitch_model.rotation.x = 0.0
func shoot() -> void:
animator.play("shoot")
audio_player.play()
if is_multiplayer_authority():
networked_shoot.rpc()
func spawn_damage_indicator(pos: Vector3) -> void:
if damage > 0:
var marker: Sprite3D = damage_particle_scene.instantiate()
get_tree().root.add_child(marker)
marker.set_number(damage)
marker.position = pos
@rpc("reliable")
func networked_shoot() -> void:
shoot()
#@rpc("reliable")
#func networked_acquire_target(target_node_path: String) -> void:
#targeted_enemy = get_tree().root.get_node(target_node_path)