Wsamiaw · Scripting reference
Scripting reference (Markdown)
Full documentation in Markdown format. Use the formatted guide on Scripting for easier reading in the browser.
# Wsamiaw Scripting — JavaScript API
Wsamiaw embeds a **JavaScript** engine (Rhino). Each `*.js` file under `config/Wsa/scripts/` runs at boot,
listens to engine events, and can register its own ClickGUI **modules** with settings, keybinds,
Cloud/Local sync, render drawing and packets.
## Table of contents
1. [Where scripts live](#where-scripts-live)
2. [Cloud & Local](#cloud--local)
3. [Quick start](#quick-start)
4. [Script modules](#script-modules)
5. [Setting types](#setting-types)
6. [Event hooks](#event-hooks)
7. [Globals](#globals)
8. [render API](#render-api)
9. [Packets](#packets)
10. [Commands](#commands)
11. [Security](#security)
12. [Examples](#examples)
## Where scripts live
`config/Wsa/scripts/YourScript.js` — loaded at boot, reloaded with `.script reload`.
## Cloud & Local
In-game: **Cloud** tab → **Scripts** → **Cloud** / **Local** toggle (plus the separate **Local** tab).
Cloud rows download + run; Local rows apply/delete files on disk.
## Quick start
```js
var m = modules.register({
name: "HelloMod",
category: "Misc",
description: "Says hi",
settings: [
{name: "Range", type: "number", value: 3.0, min: 1.0, max: 6.0}
],
onEnable: function() { chat("HelloMod on"); },
onDisable: function() { chat("HelloMod off"); },
onTick: function(e) {
var aura = client.mod("KillAura");
if (aura !== null && aura.isEnabled()) {
chat("aura is on, range " + m.settingNum("Range"));
}
}
});
```
## Script modules
`modules.register(desc)` creates a real cheat module: ClickGUI, HUD/ArrayList, keybinds, configs.
Returns the module object. `modules.list()` returns names, `modules.get(name)` returns the module.
| Field | Type | Notes |
|---|---|---|
| `name` | string, required | Shown in ClickGUI/HUD |
| `category` | string | Combat / Movement / Render / Player / Misc / Settings (default Misc) |
| `description` | string | Tooltip text |
| `bind` | int | Keycode, 0 = none |
| `settings` | array | See below |
| `onEnable / onDisable` | function | Toggle callbacks |
| `onTick / onUpdate / onPacket / onRender2D / onRender3D` | function(e) | Only while enabled |
Runtime: `m.settingNum(name)`, `m.settingBool(name)`, `m.settingStr(name)`,
`m.setSetting(name, value)`, `m.isEnabled()`, `m.setEnabled(b)`.
Always use the typed getters — plain `setting()` returns a Java wrapper. Same rule everywhere: compare Java values (event types, names, ...) with `==` / `!=` (or `String(x)`), never `===` / `!==`.
## Setting types
| type | Fields | Example |
|---|---|---|
| `bool` | `value` | `{name:"Fast", type:"bool", value:true}` |
| `number` | `value, min, max` | `{name:"Range", type:"number", value:3.0, min:1.0, max:6.0}` |
| `int` | `value, min, max` | `{name:"Count", type:"int", value:2, min:0, max:10}` |
| `mode` | `value, options[]` | `{name:"Mode", type:"mode", value:0, options:["A","B"]}` |
| `color` | `value` (ARGB int) | `{name:"Tint", type:"color", value:0xFF7C5CFF}` |
| `text` | `value` | `{name:"Label", type:"text", value:"hi"}` |
## Event hooks
Global listeners: `events.on(name, fn)` — `update`, `tick`, `packet`, `render2d`, `render3d`.
| Event | e.getType() | Useful members |
|---|---|---|
| `update` | `PRE` / `POST` | `getYaw/getPitch/getNewYaw/getNewPitch`, `setRotation(yaw,pitch,prio)` |
| `tick` | `PRE` / `POST` | Per-tick logic, timers |
| `packet` | `SEND` / `RECEIVE` | `getPacket()`, `setCancelled(true)` |
| `render2d` | — | HUD drawing via `render.*` |
| `render3d` | — | World-space drawing, `getPartialTicks()` |
```js
events.on("packet", function(e) {
if (e.getType().toString() === "RECEIVE") {
var p = e.getPacket();
if (p instanceof Packages.net.minecraft.network.play.server.S02PacketChat) {
chat("chat packet seen");
}
}
});
```
## Globals
| Name | What it is |
|---|---|
| `mc` | Minecraft instance — `mc.thePlayer`, `mc.theWorld`, `mc.gameSettings`, … |
| `chat(msg)` | Send a chat message |
| `client.print(msg)` | Print to chat (local only) |
| `client.mod(name)` | Built-in module (`isEnabled()`, `setEnabled(b)`) or null |
| `client.getScriptName()` | This script's file name |
| `modules.register(desc)` / `modules.get(name)` / `modules.list()` | Script modules (see above) |
| `events.on(name, fn)` | Global hooks: `update, tick, packet, render2d, render3d` |
| `Packages.*` | Full Java access |
## render API
Call only during `render2d` / `render3d`. Colors are ARGB integers.
| Method | Notes |
|---|---|
| `render.rect(x1,y1,x2,y2,color)` | Filled rectangle |
| `render.rounded(x,y,w,h,radius,color)` | Rounded rectangle |
| `render.text(s,x,y,color)` | Vanilla font with shadow |
| `render.textNoShadow(s,x,y,color)` | Vanilla font, no shadow |
| `render.centerText(s,cx,y,color)` | Horizontally centered text |
| `render.textWidth(s)` | Pixel width for layout |
| `render.pill(x,y,w,h,bg,accent,text,textColor)` | ArrayList-style pill row with accent bar |
| `render.image(path,x,y,w,h)` | Draw classpath/resource image, e.g. `assets/wsamiaw/logo.png` |
| `render.push(x,y,scale,rotationDeg)` / `render.pop()` | Transform stack for custom animations |
| `render.screenWidth()` / `render.screenHeight()` | Scaled screen size for HUD layout |
| `render.time()`, `render.sin(v)`, `render.cos(v)` | Animation helpers (seconds, trig) |
### Custom HUD element
```js
var hud = modules.register({
name: "MyHud", category: "Render",
settings: [
{name: "Scale", type: "number", value: 1.0, min: 0.5, max: 2.0}
],
onRender2D: function(e) {
var s = hud.settingNum("Scale");
var w = 120 * s, h = 18 * s;
var x = render.screenWidth() - w - 6, y = 40;
render.pill(x, y, w, h, 0xB0101014, 0xFF7C5CFF, "MyHud", 0xFFFFFFFF);
}
});
```
## Packets
Inspect/cancel via the `packet` event; send via `mc` + `Packages`:
```js
var C01 = Packages.net.minecraft.network.play.client.C01PacketChatMessage;
mc.getNetHandler().addToSendQueue(new C01("hello"));
```
Serverbound: C01 chat, C02 use entity, C03 player, C07 dig, C08 place, C09 held item,
C0A swing, C0B action, C0D close, C0E click, C0F transaction, C10 creative, C13 abilities, C16 status.
Clientbound: S02 chat, S04 equipment, S06 health, S08 pos look, S12 velocity, S13 destroy,
S14 rel move, S18 teleport, S23 block change, S27 explosion, S29 sound, S2A particles,
S45 title, S48 resource pack, …
## Commands
| Command | Action |
|---|---|
| `.script list` | Loaded scripts + ON/OFF |
| `.script reload` | Reload all scripts |
| `.script load <name>` | Load one file |
| `.script unload <name>` | Unload (removes its modules) |
| `.script eval <js...>` | Run a snippet immediately |
Aliases: `.scripts`, `.js`
## Security
Scripts are **not sandboxed** — through `Packages` they can touch any Java/Minecraft API,
send packets and toggle modules. Only run code you wrote or fully trust. A throwing script
reports to chat and keeps running; unload it with `.script unload`.
## Examples
### AutoGG
```js
events.on("packet", function(e) {
if (e.getType().toString() !== "RECEIVE") return;
var p = e.getPacket();
var S02 = Packages.net.minecraft.network.play.server.S02PacketChat;
if (p instanceof S02) {
if (p.getChatComponent().getUnformattedText().indexOf("Victory") !== -1) chat("gg");
}
});
```
### Toggle HUD
```js
var m = modules.register({
name: "HudToggle", category: "Render",
onEnable: function() { client.mod("HUD").setEnabled(true); },
onDisable: function() { client.mod("HUD").setEnabled(false); }
});
```
### Aim readout
```js
events.on("render2d", function(e) {
var p = mc.thePlayer;
if (p !== null) render.text("yaw " + p.rotationYaw.toFixed(1), 4, 4, 0xFFFFFFFF);
});
```