z_mirror/Tapeline

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

Caleb HeuerGet working again6968d04

3.0
2.9 KiB96 linesraw
1local flib_bounding_box = require("__flib__.bounding-box")
2
3--- @param player LuaPlayer
4--- @return LuaItemStack?
5local function get_tool(player)
6  local cursor_stack = player.cursor_stack
7  if cursor_stack and cursor_stack.valid_for_read and cursor_stack.name == "tl-tool" then
8    return cursor_stack
9  end
10end
11
12--- @param player LuaPlayer
13--- @param box BoundingBox?
14local function set_tool(player, box)
15  local cursor_stack = player.cursor_stack
16  if cursor_stack then
17    if not cursor_stack.valid_for_read or cursor_stack.name == "tl-tool" or player.clear_cursor() then
18      cursor_stack.set_stack({ name = "tl-tool", count = 10 })
19      if box then
20        cursor_stack.label = flib_bounding_box.width(box) .. "x" .. flib_bounding_box.height(box)
21      else
22        cursor_stack.label = ""
23      end
24    end
25    if player.controller_type == defines.controllers.character and player.character_build_distance_bonus < 1000000 then
26      player.character_build_distance_bonus = player.character_build_distance_bonus + 1000000
27    end
28  end
29end
30
31--- @param e EventData.on_player_cursor_stack_changed
32local function on_player_cursor_stack_changed(e)
33  local player = game.get_player(e.player_index) --[[@as LuaPlayer]]
34  local player_tool = get_tool(player)
35  if player_tool and not storage.holding_tool[player.index] then
36    storage.holding_tool[player.index] = true
37    set_tool(player)
38  elseif not player_tool and storage.holding_tool[player.index] then
39    storage.holding_tool[player.index] = nil
40    -- FIXME: Handle player controller changes
41    if player.controller_type == defines.controllers.character and player.character_build_distance_bonus >= 1000000 then
42      player.character_build_distance_bonus = player.character_build_distance_bonus - 1000000
43    end
44  end
45end
46
47--- @param e EventData.on_built_entity
48local function on_built_entity(e)
49  local entity = e.entity
50  if not entity.valid then
51    return
52  end
53  local name = entity.name
54  if name == "entity-ghost" then
55    name = entity.ghost_name
56  end
57  if name ~= "tl-dummy-entity" then
58    return
59  end
60  local player = game.get_player(e.player_index)
61  if not player then
62    return
63  end
64  local drawing = storage.drawing[e.player_index]
65  if not drawing then
66    return
67  end
68  set_tool(player, drawing.box)
69end
70
71--- @param e EventData.on_player_selected_area|EventData.on_player_alt_selected_area
72local function on_player_selected_area(e)
73  local player = game.get_player(e.player_index)
74  if not player then
75    return
76  end
77  set_tool(player)
78end
79
80local function on_init()
81  --- @type table<uint, boolean>
82  storage.holding_tool = {}
83end
84
85local tool = {}
86
87tool.on_init = on_init
88
89tool.events = {
90  [defines.events.on_built_entity] = on_built_entity,
91  [defines.events.on_player_alt_selected_area] = on_player_selected_area,
92  [defines.events.on_player_cursor_stack_changed] = on_player_cursor_stack_changed,
93  [defines.events.on_player_selected_area] = on_player_selected_area,
94}
95
96return tool