z_mirror/StatsGui

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

Caleb HeuerUpdate to Factorio 2.17ef4dd0

trunk
4.8 KiB167 linesraw
1local constants = require("constants")
2
3local player_data = require("scripts.player-data")
4local preprocessors = require("scripts.preprocessors")
5local sensors = require("scripts.sensors")
6local stats_gui = require("scripts.stats-gui")
7
8-- -----------------------------------------------------------------------------
9-- EVENT HANDLERS
10
11-- BOOTSTRAP
12
13script.on_init(function()
14  storage.players = {}
15  storage.research_progress_samples = {}
16  storage.research_progress_strings = {}
17  for i, player in pairs(game.players) do
18    player_data.init(i)
19    player_data.refresh(player, storage.players[i])
20  end
21end)
22
23script.on_configuration_changed(function(e)
24  local old_version = e.mod_changes and e.mod_changes[script.mod_name] and e.mod_changes[script.mod_name].old_version
25  if not old_version then
26    return
27  end
28
29  if helpers.compare_versions(old_version, "1.1.0") < 0 then
30    storage.research_progress_strings = {}
31  end
32
33  storage.research_progress_samples = {}
34  for i, player in pairs(game.players) do
35    player_data.refresh(player, storage.players[i])
36  end
37end)
38
39-- PLAYER
40
41script.on_event(defines.events.on_player_created, function(e)
42  local player = game.get_player(e.player_index)
43  player_data.init(e.player_index)
44  player_data.refresh(player, storage.players[e.player_index])
45end)
46
47script.on_event(defines.events.on_player_removed, function(e)
48  storage.players[e.player_index] = nil
49end)
50
51script.on_event(
52  { defines.events.on_player_display_resolution_changed, defines.events.on_player_display_scale_changed },
53  --- @param e EventData.on_player_display_resolution_changed|EventData.on_player_display_scale_changed
54  function(e)
55    local player = game.get_player(e.player_index)
56    if not player then
57      return
58    end
59    local player_table = storage.players[e.player_index]
60    stats_gui.update(player, player_table)
61  end
62)
63
64-- SETTINGS
65
66script.on_event(defines.events.on_runtime_mod_setting_changed, function(e)
67  if string.sub(e.setting, 1, 8) == "statsgui" then
68    local player = game.get_player(e.player_index)
69    local player_table = storage.players[e.player_index]
70    if
71      e.setting == "statsgui-single-line"
72      or e.setting == "statsgui-adjust-for-fps-ups"
73      or e.setting == "statsgui-adjust-for-clock"
74    then
75      -- recreate the GUI to change the frame direction and/or padding
76      player_data.refresh(player, player_table)
77    else
78      player_data.update_settings(player, player_table)
79    end
80  end
81end)
82
83-- TICK
84
85-- update stats once per second
86script.on_nth_tick(60, function()
87  -- run preprocessors
88  for _, preprocessor in pairs(preprocessors) do
89    preprocessor()
90  end
91  -- update GUIs
92  for _, player in pairs(game.connected_players) do
93    local player_table = storage.players[player.index]
94    stats_gui.update(player, player_table)
95  end
96end)
97
98-- CONTROLLER
99
100script.on_event(
101  { defines.events.on_cutscene_started, defines.events.on_cutscene_finished, defines.events.on_cutscene_cancelled },
102  --- @param e EventData.on_cutscene_started|EventData.on_cutscene_finished|EventData.on_cutscene_cancelled
103  function(e)
104    local player = game.get_player(e.player_index)
105    if not player then
106      return
107    end
108    local player_table = storage.players[e.player_index]
109    if not player_table then
110      return
111    end
112    player_table.stats_window.visible = player.controller_type ~= defines.controllers.cutscene
113  end
114)
115
116script.on_event(defines.events.on_player_controller_changed, function(e)
117  local player = game.get_player(e.player_index)
118  if not player then
119    return
120  end
121  local player_table = storage.players[e.player_index]
122  if not player_table then
123    return
124  end
125  stats_gui.update(player, player_table)
126end)
127
128script.on_event(
129  { defines.events.on_gui_opened, defines.events.on_gui_closed },
130  --- @param e EventData.on_gui_opened|EventData.on_gui_closed
131  function(e)
132    if e.gui_type ~= defines.gui_type.entity or e.entity.type ~= "locomotive" then
133      return
134    end
135
136    local player = game.get_player(e.player_index)
137    if not player then
138      return
139    end
140    local player_table = storage.players[e.player_index]
141    if not player_table then
142      return
143    end
144    stats_gui.update(player, player_table)
145  end
146)
147
148-- -----------------------------------------------------------------------------
149-- REMOTE INTERFACE
150
151remote.add_interface("StatsGui", {
152  add_preprocessor = function(interface, func)
153    -- create a dummy function that calls the specified remote interface and returns what it returns
154    preprocessors[#preprocessors + 1] = function()
155      return remote.call(interface, func)
156    end
157  end,
158  add_sensor = function(interface, func)
159    -- create a dummy function that calls the specified remote interface and returns what it returns
160    sensors[#sensors + 1] = function(player)
161      return remote.call(interface, func, player)
162    end
163  end,
164  version = function()
165    return constants.interface_version
166  end,
167})