70 lines
1.7 KiB
GDScript
70 lines
1.7 KiB
GDScript
@tool
|
|
class_name TreasureChest extends Node2D
|
|
|
|
@export var item_data: ItemData :
|
|
set = set_item_data
|
|
@export var quantity: int = 1 :
|
|
set = set_quantity
|
|
|
|
@onready var item_sprite: Sprite2D = $ItemSprite
|
|
@onready var label: Label = $ItemSprite/Label
|
|
@onready var animation_player: AnimationPlayer = $AnimationPlayer
|
|
@onready var area: Area2D = $Area2D
|
|
@onready var is_open_save: PersistentDataHandler = $IsOpen
|
|
|
|
var is_open := false
|
|
|
|
func _ready() -> void:
|
|
update_texture()
|
|
update_label()
|
|
if Engine.is_editor_hint():
|
|
return
|
|
|
|
area.area_entered.connect(on_area_entered)
|
|
area.area_exited.connect(on_area_exited)
|
|
is_open_save.data_loaded.connect(set_chest_state)
|
|
set_chest_state()
|
|
|
|
func set_item_data(new_item_data: ItemData) -> void:
|
|
item_data = new_item_data
|
|
update_texture()
|
|
|
|
func set_quantity(new_quantity: int) -> void:
|
|
quantity = new_quantity
|
|
update_label()
|
|
|
|
func on_area_entered(_body: Area2D) -> void:
|
|
PlayerManager.interact_pressed.connect(on_player_interaction)
|
|
|
|
func on_area_exited(_body: Area2D) -> void:
|
|
PlayerManager.interact_pressed.disconnect(on_player_interaction)
|
|
|
|
func on_player_interaction() -> void:
|
|
if is_open:
|
|
return
|
|
is_open = true
|
|
is_open_save.set_value()
|
|
animation_player.play("open_chest")
|
|
if item_data and quantity > 0:
|
|
PlayerManager.INVENTORY_DATA.add_item(item_data, quantity)
|
|
else:
|
|
printerr("Chest has not items")
|
|
push_error("Chest has not items")
|
|
|
|
func update_texture() -> void:
|
|
if !item_data or !item_sprite:
|
|
return
|
|
item_sprite.texture = item_data.texture
|
|
|
|
func update_label() -> void:
|
|
if !label:
|
|
return
|
|
label.text = "x%d" % quantity if quantity > 1 else ""
|
|
|
|
func set_chest_state() -> void:
|
|
is_open = is_open_save.value
|
|
if is_open:
|
|
animation_player.play("opened")
|
|
else:
|
|
animation_player.play("closed")
|