Thanks.
Code:
#include <amxmodx>
#include <cstrike>
#include <csx>
#include <sqlx>
const MaxSlots = 32;
const MaxSteamIdChars = 35;
const SecondsInHour = 3600;
enum _:DataTypes
{
_Data_Kills,
_Data_Deaths,
_Data_Headshots,
_Data_Wins,
_Data_Losses,
_Data_Points,
};
new PlayerData[MaxSlots + 1][DataTypes];
new SteamId[MaxSlots + 1][MaxSteamIdChars];
new ExistsInDB[MaxSlots + 1];
new MaxPlayers;
new Handle:SQLTuple;
new CvarPointsKill;
new CvarPointsHeadshot;
new CvarPointsWins;
new szName[32], szSteamID[32];
public plugin_init()
{
CvarPointsKill = register_cvar("pug_points_kill", "1");
CvarPointsHeadshot = register_cvar("pug_points_headshot", "2");
CvarPointsWins = register_cvar("pug_points_win", "1");
MaxPlayers = get_maxplayers();
register_event("DeathMsg", "Event_DeathMsg", "a");
register_event("SendAudio", "Event_SendAudio_TWin", "a", "2&%!MRAD_terwin");
register_event("SendAudio", "Event_SendAudio_CTWin", "a", "2&%!MRAD_ctwin");
set_cvar_string("amx_sql_host","");
set_cvar_string("amx_sql_user","");
set_cvar_string("amx_sql_pass","");
set_cvar_string("amx_sql_db","");
set_cvar_string("amx_sql_table","");
set_cvar_string("amx_sql_type","mysql");
PrepareDatabase();
}
PrepareDatabase()
{
SQLTuple = SQL_MakeStdTuple();
new Query[512];
formatex(Query,
charsmax(Query),
"CREATE TABLE IF NOT EXISTS sb_ranking (kills int(10), deaths int(10), headshots int(10), wins int(10), losses int(10), points int(10), steamid varchar(35), name varchar(32), PRIMARY KEY(steamid))");
SQL_ThreadQuery(SQLTuple, "QueryDefaultHandle", Query);
}
SaveData(const Client)
{
new Query[512];
new ClientName[MaxSlots];
new ClientNameSafe[MaxSlots];
get_user_name(Client, ClientName, charsmax(ClientName));
MakeStringSQLSafe(ClientName, ClientNameSafe, charsmax(ClientName));
if(ExistsInDB[Client] == -1)
{
formatex(Query, charsmax(Query),
"INSERT INTO sb_ranking (kills, deaths, headshots, wins, losses, points, steamid, name) VALUES (%i, %i, %i, %i, %i, %i, '%s', '%s')",
PlayerData[Client][_Data_Kills],
PlayerData[Client][_Data_Deaths],
PlayerData[Client][_Data_Headshots],
PlayerData[Client][_Data_Wins],
PlayerData[Client][_Data_Losses],
PlayerData[Client][_Data_Points],
SteamId[Client],
ClientNameSafe
);
ExistsInDB[Client] = 1;
}
else
{
formatex(Query, charsmax(Query),
"UPDATE sb_ranking SET kills = %i, deaths = %i, headshots = %i, wins = %i, losses = %i, points = %i, name = '%s' WHERE steamid = '%s'",
PlayerData[Client][_Data_Kills],
PlayerData[Client][_Data_Deaths],
PlayerData[Client][_Data_Headshots],
PlayerData[Client][_Data_Wins],
PlayerData[Client][_Data_Losses],
PlayerData[Client][_Data_Points],
ClientNameSafe,
SteamId[Client]
);
}
SQL_ThreadQuery(SQLTuple, "QueryDefaultHandle", Query);
}
MakeStringSQLSafe(const Input[], Output[], Len)
{
copy(Output, Len, Input );
replace_all(Output, Len, "'", "*");
replace_all(Output, Len, "^"", "*");
replace_all(Output, Len, "`", "*");
remove_quotes(Output);
}
public QueryDefaultHandle(FailState, Handle:Query, Error[], ErrorCode, Data[], DataSize, Float:QueueTime)
{
switch(FailState)
{
case TQUERY_CONNECT_FAILED:
{
set_fail_state("SQL: Connection failed.");
}
case TQUERY_QUERY_FAILED:
{
log_amx("SQL: Query failed. Error: %s (%i)", Error, ErrorCode);
}
}
}
LoadData(const Client)
{
new Query[512], Data[2];
formatex( Query, charsmax(Query),
"SELECT * FROM sb_ranking WHERE steamid = '%s'",
SteamId[Client]
);
Data[0] = Client;
SQL_ThreadQuery(SQLTuple, "QueryLoadData", Query, Data, charsmax(Data));
}
public QueryLoadData(FailState, Handle:Query, Error[], ErrorCode, Data[], DataSize, Float:QueueTime)
{
switch(FailState)
{
case TQUERY_CONNECT_FAILED:
{
set_fail_state("SQL: Connection failed.");
}
case TQUERY_QUERY_FAILED:
{
log_amx("SQL: Query failed. Error: %s (%i)", Error, ErrorCode);
}
default:
{
SQL_GetResults(Query, Data);
}
}
}
SQL_GetResults(Handle:Query, const Data[])
{
new Client = Data[0];
if( SQL_NumResults(Query))
{
ExistsInDB[Client] = 1;
for(new DataIndex = 0; DataIndex < DataTypes; DataIndex++)
{
PlayerData[Client][DataIndex] = SQL_ReadResult(Query, DataIndex);
}
}
else
{
ExistsInDB[Client] = -1;
}
}
public client_authorized(Client)
{
if(!is_user_bot(Client))
{
get_user_authid(Client, SteamId[Client], charsmax(SteamId[]));
DefaultVariables(Client);
LoadData(Client);
}
}
public client_disconnect(Client)
{
SaveData(Client);
DefaultVariables(Client);
SteamId[Client][0] = 0;
}
DefaultVariables(const Client)
{
for(new DataIndex = 0; DataIndex < DataTypes; DataIndex++)
{
PlayerData[Client][DataIndex] = 0;
}
}
public Event_DeathMsg()
{
if(get_cvar_num("amx_live") == 1)
{
new Attacker = read_data(1);
new Victim = read_data(2);
if((1 <= Attacker <= MaxPlayers)
&& (1 <= Victim <= MaxPlayers)
&& (Victim != Attacker)
&& is_user_connected(Victim)
&& is_user_connected(Attacker))
{
new Points = get_pcvar_num(CvarPointsKill);
new Headshot = read_data(3);
if(Headshot)
{
Points += get_pcvar_num(CvarPointsHeadshot);
PlayerData[Attacker][_Data_Headshots]++;
}
PlayerData[Attacker][_Data_Points] += Points;
PlayerData[Attacker][_Data_Kills]++;
PlayerData[Victim][_Data_Deaths]++;
SaveData(Attacker);
SaveData(Victim);
}
else if(!Attacker)
{
PlayerData[Victim][_Data_Deaths]++;
}
}
}
public Event_SendAudio_TWin()
{
if(get_cvar_num("amx_live") == 1)
{
new Points = get_pcvar_num(CvarPointsWins);
for(new Client = 1; Client <= MaxPlayers; Client++)
{
if(is_user_connected(Client))
{
if( cs_get_user_team(Client) == CS_TEAM_T)
{
PlayerData[Client][ _Data_Points] += Points;
PlayerData[Client][_Data_Wins]++;
}
else if(cs_get_user_team(Client) == CS_TEAM_CT)
{
PlayerData[Client][_Data_Losses]++;
}
SaveData(Client);
}
}
}
}
public Event_SendAudio_CTWin()
{
if(get_cvar_num("amx_live") == 1)
{
new Points = get_pcvar_num(CvarPointsWins);
for( new Client = 1; Client <= MaxPlayers; Client++)
{
if(is_user_connected(Client))
{
if(cs_get_user_team(Client) == CS_TEAM_CT)
{
PlayerData[Client][_Data_Points] += Points;
PlayerData[Client][_Data_Wins ]++;
}
else if(cs_get_user_team(Client) == CS_TEAM_T)
{
PlayerData[Client][_Data_Losses]++;
}
SaveData(Client);
}
}
}
}
public bomb_defused(Client)
{
if(get_cvar_num("amx_live") == 1)
{
PlayerData[Client][_Data_Points] += 1;
}
SaveData(Client);
}
public bomb_planted(Client)
{
if(get_cvar_num("amx_live") == 1)
{
PlayerData[Client][_Data_Points] += 1;
}
SaveData(Client);
}