@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.
- package/LICENSE.md +21 -0
- package/dist/browser/package.json +40 -0
- package/dist/browser/tsconfig.browser.tsbuildinfo +1 -0
- package/dist/browser/web/index.d.ts +1 -0
- package/dist/browser/web/index.d.ts.map +1 -0
- package/dist/browser/web/index.js +2 -0
- package/dist/browser/web/index.js.map +1 -0
- package/dist/node/index.d.ts +3 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +10 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/instance.d.ts +4 -0
- package/dist/node/instance.d.ts.map +1 -0
- package/dist/node/instance.js +8 -0
- package/dist/node/instance.js.map +1 -0
- package/dist/node/tsconfig.node.tsbuildinfo +1 -0
- package/dist/web/manifest.json +7 -0
- package/dist/web/static/exp_legacy.9b6538559ed5e689539c.js +355 -0
- package/dist/web/static/index_ts.8f9d451c8d3f7f293da6.js +22 -0
- package/dist/web/static/main.94e1b48804112ca8bdfc.js +118 -0
- package/dist/web/static/package_json.a83729efdb0697b12396.js +22 -0
- package/dist/web/static/web_index_tsx.e5a01ac0e4b0a6f6517f.js +21 -0
- package/index.ts +8 -0
- package/instance.ts +7 -0
- package/module/config/_file_loader.lua +29 -0
- package/module/config/advanced_start.lua +112 -0
- package/module/config/afk_kick.lua +14 -0
- package/module/config/bonus.lua +105 -0
- package/module/config/chat_reply.lua +136 -0
- package/module/config/compilatron.lua +25 -0
- package/module/config/death_logger.lua +15 -0
- package/module/config/deconlog.lua +11 -0
- package/module/config/discord_alerts.lua +25 -0
- package/module/config/expcore/permission_groups.lua +143 -0
- package/module/config/graftorio.lua +7 -0
- package/module/config/gui/autofill.lua +129 -0
- package/module/config/gui/player_list_actions.lua +201 -0
- package/module/config/gui/rockets.lua +47 -0
- package/module/config/gui/science.lua +21 -0
- package/module/config/gui/tasks.lua +13 -0
- package/module/config/gui/warps.lua +52 -0
- package/module/config/inventory_clear.lua +9 -0
- package/module/config/join_messages.lua +8 -0
- package/module/config/lawnmower.lua +6 -0
- package/module/config/logging.lua +30 -0
- package/module/config/miner.lua +8 -0
- package/module/config/module.lua +86 -0
- package/module/config/nukeprotect.lua +30 -0
- package/module/config/pollution_grading.lua +9 -0
- package/module/config/popup_messages.lua +10 -0
- package/module/config/preset_player_colours.lua +33 -0
- package/module/config/preset_player_quickbar.lua +6 -0
- package/module/config/protection.lua +17 -0
- package/module/config/repair.lua +8 -0
- package/module/config/research.lua +179 -0
- package/module/config/scorched_earth.lua +116 -0
- package/module/config/spawn_area.lua +255 -0
- package/module/config/station_auto_name.lua +11 -0
- package/module/config/statistics.lua +46 -0
- package/module/config/vlayer.lua +180 -0
- package/module/config/warnings.lua +38 -0
- package/module/control.lua +46 -0
- package/module/expcore/datastore.lua +884 -0
- package/module/expcore/external.lua +146 -0
- package/module/expcore/permission_groups.lua +355 -0
- package/module/expcore/player_data.lua +152 -0
- package/module/locale/en/addons.cfg +31 -0
- package/module/locale/en/data.cfg +114 -0
- package/module/locale/en/expcore.cfg +16 -0
- package/module/locale/en/gui.cfg +114 -0
- package/module/locale/zh-CN/addons.cfg +31 -0
- package/module/locale/zh-CN/data.cfg +114 -0
- package/module/locale/zh-CN/expcore.cfg +16 -0
- package/module/locale/zh-CN/gui.cfg +122 -0
- package/module/locale/zh-TW/addons.cfg +31 -0
- package/module/locale/zh-TW/data.cfg +114 -0
- package/module/locale/zh-TW/expcore.cfg +16 -0
- package/module/locale/zh-TW/gui.cfg +122 -0
- package/module/module.json +14 -0
- package/module/module_exports.lua +3 -0
- package/module/modules/control/jail.lua +119 -0
- package/module/modules/control/protection.lua +204 -0
- package/module/modules/control/reports.lua +225 -0
- package/module/modules/control/spectate.lua +173 -0
- package/module/modules/control/vlayer.lua +807 -0
- package/module/modules/control/warnings.lua +331 -0
- package/module/modules/control/warps.lua +488 -0
- package/module/modules/data/alt-view.lua +26 -0
- package/module/modules/data/greetings.lua +45 -0
- package/module/modules/data/language.lua +21 -0
- package/module/modules/data/player-colours.lua +63 -0
- package/module/modules/data/quickbar.lua +72 -0
- package/module/modules/data/statistics.lua +181 -0
- package/module/modules/data/tag.lua +82 -0
- package/module/modules/data/toolbar.lua +31 -0
- package/module/modules/graftorio/forcestats.lua +196 -0
- package/module/modules/graftorio/general.lua +63 -0
- package/module/modules/graftorio/require.lua +28 -0
- package/module/modules/graftorio/statics.lua +36 -0
- package/module/modules/gui/vlayer.lua +547 -0
- package/module/modules/gui/warp-list.lua +909 -0
- package/module/utils/event.lua +86 -0
- package/package.json +38 -0
- package/tsconfig.browser.json +4 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +5 -0
- package/web/index.tsx +0 -0
- 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)
|