Saltearse al contenido

Scripting en Lua y Watchdog de Seguridad

CraftingEngine integra un entorno de ejecución de LuaJ 3.0.1 seguro y de alto rendimiento que permite a administradores y creadores de contenido programar condiciones dinámicas, fórmulas matemáticas procedimentales y acciones de etapa avanzadas.


1. Arquitectura de Seguridad y Sandbox

Para proteger el rendimiento del servidor, la ejecución de Lua está estrictamente aislada:

  • Sin Acceso al Sistema Operativo: Se bloquean las funciones de io.*, os.execute y manipulación de archivos.
  • Cuota de Instrucciones: La ejecución está limitada por scripting.max-instructions: 10000, evitando bucles infinitos (while true do).
  • Watchdog de Tiempo Real: Cualquier script que sobrepase scripting.execution-timeout-ms: 50 es interrumpido de inmediato.

2. Variables de Contexto Disponibles

Cada script ejecutado en el contexto de un crafteo recibe variables globales predefinidas:

-- Datos del jugador
local player_name = context.player.name
local player_uuid = context.player.uuid
local player_level = context.player.level
-- Variables de estado de la estación
local temp = context.station.get_variable("temperature")
local pressure = context.station.get_variable("pressure")
-- Métricas de la etapa
local strikes = context.stage.strikes_count

3. Creación de Scripts Reutilizables (presets/scripts/*.lua)

Puedes guardar tus scripts en plugins/CraftingEngine/presets/scripts/:

Ejemplo: Cálculo Dinámico de Enfriamiento (calculate_cooling.lua)

function evaluate(current_temp, ambient_temp, elapsed_seconds)
local k = 0.05 -- Constante de enfriamiento
local result = ambient_temp + (current_temp - ambient_temp) * math.exp(-k * elapsed_seconds)
return math.max(ambient_temp, result)
end

Invocación desde un Blueprint

stages:
- id: "custom_cooling"
on_tick:
- action: "lua:presets/scripts/calculate_cooling.lua"

4. Expresiones Matemáticas en Línea

Para condiciones numéricas simples, CraftingEngine permite evaluar fórmulas matemáticas AST directamente en el YAML:

requirements:
conditions:
- id: "heat_balance"
condition: "math:(station.temperature * 1.5) > (player.level * 10)"

Siguientes Pasos

  • Guía de API - Registra acciones y condiciones Java personalizadas invocables desde Lua.
  • Etapas y Transiciones - Descubre cómo vincular eventos de etapa a scripts.