Files

98 lines
3.1 KiB
Lua

--init
local modpath = minetest.get_modpath("eye_spy")
-- Load modules in dependency order:
-- 1. Core declarations + helpers (defines eye_spy = {})
dofile(modpath .. "/functions.lua")
-- 2. Config (needs eye_spy.storage from functions.lua)
dofile(modpath .. "/config.lua")
-- 3. Performance metrics (needs eye_spy.config)
dofile(modpath .. "/perf.lua")
-- 4. Pure utilities (no minetest runtime deps)
dofile(modpath .. "/colors.lua")
dofile(modpath .. "/tools.lua") -- needs eye_spy.S
-- 5. Target acquisition + enrichment
dofile(modpath .. "/target.lua")
dofile(modpath .. "/enrichers.lua")
-- 6. Rendering
dofile(modpath .. "/render.lua")
-- 7. Registration (entities, nodes)
dofile(modpath .. "/preview.lua")
-- 8. UI + Commands (last, can reference everything above)
dofile(modpath .. "/ui.lua")
dofile(modpath .. "/commands.lua")
-- Detect game type — sets eye_spy.cg used by tools.lua at runtime.
-- tools.lua reads eye_spy.cg inside function bodies, not at load time, so this is fine.
if minetest.get_modpath("default") then
eye_spy.cg = "minetest_game"
elseif minetest.get_modpath("mcl_core") then
eye_spy.cg = "mineclone"
-- Note: voxelibre/mineclonia distinction reserved for future differentiation.
if minetest.get_modpath("vl_legacy") then
eye_spy.cgs = "voxelibre"
else
eye_spy.cgs = "mineclonia"
end
end
-- Player join: initialise per-player state and defaults.
minetest.register_on_joinplayer(function(player)
local meta = player:get_meta()
-- Clear legacy tracking keys.
meta:set_string("es_last_obj", "")
meta:set_int("es_last_health", -1)
-- Apply defaults for any keys not yet set.
eye_spy.ensure_player_defaults(player)
-- Initialise runtime state.
local state = eye_spy.get_player_state(player)
state.timer = 0
state.edit_mode = false
eye_spy.edit_mode[player:get_player_name()] = false
end)
-- Player leave: clean up ALL per-player runtime data.
minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
-- Runtime state tables.
eye_spy.state.players[player_name] = nil
eye_spy.edit_mode[player_name] = nil
eye_spy.pending_preview_updates[player_name] = nil
eye_spy.pending_layout_refreshes[player_name] = nil
eye_spy.ui_drafts[player_name] = nil
-- Invalidate render layout signature cache.
if eye_spy.render and eye_spy.render.invalidate_layout_sig then
eye_spy.render.invalidate_layout_sig(player_name)
end
-- Enricher tool-hint cache.
if eye_spy.enrichers and eye_spy.enrichers.on_player_leave then
eye_spy.enrichers.on_player_leave(player_name)
end
-- HUD elements are automatically destroyed by the engine when a player leaves,
-- but we must remove our engine references to prevent stale ID usage on rejoin.
eye_spy.remove_huds(player)
end)
-- Main game loop.
minetest.register_globalstep(function(dtime)
eye_spy.step(dtime)
end)
minetest.log("action", "[eye_spy] Mod loaded successfully.")