Skip to content

Releases: Program132/HL

V1.0.7 - Hytale Release 2026.17.01 : Fixs + Gradle

Choose a tag to compare

@Program132 Program132 released this 27 Jan 18:55

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!

Choose a tag to compare

@Program132 Program132 released this 21 Jan 17:40

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!

Choose a tag to compare

@Program132 Program132 released this 19 Jan 14:00

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!

Choose a tag to compare

@Program132 Program132 released this 18 Jan 17:41

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 :)

Choose a tag to compare

@Program132 Program132 released this 17 Jan 14:18

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

Choose a tag to compare

@Program132 Program132 released this 16 Jan 18:05

📦 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

Choose a tag to compare

@Program132 Program132 released this 15 Jan 19:44

🎮 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 !

Choose a tag to compare

@Program132 Program132 released this 15 Jan 13:16

🎮 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!"));
}