807 lines
26 KiB
Markdown
807 lines
26 KiB
Markdown
# Hytale Server API Reference (LLM-Optimized)
|
|
|
|
This document is a comprehensive API reference for the Hytale Server modding system, optimized for LLM consumption. All
|
|
class names, method signatures, and JSON structures are validated against the actual codebase.
|
|
|
|
---
|
|
|
|
## PLUGIN SYSTEM
|
|
|
|
### Core Classes
|
|
|
|
| Class | Package |
|
|
|------------------|--------------------------------------------------------|
|
|
| `JavaPlugin` | `com.hypixel.hytale.server.core.plugin.JavaPlugin` |
|
|
| `PluginBase` | `com.hypixel.hytale.server.core.plugin.PluginBase` |
|
|
| `PluginManifest` | `com.hypixel.hytale.common.plugin.PluginManifest` |
|
|
| `JavaPluginInit` | `com.hypixel.hytale.server.core.plugin.JavaPluginInit` |
|
|
| `PluginState` | `com.hypixel.hytale.server.core.plugin.PluginState` |
|
|
|
|
### Plugin Lifecycle
|
|
|
|
```
|
|
PluginState: NONE -> SETUP -> START -> ENABLED -> SHUTDOWN -> DISABLED
|
|
```
|
|
|
|
**Lifecycle Methods (exact names):**
|
|
|
|
- `setup()` - Called during initialization, register components here
|
|
- `start()` - Called after setup, plugin becomes active
|
|
- `shutdown()` - Called during server stop/plugin disable
|
|
|
|
### Plugin Manifest JSON (exact field names, case-sensitive)
|
|
|
|
```json
|
|
{
|
|
"Group": "com.example",
|
|
"Name": "MyPlugin",
|
|
"Version": "1.0.0",
|
|
"Description": "Plugin description",
|
|
"Authors": [{"Name": "Dev", "Email": "dev@example.com", "Url": "https://example.com"}],
|
|
"Website": "https://example.com",
|
|
"Main": "com.example.MyPlugin",
|
|
"ServerVersion": ">=1.0.0",
|
|
"Dependencies": {"OtherGroup/OtherPlugin": ">=1.0.0"},
|
|
"OptionalDependencies": {},
|
|
"LoadBefore": {},
|
|
"DisabledByDefault": false,
|
|
"IncludesAssetPack": false,
|
|
"SubPlugins": []
|
|
}
|
|
```
|
|
|
|
### Registry Methods on PluginBase
|
|
|
|
| Method | Return Type |
|
|
|------------------------------|---------------------------------------|
|
|
| `getClientFeatureRegistry()` | `ClientFeatureRegistry` |
|
|
| `getCommandRegistry()` | `CommandRegistry` |
|
|
| `getEventRegistry()` | `EventRegistry` |
|
|
| `getBlockStateRegistry()` | `BlockStateRegistry` |
|
|
| `getEntityRegistry()` | `EntityRegistry` |
|
|
| `getTaskRegistry()` | `TaskRegistry` |
|
|
| `getEntityStoreRegistry()` | `ComponentRegistryProxy<EntityStore>` |
|
|
| `getChunkStoreRegistry()` | `ComponentRegistryProxy<ChunkStore>` |
|
|
| `getAssetRegistry()` | `AssetRegistry` |
|
|
|
|
### Configuration Pattern
|
|
|
|
```java
|
|
// In constructor (BEFORE setup):
|
|
Config<MyConfig> config = withConfig(MyConfig.CODEC);
|
|
Config<MyConfig> config = withConfig("filename", MyConfig.CODEC);
|
|
|
|
// Access in setup/start:
|
|
MyConfig cfg = config.get();
|
|
```
|
|
|
|
---
|
|
|
|
## EVENT SYSTEM
|
|
|
|
### Core Interfaces (Package: `com.hypixel.hytale.event`)
|
|
|
|
| Interface | Description |
|
|
|------------------------|-------------------------------------------------|
|
|
| `IBaseEvent<KeyType>` | Base event interface |
|
|
| `IEvent<KeyType>` | Synchronous event, extends IBaseEvent |
|
|
| `IAsyncEvent<KeyType>` | Async event, extends IBaseEvent |
|
|
| `ICancellable` | Mixin: `isCancelled()`, `setCancelled(boolean)` |
|
|
| `IProcessedEvent` | Mixin: `processEvent(String)` |
|
|
|
|
### EventPriority (exact values)
|
|
|
|
```java
|
|
FIRST = (short)-21844 // Runs first
|
|
EARLY = (short)-10922
|
|
NORMAL = (short)0 // Default
|
|
LATE = (short)10922
|
|
LAST = (short)21844 // Runs last
|
|
```
|
|
|
|
### EventRegistry Methods (IEventRegistry interface)
|
|
|
|
**Sync Registration:**
|
|
|
|
```java
|
|
// Without key (Void key)
|
|
EventRegistration register(Class<? super EventType> eventClass, Consumer<EventType> consumer)
|
|
EventRegistration register(EventPriority priority, Class<? super EventType> eventClass, Consumer<EventType> consumer)
|
|
|
|
// With key
|
|
EventRegistration register(Class<? super EventType> eventClass, KeyType key, Consumer<EventType> consumer)
|
|
EventRegistration register(EventPriority priority, Class<? super EventType> eventClass, KeyType key, Consumer<EventType> consumer)
|
|
```
|
|
|
|
**Global Registration (receives all keys):**
|
|
|
|
```java
|
|
EventRegistration registerGlobal(Class<? super EventType> eventClass, Consumer<EventType> consumer)
|
|
EventRegistration registerGlobal(EventPriority priority, Class<? super EventType> eventClass, Consumer<EventType> consumer)
|
|
```
|
|
|
|
**Unhandled Registration (when no other handler processed):**
|
|
|
|
```java
|
|
EventRegistration registerUnhandled(Class<? super EventType> eventClass, Consumer<EventType> consumer)
|
|
```
|
|
|
|
**Async Registration:**
|
|
|
|
```java
|
|
EventRegistration registerAsync(Class<? super EventType> eventClass, Function<CompletableFuture<EventType>, CompletableFuture<EventType>> function)
|
|
EventRegistration registerAsyncGlobal(...)
|
|
EventRegistration registerAsyncUnhandled(...)
|
|
```
|
|
|
|
### Key Event Classes
|
|
|
|
**Server Events (`com.hypixel.hytale.server.core.event.events`):**
|
|
|
|
- `BootEvent` - IEvent<Void>
|
|
- `ShutdownEvent` - IEvent<Void>
|
|
- `PrepareUniverseEvent` - IEvent<Void>
|
|
|
|
**Player Events (`...event.events.player`):**
|
|
|
|
- `PlayerConnectEvent` - IEvent<Void>
|
|
- `PlayerSetupConnectEvent` - IEvent<Void>, ICancellable
|
|
- `PlayerDisconnectEvent` - PlayerRefEvent<Void>
|
|
- `PlayerChatEvent` - IAsyncEvent<String>, ICancellable
|
|
- `PlayerInteractEvent` - PlayerEvent<String>, ICancellable
|
|
- `PlayerMouseButtonEvent` - PlayerEvent<Void>, ICancellable
|
|
- `AddPlayerToWorldEvent` - IEvent<String>
|
|
- `DrainPlayerFromWorldEvent` - IEvent<String>
|
|
|
|
**World Events (`...universe.world.events`):**
|
|
|
|
- `AddWorldEvent` - WorldEvent, ICancellable
|
|
- `RemoveWorldEvent` - WorldEvent, ICancellable
|
|
- `StartWorldEvent` - WorldEvent
|
|
- `AllWorldsLoadedEvent` - IEvent<Void>
|
|
|
|
**ECS Events (`...event.events.ecs`):**
|
|
|
|
- `BreakBlockEvent` - CancellableEcsEvent
|
|
- `PlaceBlockEvent` - CancellableEcsEvent
|
|
- `UseBlockEvent` - EcsEvent (with nested `Pre` implementing ICancellableEcsEvent)
|
|
- `DamageBlockEvent` - CancellableEcsEvent
|
|
- `DropItemEvent` - CancellableEcsEvent
|
|
|
|
---
|
|
|
|
## COMMAND SYSTEM
|
|
|
|
### Core Classes (Package: `com.hypixel.hytale.server.core.command.system`)
|
|
|
|
| Class | Description |
|
|
|-----------------------------|--------------------------------------------|
|
|
| `AbstractCommand` | Base command class |
|
|
| `CommandRegistry` | Plugin command registration |
|
|
| `CommandContext` | Execution context |
|
|
| `CommandBase` | Sync command base (override `executeSync`) |
|
|
| `AbstractAsyncCommand` | Async command base |
|
|
| `AbstractPlayerCommand` | Player-required command |
|
|
| `AbstractWorldCommand` | World context command |
|
|
| `AbstractCommandCollection` | Parent with subcommands only |
|
|
|
|
### AbstractCommand Key Methods
|
|
|
|
```java
|
|
// Constructor
|
|
protected AbstractCommand(String name, String description)
|
|
protected AbstractCommand(String name, String description, boolean requiresConfirmation)
|
|
protected AbstractCommand(String description) // For variants (no name)
|
|
|
|
// Abstract - must implement
|
|
protected abstract CompletableFuture<Void> execute(CommandContext context)
|
|
|
|
// Configuration
|
|
void requirePermission(String permission)
|
|
void addAliases(String... aliases)
|
|
void addSubCommand(AbstractCommand command)
|
|
void addUsageVariant(AbstractCommand command)
|
|
|
|
// Arguments
|
|
RequiredArg<D> withRequiredArg(String name, String description, ArgumentType<D> argType)
|
|
OptionalArg<D> withOptionalArg(String name, String description, ArgumentType<D> argType)
|
|
DefaultArg<D> withDefaultArg(String name, String description, ArgumentType<D> argType, D defaultValue, String defaultValueDescription)
|
|
FlagArg withFlagArg(String name, String description)
|
|
RequiredArg<List<D>> withListRequiredArg(String name, String description, ArgumentType<D> argType)
|
|
```
|
|
|
|
### CommandContext Key Methods
|
|
|
|
```java
|
|
<DataType> DataType get(Argument<?, DataType> argument) // Get argument value
|
|
boolean provided(Argument<?, ?> argument) // Check if provided
|
|
void sendMessage(Message message) // Send to sender
|
|
boolean isPlayer() // Is sender a player
|
|
CommandSender sender() // Get sender
|
|
<T extends CommandSender> T senderAs(Class<T> type) // Cast sender
|
|
Ref<EntityStore> senderAsPlayerRef() // Get as player ref
|
|
```
|
|
|
|
### Built-in ArgTypes (`com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes`)
|
|
|
|
```java
|
|
ArgTypes.BOOLEAN, ArgTypes.INTEGER, ArgTypes.FLOAT, ArgTypes.DOUBLE, ArgTypes.STRING
|
|
ArgTypes.UUID, ArgTypes.PLAYER_UUID, ArgTypes.PLAYER_REF, ArgTypes.WORLD
|
|
ArgTypes.RELATIVE_DOUBLE_COORD, ArgTypes.RELATIVE_INT_COORD
|
|
ArgTypes.RELATIVE_BLOCK_POSITION, ArgTypes.RELATIVE_POSITION
|
|
ArgTypes.VECTOR2I, ArgTypes.VECTOR3I, ArgTypes.ROTATION, ArgTypes.COLOR
|
|
ArgTypes.GAME_MODE, ArgTypes.ITEM_ASSET, ArgTypes.BLOCK_TYPE_ASSET
|
|
ArgTypes.WEATHER_ASSET, ArgTypes.SOUND_EVENT_ASSET, ArgTypes.PARTICLE_SYSTEM
|
|
ArgTypes.forEnum(String name, Class<E> enumClass) // Create enum type
|
|
```
|
|
|
|
---
|
|
|
|
## ENTITY COMPONENT SYSTEM (ECS)
|
|
|
|
### Core Classes (Package: `com.hypixel.hytale.component`)
|
|
|
|
| Class | Description |
|
|
|------------------------------|------------------------------------------|
|
|
| `Component<ECS_TYPE>` | Base component interface |
|
|
| `ComponentRegistry` | Component type registration |
|
|
| `ComponentType<ECS_TYPE, T>` | Registered component type |
|
|
| `Store` | ECS data storage |
|
|
| `Ref` | Entity reference (ID) |
|
|
| `Holder` | Component holder for entity construction |
|
|
| `Query` | Entity filtering |
|
|
|
|
### Entity Hierarchy
|
|
|
|
```
|
|
Entity (com.hypixel.hytale.server.core.entity.Entity)
|
|
└── LivingEntity (com.hypixel.hytale.server.core.entity.LivingEntity)
|
|
├── Player (com.hypixel.hytale.server.core.entity.entities.Player)
|
|
└── NPCEntity (com.hypixel.hytale.server.npc.entities.NPCEntity)
|
|
```
|
|
|
|
### EntityStore (Package: `com.hypixel.hytale.server.core.universe.world.storage`)
|
|
|
|
```java
|
|
public static final ComponentRegistry<EntityStore> REGISTRY = new ComponentRegistry<>();
|
|
|
|
// Registration
|
|
ComponentType<EntityStore, T> registerComponent(Class<? super T> tClass, Supplier<T> supplier)
|
|
ComponentType<EntityStore, T> registerComponent(Class<? super T> tClass, String id, BuilderCodec<T> codec)
|
|
void registerSystem(ISystem<EntityStore> system)
|
|
```
|
|
|
|
### Key Built-in Components
|
|
|
|
**Transform/Position:**
|
|
|
|
- `TransformComponent` - Position (Vector3d) and rotation (Vector3f)
|
|
- `HeadRotation` - Head rotation angles
|
|
- `EntityScaleComponent` - Scale modifier
|
|
|
|
**Physics:**
|
|
|
|
- `Velocity` - Velocity vector
|
|
- `BoundingBox` - Collision box
|
|
- `CollisionResultComponent` - Collision results
|
|
- `MovementStatesComponent` - Movement flags (onGround, swimming, etc.)
|
|
|
|
**Identity:**
|
|
|
|
- `UUIDComponent` - Unique identifier
|
|
- `NetworkId` - Network sync ID
|
|
- `DisplayNameComponent` - Display name
|
|
|
|
**Visual:**
|
|
|
|
- `ModelComponent` - 3D model reference
|
|
- `ActiveAnimationComponent` - Current animations
|
|
- `DynamicLight` - Dynamic lighting
|
|
|
|
**State Flags:**
|
|
|
|
- `Invulnerable` - Immune to damage
|
|
- `Intangible` - Non-collidable
|
|
- `Interactable` - Can be interacted with
|
|
- `Frozen` - Frozen state
|
|
|
|
**Player-specific:**
|
|
|
|
- `Player` - Core player component
|
|
- `PlayerRef` - Network connection reference
|
|
- `ChunkTracker` - Loaded chunks tracking
|
|
- `PlayerInput` - Input state
|
|
|
|
### Working with Components
|
|
|
|
```java
|
|
Store<EntityStore> store = world.getEntityStore().getStore();
|
|
|
|
// Get component
|
|
TransformComponent transform = store.getComponent(entityRef, TransformComponent.getComponentType());
|
|
|
|
// Add/Put component
|
|
store.addComponent(entityRef, ComponentType, component);
|
|
store.putComponent(entityRef, ComponentType, component); // Add or replace
|
|
|
|
// Remove component
|
|
store.removeComponent(entityRef, ComponentType);
|
|
|
|
// Create entity
|
|
Holder<EntityStore> holder = EntityStore.REGISTRY.newHolder();
|
|
holder.addComponent(TransformComponent.getComponentType(), new TransformComponent(pos, rot));
|
|
Ref<EntityStore> ref = store.addEntity(holder, AddReason.SPAWN);
|
|
```
|
|
|
|
---
|
|
|
|
## UI SYSTEM
|
|
|
|
### Page System Classes
|
|
|
|
| Class | Package |
|
|
|------------------------------|----------------------------------------------------------------------------|
|
|
| `CustomUIPage` | `com.hypixel.hytale.server.core.entity.entities.player.pages.CustomUIPage` |
|
|
| `BasicCustomUIPage` | Same package - no event data parsing |
|
|
| `InteractiveCustomUIPage<T>` | Same package - typed event handling |
|
|
| `PageManager` | Same package - page lifecycle |
|
|
| `UICommandBuilder` | `com.hypixel.hytale.server.core.ui.builder.UICommandBuilder` |
|
|
| `UIEventBuilder` | `com.hypixel.hytale.server.core.ui.builder.UIEventBuilder` |
|
|
|
|
### CustomPageLifetime
|
|
|
|
```java
|
|
CantClose(0) // Cannot be closed
|
|
CanDismiss(1) // ESC to close
|
|
CanDismissOrCloseThroughInteraction(2) // ESC or interaction
|
|
```
|
|
|
|
### UICommandBuilder Methods
|
|
|
|
```java
|
|
// Load documents
|
|
void append(String documentPath)
|
|
void append(String selector, String documentPath)
|
|
void appendInline(String selector, String xmlContent)
|
|
void insertBefore(String selector, String documentPath)
|
|
|
|
// Manipulate DOM
|
|
void clear(String selector)
|
|
void remove(String selector)
|
|
void set(String selector, String value)
|
|
void set(String selector, int value)
|
|
void set(String selector, float value)
|
|
void set(String selector, boolean value)
|
|
void set(String selector, Message value)
|
|
void set(String selector, Value<T> ref)
|
|
void setObject(String selector, Object data)
|
|
void set(String selector, T[] data)
|
|
void set(String selector, List<T> data)
|
|
```
|
|
|
|
### CustomUIEventBindingType
|
|
|
|
```java
|
|
Activating(0), RightClicking(1), DoubleClicking(2)
|
|
MouseEntered(3), MouseExited(4), ValueChanged(5)
|
|
ElementReordered(6), Validating(7), Dismissing(8)
|
|
FocusGained(9), FocusLost(10), KeyDown(11)
|
|
MouseButtonReleased(12), SlotClicking(13), SlotDoubleClicking(14)
|
|
SlotMouseEntered(15), SlotMouseExited(16), DragCancelled(17)
|
|
Dropped(18), SlotMouseDragCompleted(19), SlotMouseDragExited(20)
|
|
SlotClickReleaseWhileDragging(21), SlotClickPressWhileDragging(22)
|
|
SelectedTabChanged(23)
|
|
```
|
|
|
|
### UIEventBuilder Methods
|
|
|
|
```java
|
|
void addEventBinding(CustomUIEventBindingType type, String selector)
|
|
void addEventBinding(CustomUIEventBindingType type, String selector, boolean locksInterface)
|
|
void addEventBinding(CustomUIEventBindingType type, String selector, EventData data)
|
|
void addEventBinding(CustomUIEventBindingType type, String selector, EventData data, boolean locksInterface)
|
|
```
|
|
|
|
### EventData
|
|
|
|
```java
|
|
EventData.of("Key", "Value")
|
|
new EventData().append("Key", "Value").append("@ElementValue", "#Element.Property")
|
|
// @ prefix = extract value from element
|
|
```
|
|
|
|
### Value<T> References
|
|
|
|
```java
|
|
Value.of(directValue) // Direct value
|
|
Value.ref("Document.ui", "ValueName") // Reference from UI document
|
|
```
|
|
|
|
### Page Example
|
|
|
|
```java
|
|
public class MyPage extends InteractiveCustomUIPage<MyPage.Data> {
|
|
public MyPage(PlayerRef playerRef) {
|
|
super(playerRef, CustomPageLifetime.CanDismiss, Data.CODEC);
|
|
}
|
|
|
|
@Override
|
|
public void build(Ref<EntityStore> ref, UICommandBuilder cmd,
|
|
UIEventBuilder events, Store<EntityStore> store) {
|
|
cmd.append("Pages/MyPage.ui");
|
|
cmd.set("#Title.Text", "Hello");
|
|
events.addEventBinding(CustomUIEventBindingType.Activating, "#Button",
|
|
EventData.of("Action", "Click"));
|
|
}
|
|
|
|
@Override
|
|
public void handleDataEvent(Ref<EntityStore> ref, Store<EntityStore> store, Data data) {
|
|
if ("Click".equals(data.action)) { close(); }
|
|
}
|
|
|
|
public static class Data {
|
|
public static final BuilderCodec<Data> CODEC = BuilderCodec.builder(Data.class, Data::new)
|
|
.addField(new KeyedCodec<>("Action", Codec.STRING), (d,v) -> d.action = v, d -> d.action)
|
|
.build();
|
|
String action;
|
|
}
|
|
}
|
|
|
|
// Open page:
|
|
player.getPageManager().openCustomPage(ref, store, new MyPage(playerRef));
|
|
```
|
|
|
|
### Window System
|
|
|
|
| Class | Package |
|
|
|-------------------------------------------|------------------------------------------------------------------------|
|
|
| `Window` | `com.hypixel.hytale.server.core.entity.entities.player.windows.Window` |
|
|
| `WindowManager` | Same package |
|
|
| `ContainerWindow`, `CraftingWindow`, etc. | Same package |
|
|
|
|
### WindowType
|
|
|
|
```java
|
|
Container(0), PocketCrafting(1), BasicCrafting(2)
|
|
DiagramCrafting(3), StructuralCrafting(4), Processing(5), Memories(6)
|
|
```
|
|
|
|
---
|
|
|
|
## CODEC SYSTEM
|
|
|
|
### Core Classes (Package: `com.hypixel.hytale.codec`)
|
|
|
|
| Class | Description |
|
|
|-------------------|----------------------|
|
|
| `Codec<T>` | Base codec interface |
|
|
| `BuilderCodec<T>` | Builder-based codec |
|
|
| `KeyedCodec<T>` | Key-value codec |
|
|
|
|
### Primitive Codecs
|
|
|
|
```java
|
|
Codec.STRING, Codec.BOOLEAN, Codec.INTEGER, Codec.LONG
|
|
Codec.FLOAT, Codec.DOUBLE, Codec.BYTE_ARRAY
|
|
```
|
|
|
|
### Collection Codecs
|
|
|
|
```java
|
|
Codec.STRING.listOf() // List<String>
|
|
Codec.STRING.setOf() // Set<String>
|
|
Codec.mapOf(Codec.STRING, Codec.INTEGER) // Map<String, Integer>
|
|
Codec.arrayOf(Codec.STRING, String[]::new) // String[]
|
|
```
|
|
|
|
### BuilderCodec Pattern
|
|
|
|
```java
|
|
public static final BuilderCodec<MyClass> CODEC = BuilderCodec.of(MyClass::new)
|
|
.with("fieldName", Codec.STRING, c -> c.field) // Required
|
|
.with("fieldName", Codec.STRING, c -> c.field, "default") // With default
|
|
.withOptional("fieldName", Codec.STRING, c -> c.field) // Optional
|
|
.build();
|
|
```
|
|
|
|
### Codec Transformations
|
|
|
|
```java
|
|
Codec<UUID> UUID_CODEC = Codec.STRING.xmap(UUID::fromString, UUID::toString);
|
|
Codec<Integer> PORT = Codec.INTEGER.validate(p -> p > 0 && p < 65536, "Invalid port");
|
|
Codec<Float> VOLUME = Codec.FLOAT.clamp(0.0f, 1.0f);
|
|
Codec<MyEnum> ENUM = Codec.enumCodec(MyEnum.class);
|
|
```
|
|
|
|
---
|
|
|
|
## ASSET SYSTEM
|
|
|
|
### Core Classes
|
|
|
|
| Class | Package |
|
|
|---------------------|-------------------------------------------------------|
|
|
| `JsonAsset<K>` | `com.hypixel.hytale.assetstore.JsonAsset` |
|
|
| `AssetStore<K,T,M>` | `com.hypixel.hytale.assetstore.AssetStore` |
|
|
| `AssetRegistry` | `com.hypixel.hytale.server.core.plugin.AssetRegistry` |
|
|
|
|
### Key Asset Types (Package: `com.hypixel.hytale.server.core.asset.type`)
|
|
|
|
**Blocks:**
|
|
|
|
- `BlockType` - blocktype.config.BlockType
|
|
- `BlockSet` - blockset.config.BlockSet
|
|
- `BlockSoundSet` - blocksound.config.BlockSoundSet
|
|
|
|
**Items:**
|
|
|
|
- `Item` - item.config.Item
|
|
- `ItemCategory` - item.config.ItemCategory
|
|
- `CraftingRecipe` - item.config.CraftingRecipe
|
|
|
|
**Visual:**
|
|
|
|
- `ModelAsset` - model.config.ModelAsset
|
|
- `ParticleSystem` - particle.config.ParticleSystem
|
|
- `EntityEffect` - entityeffect.config.EntityEffect
|
|
|
|
**Audio:**
|
|
|
|
- `SoundEvent` - soundevent.config.SoundEvent
|
|
- `SoundSet` - soundset.config.SoundSet
|
|
|
|
**Environment:**
|
|
|
|
- `Environment` - environment.config.Environment
|
|
- `Weather` - weather.config.Weather
|
|
- `Fluid` - fluid.Fluid
|
|
|
|
**Gameplay:**
|
|
|
|
- `Projectile` - projectile.config.Projectile
|
|
- `GameplayConfig` - gameplay.GameplayConfig
|
|
|
|
### Asset JSON Structure Pattern
|
|
|
|
```json
|
|
{
|
|
"Id": "namespace:asset_id",
|
|
"Parent": "namespace:parent_id",
|
|
"Type": "ConcreteType",
|
|
...fields
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## WORLD MANAGEMENT
|
|
|
|
### Core Classes
|
|
|
|
| Class | Package |
|
|
|---------------|---------------------------------------------------------------------|
|
|
| `Universe` | `com.hypixel.hytale.server.core.universe.Universe` |
|
|
| `World` | `com.hypixel.hytale.server.core.universe.world.World` |
|
|
| `EntityStore` | `com.hypixel.hytale.server.core.universe.world.storage.EntityStore` |
|
|
| `ChunkStore` | `com.hypixel.hytale.server.core.universe.world.storage.ChunkStore` |
|
|
|
|
### Universe Access
|
|
|
|
```java
|
|
Universe universe = Universe.get();
|
|
Collection<World> worlds = universe.getWorlds();
|
|
World world = universe.getWorld("worldName");
|
|
Collection<Player> players = universe.getPlayers();
|
|
Player player = universe.getPlayer("name");
|
|
Player player = universe.getPlayer(uuid);
|
|
```
|
|
|
|
### World Access
|
|
|
|
```java
|
|
String name = world.getName();
|
|
EntityStore entityStore = world.getEntityStore();
|
|
Store<EntityStore> store = entityStore.getStore();
|
|
long tick = world.getTick();
|
|
boolean paused = world.isPaused();
|
|
```
|
|
|
|
---
|
|
|
|
## NPC/AI SYSTEM
|
|
|
|
### Core Classes (Package: `com.hypixel.hytale.server.npc`)
|
|
|
|
| Class | Description |
|
|
|---------------|--------------------------------------------|
|
|
| `NPCEntity` | entities.NPCEntity - NPC entity class |
|
|
| `Role` | role.Role - Behavior definition |
|
|
| `Instruction` | instructions.Instruction - Behavior action |
|
|
| `PathManager` | navigation.PathManager - Pathfinding |
|
|
|
|
### NPCEntity Key Methods
|
|
|
|
```java
|
|
Role getRole()
|
|
void setRole(Role role)
|
|
String getRoleName()
|
|
void setRoleName(String name)
|
|
PathManager getPathManager()
|
|
void playAnimation(...)
|
|
```
|
|
|
|
### Flock System (Package: `com.hypixel.hytale.server.flock`)
|
|
|
|
| Component | Description |
|
|
|-------------------|---------------------------|
|
|
| `Flock` | Flock leader/group |
|
|
| `FlockMembership` | Entity's flock membership |
|
|
|
|
---
|
|
|
|
## NETWORKING
|
|
|
|
### Packet System (Package: `com.hypixel.hytale.protocol`)
|
|
|
|
| Class | Description |
|
|
|------------------|--------------------------|
|
|
| `Packet` | Base packet interface |
|
|
| `PacketRegistry` | Packet type registration |
|
|
|
|
### Key Packet Categories (`protocol.packets.*`)
|
|
|
|
- `connection/` - Connect, disconnect, ping
|
|
- `auth/` - Authentication
|
|
- `player/` - Player state
|
|
- `entities/` - Entity sync
|
|
- `world/` - Chunk/block data
|
|
- `inventory/` - Inventory ops
|
|
- `interface_/` - UI packets
|
|
- `window/` - Window packets
|
|
|
|
### UI Packets
|
|
|
|
| Packet | ID | Direction |
|
|
|-------------------|-----|-----------|
|
|
| `SetPage` | 216 | S->C |
|
|
| `CustomHud` | 217 | S->C |
|
|
| `CustomPage` | 218 | S->C |
|
|
| `CustomPageEvent` | 219 | C->S |
|
|
|
|
### Window Packets
|
|
|
|
| Packet | ID | Direction |
|
|
|--------------------|-----|-----------|
|
|
| `OpenWindow` | 200 | S->C |
|
|
| `UpdateWindow` | 201 | S->C |
|
|
| `CloseWindow` | 202 | S->C |
|
|
| `ClientOpenWindow` | 203 | C->S |
|
|
| `SendWindowAction` | 204 | C->S |
|
|
|
|
---
|
|
|
|
## MATH UTILITIES (Package: `com.hypixel.hytale.math`)
|
|
|
|
### Vector Types
|
|
|
|
```java
|
|
Vector3d // 3D double precision
|
|
Vector3f // 3D float precision
|
|
Vector3i // 3D integer
|
|
Vector2d // 2D double
|
|
Vector2i // 2D integer
|
|
```
|
|
|
|
### Vector Operations
|
|
|
|
```java
|
|
Vector3d a = new Vector3d(x, y, z);
|
|
a.add(b), a.subtract(b), a.multiply(scalar)
|
|
a.dot(b), a.cross(b), a.length(), a.normalize()
|
|
a.distance(b)
|
|
```
|
|
|
|
### Shapes
|
|
|
|
```java
|
|
Box, Ellipsoid, Cylinder
|
|
Transform, Location
|
|
```
|
|
|
|
---
|
|
|
|
## COMMON UTILITIES (Package: `com.hypixel.hytale.common`)
|
|
|
|
### Utility Classes
|
|
|
|
```java
|
|
StringUtil, ArrayUtil, ListUtil, MapUtil
|
|
TimeUtil, FormatUtil, MathUtil, TrigMathUtil
|
|
Semver, SemverRange
|
|
WeightedMap<T> // Weighted random selection
|
|
```
|
|
|
|
---
|
|
|
|
## EARLY PLUGIN SYSTEM
|
|
|
|
### ClassTransformer Interface (Package: `com.hypixel.hytale.plugin.early`)
|
|
|
|
```java
|
|
public interface ClassTransformer {
|
|
int priority(); // Higher = loaded first
|
|
byte[] transform(String className, String transformedName, byte[] classBytes);
|
|
}
|
|
```
|
|
|
|
### Service Registration
|
|
|
|
Create `META-INF/services/com.hypixel.hytale.plugin.early.ClassTransformer` containing transformer class name.
|
|
|
|
Place JAR in `earlyplugins/` directory.
|
|
|
|
---
|
|
|
|
## COMPLETE COMPONENT LIST
|
|
|
|
### EntityStore Components (130+)
|
|
|
|
**Transform:** TransformComponent, HeadRotation, PositionDataComponent, EntityScaleComponent, RotateObjectComponent,
|
|
SnapshotBuffer
|
|
|
|
**Physics:** Velocity, PhysicsValues, BoundingBox, CollisionResultComponent, KnockbackComponent,
|
|
MovementStatesComponent, HitboxCollision, Repulsion
|
|
|
|
**Player:** Player, MovementManager, CameraManager, ChunkTracker, PlayerInput, PlayerSettings, PlayerSkinComponent,
|
|
PlayerRef
|
|
|
|
**NPC:** NPCEntity, ValueStore, StateEvaluator, StepComponent, Timers, FailedSpawnComponent
|
|
|
|
**Combat:** DamageDataComponent, DeathComponent, DeferredCorpseRemoval, CombatActionEvaluator, TargetMemory,
|
|
DamageMemory
|
|
|
|
**Visual:** ModelComponent, PersistentModel, PropComponent, DisplayNameComponent, ActiveAnimationComponent,
|
|
DynamicLight, Nameplate
|
|
|
|
**Audio:** AudioComponent, MovementAudioComponent
|
|
|
|
**Identity:** UUIDComponent, NetworkId, EntityViewer, Visible, PersistentRefCount
|
|
|
|
**State Flags:** Frozen, Intangible, Invulnerable, Interactable, RespondToHit, HiddenFromAdventurePlayers,
|
|
NewSpawnComponent, FromPrefab, FromWorldGen, DespawnComponent
|
|
|
|
**Teleport:** Teleport, PendingTeleport, TeleportHistory, WarpComponent
|
|
|
|
**Projectile:** ProjectileComponent, Projectile, PredictedProjectile
|
|
|
|
**Item:** ItemComponent, ItemPhysicsComponent, PickupItemComponent, PreventPickup, PreventItemMerging
|
|
|
|
**Mount:** MountedComponent, MountedByComponent, NPCMountComponent, MinecartComponent
|
|
|
|
**Deployable:** DeployableComponent, DeployableOwnerComponent, DeployableProjectileShooterComponent
|
|
|
|
**Spawning:** SpawnMarkerEntity, LocalSpawnController, LocalSpawnBeacon, SpawnSuppressionComponent
|
|
|
|
**Flock:** Flock, FlockMembership, PersistentFlockData
|
|
|
|
**Effects:** EffectControllerComponent
|
|
|
|
**Stats:** EntityStatMap
|
|
|
|
### ChunkStore Components (25+)
|
|
|
|
**Structure:** BlockChunk, BlockComponentChunk, EntityChunk, ChunkColumn, ChunkSection, BlockSection, FluidSection,
|
|
EnvironmentChunk
|
|
|
|
**Block State:** BlockState, RespawnBlock, LaunchPad, BlockMapMarker
|
|
|
|
**Physics:** BlockPhysics, BlockHealthChunk
|
|
|
|
**Farming:** FarmingBlock, FarmingBlockState, TilledSoilBlock, CoopBlock
|
|
|
|
**Instance:** InstanceBlock, ConfigurableInstanceBlock
|
|
|
|
**Portal:** PortalDevice
|
|
|
|
**Spawning:** BlockSpawner, ChunkSuppressionEntry, ChunkSpawnedNPCData, ChunkSpawnData
|