Skip to content

Mod Lifecycle

Mods go through a defined lifecycle from loading to shutdown. This guide explains what to do in each phase.

Called before the server is fully initialized. Returns CompletableFuture<Void> (nullable).

@Override
public CompletableFuture<Void> preLoad() {
return CompletableFuture.runAsync(() -> {
// early async initialization if needed
});
}

The main registration phase. Called when your mod loads.

@Override
protected void setup() {
// register a command
getCommandRegistry().registerCommand(new MyCommand());
// register event listeners
getEventRegistry().register(PlayerJoinEvent.class, this::onPlayerJoin);
// register a component
this.myComponentType = getEntityStoreRegistry()
.registerComponent(MyComponent.class, "MyComponent", MyComponent.CODEC);
}
See what Hytale's built-in mods register in setup()
TaskMethod
Register commandsgetCommandRegistry().registerCommand()
Register event listenersgetEventRegistry().register()
Register componentsgetEntityStoreRegistry().registerComponent()
Register systemsgetEntityStoreRegistry().registerSystem()
Register block statesgetBlockStateRegistry().registerBlockState()
Register asset storesAssetRegistry.register()
Register codecsgetCodecRegistry().register()
Register interactionsInteraction.CODEC.register()
Register entity typesgetEntityRegistry().registerEntity()

Called after all mods have completed setup(). Use for initialization that depends on assets or other mods being ready.

@Override
protected void start() {
// load an asset (not safe during setup - assets may not be loaded yet)
ModelAsset modelAsset = ModelAsset.getAssetMap().getAsset("My_Model");
if (modelAsset == null) {
throw new IllegalStateException("Model 'My_Model' not found");
}
this.model = Model.createUnitScaleModel(modelAsset);
// read config and apply settings
MyConfig cfg = this.config.get();
this.maxPlayers = cfg.maxPlayers;
// schedule a recurring task
this.saveTask = HytaleServer.SCHEDULED_EXECUTOR
.scheduleWithFixedDelay(this::saveData, 5, 5, TimeUnit.MINUTES);
}
See what Hytale's built-in mods do in start()
TaskMethod
Load asset referencesModelAsset.getAssetMap().getAsset()
Read configuration valuesthis.config.get()
Schedule recurring tasksHytaleServer.SCHEDULED_EXECUTOR.scheduleWithFixedDelay()
Cross-mod integrationPluginManager.getPlugin()

Called when the server stops. Use for cleanup that isn’t handled automatically.

@Override
protected void shutdown() {
// cancel scheduled tasks
if (this.saveTask != null) {
this.saveTask.cancel(false);
}
// save any pending data
this.dataStore.saveToDiskAll();
}
See what Hytale's built-in mods do in shutdown()
TaskMethod
Cancel scheduled tasksscheduledFuture.cancel(false)
Save persistent datadataStore.saveToDisk()
Close external connectionsconnection.close()