ShinnUI wiki
Trang chủ/Biến & Script/JavaScript

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ơiCú pháp
Conditioncondition: 'js: điều_kiện' (prefix js: / javascript:)
Function variable{js: biểu_thức}
Function nodeFunctions: 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ênLoạiÝ nghĩa
playerPlayerNgười chơi đang được render.
varsFunctionvars("{meta:key}") — lấy giá trị biến bất kỳ đã replace.
varIntFunctionvarInt(expr) — ép về số nguyên (NaN → 0).
varDoubleFunctionÉp số thực.
varStrFunctionÉp chuỗi.
funIntFunctionfunInt("meta:input_taken") — gọi function variable rồi ép int. Được cache theo chuỗi trong 1 lần render.
funFunctionGọi function variable không ép kiểu.
utilsObjectBộ helper (bảng dưới).
javaObjectTruy cập class Java: java.lang.Math.max(1,2).
argsMảngArgs 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.