Skip to main content

Hello World

The simplest possible script:
registerScript({
    name: "HelloWorld",
    version: "1.0.0",
    authors: ["YourName"]
});

Client.displayChatMessage("Hello from LiquidBounce scripting!");

Speed Counter Module

A simple module that displays your current speed:
SpeedCounter.js
registerScript({
    name: "SpeedCounter",
    version: "1.0.0",
    authors: ["YourName"]
});

registerModule({
    name: "SpeedCounter",
    category: "Render",
    description: "Displays your current speed in the ArrayList",
    tag: "0.00"
}, (module) => {
    module.on("playerTick", () => {
        if (mc.player === null) return;
        
        const speed = MovementUtil.getSpeed();
        module.tag = speed.toFixed(2);
    });
});

Auto Sprint Module

Automatically sprint when moving forward:
AutoSprint.js
registerScript({
    name: "AutoSprint",
    version: "1.0.0",
    authors: ["YourName"]
});

registerModule({
    name: "AutoSprint",
    category: "Movement",
    description: "Automatically sprint when moving",
    settings: {
        allDirections: Setting.boolean({
            name: "AllDirections",
            default: false
        })
    }
}, (module) => {
    module.on("playerTick", () => {
        const player = mc.player;
        if (player === null) return;
        
        const allDirections = module.settings.allDirections.value;
        const moving = MovementUtil.isMoving();
        
        if (allDirections) {
            // Sprint in all directions
            if (moving) {
                player.setSprinting(true);
            }
        } else {
            // Only sprint when moving forward
            if (moving && mc.options.keyUp.isDown()) {
                player.setSprinting(true);
            }
        }
    });
});

Health Warning Module

Warns you when health is low:
HealthWarning.js
registerScript({
    name: "HealthWarning",
    version: "1.0.0",
    authors: ["YourName"]
});

registerModule({
    name: "HealthWarning",
    category: "Player",
    description: "Warns when health is low",
    settings: {
        threshold: Setting.float({
            name: "Threshold",
            default: 10.0,
            range: [1.0, 20.0],
            suffix: " HP"
        }),
        sound: Setting.boolean({
            name: "PlaySound",
            default: true
        })
    }
}, (module) => {
    let wasLowHealth = false;
    
    module.on("healthUpdate", (event) => {
        const threshold = module.settings.threshold.value;
        const playSound = module.settings.sound.value;
        const health = event.health;
        
        const isLowHealth = health <= threshold;
        
        // Only warn when health first drops below threshold
        if (isLowHealth && !wasLowHealth) {
            Client.displayChatMessage(
                "§c[WARNING] Low Health: " + health.toFixed(1) + " HP"
            );
            
            if (playSound && mc.player !== null) {
                // Play warning sound
                mc.player.playSound(
                    Java.type("net.minecraft.sounds.SoundEvents").ANVIL_LAND,
                    1.0,
                    1.0
                );
            }
        }
        
        wasLowHealth = isLowHealth;
    });
    
    module.on("disable", () => {
        wasLowHealth = false;
    });
});

Anti-AFK Module

Prevents being kicked for AFK:
AntiAFK.js
registerScript({
    name: "AntiAFK",
    version: "1.0.0",
    authors: ["YourName"]
});

registerModule({
    name: "AntiAFK",
    category: "Player",
    description: "Prevents AFK kicks",
    settings: {
        mode: Setting.choose({
            name: "Mode",
            choices: ["Rotate", "Jump", "Sneak"],
            default: "Rotate"
        }),
        delay: Setting.int({
            name: "Delay",
            default: 100,
            range: [20, 400],
            suffix: " ticks"
        })
    }
}, (module) => {
    let tickCounter = 0;
    let rotationDirection = 1;
    
    module.on("playerTick", () => {
        const player = mc.player;
        if (player === null) return;
        
        const mode = module.settings.mode.value;
        const delay = module.settings.delay.value;
        
        tickCounter++;
        
        if (tickCounter >= delay) {
            tickCounter = 0;
            
            switch (mode) {
                case "Rotate":
                    const currentYaw = player.getYRot();
                    player.setYRot(currentYaw + (5 * rotationDirection));
                    rotationDirection *= -1;
                    break;
                    
                case "Jump":
                    if (player.onGround()) {
                        player.jumpFromGround();
                    }
                    break;
                    
                case "Sneak":
                    player.setShiftKeyDown(!player.isShiftKeyDown());
                    break;
            }
        }
    });
    
    module.on("disable", () => {
        tickCounter = 0;
        rotationDirection = 1;
        
        if (mc.player !== null && module.settings.mode.value === "Sneak") {
            mc.player.setShiftKeyDown(false);
        }
    });
});

Module Toggle Command

Command to quickly toggle modules:
ToggleCommand.js
registerScript({
    name: "ToggleCommand",
    version: "1.0.0",
    authors: ["YourName"]
});

registerCommand({
    name: "toggle",
    aliases: ["t"],
    parameters: [
        {
            name: "module",
            required: true,
            getCompletions: (begin, args) => {
                const suggestions = [];
                const modules = Client.moduleManager.modules;
                
                modules.forEach((module) => {
                    const name = module.name;
                    if (name.toLowerCase().startsWith(begin.toLowerCase())) {
                        suggestions.push(name);
                    }
                });
                
                return suggestions;
            }
        }
    ],
    onExecute: (moduleName) => {
        const module = Client.moduleManager.getModule(moduleName);
        
        if (module === null) {
            Client.displayChatMessage("§cModule not found: " + moduleName);
            return;
        }
        
        module.enabled = !module.enabled;
        
        const status = module.enabled ? "§aenabled" : "§cdisabled";
        Client.displayChatMessage(module.name + " " + status);
    }
});

Waypoint Command

Save and teleport to waypoints:
Waypoints.js
registerScript({
    name: "Waypoints",
    version: "1.0.0",
    authors: ["YourName"]
});

const waypoints = {};

registerCommand({
    name: "waypoint",
    aliases: ["wp"],
    hub: true,
    subcommands: [
        {
            name: "add",
            parameters: [
                {
                    name: "name",
                    required: true
                }
            ],
            onExecute: (name) => {
                const player = mc.player;
                if (player === null) {
                    Client.displayChatMessage("§cNot in game!");
                    return;
                }
                
                const pos = player.blockPosition();
                waypoints[name] = {
                    x: pos.getX(),
                    y: pos.getY(),
                    z: pos.getZ()
                };
                
                Client.displayChatMessage(
                    "§aWaypoint '" + name + "' saved at " +
                    pos.getX() + ", " + pos.getY() + ", " + pos.getZ()
                );
            }
        },
        {
            name: "remove",
            parameters: [
                {
                    name: "name",
                    required: true,
                    getCompletions: (begin, args) => {
                        return Object.keys(waypoints);
                    }
                }
            ],
            onExecute: (name) => {
                if (waypoints[name]) {
                    delete waypoints[name];
                    Client.displayChatMessage("§aWaypoint '" + name + "' removed");
                } else {
                    Client.displayChatMessage("§cWaypoint not found: " + name);
                }
            }
        },
        {
            name: "list",
            onExecute: () => {
                const names = Object.keys(waypoints);
                
                if (names.length === 0) {
                    Client.displayChatMessage("§cNo waypoints saved");
                    return;
                }
                
                Client.displayChatMessage("§aWaypoints:");
                names.forEach((name) => {
                    const wp = waypoints[name];
                    Client.displayChatMessage(
                        "  " + name + ": " + wp.x + ", " + wp.y + ", " + wp.z
                    );
                });
            }
        },
        {
            name: "goto",
            parameters: [
                {
                    name: "name",
                    required: true,
                    getCompletions: (begin, args) => {
                        return Object.keys(waypoints);
                    }
                }
            ],
            onExecute: (name) => {
                const wp = waypoints[name];
                
                if (!wp) {
                    Client.displayChatMessage("§cWaypoint not found: " + name);
                    return;
                }
                
                const player = mc.player;
                if (player === null) {
                    Client.displayChatMessage("§cNot in game!");
                    return;
                }
                
                const distance = Math.sqrt(
                    Math.pow(wp.x - player.getX(), 2) +
                    Math.pow(wp.y - player.getY(), 2) +
                    Math.pow(wp.z - player.getZ(), 2)
                );
                
                Client.displayChatMessage(
                    "§aWaypoint '" + name + "' is " +
                    distance.toFixed(1) + " blocks away"
                );
            }
        }
    ]
});

Custom KillAura with Rotations

A complete combat module:
CustomKillAura.js
registerScript({
    name: "CustomKillAura",
    version: "2.0.0",
    authors: ["YourName"]
});

registerModule({
    name: "CustomKillAura",
    category: "Combat",
    description: "Advanced KillAura with rotation support",
    settings: {
        range: Setting.float({
            name: "Range",
            default: 4.2,
            range: [1.0, 6.0],
            suffix: " blocks"
        }),
        delay: Setting.intRange({
            name: "Delay",
            default: [50, 100],
            range: [0, 500],
            suffix: "ms"
        }),
        targetPlayers: Setting.boolean({
            name: "TargetPlayers",
            default: true
        }),
        targetMobs: Setting.boolean({
            name: "TargetMobs",
            default: false
        }),
        targetAnimals: Setting.boolean({
            name: "TargetAnimals",
            default: false
        }),
        rotations: Setting.boolean({
            name: "Rotations",
            default: true
        }),
        raytraced: Setting.boolean({
            name: "RaytracedRotations",
            default: false
        }),
        autoBlock: Setting.boolean({
            name: "AutoBlock",
            default: false
        })
    }
}, (module) => {
    let lastAttack = 0;
    let currentTarget = null;
    
    module.on("enable", () => {
        lastAttack = 0;
        currentTarget = null;
        module.tag = "Idle";
    });
    
    module.on("disable", () => {
        currentTarget = null;
        module.tag = "";
    });
    
    module.on("playerTick", () => {
        const player = mc.player;
        const world = mc.level;
        
        if (player === null || world === null) return;
        
        // Get settings
        const range = module.settings.range.value;
        const delayMin = module.settings.delay.value.start;
        const delayMax = module.settings.delay.value.endInclusive;
        const targetPlayers = module.settings.targetPlayers.value;
        const targetMobs = module.settings.targetMobs.value;
        const targetAnimals = module.settings.targetAnimals.value;
        const useRotations = module.settings.rotations.value;
        const raytraced = module.settings.raytraced.value;
        const autoBlock = module.settings.autoBlock.value;
        
        // Find target
        currentTarget = findTarget(
            world, player, range,
            targetPlayers, targetMobs, targetAnimals
        );
        
        if (currentTarget === null) {
            module.tag = "No Target";
            return;
        }
        
        // Update tag with target name
        module.tag = currentTarget.getName().getString();
        
        // Check attack delay
        const now = Date.now();
        const randomDelay = delayMin + Math.random() * (delayMax - delayMin);
        
        if (now - lastAttack < randomDelay) {
            return;
        }
        
        // Aim at target
        if (useRotations) {
            let rotation;
            
            if (raytraced) {
                rotation = RotationUtil.newRaytracedRotationEntity(
                    currentTarget, range, 0.0
                );
            } else {
                rotation = RotationUtil.newRotationEntity(currentTarget);
            }
            
            if (rotation !== null) {
                RotationUtil.aimAtRotation(rotation, true);
            }
        }
        
        // Auto block
        if (autoBlock) {
            const item = player.getMainHandItem();
            if (item.getItem().toString().includes("sword")) {
                mc.gameMode.useItem(player, Hand.MAIN_HAND);
            }
        }
        
        // Attack
        mc.gameMode.attack(player, currentTarget);
        player.swing(Hand.MAIN_HAND);
        
        lastAttack = now;
    });
    
    function findTarget(world, player, range, targetPlayers, targetMobs, targetAnimals) {
        let closestTarget = null;
        let closestDistance = range * range;
        
        const entities = world.entitiesForRendering();
        
        for (let i = 0; i < entities.size(); i++) {
            const entity = entities.get(i);
            
            if (entity === player) continue;
            if (entity.isRemoved()) continue;
            
            // Check entity type
            const entityType = entity.getType().toString();
            
            if (entityType.includes("player")) {
                if (!targetPlayers) continue;
            } else if (entity instanceof Java.type("net.minecraft.world.entity.monster.Monster")) {
                if (!targetMobs) continue;
            } else if (entity instanceof Java.type("net.minecraft.world.entity.animal.Animal")) {
                if (!targetAnimals) continue;
            } else {
                continue;
            }
            
            // Check distance
            const distSq = player.distanceToSqr(entity);
            if (distSq < closestDistance) {
                closestDistance = distSq;
                closestTarget = entity;
            }
        }
        
        return closestTarget;
    }
});

Multi-Language Example

The same module in different languages:
registerScript({
    name: "SimpleModule",
    version: "1.0.0",
    authors: ["YourName"]
});

registerModule({
    name: "SimpleModule",
    category: "Misc",
    description: "A simple example module"
}, (module) => {
    module.on("enable", () => {
        Client.displayChatMessage("Module enabled!");
    });
    
    module.on("playerTick", () => {
        if (mc.player === null) return;
        // Module logic here
    });
});

Next Steps

Build docs developers (and LLMs) love