-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrocket.lua
136 lines (123 loc) · 5.1 KB
/
rocket.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
--A anti-griefing module build by I_IBlackI_I for FactorioMMO
--This module makes a rocket silo unable to be destroyed by regular players
-- and gives admins a tool to make it destroyable again.
-- the rocket auto-launches when there is a satellite in it.
global.satellite_sent = global.satellite_sent or {}
--Function for when a rocket is launched
function rocket_launched(event)
if event.rocket.get_item_count("satellite") == 0 then
if (#game.players <= 1) then
game.show_message_dialog{text = "Know what? You should put a satellite in it next time."}
else
for index, player in pairs(game.forces.player.players) do
player.print("Know what? You should put a satellite in it next time.")
end
end
return
end
if not global.satellite_sent then
global.satellite_sent = {}
end
if global.satellite_sent[game.forces.player.name] then
global.satellite_sent[game.forces.player.name] = global.satellite_sent[game.forces.player.name] + 1
else
game.set_game_state{game_finished=true, player_won=true, can_continue=true}
global.satellite_sent[game.forces.player.name] = 1
end
for index, player in pairs(game.forces.player.players) do
mod_gui.get_frame_flow(player).rocket_score.destroy()
if mod_gui.get_button_flow(player).rocket_stats.caption == "Close Stats" then
local frame = mod_gui.get_frame_flow(player).add{name = "rocket_score", type = "frame", direction = "horizontal", caption="Score"}
frame.add{name="rocket_count_label", type = "label", caption="Rockets sent: "}
if global.satellite_sent[game.forces.player.name] == nil then
global.satellite_sent[game.forces.player.name] = 0
end
frame.add{name="rocket_count", type = "label", caption=tostring(global.satellite_sent[game.forces.player.name])}
end
end
end
--Function to make silo's turn to the admin force and not be able to take damage.
-- Event.register(defines.events.on_built_entity, function(event)
-- local entity = event.created_entity
-- if entity.name == "rocket-silo" then
-- entity.force = game.forces.Admins
-- entity.minable = false
-- entity.destructible = false
-- --entity.operable = false
-- end
-- end)
-- Functions for adding the silo to the table, or remove them.
local function rocket_on_creation(event)
local ent = event.created_entity
if ent.type == "rocket-silo" then
table.insert(global.silos, ent)
end
end
local function rocket_on_destruction(event)
local ent = event.entity
if ent.type == "rocket-silo" then
del_list(global.silos, ent)
end
end
Event.register(defines.events.on_tick, function(event)
if (game.tick % 180 == 0) then
for k, silo in pairs(global.silos) do
if silo.valid then
game.surfaces[1].create_entity({name="flying-text", position=silo.position,text=silo.rocket_parts ,color={r=0.5,g=1,b=1}})
invent = silo.get_inventory(defines.inventory.rocket_silo_rocket)
if invent ~= nil and not invent.is_empty() then
if silo.get_item_count("satellite") > 0 then
silo.launch_rocket()
end
end
else
table.remove(global.silos, k)
end
end
end
end)
Event.register(-1, function(event)
global.silos = global.silos or {}
end)
function rocket_player_joined(event)
local player = game.players[event.player_index]
rocket_create_button(player.name)
end
function rocket_create_button(player_name)
local player = game.players[player_name]
if not mod_gui.get_button_flow(player).rocket_stats then
mod_gui.get_button_flow(player).add { name = "rocket_stats", type = "button", caption = "Open Stats" }
end
end
function rocket_on_gui_click(event)
if not (event and event.element and event.element.valid) then return end
local i = event.player_index
local p = game.players[i]
local e = event.element
if e ~= nil then
if e.name == "rocket_stats" and e.caption == "Open Stats" then
e.caption = "Close Stats"
if mod_gui.get_frame_flow(p).rocket_score then
mod_gui.get_frame_flow(p).rocket_score.rocket_count.caption = tostring(global.satellite_sent[game.forces.player.name])
else
local frame = mod_gui.get_frame_flow(p).add{name = "rocket_score", type = "frame", direction = "horizontal", caption="Score"}
frame.add{name="rocket_count_label", type = "label", caption="Rockets sent: "}
if global.satellite_sent[game.forces.player.name] == nil then
global.satellite_sent[game.forces.player.name] = 0
end
frame.add{name="rocket_count", type = "label", caption=tostring(global.satellite_sent[game.forces.player.name])}
end
elseif e.name == "rocket_stats" and e.caption == "Close Stats" then
e.caption = "Open Stats"
mod_gui.get_frame_flow(p).rocket_score.destroy()
end
end
end
Event.register(defines.events.on_entity_died, rocket_on_destruction)
Event.register(defines.events.on_robot_pre_mined, rocket_on_destruction)
Event.register(defines.events.on_pre_player_mined_item, rocket_on_destruction)
Event.register(defines.events.on_built_entity, rocket_on_creation)
Event.register(defines.events.on_robot_built_entity, rocket_on_creation)
Event.register(defines.events.on_rocket_launched, rocket_launched)
Event.register(defines.events.on_gui_click, rocket_on_gui_click)
Event.register(defines.events.on_player_joined_game, rocket_player_joined)