Главная Новости Услуги Форум | База знаний

Вверх

Меню
Пользователей онлайн
Онлайн игроков: 60

Пример плагина: Сохранение данных в 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.
Назад