Server documentation
QuantumHy
In DevelopmentHytale • 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
- Descarga QuantumHy-0.2.1.jar desde la pestaña Files de CurseForge
- Coloca el JAR en la carpeta mods/ de tu servidor (o
%AppData%\Hytale\UserData\Mods\en Windows) - Inicia el servidor. La config se genera como QuantumHy.json en la carpeta de datos del plugin
- 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:
- Muestrea la densidad. Cuenta las entidades en los chunks alrededor del jugador (un cuadrado de
densityScanChunkRadiuschunks 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. - 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. - La convierte en un factor de reducción. En o por debajo de
densityLowPerChunkel factor es 0 (sin recorte). En o por encima dedensityHighPerChunkes 1 (recorte total). En medio escala linealmente. - Lo aplica a dos palancas. El mismo factor escala el radio de visión en chunks (hacia abajo, hacia
minClientViewRadius) y, conadaptEntityRadiusactivado, el radio de stream de entidades en bloques (hacia abajo, haciaminEntityViewBlocks). 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.
| Clave | Por defecto | Qué hace |
|---|---|---|
enabled | true | Interruptor maestro. Cuando es false, QuantumHy nunca toca ningún radio de visión. |
verboseLog | true | Registra cada pasada con la densidad y la decisión de visión de cada jugador. |
tickIntervalSeconds | 5 | Cada cuánto revisa a cada jugador. |
initialDelaySeconds | 20 | Espera este tiempo tras el arranque antes de la primera pasada. |
targetClientViewRadius | 0 | Tope fijo en chunks. 0 significa sin tope, solo adapta por densidad. |
minClientViewRadius | 6 | Nunca baja a nadie por debajo de este radio en chunks. |
maxClientViewRadius | 32 | Tope para el límite fijo (el propio radio de visión del jugador sigue ganando). |
densityScanChunkRadius | 4 | Cuántos chunks a cada lado contar entidades. |
densityLowPerChunk | 2.0 | Entidades por chunk en o por debajo de esto: radio completo. |
densityHighPerChunk | 8.0 | Entidades por chunk en o por encima de esto: bajado al mínimo. |
densitySmoothing | 0.4 | Peso de la muestra más nueva en la EMA, en (0, 1]. Menor es más suave; 1.0 lo desactiva. |
adaptEntityRadius | true | También reduce el radio de stream de entidades por jugador, no solo los chunks. |
minEntityViewBlocks | 48 | Límite inferior del radio de entidades, en bloques (16 bloques = 1 chunk). |
entityLodAggressiveness | 1.5 | Culling global de LOD de entidades. 1.0 es el valor del motor; mayor descarta pequeñas/lejanas antes. |
minViewRadiusDelta | 2 | Cambio mínimo (chunks) antes de enviar una actualización, para evitar churn. |
respectStreamingGrace | true | Retiene los recortes mientras un jugador todavía está transmitiendo chunks. |
streamingBacklogThreshold | 8 | Cuántos chunks cargando cuentan como “todavía transmitiendo”. |
leanCoreTakeover | true | Si LeanCore está instalado, le toma el radio de visión. |
yieldToLeanCoreViewRadius | false | Lo 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: falsedeja a LeanCore en paz. Entonces ambos pueden pelear por el radio de visión.yieldToLeanCoreViewRadius: truehace 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
targetClientViewRadiusentre 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: falsepara silenciar el registro.
Comprobando que funciona
- 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 ... - Luego la línea de inicio del runtime:
QuantumHy runtime started (interval=5s, hardCap=0, min=6, max=32, scan=4, entityRadius=true). - 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. - 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, motivodensity. - 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