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>
| Action | Alias | Mô 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, say | Bắt người chơi gửi tin lên chat: - 'chat: Hello Everyone!' |
title: | subtitle, send-title | Hiệ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: | action | Hiện text phía trên hotbar: - 'actionbar: &bĐã lưu!' |
tellraw: | json | Gử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-sound | Phá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-bar | Hiện bossbar (màu, style, thời gian). |
effect: | effects | Chạ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-lang | Gửi key từ file lang plugin (đa ngôn ngữ): - 'lang: Menu-Action-Effect' |
Chạy lệnh#2>
| Action | Alias | Ví 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: | operator | Chạ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, connect | Chuyển server qua BungeeCord/Velocity (cấu hình Options.Proxy): - 'server: Lobby' |
Điều khiển menu#2>
| Action | Alias | Mô tả |
|---|---|---|
close | shut | Đóng menu (chạy Events.Close). |
force-close | silent-close | Đóng menu im lặng — không chạy Events.Close. |
open: | open-gui, menu, trmenu | Mở menu khác: - 'open: Shop-Handler APPLE 10 1' (kèm tham số) hoặc - 'open: Browser:3' (trang 3). |
force-open: | silent-open | Mở menu im lặng — bỏ qua Events.Open. |
page: | set-page, layout, shape | Chuyể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-args | Xoá tham số menu. |
refresh: | icon-refresh | Tính lại sub-icon: - 'refresh: Bee', nhiều icon - 'refresh: A;B;C', toàn menu - 'refresh'. |
update: | icon-update | Vẽ 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ì. |
reset | resets | Reset cache animation của mọi icon về frame đầu. |
reload-inventory | rl-inv | Vẽ lại toàn bộ inventory (dùng sau khi sửa đồ của người chơi). |
retype | re-input, re-enter, re-peat | Chạy lại catcher nhập liệu cuối. |
set-agent | change-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ại | Biến | Lư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: [ ... ]
# 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'
money chỉ hook Vault; points hook PlayerPoints.
Alias chấp nhận: give/add/deposit, take/remove/withdraw, set/modify.
- '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'
max(totalWeights, 100) rồi đi cộng dồn qua các nhánh.else; tổng > 100 → các nhánh được chuẩn hoá tỷ lệ, else trở nên vô dụng.condition/deny/{chance=}.{chance=X} / {random=X} — đó là gate xác suất trên một action.- 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 |
|---|---|
type | CHAT (mặc định), SIGN, ANVIL, BOOK. |
validation | Regex full-match (fork) — input không khớp thì không lưu, chạy fail:. Xem Catcher. |
start / before | Reaction chạy khi mở catcher. |
fail / invalid / reject | Reaction khi validation từ chối (fork). |
cancel | Reaction khi hủy (gõ từ trong Action.Inputer.Cancel-Words hoặc đóng GUI với SIGN/ANVIL). |
end / after | Reaction sau khi nhập xong — đọc kết quả bằng biến {meta:input} / {meta:input-<stage>}. |
display | Tiêu đề hiển thị trên catcher. |
item-left / item-right | Item 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|end và q (regex, cấu hình được trong settings.yml).
Logic & script#2>
| Action | Mô tả |
|---|---|
delay: 60 | Trễ các action phía sau (ticks). Alias wait. |
return | Dừ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: / novascript | Chạ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'
conditionrỗng / không có = luôn đúng (hành vi fallback).denylà action chạy khi condition sai (ví dụ thông báo lỗi).- Kết quả của reaction là
falsenếu actionreturnđược chạy — vớiEvents.Opennghĩa là hủy mở menu. actionscó thể là chuỗi đơn hoặc list; keyallchỉ là tên thường dùng, mọi reaction trongactions:đề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ĩa | Ví 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.