Out of my head ...
PHP Code:
new g_iPoints[MAXPLAYERS + 1];
new Handle:g_hDatabase = INVALID_HANDLE;
public OnClientPutInServer(iClient) {
g_iPoints[iClient] = 0;
LoadPlayerData(iClient);
}
public OnClientDisconnect(iClient) {
GetPlayerData(iClient);
g_iPoints[iClient] = 0;
}
public OnMapStart() {
ConnectToDatabase();
}
stock ConnectToDatabase() {
SQL_TConnect(SQL_OnConnect, "yourconfigname");
}
stock LoadPlayerData(iClient) {
new String:sQuery[512], String:sSteamID[32];
GetClientAuthString(iClient, sSteamID, sizeof(sSteamID));
Format(sQuery, sizeof(sQuery), "SELECT player_points FROM player_saves WHERE steam_id = '%s'", sSteamID);
SQL_TQuery(g_hDatabase, SQL_OnLoadPlayerData, sQuery, iClient);
}
stock GetPlayerData(iClient) {
new String:sQuery[512], String:sSteamID[32];
GetClientAuthString(iClient, sSteamID, sizeof(sSteamID));
Format(sQuery, sizeof(sQuery), "SELECT * FROM player_saves WHERE steam_id = '%s'", sSteamID);
SQL_TQuery(g_hDatabase, SQL_OnGetPlayerData, sQuery, iClient);
}
stock SavePlayerData(iClient) {
new String:sQuery[512], String:sSteamID[32];
new iPoints[MAXPLAYERS + 1];
iPoints = GetClientPoints(iClient);
GetClientAuthString(iClient, sSteamID, sizeof(sSteamID));
Format(sQuery, sizeof(sQuery), "INSERT INTO player_saves (steam_id, player_points) VALUES ('%s', '%d')", sSteamID, iPoints[iClient]);
iPoints[iClient] = 0;
SQL_TQuery(g_hDatabase, SQL_OnDefaultCallback, sQuery, iClient);
}
stock UpdatePlayerData(iClient) {
new String:sQuery[512], String:sSteamID[32];
new iPoints[MAXPLAYERS + 1];
iPoints = GetClientPoints(iClient);
GetClientAuthString(iClient, sSteamID, sizeof(sSteamID));
Format(sQuery, sizeof(sQuery), "UPDATE player_saves SET player_points = '%d' WHERE steam_id = '%s'", iPoints[iClient], sSteamID);
iPoints[iClient] = 0;
SQL_TQuery(g_hDatabase, SQL_OnDefaultCallback, sQuery, iClient);
}
public SQL_OnDefaultCallback(Handle:hOwner, Handle:hTable, const String:sError[], any:iData) {
if (hTable == INVALID_HANDLE) {
LogError("Query failed! %s", sError);
return false;
}
return true;
}
public SQL_OnConnect(Handle:hOwner, Handle:hDatabase, const String:sError[], any:iData) {
if (hDatabase == INVALID_HANDLE) {
LogError("Database failure: %s", sError);
SetFailState("Error: %s", sError);
return false;
} else {
g_hDatabase = hDatabase;
return true;
}
}
public SQL_OnLoadPlayerData(Handle:hOwner, Handle:hTable, const String:sError[], any:iData) {
new iClient = iData;
if (hTable == INVALID_HANDLE) {
LogError("Query failed! %s", sError);
return false;
} else if (SQL_GetRowCount(hTable)) {
// Player data found
SQL_FetchRow(hTable);
g_iPoints[iClient] = SQL_FetchInt(hTable, 0);
if (g_iPoints[iClient] != 0) {
// Do something
}
}
return true;
}
public SQL_OnGetPlayerData(Handle:hOwner, Handle:hTable, const String:sError[], any:iData) {
new iClient = iData;
if (hTable == INVALID_HANDLE) {
LogError("Query failed! %s", sError);
return false;
} else if (SQL_GetRowCount(hTable)) {
// Player does exist, update
UpdatePlayerData(iClient);
} else {
// Player does not exist, create new
SavePlayerData(iClient);
}
return true;
}
stock GetClientPoints(iClient) {
if (iClient < 1 || iClient > MaxClients)
return -1;
// However you get the points ...
return GetClientFrags(iClient) - GetClientDeaths(iClient);
}
That'll cause problems if players crash (points won't be saved)