Knight docs
EN ID
GitHub

Gamemode Pertama

Bangun gamemode deathmatch kecil yang lengkap langkah demi langkah.

Panduan ini membuat team deathmatch kecil: dua tim, class, proteksi spawn, command skor, dan kill feed. Setiap bagian dijelaskan.

1. File

Buat Gamemodes/tdm.sa. Gamemode adalah satu file; tidak ada include wajib.

knight
#include <knight>   // opsional; native sudah built-in

// --- konfigurasi yang ditulis ke server.cfg ---------------------------
system::config() {
    server.name = "Knight TDM";
    server.max_players = 64;
    server.port = 7777;
    server.language = "Indonesian";
};

// --- state modul (dipakai semua callback) ------------------------------
let SPAWN_PROTECT_MS = 3000;
let protectionUntil = {};
let kills = {};
let deaths = {};
let teamScores = { "red": 0, "blue": 0 };

function now() { return GetTickCount(); }
function key(prefix, id) { return prefix + id; }

system::config() berjalan sebelum server mulai. Sisanya dideklarasikan di level modul dan dipakai bersama oleh semua callback.

2. Class untuk dua tim

knight
system::start() {
    SetGameModeText("Knight TDM");
    ShowPlayerMarkers(1);
    SetWeather(10);
    SetWorldTime(12);

    // AddPlayerClass(skin, x, y, z, angle, weapon1, ammo1, weapon2, ammo2, ...)
    // Tim Merah (skin 287) dan Tim Biru (skin 285) di spawn berbeda.
    AddPlayerClass(287, 1958.4, 1343.2, 15.4, 270.0, 24, 100, 31, 200);
    AddPlayerClass(285, 1965.0, 1343.2, 15.4, 90.0, 24, 100, 31, 200);

    Log("TDM siap");
};
Note
Index class adalah urutan pemanggilan AddPlayerClass. Engine mengirimnya kembali di player::request_class dan membiarkan pemain memilih lewat layar class biasa.

3. Sambutan dan pemilihan class

knight
player::connect(int playerid) {
    kills[key("k", playerid)] = 0;
    deaths[key("d", playerid)] = 0;
    SendClientMessage(playerid, "Selamat datang di Knight TDM!");
};

player::request_class(int playerid, int classid) {
    // Izinkan semua class; kembalikan false untuk memblokir pemilihan.
    return true;
};

player::spawn(int playerid) {
    let until = now() + SPAWN_PROTECT_MS;
    protectionUntil[key("p", playerid)] = until;
    SetPlayerHealth(playerid, 100.0);
    SetPlayerArmour(playerid, 50.0);
    SendClientMessage(playerid, "Proteksi spawn: {SPAWN_PROTECT_MS / 1000} detik");
};

4. Kill feed dan skor

knight
player::death(int playerid, Player killer, int reason) {
    deaths[key("d", playerid)] = GetPlayerScore(playerid);

    if (killer != null) {
        let kid = killer;
        kills[key("k", kid)] = GetPlayerScore(kid) + 1;
        SetPlayerScore(kid, GetPlayerScore(kid) + 1);
        GivePlayerMoney(kid, 100);
        SendClientMessage(kid, "Kamu membunuh {PlayerName(playerid)}");
    }

    SendClientMessage(playerid, "Kamu mati. Respawn...");
    SendDeathMessage(playerid, killer, reason);
};
Warning
killer bernilai null bila pemain mati karena jatuh, tenggelam, atau sebab dunia. Selalu cek null sebelum memakainya.

5. Command

knight
player::command("/stats") {
    SendClientMessage(playerid, "Kill: {kills[key(\"k\", playerid)]} | Mati: {deaths[key(\"d\", playerid)]}");
};

player::command("/heal") {
    SetPlayerHealth(playerid, 100.0);
    SendClientMessage(playerid, "Diheal.");
};

player::command("/tp", float x, float y, float z) {
    SetPlayerPos(playerid, x, y, z);
    SendClientMessage(playerid, "Teleport.");
};

6. Cek dan jalankan

bash
knight -check Gamemodes/tdm.sa
knight-server -cfg server.cfg -gamemode Gamemodes/tdm.sa

Hubungkan klien SA-MP 0.3.7, pilih class, spawn, lalu tembak. /stats menampilkan skor.

Tip
Baca halaman Callback dan Fungsi Native untuk mengembangkan gamemode ini.