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")