
В данной статье, я вам опишу, как сделать сохранение зомби класса по SQL.
Плюсы моей статьи от старой в том, что SQL используют больше людей в данный момент чем Vault, в том, что ваш сервер не будет падать (потому что в Vault если больше >1000 строк, сервер уже начнёт по немногу падать) и статья полная (в той статье не было написано про регистрации Переменных, а они там нужны). Не знаю, данный способ будет работать на ZP 5.0+ или нет, не тестировал.
Также, ниже я прикреплю файл с описанием как это всё сделать, чтобы у вас была нормальная стилистика. Код сохранения вырезал с Левел Системы bos'a93.
И так, давайте начнём.
Открываем для начала исходный код вашего мода и прописываем инклюд:
#include <sqlx>
(пишите это самостоятельно, потому что на сайте, то что взято в треугольные скобки/ковычки - не показывает)
Ниже добавляем всё это (заполните сами):
new Host[] = "192.168.0.1" // Адрес вашей базы
new User[] = "test_user" // Логин от вашей базы
new Pass[] = "test_password" // Пароль от вашей базы
new Db[] = "test_db" // Ваша дб
new szTable[] = "zp_class" // Таблица (называете сами, как вы захотите)
new Handle:g_SqlTuple
new g_Error[512]
Теперь ищем public plugin_init() и добавляем в любое место там это:
set_task(1.0, "MySql_Init")
Далее ищем public client_putinserver(id) и добавляем туда это:
Load_MySql(id)
Ниже там будет public fw_ClientDisconnect(id), туда добавляем:
Save_MySql(id)
Теперь ищем public menu_zclass(id, menuid, item) , ниже ищите:
g_zombieclassnext[id] = classid и под этим пишем это
Save_MySql(id)
Теперь это всё пихаете в любое место в коде, я же у себя засунул в конец кода:
public MySql_Init()
{
g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
if(SqlConnection == Empty_Handle)
set_fail_state(g_Error)
new Handle:Queries
Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS %s (steamid varchar(32),zclass INT(11))", szTable)
if(!SQL_Execute(Queries))
{
SQL_QueryError(Queries,g_Error,charsmax(g_Error))
set_fail_state(g_Error)
}
SQL_FreeHandle(Queries)
SQL_FreeHandle(SqlConnection)
}
public plugin_end()
{
SQL_FreeHandle(g_SqlTuple)
}
public Load_MySql(id)
{
new szSteamId[32], szTemp[512]
get_user_authid(id, szSteamId, charsmax(szSteamId))
new Data[1]
Data[0] = id
format(szTemp,charsmax(szTemp),"SELECT * FROM `%s` WHERE (`%s`.`steamid` = '%s')", szTable, szTable, szSteamId)
SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}
public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
if(FailState == TQUERY_CONNECT_FAILED)
{
log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error)
}
else if(FailState == TQUERY_QUERY_FAILED)
{
log_amx("Load Query failed. [%d] %s", Errcode, Error)
}
new id
id = Data[0]
if(SQL_NumResults(Query) < 1)
{
new szSteamId[32]
get_user_authid(id, szSteamId, charsmax(szSteamId))
if (equal(szSteamId,"ID_PENDING"))
return PLUGIN_HANDLED
new szTemp[512]
format(szTemp,charsmax(szTemp),"INSERT INTO `%s` ( `steamid` , `zclass`) VALUES ('%s',%i);", szTable, szSteamId, g_zombieclassnext[id])
server_print("%s", szTemp)
SQL_ThreadQuery(g_SqlTuple, "IgnoreHandle", szTemp)
}
else
{
new iClass, sClass[11]
iClass = SQL_FieldNameToNum(Query, "zclass")
SQL_ReadResult(Query, iClass, sClass, charsmax(sClass))
g_zombieclassnext[id] = str_to_num(sClass)
}
return PLUGIN_HANDLED
}
public Save_MySql(id)
{
new szSteamId[32], szTemp[512]
get_user_authid(id, szSteamId, charsmax(szSteamId))
format(szTemp,charsmax(szTemp), "UPDATE `%s` SET `zclass` = '%i' WHERE `%s`.`steamid` = '%s';", szTable, g_zombieclassnext[id], szTable, szSteamId)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
SQL_FreeHandle(Query)
return PLUGIN_HANDLED
}
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.