Releases: Program132/HL
V1.0.7 - Hytale Release 2026.17.01 : Fixs + Gradle
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!
Issues solved
- V1.0.6 - ChatColor
- V1.0.6 - HTTP & HTTPS Class
- V1.0.6 - Sounds
- V1.0.6 - Weather & Time
- V1.0.6 - Particles
- V1.0.6 - Commands with arguments
New Features
Command System Update
Writing commands is now faster and cleaner with Automatic Argument Parsing!
@ArgAnnotation: 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(),WeatherTypeenum. - Time Management:
World.setTime(),World.isDay(),World.getTimeHour(). - Presets: Use
Timeenum for presets likeDAWN,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()andPlayer.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!
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
- V1.0.5 - Block API
- V1.0.5 - Entity API
- V1.0.5 - Data Storage / Persistence API
- V1.0.5 - Inventory GUI / Custom UIs
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()andplayer.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
Playerclass now extendsEntity. - Blocks: New object-oriented
BlockAPI 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!
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.YAMLorConfigFormat.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.
LocationClass: 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 :)
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 playergetPlayer(CommandContext)- Get Player wrappergetPlayerRef(CommandContext)- Get native PlayerRef
Documentation
New Guides:
- Player Stats API - Complete stats management guide
- Scheduler API - Task scheduling documentation
- Permission API - Permission system guide
- Command Utils - Command utilities reference
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
📦 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 clickPlayerMouseMotionEvent: 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
🎮 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 toCraftRecipeEvent(fr.hytale.loader.event.types.ecs) for better stability and compatibility with the native ECS system.
V1.0.0 : Hytale Loader - Basic Events + Commands !
🎮 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!"));
}