diff --git a/README.md b/README.md index 665374e49..becf1e083 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ New here? Read our new [Documentation](https://expressobits.com/inventory-system ✔️ Multiplayer compatible (Including example). ✔️ Loot System (https://github.com/expressobits/inventory-system/issues/152). - + ✔️ Hotbar. ✔️ Craft System. @@ -70,7 +70,7 @@ The grid system and its UI were based on this repository. ## CMake support ### git submodule setup in main repository -`git submodule init` +`git submodule init` `git submodule update` ### cmake configure in main repository diff --git a/addons/inventory-system-demos/character/character_inventory_system.gd b/addons/inventory-system-demos/character/character_inventory_system.gd index 4d6792f98..67635d316 100644 --- a/addons/inventory-system-demos/character/character_inventory_system.gd +++ b/addons/inventory-system-demos/character/character_inventory_system.gd @@ -124,6 +124,7 @@ func inventory_inputs(): if not is_any_station_or_inventory_opened(): open_main_craft_station() + func pick_to_inventory(node : Node): if main_inventory == null: return @@ -145,6 +146,7 @@ func pick_to_inventory(node : Node): printerr("pick_to_inventory return false"); + func transfer(inventory: GridInventory, origin_pos: Vector2i, destination: GridInventory, amount: int): var stack_index = inventory.get_stack_index_at(origin_pos) if stack_index == -1: @@ -184,12 +186,10 @@ func drop_all_items(): main_inventory.drop_all_stacks() equipment_inventory.drop_all_stacks() -#endregion #region Crafter func craft(craft_station : CraftStation, recipe_index : int): craft_station.craft(recipe_index) - #endregion #region Hotbar @@ -226,6 +226,7 @@ func hotbar_next_item(): func is_open_inventory(inventory : Inventory): return opened_inventories.find(inventory) != -1 + func open_inventory(inventory : Inventory): if is_open_inventory(inventory): return @@ -239,6 +240,7 @@ func add_open_inventory(inventory : Inventory): #inventory.request_drop_obj.connect(_on_request_drop_obj) open_main_inventory() + func open_main_inventory(): open_inventory(main_inventory) @@ -265,6 +267,7 @@ func close_inventories(): func is_open_any_inventory(): return !opened_inventories.is_empty() + func is_open_main_inventory(): return is_open_inventory(main_inventory) #endregion @@ -307,6 +310,7 @@ func close_craft_stations(): for index in range(opened_stations.size() - 1, -1, -1): close_station(opened_stations[index]) + func is_open_any_station(): return !opened_stations.is_empty() #endregion diff --git a/addons/inventory-system-demos/character/networked_openable.gd b/addons/inventory-system-demos/character/networked_openable.gd index fccfbc179..ddeb847a0 100644 --- a/addons/inventory-system-demos/character/networked_openable.gd +++ b/addons/inventory-system-demos/character/networked_openable.gd @@ -16,6 +16,7 @@ func _on_connected(id): if is_open: _opened_rpc.rpc_id(id) + func _on_opened(character : Node): if not multiplayer.is_server(): return diff --git a/addons/inventory-system-demos/character/openable.gd b/addons/inventory-system-demos/character/openable.gd index 323f3a192..c93414d14 100644 --- a/addons/inventory-system-demos/character/openable.gd +++ b/addons/inventory-system-demos/character/openable.gd @@ -8,6 +8,7 @@ signal closed(character : Node) var characters : Array[Node] = [] + func open(character : Node): if is_open: return @@ -15,6 +16,7 @@ func open(character : Node): is_open = true opened.emit(character) + func close(character : Node): if !is_open: return diff --git a/addons/inventory-system-demos/character/placeable_hand_item_3d.gd b/addons/inventory-system-demos/character/placeable_hand_item_3d.gd index 13dfb92ae..8dab728f6 100644 --- a/addons/inventory-system-demos/character/placeable_hand_item_3d.gd +++ b/addons/inventory-system-demos/character/placeable_hand_item_3d.gd @@ -13,6 +13,7 @@ var interactor : Interactor var preview : Node3D + func _ready(): preview = self.duplicate(0) preview.rotation = Vector3.ZERO diff --git a/addons/inventory-system-demos/fps/box_inventory.gd b/addons/inventory-system-demos/fps/box_inventory.gd index 8faae1357..62f9c7187 100644 --- a/addons/inventory-system-demos/fps/box_inventory.gd +++ b/addons/inventory-system-demos/fps/box_inventory.gd @@ -13,6 +13,7 @@ func _ready(): openable.opened.connect(_on_openable_opened) inventory.grid_constraints = constraints + func get_inventory() -> Inventory: return $Inventory diff --git a/addons/inventory-system-demos/fps/constraints/category_grid_inventory_constraint.gd b/addons/inventory-system-demos/fps/constraints/category_grid_inventory_constraint.gd index 36aa078ff..c8c0aea8f 100644 --- a/addons/inventory-system-demos/fps/constraints/category_grid_inventory_constraint.gd +++ b/addons/inventory-system-demos/fps/constraints/category_grid_inventory_constraint.gd @@ -5,6 +5,7 @@ class_name CategoryGridInventoryConstraint @export var is_only_one_category_for_slots: bool @export var one_category_for_slots: String + func _can_add_on_position(inventory: Node, position: Vector2i, item_id: String, _amount: int, _properties: Dictionary, _is_rotated: bool): var def: ItemDefinition = inventory.database.get_item(item_id) if def == null: @@ -34,6 +35,7 @@ func contains_category(def: ItemDefinition, category: String): else: return true + func get_category(position: Vector2i) -> String: if is_only_one_category_for_slots: return one_category_for_slots diff --git a/addons/inventory-system-demos/fps/constraints/stack_size_constraint.gd b/addons/inventory-system-demos/fps/constraints/stack_size_constraint.gd index 4f4a20245..31ccea512 100644 --- a/addons/inventory-system-demos/fps/constraints/stack_size_constraint.gd +++ b/addons/inventory-system-demos/fps/constraints/stack_size_constraint.gd @@ -3,11 +3,13 @@ class_name StackSizeConstraint @export var max_size_stack: int = 2 + func _can_add_new_stack_on_inventory(inventory: Node, _item_id: String, _amount: int, _properties: Dictionary) -> bool: if inventory.stacks.size() >= max_size_stack: return false return true + func _get_max_stack(_inventory: Node, item_id: String, _amount: int, _properties: Dictionary, max_stack: int) -> int: if item_id == "wood": return 32 diff --git a/addons/inventory-system-demos/fps/fps_demo.gd b/addons/inventory-system-demos/fps/fps_demo.gd index 88b2cc840..81633310b 100644 --- a/addons/inventory-system-demos/fps/fps_demo.gd +++ b/addons/inventory-system-demos/fps/fps_demo.gd @@ -5,6 +5,7 @@ extends Node var main_inventory : Inventory + func _ready(): $"UI/Inventory System UI".setup($"Player/CharacterInventorySystem") main_inventory = $"Player/CharacterInventorySystem".main_inventory @@ -13,7 +14,7 @@ func _ready(): main_inventory.add("wood", 16) main_inventory.add("stone", 8) -# + func _process(_delta): pass if Input.is_action_just_released("add_item_a"): diff --git a/addons/inventory-system-demos/fps/props/shelf.gd b/addons/inventory-system-demos/fps/props/shelf.gd index 8d5264824..f8a68f947 100644 --- a/addons/inventory-system-demos/fps/props/shelf.gd +++ b/addons/inventory-system-demos/fps/props/shelf.gd @@ -28,6 +28,7 @@ func get_interaction_position(interaction_point : Vector3) -> Vector3: slot_index = i return near_position + func interact_with_slot(character : Node, action_index : int = 0, actual_slot_index := 0): if openable.is_open: return @@ -49,6 +50,7 @@ func interact_with_slot(character : Node, action_index : int = 0, actual_slot_in char_inventory.transfer_at(char_slot_index, inventory, actual_slot_index) return + func interact(character : Node, action_index : int = 0): interact_with_slot(character, action_index, slot_index) diff --git a/addons/inventory-system-demos/fps/use_items_example.gd b/addons/inventory-system-demos/fps/use_items_example.gd index 7602edc8b..557988016 100644 --- a/addons/inventory-system-demos/fps/use_items_example.gd +++ b/addons/inventory-system-demos/fps/use_items_example.gd @@ -3,6 +3,7 @@ extends Node3D @export var hotbar : Hotbar + func use_item_selected_in_hotbar(): var stack : ItemStack = hotbar.get_stack_on_selection() if stack == null: diff --git a/addons/inventory-system-demos/fps/workbench.gd b/addons/inventory-system-demos/fps/workbench.gd index 469e95c39..79b0c2fc2 100644 --- a/addons/inventory-system-demos/fps/workbench.gd +++ b/addons/inventory-system-demos/fps/workbench.gd @@ -30,8 +30,10 @@ func interact(_character : Node, action_index : int = 0): else: self.rotate(Vector3.UP, 90) + func open(_character : Node): openable.open(_character) + func close(_character : Node): openable.close(_character) diff --git a/addons/inventory-system-demos/mp/dropped_item_spawner.gd b/addons/inventory-system-demos/mp/dropped_item_spawner.gd index 535001c48..48880aab8 100644 --- a/addons/inventory-system-demos/mp/dropped_item_spawner.gd +++ b/addons/inventory-system-demos/mp/dropped_item_spawner.gd @@ -6,6 +6,7 @@ extends MultiplayerSpawner @export var database : InventoryDatabase + func _init(): spawn_function = _spawn_custom diff --git a/addons/inventory-system-demos/mp/lag_test.gd b/addons/inventory-system-demos/mp/lag_test.gd index 3e96d06c5..e6e3dba48 100644 --- a/addons/inventory-system-demos/mp/lag_test.gd +++ b/addons/inventory-system-demos/mp/lag_test.gd @@ -3,6 +3,7 @@ class_name LagTest @export var actived := false + func _process(_delta: float) -> void: if not actived: return diff --git a/addons/inventory-system-demos/mp/mp_demo.gd b/addons/inventory-system-demos/mp/mp_demo.gd index cbd22fd0a..bab7ed5df 100644 --- a/addons/inventory-system-demos/mp/mp_demo.gd +++ b/addons/inventory-system-demos/mp/mp_demo.gd @@ -7,6 +7,7 @@ var connected_peer_ids : Array var players : Array var peer : ENetMultiplayerPeer + func _ready(): multiplayer.peer_connected.connect(_player_connected) multiplayer.peer_disconnected.connect(_player_disconnected) diff --git a/addons/inventory-system-demos/mp/networked_box_inventory.gd b/addons/inventory-system-demos/mp/networked_box_inventory.gd index 85f82f96e..695d4f7d2 100644 --- a/addons/inventory-system-demos/mp/networked_box_inventory.gd +++ b/addons/inventory-system-demos/mp/networked_box_inventory.gd @@ -1,12 +1,14 @@ extends BoxInventory class_name NetworkedBoxInventory + func interact(character : Node, _action_index : int = 0): if multiplayer.is_server(): interact_rpc(character.get_path(), _action_index) else: interact_rpc.rpc_id(1, character.get_path(), _action_index) + @rpc("any_peer") func interact_rpc(character_path : NodePath, _action_index : int = 0): super.interact(get_node(character_path), _action_index) diff --git a/addons/inventory-system-demos/mp/networked_campfire.gd b/addons/inventory-system-demos/mp/networked_campfire.gd index 4df566648..13d8016f6 100644 --- a/addons/inventory-system-demos/mp/networked_campfire.gd +++ b/addons/inventory-system-demos/mp/networked_campfire.gd @@ -37,6 +37,7 @@ func interact(character : Node, _action_index : int = 0): else: interact_rpc.rpc_id(1, character.get_path(), _action_index) + @rpc("any_peer") func interact_rpc(character_path : NodePath, _action_index : int = 0): super.interact(get_node(character_path), _action_index) diff --git a/addons/inventory-system-demos/mp/networked_shelf.gd b/addons/inventory-system-demos/mp/networked_shelf.gd index 625f581c8..f90adf416 100644 --- a/addons/inventory-system-demos/mp/networked_shelf.gd +++ b/addons/inventory-system-demos/mp/networked_shelf.gd @@ -8,6 +8,7 @@ func interact(character : Node, action_index : int = 0): else: interact_rpc(character.get_path(), action_index, slot_index) + @rpc("any_peer") @warning_ignore("shadowed_variable_base_class") func interact_rpc(character_node_path : NodePath, action_index : int, slot_index): diff --git a/addons/inventory-system-demos/mp/networked_workbench.gd b/addons/inventory-system-demos/mp/networked_workbench.gd index b855645c6..d561574d7 100644 --- a/addons/inventory-system-demos/mp/networked_workbench.gd +++ b/addons/inventory-system-demos/mp/networked_workbench.gd @@ -8,6 +8,7 @@ func interact(character : Node, _action_index : int = 0): else: interact_rpc.rpc_id(1, character.get_path(), _action_index) + @rpc("any_peer") func interact_rpc(character_path : NodePath, _action_index : int = 0): super.interact(get_node(character_path), _action_index) diff --git a/addons/inventory-system-demos/mp/sync_craft_station.gd b/addons/inventory-system-demos/mp/sync_craft_station.gd index 59528b612..1c86a3bfa 100644 --- a/addons/inventory-system-demos/mp/sync_craft_station.gd +++ b/addons/inventory-system-demos/mp/sync_craft_station.gd @@ -31,7 +31,6 @@ func _on_crafting_added(crafting_index : int): craftings_data.append(crafting.serialize()) - func _on_crafting_removed(crafting_index : int): if not multiplayer.is_server(): return @@ -58,12 +57,14 @@ func crafting_added_rpc(recipe_index : int): var recipe = craft_station.database.recipes[recipe_index] craft_station.add_crafting(recipe_index, recipe) + @rpc func crafting_removed_rpc(crafting_index : int): if multiplayer.is_server(): return craft_station.remove_crafting(crafting_index) + @rpc @warning_ignore("shadowed_variable") func _update_craftings_rpc(craftings_data : Array): @@ -73,10 +74,12 @@ func _update_craftings_rpc(craftings_data : Array): crafting.deserialize(data) craft_station.craftings.append(crafting) + @rpc func input_inventory_added_rpc(inventory_path : NodePath): craft_station.add_input_inventory(craft_station.get_node(inventory_path)) + @rpc func input_inventory_removed_rpc(inventory_path : NodePath): craft_station.remove_input_inventory(craft_station.get_node(inventory_path)) diff --git a/addons/inventory-system-demos/mp/sync_grid_inventory.gd b/addons/inventory-system-demos/mp/sync_grid_inventory.gd index 198aa8773..5f522a173 100644 --- a/addons/inventory-system-demos/mp/sync_grid_inventory.gd +++ b/addons/inventory-system-demos/mp/sync_grid_inventory.gd @@ -19,6 +19,7 @@ extends Node ## ## Note: Slot categories are not synced + func _ready(): if Engine.is_editor_hint(): return @@ -36,7 +37,6 @@ func setup(): inventory.stack_removed.connect(_on_stack_removed) - func _on_contents_changed(): if not multiplayer.is_server(): return @@ -98,6 +98,7 @@ func _updated_slot_rpc(stack_index : int, slot_data : Array): stack.deserialize(slot_data) inventory.updated_stack.emit(stack_index) + @rpc func _stack_removed_rpc(stack_index : int): if multiplayer.is_server(): diff --git a/addons/inventory-system-demos/tests/test_suite.gd b/addons/inventory-system-demos/tests/test_suite.gd index 148453787..f32fb86b8 100644 --- a/addons/inventory-system-demos/tests/test_suite.gd +++ b/addons/inventory-system-demos/tests/test_suite.gd @@ -25,8 +25,8 @@ func cleanup_suite() -> void: # Called before a unit test is run func init_test() -> void: pass - - + + # Called after a unit test is run func cleanup_test() -> void: pass diff --git a/addons/inventory-system-demos/tutorials/tutorial_02_simple_ui/inventory_tutorial.gd b/addons/inventory-system-demos/tutorials/tutorial_02_simple_ui/inventory_tutorial.gd index a1ebf6ff8..49a948ecb 100644 --- a/addons/inventory-system-demos/tutorials/tutorial_02_simple_ui/inventory_tutorial.gd +++ b/addons/inventory-system-demos/tutorials/tutorial_02_simple_ui/inventory_tutorial.gd @@ -20,6 +20,7 @@ func _process(_delta: float): inventory.remove(item_id, 1) print_inventory() + func print_inventory(): print("Inventory Items:") for item in inventory.stacks: diff --git a/addons/inventory-system-demos/tutorials/tutorial_03_transfer_inventories/inventory_tutorial.gd b/addons/inventory-system-demos/tutorials/tutorial_03_transfer_inventories/inventory_tutorial.gd index cbe664e44..366f92e8c 100644 --- a/addons/inventory-system-demos/tutorials/tutorial_03_transfer_inventories/inventory_tutorial.gd +++ b/addons/inventory-system-demos/tutorials/tutorial_03_transfer_inventories/inventory_tutorial.gd @@ -23,6 +23,7 @@ func _process(_delta: float): inventory.remove(item_id, 1) print_inventory() + func print_inventory(): print("Inventory Items:") for item in inventory.stacks: diff --git a/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/furnace_test.gd b/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/furnace_test.gd index 9a854661b..924154ab0 100644 --- a/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/furnace_test.gd +++ b/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/furnace_test.gd @@ -16,6 +16,7 @@ extends Node var recipe_buttons = [] + func _ready(): # Original setup from Tutorial 2 _setup_initial_materials() @@ -26,11 +27,13 @@ func _ready(): _connect_ui_signals() _update_ui() + func _setup_initial_materials(): # Add iron ore and coal (from Tutorial 2) input_inventory.add("iron_ore", 10) input_inventory.add("coal", 5) + func _setup_station(): # Connect station signals craft_station.on_crafted.connect(_on_craft_completed) @@ -41,6 +44,7 @@ func _setup_station(): print("Station Type: ", craft_station.type.name if craft_station.type else "None") print("Available recipes: ", craft_station.valid_recipes.size()) + func _setup_ui(): # Configure progress bar progress_bar.value = 0 @@ -49,6 +53,7 @@ func _setup_ui(): # Create recipe buttons based on valid furnace recipes _create_recipe_buttons() + func _connect_ui_signals(): # Connect button signals add_materials_button.pressed.connect(_add_more_materials) @@ -58,6 +63,7 @@ func _connect_ui_signals(): input_inventory.contents_changed.connect(_update_ui) output_inventory.contents_changed.connect(_update_ui) + func _create_recipe_buttons(): # Clear existing buttons for button in recipe_buttons: @@ -77,23 +83,27 @@ func _create_recipe_buttons(): recipes_list.add_child(button) recipe_buttons.append(button) + func _add_more_materials(): # Add more smelting materials input_inventory.add("iron_ore", 5) input_inventory.add("coal", 3) print("Added more iron ore and coal") + func _smelt_all_possible(): # Try to start smelting if possible if craft_station.valid_recipes.size() > 0: print("Starting furnace smelting...") craft_station.craft(0) + func _craft_recipe(recipe_list_index: int): if recipe_list_index < craft_station.valid_recipes.size(): print("Starting specific recipe: ", recipe_list_index) craft_station.craft(recipe_list_index) + func _update_ui(): # Update inventory status var input_count = _count_inventory_items(input_inventory) @@ -119,6 +129,7 @@ func _update_ui(): # Update progress _update_progress() + func _count_inventory_items(inventory: Inventory) -> int: var count = 0 for stack in inventory.stacks: @@ -126,6 +137,7 @@ func _count_inventory_items(inventory: Inventory) -> int: count += stack.amount return count + func _has_craftable_recipes() -> bool: for recipe_index in craft_station.valid_recipes: var recipe = craft_station.database.recipes[recipe_index] @@ -133,6 +145,7 @@ func _has_craftable_recipes() -> bool: return true return false + func _update_progress(): if craft_station.craftings.size() > 0: var crafting = craft_station.craftings[0] @@ -151,11 +164,13 @@ func _update_progress(): progress_bar.visible = false progress_label.text = "Furnace ready" + # Enhanced signal handlers func _on_crafting_started(crafting_index: int): print("Smelting started: ", crafting_index) _update_ui() + func _on_craft_completed(_recipe_index: int): print("Smelting completed!") @@ -167,11 +182,13 @@ func _on_craft_completed(_recipe_index: int): _update_ui() + # Continue updating progress during smelting func _process(_delta): if craft_station.craftings.size() > 0: _update_progress() + # Keep the space key functionality from Tutorial 2 func _input(event): if event.is_action_pressed("ui_accept"): diff --git a/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/workbench_test.gd b/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/workbench_test.gd index ae6b0cb06..b6a253021 100644 --- a/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/workbench_test.gd +++ b/addons/inventory-system-demos/tutorials/tutorial_create_and_use_craft_station_type/workbench_test.gd @@ -4,6 +4,7 @@ extends Node @onready var input_inventory = $InputInventory @onready var output_inventory = $OutputInventory + func _ready(): # Add test items input_inventory.add("wood", 30) @@ -26,6 +27,7 @@ func _ready(): var can_craft = craft_station.can_craft(recipe) print(" Can craft: ", can_craft) + func _input(event): if event.is_action_pressed("ui_accept"): if craft_station.valid_recipes.size() > 0: @@ -34,6 +36,7 @@ func _input(event): else: print("No recipes available!") + func _on_craft_completed(_recipe_index: int): print("Crafting completed!") diff --git a/addons/inventory-system-demos/ui/craft/craft_station_ui.gd b/addons/inventory-system-demos/ui/craft/craft_station_ui.gd index 141fe4223..6b004363a 100644 --- a/addons/inventory-system-demos/ui/craft/craft_station_ui.gd +++ b/addons/inventory-system-demos/ui/craft/craft_station_ui.gd @@ -32,12 +32,12 @@ var _recipe_uis : Array[RecipeUI] ## Configure a craftstation for the [Recipe] list and [CraftingsUI] list func open(_craft_station : CraftStation): - + if(self.craft_station != null): for i in self.craft_station.input_inventories.size(): if self.craft_station.get_input_inventory(i).contents_changed.is_connected(_on_input_inventory_contents_changed): self.craft_station.get_input_inventory(i).contents_changed.disconnect(_on_input_inventory_contents_changed) - + self.craft_station = _craft_station _clear() _craftings_ui.set_craft_station(craft_station) @@ -53,13 +53,13 @@ func open(_craft_station : CraftStation): visible = true var valid_input = view_input_inventory and craft_station.input_inventories.size() > 0 and craft_station.input_inventories[0] != null var valid_output = view_output_inventory and craft_station.output_inventories.size() > 0 and craft_station.output_inventories[0] != null - if valid_input: + if valid_input: input_inventory_ui.inventory = craft_station.get_input_inventory(0) - if valid_output: + if valid_output: input_inventory_ui.inventory = craft_station.get_input_inventory(0) input_inventory_ui.visible = valid_input output_inventory_ui.visible = valid_output - + for i in craft_station.input_inventories.size(): craft_station.get_input_inventory(i).contents_changed.connect(_on_input_inventory_contents_changed) diff --git a/addons/inventory-system-demos/ui/craft/crafting_ui.gd b/addons/inventory-system-demos/ui/craft/crafting_ui.gd index 46c0b8b4c..18aff4cfb 100644 --- a/addons/inventory-system-demos/ui/craft/crafting_ui.gd +++ b/addons/inventory-system-demos/ui/craft/crafting_ui.gd @@ -7,7 +7,7 @@ extends Control var station : CraftStation ## Crafting information (Time and recipe) -var crafting : Crafting +var crafting : Crafting @onready var _icon : TextureRect = %Icon @onready var _progress_bar : ProgressBar = %ProgressBar diff --git a/addons/inventory-system-demos/ui/craft/craftings_ui.gd b/addons/inventory-system-demos/ui/craft/craftings_ui.gd index c6aff8b71..474fa0f8b 100644 --- a/addons/inventory-system-demos/ui/craft/craftings_ui.gd +++ b/addons/inventory-system-demos/ui/craft/craftings_ui.gd @@ -21,14 +21,14 @@ func set_craft_station(craft_station : CraftStation): craft_station.crafting_added.connect(_on_add_crafting_at) craft_station.crafting_removed.connect(_on_remove_crafting_at) _craft_station = craft_station - + for i in craft_station.craftings.size(): _on_add_crafting_at(i) func _clear(): for crafting in _craftings: - crafting.queue_free() + crafting.queue_free() _craftings.clear() diff --git a/addons/inventory-system-demos/ui/craft/ingredient_ui.gd b/addons/inventory-system-demos/ui/craft/ingredient_ui.gd index ce23bba78..8b8e7767c 100644 --- a/addons/inventory-system-demos/ui/craft/ingredient_ui.gd +++ b/addons/inventory-system-demos/ui/craft/ingredient_ui.gd @@ -7,6 +7,7 @@ extends Control @onready var amount : Label = get_node("Amount") var database : InventoryDatabase + ## Setup ingredient func setup(_database : InventoryDatabase, item_stack : ItemStack): self.database = _database diff --git a/addons/inventory-system-demos/ui/craft/recipe_ui.gd b/addons/inventory-system-demos/ui/craft/recipe_ui.gd index 3b4348c3d..cee9bc766 100644 --- a/addons/inventory-system-demos/ui/craft/recipe_ui.gd +++ b/addons/inventory-system-demos/ui/craft/recipe_ui.gd @@ -18,6 +18,7 @@ var recipe_index : int var craft_station : CraftStation var _ingredients : Array[IngredientUI] + ## Configures the recipe with index values from [Recipe] from [InventoryDatabase]. ## Called by [CraftStationUI]. func set_recipe(_craft_station : CraftStation, _recipe : Recipe, _recipe_index : int): @@ -44,7 +45,7 @@ func set_recipe(_craft_station : CraftStation, _recipe : Recipe, _recipe_index : func _clear_ingredients(): for ingredient_ui in _ingredients: ingredient_ui.queue_free() - _ingredients.clear() + _ingredients.clear() func check_if_has_ingredients(): diff --git a/addons/inventory-system-demos/ui/grid/grid_inventory_ui.gd b/addons/inventory-system-demos/ui/grid/grid_inventory_ui.gd index 92a38568e..6e8ac07aa 100644 --- a/addons/inventory-system-demos/ui/grid/grid_inventory_ui.gd +++ b/addons/inventory-system-demos/ui/grid/grid_inventory_ui.gd @@ -2,7 +2,6 @@ extends Control class_name GridInventoryUI #region Signals - ## Emitted when a grabbed [ItemStack] is dropped. signal item_dropped(item: ItemStack, offset) ## Emitted when the selection has changed. Use [method get_selected_inventory_item] @@ -23,7 +22,6 @@ signal item_mouse_exited(item) signal request_split(inventory : Inventory, stack_index : int, amount : int) signal request_transfer_to(origin_inventory: GridInventory, origin_position: Vector2i, inventory: GridInventory, destination_position: Vector2i, amount: int, is_rotated: bool) signal request_fast_transfer(origin_inventory: GridInventory, origin_position: Vector2i, amount: int) - #endregion enum SelectMode {SELECT_SINGLE = 0, SELECT_MULTI = 1} @@ -45,7 +43,7 @@ enum SelectMode {SELECT_SINGLE = 0, SELECT_MULTI = 1} if is_inside_tree(): assert(node is GridInventory) - + inventory = node update_configuration_warnings() @@ -75,10 +73,10 @@ enum SelectMode {SELECT_SINGLE = 0, SELECT_MULTI = 1} ## The [Inventory] node linked to this control. var inventory: GridInventory = null: set(new_inventory): - + if inventory == new_inventory: return - + _clear_selection() _disconnect_inventory_signals() inventory = new_inventory @@ -97,7 +95,6 @@ var _ctrl_item_container: Control = null var _grid_drop_zone_ui: GridDropZoneUI = null #endregion - #region Default Functions func _ready() -> void: if Engine.is_editor_hint(): @@ -108,7 +105,7 @@ func _ready() -> void: if has_node(inventory_path): inventory = get_node_or_null(inventory_path) - + _grid_slots_container = Control.new() _grid_slots_container.name = "GridSlotsContainer" add_child(_grid_slots_container) @@ -118,7 +115,7 @@ func _ready() -> void: _grid_inventory_content_ui.resized.connect(_update_size) _grid_inventory_content_ui.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(_grid_inventory_content_ui) - + _ctrl_item_container = Control.new() _ctrl_item_container.size = size _ctrl_item_container.mouse_filter = Control.MOUSE_FILTER_IGNORE @@ -139,7 +136,7 @@ func _ready() -> void: _update_size() _queue_refresh() - + func _process(_delta) -> void: if _refresh_queued: _refresh() @@ -152,12 +149,11 @@ func _get_configuration_warnings() -> PackedStringArray: "This node is not linked to an inventory and it can't display any content.\n" + \ "Set the inventory_path property to point to an InventoryGrid node."]) return PackedStringArray() - + func _notification(what: int) -> void: if what == NOTIFICATION_DRAG_END: _grid_drop_zone_ui.deactivate() - func _input(event) -> void: @@ -201,7 +197,7 @@ func _update_stacks(): _stack_uis.clear() for stack_index in inventory.stacks.size(): _on_inventory_stack_added(stack_index) - + func _on_inventory_stack_added(stack_index: int): var stack = inventory.stacks[stack_index] @@ -217,7 +213,7 @@ func _on_inventory_stack_removed(stack_index: int): func _refresh() -> void: _refresh_grid_slots() size = custom_minimum_size - + if is_instance_valid(_grid_drop_zone_ui): _grid_drop_zone_ui.deactivate() if is_instance_valid(_grid_inventory_content_ui): @@ -226,7 +222,7 @@ func _refresh() -> void: func _queue_refresh() -> void: _refresh_queued = true - + #region Grid Slots func get_grid_slot_coords(local_pos: Vector2) -> Vector2i: @@ -252,7 +248,7 @@ func _refresh_grid_slots() -> void: if !is_instance_valid(inventory): return - + for i in range(inventory.size.x): _grid_slots.append([]) for j in range(inventory.size.y): @@ -262,8 +258,8 @@ func _refresh_grid_slots() -> void: grid_slot_ui.setup(Vector2i(i, j), inventory) _grid_slots_container.add_child(grid_slot_ui) _grid_slots[i].append(grid_slot_ui) - - + + func _set_selected_grid_slots(rect: Rect2i, selected: bool) -> void: var h_range = min(rect.size.x + rect.position.x, inventory.size.x) for i in range(rect.position.x, h_range): @@ -348,7 +344,7 @@ func get_selected_inventory_item() -> GridItemStackUI: func get_selected_stacks() -> Array[GridItemStackUI]: return _selected_stacks.duplicate() - + #region ContentUI func _on_item_drop(zone: GridDropZoneUI, drop_position: Vector2, grid_item_stack_ui: GridItemStackUI) -> void: var stack: ItemStack = grid_item_stack_ui.item @@ -379,13 +375,13 @@ func add_grid_item_stack_ui(stack: ItemStack): _ctrl_item_container.add_child(grid_item_stack_ui) _stack_uis.append(grid_item_stack_ui) - - + + func _on_item_middle_clicked(grid_item_stack_ui) -> void: var stack = grid_item_stack_ui.stack if !is_instance_valid(stack): return - + var stack_size : int = stack.amount var stack_index = inventory.stacks.find(stack) @@ -398,15 +394,15 @@ func _on_item_clicked(grid_item_stack_ui) -> void: var stack = grid_item_stack_ui.stack if !is_instance_valid(stack): return - + if Input.is_action_pressed("ui_inventory_transfer"): var stack_position : Vector2i = inventory.get_stack_position(stack) #TODO make rotation with R key or mouse wheel var _is_rotated: bool = inventory.is_stack_rotated(stack) - + request_fast_transfer.emit(inventory, stack_position, stack.amount) else: - + if select_mode == SelectMode.SELECT_MULTI && Input.is_key_pressed(KEY_CTRL): if !_is_item_selected(stack): _select(grid_item_stack_ui) @@ -442,19 +438,19 @@ func _on_dragable_dropped(dragable: GridDraggableElementUI, drop_position: Vecto func _handle_stack_transfer(stack: ItemStack, drop_position: Vector2, source_inventory : Inventory) -> void: var grid_slot_coords = get_grid_slot_coords(drop_position + (grid_slot_size / 2)) - + if source_inventory == null: printerr("source_inventory is null?") return - + if source_inventory.database != inventory.database: return - + var stack_position : Vector2i = source_inventory.get_stack_position(stack) #TODO make rotation with R key or mouse wheel var is_rotated: bool = source_inventory.is_stack_rotated(stack) request_transfer_to.emit(source_inventory, stack_position, inventory, grid_slot_coords, stack.amount, is_rotated) - +#endregion #region Stack UI Utils func get_stack_rect(stack: ItemStack) -> Rect2: @@ -524,8 +520,8 @@ func _select(stack_ui: GridItemStackUI) -> void: _selected_stacks.append(stack_ui) _on_selection_changed() stack_ui.select() - - + + func _deselect(stack_ui: GridItemStackUI) -> void: var stack = stack_ui.stack if !(stack in _selected_stacks): @@ -546,8 +542,8 @@ func _clear_selection() -> void: selected_stack.unselect() _selected_stacks.clear() selection_changed.emit() - - + + func _on_item_activated(grid_item_stack_ui: GridItemStackUI) -> void: var stack = grid_item_stack_ui.stack if !stack: @@ -555,4 +551,3 @@ func _on_item_activated(grid_item_stack_ui: GridItemStackUI) -> void: inventory_item_activated.emit(stack) #endregion -#endregion diff --git a/addons/inventory-system-demos/ui/grid/grid_selection_panel.gd b/addons/inventory-system-demos/ui/grid/grid_selection_panel.gd index 8008746b5..6b90dd4eb 100644 --- a/addons/inventory-system-demos/ui/grid/grid_selection_panel.gd +++ b/addons/inventory-system-demos/ui/grid/grid_selection_panel.gd @@ -1,6 +1,7 @@ extends Panel class_name GridSelectionPanel + func set_style(style: StyleBox) -> void: remove_theme_stylebox_override("panel") if style != null: diff --git a/addons/inventory-system-demos/ui/grid/grid_slot_ui.gd b/addons/inventory-system-demos/ui/grid/grid_slot_ui.gd index cc2b1cd3e..bde4ef778 100644 --- a/addons/inventory-system-demos/ui/grid/grid_slot_ui.gd +++ b/addons/inventory-system-demos/ui/grid/grid_slot_ui.gd @@ -19,8 +19,8 @@ var item_dragged: bool = false: set(value): pass #print("item_grabbed",value) - - + + func setup(grid_position: Vector2i, new_inventory: GridInventory): self._grid_position = grid_position self.inventory = new_inventory diff --git a/addons/inventory-system-demos/ui/hotbar/hotbar_slot_ui.gd b/addons/inventory-system-demos/ui/hotbar/hotbar_slot_ui.gd index a61c22f8d..6a81f53fe 100644 --- a/addons/inventory-system-demos/ui/hotbar/hotbar_slot_ui.gd +++ b/addons/inventory-system-demos/ui/hotbar/hotbar_slot_ui.gd @@ -27,6 +27,7 @@ func _process(_delta: float) -> void: if def == null: return + func update_info_with_stack(_database: InventoryDatabase, _stack: ItemStack, _inventory: Inventory, slot_indexes: PackedInt32Array): self.database = _database self.stack = _stack @@ -39,21 +40,21 @@ func update_info_with_stack(_database: InventoryDatabase, _stack: ItemStack, _in if slot_indexes.size() != i + 1: slot_text += " " slot_index_label.text = slot_text - + if stack == null: icon.visible = false return - + var def = database.get_item(stack.item_id) if def == null: icon.visible = false size = default_size custom_minimum_size = default_size return - + size = Vector2(def.size.x * default_size.x, def.size.y * default_size.y) custom_minimum_size = Vector2(def.size.x * default_size.x, def.size.y * default_size.y) - + icon.visible = true icon.texture = def.icon icon.size = Vector2(def.size.x * default_size.x, def.size.y * default_size.y) diff --git a/addons/inventory-system-demos/ui/interactor/action_message_ui.gd b/addons/inventory-system-demos/ui/interactor/action_message_ui.gd index 23367514a..a8a073ac0 100644 --- a/addons/inventory-system-demos/ui/interactor/action_message_ui.gd +++ b/addons/inventory-system-demos/ui/interactor/action_message_ui.gd @@ -13,7 +13,6 @@ extends HBoxContainer set(value): description = value setup_description(value) - func setup_icon(input_text : String): diff --git a/addons/inventory-system-demos/ui/interactor/input_helper.gd b/addons/inventory-system-demos/ui/interactor/input_helper.gd index 814313e70..57d575067 100644 --- a/addons/inventory-system-demos/ui/interactor/input_helper.gd +++ b/addons/inventory-system-demos/ui/interactor/input_helper.gd @@ -32,35 +32,35 @@ enum InputType {INVALID, KEYBOARD, MOUSE, GP_BTN, GP_MOTION} "PS5 Controller": "ps", "PS4 Controller": "ps", "Switch": "switch", -} +} @export var labels: Dictionary = { "mouse": [ "LMB", "RMB", "MMB", "MW Up", "MW Down", "MW Left", "MW Right", "MB1", "MB2" ], - + "xbox": [ "A", "B", "X", "Y", "Back", "Home", "Start", "L", "R", "LB", "RB", "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Share" ], - + "ps": [ "Cross", "Circle", "Square", "Triangle", "Select", "PS", "Start", "L3", "R3", "L1", "R1", "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Microphone" ], - + "switch": [ "B", "A", "Y", "X", "Minus", "", "Plus", "", "", "", "", "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Capture" ], - + "other": [ "A", "B", "X", "Y", "Back", "Home", "Start", "L", "R", "LB", "RB", "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Share", "Paddle 1", "Paddle 2", "Paddle 3", "Paddle 4", "Touch" ], - + "motion": [ {"-": "LStick Left", "+": "LStick Right"}, {"-": "LStick Up", "+": "LStick Down"}, @@ -76,18 +76,18 @@ func get_event_id(event: InputEvent) -> int: if event is InputEventKey: if event.physical_keycode == 0: return -1 - + return event.physical_keycode | event.get_modifiers_mask() - + if event is InputEventMouseButton: return event.button_index | event.get_modifiers_mask() - + if event is InputEventJoypadButton: return event.button_index - + if event is InputEventJoypadMotion: return event.axis - + return -1 @@ -95,14 +95,14 @@ func set_event_id(event: InputEvent, id: int) -> void: if event is InputEventKey: event.physical_keycode = id & ~(KEY_MASK_SHIFT | KEY_MASK_CTRL | KEY_MASK_ALT) _set_event_modifiers(event, id) - + if event is InputEventMouseButton: event.button_index = id & ~(KEY_MASK_SHIFT | KEY_MASK_CTRL | KEY_MASK_ALT) _set_event_modifiers(event, id) - + if event is InputEventJoypadButton: event.button_index = id - + if event is InputEventJoypadMotion: event.axis = id @@ -110,16 +110,16 @@ func set_event_id(event: InputEvent, id: int) -> void: func get_event_type(event: InputEvent) -> InputType: if event is InputEventKey: return InputType.KEYBOARD - + if event is InputEventMouseButton: return InputType.MOUSE - + if event is InputEventJoypadButton: return InputType.GP_BTN - + if event is InputEventJoypadMotion: return InputType.GP_MOTION - + return InputType.INVALID @@ -141,16 +141,16 @@ func input_already_exists(event: InputEvent, self_action: String) -> Array: for action in InputMap.get_actions(): if action.begins_with("ui_"): continue - + if action == self_action: continue - + if InputMap.action_has_event(action, event): return [true, action] - + return [false, ""] - + func _set_event_modifiers(event: InputEventWithModifiers, modifier_mask: int) -> void: event.shift_pressed = bool(modifier_mask & KEY_MASK_SHIFT) event.ctrl_pressed = bool(modifier_mask & KEY_MASK_CTRL) @@ -158,23 +158,22 @@ func _set_event_modifiers(event: InputEventWithModifiers, modifier_mask: int) -> ### Events as Text - func get_event_as_text(event: InputEvent) -> String: if get_event_id(event) == -1: return "INVALID" - + if event is InputEventKey: return OS.get_keycode_string(event.get_physical_keycode_with_modifiers()) - + if event is InputEventMouseButton: return _get_mouse_event_as_text(event) - + if event is InputEventJoypadButton: return _get_gp_btn_event_as_text(event) - + if event is InputEventJoypadMotion: return _get_gp_motion_event_as_text(event) - + return "" @@ -182,14 +181,14 @@ func _get_modifiers_as_string(event: InputEventWithModifiers) -> String: var modifiers: PackedStringArray if event.shift_pressed: modifiers.append("Shift") - + if event.ctrl_pressed: modifiers.append("Ctrl") - + if event.alt_pressed: modifiers.append("Alt") - - var modifiers_string: String = "+".join(modifiers) + + var modifiers_string: String = "+".join(modifiers) return modifiers_string @@ -223,50 +222,49 @@ func _get_gp_motion_event_as_text(event: InputEventJoypadMotion) -> String: func get_event_as_icon(event: InputEvent, icon_db: InputIcons) -> Texture2D: if event is InputEventKey: return _get_keyboard_event_as_icon(event, icon_db) - + if event is InputEventMouseButton: return _get_mouse_event_as_icon(event, icon_db) - + if event is InputEventJoypadButton: return _get_gp_btn_event_as_icon(event, icon_db) - + if event is InputEventJoypadMotion: return _get_gp_motion_event_as_icon(event, icon_db) - + return null func _get_keyboard_event_as_icon(event: InputEventKey, icon_db: InputIcons) -> Texture2D: var keycode: int = event.physical_keycode var icon: Texture2D = icon_db.get_keyboard_button_texture(keycode) - + return icon func _get_mouse_event_as_icon(event: InputEventMouse, icon_db: InputIcons) -> Texture2D: var button_index: int = event.button_index var icon: Texture2D = icon_db.get_mouse_button_texture(button_index) - + return icon func _get_gp_btn_event_as_icon(event: InputEventJoypadButton, icon_db: InputIcons) -> Texture2D: var device_name: String = Input.get_joy_name(event.device) device_name = _get_joy_name_abbr(device_name) - + var button_index: int = event.button_index var icon: Texture2D = icon_db.get_gp_button_texture(device_name, button_index) - + return icon func _get_gp_motion_event_as_icon(event: InputEventJoypadMotion, icon_db: InputIcons) -> Texture2D: var device_name: String = Input.get_joy_name(event.device) device_name = _get_joy_name_abbr(device_name) - + var axis: int = event.axis var axis_dir: String = "-" if event.axis_value < 1 else "+" var icon: Texture2D = icon_db.get_gp_motion_texture(device_name, axis, axis_dir) - - return icon + return icon diff --git a/addons/inventory-system-demos/ui/interactor/input_icons.gd b/addons/inventory-system-demos/ui/interactor/input_icons.gd index 651337dba..a047f02b8 100644 --- a/addons/inventory-system-demos/ui/interactor/input_icons.gd +++ b/addons/inventory-system-demos/ui/interactor/input_icons.gd @@ -44,11 +44,11 @@ var property_map: Dictionary = { 4194342: "f11", 4194343: "f12", }, - + "mouse_button": [ "lmb", "rmb", "mmb", "mw_up", "mw_down", "mw_left", "mw_right", "mb1", "mb2" ], - + "gp_button": [ "bot", "right", "left", "top", "back", "guide", "start", @@ -58,7 +58,7 @@ var property_map: Dictionary = { "misc", "pad1", "pad2", "pad3", "pad4", "touch" ], - + "gp_motion": [ {"-": "ls_left", "+": "ls_right"}, {"-": "ls_down", "+": "ls_up"}, diff --git a/addons/inventory-system-demos/ui/interactor/interactor_ui.gd b/addons/inventory-system-demos/ui/interactor/interactor_ui.gd index 131c1add3..421382fae 100644 --- a/addons/inventory-system-demos/ui/interactor/interactor_ui.gd +++ b/addons/inventory-system-demos/ui/interactor/interactor_ui.gd @@ -12,6 +12,7 @@ var default_interact_message_position : Vector2 var interact_object var interact_hand_object + func setup(_interactor : Interactor): if self.interactor != null: interactor.preview_interacted.disconnect(_on_preview_interacted) @@ -41,7 +42,6 @@ func preview_interact(actions : Array, position_on_screen : Vector2): var interact_message = interact_messages[i] if i < actions.size(): interact_message.show_message(actions[i].input, actions[i].description) - + else: interact_message.hide_message() - diff --git a/addons/inventory-system-demos/ui/inventory_system_ui.gd b/addons/inventory-system-demos/ui/inventory_system_ui.gd index eb8b38ceb..a6c81ff56 100644 --- a/addons/inventory-system-demos/ui/inventory_system_ui.gd +++ b/addons/inventory-system-demos/ui/inventory_system_ui.gd @@ -11,7 +11,7 @@ const Interactor = preload("../interaction_system/inventory_interactor.gd") player_inventory_ui.console_mode = console_mode loot_inventory_ui.console_mode = console_mode console_mode = value - + @export var character : CharacterInventorySystem ## Stores [Crafter] information to connect all signals and callbacks @@ -52,28 +52,28 @@ func _ready(): player_craft_station_ui.close() other_craft_station_ui.close() drop_area.request_drop.connect(_request_drop) - + player_inventory_ui.request_transfer_to.connect(_request_transfer_to) loot_inventory_ui.request_transfer_to.connect(_request_transfer_to) - + player_inventory_ui.request_fast_transfer.connect(_request_fast_transfer) loot_inventory_ui.request_fast_transfer.connect(_request_fast_transfer) - + player_inventory_ui.request_split.connect(_request_split) loot_inventory_ui.request_split.connect(_request_split) #player_inventory_ui.request_sort.connect(_request_sort) #loot_inventory_ui.request_sort.connect(_request_sort) - + player_inventory_ui.inventory_stack_context_activated.connect(_inventory_stack_context) loot_inventory_ui.inventory_stack_context_activated.connect(_inventory_stack_context) - + other_craft_station_ui.input_inventory_ui.inventory_stack_context_activated.connect(_inventory_stack_context) - + #player_craft_station_ui.input_inventory_ui.request_transfer_to.connect(_request_transfer_to) other_craft_station_ui.input_inventory_ui.request_transfer_to.connect(_request_transfer_to) other_craft_station_ui.input_inventory_ui.request_fast_transfer.connect(_request_fast_transfer) other_craft_station_ui.input_inventory_ui.request_split.connect(_request_split) - + player_craft_station_ui.on_craft.connect(_on_craft) other_craft_station_ui.on_craft.connect(_on_craft) @@ -81,14 +81,14 @@ func _ready(): ## Setup inventory handler and connect all signals func setup(_character : CharacterInventorySystem): self.character = _character - + var inventories : Array[Inventory] inventories.append(character.main_inventory) #inventories.append(character.equipment_inventory) set_player_inventory(character.main_inventory) character.opened_inventory.connect(_on_open_inventory) character.closed_inventory.connect(_on_close_inventory) - + # Stations character.opened_station.connect(_on_open_craft_station) character.closed_station.connect(_on_close_craft_station) @@ -97,7 +97,6 @@ func setup(_character : CharacterInventorySystem): interactor_ui.setup(character.interactor) # Hotbar hotbar_ui.set_hotbar(character.hotbar) - ## Setup player inventories @@ -114,7 +113,7 @@ func _drop_area_input(event : InputEvent): func _open_player_inventory(): player_inventory_ui.visible = true - + hotbar_ui.visible = false drop_area.visible = true # TODO console mode? @@ -123,7 +122,7 @@ func _open_player_inventory(): #player_inventories_ui[0].items[0].grab_focus() -# Open Inventory of player +# Open Inventory of player func _on_open_inventory(inventory : Inventory): if character.main_inventory != inventory: loot_inventory_ui.inventory = inventory @@ -131,9 +130,9 @@ func _on_open_inventory(inventory : Inventory): alternative_inventory = loot_inventory_ui.inventory else: _open_player_inventory() - -# Open Craft Station + +# Open Craft Station func _on_open_craft_station(craft_station : CraftStation): # TODO #42 Different skins for different types of craft stations if craft_station == character.main_station: @@ -225,38 +224,39 @@ func _inventory_stack_context(event: InputEvent, inventory: GridInventory, stack return var mb_event: InputEventMouseButton = event - + #var def = inventory.database.get_item(stack.item_id) #var stack_name = str(stack.amount) + " x " #if def == null: #stack_name += stack.item_id #else: #stack_name += def.name - + stack_popup_menu.clear() stack_popup_menu.add_item("Split", STACK_MENU_ID_SPLIT) stack_popup_menu.add_item("Rotate", STACK_MENU_ID_ROTATE) stack_popup_menu.add_item("Drop", STACK_MENU_ID_DROP) - - - + + + var equip_menu : PopupMenu = PopupMenu.new() for i in 4: if hotbar_ui.hotbar.is_active_slot(i): equip_menu.add_item(str("Equip on ",(i+1)), i) equip_menu.id_pressed.connect(_on_equip_menu_id_pressed) - - + + stack_popup_menu.add_submenu_node_item("Equip", equip_menu) #stack_popup_menu.add_item("Move to ", STACK_MENU_ID_MOVE_TO) stack_popup_menu.add_separator() stack_popup_menu.add_item("Sort Inventory", STACK_MENU_ID_SORT) - + stack_popup_menu.set_item_disabled(0, stack.amount == 1) - + stack_popup_menu.position = mb_event.global_position stack_popup_menu.popup() + func _on_stack_popup_menu_id_pressed(id: int): if current_stack == null: return