Overview
Modules are the primary way to add functionality to LiquidBounce. Script modules integrate seamlessly with built-in modules and appear in the ClickGUI, can be bound to keys, and respond to events.
Basic Module Structure
Use script.registerModule() to create a new module:
var script = registerScript ({
name: "MyScript" ,
version: "1.0.0" ,
authors: [ "Developer" ]
});
script . registerModule ({
name: "ExampleModule" ,
category: "Movement"
}, function ( module ) {
// Module logic here
});
Module Configuration
The first parameter to registerModule() is a configuration object:
The display name of the module
Module category. Available categories:
Combat
Movement
Player
World
Render
Client
Exploit
Fun
Misc
Optional description shown in the ClickGUI
Optional tag displayed next to the module name in the ArrayList
Module Settings
Add configurable settings to your module using the Setting object:
script . registerModule ({
name: "SpeedModule" ,
category: "Movement" ,
description: "Increases movement speed" ,
settings: {
speed: Setting . float ({
name: "Speed" ,
default: 1.5 ,
range: [ 0.1 , 5.0 ],
suffix: "x"
}),
jumpBoost: Setting . boolean ({
name: "JumpBoost" ,
default: true
})
}
}, function ( module ) {
// Access settings
var speedValue = module . settings . speed . get ();
var jumpBoostEnabled = module . settings . jumpBoost . get ();
});
Available Setting Types
Boolean
Integer
Float
Range (Int)
Range (Float)
Text
Choice
Multi-Choice
Keybind
Setting . boolean ({
name: "Enabled" ,
default: true
})
Setting . int ({
name: "Delay" ,
default: 100 ,
range: [ 0 , 1000 ],
suffix: "ms"
})
Setting . float ({
name: "Speed" ,
default: 1.5 ,
range: [ 0.1 , 5.0 ],
suffix: "x"
})
Setting . intRange ({
name: "MinMax" ,
default: [ 10 , 20 ],
range: [ 0 , 100 ],
suffix: "blocks"
})
Setting . floatRange ({
name: "Distance" ,
default: [ 3.0 , 6.0 ],
range: [ 1.0 , 10.0 ],
suffix: "m"
})
Setting . text ({
name: "Message" ,
default: "Hello World"
})
Setting . choose ({
name: "Mode" ,
default: "Legit" ,
choices: [ "Legit" , "Aggressive" , "Bypass" ]
})
Setting . multiChoose ({
name: "Targets" ,
default: [ "Players" , "Mobs" ],
choices: [ "Players" , "Mobs" , "Animals" ],
canBeNone: false
})
Setting . key ({
name: "BindKey" ,
default: "KEY_R"
})
Module Event Handlers
Handle events within your module using module.on():
script . registerModule ({
name: "ChatLogger" ,
category: "Misc"
}, function ( module ) {
module . on ( "enable" , function () {
Client . displayChatMessage ( "§aChatLogger enabled!" );
});
module . on ( "disable" , function () {
Client . displayChatMessage ( "§cChatLogger disabled!" );
});
module . on ( "chatReceive" , function ( event ) {
var message = event . getMessage ();
Client . displayChatMessage ( "§7[LOG] " + message );
});
});
Lifecycle Events
Called when the module is enabled
Called when the module is disabled
Complete Module Example
Here’s a fully-featured module that demonstrates various features:
var script = registerScript ({
name: "AutoSprint" ,
version: "1.0.0" ,
authors: [ "Developer" ]
});
script . registerModule ({
name: "AutoSprint" ,
category: "Movement" ,
description: "Automatically sprints when moving" ,
settings: {
mode: Setting . choose ({
name: "Mode" ,
default: "Legit" ,
choices: [ "Legit" , "Omni" ]
}),
hungerCheck: Setting . boolean ({
name: "CheckHunger" ,
default: true
}),
minHunger: Setting . int ({
name: "MinHunger" ,
default: 6 ,
range: [ 0 , 20 ]
})
}
}, function ( module ) {
module . on ( "enable" , function () {
Client . displayChatMessage ( "§a[AutoSprint] Enabled" );
});
module . on ( "disable" , function () {
if ( mc . player ) {
mc . player . setSprinting ( false );
}
Client . displayChatMessage ( "§c[AutoSprint] Disabled" );
});
module . on ( "playerTick" , function ( event ) {
var player = mc . player ;
if ( ! player ) return ;
var mode = module . settings . mode . get ();
var checkHunger = module . settings . hungerCheck . get ();
var minHunger = module . settings . minHunger . get ();
// Check hunger if enabled
if ( checkHunger && player . getFoodData (). getFoodLevel () < minHunger ) {
player . setSprinting ( false );
return ;
}
// Legit mode: only sprint when moving forward
if ( mode === "Legit" ) {
var movingForward = player . input . getMoveVector (). z > 0 ;
if ( movingForward ) {
player . setSprinting ( true );
}
}
// Omni mode: sprint in any direction
else if ( mode === "Omni" ) {
var moving = player . input . getMoveVector (). lengthSquared () > 0 ;
if ( moving ) {
player . setSprinting ( true );
}
}
});
// Update tag with current mode
var currentMode = module . settings . mode . get ();
module . tag = currentMode ;
});
Accessing Module Instance
The module instance passed to the callback provides several useful members:
Access to all module settings via module.settings.settingName.get()
Set or get the module tag: module.tag = "Value"
The module’s name (read-only)
Check or set module state: module.enabled = true
Register event handlers: module.on("eventName", handler)
Advanced Features
Update the module’s ArrayList tag dynamically:
module . on ( "playerTick" , function () {
var speed = mc . player . getDeltaMovement (). horizontalDistance () * 20 ;
module . tag = speed . toFixed ( 2 ) + " b/s" ;
});
Accessing Other Modules
You can interact with other modules:
var killAura = Client . moduleManager . getModule ( "KillAura" );
if ( killAura && killAura . enabled ) {
// KillAura is enabled
}
Best Practices
Always reset state when the module is disabled: module . on ( "disable" , function () {
mc . player . setSprinting ( false );
// Reset any modified game state
});
Always check if player/world exists before accessing: var player = mc . player ;
if ( ! player ) return ;
Choose the right event for your needs:
playerTick for frequent updates
gameTick for game logic
Specific events like packet for network operations
Performance considerations
Next Steps
Working with Events Learn about all available events
API Reference Explore utility functions and APIs