MarketplaceLoading live activityMarketplaceLoading live activity

Документація розробника Hytale Java

Практична документація для розробки плагінів/модів: життєвий цикл, події, сутності, рух, інвентар, взаємодія, UI, команди, конфіг, мережа та ліцензування.

Навігація Розробника

Loading quiz...

Обсяг і точність

Ці документи поєднують офіційні сторінки політики Hytale із сигнатурами API часу виконання, отриманими з поточної збірки сервера. Використовуйте це як практичний посібник із впровадження плагінів/модів для розробки Java на Hytale Depot.

The API index below is generated from the current HytaleServer.jar in this workspace using an automated class-file parser.
The shipped HytaleServer.aot.config artifact in this workspace is binary AOT cache data for the current JVM build, not a hand-edited text configuration file.
Посилання на офіційну політику та поведінку платформи наведено на сторінках підтримки Hytale, новинах, політиці та правових питаннях.
Community repositories and examples are reference material only; always validate actual behavior against the current runtime jar and official updates.

Перевірка

У цьому розділі описано, як приклади Dev Docs перевіряються на поточний jar.

The runtime signatures and class counts shown on this page are regenerated from the jar, not typed by hand.
Operational guidance on this page is checked against the current jar manifest, option strings, config class field names, and the shipped AOT cache artifact in this workspace.
When a new server jar drops, regenerate the index first, then review the changed sections instead of guessing what moved.

Команда перевірки

python3 tools/generate_hytale_api_index.py ../HytaleServer.jar apps/web/lib/hytale-api-index.json && npm test

Треки розвитку

Використовуйте ці доріжки як порядок збирання: починайте з життєвого циклу/подій, потім домени ігрового процесу, потім преміум-ліцензування.

Events & Runtime Hooks

Learn where the runtime exposes sync and async hooks, and how to keep handlers small and safe.

Universe, Entities & NPCs

Work with Universe, World, PlayerRef, entity access, and the larger NPC/spawning package families.

Inventories, Items & Interaction Flow

Understand containers, hotbar/storage flow, and how inventory state ties into actions.

UI, Localization & Commands

Create command-driven tooling and understand the current UI/localization classes exposed by the runtime.

Assets, Config & Protocol

Read the asset/config surface and understand how protocol or service layers connect to gameplay systems.

Преміум ліцензування

Захистіть плагіни/моди преміум-класу з перевіркою запуску, обов’язковими правилами та підписаними відповідями.

Посібники з налаштування сервера

Конфігурація, готова до виробництва, і базові параметри запуску для лобі-серверів, серверів Vanilla і PvP.

Життєвий цикл

Побудова навколо детермінованих гачків налаштування/запуску/вимкнення.

API ігрового процесу

Події, сутності, рух, інвентар, взаємодія та системи інтерфейсу користувача.

Безпека

Перевірка ліцензії + потік прив’язки для преміум модів/плагінів.

Плагін швидкого запуску (Java)

import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.command.system.AbstractCommand;
import com.hypixel.hytale.server.core.command.system.CommandContext;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public final class StarterPlugin extends JavaPlugin {
  private final ScheduledExecutorService scheduler =
      Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "starter-heartbeat"));

  public StarterPlugin(JavaPluginInit init) { super(init); }

  @Override
  public CompletableFuture<Void> preLoad() {
    getLogger().atInfo().log("preLoad -> %s", getIdentifier());
    return CompletableFuture.completedFuture(null);
  }

  @Override
  protected void setup() {
    getCommandRegistry().registerCommand(new StarterStatusCommand());
  }

  @Override
  protected void start() {
    scheduler.scheduleAtFixedRate(
        () -> getLogger().atInfo().log("starter heartbeat"),
        0,
        1,
        TimeUnit.SECONDS);
    getTaskRegistry().registerTask(CompletableFuture.completedFuture(null));
  }

  @Override
  protected void shutdown() {
    scheduler.shutdownNow();
  }

  private final class StarterStatusCommand extends AbstractCommand {
    private StarterStatusCommand() { super("hdstarter", "Starter plugin status command"); }

    @Override
    protected CompletableFuture<Void> execute(CommandContext ctx) {
      ctx.sendMessage(Message.raw("[Starter] plugin is active."));
      return CompletableFuture.completedFuture(null);
    }
  }
}

Шаблон обробника подій

getEventRegistry().registerGlobal(PluginSetupEvent.class, event -> {
  // Register runtime handlers after plugin startup to avoid lifecycle issues.
  getLogger().atInfo().log("Plugin setup event: %s", event.getPlugin().getName());
  // Keep handler work small and move slow tasks to an async executor.
});

Server Operations

Practical dedicated-server operations validated against the current jar manifest, option strings, config classes, and shipped runtime artifacts in this workspace.

Runtime Baseline

  • The current jar manifest targets Java 25, and the shipped AOT cache strings identify an OpenJDK 25.0.2 runtime. Treat Java 25 as the baseline for this build.
  • Keep the jar and the shipped AOT cache file from the same release together. Do not mix an older cache with a newer server jar.
  • Allocate at least 4 GB RAM for small servers, then tune from real metrics instead of static JVM folklore.

Launch & Authentication

  • Current option strings expose --bare, --bootstrap, --transport, schema-generation, and validation flags in addition to the normal startup path.
  • Run /auth login when a fresh authenticated instance reports that no server tokens are configured.
  • Bootstrap mode is a staging/recovery workflow, not your normal live server mode. It exists to let the server authenticate and pull the full payload layout.

Networking

  • The current runtime exposes QUIC and QUICHE transport types. Both are UDP/QUIC-backed networking paths.
  • Open and test the configured UDP listener port from outside your network. TCP-only forwarding is still not enough.
  • The current option text describes --bind as a port override, so treat it as the runtime listener port unless your own wrapper adds host syntax on top.

Operational Safety

  • Apply edits to config files with the server offline when possible. The runtime saves config back out and can overwrite hand edits during live changes.
  • The world config provider references both config.json and config.bson in the current build. Keep your storage format choices consistent instead of mixing both casually.
  • Use periodic backups and test restore flow before production incidents. The runtime also exposes explicit backup frequency, directory, and retention controls.

Launch Commands

Use caseCommandWhy
Standard startupjava -XX:AOTCache=HytaleServer.aot.config -jar HytaleServer.jarCurrent baseline for the shipped jar and AOT cache artifact in this workspace.
Bootstrap payload modejava -jar HytaleServer.jar --bootstrapStarts the minimal authenticated bootstrap path used to pull the full runtime payload layout.
Validate asset datajava -jar HytaleServer.jar --validate-assetsRuns asset validation and exits with an error code when the immutable asset payload is invalid.
Generate config schemasjava -jar HytaleServer.jar --generate-config-schema ./schemasExports JSON schemas for the current config model so your tooling matches the running jar.
Bind custom UDP portjava -jar HytaleServer.jar --bind 3500Overrides the listener port using the current runtime's bind option text.
Switch transport backendjava -jar HytaleServer.jar --transport QUICHELets you validate the alternate QUICHE transport backend when comparing networking behavior.
Development mode (disable Sentry)java -jar HytaleServer.jar --disable-sentryAvoids sending dev crashes during local plugin/mod iteration.
List server argumentsjava -jar HytaleServer.jar --helpShows current runtime flags for your exact server build.

Authentication + Network Checklist

Device auth flow

/auth login device
Visit https://accounts.hytale.com/device
Enter the shown code and wait for "Authentication successful".

Firewall examples (UDP)

Windows: New-NetFirewallRule -DisplayName "Hytale Server" -Direction Inbound -Protocol UDP -LocalPort <server-port> -Action Allow
Linux ufw: sudo ufw allow <server-port>/udp
Linux iptables: sudo iptables -A INPUT -p udp --dport <server-port> -j ACCEPT

Server File Layout

Observed from the current runtime artifacts plus the update/bootstrap expectations exposed by the jar. Use this as the baseline structure to keep updates, backups, and saves stable.

Pathпризначення
HytaleServer.jarCurrent dedicated server runtime jar. Keep it aligned with the matching AOT cache and wrapper layout.
HytaleServer.aot.configShipped binary AOT cache artifact for the current JVM/server build. Use it as input to -XX:AOTCache; do not treat it like an editable text config.
../HytaleAssets/Current default immutable assets path exposed by the runtime option strings for --assets.
config.jsonCore server configuration: identity, host/port, defaults, modules, plugin/mod loading, update, backup, and storage settings.
permissions.jsonPermission groups, migrated legacy group data, and per-user permission assignments.
whitelist.jsonWhitelist toggle and allowed players list.
bans.jsonBan entries enforced by server access control.
auth.encEncrypted authentication credential store used by AuthCredentialStore.
mods/Loaded plugin/mod packages and per-mod data folders referenced by Mods and ModLoadOrder config.
logs/Server runtime logs used for diagnostics and auditing.
universe/players/Per-player persistent data snapshots.
universe/worlds/<world>/config.jsonWorld-level simulation, spawning, world map, save, and gameplay toggles.
universe/worlds/<world>/config.bsonBinary world-config storage path still referenced by the current world config provider.
universe/worlds/<world>/chunks/Region/chunk storage files for world terrain state.
universe/worlds/<world>/resources/World resource stores (markers, time, chunk metadata, etc.).
updater/staging/Downloaded update staging area consumed by wrapper scripts.
start.sh / start.batWrapper scripts mentioned by bootstrap/update flows when staging the full runtime payload.
backups/Backup output (if --backup and backup path are enabled).

permissions.json stores groups + per-user assignments. Keep OP wildcard assignments tightly controlled.

whitelist.json controls global whitelist mode and allowed user list.

bans.json stores ban entries used at authentication/connection time.

The current world config provider references both config.json and config.bson. Pick one storage flow and keep it consistent in your tooling and backups.

universe/players contains per-player saved state, while world chunk/resource state is in universe/worlds/<world>.

Edit config/permissions/whitelist/bans with the server offline when possible to avoid runtime overwrite.

Server Config JSON (config.json)

Field-level behavior reference mapped to the generated config structure used by current server builds.

FieldSupported valuesWhat it controls
VersionintegerSchema version for server config compatibility.
ServerNamestringPublic server name shown to players/in listings.
MOTDstringMessage of the day displayed on connect/status views.
Passwordstring (empty or secret)Optional server password gate.
Hosthost/ip stringConfigured listener host stored alongside Port in the current server config model.
Portinteger / shortConfigured listener port for the dedicated server transport.
MaxPlayersinteger >= 1Maximum concurrent players allowed.
MaxViewRadiusintegerUpper render/simulation radius cap; major RAM driver.
Defaults.Worldworld id/nameDefault world used for player joins/spawns.
Defaults.GameModeAdventure | other runtime modesDefault game mode on entry.
ConnectionTimeoutsobjectHandshake/session timeout profile. Current nested fields include InitialTimeout, AuthTimeout, AuthGrantTimeout, AuthTokenTimeout, PasswordTimeout, PlayTimeout, and setup-stage timers.
RateLimitobjectPacket rate-limiting domain. Current fields include Enabled, PacketsPerSecond, and BurstCapacity.
ModulesobjectNamed server module toggles plus nested per-module settings. Current module objects expose at least an Enabled field.
LogLevelsobjectPer-domain logging level overrides.
PluginsobjectPlugin-scoped configuration buckets surfaced by the current server config model.
ModsobjectPer-mod configuration overrides/enablement.
ModLoadOrderarray of plugin identifiersExplicit load-order override for plugin/mod packages when deterministic ordering matters.
DefaultModsEnabledtrue | falseWhether newly detected plugin/mod packages should be enabled by default.
DisplayTmpTagsInStringstrue | falseDebug formatting behavior for TMP tags in text.
PlayerStorage.TypeHytale | DiskPlayer data storage backend.
AuthCredentialStore.TypeEncryptedCredential store implementation.
AuthCredentialStore.Pathrelative path (example: auth.enc)Credential file location.
UpdateobjectAuto-update/check/apply behavior configuration.
BackupobjectBackup scheduling and retention options.
WorldMapobjectServer-wide world map/view-radius domain used by the current config model.
FallbackServerstring / host descriptorFallback server target surfaced by the current server config model for redirect/failover scenarios.

Example shape for the current server config model

{
  "Version": 4,
  "ServerName": "My Hytale Server",
  "MOTD": "Private test shard",
  "Password": "",
  "Host": "0.0.0.0",
  "Port": 5520,
  "MaxPlayers": 128,
  "MaxViewRadius": 8,
  "Defaults": { "World": "default", "GameMode": "Adventure" },
  "ConnectionTimeouts": {},
  "RateLimit": {},
  "Modules": {},
  "LogLevels": {},
  "Plugins": {},
  "Mods": {},
  "ModLoadOrder": [],
  "DefaultModsEnabled": true,
  "DisplayTmpTagsInStrings": false,
  "PlayerStorage": { "Type": "Hytale" },
  "AuthCredentialStore": { "Type": "Encrypted", "Path": "auth.enc" },
  "Update": {},
  "Backup": {},
  "WorldMap": {}
}

World Config JSON (universe/worlds/*/config.json)

World-level toggles directly control simulation, persistence, PvP behavior, and client-facing environment effects.

FieldSupported valuesWhat it controls
VersionintegerSchema version for world config.
UUIDbinary UUIDPersistent world identity.
DisplayNamestringHuman-facing world name shown in world selection or admin tooling.
SeedintegerWorld generation seed.
SpawnPointvector/objectExplicit spawn location used when the world defines a fixed player entry point.
SpawnProviderprovider id/objectSpawn-resolution strategy when the world relies on a provider rather than a fixed point.
WorldGen.TypeHytale | custom generator idGenerator backend selection.
WorldGen.NamestringGenerator preset/profile name.
WorldMap.TypeWorldGen | customMap provider binding for this world.
ChunkStorage.TypeHytale | customChunk storage backend selection.
ChunkConfigobjectChunk behavior tuning domain.
IsTickingtrue | falseMaster simulation tick toggle for world.
IsBlockTickingtrue | falseBlock update/tick simulation toggle.
IsPvpEnabledtrue | falseWorld-scoped PvP enablement.
IsFallDamageEnabledtrue | falseFall damage rules for this world.
IsGameTimePausedtrue | falseFreezes or advances in-world time.
GameTimeISO datetimeCurrent or fixed world clock value.
ForcedWeatherweather enum/objectForces a specific weather state when you do not want the world weather system to decide dynamically.
ClientEffects.*numbersVisual/environment values for connected clients.
PregenerateRegionbox/objectOptional pregeneration region for worlds that should prebuild terrain before players join.
RequiredPluginsmapPlugins required before world is considered valid.
GameModeruntime game mode enumWorld-level game mode override.
DefaultPermissionGroupstringDefault permission group assigned to players entering this world.
IsSpawningNPCtrue | falseEnables/disables NPC spawn logic.
IsSpawnMarkersEnabledtrue | falseSpawn marker visibility/usage.
IsAllNPCFrozentrue | falseFreezes NPC behavior for controlled worlds/lobbies.
GameplayConfigpreset nameGameplay ruleset preset for world behavior.
DeathobjectWorld-level death handling domain used by the current runtime config model.
DaytimeDurationSecondsintegerLength of the daytime portion of the world clock.
NighttimeDurationSecondsintegerLength of the nighttime portion of the world clock.
IsCompassUpdatingtrue | falseCompass update behavior for clients.
IsSavingPlayerstrue | falsePersist player state changes to disk.
IsSavingChunkstrue | falsePersist world chunk updates to disk.
SaveNewChunkstrue | falsePersist newly generated chunks.
IsUnloadingChunkstrue | falseAllow chunk unload lifecycle for memory control.
IsObjectiveMarkersEnabledtrue | falseObjective marker system visibility/updates.
DeleteOnUniverseStarttrue | falseDeletes world on universe startup when enabled.
DeleteOnRemovetrue | falseDeletes world files when removed from universe.
DisabledFluidTickersarrayList of fluid ticker ids disabled for this world.
ResourceStorage.TypeHytale | customWorld resource storage backend.
PluginobjectPlugin-scoped world metadata/config bucket.

Update Config Reference (config.json -> Update)

OptionDefaultBehavior
Update.EnabledtrueEnable periodic update checks.
Update.CheckIntervalSeconds3600Seconds between update checks.
Update.NotifyPlayersOnAvailabletrueNotify eligible players when an update is available.
Update.PatchlinenullPatchline override (release/pre-release).
Update.RunBackupBeforeUpdatetrueRun backup before update apply.
Update.BackupConfigBeforeUpdatetrueBackup config files before update apply.
Update.AutoApplyModeDisabledDisabled | WhenEmpty | Scheduled.
Update.AutoApplyDelayMinutes30Delay for Scheduled auto-apply mode.

Example shape for the current world config model

{
  "Version": 4,
  "DisplayName": "default",
  "Seed": 1768426248534,
  "WorldGen": { "Type": "Hytale", "Name": "Default", "Version": "0.0.0" },
  "WorldMap": {},
  "IsTicking": true,
  "IsBlockTicking": false,
  "IsPvpEnabled": false,
  "IsFallDamageEnabled": false,
  "IsGameTimePaused": true,
  "GameMode": "Adventure",
  "ClientEffects": {
    "SunHeightPercent": 100.0,
    "BloomIntensity": 0.30000001192092896
  },
  "IsSpawningNPC": false,
  "IsAllNPCFrozen": true,
  "IsSavingPlayers": true,
  "IsSavingChunks": true,
  "SaveNewChunks": false,
  "IsUnloadingChunks": false
}

Посібники з налаштування сервера

Орієнтовані на виробництво базові лінії для загальних стилів серверів. Використовуйте їх як відправні точки та сформулюйте власне навантаження.

Лобі / хаб

Основні цілі

  • Швидке приєднання
  • Стабільна частота тиків під сплесками
  • Низьке навантаження моделювання

Контрольний список

  • Вимкніть важкі системи моделювання, які не використовуються в лобі.
  • Зберігайте консервативну активацію блоків/сутностей лише для косметичних областей.
  • Використовуйте суворі обмеження кількості дій приєднання/виходу та повторюваних спам-команд.
  • Попередньо завантажте основні лобі-зони та уникайте великої динамічної генерації під час приєднання.

Ванільне виживання

Основні цілі

  • Збалансована симуляція ігрового процесу
  • Стійкі світи
  • Помірний стек плагінів

Контрольний список

  • Налаштуйте каденцію автозбереження, щоб уникнути синхронних стрибків у найкращий час.
  • Встановіть консервативні обмеження об’єктів для світу/регіону, щоб уникнути ферм-втікачів.
  • Надавайте перевагу асинхронним шляхам вводу-виводу для даних плагінів і стану частого читання кешу.
  • Перевіряйте заплановані завдання та обмежуйте важкі роботи.

PvP / Міні-ігри

Основні цілі

  • Бойовий потік з низькою затримкою
  • Детермінована обробка подій
  • Швидке кругле скидання

Контрольний список

  • Оптимізуйте обробники руху та бою для мінімального розподілу за такт.
  • Пакетне оновлення табло/інтерфейсу користувача замість відтоку інтерфейсу користувача для кожної дії.
  • Використовуйте короткі, обмежені черги завдань для відповідних переходів.
  • Зберігайте перевірки на захист від шахрайства легкими та проводите дорогі перевірки асинхронно.

Server Config Reference (Runtime Domains)

This table maps high-value configuration domains from the current HytaleServer.jar runtime packages to practical option-level guidance.

interaction/config

Runtime sources: InteractionConfiguration, InteractionRules, InteractionCameraSettings

OptionSupported valuesBehavior
priorityLOW | NORMAL | HIGH (enum)Controls interaction ordering when multiple interactions can run from a single trigger.
selectorraycast | aoe_circle | aoe_cylinder | stab | horizontalDefines target selection strategy for interaction chains and combat interactions.
conditionsarray of condition blocksValidation pipeline before execution, such as movement, cooldown, stat, or effect checks.
effectsarray of effect blocksExecution pipeline that mutates world/player state after all conditions pass.

projectile/config

Runtime sources: ProjectileConfig, StandardPhysicsConfig, PhysicsConfig

OptionSupported valuesBehavior
speednumber > 0Initial projectile velocity scalar; tune with spread and tick rate.
gravityScalenumber >= 0Gravity multiplier applied each update tick for arc behavior.
dragnumber between 0 and 1Per-tick velocity damping factor for smoother projectile deceleration.
maxLifetimeTicksinteger > 0Upper lifetime cap before automatic despawn to prevent stale entities.

asset/type/item/config

Runtime sources: Item, ItemToolSpec, ItemStackContainerConfig, ItemReticleConfig

OptionSupported valuesBehavior
categoryenum category idControls grouping, filtering, and UI placement for item collections.
durabilityinteger >= 0Base item durability and wear behavior when interacting with world/entities.
dropTablesingle | choice | multiple | droplist containerSpecifies drop logic shape and weighted output behavior.
reticlereticle configuration objectDefines UI reticle overlays, durations, and conditional display logic.

asset/type/blocktype/config

Runtime sources: BlockPlacementSettings, BlockMovementSettings, BlockGathering

OptionSupported valuesBehavior
rotationModeNONE | HORIZONTAL | FULL (enum)Controls permitted placement orientation variants.
previewVisibilityVISIBLE | HIDDEN | CONDITIONAL (enum)Defines placement preview behavior in client interaction flow.
supportRulessupport rule object/arraySpecifies required block-face support and fallback drop behavior.
movementSettingsfriction, acceleration, collision propertiesAdjusts physical traversal behavior for movement-sensitive blocks.

Прапори запуску JVM

Рекомендовані профілі запуску Java для операторів серверів Hytale. Виберіть один профіль і бенчмарк при реальному навантаженні гравця.

General Production (Java 25 LTS)

-Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=80 -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+PerfDisableSharedMem

Stable baseline for the current Java 25 dedicated server runtime. Pair it with the shipped AOT cache from the same server build.

PvP з високим рівнем паралелізму

-Xms6G -Xmx6G -XX:+UseZGC -XX:+ZGenerational -XX:+AlwaysPreTouch -XX:+DisableExplicitGC

Lower tail-latency profile for bursty combat and high player concurrency. Benchmark it against G1 on your own hardware before standardizing on it.

Розробка/тест з обмеженнями пам’яті

-Xms2G -Xmx2G -XX:+UseG1GC -XX:MaxGCPauseMillis=120 -XX:+HeapDumpOnOutOfMemoryError

Safer local testing profile when you want fast iteration and heap dumps instead of production-like throughput.

FlagSupported valuesUsage note
-XX:+UseG1GCenabled/disabledBalanced collector profile for mixed gameplay and plugin workloads.
-XX:MaxGCPauseMillis=80integer millisecondsControls pause-time target for G1; lower values reduce spikes but may lower throughput.
-XX:+ParallelRefProcEnabledenabled/disabledProcesses reference queues in parallel to reduce stop-the-world pauses.
-XX:+AlwaysPreTouchenabled/disabledPre-commits heap pages at boot to avoid first-load page faults.
-XX:+UseZGC -XX:+ZGenerationalenabled/disabledLow-latency GC profile for high concurrency and high player bursts.
-XX:+DisableExplicitGCenabled/disabledPrevents plugin code from forcing full GC pauses through explicit GC calls.
-XX:+HeapDumpOnOutOfMemoryErrorenabled/disabledGenerates heap dumps for diagnostics when OOM occurs.
-XX:+PerfDisableSharedMemenabled/disabledReduces JVM perf counter shared memory overhead on containerized hosts.
-XX:AOTCache=HytaleServer.aot.configpath to shipped AOT cache artifactUses the shipped binary AOT cache for the current JVM/server build. Replace it together with the jar instead of hand-editing it.

Assets Runtime Reference & Workflow

The current runtime treats assets as an immutable payload/cache input. Keep custom content in mod/plugin packs and avoid patching the shipped base assets directly.

Areaпризначення
manifest.jsonAsset package manifest and metadata root.
Common/Shared client/server assets (UI, icons, sounds, particles, language bundles).
Server/WorldWorld-generation/runtime world data definitions.
Server/PrefabsPrefab definitions used by world/content pipelines.
Server/ItemServer-side item definitions and gameplay metadata.
Server/GameplayConfigsGameplay preset configurations consumed by worlds.
Server/ProjectileConfigsProjectile behavior definitions used by combat systems.
Common/UIUI assets/layouts used by menus and interfaces.

Current option strings expose --assets as an immutable asset path, with ../HytaleAssets as the default string in this build. Do not assume the live runtime always expects a literal Assets.zip argument.

Keep your custom assets in separate mod/plugin packs; do not modify the shipped immutable asset payload directly for production.

Reference assets by stable IDs/paths from your mod/plugin manifest and runtime loaders.

Validate assets in local staging before publishing to production servers.

Track asset versioning together with plugin/mod releases to avoid mismatches after server updates.

Plugin/Mod Manifest Reference

Manifest fields used by starter resources and expected by the loader during startup.

FieldRequiredSupported valuesWhat it controls
GroupYesstring (reverse-domain or namespace)Publisher namespace used for plugin/mod identity grouping.
NameYesstringResource identifier. Keep stable once released to avoid update collisions.
VersionYessemantic version stringBuild version visible to server loader and update pipelines.
DescriptionYesstringShort summary shown in server logs and management UIs.
AuthorsYesarray of author objectsMaintainer metadata; include at least one primary maintainer.
WebsiteNohttps URLRepository or support URL for release notes and issue reporting.
ServerVersionYesruntime server build stringMust match target server build to avoid loader rejection.
DependenciesNomap<string, version constraint>Hard dependencies that must load before this plugin/mod starts.
OptionalDependenciesNomap<string, version constraint>Soft dependencies that enable extra integration when present.
MainYesfully qualified class nameEntry-point class implementing the plugin/mod lifecycle.
DisabledByDefaultNotrue | falseIf true, operator must explicitly enable the resource in server config.
IncludesAssetPackNotrue | falseMarks whether the package bundles additional assetpack content.
{
  "Group": "HytaleDepot",
  "Name": "UiPluginTemplate",
  "Version": "1.0.0",
  "Description": "Hytale Depot plugin template for ui.",
  "Authors": [{ "Name": "Hytale Depot" }],
  "Website": "https://github.com/VgamerV3/hytale-plugin-template-ui",
  "ServerVersion": "2026.03.26-89796e57b",
  "Dependencies": {},
  "OptionalDependencies": {},
  "DisabledByDefault": false,
  "Main": "net.hytaledepot.templates.plugin.ui.UiPluginTemplate",
  "IncludesAssetPack": false
}

Основні домени API

Упорядковано за практичними областями розробки, щоб розробники плагінів/модів могли швидко знайти потрібні API для виконання.

Plugin Base & Lifecycle

PluginBase, JavaPlugin, PluginManager, and the runtime hooks that actually control server-side plugin startup and shutdown.

23 класи
PluginBaseJavaPluginPluginManager

Показ 6 індексованих класів для цього домену (всього виявлено: 23).

ClassTransformer

com.hypixel.hytale.plugin.early.ClassTransformer

2 витягнуті методи

priority(): int

+1 більше методів, доступних у створеному індексі.

EarlyPluginLoader

com.hypixel.hytale.plugin.early.EarlyPluginLoader

4 витягнуті методи

loadEarlyPlugins(String[]): void

+3 більше методів, доступних у створеному індексі.

TransformingClassLoader

com.hypixel.hytale.plugin.early.TransformingClassLoader

2 витягнуті методи

TransformingClassLoader(URL[], List, ClassLoader, ClassLoader)

+1 більше методів, доступних у створеному індексі.

PluginCommand

com.hypixel.hytale.server.core.plugin.commands.PluginCommand

1 витягнуті методи

PluginCommand()

PluginEvent

com.hypixel.hytale.server.core.plugin.event.PluginEvent

3 витягнуті методи

PluginEvent(PluginBase)

+2 більше методів, доступних у створеному індексі.

PluginSetupEvent

com.hypixel.hytale.server.core.plugin.event.PluginSetupEvent

1 витягнуті методи

PluginSetupEvent(PluginBase)

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Event Bus & Runtime Hooks

EventBus and EventRegistry entry points for sync and async server-side event handling.

52 класи
EventBusEventRegistryAsync handlers

Показ 6 індексованих класів для цього домену (всього виявлено: 52).

AsyncEventBusRegistry

com.hypixel.hytale.event.AsyncEventBusRegistry

8 витягнуті методи

AsyncEventBusRegistry(HytaleLogger, Class)

+7 більше методів, доступних у створеному індексі.

EventBus

com.hypixel.hytale.event.EventBus

18 витягнуті методи

EventBus(boolean)

+17 більше методів, доступних у створеному індексі.

EventBusRegistry

com.hypixel.hytale.event.EventBusRegistry

10 витягнуті методи

EventBusRegistry(HytaleLogger, Class, EventBusRegistry$EventConsumerMap, EventBusRegistry$EventConsumerMap)

+9 більше методів, доступних у створеному індексі.

EventPriority

com.hypixel.hytale.event.EventPriority

3 витягнуті методи

values(): EventPriority[]

+2 більше методів, доступних у створеному індексі.

EventRegistration

com.hypixel.hytale.event.EventRegistration

5 витягнуті методи

EventRegistration(Class, BooleanSupplier, Runnable)

+4 більше методів, доступних у створеному індексі.

EventRegistry

com.hypixel.hytale.event.EventRegistry

18 витягнуті методи

EventRegistry(List, BooleanSupplier, String, IEventRegistry)

+17 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Universe, Entities & NPC Systems

World loading, PlayerRef, entity services, NPC systems, spawning, and universe-level runtime control.

1555 класи
UniverseWorldPlayerRef

Показ 6 індексованих класів для цього домену (всього виявлено: 1555).

AnimationUtils

com.hypixel.hytale.server.core.entity.AnimationUtils

8 витягнуті методи

AnimationUtils()

+7 більше методів, доступних у створеному індексі.

ChainSyncStorage

com.hypixel.hytale.server.core.entity.ChainSyncStorage

8 витягнуті методи

getClientState(): InteractionState

+7 більше методів, доступних у створеному індексі.

DamageDataComponent

com.hypixel.hytale.server.core.entity.damage.DamageDataComponent

11 витягнуті методи

DamageDataComponent()

+10 більше методів, доступних у створеному індексі.

DamageDataSetupSystem

com.hypixel.hytale.server.core.entity.damage.DamageDataSetupSystem

4 витягнуті методи

DamageDataSetupSystem(ComponentType)

+3 більше методів, доступних у створеному індексі.

ActiveEntityEffect

com.hypixel.hytale.server.core.entity.effect.ActiveEntityEffect

13 витягнуті методи

ActiveEntityEffect()

+12 більше методів, доступних у створеному індексі.

EffectControllerComponent

com.hypixel.hytale.server.core.entity.effect.EffectControllerComponent

18 витягнуті методи

getComponentType(): ComponentType

+17 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Physics, Collision & Projectiles

Collision, projectile, block-health, and movement-adjacent systems from the current runtime packages.

83 класи
CollisionProjectilesSimulation guards

Показ 6 індексованих класів для цього домену (всього виявлено: 83).

BlockHealth

com.hypixel.hytale.server.core.modules.blockhealth.BlockHealth

12 витягнуті методи

BlockHealth()

+11 більше методів, доступних у створеному індексі.

BlockHealthChunk

com.hypixel.hytale.server.core.modules.blockhealth.BlockHealthChunk

15 витягнуті методи

BlockHealthChunk()

+14 більше методів, доступних у створеному індексі.

BlockHealthModule

com.hypixel.hytale.server.core.modules.blockhealth.BlockHealthModule

4 витягнуті методи

BlockHealthModule(JavaPluginInit)

+3 більше методів, доступних у створеному індексі.

FragileBlock

com.hypixel.hytale.server.core.modules.blockhealth.FragileBlock

8 витягнуті методи

FragileBlock(float)

+7 більше методів, доступних у створеному індексі.

BasicCollisionData

com.hypixel.hytale.server.core.modules.collision.BasicCollisionData

2 витягнуті методи

BasicCollisionData()

+1 більше методів, доступних у створеному індексі.

BlockCollisionData

com.hypixel.hytale.server.core.modules.collision.BlockCollisionData

6 витягнуті методи

BlockCollisionData()

+5 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Players, Inventories & Item Flow

Inventory containers, player-facing storage, active slots, and item movement utilities.

66 класи
ІнвентарContainersPlayer state

Показ 6 індексованих класів для цього домену (всього виявлено: 66).

ActiveSlotInventoryComponent

com.hypixel.hytale.server.core.inventory.ActiveSlotInventoryComponent

9 витягнуті методи

ActiveSlotInventoryComponent()

+8 більше методів, доступних у створеному індексі.

CombinedItemContainer

com.hypixel.hytale.server.core.inventory.container.CombinedItemContainer

18 витягнуті методи

CombinedItemContainer(ItemContainer[])

+17 більше методів, доступних у створеному індексі.

DelegateItemContainer

com.hypixel.hytale.server.core.inventory.container.DelegateItemContainer

18 витягнуті методи

DelegateItemContainer(ItemContainer)

+17 більше методів, доступних у створеному індексі.

EmptyItemContainer

com.hypixel.hytale.server.core.inventory.container.EmptyItemContainer

18 витягнуті методи

EmptyItemContainer()

+17 більше методів, доступних у створеному індексі.

FetchedItemContainer

com.hypixel.hytale.server.core.inventory.container.FetchedItemContainer

18 витягнуті методи

FetchedItemContainer(Supplier)

+17 більше методів, доступних у створеному індексі.

ArmorSlotAddFilter

com.hypixel.hytale.server.core.inventory.container.filter.ArmorSlotAddFilter

3 витягнуті методи

ArmorSlotAddFilter(ItemArmorSlot)

+2 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Interaction Graphs & Combat Actions

The interaction module, block actions, combat wiring, selectors, and chained interaction behavior.

132 класи
InteractionModuleCombat actionsSelectors

Показ 6 індексованих класів для цього домену (всього виявлено: 132).

BlockHarvestUtils

com.hypixel.hytale.server.core.modules.interaction.BlockHarvestUtils

14 витягнуті методи

BlockHarvestUtils()

+13 більше методів, доступних у створеному індексі.

BlockInteractionUtils

com.hypixel.hytale.server.core.modules.interaction.BlockInteractionUtils

3 витягнуті методи

BlockInteractionUtils()

+2 більше методів, доступних у створеному індексі.

BlockPlaceUtils

com.hypixel.hytale.server.core.modules.interaction.BlockPlaceUtils

3 витягнуті методи

BlockPlaceUtils()

+2 більше методів, доступних у створеному індексі.

BlockCounter

com.hypixel.hytale.server.core.modules.interaction.blocktrack.BlockCounter

7 витягнуті методи

getResourceType(): ResourceType

+6 більше методів, доступних у створеному індексі.

TrackedPlacement

com.hypixel.hytale.server.core.modules.interaction.blocktrack.TrackedPlacement

4 витягнуті методи

getComponentType(): ComponentType

+3 більше методів, доступних у створеному індексі.

InteractionClearCommand

com.hypixel.hytale.server.core.modules.interaction.commands.InteractionClearCommand

2 витягнуті методи

InteractionClearCommand()

+1 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

UI Pages, Entity UI & Localization

Custom UI pages, entity UI systems, and localization tooling that actually appear in the jar.

26 класи
CustomUIPageEntity UILocalization

Показ 6 індексованих класів для цього домену (всього виявлено: 26).

EnableTmpTagsCommand

com.hypixel.hytale.server.core.modules.i18n.commands.EnableTmpTagsCommand

2 витягнуті методи

EnableTmpTagsCommand()

+1 більше методів, доступних у створеному індексі.

GenerateI18nCommand

com.hypixel.hytale.server.core.modules.i18n.commands.GenerateI18nCommand

2 витягнуті методи

GenerateI18nCommand()

+1 більше методів, доступних у створеному індексі.

InternationalizationCommands

com.hypixel.hytale.server.core.modules.i18n.commands.InternationalizationCommands

1 витягнуті методи

InternationalizationCommands()

GenerateDefaultLanguageEvent

com.hypixel.hytale.server.core.modules.i18n.event.GenerateDefaultLanguageEvent

2 витягнуті методи

GenerateDefaultLanguageEvent(ConcurrentHashMap)

+1 більше методів, доступних у створеному індексі.

MessagesUpdated

com.hypixel.hytale.server.core.modules.i18n.event.MessagesUpdated

4 витягнуті методи

MessagesUpdated(Map, Map)

+3 більше методів, доступних у створеному індексі.

TranslationMap

com.hypixel.hytale.server.core.modules.i18n.generator.TranslationMap

10 витягнуті методи

TranslationMap()

+9 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Commands, Permissions & Tasks

AbstractCommand, CommandContext, permission groups, and TaskRegistry orchestration.

246 класи
AbstractCommandДозволиTaskRegistry

Показ 6 індексованих класів для цього домену (всього виявлено: 246).

AssetsCommand

com.hypixel.hytale.server.core.command.commands.debug.AssetsCommand

1 витягнуті методи

AssetsCommand()

AssetsDuplicatesCommand

com.hypixel.hytale.server.core.command.commands.debug.AssetsDuplicatesCommand

2 витягнуті методи

AssetsDuplicatesCommand()

+1 більше методів, доступних у створеному індексі.

AssetTagsCommand

com.hypixel.hytale.server.core.command.commands.debug.AssetTagsCommand

2 витягнуті методи

AssetTagsCommand()

+1 більше методів, доступних у створеному індексі.

HitboxCollisionAddCommand

com.hypixel.hytale.server.core.command.commands.debug.component.hitboxcollision.HitboxCollisionAddCommand

1 витягнуті методи

HitboxCollisionAddCommand()

HitboxCollisionCommand

com.hypixel.hytale.server.core.command.commands.debug.component.hitboxcollision.HitboxCollisionCommand

1 витягнуті методи

HitboxCollisionCommand()

HitboxCollisionRemoveCommand

com.hypixel.hytale.server.core.command.commands.debug.component.hitboxcollision.HitboxCollisionRemoveCommand

1 витягнуті методи

HitboxCollisionRemoveCommand()

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Assets, Config, Prefabs & Codecs

Asset store data, config codecs, prefabs, and jar-exposed configuration primitives.

642 класи
AssetsКонфігураціяКодеки

Показ 6 індексованих класів для цього домену (всього виявлено: 642).

AssetConstants

com.hypixel.hytale.assetstore.AssetConstants

1 витягнуті методи

AssetConstants()

AssetExtraInfo

com.hypixel.hytale.assetstore.AssetExtraInfo

9 витягнуті методи

AssetExtraInfo(AssetExtraInfo$Data)

+8 більше методів, доступних у створеному індексі.

AssetHolder

com.hypixel.hytale.assetstore.AssetHolder

0 витягнуті методи

Немає вилучених відкритих/захищених методів.

AssetKeyValidator

com.hypixel.hytale.assetstore.AssetKeyValidator

4 витягнуті методи

AssetKeyValidator(Supplier)

+3 більше методів, доступних у створеному індексі.

AssetLoadResult

com.hypixel.hytale.assetstore.AssetLoadResult

6 витягнуті методи

AssetLoadResult(Map, Map, Set, Set, Map)

+5 більше методів, доступних у створеному індексі.

AssetMap

com.hypixel.hytale.assetstore.AssetMap

18 витягнуті методи

AssetMap()

+17 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Protocol, IO & Service Clients

Protocol packets, IO handlers, auth/service clients, and validation-heavy network structures.

963 класи
Protocol packetsIOService clients

Показ 6 індексованих класів для цього домену (всього виявлено: 963).

AbilityEffects

com.hypixel.hytale.protocol.AbilityEffects

18 витягнуті методи

AbilityEffects()

+17 більше методів, доступних у створеному індексі.

AccumulationMode

com.hypixel.hytale.protocol.AccumulationMode

4 витягнуті методи

values(): AccumulationMode[]

+3 більше методів, доступних у створеному індексі.

ActiveAnimationsUpdate

com.hypixel.hytale.protocol.ActiveAnimationsUpdate

17 витягнуті методи

ActiveAnimationsUpdate()

+16 більше методів, доступних у створеному індексі.

AmbienceFX

com.hypixel.hytale.protocol.AmbienceFX

18 витягнуті методи

AmbienceFX()

+17 більше методів, доступних у створеному індексі.

AmbienceFXAltitude

com.hypixel.hytale.protocol.AmbienceFXAltitude

4 витягнуті методи

values(): AmbienceFXAltitude[]

+3 більше методів, доступних у створеному індексі.

AmbienceFXAmbientBed

com.hypixel.hytale.protocol.AmbienceFXAmbientBed

18 витягнуті методи

AmbienceFXAmbientBed()

+17 більше методів, доступних у створеному індексі.

Відображення швидкого попереднього перегляду найбільших доменів для швидкого завантаження сторінки. Використовуйте повний API JSON для повних підписів.

Стартові шаблони (плагін + мод)

Starter repository references for core systems, UI, events, entities, networking, inventory, messages, permissions, commands, config, economy, persistence, advanced utilities, and smoke tests.

Treat these repositories as scaffolding references. Regenerate the runtime index against the latest jar before relying on any older starter code unchanged.

Плагін

Ядро Шаблон

hytale-plugin-template-core

Плагін

UI Шаблон

hytale-plugin-template-ui

Плагін

Події Шаблон

hytale-plugin-template-events

Плагін

Сутності Шаблон

hytale-plugin-template-entities

Плагін

Мережа Шаблон

hytale-plugin-template-network

Плагін

Інвентар Шаблон

hytale-plugin-template-inventory

Плагін

Повідомлення Шаблон

hytale-plugin-template-messages

Плагін

Дозволи Шаблон

hytale-plugin-template-permissions

Mod

Ядро Шаблон

hytale-mod-template-core

Mod

Події Шаблон

hytale-mod-template-events

Mod

Сутності Шаблон

hytale-mod-template-entities

Mod

Мережа Шаблон

hytale-mod-template-network

Mod

Інвентар Шаблон

hytale-mod-template-inventory

Mod

Повідомлення Шаблон

hytale-mod-template-messages

Mod

Дозволи Шаблон

hytale-mod-template-permissions

Плагін

Команди Шаблон

hytale-plugin-template-commands

Плагін

Конфігурація Шаблон

hytale-plugin-template-config

Плагін

Економіка Шаблон

hytale-plugin-template-economy

Плагін

Наполегливість Шаблон

hytale-plugin-template-persistence

Плагін

Просунутий Шаблон

hytale-plugin-template-advanced

  • Rolling command quota limiter with sender-scoped windows.
  • Cached licensing decision flow with deterministic reason codes.
  • Scheduled snapshot persistence and runtime restore path.
  • Кільцевий журнал аудиту в пам’яті для діагностики життєвого циклу, лімітера та ліцензування.

Плагін

Тест на дим Шаблон

hytale-plugin-template-smoke

Плагін

Безпека Шаблон

hytale-plugin-template-security

  • Per-source auth failure window and command-safe diagnostics output.

Mod

Команди Шаблон

hytale-mod-template-commands

Mod

Конфігурація Шаблон

hytale-mod-template-config

Mod

Економіка Шаблон

hytale-mod-template-economy

Mod

Наполегливість Шаблон

hytale-mod-template-persistence

Mod

Просунутий Шаблон

hytale-mod-template-advanced

  • Profile economy transfer flow with audit trail entries.
  • Escalating lockouts for repeated security failures.
  • Signed network envelopes with timestamp skew validation.
  • Захист від повтору nonce для валідації підписаних конвертів.

Mod

Тест на дим Шаблон

hytale-mod-template-smoke

Mod

Безпека Шаблон

hytale-mod-template-security

  • Lock/unlock behavior with bounded lock windows and source cleanup.

Найкращі пакети середовища виконання

Простори імен пакетів високої щільності з вилученого індексу jar, корисні для швидкого вивчення підсистем.

ПакетКількість класів
com.hypixel.hytale.server.core1601
com.hypixel.hytale.server.npc797
com.hypixel.hytale.builtin.hytalegenerator573
com.hypixel.hytale.protocol.packets453
com.hypixel.hytale.builtin.adventure227
com.hypixel.hytale.server.worldgen215
com.hypixel.hytale.builtin.buildertools208
com.hypixel.hytale.builtin.triggervolumes90
com.hypixel.hytale.server.spawning82
com.hypixel.hytale.builtin.portals53
com.hypixel.hytale.procedurallib.logic42
com.hypixel.hytale.procedurallib.json38
com.hypixel.hytale.codec.validation36
com.hypixel.hytale.server.flock33
com.hypixel.hytale.builtin.worldgen33
com.hypixel.hytale.codec.codecs30
com.hypixel.hytale.builtin.asseteditor30
com.hypixel.hytale.builtin.instances29

Інтеграція API ліцензування (плагіни/моди)

Ресурси преміум-класу повинні перевіряти ключі під час запуску сервера та періодично під час виконання, використовуючи маркери інтеграції творця та підписані відповіді.

Interactive startup flow preview

Ready to start

Example Server

ExampleAsset startup license check

Startup promptSigned API checkClient-side only

> Press Start to preview the buyer activation flow.

This browser-side simulator mirrors the buyer startup prompt flow for premium plugins and mods, including success, rejection, and timeout behavior.
This preview runs entirely in the browser and does not contact the real API.
Preferred path: use managed injection from Creator Dashboard -> Assets. HytaleDepot injects runtime validation into uploaded JARs.
Injection writes `hd-integration.yml` with a build-scoped `plugin-secret`, `asset-id`, `build-hash`, `secret-version`, `validate-endpoint`, `deployment-secret-env`, `asset-name`, and `asset-type` (raw integration keys are never shipped in the JAR).
Manual integrations should prefer a creator-owned relay/backend that exchanges a long-lived integration key for a short-lived asset-scoped runtime token via `POST /api/licenses/runtime-token`.
Before prompting for first activation, runtime probes `GET /api/status`; if the licensing API is unreachable or in maintenance, startup fail-opens immediately without saving an unverified key.
Manual path: keep buyer key in `hd-licenses/<assetId>.key`, fetch a short-lived runtime token from your relay, then call `POST /api/licenses/validate` at startup and periodically after that.
Injected builds send `X-Plugin-Secret` and `signature = HMAC_SHA256(pluginSecret, licenseKey|assetId|serverIp|timestamp|nonce)`. Manual runtime-token builds send `X-License-Token` and do not ship the long-lived integration key to the server.
If runtime reports private/container IP, API normalizes binding using requester/public IP for license slot tracking.
When build attestation is enabled, requests must send a known `build_hash` for a published JAR of that asset. Unknown or stale builds are rejected.
When deployment second-factor is enabled, the runtime must also send the creator-configured deployment secret from server-side config or environment; never bake it into the JAR.
Temporary API fail-open only affects the current startup; once the API is back, the next restart requires normal license entry/validation again if no verified key is stored.
Manual unbind is allowed only for inactive/stopped servers; active heartbeat usage is rejected with a clear error.
License key rotation follows the same rule: only rotate when the old key is no longer active on any server, then distribute the new key and remove the old one from the server files.
On `ip_slots_exhausted`, warn and exit (recommended 5-second delay) so operators can free a slot or remove stale keys.
Кінцева точкапризначення
GET /api/statusAvailability + maintenance probe used before first activation prompt.
POST /api/licenses/runtime-tokenCreator relay endpoint: exchange a long-lived integration key/token for a short-lived asset-scoped runtime token.
POST /api/licenses/validatePrimary runtime check. Validates status/expiry and auto-binds active server/IP slot usage.
POST /api/licenses/bindOptional explicit bind when you want to reserve/confirm slot before full startup.
GET /api/licenses/key/{key}Read license state, expiry, and currently bound slots.
POST /api/licenses/demo/{assetId}Видайте тимчасову демонстраційну ліцензію для налаштованих демонстраційних збірок.
POST /api/licenses/customВидавати спеціальні ліцензії, керовані автором, із правилами терміну дії/IP.

Managed Injection Config Example

# HytaleDepot Integration Config - auto-injected at upload
plugin-secret: "build_scoped_hmac"
asset-id: "asset_uuid"
build-hash: "published_build_sha256"
secret-version: "4"
validate-endpoint: "https://hytaledepot.net/api/licenses/validate"
deployment-secret-env: "HD_DEPLOYMENT_SECRET"
asset-name: "Example Plugin"
asset-type: "plugin"

Managed Injection Runtime

Injected runtime behavior
1. Adds net.hytaledepot.runtime.HdLicenseBootstrap.class
2. Adds net.hytaledepot.runtime.HdLicenseCommand.class
3. Rewrites manifest.json Main -> net.hytaledepot.runtime.HdBootstrapWrapper
4. Wrapper calls HdLicenseBootstrap.validate(this) before the original setup path
5. First-run license entry uses /hdlicense <assetId> <licenseKey> or hd-licenses/<assetId>.pending
6. Verified buyer keys are cached in hd-licenses/<assetId>.key
7. If /api/status is in maintenance or unreachable, startup fail-opens for that boot only

Injected Validate Request Example

POST /api/licenses/validate
X-Plugin-Secret: <build_scoped_derived_secret>
Content-Type: application/json

{
  "asset_id": "asset_uuid",
  "license_key": "HD-XXXX-XXXX",
  "server_ip": "x.x.x.x",
  "build_hash": "published_build_sha256",
  "secret_version": "4",
  "deployment_secret": "server_only_secret",
  "timestamp": "1739553549000",
  "nonce": "abc12345",
  "signature": "HMAC_SHA256(pluginSecret, licenseKey|assetId|serverIp|timestamp|nonce)"
}

Приклад примусового виконання запуску

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

String API_VALIDATE = "https://hytaledepot.net/api/licenses/validate";
String API_STATUS = "https://hytaledepot.net/api/status";
String API_RUNTIME_TOKEN = "https://hytaledepot.net/api/licenses/runtime-token";
String ASSET_ID = "asset_uuid";
String LICENSE_KEY = readBuyerLicenseKey();
String BUILD_HASH = "build_sha256_here";
String DEPLOYMENT_SECRET = System.getenv("HD_DEPLOYMENT_SECRET");
String RUNTIME_TOKEN = requestRuntimeTokenFromCreatorRelay(API_RUNTIME_TOKEN, ASSET_ID, BUILD_HASH);
String SERVER_IP = detectServerIp();

if (isApiTemporarilyUnavailable(API_STATUS)) {
  System.err.println("[HD License] Licensing API is in maintenance or unreachable.");
  System.err.println("[HD License] Loading this startup without license activation; next restart will require validation again.");
  return;
}

String timestamp = String.valueOf(System.currentTimeMillis());
String nonce = UUID.randomUUID().toString();

String payload = "{"
    + "\"asset_id\":\"" + ASSET_ID + "\","
    + "\"license_key\":\"" + LICENSE_KEY + "\","
    + "\"server_ip\":\"" + SERVER_IP + "\","
    + "\"build_hash\":\"" + BUILD_HASH + "\","
    + "\"deployment_secret\":\"" + DEPLOYMENT_SECRET + "\","
    + "\"timestamp\":\"" + timestamp + "\","
    + "\"nonce\":\"" + nonce + "\""
    + "}";

HttpRequest request = HttpRequest.newBuilder(URI.create(API_VALIDATE))
    .header("Content-Type", "application/json")
    .header("X-License-Token", RUNTIME_TOKEN)
    .POST(HttpRequest.BodyPublishers.ofString(payload, StandardCharsets.UTF_8))
    .build();

HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
boolean allowed = response.statusCode() == 200
    && (response.body().contains("\"allowed\":true") || response.body().contains("\"allowed\": true"));

if (!allowed) {
  String reason = extractJsonField(response.body(), "reason_code");
  System.err.println("[HD License] Validation denied: " + reason);
  Thread.sleep(5000);
  System.exit(1);
}

static boolean isApiTemporarilyUnavailable(String statusUrl) {
  try {
    HttpResponse<String> status = HttpClient.newHttpClient().send(
      HttpRequest.newBuilder(URI.create(statusUrl)).GET().build(),
      HttpResponse.BodyHandlers.ofString()
    );
    return status.statusCode() >= 500
        || status.body().contains("\"enabled\":true")
        || status.body().contains("\"enabled\": true");
  } catch (Exception ignored) {
    return true;
  }
}

Приклад запиту перевірки

{
  "asset_id": "asset_uuid",
  "license_key": "HD-XXXX-XXXX",
  "server_ip": "x.x.x.x",
  "build_hash": "build_sha256_here",
  "deployment_secret": "server_only_secret",
  "timestamp": "1739553549000",
  "nonce": "abc12345"
}

Приклад перевірки відповіді

{
  "status": "invalid",
  "allowed": false,
  "reason_code": "ip_slots_exhausted",
  "expires_at": "2027-01-01T00:00:00.000Z",
  "offline_grace_seconds": 3600,
  "max_ip_slots": 2,
  "bindings": [{ "ip": "x.x.x.x", "lastSeenAt": "2026-04-02T10:21:00.000Z" }],
  "issued_at": "2026-02-15T09:12:21.000Z",
  "nonce": "r7FmK1ab",
  "signature": "hex_hmac_signature"
}

Строгість

`hard` = зупинити запуск, `soft` = лише вимкнути плагін, `warn` = зареєструвати та продовжити.

Offline Grace

Тимчасове вікно офлайн (у секундах), дозволене після останньої успішної перевірки.

IP-слоти

Максимальна одночасна прив’язка сервера/IP до повернення `ip_slots_exhausted`.

Maintenance fallback

If `/api/status` reports maintenance or the API cannot be reached, startup may fail-open for that boot only and must not persist an unverified new key.

Rotation

Only rotate a license key after the old key is inactive. Replace the server file with the new key before the next restart.

Список літератури

Використовуйте офіційні посилання Hytale для вказівок щодо політики/виконання та репозиторії спільноти для шаблонів впровадження.