@expcluster/legacy 7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/browser/package.json +40 -0
  3. package/dist/browser/tsconfig.browser.tsbuildinfo +1 -0
  4. package/dist/browser/web/index.d.ts +1 -0
  5. package/dist/browser/web/index.d.ts.map +1 -0
  6. package/dist/browser/web/index.js +2 -0
  7. package/dist/browser/web/index.js.map +1 -0
  8. package/dist/node/index.d.ts +3 -0
  9. package/dist/node/index.d.ts.map +1 -0
  10. package/dist/node/index.js +10 -0
  11. package/dist/node/index.js.map +1 -0
  12. package/dist/node/instance.d.ts +4 -0
  13. package/dist/node/instance.d.ts.map +1 -0
  14. package/dist/node/instance.js +8 -0
  15. package/dist/node/instance.js.map +1 -0
  16. package/dist/node/tsconfig.node.tsbuildinfo +1 -0
  17. package/dist/web/manifest.json +7 -0
  18. package/dist/web/static/exp_legacy.9b6538559ed5e689539c.js +355 -0
  19. package/dist/web/static/index_ts.8f9d451c8d3f7f293da6.js +22 -0
  20. package/dist/web/static/main.94e1b48804112ca8bdfc.js +118 -0
  21. package/dist/web/static/package_json.a83729efdb0697b12396.js +22 -0
  22. package/dist/web/static/web_index_tsx.e5a01ac0e4b0a6f6517f.js +21 -0
  23. package/index.ts +8 -0
  24. package/instance.ts +7 -0
  25. package/module/config/_file_loader.lua +29 -0
  26. package/module/config/advanced_start.lua +112 -0
  27. package/module/config/afk_kick.lua +14 -0
  28. package/module/config/bonus.lua +105 -0
  29. package/module/config/chat_reply.lua +136 -0
  30. package/module/config/compilatron.lua +25 -0
  31. package/module/config/death_logger.lua +15 -0
  32. package/module/config/deconlog.lua +11 -0
  33. package/module/config/discord_alerts.lua +25 -0
  34. package/module/config/expcore/permission_groups.lua +143 -0
  35. package/module/config/graftorio.lua +7 -0
  36. package/module/config/gui/autofill.lua +129 -0
  37. package/module/config/gui/player_list_actions.lua +201 -0
  38. package/module/config/gui/rockets.lua +47 -0
  39. package/module/config/gui/science.lua +21 -0
  40. package/module/config/gui/tasks.lua +13 -0
  41. package/module/config/gui/warps.lua +52 -0
  42. package/module/config/inventory_clear.lua +9 -0
  43. package/module/config/join_messages.lua +8 -0
  44. package/module/config/lawnmower.lua +6 -0
  45. package/module/config/logging.lua +30 -0
  46. package/module/config/miner.lua +8 -0
  47. package/module/config/module.lua +86 -0
  48. package/module/config/nukeprotect.lua +30 -0
  49. package/module/config/pollution_grading.lua +9 -0
  50. package/module/config/popup_messages.lua +10 -0
  51. package/module/config/preset_player_colours.lua +33 -0
  52. package/module/config/preset_player_quickbar.lua +6 -0
  53. package/module/config/protection.lua +17 -0
  54. package/module/config/repair.lua +8 -0
  55. package/module/config/research.lua +179 -0
  56. package/module/config/scorched_earth.lua +116 -0
  57. package/module/config/spawn_area.lua +255 -0
  58. package/module/config/station_auto_name.lua +11 -0
  59. package/module/config/statistics.lua +46 -0
  60. package/module/config/vlayer.lua +180 -0
  61. package/module/config/warnings.lua +38 -0
  62. package/module/control.lua +46 -0
  63. package/module/expcore/datastore.lua +884 -0
  64. package/module/expcore/external.lua +146 -0
  65. package/module/expcore/permission_groups.lua +355 -0
  66. package/module/expcore/player_data.lua +152 -0
  67. package/module/locale/en/addons.cfg +31 -0
  68. package/module/locale/en/data.cfg +114 -0
  69. package/module/locale/en/expcore.cfg +16 -0
  70. package/module/locale/en/gui.cfg +114 -0
  71. package/module/locale/zh-CN/addons.cfg +31 -0
  72. package/module/locale/zh-CN/data.cfg +114 -0
  73. package/module/locale/zh-CN/expcore.cfg +16 -0
  74. package/module/locale/zh-CN/gui.cfg +122 -0
  75. package/module/locale/zh-TW/addons.cfg +31 -0
  76. package/module/locale/zh-TW/data.cfg +114 -0
  77. package/module/locale/zh-TW/expcore.cfg +16 -0
  78. package/module/locale/zh-TW/gui.cfg +122 -0
  79. package/module/module.json +14 -0
  80. package/module/module_exports.lua +3 -0
  81. package/module/modules/control/jail.lua +119 -0
  82. package/module/modules/control/protection.lua +204 -0
  83. package/module/modules/control/reports.lua +225 -0
  84. package/module/modules/control/spectate.lua +173 -0
  85. package/module/modules/control/vlayer.lua +807 -0
  86. package/module/modules/control/warnings.lua +331 -0
  87. package/module/modules/control/warps.lua +488 -0
  88. package/module/modules/data/alt-view.lua +26 -0
  89. package/module/modules/data/greetings.lua +45 -0
  90. package/module/modules/data/language.lua +21 -0
  91. package/module/modules/data/player-colours.lua +63 -0
  92. package/module/modules/data/quickbar.lua +72 -0
  93. package/module/modules/data/statistics.lua +181 -0
  94. package/module/modules/data/tag.lua +82 -0
  95. package/module/modules/data/toolbar.lua +31 -0
  96. package/module/modules/graftorio/forcestats.lua +196 -0
  97. package/module/modules/graftorio/general.lua +63 -0
  98. package/module/modules/graftorio/require.lua +28 -0
  99. package/module/modules/graftorio/statics.lua +36 -0
  100. package/module/modules/gui/vlayer.lua +547 -0
  101. package/module/modules/gui/warp-list.lua +909 -0
  102. package/module/utils/event.lua +86 -0
  103. package/package.json +38 -0
  104. package/tsconfig.browser.json +4 -0
  105. package/tsconfig.json +7 -0
  106. package/tsconfig.node.json +5 -0
  107. package/web/index.tsx +0 -0
  108. package/webpack.config.js +29 -0
@@ -0,0 +1,547 @@
1
+ --[[-- Gui Module - Virtual Layer
2
+ - Adds a virtual layer to store power to save space.
3
+ @gui Virtual Layer
4
+ @alias vlayer_container
5
+ ]]
6
+
7
+ local Gui = require("modules/exp_gui")
8
+ local Roles = require("modules/exp_roles")
9
+ local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
10
+ local format_number = require("util").format_number --- @dep util
11
+ local config = require("modules.exp_legacy.config.vlayer") --- @dep config.vlayer
12
+ local vlayer = require("modules.exp_legacy.modules.control.vlayer")
13
+
14
+ local Selection = require("modules/exp_util/selection")
15
+ local SelectArea = Selection.connect("ExpGui_VLayer")
16
+
17
+ --- Align an aabb to the grid by expanding it
18
+ local function aabb_align_expand(aabb)
19
+ return {
20
+ left_top = { x = math.floor(aabb.left_top.x), y = math.floor(aabb.left_top.y) },
21
+ right_bottom = { x = math.ceil(aabb.right_bottom.x), y = math.ceil(aabb.right_bottom.y) },
22
+ }
23
+ end
24
+
25
+ local vlayer_container --- @type ExpElement
26
+ local vlayer_gui_control_type --- @type ExpElement
27
+ local vlayer_gui_control_list --- @type ExpElement
28
+
29
+ local vlayer_control_type_list = {
30
+ [1] = "energy",
31
+ [2] = "circuit",
32
+ [3] = "storage_input",
33
+ [4] = "storage_output",
34
+ }
35
+
36
+ local function pos_to_gps_string(pos, surface_name)
37
+ return "[gps=" .. string.format("%.1f", pos.x) .. "," .. string.format("%.1f", pos.y) .. "," .. surface_name .. "]"
38
+ end
39
+
40
+ local function format_energy(amount, unit)
41
+ if amount < 1 then
42
+ return "0 " .. unit
43
+ end
44
+
45
+ local suffix = ""
46
+ local suffix_list = {
47
+ ["P"] = 1000000000000000,
48
+ ["T"] = 1000000000000,
49
+ ["G"] = 1000000000,
50
+ ["M"] = 1000000,
51
+ ["k"] = 1000,
52
+ }
53
+
54
+ for letter, limit in pairs(suffix_list) do
55
+ if math.abs(amount) >= limit then
56
+ amount = string.format("%.1f", amount / limit)
57
+ suffix = letter
58
+ break
59
+ end
60
+ end
61
+
62
+ local k
63
+ local formatted = amount
64
+
65
+ while true do
66
+ formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", "%1,%2")
67
+
68
+ if (k == 0) then
69
+ break
70
+ end
71
+ end
72
+
73
+ return formatted .. " " .. suffix .. unit
74
+ end
75
+
76
+ local ExpUtil = require("modules/exp_util")
77
+ --- When an area is selected to add protection to the area
78
+ SelectArea:on_selection(function(event)
79
+ log(ExpUtil.format_any(event))
80
+ local area = aabb_align_expand(event.area)
81
+ local player = game.players[event.player_index]
82
+
83
+ if not player then
84
+ return
85
+ end
86
+
87
+ local container = Gui.get_left_element(vlayer_container, player)
88
+ local disp = container.frame["vlayer_st_2"].disp.table
89
+ local target = vlayer_control_type_list[disp[vlayer_gui_control_type.name].selected_index]
90
+ local entities --- @type LuaEntity[]
91
+
92
+ if config.power_on_space and event.surface and event.surface.platform and target == "energy" then
93
+ if (player.force --[[@as LuaForce]]).technologies[config.power_on_space_research.name].level >= config.power_on_space_research.level then
94
+ entities = event.surface.find_entities_filtered{ area = area, name = "constant-combinator", force = player.force }
95
+ else
96
+ player.print{ "vlayer.power-on-space-research", config.power_on_space_research.name, config.power_on_space_research.level }
97
+ return
98
+ end
99
+ else
100
+ entities = event.surface.find_entities_filtered{ area = area, name = "steel-chest", force = player.force }
101
+ end
102
+
103
+ if #entities == 0 then
104
+ player.print{ "vlayer.steel-chest-detect" }
105
+ return
106
+ elseif #entities > 1 then
107
+ player.print{ "vlayer.result-unable", { "vlayer.control-type-" .. target:gsub("_", "-") }, { "vlayer.result-multiple" } }
108
+ return
109
+ end
110
+
111
+ if not entities[1] then
112
+ return
113
+ end
114
+
115
+ local e = entities[1]
116
+ local e_pos = { x = string.format("%.1f", e.position.x), y = string.format("%.1f", e.position.y) }
117
+ local e_circ = nil -- e.get_wire_connectors{ or_create = false }
118
+
119
+ if e.name and e.name == "steel-chest" and (not assert(e.get_inventory(defines.inventory.chest)).is_empty()) then
120
+ player.print{ "vlayer.steel-chest-empty" }
121
+ return
122
+ end
123
+
124
+ if (vlayer.get_interface_counts()[target] >= config.interface_limit[target]) then
125
+ player.print{ "vlayer.result-unable", { "vlayer.control-type-" .. target:gsub("_", "-") }, { "vlayer.result-limit" } }
126
+ return
127
+ end
128
+
129
+ e.destroy()
130
+
131
+ if target == "energy" then
132
+ if not vlayer.create_energy_interface(event.surface, e_pos, player) then
133
+ player.print{ "vlayer.result-unable", { "vlayer.control-type-energy" }, { "vlayer.result-space" } }
134
+ return
135
+ end
136
+ elseif target == "circuit" then
137
+ vlayer.create_circuit_interface(event.surface, e_pos, e_circ, player)
138
+ elseif target == "storage_input" then
139
+ vlayer.create_input_interface(event.surface, e_pos, e_circ, player)
140
+ elseif target == "storage_output" then
141
+ vlayer.create_output_interface(event.surface, e_pos, e_circ, player)
142
+ end
143
+
144
+ game.print{ "vlayer.interface-result", player.name, pos_to_gps_string(e_pos, event.surface.name), { "vlayer.result-build" }, { "vlayer.control-type-" .. target:gsub("_", "-") } }
145
+ end)
146
+
147
+ --- Display label for the number of solar panels
148
+ -- @element vlayer_gui_display_item_solar_name
149
+ local vlayer_gui_display_item_solar_name = Gui.define("vlayer_gui_display_item_solar_name")
150
+ :draw{
151
+ type = "label",
152
+ name = Gui.from_name,
153
+ caption = { "vlayer.display-item-solar" },
154
+ style = "heading_2_label",
155
+ }:style{
156
+ width = 200,
157
+ }
158
+
159
+ local vlayer_gui_display_item_solar_count = Gui.define("vlayer_gui_display_item_solar_count")
160
+ :draw{
161
+ type = "progressbar",
162
+ name = Gui.from_name,
163
+ caption = "",
164
+ value = 0,
165
+ style = "electric_satisfaction_statistics_progressbar",
166
+ }:style{
167
+ width = 200,
168
+ font = "heading-2",
169
+ }
170
+
171
+ --- Display label for the number of accumulators
172
+ -- @element vlayer_gui_display_item_accumulator_name
173
+ local vlayer_gui_display_item_accumulator_name = Gui.define("vlayer_gui_display_item_accumulator_name")
174
+ :draw{
175
+ type = "label",
176
+ name = Gui.from_name,
177
+ caption = { "vlayer.display-item-accumulator" },
178
+ style = "heading_2_label",
179
+ }:style{
180
+ width = 200,
181
+ }
182
+
183
+ local vlayer_gui_display_item_accumulator_count = Gui.define("vlayer_gui_display_item_accumulator_count")
184
+ :draw{
185
+ type = "progressbar",
186
+ name = Gui.from_name,
187
+ caption = "",
188
+ value = 0,
189
+ style = "electric_satisfaction_statistics_progressbar",
190
+ }:style{
191
+ width = 200,
192
+ font = "heading-2",
193
+ }
194
+
195
+ --- Display label for the surface area
196
+ -- @element vlayer_gui_display_signal_surface_area_name
197
+ local vlayer_gui_display_signal_surface_area_name = Gui.define("vlayer_gui_display_signal_surface_area_name")
198
+ :draw{
199
+ type = "label",
200
+ name = Gui.from_name,
201
+ caption = { "vlayer.display-remaining-surface-area" },
202
+ tooltip = { "vlayer.display-remaining-surface-area-tooltip" },
203
+ style = "heading_2_label",
204
+ }:style{
205
+ width = 200,
206
+ }
207
+
208
+ local vlayer_gui_display_signal_surface_area_count = Gui.define("vlayer_gui_display_signal_surface_area_count")
209
+ :draw{
210
+ type = "progressbar",
211
+ name = Gui.from_name,
212
+ caption = "",
213
+ value = 0,
214
+ style = "electric_satisfaction_statistics_progressbar",
215
+ }:style{
216
+ width = 200,
217
+ font = "heading-2",
218
+ }
219
+
220
+ --- Display label for the sustained energy production
221
+ -- @element vlayer_gui_display_signal_sustained_name
222
+ local vlayer_gui_display_signal_sustained_name = Gui.define("vlayer_gui_display_signal_sustained_name")
223
+ :draw{
224
+ type = "label",
225
+ name = Gui.from_name,
226
+ caption = { "vlayer.display-sustained-production" },
227
+ tooltip = { "vlayer.display-sustained-production-tooltip" },
228
+ style = "heading_2_label",
229
+ }:style{
230
+ width = 200,
231
+ }
232
+
233
+ local vlayer_gui_display_signal_sustained_count = Gui.define("vlayer_gui_display_signal_sustained_count")
234
+ :draw{
235
+ type = "progressbar",
236
+ name = Gui.from_name,
237
+ caption = "",
238
+ value = 0,
239
+ style = "electric_satisfaction_statistics_progressbar",
240
+ }:style{
241
+ width = 200,
242
+ font = "heading-2",
243
+ }
244
+
245
+ --- Display label for the current energy production
246
+ -- @element vlayer_gui_display_signal_production_name
247
+ local vlayer_gui_display_signal_production_name = Gui.define("vlayer_gui_display_signal_production_name")
248
+ :draw{
249
+ type = "label",
250
+ name = Gui.from_name,
251
+ caption = { "vlayer.display-current-production" },
252
+ tooltip = { "vlayer.display-current-production-tooltip" },
253
+ style = "heading_2_label",
254
+ }:style{
255
+ width = 200,
256
+ }
257
+
258
+ local vlayer_gui_display_signal_production_count = Gui.define("vlayer_gui_display_signal_production_count")
259
+ :draw{
260
+ type = "progressbar",
261
+ name = Gui.from_name,
262
+ caption = "",
263
+ value = 0,
264
+ style = "electric_satisfaction_statistics_progressbar",
265
+ }:style{
266
+ width = 200,
267
+ font = "heading-2",
268
+ }
269
+
270
+ --- Display label for the sustained energy capacity
271
+ -- @element vlayer_gui_display_signal_capacity_name
272
+ local vlayer_gui_display_signal_capacity_name = Gui.define("vlayer_gui_display_signal_capacity_name")
273
+ :draw{
274
+ type = "label",
275
+ name = Gui.from_name,
276
+ caption = { "vlayer.display-current-capacity" },
277
+ tooltip = { "vlayer.display-current-capacity-tooltip" },
278
+ style = "heading_2_label",
279
+ }:style{
280
+ width = 200,
281
+ }
282
+
283
+ local vlayer_gui_display_signal_capacity_count = Gui.define("vlayer_gui_display_signal_capacity_count")
284
+ :draw{
285
+ type = "progressbar",
286
+ name = Gui.from_name,
287
+ caption = "",
288
+ value = 0,
289
+ style = "electric_satisfaction_statistics_progressbar",
290
+ }:style{
291
+ width = 200,
292
+ font = "heading-2",
293
+ }
294
+
295
+ --- A vertical flow containing all the displays labels and their counts
296
+ -- @element vlayer_display_set
297
+ local vlayer_display_set = Gui.define("vlayer_display_set")
298
+ :draw(function(_, parent, name)
299
+ local vlayer_set = parent.add{ type = "flow", direction = "vertical", name = name }
300
+ local disp = Gui.elements.scroll_table(vlayer_set, 400, 2, "disp")
301
+
302
+ vlayer_gui_display_item_solar_name(disp)
303
+ vlayer_gui_display_item_solar_count(disp)
304
+ vlayer_gui_display_item_accumulator_name(disp)
305
+ vlayer_gui_display_item_accumulator_count(disp)
306
+ vlayer_gui_display_signal_surface_area_name(disp)
307
+ vlayer_gui_display_signal_surface_area_count(disp)
308
+ vlayer_gui_display_signal_sustained_name(disp)
309
+ vlayer_gui_display_signal_sustained_count(disp)
310
+ vlayer_gui_display_signal_production_name(disp)
311
+ vlayer_gui_display_signal_production_count(disp)
312
+ vlayer_gui_display_signal_capacity_name(disp)
313
+ vlayer_gui_display_signal_capacity_count(disp)
314
+
315
+ return vlayer_set
316
+ end)
317
+
318
+ local function vlayer_gui_list_refresh(player)
319
+ local container = Gui.get_left_element(vlayer_container, player)
320
+ local disp = container.frame["vlayer_st_2"].disp.table
321
+ local target = disp[vlayer_gui_control_type.name].selected_index
322
+ local full_list = {}
323
+
324
+ if target then
325
+ local interface = vlayer.get_interfaces()[vlayer_control_type_list[target]]
326
+
327
+ for i = 1, vlayer.get_interface_counts()[vlayer_control_type_list[target]], 1 do
328
+ local entity = assert(interface[i])
329
+ local entity_position = entity.position
330
+ table.insert(full_list, i .. " X " .. entity_position.x .. " Y " .. entity_position.y)
331
+ end
332
+
333
+ disp[vlayer_gui_control_list.name].items = full_list
334
+ end
335
+ end
336
+
337
+ --- A drop down list filter by this type
338
+ -- @element vlayer_gui_control_type
339
+ vlayer_gui_control_type = Gui.define("vlayer_gui_control_type")
340
+ :draw{
341
+ type = "drop-down",
342
+ name = Gui.from_name,
343
+ items = { { "vlayer.control-type-energy" }, { "vlayer.control-type-circuit" }, { "vlayer.control-type-storage-input" }, { "vlayer.control-type-storage-output" } },
344
+ selected_index = 1,
345
+ }:style{
346
+ width = 200,
347
+ }:on_selection_state_changed(function(def, player, element)
348
+ vlayer_gui_list_refresh(player)
349
+ end)
350
+
351
+ --- A drop down list to see the exact item to remove
352
+ -- @element vlayer_gui_control_list
353
+ vlayer_gui_control_list = Gui.define("vlayer_gui_control_list")
354
+ :draw{
355
+ type = "drop-down",
356
+ name = Gui.from_name,
357
+ }:style{
358
+ width = 200,
359
+ }
360
+
361
+ --- A button to refresh the remove list
362
+ -- @element vlayer_gui_control_refresh
363
+ local vlayer_gui_control_refresh = Gui.define("vlayer_gui_control_refresh")
364
+ :draw{
365
+ type = "button",
366
+ name = Gui.from_name,
367
+ caption = { "vlayer.control-refresh" },
368
+ }:style{
369
+ width = 200,
370
+ }:on_click(function(def, player, element)
371
+ vlayer_gui_list_refresh(player)
372
+ end)
373
+
374
+ --- A button to check if the item is the one wanted to remove
375
+ -- @element vlayer_gui_control_see
376
+ local vlayer_gui_control_see = Gui.define("vlayer_gui_control_see")
377
+ :draw{
378
+ type = "button",
379
+ name = Gui.from_name,
380
+ caption = { "vlayer.control-see" },
381
+ }:style{
382
+ width = 200,
383
+ }:on_click(function(def, player, element, event)
384
+ local target = assert(element.parent)[vlayer_gui_control_type.name].selected_index
385
+ local n = assert(element.parent)[vlayer_gui_control_list.name].selected_index
386
+
387
+ if target and vlayer_control_type_list[target] and n > 0 then
388
+ local i = vlayer.get_interfaces()
389
+ local entity = i[vlayer_control_type_list[target]][n]
390
+ if entity and entity.valid then
391
+ player.set_controller{ type = defines.controllers.remote, position = entity.position, surface = entity.surface }
392
+ player.print{ "vlayer.result-interface-location", { "vlayer.control-type-" .. vlayer_control_type_list[target]:gsub("_", "-") }, pos_to_gps_string(entity.position, entity.surface.name) }
393
+ end
394
+ end
395
+ end)
396
+
397
+ --- A button used to build the vlayer interface
398
+ -- @element vlayer_gui_control_build
399
+ local vlayer_gui_control_build = Gui.define("vlayer_gui_control_build")
400
+ :draw{
401
+ type = "button",
402
+ name = Gui.from_name,
403
+ caption = { "vlayer.control-build" },
404
+ }:style{
405
+ width = 200,
406
+ }:on_click(function(def, player, element)
407
+ if SelectArea:stop(player) then
408
+ player.print{ "vlayer.exit" }
409
+ else
410
+ SelectArea:start(player)
411
+ player.print{ "vlayer.enter" }
412
+ end
413
+
414
+ vlayer_gui_list_refresh(player)
415
+ end)
416
+
417
+ --- A button used to remove the vlayer interface
418
+ -- @element vlayer_gui_control_remove
419
+ local vlayer_gui_control_remove = Gui.define("vlayer_gui_control_remove")
420
+ :draw{
421
+ type = "button",
422
+ name = Gui.from_name,
423
+ caption = { "vlayer.control-remove" },
424
+ }:style{
425
+ width = 200,
426
+ }:on_click(function(def, player, element)
427
+ local target = assert(element.parent)[vlayer_gui_control_type.name].selected_index
428
+ local n = assert(element.parent)[vlayer_gui_control_list.name].selected_index
429
+
430
+ if target and vlayer_control_type_list[target] and n > 0 then
431
+ local i = vlayer.get_interfaces()
432
+
433
+ if i and i[vlayer_control_type_list[target]] then
434
+ local entity = assert(i[vlayer_control_type_list[target]][n])
435
+ local interface_type, interface_surface, interface_position = vlayer.remove_interface(entity.surface, entity.position)
436
+
437
+ if interface_type then
438
+ game.print{ "vlayer.interface-result", player.name, pos_to_gps_string(interface_position, interface_surface.name), { "vlayer.result-remove" }, { "vlayer.control-type-" .. interface_type } }
439
+ end
440
+ end
441
+ end
442
+
443
+ vlayer_gui_list_refresh(player)
444
+ end)
445
+
446
+ --- A vertical flow containing all the control buttons
447
+ -- @element vlayer_control_set
448
+ local vlayer_control_set = Gui.define("vlayer_control_set")
449
+ :draw(function(_, parent, name)
450
+ local player = Gui.get_player(parent)
451
+ local vlayer_set = parent.add{ type = "flow", direction = "vertical", name = name }
452
+ local disp = Gui.elements.scroll_table(vlayer_set, 400, 2, "disp")
453
+
454
+ vlayer_gui_control_type(disp)
455
+ vlayer_gui_control_list(disp)
456
+ vlayer_gui_control_refresh(disp)
457
+ vlayer_gui_control_see(disp)
458
+ local b = vlayer_gui_control_build(disp)
459
+ local r = vlayer_gui_control_remove(disp)
460
+ local v = Roles.player_has_permission(player, "exp_scenario.gui.vlayer_edit")
461
+ b.visible = v
462
+ r.visible = v
463
+
464
+ return vlayer_set
465
+ end)
466
+
467
+ --- The main container for the vlayer gui
468
+ -- @element vlayer_container
469
+ vlayer_container = Gui.define("vlayer_container")
470
+ :draw(function(definition, parent)
471
+ local container = Gui.elements.container(parent, 400)
472
+
473
+ vlayer_display_set(container, "vlayer_st_1")
474
+ vlayer_control_set(container, "vlayer_st_2")
475
+
476
+ return container.parent
477
+ end)
478
+
479
+ --- Add the element to the left flow with a toolbar button
480
+ Gui.add_left_element(vlayer_container, false)
481
+ Gui.toolbar.create_button{
482
+ name = "vlayer_toggle",
483
+ left_element = vlayer_container,
484
+ sprite = "entity/solar-panel",
485
+ tooltip = { "vlayer.main-tooltip" },
486
+ visible = function(player, element)
487
+ return Roles.player_has_permission(player, "exp_scenario.gui.vlayer")
488
+ end
489
+ }
490
+
491
+ --- Update the visibly of the buttons based on a players roles
492
+ local function role_update_event(event)
493
+ local player = game.players[event.player_index]
494
+ local visible = Roles.player_has_permission(player, "exp_scenario.gui.vlayer_edit")
495
+ local container = Gui.get_left_element(vlayer_container, player)
496
+ local disp = container.frame["vlayer_st_2"].disp.table
497
+ disp[vlayer_gui_control_build.name].visible = visible
498
+ disp[vlayer_gui_control_remove.name].visible = visible
499
+ end
500
+
501
+ Event.add(Roles.events.on_player_roles_changed, role_update_event)
502
+
503
+ Event.on_nth_tick(config.update_tick_gui, function(_)
504
+ local stats = vlayer.get_statistics()
505
+ local items = vlayer.get_items()
506
+ local items_alloc = vlayer.get_allocated_items()
507
+
508
+ local vlayer_display = {
509
+ [vlayer_gui_display_item_solar_count.name] = {
510
+ val = (items_alloc["solar-panel"] / math.max(items["solar-panel"], 1)),
511
+ cap = format_number(items_alloc["solar-panel"], false) .. " / " .. format_number(items["solar-panel"], false),
512
+ },
513
+ [vlayer_gui_display_item_accumulator_count.name] = {
514
+ val = (items_alloc["accumulator"] / math.max(items["accumulator"], 1)),
515
+ cap = format_number(items_alloc["accumulator"], false) .. " / " .. format_number(items["accumulator"], false),
516
+ },
517
+ [vlayer_gui_display_signal_surface_area_count.name] = {
518
+ val = (stats.total_surface_area / math.max(stats.surface_area, 1)),
519
+ cap = format_number(stats.remaining_surface_area)
520
+ },
521
+ [vlayer_gui_display_signal_sustained_count.name] = {
522
+ val = (stats.energy_sustained / math.max(stats.energy_total_production, 1)),
523
+ cap = format_energy(stats.energy_sustained, "W") .. " / " .. format_energy(stats.energy_total_production, "W")
524
+ },
525
+ [vlayer_gui_display_signal_production_count.name] = {
526
+ val = (stats.energy_production / math.max(stats.energy_max, 1)),
527
+ cap = format_energy(stats.energy_production, "W") .. " / " .. format_energy(stats.energy_max, "W"),
528
+ },
529
+ [vlayer_gui_display_signal_capacity_count.name] = {
530
+ val = (stats.energy_storage / math.max(stats.energy_capacity, 1)),
531
+ cap = format_energy(stats.energy_storage, "J") .. " / " .. format_energy(stats.energy_capacity, "J"),
532
+ },
533
+ }
534
+
535
+ for _, player in pairs(game.connected_players) do
536
+ local container = Gui.get_left_element(vlayer_container, player)
537
+ local disp = container.frame["vlayer_st_1"].disp.table
538
+
539
+ for k, v in pairs(vlayer_display) do
540
+ disp[k].caption = v.cap
541
+
542
+ if v.val then
543
+ disp[k].value = v.val
544
+ end
545
+ end
546
+ end
547
+ end)