Skip to content

Releases: Program132/HL

V1.0.7 - Hytale Release 2026.17.01 : Fixs + Gradle

27 Jan 18:55

Choose a tag to compare

Full Changelog: V1.0.6...V1.0.7

A new update of Hytale is here! I fixed some commands and methods that got updated on server side.

Added gradle support ! You can now build using gradle from the main directory (which contains doc folder, HytaleLoader lib etc.) and run only one command:

gradlew build

V1.0.6 - Weather, Time, Web Requests and more!

21 Jan 17:40

Choose a tag to compare

Issues solved

New Features

Command System Update

Writing commands is now faster and cleaner with Automatic Argument Parsing!

  • @Arg Annotation: Automatically parse command arguments by annotating method parameters.
  • Supported Types: Strings, Integers, Floats, Booleans.
  • Optional Arguments: Easily mark arguments as optional.

Weather & Time API

Take full control of your world's atmosphere!

  • Weather Control: World.setWeather(), WeatherType enum.
  • Time Management: World.setTime(), World.isDay(), World.getTimeHour().
  • Presets: Use Time enum for presets like DAWN, NOON, etc.

Sound & Particles

Immerse your players with new audiovisual capabilities.

  • Sound API: Play sounds to specific players or at world locations (Player.playSound, World.playSound).
  • Particle API: Spawn particles to create stunning visual effects (Player.playParticle, World.playParticle).

ChatColor API

  • Minecraft-style Colors: Full support for & and § color codes.
  • Utilities: ChatColor.colorize() and Player.sendColoredMessage() for easy text formatting.

WebRequest API

  • HTTP Methods: Full support for GET, POST, PUT, DELETE.
  • Async Support: Perform non-blocking web requests with ease.

Happy Coding with HytaleLoader! 💜

V1.0.5 - Entity, Block, MySQL, and more!

19 Jan 14:00

Choose a tag to compare

I'm pleased to announce the release of HytaleLoader 1.0.5. This major update provides essential tools for creating complex and interactive mods.

Issues Solved

News / Features

User Interface System (Custom UI)

Create custom menus and interfaces in Hytale.

  • CustomUI: Create menus without interaction (basic UIs).
  • InteractiveUI: Create menus with clickable buttons and handle events directly in Java (abstracting away codec complexity).
  • Full Management: Open and close player UIs easily with player.openInteractiveUI() and player.closeCustomUI().

Database Support (MySQL & Redis)

Connect your mods to persistent data seamlessly.

  • MySQL API: Complete client with connection pooling (HikariCP), prepared statements, transactions, and secure asynchronous support.
  • Redis API: High-performance client (Jedis) for caching, chat systems, or fast synchronization (supporting String, Hash, List, Set operations).

World & Entity Manipulation

Interaction with the world is now more intuitive.

  • Spawning: Spawn any entity using world.spawnEntity(location, "Type").
  • Entities: Retrieve entities by ID or UUID. The Player class now extends Entity.
  • Blocks: New object-oriented Block API for more natural block manipulation (block.setType(), block.getLocation()).

Documentation

Comprehensive documentation pages are available for all these features (ui_api.md, mysql_api.md, redis_api.md).


Happy Coding with HytaleLoader! 💜

V1.0.4: Server API, World + Location tools, and more!

18 Jan 17:41

Choose a tag to compare

I'm excited to announce the release of HytaleLoader v1.0.4! This major update brings essential tools for plugin development, focusing on Server management, Configuration flexibility, and World interaction.

Issues Completed

News / Features

Server API

Access server-wide data effortlessly with the new static Server utility class.

  • Player Management: Find players by UUID/Name, get list of online players.
  • Broadcasting: Send global messages or filter by permission with Server.broadcastPermission().
  • World Access: Retrieve loaded worlds and the default world easily.

Flexible Configuration System

We have completely refactored the configuration system to support both YAML and JSON!

  • Dual Support: Plugins can now choose their preferred format (ConfigFormat.YAML or ConfigFormat.JSON).
  • Seamless Integration: Simply override getConfigFormat() in your plugin main class.
  • Robust API: Type-safe getters (getString, getInt, etc.), default values, and nested sections support.
  • Gson Powered: JSON handling is powered by Google Gson for reliability.

Location & World API

A standardized way to handle positions in the Hytale universe.

  • Location Class: Encapsulates World, positions (x,y,z) and rotation (yaw,pitch).
  • Math Helpers: Distance calculations (distance(), distanceSquared()) and utilities.
  • World Wrapper: Safe wrapper around native Hytale world objects.

Player API

  • Teleportation: player.teleport(location)
  • Get position & rotation of the Player: player.getLocation(), player.getPositionX(), player.getPositionY(), player.getPositionZ(), player.getYaw(), player.getPitch()

Installation

Update your pom.xml to use the new version:

<dependency>
    <groupId>fr.hytale.loader</groupId>
    <artifactId>HytaleLoader</artifactId>
    <version>1.0.4</version>
    <scope>provided</scope>
</dependency>

Documentation

Check out the fully updated guides in the doc/ folder:


Happy Coding with HytaleLoader! 💜

V1.0.3 - Player Stats & Scheduler Release and more :)

17 Jan 14:18

Choose a tag to compare


News

Player Stats API

Access and modify player statistics with a thread-safe API:

// Get stats
float health = player.getHealth();
float stamina = player.getStamina();
float mana = player.getMana();

// Set stats
player.setHealth(20.0f);
player.setStamina(100.0f);
player.setMana(50.0f);

Available Stats:

  • ❤️ Health - getHealth() / setHealth(float)
  • Stamina - getStamina() / setStamina(float)
  • 💨 Oxygen - getOxygen() / setOxygen(float)
  • 🔮 Mana - getMana() / setMana(float)
  • Signature Energy - getSignatureEnergy() / setSignatureEnergy(float)
  • 🔫 Ammo - getAmmo() / setAmmo(float)

Scheduler System

Execute tasks with precise timing control:

Scheduler scheduler = getScheduler();

// Immediate execution
scheduler.runTask(() -> {
    player.sendMessage("Immediate!");
});

// Delayed execution
scheduler.runTaskLater(() -> {
    player.sendMessage("5 seconds later!");
}, 5000);

// Repeating tasks
ScheduledTask task = scheduler.runTaskTimer(() -> {
    player.sendMessage("Every 2 seconds!");
}, 0, 2000);

Permission System

Hierarchical permission management with wildcards:

// Add/remove permissions
player.addPermission("myplugin.admin");
player.removePermission("myplugin.user");

// Check permissions
if (player.hasPermission("myplugin.heal")) {
    player.setHealth(100);
}

// Get all permissions
Set<Permission> perms = player.getPermissions();

Command Utilities

Helper methods for command development:

@Command(name = "heal")
public void onHeal(CommandContext ctx) {
    // Check if sender is a player
    if (CommandUtils.isPlayer(ctx)) {
        Player player = CommandUtils.getPlayer(ctx);
        player.setHealth(100);
        player.sendMessage("§aHealed!");
    }
    
    // Get PlayerRef
    PlayerRef ref = CommandUtils.getPlayerRef(ctx);
}

Utilities:

  • isPlayer(CommandContext) - Check if sender is player
  • getPlayer(CommandContext) - Get Player wrapper
  • getPlayerRef(CommandContext) - Get native PlayerRef

Documentation

New Guides:


Usage Examples

Example 1: Health-Based Ability

@Command(name = "fireball", permission = "magic.fireball")
public void onFireball(CommandContext ctx) {
    if (CommandUtils.isPlayer(ctx)) {
        Player player = CommandUtils.getPlayer(ctx);
        
        float mana = player.getMana();
        if (mana >= 20) {
            player.setMana(mana - 20);
            player.sendMessage("§6Fireball cast! Mana: " + (mana - 20));
        } else {
            player.sendMessage("§cNot enough mana! Need 20");
        }
    }
}

Example 2: Regeneration System

@Override
public void onEnable() {
    // Regenerate health every 5 seconds
    getScheduler().runTaskTimer(() -> {
        for (Player player : getOnlinePlayers()) {
            float health = player.getHealth();
            if (health < 20) {
                player.setHealth(Math.min(health + 1, 20));
            }
        }
    }, 5000, 5000);
}

Example 3: Permission-Based Stats

@EventHandler
public void onJoin(PlayerJoinEvent event) {
    Player player = event.getPlayer();
    
    // VIP players start with extra health
    if (player.hasPermission("vip.extrahealth")) {
        getScheduler().runTaskLater(() -> {
            player.setHealth(120);
            player.sendMessage("§6VIP bonus: +20 HP!");
        }, 1000);
    }
}

📖 Full Documentation

Visit the documentation for:

  • Getting Started Guide
  • API References
  • Event System
  • Command System
  • Best Practices

Credits

Special thanks to:

  • The Hytale community
  • ReviveMe plugin for inspiration on thread-safe stat access

🔗 Links


Made with ❤️ for the Hytale modding community

V1.0.2 - GameMode + Player (API), New events

16 Jan 18:05

Choose a tag to compare

📦 New Features / Fixes

Player API:

New methods:

  • sendTitle: send at the top of the player screen a title (1 string required as argument)
  • sendTitleWithSubtitle: send at the top of the player screen a title and a subtitle (2 string required as argument)

Example:

Player p = event.getPlayer();
p.sendTitle("Welcome to Hytale");

New Player Events

  • PlayerMouseButtonEvent: Fire when using your left/right click
  • PlayerMouseMotionEvent: Fired when moving your mouse

New ECS Event

  • SwitchActiveSlotEvent - Fired when switchting two items in the inventory

Fixed ECS Events

These events are located in fr.hytale.loader.event.types.ecs.

  • BreakBlockEvent - Fired when a block is broken.
  • PlaceBlockEvent - Fired when a block is placed.
  • UseBlockEvent - Fired when a player interacts with a block (right-click).
  • DamageBlockEvent - Fired when a block takes damage (mining progress).
  • DropItemEvent - Fired when an item is dropped from inventory.
  • DiscoverZoneEvent - Fired when a player discovers a new zone.
  • CraftRecipeEvent - Fired when a recipe is crafted (Replacement for PlayerCraftEvent).

GameMode API

Added fr.hytale.loader.api.GameMode enum to handle player game modes.

  • CREATIVE (ID: 0) - Unlimited resources, no damage.
  • ADVENTURE (ID: 1) - Default survival-like mode.

Includes helper methods:

  • toNative() - Convert to Hytale internal GameMode.
  • fromNative() - Convert from Hytale internal GameMode.
  • fromId(int id) - Get GameMode by ID.

Event Examples

Block Interaction:

@EventHandler
public void onBreakBlock(BreakBlockEvent event) {
    // Log the block ID and location
    System.out.println("Block broken: " + event.getBlockType().getId() + " at " + event.getTargetBlock());
}

Item Drop:

@EventHandler
public void onDropItem(DropItemEvent event) {
    // Check what item is being dropped
    System.out.println("Dropped: " + event.getItemStack().getItem().getId());
    event.setCancelled(true); // Prevent dropping
}

Javadoc

The javadoc is published on the gh-pages branch.
Link: https://program132.github.io/HL/

V1.0.1 - Inventory + Item (API) & New events

15 Jan 19:44

Choose a tag to compare

🎮 Hytale Loader (HL)

📦 New Features

🎒 API: Inventory & Item

Complete overhaul of inventory management:

  • Item Wrapper: Simplified creation (new Item("ID", qty)).
  • Inventory Management: addItem, setItem, clear, getItem.
  • Smart Slot Handling: Automatically handles Hotbar vs Storage.
// Example: Give items on join
@EventHandler
public void onJoin(PlayerJoinEvent event) {
    Inventory inv = event.getPlayer().getInventory();
    inv.clear(); // Safe clear
    inv.addItem(new Item("Weapon_Sword_Cobalt", 1));
    inv.setItem(new Item("Consumable_Apple", 5), 0); // Set in hotbar slot 0
}

🌍 New ECS Events (World Interactions)

We added support for Entity Component System (ECS) events to handle world interactions. These events are located in fr.hytale.loader.event.types.ecs.

  • BreakBlockEvent - Fired when a block is broken.
  • PlaceBlockEvent - Fired when a block is placed.
  • UseBlockEvent - Fired when a player interacts with a block (right-click).
  • DamageBlockEvent - Fired when a block takes damage (mining progress).
  • DropItemEvent - Fired when an item is dropped from inventory.
  • DiscoverZoneEvent - Fired when a player discovers a new zone.
  • CraftRecipeEvent - Fired when a recipe is crafted (Replacement for PlayerCraftEvent).

Event Examples

Block Interaction:

@EventHandler
public void onBreakBlock(BreakBlockEvent event) {
    // Log the block ID and location
    System.out.println("Block broken: " + event.getBlockType().getId() + " at " + event.getTargetBlock());
}

Item Drop:

@EventHandler
public void onDropItem(DropItemEvent event) {
    // Check what item is being dropped
    System.out.println("Dropped: " + event.getItemStack().getItem().getId());
    event.setCancelled(true); // Prevent dropping
}

⚠️ Deprecations

  • PlayerCraftEvent (fr.hytale.loader.event.types.player) is now deprecated. Please migrate to CraftRecipeEvent (fr.hytale.loader.event.types.ecs) for better stability and compatibility with the native ECS system.

V1.0.0 : Hytale Loader - Basic Events + Commands !

15 Jan 13:16

Choose a tag to compare

🎮 Hytale Loader (HL)

📦 Features

Events

  • PlayerJoin - Player joins the server
  • PlayerQuit - Player leaves the server
  • PlayerCraft - Player crafts an item/block
  • PlayerDamage - Player takes damage
  • PlayerChat - Player sends a message

⚡ Commands System

Create your own commands with ease:

  • Custom name & description
  • Aliases support
  • Permission management
  • Built-in registration

All events are in the fr.hytale.loader.event.types package.

PlayerJoinEvent

@EventHandler
public void onJoin(PlayerJoinEvent event) {
    Player player = event.getPlayer();
    String name = event.getPlayerName();
}

PlayerQuitEvent

@EventHandler
public void onQuit(PlayerQuitEvent event) {
    Player player = event.getPlayer();
    String name = event.getPlayerName();
}

PlayerChatEvent

@EventHandler
public void onChat(PlayerChatEvent event) {
    String message = event.getMessage();
    event.setMessage("Modified message");
    event.setCancelled(true); // Cancel the message
}

PlayerDamageEvent

@EventHandler
public void onDamage(PlayerDamageEvent event) {
    Player player = event.getPlayer();
    Damage damage = event.getDamage();
    float amount = damage.getAmount();
}

PlayerCraftEvent

@EventHandler
public void onCraft(PlayerCraftEvent event) {
    String recipeName = event.getRecipeName();
    int quantity = event.getQuantity();
    Player player = event.getPlayer();
}

Commands

Use the @Command annotation to register commands:

@Command(
    name = "mycommand",
    description = "My custom command",
    aliases = {"mc", "cmd"},
    permission = "myplugin.command.use"
)
public void onMyCommand(CommandContext ctx) {
    ctx.sender().sendMessage(Message.raw("Command executed!"));
}