//================================================
// Планы:
// 1) Система уровней
// 2) Бонусы при новых уровнях
//================================================
#include <amxmodx>
#include <zombieplague>
#include <nvault>
#define TASK_ID__READ_DATA 9992
new Exp[MAX_PLAYERS+1];
new g_nvault = INVALID_HANDLE;
public plugin_init()
{
register_plugin("-", "1.0 Beta", "uYoxq");
register_clcmd("say /give", "GiveExp");
}
public plugin_end()
nvault_close(g_nvault);
public plugin_cfg() {
g_nvault = nvault_open("zp_advLevelSystem");
//Останавливаем плагин, если не удалось открыть бд.
if(g_nvault == INVALID_HANDLE)
set_fail_state("Не удалось открыть nVault: zp_advLevelSystem");
}
public plugin_natives(){
register_native("zp_get_user_exp", "native_zp_get_user_exp", 1);
}
public native_zp_get_user_exp(id) {
return Exp[id];
}
public GiveExp(id) {
Exp[id] += 100;
}
/*
Вместо 'client_connect', лучше использовать 'client_putinserver()' + задержку. Чтобы быть точно уверенным
в том, что на момент проверки игрок подключился к серверу.
*/
public client_putinserver(id) {
/* LoadData(id); */
Exp[id] = 0;
remove_task(id+TASK_ID__READ_DATA);
set_task(0.5,"TaskFunc__LoadData",id+TASK_ID__READ_DATA);
}
public TaskFunc__LoadData(id) {
//Получаем индекс зашедшего игрока
id -= TASK_ID__READ_DATA;
//Если игрок отключен - игнорируем
if(!is_user_connected(id))
return;
LoadData(id);
}
public client_disconnected(id) {
SaveData(id);
}
public SaveData(id) // <== Функция сохранения денег
{
new SteamID[64]/* SteamID[35] */ // <== Массив для хранения Steam_ID игрока(Используем размерность 64)
get_user_authid(id, SteamID, charsmax(SteamID)) // <== Получаем тот самый Steam_ID игрока, и сохраняем его в массиве SteamID
// Ниже получаем деньги игрока:
new szData[64];
//Форматируем число в строку
formatex(szData,charsmax(szData),"%i",Exp[id]);
//Записываем/обновляем запись в БД по ключу(в нашем случае стим)
nvault_set(g_nvault,SteamID,szData);
}
// Берём данные с файла 'zp_advLevelSystem.vault'
public LoadData(id) // <== Функция загрузки денег
{
new SteamID[64]/* SteamID[35] */ // <== Всё тот же, только новый массив для хранения стим айди игрока(Используем размерность 64)
get_user_authid(id, SteamID, charsmax(SteamID)) // <== Тут тоже всё тоже самое что и в сохранении денег, получаем steam_id игрока
new szData[64];
//Ставим условие, для выполнения которго в БД должна быть запись с указанным стимид
if(nvault_get(g_nvault,SteamID,szData,charsmax(szData))) {
//Если запись верна
//Задаём переменной 'Exp' значение.
//Важно понимать, что там это строка, а мы используем число, поэтому конвертируем строку в число
Exp[id] = str_to_num(szData);
//Обновляем время записи(понадобится, если вдруг захочешь использовать 'nvault_prune')
nvault_touch(g_nvault,SteamID);
}
}