81 lines
2.5 KiB
GDScript
81 lines
2.5 KiB
GDScript
@tool
|
|
extends Node3D
|
|
class_name Inventory3D
|
|
|
|
const INVENTORY_OBJECT_SIZE = 0.2
|
|
const SEPARATOR_SIZE = 0.1
|
|
|
|
@export var inventory_item_scene: PackedScene
|
|
@export var bar: TextureRect
|
|
|
|
@export var no_tools : bool = false
|
|
|
|
@export var test_inventory : Inventory
|
|
|
|
var last_n_tools = -1
|
|
var inventory_item_objects: Array[InventoryItem3D] = []
|
|
|
|
@export_tool_button("Test Update", "Callable") var update_action = func() : update(test_inventory)
|
|
|
|
func _ready():
|
|
if not Engine.is_editor_hint():
|
|
GameInfo.game_data.player_data.inventory.updated.connect(update)
|
|
update(GameInfo.game_data.player_data.inventory)
|
|
|
|
func update(inventory : Inventory):
|
|
|
|
var items = inventory.items
|
|
if no_tools:
|
|
items = items.slice(inventory.n_tools, len(items))
|
|
|
|
if len(items) != len(inventory_item_objects) or last_n_tools != inventory.n_tools:
|
|
create_inventory_objects(inventory)
|
|
for i in range(len(items)):
|
|
var item : Item= items[i]
|
|
var object : InventoryItem3D = inventory_item_objects[i]
|
|
object.item = items[i]
|
|
|
|
if not no_tools:
|
|
if inventory.current_item_ind == i:
|
|
object.state = (
|
|
InventoryItem3D.State.TOOL if i < inventory.n_tools
|
|
else InventoryItem3D.State.ITEM
|
|
)
|
|
else:
|
|
object.state = InventoryItem3D.State.BLACK
|
|
|
|
|
|
func create_inventory_objects(inventory : Inventory):
|
|
for c in %Items3D.get_children():
|
|
c.queue_free()
|
|
last_n_tools = inventory.n_tools
|
|
|
|
inventory_item_objects = []
|
|
|
|
var items = inventory.items
|
|
if no_tools:
|
|
items = items.slice(inventory.n_tools, len(items))
|
|
|
|
for i in range(len(items)):
|
|
var new_inventory_object := (inventory_item_scene.instantiate() as InventoryItem3D)
|
|
%Items3D.add_child(new_inventory_object)
|
|
new_inventory_object.position.x = -INVENTORY_OBJECT_SIZE * i
|
|
if i >= inventory.n_tools and not no_tools:
|
|
new_inventory_object.position.x -= SEPARATOR_SIZE
|
|
inventory_item_objects.append(new_inventory_object)
|
|
|
|
%ItemSeparator.visible = not no_tools
|
|
if no_tools:
|
|
%Items3D.position.x = (
|
|
(len(inventory_item_objects) - 1) * INVENTORY_OBJECT_SIZE
|
|
) / 2
|
|
else:
|
|
%Items3D.position.x = (
|
|
(len(inventory_item_objects) - 1) * INVENTORY_OBJECT_SIZE + SEPARATOR_SIZE
|
|
) / 2
|
|
%ItemSeparator.position.x = (
|
|
%Items3D.position.x
|
|
- (inventory.n_tools) * INVENTORY_OBJECT_SIZE
|
|
+ SEPARATOR_SIZE/2
|
|
)
|