За пример ще ползваме прост плъгин за XP Mod.
Внимание, имайте предвид, че за да разберете нещо трябва да имате познания по PAWN.
Ще започнем с главната част от плъгина.
Код за потвърждение: Избери целия код
#include <amxmodx>
#define PLUGIN "Tutorial"
#define VERSION "1.0"
#define AUTHOR "Just In Case"
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 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) // Махаме стойността при смърт
}
Първо вкарваме библиотеката :
Код за потвърждение: Избери целия код
#include <sqlx>
Код за потвърждение: Избери целия код
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)
}
Код за потвърждение: Избери целия код
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`.`steamid` = '%s';",iExp[id], szSteamId)
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`.`steamid` = '%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 szSteamId[32]
get_user_authid(id, szSteamId, charsmax(szSteamId)) // get user's steamid
// Ако още изчакваме не може да направим нищо
if (equal(szSteamId,"ID_PENDING"))
return PLUGIN_HANDLED
new szTemp[512]
// Сега ще сложим нашите данни в нашата таблица
format(szTemp,charsmax(szTemp),"INSERT INTO `tutorial` ( `steamid` , `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
}
Добре е да знаете също :
Взимане на Ранк:
Код за потвърждение: Избери целия код
public Show_Rank(id) // Трябв да регистрирате команда за тази функция
{
for(new i; i < MaxPlayers; i++)
{
if(is_user_connected(i))
Save_MySql(i) // Запазваме всички данни за да дадем точен rank
}
new Data[1]
Data[0] = id
new szTemp[512]
format(szTemp,charsmax(szTemp),"SELECT COUNT(*) FROM `tutorial` WHERE `exp` >= %d", Exp[id])
// Select the count where the exp is matching or higher (Incase of equal exp)
// Избираме броя където XP-то е еднакво или по високо ( В случай с еднакво XP )
SQL_ThreadQuery(g_SqlTuple,"Sql_Rank",szTemp,Data,1)
return PLUGIN_CONTINUE
}
public Sql_Rank(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 count = 0
count = SQL_ReadResult(Query,0)
if(count == 0)
count = 1
new id
id = Data[0]
client_print(id, print_chat, "You're rank is %i with %i exp", count, Exp[id]); //Съобщението с което изписваме на играча, кой ранк е
return PLUGIN_HANDLED
}
Код за потвърждение: Избери целия код
//Пример
Queries[0] = SQL_PrepareQuery(SqlConnection, "CREATE TABLE IF NOT EXISTS %s (name varchar(32), yourfloat FLOAT(11,3))", szTableName);
// ПЛАВАЩО число ( 11,3 )
// 11 = Максималното число
// 3 = Максималното число зад запетаята
// Зареждане на информация
new Float: FloatA = 11,3
SQL_ReadResult( Query, Column, FloatA );
Код за потвърждение: Избери целия код
new szTemp[256], Data[1];
Data[0] = id
format(szTemp,charsmax(szTemp),"DELETE FROM `%s` WHERE `Name` = '%s'", szMainTable, szName);
SQL_ThreadQuery(SqlTuple,"IgnoreHandle",szTemp,Data,1);
- SQL сървърът ви не поддържа външни връзки.
- 1 от 4 данни за връзка са грешни (username, password, hostname, databasename)
Ако имате някакви допълнения ще се радвам да ги споделите за да може да ги добавим към урока.
Ако откриете грешки ги споделете за да ги отстраня.
Урокът е взет от ТУК
Преведен е от мен : JustInCase
И ЗАБРАНЯВАМ КОПИРАНЕТО НА ПРЕВОДА ПО ДРУГИ САЙТОВЕ И ФОРУМИ !!!