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!
Chinese
about 2 hours ago
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.
ScriptAPI
2 days ago
General
3 days ago
librecraft config that doesnt silent flag that would be decent if has a working timer speed, timer scaffold, tower, at least a 4 block reach (i think it doesnt silent flag until above 4 block reach normally)
liquidbounce legacy alr has a librecraft settting which does bypass but the scaffold is disgusting and slow and silent flags (unnatural placement kick) and the rest of the config randomly silent flags and you get auto banned after like 15 minutes.
Configs
4 days ago
Configs
4 days ago
General Discussion
4 days ago
Configs
5 days ago
General
5 days ago
General Discussion
6 days ago
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);
}
Scripts
6 days ago
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
Scripts
6 days ago
General
7 days ago
Scripts
7 days ago
Scripts
7 days ago
General Discussion
8 days ago
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?
General Discussion
9 days ago
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);
}
})
})
Scripts
9 days ago
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))
}
})
})
Scripts
10 days ago
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?
ScriptAPI
10 days ago
Suggestions
11 days ago
-
-
-
-
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)!