JavaScript trong ShinnUI
ShinnUI nhúng Nashorn engine để chạy JS trực tiếp trong menu — condition, function
variable, action script đều dùng chung một môi trường với các helper utils.* và biến
gắn sẵn.
GraalJS: mặc định dùng Nashorn của JDK. Nếu bạn cần syntax ES6+ (arrow function,
let/const, template literal), cài plugin GraalJS và bật
Options.Scripts.Enable-GraalJS: true trong settings.yml — ShinnUI sẽ ưu tiên
engine graal.js khi có mặt.
Dùng ở đâu?#2>
| Nơi | Cú pháp |
|---|---|
| Condition | condition: 'js: điều_kiện' (prefix js: / javascript:) |
| Function variable | {js: biểu_thức} |
| Function node | Functions: tên: '{js: ...}' |
| PAPI (tắt sẵn) | %shinnui_js_biểu_thức% — cần Options.Placeholders.JavaScript-Parse: true |
| Action script | - 'js: utils.info("...")' hoặc trong catcher end: |
Biến & hàm có sẵn#2>
| Tên | Loại | Ý nghĩa |
|---|---|---|
player | Player | Người chơi đang được render. |
vars | Function | vars("{meta:key}") — lấy giá trị biến bất kỳ đã replace. |
varInt | Function | varInt(expr) — ép về số nguyên (NaN → 0). |
varDouble | Function | Ép số thực. |
varStr | Function | Ép chuỗi. |
funInt | Function | funInt("meta:input_taken") — gọi function variable rồi ép int. Được cache theo chuỗi trong 1 lần render. |
fun | Function | Gọi function variable không ép kiểu. |
utils | Object | Bộ helper (bảng dưới). |
java | Object | Truy cập class Java: java.lang.Math.max(1,2). |
args | Mảng | Args của function đang chạy (trong ${name_args}). |
Object utils#2>
| Phương thức | Ý nghĩa |
|---|---|
utils.info(msg) | In console log (debug). |
utils.isPlayerOnline(name) | Kiểm tra người chơi online. |
utils.getPlayer(name) | Lấy Player theo tên. |
utils.hasItem(player, matcher) | Đếm item khớp Item Matcher trên người. |
utils.isNumber(str) | Chuỗi có phải số không. |
utils.randomUUID() | UUID ngẫu nhiên. |
utils.check(statement) | Eval điều kiện (Kether/JS) trả boolean. |
utils.plugin(name) | Lấy Plugin instance theo tên. |
utils.javaPlugin(name) | Lấy JavaPlugin (bỏ proxy). |
Danh sách đầy đủ nằm trong source module/internal/script/Assist.kt — mọi phương thức
public của class này đều gọi được từ JS.
Ví dụ#2>
# Condition — kiểm tra người chơi nhập từ catcher có online
'x':
actions:
all:
- condition: 'js: utils.isPlayerOnline("{meta:input-target}")'
actions:
- 'tell: &aNgười nhận hợp lệ!'
deny:
- 'tell: &cNgười chơi không online.'
# Condition — tiền + item cùng lúc
condition: 'js: funInt("money *player") >= 500 && utils.hasItem(player, "material:EMERALD,amount:5") > 0'
// Function variable — format số tiền
{js: varInt("%vault_eco_balance%").toLocaleString("vi-VN")}
// Function — mức màu theo ping
Functions:
ping: '{js: varInt("%player_ping%") < 60 ? "&a" : "&c"}'
Hiệu năng: script JS được compile-cache theo chuỗi nguồn, nhưng việc eval vẫn tốn
chi phí mỗi frame render. Icon refresh 1 tick + lore JS phức tạp = lag. Với phép tính tĩnh,
dùng {node:} / Functions trả hằng; với điều kiện đơn giản, Kether
(money *500) nhanh hơn JS.
Hiệu năng: script JS được compile-cache theo chuỗi nguồn, nhưng việc eval vẫn tốn
chi phí mỗi frame render. Icon refresh 1 tick + lore JS phức tạp = lag. Với phép tính tĩnh,
dùng {node:} / Functions trả hằng; với điều kiện đơn giản, Kether
(money *500) nhanh hơn JS.