Пример плагина: Сохранение данных в nvault (nvault.inc)
Пример: сохранение убийств/смертей через nvault
<nvault> — встроенное хранилище ключ-значение. Сохраняет данные между перезапусками сервера. Идеально для: личной статистики денег, уровней, настроек игрока. Медленнее чем MySQL зато не требует внешнего SQL-сервера.
Что делает плагин
- Сохраняет для каждого игрока его frags/deaths поверх встроенного счётчика scoreboard.
- При входе загружает данные и дописывает к текущим.";
Полный код плагина
#include <amxmodx>
#include <nvault>
new g_vault;
// Будем хранить frags и deaths каждого игрока в формате "frags|deaths"
// Ключ в nvault: steamid игрока
public plugin_init()
{
register_plugin("NVault Stats", "1.0", "WikiExample");
g_vault = nvault_open("wiki_stats");
if (g_vault == INVALID_HANDLE)
{
log_amx("[WikiStats] Не удалось открыть nvault!");
return;
}
register_event("DeathMsg", "event_death", "a");
register_clcmd("say /mystats", "cmd_mystats");
}
public plugin_end()
{
if (g_vault != INVALID_HANDLE)
nvault_close(g_vault);
}
public client_putinserver(id)
{
if (is_user_bot(id)) return;
new authid[35];
get_user_authid(id, authid, charsmax(authid));
new raw[16];
if (nvault_get(g_vault, authid, raw, charsmax(raw)))
{
new saved_frags[8], saved_deaths[8];
parse(raw, saved_frags, charsmax(saved_frags),
saved_deaths, charsmax(saved_deaths));
new fr = str_to_num(saved_frags);
new dt = str_to_num(saved_deaths);
// Добавляем сохранённые к текущим (текущие = 0 на connect, так что это и есть старт)
client_print(id, print_chat, "[WikiStats] Загружено: %d убийств, %d смертей.", fr, dt);
}
}
public event_death()
{
new killer = read_data(1);
new victim = read_data(2);
if (!is_user_connected(killer) || !is_user_connected(victim)) return;
// Сохраняем текущий frags/deaths после события
save_stats(killer);
save_stats(victim);
}
save_stats(id)
{
new authid[35];
get_user_authid(id, authid, charsmax(authid));
new fr = get_user_frags(id);
new dt = get_user_deaths(id);
new raw[16];
formatex(raw, charsmax(raw), "%d|%d", fr, dt);
nvault_set(g_vault, authid, raw);
}
public cmd_mystats(id)
{
new fr = get_user_frags(id);
new dt = get_user_deaths(id);
client_print(id, print_chat, "[WikiStats] Frags=%d, Deaths=%d", fr, dt);
return PLUGIN_HANDLED;
}
Ключевые функции nvault.inc
nvault_open("name")— открывает/создаёт vault. ВозвращаетINVALID_HANDLEпри ошибке.nvault_close(handle)— закрывает (в plugin_end).nvault_set(handle, key, value)— записывает строку (key/value).nvault_get(handle, key, buffer, len)— читает, возвращает длину или 0.nvault_remove(handle, key)— удаляет ключ.nvault_prune(handle, start, end)— массовая чистка по timestamp.
Ключ = SteamID: используем get_user_authid, для не-Steam можно get_user_ip(id, ..., 1).
Подробные инструкции и обсуждения ждём вас на нашем форуме — в разделе CS 1.6.