Loading...
Loading...
Write JavaScript scripts for Iridium (a Minecraft 1.20.1/1.21.10 Forge client), covering module/HUD/command registration, event listening, Nashorn-style Java interop, and the IridiumMCP debugging toolchain. Use this skill in any of the following scenarios: the user mentions Iridium or client-side scripting; requests registration of modules, HUD elements, or chat commands; involves .js files under %APPDATA%\scripts; the current working directory is in %APPDATA%\scripts; or the user only describes functional requirements (e.g., "write me an auto sprint feature") without mentioning Iridium, but the context indicates it is for this client.
npx skill4agent add cubk1/iridiumskill iridium-scripttypes.d.tsIridiumMCPtypes.d.tsclient.getMinecraftVersion()types.d.ts| Purpose | Path |
|---|---|
| Scripts | |
| Local libraries | |
pinghttps://iridium.styles.wtf/assets/IridiumMCP.exe┌─ IridiumMCP Server Setup Complete ────────────────────┐
│ ✓ Config <path> │
│ ✓ MCPs <path> │
│ │
│ ⚡ Restart your agent to load the MCP servers │
└──────────────────────────────────────────────────────┘http://127.0.0.1:6767/mcp6767IridiumMCP.exe -http 127.0.0.1:6768IridiumMCP.exe -stdio/mcp/mcp127.0.0.1reference/library.mdget_libraryclient.importvar clip = client.import("cubk/clipboard");
log("import ok, keys: " + Object.keys(clip).join(", "));
log("write: " + clip.write("MARKER-8964"));pingtypes.d.tslist_scriptsevalget_errorsgrep_logsget_logslog()grep_logsget_logsgrep_logsscreenshotreload_scriptget_library.jsevents.on(...)client.registerModule("Auto Sprint", -1, "Movement", false);
client.registerSlider("Auto Sprint", "Delay", 5, 1, 20, 1);
events.on("tick", function () {
if (!client.isEnabled("Auto Sprint")) return;
// ...
});(function(){ ...your code... })()varfunctionCombatMovementRenderWorldPlayerInventorymcmc.player.getX();
mc.player.getMainHandItem().getCount();
mc.level.getBlockState(pos).getBlock();Java.type()newvar BlockPos = Java.type("net.minecraft.core.BlockPos");
var Items = Java.type("net.minecraft.world.item.Items");
var Component = Java.type("net.minecraft.network.chat.Component");
var pos = new BlockPos(100, 64, 200); // Constructor
var stick = Items.STICK; // Static field
var text = Component.literal("hello"); // Static methodnet.minecraft.core.BlockPos"int[]""java.lang.String[]"$Class.forName$Java class not foundJava.type("com.mojang.blaze3d.vertex.VertexFormat$Mode"); // Correct
Java.type("net.minecraft.world.entity.Entity$RemovalReason"); // Correct
Java.type("com.mojang.blaze3d.vertex.VertexFormat.Mode"); // Wrong, class not foundvar Mode = Java.type("com.mojang.blaze3d.vertex.VertexFormat$Mode");
var quads = Mode.QUADS;Java.typegetXgetMainHandItemevalnet.minecraft.core.BlockPosintfloatdoubleStringevalmc.player.getMainHandItem().getItem().toString().lengthvar arr = someJavaMethodReturningArray();
arr.length;
arr[0];var Player = Java.type("net.minecraft.world.entity.player.Player");
if (Java.isType(entity, Player)) { ... }instanceofJava.isTypeJava.isJavaObject(x)mc.level.players()java.util.List.lengthfor (var i = 0; i < list.length; i++)0 < undefinedvar players = mc.level.players();
players.length // undefined
players.size(); players.get(0) // Works
Java.from(players).length // Works, converts to a real JS arrayJava.from()IterableMap.entrySet().values()"ModuleName:SettingName"client.registerSlider("My Module", "Speed", 1, 0, 5, 0.1);
client.getNumber("My Module:Speed");client.hudProperty(hud, label)ctx.widthctx.heightclient.registerHud("Coords", { anchor: "Left Bottom", x: 4, y: 4 }, function (graphics, ctx) {
var text = "X " + Math.round(mc.player.getX());
render.drawString(graphics, text, ctx.x, ctx.y, 0xFFFFFFFF);
ctx.width = render.getStringWidth(text); // Required
ctx.height = render.fontHeight(); // Required
});partialTicksgetX()render.drawTag("§e" + p.getName().getString(), p, 0.4, { autoScale: true }); // Recommended
render.drawTag("§aSpawn", 100.5, 65, 200.5, {}); // Only use for fixed positions0xFF55FF550x55FF55§"§cRed""§lBold"events.on("tick", function () {
if (!client.isEnabled("My Module")) return;
// ...
});enabledisableevents.on("tick", function () { ... });
events.on("render3d", function (partialTicks) { ... });return trueevents.on("chat", function (text) {
return text === "secret"; // true = do not send
});events.on("movementInput", function (e) { e.jump = true; });
events.on("fov", function (e) { e.factor = 1.5; });returnon(...)types.d.tsrender2dgraphicsrender3drender.drawTagrender.drawBox| Feature | Example |
|---|---|
| Method Reference | |
| Direct class access via package name | |
| |
| |
| Automatic function-to-interface conversion (SAM) | |
| Anonymous classes | |
| Class inheritance / implementing multiple interfaces | |
| Call the parent class implementation in an overridden method |
| |
| |
| Iterating Java collections | |
| Object equality | |
| |
| Passing JS arrays to Java | Automatically converted to Java arrays or |
| Static fields | Read and write in real time, with type conversion based on field type (previously, reads returned snapshots); final fields are read-only |
client.getBool(...)var aura = moduleManager.getModule('Legit Aura');
aura.enabled = true; // Consistent with clicking the GUI (triggers notification)
aura.key = 'R'; // Supports key names
for (var p of aura.getProperties()) {
log(p.label, p.type, p.value, p.visible);
}
var mode = aura.getProperty('Mode');
mode.cycle(); // Single -> Switch
mode.children; // Only returns child settings visible under current conditionsmoduleManagergetModulegetModules(category?)getEnabledModulesgetCategoriesgetCategoryParentsgetProperty(id)hasModuleModulenamecategorycategoryParentcategoryLeafdescriptioniconinlinescriptkeyNameenabledkeytoggleenabledisablesetEnabled(v, silent)getPropertiesgetAllPropertiesgetPropertygetBindsbind(key, options)PropertyvaluetypedefaultValueminmaxincoptionsoptionIconshintconditionvisiblehiddenlabelparentchildrenswatchresettogglecycleselectdeselectisSelectedtoggleOptionReferenceErrorvar bind = keybindManager.add(aura, 'KP_8', { mode: 'hold' });
bind.key = 'MOUSE4';
bind.remove();
var m = macroManager.add('Message', { name: 'gg', message: '/hub', key: 'H' });
m.run();keybindManagergetBindsgetBindfind(target)addremovekeyCodekeyNameBindtargetkeymodevaluevisibleisModulemodulepropertyupdate()remove()macroManagergetMacrosgetMacroadd('Message' | 'Item', options)removerunMacronamekeymessageitemmatchrotationswitchModeyawOffsetpitchupdate()run()remove()| Event | Parameters | Description |
|---|---|---|
| | All mouse button presses/releases, return true to cancel |
| | Mouse wheel, return true to cancel (e.g., prevent hotbar switching) |
| | Character input (supports Chinese), return true to cancel |
| | All keyboard events (press 1 / release 0 / repeat 2), triggered in any interface, return true to consume the key |
keyinputgetMouseX/Yrender2dgetScreenWidth/HeightgetGuiScaleisMouseDownisKeyDownisMouseGrabbedsetMouseGrabbedisScreenOpenkeyCodekeyName'R''F5''LSHIFT''KP_9''NUMPAD9''M4''MOUSE4''key.keyboard.r'keyNamekeyCoderender.bloom(graphics, x, y, w, h, radius, color, spread, intensity)client.getUsername()client.getVersion()client.getMinecraftVersion()var id = events.onForge('LivingDeathEvent', function (e) { log(e.getEntity()); });
events.onForge('ClientChatReceivedEvent', function (e) { return /spam/.test(e.getMessage().getString()); }); // true = cancel
events.offForge(id);LivingDeathEventRenderGuiOverlayEvent.Prephase: 'pre' | 'post'receiveCanceledanyThreadsetTimeoutsetIntervalclearTimeoutclearIntervalqueueMicrotaskconst res = await fetch('https://example.com/api', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ a: 1 }),
});
const data = await res.json();followmanualerrorAbortControllerAbortSignalAbortSignal.timeoutanyres.bodyReadableStreamaccept-encoding: gzip, deflateRequestResponsejsonredirecterrorcloneHeadersURLURLSearchParamsBlobTextEncoderTextDecoderDOMExceptionconst server = Deno.serve({ port: 8080 }, async (req) => {
const url = new URL(req.url);
switch (url.pathname) {
case '/hello': return new Response('hi');
case '/echo': return Response.json(await req.json());
case '/sse': return new Response(new ReadableStream({
async pull(c) { await new Promise(r => setTimeout(r, 1000)); c.enqueue('data: tick\n\n'); },
cancel() { log('client left'); }
}), { headers: { 'content-type': 'text/event-stream' } });
default: return new Response('not found', { status: 404 });
}
});