Knight docs
EN ID
GitHub

Pemain & Autentikasi

Alur login, dialog, flag admin, dan state per pemain.

Knight tidak memaksakan kebijakan autentikasi. Alur login adalah pola yang Anda bangun dengan callback, dialog, dan database.

Alur login minimal

knight
let DIALOG_LOGIN = 100;
let DIALOG_REGISTER = 101;
let loggedIn = {};

system::start() {
    let db = sqlite_open("data/accounts.db");
    sqlite_exec(db, "CREATE TABLE IF NOT EXISTS accounts (name TEXT PRIMARY KEY, hash TEXT)");
};

player::connect(int playerid) {
    let db = sqlite_open("data/accounts.db");
    let r = sqlite_query(db, "SELECT name FROM accounts WHERE name = ?", PlayerName(playerid));
    if (r != null && cache_get_row_count(r) > 0) {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, 1, "Login", "Password:", "Login", "Batal");
    } else {
        ShowPlayerDialog(playerid, DIALOG_REGISTER, 1, "Daftar", "Pilih password:", "Daftar", "Batal");
    }
};

dialog::response(int playerid, int id, bool accepted, string input, int listitem) {
    if (id == DIALOG_REGISTER) {
        if (!accepted) { KickPlayer(playerid, "dibatalkan"); return; }
        let hash = hash_password(input);
        let db = sqlite_open("data/accounts.db");
        sqlite_exec(db, "INSERT INTO accounts VALUES (?, ?)", PlayerName(playerid), hash);
        loggedIn[PlayerName(playerid)] = true;
        SendClientMessage(playerid, "Terdaftar.");
        return;
    }
    if (id == DIALOG_LOGIN) {
        let db = sqlite_open("data/accounts.db");
        let r = sqlite_query(db, "SELECT hash FROM accounts WHERE name = ?", PlayerName(playerid));
        if (r != null && cache_get_row_count(r) > 0
            && verify_password(input, cache_get_value_name(r, 0, "hash"))) {
            loggedIn[PlayerName(playerid)] = true;
            SendClientMessage(playerid, "Berhasil login.");
        } else {
            ShowPlayerDialog(playerid, DIALOG_LOGIN, 1, "Login", "Password salah:", "Login", "Batal");
        }
    }
};

Membatasi class dan spawn

knight
player::request_class(int playerid, int classid) {
    return loggedIn[PlayerName(playerid)] == true;
};

player::request_spawn(int playerid) {
    return loggedIn[PlayerName(playerid)] == true;
};
Warning
Mengembalikan false dari request_class memblokir pemilihan; request_spawn mengembalikan false memberi tahu klien spawn ditolak.

State pemain dan getter

knight
SetPlayerHealth(playerid, 100.0);
SetPlayerArmour(playerid, 50.0);
GivePlayerMoney(playerid, 500);
SetPlayerScore(playerid, 10);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);

let hp = GetPlayerHealth(playerid);
let money = GetPlayerMoney(playerid);
let team = GetPlayerTeam(playerid);
let pos = GetPlayerPos(playerid);

Flag admin

knight
SetPlayerAdmin(playerid, true);
if (IsPlayerAdmin(playerid)) {
    SendClientMessage(playerid, "Kamu admin.");
}