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) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass 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