62 lines
1.6 KiB
GDScript
62 lines
1.6 KiB
GDScript
extends RigidBody3D
|
|
class_name Chest
|
|
|
|
@export var weapon_drops : Array[Resource]
|
|
@export var health : float = 30
|
|
@export var outline_meshes : Array[MeshInstance3D]
|
|
@onready var serial_label: Label3D = $chest_lid/serial_number
|
|
|
|
var serial_number
|
|
var open = false
|
|
var drop_weapon
|
|
|
|
@onready var anim_player: AnimationPlayer = $AnimationPlayer
|
|
@onready var item_spawn: RayCast3D = $itemspawn
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
drop_weapon = weapon_drops.pick_random().instantiate()
|
|
if serial_number == null:
|
|
serial_number = GameGlobals.chests_spawned
|
|
GameGlobals.chests_spawned += 1
|
|
serial_label.text = "#" + str(serial_number).pad_zeros(4)
|
|
|
|
func hit(dam):
|
|
health -= dam
|
|
if !open and health <= 0:
|
|
open_chest()
|
|
|
|
func open_chest():
|
|
anim_player.play("open")
|
|
if outline_meshes != null:
|
|
for i in outline_meshes:
|
|
i.visible = false
|
|
open = true
|
|
|
|
func spawn_drop():
|
|
drop_weapon.position = item_spawn.global_position
|
|
drop_weapon.transform.basis = item_spawn.global_transform.basis
|
|
drop_weapon.scale = Vector3(1,1,1)
|
|
drop_weapon.linear_velocity += Vector3(0,0,-5.0) * item_spawn.global_transform.basis
|
|
get_tree().current_scene.add_child(drop_weapon)
|
|
|
|
func interact():
|
|
hit(1)
|
|
|
|
func save():
|
|
var save_dict = {
|
|
"filename" : get_scene_file_path(),
|
|
"parent" : get_parent().get_path(),
|
|
"pos_x" : position.x,
|
|
"pos_y" : position.y,
|
|
"pos_z" : position.z,
|
|
"rot_x" : rotation.x,
|
|
"rot_y" : rotation.y,
|
|
"rot_z" : rotation.z,
|
|
"drop_weapon" : drop_weapon,
|
|
"health" : health,
|
|
"serial_number" : serial_number
|
|
}
|
|
return save_dict
|