Modèle d'events¶
RitnLib n'enregistre aucun handler. C'est ton mod qui appelle
script.on_event. RitnLib te donne justeRitnLibEventpour normaliser le payload.
Principe¶
Factorio livre les events sous forme de tables brutes avec des champs variables selon l'event (event.player_index, event.entity, event.surface_index…). RitnLibEvent normalise tout ça en un seul objet cohérent.
-- Sans RitnLib
script.on_event(defines.events.on_built_entity, function(event)
local player = game.get_player(event.player_index) -- peut être nil
local entity = event.created_entity -- absent si non applicable
-- ...
end)
-- Avec RitnLib
script.on_event(defines.events.on_built_entity, function(event)
local e = RitnLibEvent(event)
local player = e:getPlayer() -- RitnLibPlayer ou nil, jamais d'exception
local entity = e:getEntity() -- LuaEntity ou nil
-- ...
end)
Ce que fait RitnLibEvent¶
Le constructeur reçoit la table event brute et en extrait les champs courants :
| Champ | Source | Type |
|---|---|---|
e.player_index |
event.player_index |
uint? |
e.surface_index |
event.surface_index |
uint? |
e.entity |
event.entity |
LuaEntity? |
e.name |
event.name |
uint (defines.events.*) |
e.tick |
event.tick |
uint |
| … | … | … |
Les méthodes :getPlayer(), :getSurface(), :getForce(), :getEntity() retournent des wrappers RitnLib ou nil. Elles ne lèvent jamais d'exception si le champ est absent.
Aucun handler propre¶
RitnLib ne fait pas script.on_event(...). Il n'a pas de boucle interne d'events. C'est ton mod qui est responsable de s'abonner aux events Factorio.
-- C'est TON control.lua qui fait ça :
script.on_event(defines.events.on_player_joined_game, function(event)
local e = RitnLibEvent(event)
-- ta logique ici
end)
Plusieurs handlers sur le même event¶
RitnLib n'interfère pas avec Factorio's event dispatch. Tu peux avoir plusieurs script.on_event pour le même event dans ton mod, et les brancher sur différentes parties de ta logique.
local function handle_player_joined(event)
local e = RitnLibEvent(event)
local player = e:getPlayer()
if not player then return end
player:print("Bienvenue !")
end
local function log_player_joined(event)
log("Player joined: " .. event.player_index)
end
script.on_event(defines.events.on_player_joined_game, handle_player_joined)
script.on_event(defines.events.on_player_joined_game, log_player_joined)
-- Les deux s'exécutent, dans cet ordre
Events et RitnLibGui¶
RitnLibGui suit le même principe : c'est ton mod qui enregistre le handler on_gui_click, et qui instancie RitnLibGui à l'intérieur pour dispatcher l'action.
script.on_event(defines.events.on_gui_click, function(event)
local gui = RitnLibGui(event, "mon-mod")
gui:on_gui_click() -- dispatche vers remote.call("mon-mod", "gui_action_<gui_name>", ...)
end)
Voir Contrat remote consommateur pour le détail du pattern GUI.