← 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

Adicionado

  • Dormancy de zona ciente de conteúdo: o LeanCore agora amostra a densidade de conteúdo construído por zona (baús, bancadas e outras block entities) e enviesa os timers de dormancy e a ordem de eviction para manter zonas ricas em conteúdo carregadas por mais tempo, mesmo ociosas. Ligado por padrão
  • Governança do raio quente/de simulação: sob pressão de heap, o LeanCore pode reduzir o raio de ticking do servidor, separado do raio de view do cliente para não haver pop-in, cortando custo de simulação além dos cortes de view já existentes. Ligado por padrão, com a mesma janela de grace do governor de view
  • Verdade de unload por chunk: a eviction de chunk pelo engine agora é contada de forma exata na thread da world, em vez de inferida pelo delta líquido de chunks carregados, deixando o sinal de aprendizado de “esse unload se manteve” muito mais limpo. Ligado por padrão

Alterado

  • As leituras por world (zonas quentes, diff do conjunto de chunks, scan de conteúdo) são agrupadas em um único dispatch de world por tick, reduzindo o overhead de dispatch
  • Mudanças do raio quente agora são logadas, então o governor de raio de ticking reporta seu alvo do mesmo jeito que o governor de view já faz
  • Schema de persistência de aprendizado subiu para v9 (adiciona um content score por zona); snapshots antigos v7 e v8 são lidos e atualizados automaticamente

Corrigido

  • Os stats de reuse de zona agora são imutáveis para leituras seguras entre threads, os contadores de false-cut são atômicos, e o tracker de conjunto de chunks por world não retém mais snapshots de worlds que sumiram
  • O envelhecimento da dormancy não avança mais seu relógio quando um fan-out por world completa só parcialmente sob carga, então zonas ociosas continuam esfriando no tempo certo
  • O shutdown do runtime é protegido contra execução dupla, então um restart não roda o caminho de save e teardown duas vezes
  • Tarefas da thread da world que lançam exceção agora são logadas, em vez de engolidas em silêncio
  • Zonas ricas em conteúdo agora persistem mesmo antes de atingir o limiar normal de visitas

Notas

  • Novas chaves do LeanCore.json são adicionadas no primeiro boot: verdade de unload por chunk, modelo de conteúdo e governança de raio quente vêm ligadas por padrão. Coloque-as em false para manter o comportamento da 1.6.x
  • O LeanCore.json e o learning.state.gz existentes são mantidos e atualizados no lugar; sem migração manual
Changelog version 1.6.1 1.6.0 → 1.6.1 • June 20, 2026

Alterado

  • Limpeza interna: remoção de código morto (tipo de snapshot sem uso, helpers de dormancy/profile sem uso, writers de persistência legados). Sem mudança de comportamento

Corrigido

  • Segurança de thread: a amostragem de spread de heap, a pressão regional de entidades, o polling de unload do engine, a saturação de chunks, as posições de jogador da dormancy e o movimento solo agora reutilizam a posição amostrada na thread da world ou rodam dentro de um dispatch de world, em vez de ler transforms de jogador ou chunk stores fora da thread da world
  • Timeouts de dispatch respeitados: uma tarefa de world que estourou o tempo não avança mais o estado de política nem superestima chunks descarregados; a ação apenas tenta de novo no próximo tick
  • Ferramentas de admin funcionam com o HUD desligado: /leancore heatmap e /leancore zone pin|unpin|pins não dependem mais de hudFeatureEnabled, então admins podem usá-las com o HUD desativado (o padrão)

Notas

  • Sem mudanças de config, comando ou API desde a 1.6.0; o LeanCore.json e o learning.state.gz existentes são mantidos como estão
  • Atualização drop-in a partir da 1.6.0; ainda requer servidor Hytale >=0.5.6
Changelog version 1.6.0 1.5.0 → 1.6.0 • June 20, 2026

Adicionado

  • Modelo de movimento do jogador (motionModelEnabled, ligado por padrão): velocidade e confiança por jogador com posição prevista em um horizonte curto
  • Retenção preditiva de zonas: o unload de chunks é inclinado para longe de onde o jogador está indo; zonas na view atual ou prevista nunca são candidatas a unload (cone protegido)
  • Modelo de reuse-distance + sobrevivência (zoneReuseModelEnabled, ligado por padrão): aprende quais zonas são revisitadas e ajusta os limiares de dormência por zona; persistido com prune/TTL
  • Diagnóstico sempre ligado (diagnosticLogEnabled, ligado por padrão): resumos de início/fim e logs de decisão [diag] para cada perfil, então só o log do servidor já explica o que o mod fez e por quê
  • Boost cinematográfico de view (motionViewRadiusBoostEnabled, opt-in / desligado por padrão): sobe a view distance suavemente para quem se move rápido
  • Schema de snapshot v8: adiciona features de movimento do jogador e stats de reuse de zona; lê snapshots v7

Alterado

  • O ranking de unload de dormência mede a distância até o chunk mais próximo da zona (borda AABB), não o centro, para unload mais preciso
  • A persistência de learning roda em uma thread dedicada de escritor único, separada do tick do runtime
  • LeanCore.json novo traz defaults 1.6.0: modelo de movimento e modelo de reuse ligados; boost cinematográfico desligado

Corrigido

  • Segurança multi-mundo: o fan-out por mundo só faz merge em caso de sucesso e respeita um orçamento por tick; afinidade de world thread corrigida para que um mundo nunca envelheça ou descarregue zonas de outro
  • Persistência sem race: flush de escritor único com arquivos temp únicos; features de movimento e classificador de atividade thread-safe; caps simétricos de leitura/escrita no codec
  • Suavidade do streaming de chunks: o boost cinematográfico fica desligado por padrão porque reescrever a view radius do cliente a cada tick gera churn de chunks e stutter no engine atual

Removido

  • Superfície pública LeanCoreAPI (agora interna apenas)

Notas

  • Requer servidor Hytale >=0.5.6
  • Os defaults solo/LITE continuam suaves: os modelos de movimento e reuse não mudam view radius ou taxa de chunks sozinhos; o boost cinematográfico é opt-in
  • O stutter residual de carregamento de chunks em movimento rápido é do engine (hooks de pré-load) e fora do alcance do mod
Changelog version 1.5.0 1.4.1 → 1.5.0 • June 15, 2026

Adicionado

  • Governador de memória LITE em solo embutido (liteMemoryGovernorEnabled, ligado por padrão): escala de view, demotion de zonas e sweeps de unload sem governEnabled
  • View-radius adaptativa em LITE (liteViewRadiusEnabled): COMFORT em 100% até pressão de chunks ou heap; cortes leves em WATCH; agressivo só em TIGHT/CRITICAL
  • Unload AFK em LITE (liteUnloadEnabled): reclaim de zonas dormant/frozen distantes em idle; portão de probe ainda se aplica; não exige unloadEnabled no solo
  • Learning LITE (liteLearningEnabled, ligado por padrão): demand model + persistência gzip no solo; sem bandit ou holdout em LITE
  • Chaves lite: liteViewPressureThreshold, liteViewComfortCapScale, liteViewWatchScale, liteViewTightScale, liteViewCriticalScale, liteMinClientViewRadius, liteViewRadiusLoginGraceSeconds, liteUnloadIdleSeconds, liteUnloadMaxChunksPerSweep
  • Sinais duplos de pressão em LITE: tier de heap JVM + saturação de chunks (loaded / view budget)
  • /leancore savings: bloco do governador lite (preset, tier, flags lite, contadores de zona/chunk)
  • /leancore status: flags lite govern/view/learning/unload e linha do portão lite unload
  • /leancore learn: rodapé LITE esclarece learning só de demanda no solo

Alterado

  • Perfil solo LITE agora roda tick completo do governador lite na world thread (não só amostragem de dormancy)
  • LeanCore.json novo traz defaults 1.5.0 (lite*Enabled=true; caminhos STANDARD/FULL continuam off até você ligar)
  • Intervalo de persistência STANDARD/FULL conservador; LITE faz flush no próprio caminho com liteLearningEnabled ligado

Corrigido

  • Dispatch na world thread com escopo por mundo (GovernorWorldContext); dispatch inline só no mundo certo
  • Tick do governador LITE roda inteiro dentro de world.execute
  • Hardening do load de learning: learning.state.gz inválido em quarentena; validação do codec na leitura
  • Sanitização do LeanCore.json: JSON inválido em quarentena, save atômico, caps em chaves de view/unload

Notas

  • Unload LITE ainda precisa de /leancore probe com unloadProbeGateEnabled ligado (padrão)
  • Sweeps LITE só rodam com tier de heap WATCH ou pior e zonas distant dormant; COMFORT + spread baixo com unload zero é normal
  • STANDARD/FULL inalterado: governEnabled, learningEnabled, unloadEnabled como antes
  • Use embeddedStandardProfile: true só para dogfood de STANDARD no solo
Changelog version 1.4.1 1.4.0 → 1.4.1 • June 14, 2026

Adicionado

  • Portão de probe para unload (unloadProbeGateEnabled, ligado por padrão): unload de chunks por política fica bloqueado até /leancore probe passar; linha do portão em /leancore status; probePassedAtMs salvo em LeanCore.json
  • Métricas de sessão do gcHint em /leancore savings quando gcHintEnabled está ligado (contagem de hints e idade do último hint)

Alterado

  • /leancore status mostra diagnósticos solo LITE (tick adaptativo, flags govern/learning/unload, linha do portão de unload)
  • /leancore probe persiste o timestamp de sucesso e confirma quando o portão de unload abre
  • /leancore learn reporta status do flush de learning (flushErr, hora do último flush); erros de IO v7 no load/flush vão para o log do servidor

Corrigido

  • Governor adia unload, view-radius e pressão regional quando a world primária está ausente (amostragem de heap e updates de learning continuam)

Notas

  • Unload em STANDARD/FULL ainda exige governEnabled + unloadEnabled + probe com sucesso quando o portão está ligado
  • Use unloadProbeGateEnabled: false só se quiser ignorar o portão de segurança de propósito
  • View-radius em solo embutido inalterado: exige dedicatedServerMode: true
Changelog version 1.4.0 1.3.0 → 1.4.0 • June 10, 2026

Adicionado

  • Snapshot de learning v7 (learning.state.gz): formato binário gzip; migra o learning.state legado no primeiro flush

  • Poda de perfis: learningMaxPersistedPlayers (padrão 512) e learningPlayerTtlDays (padrão 90)

  • embeddedStandardProfile: solo embutido em STANDARD (15s) sem dedicatedServerMode / tick FULL de 5s

  • Camada de dispatch na world thread: WorldDispatch, GovernorWorldContext, RuntimeGuard para semântica do TickingThread do Hytale

  • gcHintEnabled: hint experimental de GC em idle LITE (desligado por padrão)

Alterado

  • Scheduler daemon LeanCore-runtime; shutdown antecipado no ShutdownEvent

  • Ticks do governor: world.execute coalescido (no máximo um tick pendente; scheduler não bloqueia mais até 5s)

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

  • HUD removido no shutdown; HttpClient de webhook em executor daemon

Corrigido

  • java.exe zumbi ao fechar o Hytale embutido com config estilo dedicado (world.execute aninhado + espera bloqueante deixava tarefas na fila da world; TickingThread mantinha a JVM viva após Shutdown completed!)

  • View-radius em solo embutido continua exigindo dedicatedServerMode: true (regra intencional)

Notas

  • Habilite unloadEnabled só após baseline em /leancore probe
Changelog version 1.3.0 1.2.2 → 1.3.0 • June 9, 2026

Adicionado

  • /leancore savings: pico/baseline/delta de heap JVM da sessão, estado do governor e ações cumulativas de zona/chunk (medido vs estimado)
  • DedicatedBootstrap: preset único no primeiro boot dedicado (governEnabled, viewRadiusGovernanceEnabled, learningEnabled; unloadEnabled permanece off)
  • Grace de 10 minutos para view-radius após start do runtime dedicado

Alterado

  • ZoneDormancyMap: refresh incremental sem rebuild completo do mapa; prune de zonas antigas
  • OnlineLinearDemandModel: weight decay (0.9995) por update para adaptar mudança de estilo de jogo
  • chunkUnloadEventTracking: contagem de unloads da engine via polling na world thread (sem listener ECS de ChunkUnloadEvent)
  • Tick do governor STANDARD/FULL despachado na world thread

Corrigido

  • Crash no preset FULL / dedicado (Assert not in thread no unload de chunks da engine) por acesso ao ChunkStore fora da world thread e registro inseguro de evento de unload
  • Probe de pressão regional (S4) não lê mais ChunkStore na thread do scheduler

Notas

  • /leancore savings mostra só heap JVM — não é RAM da VPS/OS
  • dedicatedBootstrapEnabled: false desliga o preset automático
  • O JAR do CurseForge deve incluir os commits de thread-safety em main após 53c801f
Changelog version 1.2.2 1.2.1 → 1.2.2 • June 8, 2026

Adicionado

  • Persistência da blacklist de políticas em learning.state schema v5 (banimentos por rollback sobrevivem ao restart com learningEnabled ligado)
  • /leancore learn mostra learning=v5 e contagem de blacklist ativa

Alterado

  • LeanCore.json lido/gravado em UTF-8
  • Blacklist do governor passa a ser gerida pelo LearningStore (PolicyBlacklistTracker)

Corrigido

  • FIGHTER preso após explorar — pulsos de EXPLORE ao andar, descoberta de zona registra EXPLORE, EMA de combate decai ao mudar de atividade

Notas

  • Persistência da blacklist exige learningEnabled: true
  • Upgrade de learning.state v4 é automático; blacklist vazia até o próximo rollback de política
Changelog version 1.2.1 1.1.1 → 1.2.1 • June 8, 2026

Primeiro release público 1.2.x (inclui Activity Sense da 1.2.0 mais correções da 1.2.1). Sem arquivo 1.2.0 separado no CurseForge.

Adicionado

  • Activity Sense (ML): classificador softmax multiclasse online treinado com eventos ECS ao vivo

  • Classificador de bloco/ferramenta: item, gather type e grupo do bloco rotulam quebras/colocações (MINE, CHOP, FARM, BUILD)

  • Novos estilos de jogo: MINER, LUMBERJACK, FARMER junto aos comportamentos existentes

  • EMAs por atividade: mine, wood, farm, build, craft, combat em janelas rolantes

  • Listener de combate: FIGHTER só via eventos de dano, não quebras genéricas de bloco

  • Sinal de craft: CraftRecipeEvent.Pre alimenta atividade de craft

  • Schema de features v2 (demandDim=11) com EMAs específicos por atividade

  • /leancore learn player: EMAs de atividade e status activityModel=SOFTMAX

  • Cache de classificação break/place e cache de gather type por item

  • Janela de atividade recente para troca rápida MINER / LUMBERJACK / BUILDER

  • Dirty flush do learning.state quando learning está ativo

  • Testes unitários para classificador, posterior e troca de role

Alterado

  • Posterior de comportamento usa softmax ML como caminho principal; fallback EMA antes do warm-up

  • learning.state schema v4: persiste classificador de atividade + EMAs por jogador (migra de v3)

  • /leancore learn reporta featureSchema=v2 quando o demand model está ativo

  • Meia-vida das EMAs de atividade em 20s com inibição cruzada ao trocar de role

  • Treino ML com throttle; perfil LITE sem chunk probe no tick de dormancy

  • Hatchet e blocos de madeira do Hytale antes das heurísticas de picareta

Corrigido

  • Minerar com picareta não é mais marcado como FIGHTER

  • Troca lenta de role ao mudar de mineração para corte de madeira (ex.: Hatchet)

  • Decay de EMA no LITE solo durante eventos de bloco

  • Stutter por classify + train ML a cada quebra no thread ECS

Notas

  • ML de atividade roda in-process na JVM do servidor (sem mod no cliente)

  • Heurística atua como teacher até o softmax aquecer (updates >= 8)

  • KPI principal: heap JVM do servidor, não FPS do cliente

  • Atualize de 1.1.1 direto para 1.2.1

Changelog version 1.2.0 1.1.0 → 1.2.0 • June 8, 2026

Adicionado

  • Activity Sense (ML): classificador softmax multiclasse online treinado com eventos ECS ao vivo

  • Classificador de bloco/ferramenta: item, gather type e grupo do bloco rotulam quebras/colocações (MINE, CHOP, FARM, BUILD)

  • Novos estilos de jogo: MINER, LUMBERJACK, FARMER junto aos comportamentos existentes

  • EMAs por atividade: mine, wood, farm, build, craft, combat em janelas rolantes

  • Listener de combate: FIGHTER só via eventos de dano, não quebras genéricas de bloco

  • Sinal de craft: CraftRecipeEvent.Pre alimenta atividade de craft

  • Schema de features v2 (demandDim=11) com EMAs específicos por atividade

  • /leancore learn player: EMAs de atividade e status activityModel=SOFTMAX

  • Testes unitários para classificador de bloco, modelo de atividade e posterior

Alterado

  • Posterior de comportamento usa softmax ML como caminho principal; fallback EMA antes do warm-up

  • learning.state schema v4: persiste classificador de atividade + EMAs por jogador

  • /leancore learn reporta featureSchema=v2 quando o demand model está ativo

Corrigido

  • Minerar com picareta não é mais marcado como FIGHTER — quebras ponderadas por contexto de ferramenta/bloco

Notas

  • ML de atividade roda in-process na JVM do servidor (sem mod no cliente)

  • Heurística atua como teacher até o softmax aquecer (updates >= 8)

  • KPI principal continua sendo heap JVM do servidor, não FPS do cliente

Changelog version 1.1.0 1.0.0 → 1.1.0 • June 8, 2026

Adicionado

  • Perfis de runtime escalonados no host embutido: LITE (solo), STANDARD (amigos), FULL (dedicado)

  • localHostMode AUTO (padrão): dormancy leve no solo; escala quando amigos entram

  • Probe regional de entidades (S4): contagem por zona via EntityChunk em /leancore probe

  • Rastreamento ChunkUnloadEvent (opcional): contadores policy vs engine em /leancore learn

  • OnlineLinearDemandModel: demanda de retenção aprendida com features de atividade (schema v1)

  • LeanCoreAPI: consultar tier, pin/unpin de zonas, snapshots de jogador para outros mods

  • Cohort holdout (10%): bandit aprende só com treatment; holdout não recebe cortes de view-radius

  • Testes unitários de perfis de runtime, política de ativação, normalização e demand model

Alterado

  • Runtime usa HytaleServer.SCHEDULED_EXECUTOR com atraso inicial de 30s em mundos locais

  • Defaults mais seguros: governEnabled=false, viewRadiusGovernanceEnabled=false, HUD/learning off

  • Governança de view-radius desligada no solo embutido mesmo com governor ativo

  • Policy applier só aplica view-radius quando a policy muda de verdade (throttle)

  • /leancore status mostra o profile ativo (LITE / STANDARD / FULL)

  • /leancore learn mostra featureSchema=v1, status do demand model e atribuição de unload

Corrigido

  • Mundos locais não stutteram mais por tick pesado a cada 5s + HUD + learning

  • Rastreamento de unload de chunks off por padrão (evita assert de thread do engine)

Notas

  • KPI principal continua sendo heap JVM do servidor, não FPS ou GPU do cliente

  • Solo: mantenha localHostMode: AUTO. Dedicado: dedicatedServerMode: true e depois ajuste o governor

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

Adicionado

  • Primeiro release estável público (1.0.0)
  • Governador de memória com tiers COMFORT → CRITICAL, rollback e aprendizado contextual
  • Mapa de dormência espacial (HOT / WARM / DORMANT / FROZEN) e sweeps de unload de chunks
  • Demanda de retenção por jogador a partir de features de atividade ao vivo
  • Quantis de heap calibrados no servidor e persistência learning.state (schema v3)
  • HUD admin (/leancore hud on|off|status) — opt-in, grupos e permissões
  • 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 do HUD

Notas

  • KPI principal é heap JVM do servidor, não FPS no cliente