Skip to content

Scripts

Share and discover scripts for LiquidBounce

27 Topics 75 Posts
  • [Guide] Typescript definition for Minecraft and LiquidBounce

    Pinned
    4
    2 Votes
    4 Posts
    1k Views
    C
    Update for LiquidBounce v0.29.0: What's new: refined disclaimer in README.md localStorage in definition (no java.utils class definition yet) multiChoose in manually maintained patch
  • [Guide] Working with Baritone API

    Pinned
    3
    0 Votes
    3 Posts
    398 Views
    C
    It's definitely doable, but you need to use the unoptimized jar to directly call this. Here is the script in ts, but you may need to adapt the imports to Java.type in js. And also for the visualization manager it's not yet available outside of my project. will release once the api is well designed and performance becomes decent and after a proper name is found for the npm package. import { BaritoneAPI } from "jvm-types/baritone/api/BaritoneAPI" import { GoalXZ } from "jvm-types/baritone/api/pathing/goals/GoalXZ" import { CalculationContext } from "jvm-types/baritone/pathing/movement/CalculationContext" import { Favoring } from "jvm-types/baritone/utils/pathing/Favoring" import { BetterBlockPos } from "jvm-types/baritone/api/utils/BetterBlockPos" import { IPath } from "jvm-types/baritone/api/pathing/calc/IPath" import { VisualizationManager } from "lbng-utils-typed/dist/visualization-utils" import { PathCalculationResult$Type } from "jvm-types/baritone/api/utils/PathCalculationResult$Type" // note: this import is not from baritone-api jar // it is only presented in the baritone-unoptimized jar // as the `AStarPathFinder` class is possibly obfuscated in the baritone-standalone jar // so you will have to install the baritone-unoptimized jar to use this import import { AStarPathFinder } from "jvm-types/baritone/pathing/calc/AStarPathFinder" const script = registerScript.apply({ name: "astar-pathfinder-example", version: "1.0.0", authors: ["commandblock2"] }); script.registerModule({ name: "baritone-api-example", description: "Baritone example module", category: "Client", }, (mod) => { mod.on("enable", () => { BaritoneAPI.getSettings().allowSprint.value = true; BaritoneAPI.getSettings().primaryTimeoutMS.value = Primitives.long(2000); const baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); baritone.getCustomGoalProcess().setGoalAndPath(new GoalXZ(100, 100)) }) }) script.registerModule({ name: "astar-pathfinder-example", description: "Direct AStarPathFinder construction example", category: "Client", settings: { goalX: Setting.float({ name: "Goal X", default: 100, range: [-10000, 10000] // Assuming a reasonable range }), goalZ: Setting.float({ name: "Goal Z", default: 100, range: [-10000, 10000] // Assuming a reasonable range }), recalculateInterval: Setting.int({ name: "Recalculate Interval (ticks)", default: 20, range: [1, 200] }) } }, (mod) => { const viz = new VisualizationManager(mod); let previousPath: IPath | null = null; let lastRecalculateTick = 0; const calculatePath = () => { const baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); // Get current player position const playerPos = baritone.getPlayerContext().playerFeet(); const start = new BetterBlockPos(playerPos.getX(), playerPos.getY(), playerPos.getZ()); // Create calculation context for threaded use const context = new CalculationContext(baritone, true); // Create favoring (empty favoring for no preferences) const favoring = new Favoring(baritone.getPlayerContext(), previousPath as unknown as IPath, context); // Create goal using settings const goal = new GoalXZ(mod.settings.goalX.get() as unknown as number, mod.settings.goalZ.get() as unknown as number); // Construct AStarPathFinder directly const pathfinder = new AStarPathFinder( start, // realStart start.getX(), // startX start.getY(), // startY start.getZ(), // startZ goal, // goal favoring, // favoring context // context ); // @ts-expect-error UnsafeThread.run(() => { const result = pathfinder.calculate(Primitives.long(2000), Primitives.long(5000)); // Handle result if (result.getType() != PathCalculationResult$Type.CANCELLATION) { const path = result.getPath().get(); console.log("Path found! Length: " + path.length()); mc.execute(() => { viz.addVisualization({ lineData: { positions: path.positions().map((pos) => new Vec3d(pos.x + .5, pos.y, pos.z + .5)), }, durationTicks: 20 * 60, }); previousPath = path; }); // Use the path as needed - you now have direct access without execution } else { console.log("Path calculation failed: " + result.getType().toString()); } }); }; mod.on("enable", () => { viz.clearAllVisualizations(); lastRecalculateTick = 0; // Reset on enable calculatePath(); // Initial calculation }); mod.on("gametick", () => { if (mc.player && mc.world && (mc.player.age - lastRecalculateTick) >= (mod.settings.recalculateInterval.get() as unknown as number)) { calculatePath(); lastRecalculateTick = mc.player.age; } }); }); export { } [image: 1754149301736-vlcsnap-2025-08-02-23h41m20s672.png]
  • [Announcement] ScriptAPI Documentation

    Pinned Locked Moved
    1
    0 Votes
    1 Posts
    1k Views
    No one has replied
  • [Announcement] Don't use 3rd-party sites to upload scripts

    Pinned Locked Moved
    1
    3 Votes
    1 Posts
    3k Views
    No one has replied
  • [Announcement] ScriptAPI Improvements in 0.18.0

    Pinned Locked Moved
    1
    1 Votes
    1 Posts
    511 Views
    No one has replied
  • Help with script

    1
    0 Votes
    1 Posts
    49 Views
    No one has replied
  • Help with script

    1
    0 Votes
    1 Posts
    20 Views
    No one has replied
  • This topic is deleted!

    2
    0 Votes
    2 Posts
    3 Views
  • Better High Jump [Multiple Jump] Script

    1
    3 Votes
    1 Posts
    497 Views
    No one has replied
  • [Script] BetterAutoLeave

    1
    1 Votes
    1 Posts
    372 Views
    No one has replied
  • Saturn-X collision speed fix

    1
    1 Votes
    1 Posts
    479 Views
    No one has replied
  • [Script] Funsky join fix

    2
    0 Votes
    2 Posts
    676 Views
    kawaiinekololisK
    In AntiExploit there is an option that disables this issue as well. The script should not be needed.
  • LowHPplayersNotifier

    1
    0 Votes
    1 Posts
    335 Views
    No one has replied
  • [GPLv3] transaction.js

    4
    1 Votes
    4 Posts
    909 Views
    C
    transactions.zip Also looking forward to our marketplace, I do know that some development happened on the branch recently, hope to see it soon.
  • [Kotlin] A simple path finder and executor module

    2
    1 Votes
    2 Posts
    588 Views
    Konoha ScarletK
    Are you interested to contribute this for LB repo?
  • [Script] PearlBlockThrow ?

    Unsolved
    2
    0 Votes
    2 Posts
    496 Views
    C
    This is a somewhat faithful transplation of the original source code, which would not work on 1.8.x, this should desync your inventory too. function __require(path) { if (path.startsWith("@embedded")) { return globalThis } if (path.startsWith("@minecraft-yarn-definitions/types/")) { return { [path.substring(path.lastIndexOf("/") + 1)]: Java.type(path .replaceAll("@minecraft-yarn-definitions/types/", "") .replaceAll("/", ".") ) } } return require(path); } var exports = {} "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // imports /* eslint-disable unused-imports/no-unused-imports */ const _embedded_1 = __require("@embedded"); /* eslint-enable unused-imports/no-unused-imports */ // DO NOT TOUCH ANYTHING ABOVE THIS LINE, also not sure why it didn't work const PlayerInteractItemC2SPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/PlayerInteractItemC2SPacket"); const UpdateSelectedSlotC2SPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/UpdateSelectedSlotC2SPacket"); const UpdateSelectedSlotS2CPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/play/UpdateSelectedSlotS2CPacket"); const Items_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/item/Items"); const Hand_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/util/Hand"); const script = _embedded_1.registerScript.apply({ name: "no-pearl-use", version: "1.0.0", authors: ["commandblock2"] }); script.registerModule({ name: "no-pearl-use", description: "cancels ender pearl use", category: "Player", }, (mod) => { var slot = 0; mod.on("enable", () => { var _a, _b; slot = (_b = (_a = _embedded_1.mc.player) === null || _a === void 0 ? void 0 : _a.inventory.selectedSlot) !== null && _b !== void 0 ? _b : 0; }); mod.on("packet", (event) => { var _a; if (event.packet instanceof UpdateSelectedSlotS2CPacket_1.UpdateSelectedSlotS2CPacket) { slot = event.packet.slot(); } if (event.packet instanceof UpdateSelectedSlotC2SPacket_1.UpdateSelectedSlotC2SPacket) { slot = event.packet.selectedSlot; } if (event.packet instanceof PlayerInteractItemC2SPacket_1.PlayerInteractItemC2SPacket && ((_a = _embedded_1.mc.player) === null || _a === void 0 ? void 0 : _a.inventory.main[slot].item) == Items_1.Items.ENDER_PEARL) { // use reflection to set the hand to offhand const field = event.packet.class.getDeclaredField("hand"); field.setAccessible(true); field.set(event.packet, Hand_1.Hand.OFF_HAND); _embedded_1.Client.displayChatMessage(`§cPearl use changed to hand ${event.packet.hand}`); } }); }); original typescript code // imports /* eslint-disable unused-imports/no-unused-imports */ import { Setting, Vec3i, Vec3d, MathHelper, BlockPos, Hand, RotationAxis, mc, Client, RotationUtil, ItemUtil, NetworkUtil, InteractionUtil, BlockUtil, MovementUtil, ReflectionUtil, ParameterValidator, UnsafeThread, registerScript } from "@embedded"; /* eslint-enable unused-imports/no-unused-imports */ // DO NOT TOUCH ANYTHING ABOVE THIS LINE, also not sure why it didn't work import { PlayerInteractItemC2SPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/PlayerInteractItemC2SPacket"; import { UpdateSelectedSlotC2SPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/UpdateSelectedSlotC2SPacket"; import { UpdateSelectedSlotS2CPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/play/UpdateSelectedSlotS2CPacket"; import { Items } from "@minecraft-yarn-definitions/types/net/minecraft/item/Items"; import { Hand as MCHand } from "@minecraft-yarn-definitions/types/net/minecraft/util/Hand"; const script = registerScript.apply({ name: "no-pearl-use", version: "1.0.0", authors: ["commandblock2"] }); script.registerModule({ name: "no-pearl-use", description: "cancels ender pearl use", category: "Player", }, (mod) => { var slot = 0 mod.on("enable", () => { slot = mc.player?.inventory.selectedSlot ?? 0; }) mod.on("packet", (event) => { if (event.packet instanceof UpdateSelectedSlotS2CPacket) { slot = event.packet.slot(); } if (event.packet instanceof UpdateSelectedSlotC2SPacket) { slot = event.packet.selectedSlot; } if (event.packet instanceof PlayerInteractItemC2SPacket && mc.player?.inventory.main[slot].item == Items.ENDER_PEARL ) { // use reflection to set the hand to offhand const field = (event.packet as any).class.getDeclaredField("hand"); field.setAccessible(true); field.set(event.packet, MCHand.OFF_HAND); Client.displayChatMessage(`§cPearl use changed to hand ${event.packet.hand}`); } }) }) This will indeed cancel the usage of the pearl on 1.8.x protocols function __require(path) { if (path.startsWith("@embedded")) { return globalThis } if (path.startsWith("@minecraft-yarn-definitions/types/")) { return { [path.substring(path.lastIndexOf("/") + 1)]: Java.type(path .replaceAll("@minecraft-yarn-definitions/types/", "") .replaceAll("/", ".") ) } } return require(path); } var exports = {} "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // imports /* eslint-disable unused-imports/no-unused-imports */ const _embedded_1 = __require("@embedded"); /* eslint-enable unused-imports/no-unused-imports */ // DO NOT TOUCH ANYTHING ABOVE THIS LINE, also not sure why it didn't work const PlayerInteractItemC2SPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/PlayerInteractItemC2SPacket"); const UpdateSelectedSlotC2SPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/UpdateSelectedSlotC2SPacket"); const UpdateSelectedSlotS2CPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/play/UpdateSelectedSlotS2CPacket"); const Items_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/item/Items"); const script = _embedded_1.registerScript.apply({ name: "no-pearl-use", version: "1.0.0", authors: ["commandblock2"] }); script.registerModule({ name: "no-pearl-use", description: "cancels ender pearl use", category: "Player", }, (mod) => { var slot = 0; mod.on("enable", () => { var _a, _b; slot = (_b = (_a = _embedded_1.mc.player) === null || _a === void 0 ? void 0 : _a.inventory.selectedSlot) !== null && _b !== void 0 ? _b : 0; }); mod.on("packet", (event) => { var _a; if (event.packet instanceof UpdateSelectedSlotS2CPacket_1.UpdateSelectedSlotS2CPacket) { slot = event.packet.slot(); } if (event.packet instanceof UpdateSelectedSlotC2SPacket_1.UpdateSelectedSlotC2SPacket) { slot = event.packet.selectedSlot; } if (event.packet instanceof PlayerInteractItemC2SPacket_1.PlayerInteractItemC2SPacket && ((_a = _embedded_1.mc.player) === null || _a === void 0 ? void 0 : _a.inventory.main[slot].item) == Items_1.Items.ENDER_PEARL) { event.cancelEvent(); } }); }); This will desync your inventory with the server anyway, but it is true that no end pearl will be thrown if you have one in your hand (unless u have a pearl in server side but not client side). Can be used as a example. Later is the original ts file. // imports /* eslint-disable unused-imports/no-unused-imports */ import { Setting, Vec3i, Vec3d, MathHelper, BlockPos, Hand, RotationAxis, mc, Client, RotationUtil, ItemUtil, NetworkUtil, InteractionUtil, BlockUtil, MovementUtil, ReflectionUtil, ParameterValidator, UnsafeThread, registerScript } from "@embedded"; /* eslint-enable unused-imports/no-unused-imports */ // DO NOT TOUCH ANYTHING ABOVE THIS LINE, also not sure why it didn't work import { PlayerInteractItemC2SPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/PlayerInteractItemC2SPacket"; import { UpdateSelectedSlotC2SPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/c2s/play/UpdateSelectedSlotC2SPacket"; import { UpdateSelectedSlotS2CPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/play/UpdateSelectedSlotS2CPacket"; import { Items } from "@minecraft-yarn-definitions/types/net/minecraft/item/Items"; const script = registerScript.apply({ name: "no-pearl-use", version: "1.0.0", authors: ["commandblock2"] }); script.registerModule({ name: "no-pearl-use", description: "cancels ender pearl use", category: "Player", }, (mod) => { var slot = 0 mod.on("enable", () => { slot = mc.player?.inventory.selectedSlot ?? 0; }) mod.on("packet", (event) => { if (event.packet instanceof UpdateSelectedSlotS2CPacket) { slot = event.packet.slot(); } if (event.packet instanceof UpdateSelectedSlotC2SPacket) { slot = event.packet.selectedSlot; } if (event.packet instanceof PlayerInteractItemC2SPacket && mc.player?.inventory.main[slot].item == Items.ENDER_PEARL ) { event.cancelEvent(); } }) })
  • Vectorized Velocity

    1
    0 Votes
    1 Posts
    417 Views
    No one has replied
  • [Script] Macros

    2
    0 Votes
    2 Posts
    1k Views
    Q
    macros are not created using the numpad keypad and bottom keys. can you create them quickly by pressing a key without typing?
  • [Script] GCore 0.1 (End support)

    Moved
    24
    0 Votes
    24 Posts
    11k Views
    kawaiinekololisK
    @pro0101 The script is not supported anymore.
  • [Script] Mediator 0.2.1 (Update)

    1
    0 Votes
    1 Posts
    711 Views
    No one has replied