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();
}
})
})