-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontrol.lua
202 lines (170 loc) · 5.47 KB
/
control.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
local NULL = -1 -- Needed to represent an empty slot because tables can't contain nil
-- Check if all request slots are empty
function check_empty(char)
local allEmpty = true
for i = 1,char.request_slot_count do
if char.get_request_slot(i) then
allEmpty = false
break
end
end
return allEmpty
end
function toggle_shortcut(player, new_state)
if player.is_shortcut_available("toggle-supply") then
player.set_shortcut_toggled("toggle-supply", new_state)
end
end
function toggle_off(player_data, player, char)
-- Save and clear
for i = 1,char.request_slot_count do
local slot = char.get_request_slot(i)
if slot then
table.insert(player_data.request_slots, slot)
char.clear_request_slot(i)
else
table.insert(player_data.request_slots, NULL)
end
end
player_data.ison = false
player.print({"message_off"})
toggle_shortcut(player, false)
end
function toggle_on(player_data, player, char)
-- Clear all slots that have something in it
-- needed if someone set one of the saved request - would be in the list twice, which is not possible
for i = 1,char.request_slot_count do
if char.get_request_slot(i) ~= nil then
char.clear_request_slot(i)
end
end
-- Reapply slots
for i, slot in ipairs(player_data.request_slots) do
if slot ~= NULL then
if slot.count == 0 then
player.print({"message_count_zero", "__ENTITY__" .. slot.name .. "__"})
else
char.set_request_slot(slot, i)
end
end
end
player_data.ison = true
player_data.request_slots = {}
player.print({"message_on"})
toggle_shortcut(player, true)
end
function toggle(event)
game.players[event.player_index].print({"message_deprecated"})
game.players[event.player_index].print({"message_deprecated_l2"})
-- get char of player that fired the event
local player = game.players[event.player_index]
if not player then
return
end
local char = player.character
if not char then
return
end
-- Exit if there are no request slots
if char.request_slot_count == 0 then
return
end
local player_data = get_player_data(event.player_index)
if player_data.ison then
if check_empty(char) then
player.print({"message_empty"})
return
end
toggle_off(player_data, player, char)
else
toggle_on(player_data, player, char)
end
end
function modify_button_state()
for idx, player in pairs(game.players) do
if player.character then
player.set_shortcut_available("toggle-supply", player.character.request_slot_count ~= 0)
toggle_shortcut(player, get_player_data(idx).ison)
end
end
end
function get_player_data(index)
if global.supplytoggle == nil then
init_supplytoggle()
elseif global.supplytoggle[index] == nil then
init_player(index)
end
return global.supplytoggle[index]
end
function init_player(index)
-- Set up reference to players table in global
global.supplytoggle[index] = {
ison = true,
request_slots = {}
}
end
function init_supplytoggle()
global.supplytoggle = {}
for idx, player in pairs(game.players) do
player.print({"message_deprecated_new"})
init_player(idx)
end
modify_button_state()
end
script.on_init(function()
init_supplytoggle()
end
)
script.on_configuration_changed(function()
-- Check if persistence table exists
if global.supplytoggle == nil then
init_supplytoggle()
end
end
)
-- Disable request when player respawns
script.on_event({defines.events.on_player_respawned},
function(event)
game.players[event.player_index].print({"message_deprecated"})
game.players[event.player_index].print({"message_deprecated_l2"})
-- get char of player that fired the event
local player = game.players[event.player_index]
if not player then
return
end
local char = player.character
if not char then
return
end
local player_data = get_player_data(event.player_index)
if player_data.ison then
toggle_off(player_data, player, char)
player.print({"message_died"})
end
end
)
-- toggle supply if shortcut is used
script.on_event({defines.events.on_lua_shortcut},
function(event)
if event.prototype_name == "toggle-supply" then
toggle(event)
end
end
)
-- toggle supply if hotkey is used
script.on_event("toggle-supply", toggle)
-- Check if there are still request slots when the editor is toggled (could unresearch slots)
script.on_event({defines.events.on_player_toggled_map_editor}, modify_button_state)
-- Check if there are request slots now and enable shortcut then
script.on_event({defines.events.on_research_finished}, modify_button_state)
-- Check if a console command added/removed slots
script.on_event({defines.events.on_console_command}, modify_button_state)
-- Initialize entry for new player and set the shortcut button correctly
script.on_event({defines.events.on_player_created},
function(event)
game.players[event.player_index].print({"message_deprecated"})
game.players[event.player_index].print({"message_deprecated_l2"})
init_player(event.player_index)
modify_button_state()
end
)