← Back to mod overview

Release notes

LeanCore Changelog

Active

Hytale • Latest version 1.7.0

Changelog version 1.7.0 1.6.1 → 1.7.0 • June 23, 2026

Añadido

  • Dormancia de zona consciente del contenido: LeanCore ahora muestrea la densidad de contenido construido por zona (cofres, mesas de trabajo y otras block entities) y sesga los temporizadores de dormancia y el orden de expulsión para mantener cargadas más tiempo las zonas ricas en contenido, incluso inactivas. Activado por defecto
  • Gobernanza del radio caliente/de simulación: bajo presión de heap, LeanCore puede recortar el radio de ticking del servidor, separado del radio de vista del cliente para que no haya pop-in, reduciendo el coste de simulación además de los recortes de vista ya existentes. Activado por defecto, con la misma ventana de gracia que el gobernador de vista
  • Verdad de descarga por chunk: la expulsión de chunks del engine ahora se cuenta de forma exacta en el hilo del mundo, en vez de inferirse del delta neto de chunks cargados, dejando la señal de aprendizaje de “esta descarga se mantuvo” mucho más limpia. Activado por defecto

Cambiado

  • Las lecturas por mundo (zonas calientes, diff del conjunto de chunks, escaneo de contenido) se agrupan en un único dispatch del hilo del mundo por tick, reduciendo el overhead de dispatch
  • Los cambios del radio caliente ahora se registran, así que el gobernador del radio de ticking reporta su objetivo igual que ya lo hace el gobernador de vista
  • El esquema de persistencia de aprendizaje sube a v9 (añade un content score por zona); los snapshots antiguos v7 y v8 se leen y actualizan automáticamente

Corregido

  • Los stats de reúso de zona ahora son inmutables para lecturas seguras entre hilos, los contadores de false-cut son atómicos, y el tracker del conjunto de chunks por mundo ya no retiene snapshots de mundos que desaparecieron
  • El envejecimiento de la dormancia ya no avanza su reloj cuando un fan-out por mundo solo se completa parcialmente bajo carga, así que las zonas inactivas siguen enfriándose a tiempo
  • El apagado del runtime está protegido contra ejecución doble, así que un reinicio no ejecuta el camino de guardado y cierre dos veces
  • Las tareas del hilo del mundo que lanzan excepción ahora se registran, en vez de tragarse en silencio
  • Las zonas ricas en contenido ahora persisten incluso antes de alcanzar el umbral normal de visitas

Notas

  • Se añaden nuevas claves de LeanCore.json en el primer arranque: la verdad de descarga por chunk, el modelo de contenido y la gobernanza del radio caliente vienen activadas por defecto. Ponlas en false para mantener el comportamiento de 1.6.x
  • El LeanCore.json y el learning.state.gz existentes se conservan y actualizan en su lugar; sin migración manual
Changelog version 1.6.1 1.6.0 → 1.6.1 • June 20, 2026

Cambiado

  • Limpieza interna: eliminación de código muerto (tipo de snapshot sin uso, helpers de dormancy/profile sin uso, writers de persistencia heredados). Sin cambios de comportamiento

Corregido

  • Seguridad de hilos: el muestreo de dispersión de heap, la presión regional de entidades, el sondeo de descarga del motor, la saturación de chunks, las posiciones de jugador de dormancy y el movimiento en solitario ahora reutilizan la posición muestreada en el hilo del mundo o se ejecutan dentro de un dispatch de mundo, en vez de leer transforms de jugador o chunk stores fuera del hilo del mundo
  • Se respetan los timeouts de dispatch: una tarea de mundo que agotó el tiempo ya no avanza el estado de política ni sobreestima los chunks descargados; la acción simplemente se reintenta en el siguiente tick
  • Las herramientas de admin funcionan con el HUD apagado: /leancore heatmap y /leancore zone pin|unpin|pins ya no dependen de hudFeatureEnabled, así que los admins pueden usarlas con el HUD desactivado (el valor por defecto)

Notas

  • Sin cambios de config, comandos o API desde 1.6.0; se conservan el LeanCore.json y el learning.state.gz existentes
  • Actualización directa desde 1.6.0; sigue requiriendo servidor Hytale >=0.5.6
Changelog version 1.6.0 1.5.0 → 1.6.0 • June 20, 2026

Añadido

  • Modelo de movimiento del jugador (motionModelEnabled, activado por defecto): velocidad y confianza por jugador con posición prevista en un horizonte corto
  • Retención predictiva de zonas: el unload de chunks se inclina lejos de hacia dónde va el jugador; las zonas en la vista actual o prevista nunca son candidatas a unload (cono protegido)
  • Modelo de reuse-distance + supervivencia (zoneReuseModelEnabled, activado por defecto): aprende qué zonas se revisitan y ajusta los umbrales de dormancia por zona; persistido con prune/TTL
  • Diagnóstico siempre activo (diagnosticLogEnabled, activado por defecto): resúmenes de inicio/cierre y logs de decisión [diag] para cada perfil, de modo que solo el log del servidor explica qué hizo el mod y por qué
  • Boost cinematográfico de vista (motionViewRadiusBoostEnabled, opt-in / desactivado por defecto): sube la distancia de visión de forma suave para quien se mueve rápido
  • Schema de snapshot v8: añade features de movimiento del jugador y stats de reuse de zona; lee snapshots v7

Cambiado

  • El ranking de unload de dormancia mide la distancia al chunk más cercano de la zona (borde AABB), no al centro, para un unload más preciso
  • La persistencia de learning corre en un hilo dedicado de escritor único, separado del tick del runtime
  • LeanCore.json nuevo trae defaults 1.6.0: modelo de movimiento y modelo de reuse activados; boost cinematográfico desactivado

Corregido

  • Seguridad multi-mundo: el fan-out por mundo solo hace merge en caso de éxito y respeta un presupuesto por tick; afinidad de world thread corregida para que un mundo nunca envejezca ni descargue zonas de otro
  • Persistencia sin race: flush de escritor único con archivos temp únicos; features de movimiento y clasificador de actividad thread-safe; límites simétricos de lectura/escritura en el codec
  • Suavidad del streaming de chunks: el boost cinematográfico queda desactivado por defecto porque reescribir el view radius del cliente cada tick genera churn de chunks y stutter en el engine actual

Eliminado

  • Superficie pública LeanCoreAPI (ahora solo interna)

Notas

  • Requiere servidor Hytale >=0.5.6
  • Los defaults solo/LITE siguen suaves: los modelos de movimiento y reuse no cambian view radius ni tasa de chunks por sí solos; el boost cinematográfico es opt-in
  • El stutter residual de carga de chunks en movimiento rápido es del engine (hooks de pre-load) y fuera del alcance del mod
Changelog version 1.5.0 1.4.1 → 1.5.0 • June 15, 2026

Añadido

  • Gobernador de memoria LITE en solo integrado (liteMemoryGovernorEnabled, activado por defecto): escala de vista, degradación de zonas y barridos de unload sin governEnabled
  • View-radius adaptativa en LITE (liteViewRadiusEnabled): COMFORT al 100% hasta presión de chunks o heap; cortes suaves en WATCH; agresivo solo en TIGHT/CRITICAL
  • Unload AFK en LITE (liteUnloadEnabled): reclaim de zonas dormant/frozen lejanas en idle; la puerta de probe sigue aplicando; no requiere unloadEnabled en solo
  • Aprendizaje LITE (liteLearningEnabled, activado por defecto): demand model + persistencia gzip en solo; sin bandit ni holdout en LITE
  • Claves lite: liteViewPressureThreshold, liteViewComfortCapScale, liteViewWatchScale, liteViewTightScale, liteViewCriticalScale, liteMinClientViewRadius, liteViewRadiusLoginGraceSeconds, liteUnloadIdleSeconds, liteUnloadMaxChunksPerSweep
  • Señales dobles de presión en LITE: tier de heap JVM + saturación de chunks (loaded / view budget)
  • /leancore savings: bloque del gobernador lite (preset, tier, flags lite, contadores de zona/chunk)
  • /leancore status: flags lite govern/view/learning/unload y línea de puerta lite unload
  • /leancore learn: pie LITE aclara aprendizaje solo de demanda en solo

Cambiado

  • El perfil solo LITE ahora ejecuta tick completo del gobernador lite en la world thread (no solo muestreo de dormancia)
  • LeanCore.json nuevo trae defaults 1.5.0 (lite*Enabled=true; rutas STANDARD/FULL siguen off hasta activarlas)
  • Intervalo de persistencia STANDARD/FULL conservador; LITE hace flush en su propia ruta con liteLearningEnabled activo

Corregido

  • Dispatch en world thread con alcance por mundo (GovernorWorldContext); dispatch inline solo en el mundo correcto
  • Tick del gobernador LITE corre enteramente dentro de world.execute
  • Endurecimiento de carga de learning: learning.state.gz inválido en cuarentena; validación del codec al leer
  • Sanitización de LeanCore.json: JSON inválido en cuarentena, guardado atómico, límites en claves de view/unload

Notas

  • Unload LITE aún necesita /leancore probe con unloadProbeGateEnabled activo (por defecto)
  • Barridos LITE solo corren con tier de heap WATCH o peor y zonas distant dormant; COMFORT + spread bajo con unload cero es normal
  • STANDARD/FULL sin cambios: governEnabled, learningEnabled, unloadEnabled como antes
  • Usa embeddedStandardProfile: true solo para dogfood de STANDARD en solo
Changelog version 1.4.1 1.4.0 → 1.4.1 • June 14, 2026

Añadido

  • Puerta de probe para unload (unloadProbeGateEnabled, activada por defecto): el unload de chunks por política queda bloqueado hasta que /leancore probe pase; línea de la puerta en /leancore status; probePassedAtMs guardado en LeanCore.json
  • Métricas de sesión de gcHint en /leancore savings cuando gcHintEnabled está activo (recuento de hints y antigüedad del último hint)

Cambiado

  • /leancore status muestra diagnósticos solo LITE (tick adaptativo, flags govern/learning/unload, línea de la puerta de unload)
  • /leancore probe persiste la marca de tiempo al pasar y confirma cuando se abre la puerta de unload
  • /leancore learn informa del estado del flush de learning (flushErr, hora del último flush); errores de IO v7 en load/flush van al log del servidor

Corregido

  • El governor aplaza unload, view-radius y presión regional cuando falta la world primaria (muestreo de heap y actualizaciones de learning continúan)

Notas

  • El unload en STANDARD/FULL sigue requiriendo governEnabled + unloadEnabled + probe exitoso con la puerta activada
  • Pon unloadProbeGateEnabled: false solo si quieres anular la puerta de seguridad a propósito
  • View-radius en solo embebido sin cambios: requiere dedicatedServerMode: true
Changelog version 1.4.0 1.3.0 → 1.4.0 • June 10, 2026

Añadido

  • Snapshot de learning v7 (learning.state.gz): formato binario gzip; migra el learning.state legado en el primer flush

  • Poda de perfiles: learningMaxPersistedPlayers (predeterminado 512) y learningPlayerTtlDays (predeterminado 90)

  • embeddedStandardProfile: solo embebido en STANDARD (15s) sin dedicatedServerMode / tick FULL de 5s

  • Capa de dispatch en world thread: WorldDispatch, GovernorWorldContext, RuntimeGuard para la semántica TickingThread de Hytale

  • gcHintEnabled: hint experimental de GC en idle LITE (desactivado por defecto)

Cambiado

  • Scheduler daemon LeanCore-runtime; shutdown anticipado en ShutdownEvent

  • Ticks del governor: world.execute coalescido (como máximo un tick pendiente; el scheduler ya no bloquea hasta 5s)

  • Policy apply + unload de chunks inline cuando world.isInThread()

  • HUD eliminado en shutdown; HttpClient de webhook en executor daemon

Corregido

  • java.exe zombie al cerrar Hytale embebido con config estilo dedicado (world.execute anidado + espera bloqueante dejaba tareas en la cola de la world; TickingThread mantenía la JVM viva tras Shutdown completed!)

  • View-radius en solo embebido sigue requiriendo dedicatedServerMode: true (regla intencional)

Notas

  • Active unloadEnabled solo tras el baseline en /leancore probe
Changelog version 1.3.0 1.2.2 → 1.3.0 • June 9, 2026

Añadido

  • /leancore savings: pico/baseline/delta de heap JVM de sesión, estado del gobernador y acciones cumulativas de zona/chunk (medido vs estimado)

  • DedicatedBootstrap: preset único en el primer boot dedicado (governEnabled, viewRadiusGovernanceEnabled, learningEnabled; unloadEnabled permanece off)

  • Grace de 10 minutos para view-radius tras el arranque del runtime dedicado

Cambiado

  • ZoneDormancyMap: refresh incremental sin rebuild completo del mapa; prune de zonas antiguas

  • OnlineLinearDemandModel: weight decay (0.9995) por update para adaptar cambios de estilo de juego

  • chunkUnloadEventTracking: conteo de unloads de la engine vía polling en world thread (sin listener ECS de ChunkUnloadEvent)

  • Tick del gobernador STANDARD/FULL despachado en world thread

Corregido

  • Crash en preset FULL / dedicado (Assert not in thread en unload de chunks de la engine) por acceso a ChunkStore fuera de world thread y registro inseguro de evento de unload

  • Sonda de presión regional (S4) ya no lee ChunkStore en la thread del scheduler

Notas

  • /leancore savings muestra solo heap JVM — no es RAM de VPS/OS

  • dedicatedBootstrapEnabled: false desactiva el preset automático

  • El JAR de CurseForge debe incluir los commits de thread-safety en main tras 53c801f

Changelog version 1.2.1 1.2.0 → 1.2.1 • June 8, 2026

Añadido

  • Cache de clasificación break/place y cache de gather type por ítem
  • Ventana de actividad reciente para cambio rápido MINER / LUMBERJACK / BUILDER
  • Dirty flush de learning.state cuando learning está activo

Cambiado

  • Media-vida de EMAs de actividad en 20s con inhibición cruzada al cambiar de role
  • Entrenamiento ML con throttle; perfil LITE sin chunk probe en tick de dormancy
  • Hatchet y bloques de madera de Hytale antes de heurísticas de pico

Corregido

  • Cambio lento de role al pasar de minería a tala
  • Decay de EMA en LITE solo durante eventos de bloque
  • Stutter por classify + train ML en cada rotura en el thread ECS

Notas

  • Mismo schema v4 de learning.state que 1.2.0
  • El KPI principal sigue siendo heap JVM del servidor
Changelog version 1.2.0 1.1.0 → 1.2.0 • June 8, 2026

Añadido

  • Activity Sense (ML): clasificador softmax multiclase online entrenado con eventos ECS en vivo
  • Clasificador de bloque/herramienta: id de ítem, gather type y grupo del bloque etiquetan roturas/colocaciones (MINE, CHOP, FARM, BUILD)
  • Nuevos estilos de juego: MINER, LUMBERJACK, FARMER junto a los comportamientos existentes
  • EMAs por actividad: mine, wood, farm, build, craft, combat en ventanas móviles
  • Listener de combate: FIGHTER solo desde eventos de daño, no roturas genéricas de bloque
  • Señal de craft: CraftRecipeEvent.Pre alimenta actividad de craft
  • Schema de features v2 (demandDim=11) con EMAs específicos por actividad
  • /leancore learn player: EMAs de actividad y estado activityModel=SOFTMAX
  • Tests unitarios para clasificador de bloque, modelo de actividad y posterior

Cambiado

  • Posterior de comportamiento usa softmax ML como ruta principal; fallback EMA antes del warm-up
  • learning.state schema v4: persiste clasificador de actividad + EMAs por jugador
  • /leancore learn reporta featureSchema=v2 cuando el demand model está activo

Corregido

  • Minar con pico ya no se etiqueta como FIGHTER — roturas ponderadas por contexto de herramienta/bloque

Notas

  • El ML de actividad corre in-process en la JVM del servidor (sin mod en cliente)
  • La heurística actúa como teacher hasta que el softmax calienta (updates >= 8)
  • El KPI principal sigue siendo heap JVM del servidor, no FPS del cliente
Changelog version 1.1.0 1.0.0 → 1.1.0 • June 8, 2026

Añadido

  • Perfiles de runtime escalados en host embebido: LITE (solo), STANDARD (amigos), FULL (dedicado)

  • localHostMode AUTO (por defecto): dormancy ligera en solo; escala cuando entran amigos

  • Sonda regional de entidades (S4): conteo por zona vía EntityChunk en /leancore probe

  • Seguimiento ChunkUnloadEvent (opcional): contadores policy vs engine en /leancore learn

  • OnlineLinearDemandModel: demanda de retención aprendida con features de actividad (schema v1)

  • LeanCoreAPI: consultar tier, pin/unpin de zonas, snapshots de jugador para otros mods

  • Cohorte holdout (10%): el bandit aprende del cohort treatment; holdout no recibe cortes de view-radius

  • Tests unitarios de perfiles de runtime, política de activación, normalización y demand model

Cambiado

  • El runtime usa HytaleServer.SCHEDULED_EXECUTOR con retraso inicial de 30s en mundos locales

  • Defaults más seguros: governEnabled=false, viewRadiusGovernanceEnabled=false, HUD/learning off

  • Gobernanza de view-radius desactivada en solo embebido aunque el governor esté activo

  • Policy applier solo aplica view-radius cuando la policy cambia de verdad (throttle)

  • /leancore status muestra el profile activo (LITE / STANDARD / FULL)

  • /leancore learn muestra featureSchema=v1, estado del demand model y atribución de unload

Corregido

  • Los mundos locales ya no stutterean por un tick pesado cada 5s + HUD + learning

  • Seguimiento de unload de chunks off por defecto (evita assert de thread del engine)

Notas

  • El KPI principal sigue siendo heap JVM del servidor, no FPS o GPU del cliente

  • Solo: mantén localHostMode: AUTO. Dedicado: dedicatedServerMode: true y luego ajusta el governor

Changelog version 1.0.0 0.5.0-SNAPSHOT → 1.0.0 • June 7, 2026

Añadido

  • Primer lanzamiento estable público (1.0.0)
  • Gobernador de memoria con tiers COMFORT → CRITICAL, rollback y aprendizaje contextual
  • Mapa de dormancia espacial (HOT / WARM / DORMANT / FROZEN) y barridos de unload de chunks
  • Demanda de retención por jugador desde actividad en vivo
  • Cuantiles de heap calibrados en servidor y persistencia learning.state (schema v3)
  • HUD admin (/leancore hud on|off|status) — opt-in, grupos y permisos
  • Heatmap de zonas (/leancore heatmap [limit])
  • Overrides de zone pin (/leancore zone pin|unpin|pins)
  • Webhook CRITICAL opcional (criticalWebhookUrl, JSON genérico)
  • Asset pack de servidor para UI del HUD

Notas

  • KPI principal es heap JVM del servidor, no FPS en cliente