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
// --- 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.