245 lines
8.4 KiB
Lua
245 lines
8.4 KiB
Lua
-- -------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- TEST EVENTS
|
|
|
|
local event = require("__RaiLuaLib__.lualib.event")
|
|
local mod_gui = require("mod-gui")
|
|
|
|
-- can also use event.register("on_init", function) if so desired
|
|
event.on_init(function()
|
|
log("on_init")
|
|
global.event = {}
|
|
global.event.players = {}
|
|
global.event.chests = {}
|
|
end)
|
|
|
|
-- can also use event.on_configuration_changed(function) if so desired
|
|
event.register("on_configuration_changed", function(e)
|
|
print(serpent.block(e))
|
|
end)
|
|
|
|
-- use shortcuts when we only want to listen to one event that's not custom
|
|
event.on_player_created(function(e)
|
|
local player = game.players[e.player_index]
|
|
if player.character then
|
|
player.character.destructible = false
|
|
end
|
|
global.event.players[e.player_index] = {}
|
|
end)
|
|
|
|
-- listen to multiple events by defining them in an array
|
|
event.register({defines.events.on_built_entity, defines.events.on_robot_built_entity, defines.events.script_raised_built}, function(e)
|
|
local entity = e.created_entity
|
|
entity.surface.create_entity{
|
|
name = "highlight-box",
|
|
position = entity.position,
|
|
bounding_box = entity.selection_box,
|
|
box_type = "electricity",
|
|
render_player_index = e.player_index,
|
|
blink_interval = 10,
|
|
time_to_live = 50
|
|
}
|
|
end)
|
|
|
|
-- custom inputs
|
|
event.register("demo-input", function(e)
|
|
game.players[e.player_index].print("You shift+scrolled upwards on tick "..e.tick)
|
|
end)
|
|
|
|
-- nth tick
|
|
-- can also use event.register(-3600, handler)
|
|
event.on_nth_tick(3600, function(e)
|
|
game.print("It has been one minute since I last spoke!")
|
|
end)
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- CONDITIONAL EVENTS
|
|
|
|
-- -------------------------------------
|
|
-- GLOBAL
|
|
-- void the contents of all wooden chests on the map on every tick
|
|
|
|
local function void_chests_tick(e)
|
|
for _,entity in pairs(global.event.chests) do
|
|
-- remove all contents from all wooden chests on every tick
|
|
local inventory = entity.get_inventory(defines.inventory.chest)
|
|
inventory.clear()
|
|
end
|
|
end
|
|
|
|
event.register({defines.events.on_built_entity, defines.events.on_robot_built_entity, defines.events.script_raised_built}, function(e)
|
|
local entity = e.created_entity
|
|
if entity.valid and entity.name == "wooden-chest" then
|
|
if table_size(global.event.chests) == 0 then
|
|
-- enable void chest event
|
|
event.enable("void_chests_tick")
|
|
end
|
|
global.event.chests[entity.unit_number] = entity
|
|
end
|
|
end)
|
|
|
|
event.register(
|
|
{
|
|
defines.events.on_player_mined_entity,
|
|
defines.events.on_robot_mined_entity,
|
|
defines.events.on_entity_died,
|
|
defines.events.script_raised_destroy
|
|
},
|
|
function(e)
|
|
local entity = e.entity
|
|
if entity.name == "wooden-chest" then
|
|
global.event.chests[entity.unit_number] = nil
|
|
if table_size(global.event.chests) == 0 then
|
|
-- disable the void chest event
|
|
event.disable("void_chests_tick")
|
|
end
|
|
end
|
|
end
|
|
)
|
|
|
|
-- -------------------------------------
|
|
-- PLAYER SPECIFIC
|
|
-- when the shortcut is active, place fire at the player's feet
|
|
|
|
-- places fire at the player's feet
|
|
local function place_fire(e)
|
|
-- use the registered_players table that is passed with conditional events
|
|
for _,i in pairs(e.registered_players) do
|
|
local player = game.players[i]
|
|
player.surface.create_entity{
|
|
name = "fire-flame",
|
|
position = player.position
|
|
}
|
|
end
|
|
end
|
|
|
|
-- when the fire shortcut is pressed
|
|
event.register(defines.events.on_lua_shortcut, function(e)
|
|
local player = game.players[e.player_index]
|
|
if player.is_shortcut_toggled("toggle-fire-at-feet") then
|
|
player.set_shortcut_toggled("toggle-fire-at-feet", false)
|
|
-- disable the conditional event for this player specifically
|
|
event.disable("place_fire_at_feet", e.player_index)
|
|
else
|
|
player.set_shortcut_toggled("toggle-fire-at-feet", true)
|
|
-- enable the conditional event for this player specifically
|
|
event.enable("place_fire_at_feet", e.player_index)
|
|
end
|
|
end)
|
|
|
|
-- -------------------------------------
|
|
-- REGISTRATION
|
|
-- conditional events are registered in the root scope, or in on_init and on_load, then enabled/disabled during runtime
|
|
|
|
-- register the conditional events to allow for save/load safety
|
|
event.register_conditional{
|
|
place_fire_at_feet = {id=-6, handler=place_fire, options={skip_validation=true}},
|
|
void_chests_tick = {id=defines.events.on_tick, handler=void_chests_tick}
|
|
}
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- GUI EVENTS
|
|
|
|
-- change daytime depending on value of slider
|
|
-- conditionally registered if the GUI is open
|
|
local function set_daytime(e)
|
|
local surface = game.players[e.player_index].surface
|
|
surface.daytime = e.element.slider_value
|
|
-- update other players' sliders
|
|
for _,i in pairs(e.registered_players) do
|
|
if i ~= e.player_index then
|
|
global.event.players[i].slider.slider_value = e.element.slider_value
|
|
end
|
|
end
|
|
end
|
|
|
|
-- create some demo buttons
|
|
event.on_player_created(function(e)
|
|
local player = game.players[e.player_index]
|
|
local button_flow = mod_gui.get_button_flow(player)
|
|
button_flow.add{type="button", name="reh_demo_button_1", style=mod_gui.button_style, caption="DEMO1"}
|
|
button_flow.add{type="button", name="reh_demo_button_2", style=mod_gui.button_style, caption="DEMO2"}
|
|
end)
|
|
|
|
-- a clicked event for both buttons
|
|
event.on_gui_click(function(e)
|
|
local player = game.players[e.player_index]
|
|
player.print("[color=0,255,100]you clicked a demo button![/color]")
|
|
end, "reh_demo_button")
|
|
|
|
-- clicked event for demo button 1
|
|
event.on_gui_click(function(e)
|
|
local player = game.players[e.player_index]
|
|
player.print("[color=255,50,50]you clicked the first demo button![/color]")
|
|
-- raise the custom event
|
|
event.raise(event.get_id("custom_event"), {player_index=e.player_index})
|
|
end, "reh_demo_button_1")
|
|
|
|
-- clicked event for demo button 2
|
|
-- show/hide a mod GUI frame when clicked
|
|
event.on_gui_click(function(e)
|
|
local player = game.players[e.player_index]
|
|
local frame_flow = mod_gui.get_frame_flow(player)
|
|
if frame_flow.reh_demo_window then
|
|
-- close demo GUI
|
|
frame_flow.reh_demo_window.destroy()
|
|
-- disable the slider event
|
|
event.disable("change_daytime_slider", e.player_index)
|
|
-- remove slider from global
|
|
global.event.players[e.player_index].slider = nil
|
|
else
|
|
-- create a demo GUI
|
|
local window = frame_flow.add{type="frame", name="reh_demo_window", style=mod_gui.frame_style, direction="vertical", caption="REH Demo"}
|
|
local slider = window.add{type="slider", name="reh_demo_slider", minimum_value=0, maximum_value=1, value=player.surface.daytime}
|
|
-- enable slider event and set its GUI filters
|
|
event.enable("change_daytime_slider", e.player_index, slider.index)
|
|
-- add slider to global
|
|
global.event.players[e.player_index].slider = slider
|
|
end
|
|
end, "reh_demo_button_2")
|
|
|
|
-- register the conditional event to allow for save/load safety
|
|
event.register_conditional{
|
|
change_daytime_slider = {id=defines.events.on_gui_value_changed, handler=set_daytime, options={skip_validation=true}}
|
|
}
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- CUSTOM EVENTS
|
|
|
|
-- generate the event
|
|
-- you could also assign this to a local variable if desired
|
|
event.get_id("custom_event")
|
|
|
|
-- register a handler for the custom event
|
|
event.register(event.get_id("custom_event"), function(e)
|
|
game.print("[color=0,255,255]Player "..e.player_index.." fired the custom event![/color]")
|
|
end)
|
|
|
|
-- the custom event can also be used conditionally just like any other event
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- CONDITIONAL EVENT GROUPS
|
|
-- enable and disable events en masse
|
|
|
|
event.register({"on_init", "on_load"}, function()
|
|
local custom_events = {}
|
|
for i=1,50 do
|
|
custom_events["demo_"..i] = {id=-30, handler=function() log("DEMO "..i) end, group={"demo_group", math.floor(i/5)}}
|
|
end
|
|
event.register_conditional(custom_events)
|
|
end)
|
|
|
|
event.on_player_created(function(e)
|
|
local player = game.players[e.player_index]
|
|
local button_flow = mod_gui.get_button_flow(player)
|
|
button_flow.add{type="checkbox", name="reh_demo_button_3", caption="GROUPS", state=false}
|
|
end)
|
|
|
|
event.on_gui_checked_state_changed(function(e)
|
|
if e.element.state == true then
|
|
event.enable_group(1)
|
|
event.enable_group(3)
|
|
event.enable_group(4)
|
|
else
|
|
event.disable_group("demo_group")
|
|
end
|
|
end, "reh_demo_button_3") |