Introduction
Modules are the core feature type in LiquidBounce. Scripts can create custom modules that appear in the ClickGUI and can be toggled on/off just like built-in modules.Basic Module
Here’s a simple module that sends a message when enabled:SimpleModule.js
Module Properties
When registering a module, provide these properties:Categories
Available module categories:"Combat"- Combat-related modules"Movement"- Movement modules"Player"- Player-related modules"World"- World interaction modules"Render"- Visual/rendering modules"Client"- Client-side modules"Misc"- Miscellaneous modules"Fun"- Fun/troll modules
Module Settings
Add configurable settings to your module:SettingsExample.js
Setting Types
See the API Reference for all available setting types:Setting.boolean()- True/false toggleSetting.int()- Integer with rangeSetting.float()- Decimal number with rangeSetting.intRange()- Range of integers (min-max)Setting.floatRange()- Range of floats (min-max)Setting.text()- Text inputSetting.textArray()- Array of text valuesSetting.choose()- Single choice from optionsSetting.multiChoose()- Multiple choicesSetting.key()- Keybinding
Event Handlers
Modules can listen to various game events:EventModule.js
Common Events
Player Events:playerTick- Every player tick (20 times per second)playerMove- When player movesplayerJump- When player jumpshealthUpdate- When health changesdeath- When player dies
packetSend- Before sending a packetpacketReceive- After receiving a packet
gameRender- During game renderingworldRender- During world renderingoverlayRender- During HUD/overlay rendering
blockBreak- When breaking a blockblockPlace- When placing a block
Dynamic Module Tag
Update the module’s tag dynamically (shown in ArrayList):Complete Module Example
Here’s a complete combat module:CustomKillAura.js
Best Practices
- Always check for null -
mc.playerandmc.levelcan be null - Clean up on disable - Reset variables in the
disableevent - Use efficient algorithms - Avoid expensive operations in
playerTick - Handle errors - Wrap risky code in try-catch blocks
- Meaningful tags - Update
module.tagto show useful info - Reasonable defaults - Choose sensible default values for settings
Advanced: Module Modes
For complex modules, you can register sub-modes. See the source code reference inscript/bindings/features/ScriptMode.kt for details on using registerMode().
Next Steps
- Custom Commands - Create custom commands
- Examples - See more complete examples
- API Reference - Full API documentation