← Back to documentation

Server documentation

QuantumHy

In Development

Hytale • Version 0.2.1

Instalación, claves de config, cómo funcionan el radio adaptativo de chunks y de entidades, el culling global por LOD y la convivencia con LeanCore.

Instalación, configuración y comportamiento en tiempo de ejecución de QuantumHy.


Resumen

QuantumHy es un mod de FPS del lado del servidor para Hytale. El cliente es nativo y no se puede modificar, pero el servidor decide cuánto tiene que renderizar cada cliente, así que QuantumHy lo recorta por jugador. Cada pocos segundos muestrea la densidad de entidades alrededor de cada jugador, la suaviza y la usa para reducir dos cosas: el radio de visión en chunks del cliente y el radio de stream de entidades por jugador. Un ajuste global de LOD de entidades descarta entidades pequeñas y lejanas antes, por encima de eso. En campo abierto todo vuelve al tope del propio jugador; QuantumHy nunca infla la visión más allá de lo que el jugador pidió. Solo ayuda donde está instalado, nunca en un servidor remoto al que solo te conectas.


Instalación

  1. Descarga QuantumHy-0.2.1.jar desde la pestaña Files de CurseForge
  2. Coloca el JAR en la carpeta mods/ de tu servidor (o %AppData%\Hytale\UserData\Mods\ en Windows)
  3. Inicia el servidor. La config se genera como QuantumHy.json en la carpeta de datos del plugin
  4. Observa el registro del servidor por la línea de setup y las decisiones de cada pasada (ver Comprobando que funciona)

Cómo funciona

En cada pasada (5s por defecto) QuantumHy hace el trabajo por jugador en el hilo del mundo dueño:

  1. Muestrea la densidad. Cuenta las entidades en los chunks alrededor del jugador (un cuadrado de densityScanChunkRadius chunks a cada lado) y divide por el número de chunks cargados barridos, dando entidades por chunk. Un mundo normal está en reposo en torno a 1 a 1,5 por chunk.
  2. La suaviza. El valor por chunk pasa por una media móvil exponencial (densitySmoothing), para que a un jugador que cruza una multitud breve no se le sacuda la visión.
  3. La convierte en un factor de reducción. En o por debajo de densityLowPerChunk el factor es 0 (sin recorte). En o por encima de densityHighPerChunk es 1 (recorte total). En medio escala linealmente.
  4. Lo aplica a dos palancas. El mismo factor escala el radio de visión en chunks (hacia abajo, hacia minClientViewRadius) y, con adaptEntityRadius activado, el radio de stream de entidades en bloques (hacia abajo, hacia minEntityViewBlocks). La palanca de entidades es la gran ganancia en zonas llenas de mobs, ya que controla a qué distancia el servidor transmite entidades, independientemente de los chunks.

Ambas palancas vuelven a subir en campo abierto. Mientras un jugador todavía está transmitiendo chunks (acaba de entrar, va corriendo), el recorte se retiene para que no se le diga al cliente que descarte chunks que está ocupado cargando. Como escribir el radio de visión también baja el valor que informa el getter, QuantumHy recuerda el valor más alto que vio por jugador y vuelve a subir hacia él, para que la visión se recupere correctamente.

entityLodAggressiveness es aparte: es un único multiplicador, válido para todo el servidor, sobre el culling de LOD de entidades del motor, aplicado una vez al arrancar y restaurado al apagar. Valores más altos descartan entidades pequeñas y lejanas antes para todos.


Configuración

Archivo de runtime: QuantumHy.json en la carpeta de datos del plugin, creado en el primer arranque.

ClavePor defectoQué hace
enabledtrueInterruptor maestro. Cuando es false, QuantumHy nunca toca ningún radio de visión.
verboseLogtrueRegistra cada pasada con la densidad y la decisión de visión de cada jugador.
tickIntervalSeconds5Cada cuánto revisa a cada jugador.
initialDelaySeconds20Espera este tiempo tras el arranque antes de la primera pasada.
targetClientViewRadius0Tope fijo en chunks. 0 significa sin tope, solo adapta por densidad.
minClientViewRadius6Nunca baja a nadie por debajo de este radio en chunks.
maxClientViewRadius32Tope para el límite fijo (el propio radio de visión del jugador sigue ganando).
densityScanChunkRadius4Cuántos chunks a cada lado contar entidades.
densityLowPerChunk2.0Entidades por chunk en o por debajo de esto: radio completo.
densityHighPerChunk8.0Entidades por chunk en o por encima de esto: bajado al mínimo.
densitySmoothing0.4Peso de la muestra más nueva en la EMA, en (0, 1]. Menor es más suave; 1.0 lo desactiva.
adaptEntityRadiustrueTambién reduce el radio de stream de entidades por jugador, no solo los chunks.
minEntityViewBlocks48Límite inferior del radio de entidades, en bloques (16 bloques = 1 chunk).
entityLodAggressiveness1.5Culling global de LOD de entidades. 1.0 es el valor del motor; mayor descarta pequeñas/lejanas antes.
minViewRadiusDelta2Cambio mínimo (chunks) antes de enviar una actualización, para evitar churn.
respectStreamingGracetrueRetiene los recortes mientras un jugador todavía está transmitiendo chunks.
streamingBacklogThreshold8Cuántos chunks cargando cuentan como “todavía transmitiendo”.
leanCoreTakeovertrueSi LeanCore está instalado, le toma el radio de visión.
yieldToLeanCoreViewRadiusfalseLo contrario: deja el radio de visión del cliente enteramente a LeanCore.

Usándolo con LeanCore

QuantumHy y LeanCore pueden ambos ajustar el radio de visión del cliente, y solo uno debe hacerlo. Por defecto QuantumHy lo toma: al arrancar detecta LeanCore y apaga la gobernanza de radio de visión de LeanCore (viewRadiusGovernanceEnabled, liteViewRadiusEnabled, motionViewRadiusBoostEnabled), y luego pasa a controlar el radio él mismo. LeanCore conserva el radio de simulación, el throughput de chunks y la memoria. No hace falta ningún cambio de config en ninguno de los dos lados. LeanCore es una dependencia opcional: cuando no está presente, QuantumHy se ejecuta por su cuenta.

  • leanCoreTakeover: false deja a LeanCore en paz. Entonces ambos pueden pelear por el radio de visión.
  • yieldToLeanCoreViewRadius: true hace que QuantumHy se quede fuera del radio de visión del cliente por completo y deja que LeanCore lo conserve.

Recomendado

  • En solitario o tu propio servidor: deja los valores por defecto. Solo pierdes distancia de visión cuando hay aglomeración real.
  • Quieres FPS en todas partes: pon targetClientViewRadius entre 12 y 16 para limitar la distancia de visión incluso en campo abierto.
  • Granjas de mobs / eventos pesados: mantén adaptEntityRadius: true; es lo que sostiene los frames cuando hay cientos de entidades en pantalla.
  • Cuando confíes en él, pon verboseLog: false para silenciar el registro.

Comprobando que funciona

  1. Inicia el servidor y busca la línea de setup: QuantumHy 0.2.1 setup. config: verboseLog=true tickInterval=5s ... densityLow=1.0/ch densityHigh=4.0/ch baseline=10% ... entityLod=2.00x ...
  2. Luego la línea de inicio del runtime: QuantumHy runtime started (interval=5s, hardCap=0, min=6, max=32, scan=4, entityRadius=true).
  3. Si LeanCore está presente: LeanCore detected: took over the client view radius (governance turned off). Si no: LeanCore not detected after 3 checks: QuantumHy owns the client view radius standalone.
  4. Con verboseLog=true, cada pasada registra una línea por jugador. Leyéndola: Durkz_z 312/81ch 3.9/ch~2.7 cl 14->13 ent 448->404 [density] significa 312 entidades en 81 chunks (3,9 por chunk, suavizado a 2,7), radio de visión en chunks pasando de 14 a 13, radio de entidades pasando de 448 a 404 bloques, motivo density.
  5. En campo abierto el motivo aparece como [open] y ambos valores se mantienen en el tope; en una multitud bajan, con [density-min] cuando tocan el suelo.

Licencia

Licencia MIT