z_mirror/CursorEnhancements

git clone https://git.raiguard.me/z_mirror/CursorEnhancements

Caleb HeuerConsider all possible recipes for quick-craft (#17)b4a035a

smart-quickbar
3.2 KiB111 linesraw
1--- @class Util
2local util = {}
3
4--- @param player LuaPlayer
5--- @return string?
6function util.get_cursor_item(player)
7  local cursor_stack = player.cursor_stack
8  if not cursor_stack or not cursor_stack.valid_for_read then
9    cursor_stack = {}
10  end
11  local cursor_ghost = player.cursor_ghost or {}
12  return cursor_stack.name or cursor_ghost.name
13end
14
15--- @param selected SelectedPrototypeData?
16--- @return string?
17function util.get_selected_item(selected)
18  if not selected then
19    return
20  end
21  local type = selected.base_type
22  if type == "item" then
23    return selected.name
24  elseif type == "entity" then
25    local entity = game.entity_prototypes[selected.name]
26    local item = (entity.items_to_place_this or {})[1]
27    if item then
28      return item.name
29    end
30  elseif type == "recipe" then
31    local recipe = game.recipe_prototypes[selected.name]
32    local product = recipe.products[1]
33    if product and product.type == "item" then
34      return product.name
35    end
36  end
37end
38
39--- @param selected SelectedPrototypeData?
40--- @return LuaCustomTable<string, LuaRecipePrototype>?
41function util.get_selected_recipes(selected)
42  if not selected then
43    return
44  end
45  if selected.base_type == "recipe" then
46    return { game.recipe_prototypes[selected.name] }
47  end
48
49  local item = util.get_selected_item(selected)
50  if not item then
51    return
52  end
53
54  return game.get_filtered_recipe_prototypes({
55    { filter = "has-product-item", elem_filters = { { filter = "name", name = item } } },
56  })
57end
58
59--- @param player LuaPlayer
60--- @return boolean
61function util.is_cheating(player)
62  if
63    player.cheat_mode
64    and not (player.controller_type == defines.controllers.god and script.active_mods["space-exploration"])
65  then
66    return true
67  end
68  return player.controller_type == defines.controllers.editor
69end
70
71--- @param player LuaPlayer
72--- @param item string
73--- @return boolean success
74function util.set_cursor(player, item)
75  local inventory = player.get_main_inventory()
76  if not inventory then
77    return false
78  end
79  local cursor_stack = player.cursor_stack
80  if not cursor_stack or not player.clear_cursor() then
81    return false
82  end
83  local inventory_stack, stack_index = inventory.find_item_stack(item)
84  if not inventory_stack or not stack_index then
85    local stack_size = game.item_prototypes[item].stack_size
86    if util.is_cheating(player) and inventory.can_insert({ name = item, count = stack_size }) then
87      inventory.insert({ name = item, count = stack_size })
88      inventory_stack, stack_index = inventory.find_item_stack(item)
89    else
90      player.cursor_ghost = item
91      return true
92    end
93  end
94  --- @cast inventory_stack LuaItemStack
95  --- @cast stack_index uint
96  if not cursor_stack.transfer_stack(inventory_stack) then
97    return false
98  end
99  local inventory_def
100  if player.controller_type == defines.controllers.character then
101    inventory_def = defines.inventory.character_main
102  elseif player.controller_type == defines.controllers.editor then
103    inventory_def = defines.inventory.editor_main
104  elseif player.controller_type == defines.controllers.god then
105    inventory_def = defines.inventory.god_main
106  end
107  player.hand_location = { inventory = inventory_def, slot = stack_index }
108  return true
109end
110
111return util