#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required
#define PREFIX "\x04[Статистика]\x01"
Database g_hDatabase;
int g_iClientID[MAXPLAYERS+1], g_iKills[MAXPLAYERS+1], g_iDeaths[MAXPLAYERS+1], g_iPoints[MAXPLAYERS+1], g_iManyKills[MAXPLAYERS+1];
public void OnPluginStart()
{
if(SQL_CheckConfig("players")) Database.Connect(GotDatabase, "players");
else SetFailState("Не удалось найти секцию \"players\" в databases.cfg");
HookEvent("player_death", Event_PlayerDeath);
RegConsoleCmd("sm_rank", ShowRank);
}
public Action ShowRank(int client, int args) {
if (client && IsClientInGame(client)) {
PrintToChatAll("%s %N позиция %d из %d игроков с %d поинтами, убийств %d, смертей %d.", PREFIX, client, 1, 1, g_iPoints[client], g_iKills[client], g_iDeaths[client]);
}
return Plugin_Handled;
}
public void GotDatabase(Database db, char[] sError, any data)
{
if (db == null)
{
SetFailState("Не удалось подключиться к базе: %s", sError);
}
else
{
g_hDatabase = db;
CreateTables();
}
}
void CreateTables()
{
SQL_LockDatabase(g_hDatabase);
g_hDatabase.Query(SQL_Callback_CheckError, "CREATE TABLE IF NOT EXISTS `players` (\
`id` INT NOT NULL AUTO_INCREMENT,\
`steamid` VARCHAR(32) NOT NULL,\
`user` VARCHAR(32) NOT NULL,\
`points` INT UNSIGNED NOT NULL default 0,\
`deaths` INT UNSIGNED NOT NULL default 0,\
`kills` INT UNSIGNED NOT NULL default 0,\
PRIMARY KEY (`id`)\
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1;");
SQL_UnlockDatabase(g_hDatabase);
g_hDatabase.SetCharset("utf8");
}
public void SQL_Callback_CheckError(Database hDatabase, DBResultSet results, const char[] sError, any data)
{
if(sError[0])
{
LogError("SQL_Callback_CheckError: %s", sError);
}
}
public void OnClientPostAdminCheck(int iClient)
{
if(IsFakeClient(iClient) == false)
{
char sQuery[256], sAuth[32];
GetClientAuthId(iClient, AuthId_Engine, sAuth, sizeof(sAuth), true);
FormatEx(sQuery, sizeof(sQuery), "SELECT `id`, `points`, `deaths`, `kills` FROM `players` WHERE `steamid` = '%s' LIMIT 1;", sAuth);
g_hDatabase.Query(SQL_Callback_SearchClient, sQuery, GetClientUserId(iClient));
}
}
public void SQL_Callback_SearchClient(Database hDatabase, DBResultSet results, const char[] sError, any UserID)
{
if(sError[0])
{
LogError("SQL_Callback_SearchClient: %s", sError);
return;
}
int iClient = GetClientOfUserId(UserID);
if(iClient)
{
if(results.FetchRow()) // Игрок есть в базе
{
g_iClientID[iClient] = results.FetchInt(0); // results.FetchString(0, szBuffer, sizeof(szBuffer));
g_iPoints[iClient] = results.FetchInt(1);
g_iDeaths[iClient] = results.FetchInt(2);
g_iKills[iClient] = results.FetchInt(3);
}
else // Игрока нет в базе
{
char sQuery[256], sAuth[32], sName[MAX_NAME_LENGTH*2+1];
GetClientAuthId(iClient, AuthId_Engine, sAuth, sizeof(sAuth), true);
GetClientName(iClient, sQuery, MAX_NAME_LENGTH);
g_hDatabase.Escape(sQuery, sName, sizeof(sName));
FormatEx(sQuery, sizeof(sQuery), "INSERT INTO `players` (`steamid`, `user`) VALUES ('%s', '%s');", sAuth, sName);
g_hDatabase.Query(SQL_Callback_CreateClient, sQuery, GetClientUserId(iClient));
}
}
}
public void SQL_Callback_CreateClient(Database hDatabase, DBResultSet results, const char[] sError, any UserID)
{
if(sError[0])
{
LogError("SQL_Callback_CreateClient: %s", sError);
return;
}
int iClient = GetClientOfUserId(UserID);
if(iClient)
{
g_iClientID[iClient] = results.InsertId;
}
}
public void OnClientDisconnect(int iClient)
{
g_iClientID[iClient], g_iPoints[iClient], g_iDeaths[iClient], g_iKills[iClient], g_iManyKills[iClient] = 0;
char sQuery[256];
FormatEx(sQuery, sizeof(sQuery), "UPDATE `players` SET `points` = %i, `kills` = %i, `deaths` = %i WHERE `id` = '%i';", g_iPoints[iClient], g_iKills[iClient], g_iDeaths[iClient], g_iClientID[iClient]);
g_hDatabase.Query(SQL_Callback_CheckError, sQuery);
}
public void Event_PlayerDeath(Event hEvent, const char[] sEventName, bool bDontBroadcast)
{
int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
int kill_pn = 2;
int death_pn = 2;
if(iClient && g_iPoints[iClient] > 0){
if(g_iManyKills[iClient] > 1){
int bonpoints = 0;
bonpoints = g_iManyKills[iClient] - 1;
PrintToChat(iClient, "%s Вы получили %d поинтов за %d убийств.", PREFIX, bonpoints, g_iManyKills[iClient]);
g_iPoints[iClient] + bonpoints;
g_iManyKills[iClient] = 0;
}
++g_iDeaths[iClient];
g_iPoints[iClient] - death_pn;
PrintToChat(iClient, "%s %N (%d) получил %d очка за убийство %N (%d)", PREFIX, iAttacker, g_iPoints[iAttacker], kill_pn, iClient, g_iPoints[iClient]);
}else PrintToChatAll("Error 1");
if(iAttacker != 0 && g_iPoints[iAttacker] > 0){
int addpoints = g_iPoints[iAttacker] / 100 + kill_pn;
if(addpoints > 25) addpoints = 25;
g_iPoints[iAttacker] + addpoints;
++g_iKills[iAttacker];
++g_iManyKills[iAttacker];
PrintToChat(iAttacker, "%s %N (%d) получил %d очка за убийство %N (%d)", PREFIX, iAttacker, g_iPoints[iAttacker], kill_pn, iClient, g_iPoints[iClient]);
}else PrintToChatAll("Error 2");
}