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.");
}