ShinnUI wiki
Trang chủ/Menu/Action

Action

Action là từng lệnh nhỏ chạy khi có sự kiện (mở menu, click icon, task…). Viết dạng chuỗi 'tên: nội dung'; nhiều action là một danh sách. Danh sách dưới đây lấy trực tiếp từ regex của source — bao gồm cả alias.

Mọi chuỗi action không khớp type nào sẽ được chạy như Kether script (default action là kether). Vì vậy 'tell *"hi"' hoặc cả khối if ... then { ... } đều hợp lệ mà không cần prefix.

Ghép action trên một dòng: dấu &&& (hoặc _|||_) tách nhiều action trong cùng một chuỗi — chạy tuần tự: - 'close &&& open: Other'. Hữu ích khi cần close rồi open menu khác liền mạch.

Gửi nội dung#2>
ActionAliasMô tả & ví dụ
tell:message, msg, talk Gửi tin nhắn cho người chơi. Dùng ; để tách nhiều dòng, \n cho xuống dòng:
- 'tell: Hello There;Second line!'
chat:send, sayBắt người chơi gửi tin lên chat: - 'chat: Hello Everyone!'
title:subtitle, send-titleHiện title + subtitle. Tham số cuối: FadeIn Stay FadeOut (ticks, tùy chọn).
- 'title: `&c&lTiêu đề` `&7Phụ đề` 15 20 15' — dùng backtick để chứa khoảng trắng.
actionbar:actionHiện text phía trên hotbar: - 'actionbar: &bĐã lưu!'
tellraw:jsonGửi JSON component hoặc build nhanh:
- 'json: {"text":"Hello"}'
- 'json: &3Mua rank <&2&nstore@url=https://store.example.net>' — cú pháp <text@click=command=/spawn@hover=Nhấp vào>.
sound:play-soundPhát sound TÊN-volume-pitch, nhiều sound ngăn cách bởi ;:
- 'sound: BLOCK_CHEST_OPEN-1-0;ENTITY_PLAYER_LEVELUP-1-1'
bossbar:boss-barHiện bossbar (màu, style, thời gian).
effect:effectsChạy Effect-Pack đặt tên trong settings.yml: - 'effect: levelup'. Nhiều pack ngăn cách ;: - 'effect: buy;levelup'. Pack chứa sound: (NAME-volume-pitch) và/hoặc particle: ('NAME; count dx dy dz speed') — chỉ người chơi liên quan thấy.
lang:send-lang, tell-langGửi key từ file lang plugin (đa ngôn ngữ): - 'lang: Menu-Action-Effect'

Chạy lệnh#2>
ActionAliasVí dụ
command:cmd, player, execute- 'command: spawn ; say I am Back' — nhiều lệnh ngăn cách ;.
console:- 'console: lp user %player_name% permission set vip.user'
op:operatorChạy lệnh với tư cách OP. Có quyền shinnui.admin sẽ dùng OP thật (khi menu đặt fake-op=false); ngược lại fake-op.
server:bungee, connectChuyển server qua BungeeCord/Velocity (cấu hình Options.Proxy): - 'server: Lobby'

Điều khiển menu#2>
ActionAliasMô tả
closeshutĐóng menu (chạy Events.Close).
force-closesilent-closeĐóng menu im lặng — không chạy Events.Close.
open:open-gui, menu, trmenuMở menu khác: - 'open: Shop-Handler APPLE 10 1' (kèm tham số) hoặc - 'open: Browser:3' (trang 3).
force-open:silent-openMở menu im lặng — bỏ qua Events.Open.
page:set-page, layout, shapeChuyển trang layout: - 'page: 1' hoặc - 'page: %shinnui_menu_next%'.
set-title:Đổi tiêu đề menu đang mở. Có thể bị title động ghi đè.
set-arguments:set-argsĐổi tham số menu: - 'set-arguments: Custom\sArgument 10 Hello' (\s = khoảng trắng).
clear-arguments:del-args, cls-argsXoá tham số menu.
refresh:icon-refreshTính lại sub-icon: - 'refresh: Bee', nhiều icon - 'refresh: A;B;C', toàn menu - 'refresh'.
update:icon-updateVẽ lại phần hiển thị (name/lore/texture) của icon theo ID — dùng khi lore có biến cần cập nhật tức thì.
resetresetsReset cache animation của mọi icon về frame đầu.
reload-inventoryrl-invVẽ lại toàn bộ inventory (dùng sau khi sửa đồ của người chơi).
retypere-input, re-enter, re-peatChạy lại catcher nhập liệu cuối.
set-agentchange-agentĐổi "placeholder player" — người chơi mà các biến (như %player_name%) hiển thị.
set-propertyĐổi thuộc tính runtime của menu.

Dữ liệu — Meta / Data / GlobalData#2>
LoạiBiếnLưu trữ
Meta{meta:key} / %shinnui_meta_key%Tạm thời trong RAM — mất khi restart. Nhanh nhất, dùng cho trạng thái menu.
Data{data:key} / %shinnui_data_key%Lưu database (SQLite/MySQL), theo người chơi — cross-restart, có thể cross-server.
GlobalData{gdata:key} / %shinnui_globaldata_key%File/global table — chung cho cả server, không theo người chơi; sync định kỳ qua Global-Data-Sync.
# Meta (tạm)
- 'set-meta: customKey customValue'
- 'set-meta: key1 value1; key2 value 2'   # nhiều cặp
- 'del-meta: customKey'
- 'del-meta: (?i)customs?-?(meta|key)'    # regex!

# Data (lưu DB)
- 'set-data: coins 120'
- 'del-data: coins'

# GlobalData (chung server)
- 'set-global-data: shop_open 1'
- 'del-global-data: shop_open'

Vật phẩm & kinh tế#2>

give-item / take-item#3>
# Trừ 64 diamond (dùng Item Matcher)
- 'take-item: material:DIAMOND,amount:64'

# Trừ nhiều loại: 64 sắt + 32 vàng
- 'take-item: material:IRON_INGOT,amount:64;material:GOLD_INGOT,amount:32'

# Cho item
- 'give-item: material:DIAMOND,amount:32,name:&bCustom Diamond'

input — commit đồ kéo vào GUI (fork)#3>
actions:
  all:
    - 'input'                    # Trừ đồ đã buffer trong các slot Input
    - 'condition: js: funInt("meta:input_taken") >= 10'
      actions: [ ... ]
      deny: [ ... ]

Action input (alias input-take) là eval action: chạy đồng bộ ngay lập tức, set meta input_taken (số đồ thực trừ được) và input_missing (danh sách thiếu) — sau đó bạn tự xử lý phản hồi bằng condition/deny. Chi tiết ở Input Menu.

Vault / PlayerPoints#3>
- 'give-money: 100'
- 'take-money: 100'
- 'set-money: 500'
- 'give-points: 10'
- 'take-points: 10'
- 'set-points: 50'

# meco (MeowEco) — đa tiền tệ
- 'meco-give:  '
- 'meco-take:  '

money chỉ hook Vault; points hook PlayerPoints. Alias chấp nhận: give/add/deposit, take/remove/withdraw, set/modify.

Chỉnh sửa item đang cầm#3>
- 'enchant-item: sharpness 5'     # phù phép item trên tay
- 'repair-item'                    # sửa độ bền
- 'edit-item: name &bSuper Sword'  # sửa name/lore item trên tay

random — chọn nhánh theo trọng số (fork)#2>
- random:
    10:
      - 'tell: &a&lJACKPOT! &fBạn trúng giải đặc biệt'
      - 'sound: ENTITY_PLAYER_LEVELUP-1-1'
    25:
      - 'tell: &7Bạn nhận được phần thưởng nhỏ'
    else:
      - 'tell: &8Chúc bạn may mắn lần sau'
  • Mỗi lần chạy roll đúng một nhánh: roll trên max(totalWeights, 100) rồi đi cộng dồn qua các nhánh.
  • Trọng số là hằng số tĩnh (parse lúc load menu — không hỗ trợ placeholder).
  • Tổng < 100 → phần dư rơi vào else; tổng > 100 → các nhánh được chuẩn hoá tỷ lệ, else trở nên vô dụng.
  • Mỗi nhánh là reaction chuẩn — lồng được condition/deny/{chance=}.
  • Khác với option inline {chance=X} / {random=X} — đó là gate xác suất trên một action.

Catcher — nhập liệu#2>
- catcher:
    amount:
      type: SIGN            # CHAT | SIGN | ANVIL | BOOK
      start: 'actionbar: &b&lNhập số lượng'
      cancel: 'tell: &8Đã hủy'
      end:
        - 'set-args: {0} {1} `${js: Math.min(Math.max(varInt("{meta:input}"), 1), 64)}`'
        - 'open: Shop-Handler-Purchase'
KeyÝ nghĩa
typeCHAT (mặc định), SIGN, ANVIL, BOOK.
validationRegex full-match (fork) — input không khớp thì không lưu, chạy fail:. Xem Catcher.
start / beforeReaction chạy khi mở catcher.
fail / invalid / rejectReaction khi validation từ chối (fork).
cancelReaction khi hủy (gõ từ trong Action.Inputer.Cancel-Words hoặc đóng GUI với SIGN/ANVIL).
end / afterReaction sau khi nhập xong — đọc kết quả bằng biến {meta:input} / {meta:input-<stage>}.
displayTiêu đề hiển thị trên catcher.
item-left / item-rightItem trang trí hai bên (ANVIL/SIGN).

Sau khi catcher chạy xong, {meta:input} giữ nội dung nhập cuối cùng. Từ hủy mặc định: cancel|quit|endq (regex, cấu hình được trong settings.yml).

Logic & script#2>
ActionMô tả
delay: 60Trễ các action phía sau (ticks). Alias wait.
returnDừng toàn bộ action phía sau + reaction trả về false (cancel event). Alias break.
js:Chạy JavaScript: - 'js: player.sendMessage("Hello")'.
kether: / ke:Chạy Kether: - 'ke: tell *"Hello"'.
jexl:Chạy Apache JEXL expression.
nova: / novascriptChạy NovaScript (nếu cài NovaScript).
run: / function:Gọi function nội bộ (Functions: của menu).

Reactions — nhóm action có điều kiện#2>

Thay vì một danh sách phẳng, bạn có thể viết "phản ứng có điều kiện" — mỗi reaction gồm condition + actions + deny:

actions:
  all:
    - condition: 'js: utils.chance(0.1)'
      actions:
        - 'tell: &6Jackpot! Giải nhất'
        - 'return'
    - condition: 'js: utils.chance(0.5)'
      actions:
        - 'tell: &aGiải nhì'
        - 'return'
    - condition: ''
      actions:
        - 'tell: &7Chúc bạn may mắn lần sau'
  • condition rỗng / không có = luôn đúng (hành vi fallback).
  • deny là action chạy khi condition sai (ví dụ thông báo lỗi).
  • Kết quả của reaction là false nếu action return được chạy — với Events.Open nghĩa là hủy mở menu.
  • actions có thể là chuỗi đơn hoặc list; key all chỉ là tên thường dùng, mọi reaction trong actions: đều chạy lần lượt theo thứ tự.

Tham số cho từng action#2>

Gắn tham số ở cuối action bằng cú pháp {key=value}:

Tham sốÝ nghĩaVí dụ
{delay=TICKS}Trễ action này- 'tell: Tin nhắn trễ {delay=20}'
{chance=X}Chỉ chạy với xác suất X (0→1)- 'give-item: material:DIAMOND {chance=0.8}'
{condition=Expr}Chỉ chạy khi điều kiện đúng- 'tell: Tin VIP {condition=perm *user.vip}'
{players=Expr}Chạy cho tất cả online thoả điều kiện (broadcast)- 'tell: Thông báo toàn server {players: perm *admin}'

Nhầm lẫn hay gặp: {condition=...} là tham số gắn trên một action; còn condition: là key của reaction. Cả hai đều dùng cùng ngôn ngữ biểu thức điều kiện.