diff --git a/project/blocky_game/blocks/blocks.gd b/project/blocky_game/blocks/blocks.gd index f363907..33d4d38 100644 --- a/project/blocky_game/blocks/blocks.gd +++ b/project/blocky_game/blocks/blocks.gd @@ -93,6 +93,13 @@ func get_block(id: int) -> Block: return _blocks[id] +func get_raw_mapping(raw_id: int) -> RawMapping: + assert(raw_id >= 0) + var rm = _raw_mappings[raw_id] + assert(rm != null) + return rm + + func get_block_count() -> int: return len(_blocks) @@ -104,6 +111,9 @@ func _create_block(params: Dictionary): "backface_culling": true, "directory": params.name }) + + var block = Block.new() + block.id = len(_blocks) for i in len(params.voxels): var vname = params.voxels[i] @@ -112,9 +122,13 @@ func _create_block(params: Dictionary): push_error("Could not find voxel named {0}".format([vname])) assert(id != -1) params.voxels[i] = id + var rm = RawMapping.new() + rm.block_id = block.id + rm.variant_index = i + if id >= len(_raw_mappings): + _raw_mappings.resize(id + 1) + _raw_mappings[id] = rm - var block = Block.new() - block.id = len(_blocks) block.name = params.name block.directory = params.directory block.rotation_type = params.rotation_type diff --git a/project/blocky_game/gui/hotbar.gd b/project/blocky_game/gui/hotbar.gd index 770ef70..065fa47 100644 --- a/project/blocky_game/gui/hotbar.gd +++ b/project/blocky_game/gui/hotbar.gd @@ -35,3 +35,10 @@ func select_slot(i: int): func get_selected_block_type() -> int: return _inventory[_inventory_index] + +func try_select_slot_by_block_id(block_id: int): + for i in len(_inventory): + var id = _inventory[i] + if id == block_id: + select_slot(i) + break diff --git a/project/blocky_game/player/avatar_interaction.gd b/project/blocky_game/player/avatar_interaction.gd index f895224..42b341d 100644 --- a/project/blocky_game/player/avatar_interaction.gd +++ b/project/blocky_game/player/avatar_interaction.gd @@ -29,6 +29,7 @@ var _terrain_tool = null var _cursor = null var _action_place = false var _action_remove = false +var _action_pick = false func _ready(): @@ -72,7 +73,8 @@ func _physics_process(delta): # These inputs have to be in _fixed_process because they rely on collision queries if hit != null: - var has_cube = _terrain_tool.get_voxel(hit.position) != 0 + var hit_raw_id = _terrain_tool.get_voxel(hit.position) + var has_cube = hit_raw_id != 0 if _action_remove and has_cube: var pos = hit.position @@ -89,9 +91,14 @@ func _physics_process(delta): print("Place voxel at ", pos) else: print("Can't place here!") + + elif _action_pick: + var rm := Blocks.get_raw_mapping(hit_raw_id) + _hotbar.try_select_slot_by_block_id(rm.block_id) _action_place = false _action_remove = false + _action_pick = false func _unhandled_input(event): @@ -102,6 +109,8 @@ func _unhandled_input(event): _action_remove = true BUTTON_RIGHT: _action_place = true + BUTTON_MIDDLE: + _action_pick = true elif event is InputEventKey: if event.pressed: