74 lines
1.4 KiB
GDScript
74 lines
1.4 KiB
GDScript
extends Sprite3D
|
|
class_name Weapon
|
|
|
|
@export var stats : WeaponStats
|
|
@export var hero : Hero
|
|
|
|
var cooldown := 0.0
|
|
var other_cooldown := 0.0
|
|
var trigger_held := false
|
|
var second_trigger_held := false
|
|
|
|
|
|
func _ready() -> void:
|
|
cooldown = 1.0 / stats.fire_rate
|
|
$RayCast3D.target_position = Vector3(0, 0, -stats.fire_range)
|
|
|
|
|
|
func set_raycast_origin(node):
|
|
$RayCast3D.global_position = node.global_position
|
|
|
|
|
|
func set_hero(value):
|
|
hero = value
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
if stats != null:
|
|
other_cooldown -= delta
|
|
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
if trigger_held:
|
|
shoot()
|
|
|
|
|
|
func hold_trigger():
|
|
trigger_held = true
|
|
|
|
|
|
func release_trigger():
|
|
trigger_held = false
|
|
|
|
|
|
func hold_second_trigger():
|
|
second_trigger_held = true
|
|
|
|
|
|
func release_second_trigger():
|
|
second_trigger_held = false
|
|
|
|
|
|
func shoot():
|
|
if other_cooldown <= 0 and stats != null:
|
|
other_cooldown = cooldown
|
|
$AnimationPlayer.play("shoot")
|
|
if $RayCast3D.is_colliding():
|
|
var target = $RayCast3D.get_collider()
|
|
if target != null:
|
|
var target_hitbox = target.shape_owner_get_owner($RayCast3D.get_collider_shape())
|
|
if target_hitbox is Hitbox:
|
|
target_hitbox.damage(stats.damage)
|
|
networked_hit.rpc(get_tree().root.get_path_to(target_hitbox))
|
|
|
|
|
|
@rpc
|
|
func networked_shoot():
|
|
$AnimationPlayer.play("shoot")
|
|
|
|
|
|
@rpc("reliable")
|
|
func networked_hit(target_node_path : String):
|
|
var target_node = get_tree().root.get_node(target_node_path)
|
|
target_node.damage(stats.damage)
|