Langsung ke konten utama
pemilik-serverskriptpluginpaper

Custom Command Skript: Argument, Permission, Cooldown, dan Tab-Complete

Naik level dari command sederhana ke yang rapi. Pelajari cara bikin custom command Skript: argument dan tipenya, argument opsional dan nilai default, permission, cooldown yang tahan restart, executable by dan aliases, plus tab-complete lewat SkBee. Contoh siap kamu coba.

Tim MSID6 menit baca
Daftar isi

Di sintaks dasar Skript kita sudah mengintip command seperti /heal dan /skor. Tapi command sungguhan biasanya butuh lebih: menerima input dari pemain (target, jumlah, nama warp), memeriksa siapa yang boleh menjalankannya, dan membatasi biar tidak di-spam. Semua itu diatur di dalam struktur command, dan kabar baiknya, Skript membuatnya ringkas.

Artikel ini membedah command dari kerangkanya sampai bagian yang sering bikin bingung: argument opsional, nilai default, cooldown yang tetap ada setelah restart, dan tab-complete. Semua contoh bisa langsung kamu tempel ke file .sk, jalankan /sk reload, lalu coba.

Kerangka sebuah command

Setiap command punya baris pembuka (nama dan argument-nya), sederet pengaturan opsional, lalu satu blok trigger: yang berisi kode yang benar-benar dijalankan. Hanya trigger yang wajib, sisanya kamu pakai seperlunya.

Anatomi sebuah command Skript. Baris pembuka command garis miring warp spasi kurung-sudut text menandai nama command warp dan satu argument bertipe text. Di bawahnya sederet field opsional: description dan usage untuk teks bantuan, permission dan permission message untuk izin, executable by untuk menentukan pemain atau konsol, aliases untuk nama alternatif, lalu cooldown beserta cooldown message dan cooldown storage untuk membatasi frekuensi. Terakhir blok trigger yang menjorok ke dalam, satu-satunya bagian yang wajib, berisi kode yang benar-benar dijalankan saat command dipakai.

Ini bentuk lengkapnya sebagai peta. Jangan hafalkan, cukup kenali polanya:

text
command /namacommand <argument>:
    description: Penjelasan singkat command
    usage: /namacommand <sesuatu>
    permission: server.namacommand
    permission message: Kamu tidak punya izin.
    executable by: players
    aliases: /nc
    cooldown: 5 seconds
    cooldown message: Tunggu %remaining time% lagi.
    cooldown storage: {cooldown::%player's uuid%}
    trigger:
        # kode di sini

Sekarang kita bahas bagian-bagiannya satu per satu.

Argument: memberi input ke command

Argument adalah nilai yang diketik pemain setelah nama command, misalnya nama warp di /warp spawn atau target di /heal Steve. Kamu mendeklarasikannya di baris pembuka dengan kurung sudut <...>, dan menyebut tipenya supaya Skript otomatis memvalidasi.

text
command /heal <player>:
    permission: server.heal
    trigger:
        set arg-1's health to 20
        send "Kamu memulihkan %arg-1%." to player
        send "Kamu dipulihkan oleh %player%." to arg-1

Di dalam trigger, argument pertama diakses lewat arg-1 (argument kedua arg-2, dan seterusnya). Tipe yang paling sering dipakai: <player> (pemain online), <text> (teks bebas), <integer> (bilangan bulat), <number> (angka desimal). Karena <player> sudah bertipe pemain, Skript otomatis menolak input yang bukan nama pemain online, jadi kamu tidak perlu mengeceknya sendiri.

Kalau kamu punya banyak argument, memberi nama lebih enak dibaca daripada arg-1 dan arg-2. Gunakan pola <nama:tipe>, lalu panggil sebagai variabel lokal {_nama}:

text
command /pay <target:player> <jumlah:integer>:
    trigger:
        send "Kamu mengirim %{_jumlah}% ke %{_target}%." to player

Argument opsional dan nilai default

Bungkus argument dengan kurung siku [...] untuk membuatnya opsional. Kalau pemain tidak mengisinya, argument itu jadi kosong (is not set).

Tiga bentuk argument command Skript berdampingan. Pertama argument wajib, ditulis kurung sudut player, harus diisi, dan kalau kosong command ditolak. Kedua argument opsional, kurung siku membungkus kurung sudut player, boleh kosong, dan kalau kosong maka arg-1 is not set alias tidak terisi. Ketiga argument opsional dengan nilai default, kurung siku membungkus player sama dengan persen player persen, boleh kosong, dan kalau kosong otomatis jadi diri sendiri. Contohnya, /feed mengenyangkan diri sendiri sedangkan /feed Alex mengenyangkan Alex.

text
command /kit [<text>]:
    trigger:
        if arg-1 is not set:
            send "Pakai: /kit <nama>" to player
            stop
        send "Kamu mengambil kit %arg-1%." to player

Sering kali kamu ingin argument opsional punya nilai bawaan. Tulis <tipe=nilai> di dalam kurung siku. Contoh klasik: command yang menyasar diri sendiri kalau target tidak disebut.

text
command /feed [<player=%player%>]:
    permission: server.feed
    trigger:
        set arg-1's food level to 10
        send "%arg-1% sudah kenyang." to player

/feed tanpa target akan mengenyangkan diri sendiri, sedangkan /feed Alex menyasar Alex. Satu catatan penting: nilai default %player% hanya masuk akal kalau ada pemain yang menjalankan command. Kalau command dijalankan dari konsol, player tidak ada, jadi argument itu tetap kosong. Batasi dengan executable by: players kalau memang cuma buat pemain.

Permission: siapa yang boleh

Field permission menentukan izin yang dibutuhkan. Pemain tanpa izin itu tidak bisa menjalankan command, dan mendapat permission message (kalau kamu isi).

text
command /umumkan <text>:
    description: Kirim pengumuman ke semua pemain
    permission: server.broadcast
    permission message: <red>Kamu belum boleh pakai ini.
    trigger:
        broadcast arg-1

Izin seperti server.broadcast kamu berikan ke rank tertentu lewat plugin permission. Kalau kamu belum menyetel rank dan izin, cara setup rank dan permission dengan LuckPerms menjelaskan pondasinya. Aturan praktis: beri nama izin yang konsisten (server.<fitur>), dan jangan membiarkan command berbahaya tanpa permission sama sekali.

Executable by, aliases, usage, description

Empat field kecil yang bikin command terasa rapi:

  • executable by membatasi siapa yang boleh menjalankan: players, console, atau players and console. Command yang memakai player di dalamnya sebaiknya players saja.
  • aliases memberi nama alternatif, misalnya aliases: /wp untuk /warp. Berguna untuk pintasan yang sudah biasa dipakai pemain.
  • usage adalah teks yang muncul saat pemakaian salah, contohnya /warp <nama>. Isi yang jelas supaya pemain tahu format yang benar.
  • description adalah keterangan singkat yang tampil di daftar bantuan server.

Cooldown: batasi frekuensi

Cooldown mencegah command di-spam. Field cooldown menerima rentang waktu, dan selama itu pemain tidak bisa mengulanginya.

text
command /warp <text>:
    permission: server.warp
    cooldown: 5 seconds
    cooldown message: <gray>Sabar, tunggu %remaining time% lagi.
    cooldown bypass: server.warp.bypass
    cooldown storage: {warp-cooldown::%player's uuid%}
    trigger:
        send "Teleport ke %arg-1%..." to player

Tiga hal yang bikin cooldown ini matang:

  • %remaining time% di dalam cooldown message otomatis diganti dengan sisa waktu. Ada juga %elapsed time% (waktu sejak pemakaian terakhir).
  • cooldown bypass adalah izin yang membebaskan pemegangnya dari cooldown, cocok untuk rank VIP atau staff.
  • cooldown storage menyimpan status cooldown ke sebuah variabel global. Tanpa ini, cooldown akan lupa saat server restart. Karena variabelnya global (perhatikan, tanpa garis bawah), datanya bertahan, persis seperti yang kita bahas di variabel global pada sintaks dasar. Gunakan player's uuid sebagai kunci, bukan nama, karena nama bisa berubah.

Tab-complete: saran saat menekan Tab

Tab-complete adalah daftar saran yang muncul saat pemain menekan Tab di tengah mengetik command. Ini bikin command terasa jauh lebih halus, apalagi kalau nama warp atau kit-nya banyak.

Perlu jujur soal satu hal: Skript inti belum menyediakan tab-complete custom untuk argument command-mu. Yang paling umum dipakai adalah event on tab complete dari SkBee, addon yang di pengenalan Skript sudah kita sebut sebagai nyaris wajib. Setelah SkBee terpasang, polanya seperti ini:

text
on tab complete of "/warp":
    set tab completions for position 1 to "spawn", "shop", "pvp"

Posisi 1 adalah argument pertama. Alih-alih daftar tetap, kamu juga bisa mengisinya dari sebuah list (misalnya semua nama warp yang tersimpan) supaya sarannya selalu ikut data terbaru. Sintaks persisnya bisa sedikit berbeda antar versi SkBee, jadi cek dokumentasi SkBee untuk versimu. Kita akan membahas SkBee lebih tuntas di artikel khusus nanti.

Contoh lengkap: sistem warp mini

Mari gabungkan semuanya jadi fitur nyata. Satu command untuk staff menyimpan warp, satu command untuk pemain memakainya.

text
command /setwarp <text>:
    description: Simpan lokasi berdiri sebagai warp
    permission: server.admin
    executable by: players
    trigger:
        set {warp::%arg-1%} to player's location
        send "<green>Warp '%arg-1%' disimpan." to player

command /warp <text>:
    description: Teleport ke sebuah warp
    usage: /warp <nama>
    permission: server.warp
    executable by: players
    cooldown: 5 seconds
    cooldown message: <gray>Tunggu %remaining time% lagi.
    cooldown storage: {warp-cooldown::%player's uuid%}
    trigger:
        if {warp::%arg-1%} is not set:
            send "<red>Warp '%arg-1%' tidak ada." to player
            stop
        teleport player to {warp::%arg-1%}
        send "<green>Selamat datang di %arg-1%!" to player

Perhatikan alurnya: /setwarp spawn menyimpan lokasimu ke variabel global {warp::spawn}. Karena global, warp itu tetap ada setelah restart. Lalu /warp spawn mengecek dulu apakah warp-nya ada (is not set), berhenti dengan stop kalau tidak, dan baru teleport kalau ada. Cooldown-nya tersimpan per pemain lewat UUID. Command yang matang selalu memeriksa input sebelum bertindak.

Kesalahan umum

  • Lupa stop. Setelah mengirim pesan error, hentikan trigger dengan stop, kalau tidak kode di bawahnya tetap jalan.
  • Salah nomor argument. arg-1 adalah yang pertama, bukan arg-0. Kalau argument-nya banyak, pakai nama (<target:player>) supaya tidak tertukar.
  • Cooldown tanpa cooldown storage. Tanpa itu, cooldown hilang tiap restart. Untuk cooldown yang serius, selalu simpan.
  • Command berat tanpa permission. Command yang mengubah dunia atau memberi item wajib dijaga permission, kalau tidak, semua orang bisa memakainya.
  • Memakai player padahal executable by: console. Kalau command bisa dari konsol, jangan berasumsi selalu ada player.

Langkah selanjutnya

Sekarang kamu bisa membuat command yang menerima input, menjaga izin, dan membatasi frekuensi, tulang punggung hampir semua fitur server.

Command tadi menyimpan warp dan cooldown sebagai variabel global. Di artikel berikutnya kita masuk ke penyimpanan data: ke mana sebenarnya variabel global itu disimpan, kapan file cukup, dan kapan kamu butuh database.

Sudah bikin command pertamamu? Pasang di servermu, lalu daftarkan dan kelola servermu di daftar server Minecraft Indonesia MSID supaya makin banyak yang datang mencobanya.

Baca juga