Въпрос 1?
1.В коя функция да направя проверката client_connect или client_putinserver?
Намерих един урок [TUT] MySql - Запазване / Зареждане / Полезни неща
Свързан е с ник и добавянето и взимане на хп,но него никъде в него не се вкарва ехпт-о само никът на играч.
Код за потвърждение: Избери целия код
public MySql_Init()
{
//Казваме на API, че това е информацията към която е нужна за свързването
// just not yet. basically it's like storing it in global variables
//не още. Всъщност съхраняваме я във глобални променливи
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)
// Спираме плъгина с съобщение ГРЕШКА (Error)
set_fail_state(g_Error)
new Handle:Queries
// we must now prepare some random queries
// Сега трябва да се подготвим за някой произволни запитвания
Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS tutorial (steamid varchar(32),exp INT(11))")
if(!SQL_Execute(Queries))
{
// Ако има някакви проблеми плъгина ще се зададе като Bad Load (Лошо зареден - Плъгина няма да тръгне)
SQL_QueryError(Queries,g_Error,charsmax(g_Error))
set_fail_state(g_Error)
}
// Освобождаваме запитванията
SQL_FreeHandle(Queries)
// Освобождаваме всичко с SQL_FreeHandle
SQL_FreeHandle(SqlConnection)
}
new Handle:Queries // we must now prepare some random queries // Сега трябва да се подготвим за някой произволни запитвания Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS tutorial (steamid varchar(32),exp INT(11))")
Защо взимаме само никът?
Код за потвърждение: Избери целия код
public Load_MySql(id)
{
new szName[32], szTemp[512]
get_user_name(id, szName, charsmax(szName))
new Data[1]
Data[0] = id
//Сега ще вземем от таблица "tutorial" информация, когато Nick-a
format(szTemp,charsmax(szTemp),"SELECT * FROM `tutorial` WHERE (`tutorial`.`name` = '%s')", szName)
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 szName[32]
get_user_name(id, szName, charsmax(szName)) // Взимаме името на играча
// Ако още изчакваме не може да направим нищо
if (equal(szName,"ID_PENDING"))
return PLUGIN_HANDLED
new szTemp[512]
// Сега ще сложим нашите данни в нашата таблица
format(szTemp,charsmax(szTemp),"INSERT INTO `tutorial` ( `name` , `exp`)VALUES ('%s','0');",szName)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
else
{
// Ако няма намерени резултати
iExp[id] = SQL_ReadResult(Query, 1)
}
return PLUGIN_HANDLED
}
Код за потвърждение: Избери целия код
#include <amxmodx>
#include <sqlx>
#define PLUGIN "Tutorial"
#define VERSION "1.0"
#define AUTHOR "Just In Case"
// Ur Mysql Information - Тук попълвате данните на SQL сървърът ви
new Host[] = "hostname"
new User[] = "username"
new Pass[] = "password"
new Db[] = "database"
new Handle:g_SqlTuple
new g_Error[512]
new iExp[33]
// Pcvar-ове
new cKill
new cHeadshot
new cDeath
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("DeathMsg", "Event_DeathMsg", "a") // Register death event
// Регистрираме PCVAR-овете
cKill = register_cvar("exp_kill", "2")
cHeadshot = register_cvar("exp_headshot", "4")
cDeath = register_cvar("exp_death", "1")
}
public MySql_Init()
{
//Казваме на API, че това е информацията към която е нужна за свързването
// just not yet. basically it's like storing it in global variables
//не още. Всъщност съхраняваме я във глобални променливи
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)
// Спираме плъгина с съобщение ГРЕШКА (Error)
set_fail_state(g_Error)
new Handle:Queries
// we must now prepare some random queries
// Сега трябва да се подготвим за някой произволни запитвания
Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS tutorial (name varchar(32),exp INT(11))")
if(!SQL_Execute(Queries))
{
// Ако има някакви проблеми плъгина ще се зададе като Bad Load (Лошо зареден - Плъгина няма да тръгне)
SQL_QueryError(Queries,g_Error,charsmax(g_Error))
set_fail_state(g_Error)
}
// Освобождаваме запитванията
SQL_FreeHandle(Queries)
// Освобождаваме всичко с SQL_FreeHandle
SQL_FreeHandle(SqlConnection)
}
public plugin_end()
{
SQL_FreeHandle(g_SqlTuple)
}
public Save_MySql(id)
{
new szName[32], szTemp[512]
get_user_name(id, szName, charsmax(szName))
// Тук ще ъпдейтваме XP-то на играча но само ако името съвпадне с някое от имената в таблицата
format(szTemp,charsmax(szTemp),"UPDATE `tutorial` SET `exp` = '%i' WHERE `tutorial`.`name` = '%s';",iExp[id], szName)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
public Load_MySql(id)
{
new szName[32], szTemp[512]
get_user_name(id, szName, charsmax(szName))
new Data[1]
Data[0] = id
//Сега ще вземем от таблица "tutorial" информация, когато Nick-a
format(szTemp,charsmax(szTemp),"SELECT * FROM `tutorial` WHERE (`tutorial`.`name` = '%s')", szName)
SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}
public Event_DeathMsg()
{
new iKiller = read_data(1) // Взимаме информация за убиеца и жертвата
new iVictim = read_data(2)
if(is_user_alive(iKiller)) // Проверяваме дали убиеца е жив в случай, че се е самоубил
{
if(read_data(3)) // Проверяваме дали е HEADSHOT
{
iExp[iKiller] += get_pcvar_num(cHeadshot) // Добавяме PCvar стойността за HEADSHOT към iExp (XP-то)
}
else
{
iExp[iKiller] += get_pcvar_num(cKill)
}
}
iExp[iVictim] -= get_pcvar_num(cDeath) // Махаме стойността при смърт (от PCVAR-a за взимане на XP при смърт)
}
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 szName[32]
get_user_name(id, szName, charsmax(szName)) // Взимаме името на играча
// Ако още изчакваме не може да направим нищо
if (equal(szName,"ID_PENDING"))
return PLUGIN_HANDLED
new szTemp[512]
// Сега ще сложим нашите данни в нашата таблица
format(szTemp,charsmax(szTemp),"INSERT INTO `tutorial` ( `name` , `exp`)VALUES ('%s','0');",szName)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
else
{
// Ако няма намерени резултати
iExp[id] = SQL_ReadResult(Query, 1)
}
return PLUGIN_HANDLED
}