Important for new members!
All future posts from members with a reputation of less than 1 will be queued for manual review to prevent forum spam. We will review your posts as soon as possible!
Hi, I've tested killaura on some various anticheats:
Vulcan, Verus, Karhu, GrimAC
I've found settings that seem to bypass all of these pretty well. But I didn't take into account how strong the killaura is when making these. I was focusing on remaining undetected across all of them. Feel free to take these settings and improve them.
Remember that this probably still eventually gets you banned on some servers like mineman club since their anticheat is so sensitive that it also bans legit people sometimes.
I can't upload json files, so i'm giving the settings here as a plain text. For GrimAC make sure KeepSprint is off. It seemed fine to use with the others. If you're on a server that turns off the attack cooldown please turn off Attack Cooldown and Item Cooldown in killaura, otherwise it will click at over 20 clicks per second
default.txt
Save this file as .json and place it into:
AppData\Roaming\CCBlueX\LiquidLauncher\data\gameDir\nextgen\LiquidBounce\configs
type .localconfig load default in-game to load it.
Hello. I'm currently trying to learn how to use nextgen's scriptAPI. I've created a simple module just to mess around and to learn it. Here is part of the code related to what I'm trying to do:
script.registerModule({
name: "TestFly",
category: "Movement",
description: "Fly module, made for learning purposes.",
settings: {
mode: Setting.choose({
name: "Mode",
choices: ["Vanilla", "Hard", "Airwalk"],
default: "Vanilla"
}),
speed: Setting.float({
name: "Speed",
default: 1.0,
range: [0.1, 5.0],
})
}
}, (mod) => {
I'm trying to make the "Speed" setting only visible when the vanilla mode is selected. Or I'm trying to make the Speed setting be within the mode setting only when Vanilla option is selected. In the default fly module the relevant settings are inside the mode setting and they change depending on which mode of fly is selected. Is this possible to do in nextgen's scriptapi? I couldn't find out how to do it in the documentation.
In short I'm asking how make settings within settings in the scriptapi.
I also want to know if is it possible to add the "Toggle/ hold" setting in the scriptapi? This is the setting next to the bind button on some modules that makes the module only active when holding down the keybind.
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");
const CommonPingS2CPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/common/CommonPingS2CPacket");
// Global variables for storing transaction data
const transactionQueue = [];
const MAX_QUEUE_SIZE = 100;
// Global statistics
let totalTransactions = 0;
let lastReportTime = 0;
const REPORT_INTERVAL = 5000; // Report every 5 seconds
const PARAMETER_FREQUENCY = {};
const script = _embedded_1.registerScript.apply({
name: "transactions",
version: "1.0.0",
authors: ["commandblock2"]
});
script.registerModule({
name: "transactions",
description: "Logs transactions packets for anticheat detection",
category: "Client",
settings: {
reportInterval: _embedded_1.Setting.int({
name: "ReportInterval",
default: 5,
range: [1, 60],
suffix: "seconds"
}),
showParameters: _embedded_1.Setting.boolean({
name: "ShowParameters",
default: true
}),
logToChat: _embedded_1.Setting.boolean({
name: "LogToChat",
default: true
}),
verbose: _embedded_1.Setting.boolean({
name: "Verbose",
default: false
})
}
}, (mod) => {
mod.on("enable", () => {
// Reset statistics
totalTransactions = 0;
lastReportTime = Date.now();
// Clear the queue
transactionQueue.length = 0;
// Reset parameter frequency
for (const key in PARAMETER_FREQUENCY) {
delete PARAMETER_FREQUENCY[key];
}
_embedded_1.Client.displayChatMessage("§a[Transactions] Monitoring started. Use .txstats to see statistics.");
});
mod.on("disable", () => {
_embedded_1.Client.displayChatMessage("§c[Transactions] Monitoring stopped.");
});
mod.on("packet", (event) => {
if (event.packet instanceof CommonPingS2CPacket_1.CommonPingS2CPacket) {
const parameter = event.packet.getParameter();
const timestamp = Date.now();
if (mod.settings.verbose.getValue()) {
_embedded_1.Client.displayChatMessage(`§a[Transactions] Received parameter: ${parameter}`);
}
// Add to queue
transactionQueue.push({ timestamp, parameter });
// Keep queue size limited
if (transactionQueue.length > MAX_QUEUE_SIZE) {
transactionQueue.shift();
}
// Update statistics
totalTransactions++;
PARAMETER_FREQUENCY[parameter] = (PARAMETER_FREQUENCY[parameter] || 0) + 1;
// Check if it's time to report
const currentTime = Date.now();
const reportIntervalMs = mod.settings.reportInterval.getValue() * 1000;
if (mod.settings.logToChat.getValue() && currentTime - lastReportTime >= reportIntervalMs) {
reportStatistics();
lastReportTime = currentTime;
}
}
});
// Function to report statistics
function reportStatistics() {
if (transactionQueue.length === 0) {
return;
}
const packetsPerSecond = calculatePacketsPerSecond();
_embedded_1.Client.displayChatMessage(`§e[Transactions] §fRate: §a${packetsPerSecond.toFixed(2)} §fpackets/sec | Total: §a${totalTransactions}`);
if (mod.settings.showParameters.getValue()) {
const topParameters = getTopParameters(8);
if (topParameters.length > 0) {
_embedded_1.Client.displayChatMessage(`§e[Transactions] §fTop parameters: ${topParameters.map(p => `§a${p.parameter}§f(${p.count})`).join(", ")}`);
}
}
}
// Calculate packets per second based on queue data
function calculatePacketsPerSecond() {
if (transactionQueue.length < 2) {
return 0;
}
const oldestTimestamp = transactionQueue[0].timestamp;
const newestTimestamp = transactionQueue[transactionQueue.length - 1].timestamp;
const timeSpanSeconds = (newestTimestamp - oldestTimestamp) / 1000;
return timeSpanSeconds > 0 ? transactionQueue.length / timeSpanSeconds : 0;
}
// Get top N most frequent parameters
function getTopParameters(n) {
return Object.entries(PARAMETER_FREQUENCY)
.map(([parameter, count]) => ({ parameter: parseInt(parameter), count }))
.sort((a, b) => b.count - a.count)
.slice(0, n);
}
});
// Register a command to view transaction statistics
script.registerCommand({
name: "txstats",
aliases: ["transactionstats"],
parameters: [{
name: "action",
required: false,
validate: _embedded_1.ParameterValidator.string
}],
onExecute(action) {
if (action === "clear") {
// Clear statistics
totalTransactions = 0;
transactionQueue.length = 0;
for (const key in PARAMETER_FREQUENCY) {
delete PARAMETER_FREQUENCY[key];
}
_embedded_1.Client.displayChatMessage("§a[Transactions] Statistics cleared.");
return;
}
if (transactionQueue.length === 0) {
_embedded_1.Client.displayChatMessage("§c[Transactions] No transaction data available.");
return;
}
// Display basic statistics
const packetsPerSecond = calculatePacketsPerSecond();
_embedded_1.Client.displayChatMessage(`§e[Transactions] §fStatistics:`);
_embedded_1.Client.displayChatMessage(`§fTotal transactions: §a${totalTransactions}`);
_embedded_1.Client.displayChatMessage(`§fCurrent rate: §a${packetsPerSecond.toFixed(2)} §fpackets/sec`);
// Display queue info
_embedded_1.Client.displayChatMessage(`§fQueue size: §a${transactionQueue.length}/${MAX_QUEUE_SIZE}`);
// Display top 5 parameters
const topParameters = getTopParameters(5);
if (topParameters.length > 0) {
_embedded_1.Client.displayChatMessage(`§fTop 5 parameters:`);
topParameters.forEach((p, index) => {
_embedded_1.Client.displayChatMessage(`§f ${index + 1}. Parameter §a${p.parameter}§f: ${p.count} occurrences (${(p.count / totalTransactions * 100).toFixed(1)}%)`);
});
}
// Display time range
if (transactionQueue.length >= 2) {
const oldestTimestamp = transactionQueue[0].timestamp;
const newestTimestamp = transactionQueue[transactionQueue.length - 1].timestamp;
const timeSpanSeconds = (newestTimestamp - oldestTimestamp) / 1000;
_embedded_1.Client.displayChatMessage(`§fTime span: §a${timeSpanSeconds.toFixed(2)} §fseconds`);
}
}
});
// Helper functions for command execution
function calculatePacketsPerSecond() {
if (transactionQueue.length < 2) {
return 0;
}
const oldestTimestamp = transactionQueue[0].timestamp;
const newestTimestamp = transactionQueue[transactionQueue.length - 1].timestamp;
const timeSpanSeconds = (newestTimestamp - oldestTimestamp) / 1000;
return timeSpanSeconds > 0 ? transactionQueue.length / timeSpanSeconds : 0;
}
function getTopParameters(n) {
return Object.entries(PARAMETER_FREQUENCY)
.map(([parameter, count]) => ({ parameter: parseInt(parameter), count }))
.sort((a, b) => b.count - a.count)
.slice(0, n);
}
Note that LiquidBounce cannot run typescript, at least as of now.
// 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";
import { CommonPingS2CPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/common/CommonPingS2CPacket";
/* eslint-enable unused-imports/no-unused-imports */
// DO NOT TOUCH ANYTHING ABOVE THIS LINE
// Define the TransactionEntry interface for storing packet data
interface TransactionEntry {
timestamp: number;
parameter: number;
}
// Global variables for storing transaction data
const transactionQueue: TransactionEntry[] = [];
const MAX_QUEUE_SIZE = 100;
// Global statistics
let totalTransactions = 0;
let lastReportTime = 0;
const PARAMETER_FREQUENCY: { [key: number]: number } = {};
const script = registerScript.apply({
name: "transactions",
version: "1.0.0",
authors: ["commandblock2"]
});
script.registerModule({
name: "transactions",
description: "Logs transactions packets for anticheat detection",
category: "Client",
settings: {
reportInterval: Setting.int({
name: "ReportInterval",
default: 5,
range: [1, 60],
suffix: "seconds"
}),
showParameters: Setting.boolean({
name: "ShowParameters",
default: true
}),
logToChat: Setting.boolean({
name: "LogToChat",
default: true
}),
verbose: Setting.boolean({
name: "Verbose",
default: false
})
}
}, (mod) => {
mod.on("enable", () => {
// Reset statistics
totalTransactions = 0;
lastReportTime = Date.now();
// Clear the queue
transactionQueue.length = 0;
// Reset parameter frequency
for (const key in PARAMETER_FREQUENCY) {
delete PARAMETER_FREQUENCY[key];
}
Client.displayChatMessage("§a[Transactions] Monitoring started. Use .txstats to see statistics.");
});
mod.on("disable", () => {
Client.displayChatMessage("§c[Transactions] Monitoring stopped.");
});
mod.on("packet", (event) => {
if (event.packet instanceof CommonPingS2CPacket) {
const parameter = event.packet.getParameter();
const timestamp = Date.now();
if (mod.settings.verbose.getValue()) {
Client.displayChatMessage(`§a[Transactions] Received parameter: ${parameter}`);
}
// Add to queue
transactionQueue.push({ timestamp, parameter });
// Keep queue size limited
if (transactionQueue.length > MAX_QUEUE_SIZE) {
transactionQueue.shift();
}
// Update statistics
totalTransactions++;
PARAMETER_FREQUENCY[parameter] = (PARAMETER_FREQUENCY[parameter] || 0) + 1;
// Check if it's time to report
const currentTime = Date.now();
const reportIntervalMs = mod.settings.reportInterval.getValue() * 1000;
if (mod.settings.logToChat.getValue() && currentTime - lastReportTime >= reportIntervalMs) {
reportStatistics();
lastReportTime = currentTime;
}
}
});
// Function to report statistics
function reportStatistics() {
if (transactionQueue.length === 0) {
return;
}
const packetsPerSecond = calculatePacketsPerSecond();
Client.displayChatMessage(`§e[Transactions] §fRate: §a${packetsPerSecond.toFixed(2)} §fpackets/sec | Total: §a${totalTransactions}`);
if (mod.settings.showParameters.getValue()) {
const topParameters = getTopParameters(8);
if (topParameters.length > 0) {
Client.displayChatMessage(`§e[Transactions] §fTop parameters: ${topParameters.map(p => `§a${p.parameter}§f(${p.count})`).join(", ")}`);
}
}
}
// Calculate packets per second based on queue data
function calculatePacketsPerSecond(): number {
if (transactionQueue.length < 2) {
return 0;
}
const oldestTimestamp = transactionQueue[0].timestamp;
const newestTimestamp = transactionQueue[transactionQueue.length - 1].timestamp;
const timeSpanSeconds = (newestTimestamp - oldestTimestamp) / 1000;
return timeSpanSeconds > 0 ? transactionQueue.length / timeSpanSeconds : 0;
}
// Get top N most frequent parameters
function getTopParameters(n: number): { parameter: number, count: number }[] {
return Object.entries(PARAMETER_FREQUENCY)
.map(([parameter, count]) => ({ parameter: parseInt(parameter), count }))
.sort((a, b) => b.count - a.count)
.slice(0, n);
}
});
// Register a command to view transaction statistics
script.registerCommand({
name: "txstats",
aliases: ["transactionstats"],
parameters: [{
name: "action",
required: false,
validate: ParameterValidator.string
}],
onExecute(action: string) {
if (action === "clear") {
// Clear statistics
totalTransactions = 0;
transactionQueue.length = 0;
for (const key in PARAMETER_FREQUENCY) {
delete PARAMETER_FREQUENCY[key];
}
Client.displayChatMessage("§a[Transactions] Statistics cleared.");
return;
}
if (transactionQueue.length === 0) {
Client.displayChatMessage("§c[Transactions] No transaction data available.");
return;
}
// Display basic statistics
const packetsPerSecond = calculatePacketsPerSecond();
Client.displayChatMessage(`§e[Transactions] §fStatistics:`);
Client.displayChatMessage(`§fTotal transactions: §a${totalTransactions}`);
Client.displayChatMessage(`§fCurrent rate: §a${packetsPerSecond.toFixed(2)} §fpackets/sec`);
// Display queue info
Client.displayChatMessage(`§fQueue size: §a${transactionQueue.length}/${MAX_QUEUE_SIZE}`);
// Display top 5 parameters
const topParameters = getTopParameters(5);
if (topParameters.length > 0) {
Client.displayChatMessage(`§fTop 5 parameters:`);
topParameters.forEach((p, index) => {
Client.displayChatMessage(`§f ${index + 1}. Parameter §a${p.parameter}§f: ${p.count} occurrences (${(p.count / totalTransactions * 100).toFixed(1)}%)`);
});
}
// Display time range
if (transactionQueue.length >= 2) {
const oldestTimestamp = transactionQueue[0].timestamp;
const newestTimestamp = transactionQueue[transactionQueue.length - 1].timestamp;
const timeSpanSeconds = (newestTimestamp - oldestTimestamp) / 1000;
Client.displayChatMessage(`§fTime span: §a${timeSpanSeconds.toFixed(2)} §fseconds`);
}
}
});
// Helper functions for command execution
function calculatePacketsPerSecond(): number {
if (transactionQueue.length < 2) {
return 0;
}
const oldestTimestamp = transactionQueue[0].timestamp;
const newestTimestamp = transactionQueue[transactionQueue.length - 1].timestamp;
const timeSpanSeconds = (newestTimestamp - oldestTimestamp) / 1000;
return timeSpanSeconds > 0 ? transactionQueue.length / timeSpanSeconds : 0;
}
function getTopParameters(n: number): { parameter: number, count: number }[] {
return Object.entries(PARAMETER_FREQUENCY)
.map(([parameter, count]) => ({ parameter: parseInt(parameter), count }))
.sort((a, b) => b.count - a.count)
.slice(0, n);
}
Set a target block in the clickgui, and enable the module, it will manage to get to there and get back ( To succeed, there must be at leat one way to get to it)
It doesnt actually have any value as a movement module, but the pathfinding core can be used in some more interesting fields like controling bots to fetch diamonds for you. I kept some necessary comments in the code.
Here's the donwload (.kt): ModulePathFinder.zip
Example Video: https://www.bilibili.com/video/BV1MHALeREke
I truly appreciate that this client has remained free and open-source, which is excellent and has given rise to many forks. However, I wonder if there has been consideration to develop an injectable client? I understand that technical expertise varies, but could we attempt to explore this path?
Take the example of CCBlueX/liquidbounce_lite, which uses DLL injection via Rust. While undoubtedly challenging (potentially taking at least two years to mature), could such an approach eventually become viable? Additionally, would an executable (EXE) based solution be worth exploring as an alternative?
Why can't liquidbounce b100 call packet event? It doesn't work and outputs many errors, such as TypeError: null has no such function "get packet". I'm sure there are many other errors, but I don't understand. How can I call packet event now?
/// api_version=2
var script = registerScript({
name: "TestScript",
version: "1.0",
authors: ["test"]
})
var C03PacketPlayer = Java.type("net.minecraft.network.play.client.C03PacketPlayer")
script.registerModule({
name: "TestScript",
description: "test",
category: "Combat"
}, function(module) {
module.on("packet", function(e) {
try {
if (e.getPacket() instanceof C03PacketPlayer) {
e.cancelEvent()
}
} catch (err) {
Chat.print(err);
}
})
})
Changes the velocity direction or strength based on the incoming packet or minecraft player's facing direction. Usually not useful unless you need to be flying sideways or your facing direction.
Released js for LiquidBounce Nextgen 0.28.1, Licensed under GPLv3
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");
const EntityVelocityUpdateS2CPacket_1 = __require("@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/play/EntityVelocityUpdateS2CPacket");
/* eslint-enable unused-imports/no-unused-imports */
// DO NOT TOUCH ANYTHING ABOVE THIS LINE, also not sure why it didn't work
const script = _embedded_1.registerScript.apply({
name: "vectorized-velocity-xz",
version: "1.0.0",
authors: ["commandblock2"]
});
script.registerModule({
name: "vectorized-velocity-xz",
description: "Port of the old script for legacy, for those anticheat that doesn't have proper velocity detection",
category: "Combat",
settings: {
offsetBasedOnPlayerOrIncomingVelocity: _embedded_1.Setting.choose({
name: "OffsetBasedOnPlayerOrIncomingVelocity",
choices: ["player", "incoming"],
default: "player"
}),
offset: _embedded_1.Setting.float({
name: "AngleOffset",
default: 0,
range: [-180, 180]
}),
amplitude: _embedded_1.Setting.float({
name: "Amplitude",
default: 1,
range: [-100, 100]
})
}
}, (mod) => {
mod.on("packet", (event) => {
if (!_embedded_1.mc.player)
return;
const packet = event.packet;
if (packet instanceof EntityVelocityUpdateS2CPacket_1.EntityVelocityUpdateS2CPacket && packet.entityId == _embedded_1.mc.player.id) {
const yaw = mod.settings.offset.get() +
(mod.settings.offsetBasedOnPlayerOrIncomingVelocity.getValue() == "player" ?
-_embedded_1.mc.player.yaw : (Math.atan2(packet.getVelocityX(), packet.getVelocityZ()) * 180 / Math.PI));
const velocity = Math.sqrt(packet.getVelocityX() * packet.getVelocityX() + packet.getVelocityZ() * packet.getVelocityZ())
* 8000 * mod.settings.amplitude.get();
// graaljs traps here:
// 1. it eats error here when we have loss in precision and does not update the value
// 2. packet.velocityX and packet.getVelocityX() is very different (public double getVelocityX() { return (double)this.velocityX / 8000.0; })
// and when reading velocityX graaljs calls getVelocityX() and when writing velocityX it directly writes that
packet.velocityX = Math.round(velocity * Math.sin(yaw / 180 * Math.PI));
packet.velocityZ = Math.round(velocity * Math.cos(yaw / 180 * Math.PI));
}
});
});
original typescript script, won't run directly in LiquidBounce, for more info, see https://github.com/commandblock2/minecraft-LBNG-types
// 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";
import { EntityVelocityUpdateS2CPacket } from "@minecraft-yarn-definitions/types/net/minecraft/network/packet/s2c/play/EntityVelocityUpdateS2CPacket";
/* eslint-enable unused-imports/no-unused-imports */
// DO NOT TOUCH ANYTHING ABOVE THIS LINE, also not sure why it didn't work
const script = registerScript.apply({
name: "vectorized-velocity-xz",
version: "1.0.0",
authors: ["commandblock2"]
});
script.registerModule({
name: "vectorized-velocity-xz",
description: "Port of the old script for legacy, for those anticheat that doesn't have proper velocity detection",
category: "Combat",
settings: {
offsetBasedOnPlayerOrIncomingVelocity: Setting.choose({
name: "OffsetBasedOnPlayerOrIncomingVelocity",
choices: ["player", "incoming"],
default: "player"
}),
offset: Setting.float({
name: "AngleOffset",
default: 0,
range: [-180, 180]
}),
amplitude: Setting.float({
name: "Amplitude",
default: 1,
range: [-100, 100]
})
}
}, (mod) => {
mod.on("packet", (event) => {
if (!mc.player)
return;
const packet = event.packet
if (packet instanceof EntityVelocityUpdateS2CPacket && packet.entityId == mc.player.id) {
const yaw = mod.settings.offset.get() +
(mod.settings.offsetBasedOnPlayerOrIncomingVelocity.getValue() == "player" ?
-mc.player.yaw : (Math.atan2(packet.getVelocityX(), packet.getVelocityZ()) * 180 / Math.PI));
const velocity = Math.sqrt(packet.getVelocityX() * packet.getVelocityX() + packet.getVelocityZ() * packet.getVelocityZ())
* 8000 * mod.settings.amplitude.get();
// graaljs traps here:
// 1. it eats error here when we have loss in precision and does not update the value
// 2. packet.velocityX and packet.getVelocityX() is very different (public double getVelocityX() { return (double)this.velocityX / 8000.0; })
// and when reading velocityX graaljs calls getVelocityX() and when writing velocityX it directly writes that
packet.velocityX = Math.round(velocity * Math.sin(yaw / 180 * Math.PI))
packet.velocityZ = Math.round(velocity * Math.cos(yaw / 180 * Math.PI))
}
})
})
I really want to ask for help, and ask a master who knows Liquid Bounce Legacy B100 JavaScript to help me solve this problem.My JavaScript:
*
var script = registerScript({
name: "TestScript",
version: "1.0",
authors: ["test"]
})
var C03PacketPlayer = Java.type("net.minecraft.network.play.client.C03PacketPlayer")
script.registerModule({
name: "TestScript",
description: "testscrpit",
category: "Combat"
}, function(module) {
module.on("packet", function(e) {
try {
if (e.getPacket() instanceof C03PacketPlayer) {
e.cancelEvent()
}
} catch (err) {
Chat.print(err);
}
})
})
Why can't liquidbounce b100 call packet event? It doesn't work and outputs many errors, such as TypeError: null has no such function "get packet". I'm sure there are many other errors, but I don't understand. How can I call packet event now?
[image: 1730870771737-453b7e40-7f0c-4fef-9b65-36306250c553-image.png]
[image: 1730870791301-65d17b6d-a827-48e6-9f3d-a9356599d729-image.png]
With this script, you can create macros and bind commands to the key of your choice. When you need it, just press the key and the command will be executed.
How to use
Turn on Macros Module - otherwise macros will NOT be executed.
Create macro by typing: .macro add <key> <command...>
Press <key> and the command will be executed right away.
Download
macros.js
-
-
-
-
General Discussion
A place to talk about anything related to LiquidBounce
-
Suggestions
Think something is missing? Let us know!
-
Bug Reports
Found a bug? Report it here!
-
Chinese
A place for our Chinese community
-
Off-Topic
Talk about anything you like (as long as you follow the rules)!