#include <a_samp>
#include <a_mysql>
#include <sscanf2>
// Modify below as needed.
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_DB "dbname"
#define MYSQL_PASS ""
enum P_ENUM
{
pUID,
pPWHash[129], // Suited for Whirlpool, modify as needed.
pMoney,
pALevel,
pScore
}
new pData[MAX_PLAYERS][P_ENUM];
forward LoadPlayerData(playerid);
forward LoadPlayerData_THREAD(query[], index, extraid, connectionHandle);
forward SavePlayerData(playerid);
forward SavePlayerData_THREAD(query[], index, extraid, connectionHandle);
forward ClearPlayerData(playerid);
main() {}
public OnGameModeInit()
{
mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_DB,MYSQL_PASS); // Connecting to the database.
}
public OnPlayerConnect(playerid)
{
LoadPlayerData(playerid); // Load data when the player connects.
}
public OnPlayerDisconnect(playerid,reason)
{
SavePlayerData(playerid); // Save data on disconnect apart from the password hash & constant UID
ClearPlayerData(playerid); // Clear the data from the server
}
public ClearPlayerData(playerid)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,MAX_PLAYER_NAME);
strdel(pData[playerid][pPWHash],0,129);
for(new i = 0;i<sizeof(pData[]);i++)
{
pData[playerid][P_ENUM:i] = 0;
}
printf("Cleared data for %s",name);
}
public LoadPlayerData(playerid)
{
new name[MAX_PLAYER_NAME],escaped[32];
GetPlayerName(playerid,name,MAX_PLAYER_NAME);
if(!mysql_ping()) { return printf("Error loading user data for %s",name); }
new query[128];
mysql_real_escape_string(name,escaped);
format(query,sizeof(query),"SELECT * FROM users WHERE username = '%s'",escaped);
mysql_query_callback(playerid,query,"LoadPlayerData_THREAD");
return 1;
}
public LoadPlayerData_THREAD(query[], index, extraid, connectionHandle)
{
new name[MAX_PLAYER_NAME],result[512];
GetPlayerName(index,name,MAX_PLAYER_NAME);
mysql_store_result();
if(!mysql_num_rows()) { mysql_free_result();return printf("User %s does not exist",name); }
mysql_fetch_row_format(result);
sscanf(result,"e<p<|>d{s[20]}s[129]ddd>",pData[index]);
printf("Data loaded for %s",name);
mysql_free_result();
return 1;
}
public SavePlayerData(playerid)
{
new query[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,MAX_PLAYER_NAME);
if(!mysql_ping()) { return printf("Error saving user data for %s",name); }
format(query,sizeof(query),"UPDATE users SET money=%d,level=%d,score=%d WHERE username='%s'",
pData[playerid][pMoney],pData[playerid][pALevel],pData[playerid][pScore],name);
mysql_query_callback(playerid,query,"SavePlayerData_THREAD");
return 1;
}
public SavePlayerData_THREAD(query[], index, extraid, connectionHandle)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(index,name,MAX_PLAYER_NAME);
mysql_store_result();
if(!mysql_errno())
{
printf("Data saved for %s",name);
}
else
{
printf("Could not save data for %s",name);
}
mysql_free_result();
return 1;
}
Comments