/* Includes */
#include <a_mysql>
/* Defines */
#define MYSQL_HOST "127.0.0.1"
#define MYSQL_USER "root"
#define MYSQL_PASS ""
#define MYSQL_DB "trdm"
#define MAX_STRING 255 //SQL
/* Functions */
forward OnUpdatePlayer(playerid);
forward MySQLConnect(sqlhost[], sqluser[], sqlpass[], sqldb[]);
forward MySQLCheckConnection();
forward MySQLUpdateBuild(query[], sqlplayerid);
forward MySQLUpdateFinish(query[], sqlplayerid);
forward MySQLUpdatePlayerInt(query[], sqlplayerid, sqlvalname[], sqlupdateint);
forward MySQLUpdatePlayerIntSingle(sqlplayerid, sqlvalname[], sqlupdateint);
forward MySQLUpdatePlayerFlo(query[], sqlplayerid, sqlvalname[], Float:sqlupdateflo);
forward MySQLUpdatePlayerStr(query[], sqlplayerid, sqlvalname[], sqlupdatestr[]);
forward MySQLCheckAccount(sqlplayersname[]);
forward MySQLFetchAcctSingle(sqlplayerid, sqlvalname[], sqlresult[]);
forward MySQLFetchAcctRecord(sqlplayerid, sqlresult[]);
forward MySQLCreateAccount(newplayersname[], newpassword[]);
/* Funcions */
public MySQLConnect(sqlhost[], sqluser[], sqlpass[], sqldb[])
{
print("MySQL: Attempting to connect to database...");
mysql_connect(sqlhost,sqluser,sqldb,sqlpass);
if(mysql_ping()==1)
{
print("MYSQL: Database connection established.");
return 1;
}
else
{
print("MySQL: Connection error, retrying...");
mysql_connect(sqlhost,sqluser,sqldb,sqlpass);
if(mysql_ping()==1)
{
print("MySQL: Reconnection successful.");
return 1;
}
else
{
print("MySQL: Could not reconnect to database, terminating server...");
SendRconCommand("exit");
return 0;
}
}
}
public MySQLCheckConnection()
{
if(mysql_ping()==1)
{
return 1;
}
else
{
print("MySQL: Connection error, retrying...");
MySQLConnect(MYSQL_HOST,MYSQL_USER,MYSQL_PASS,MYSQL_DB);
if(mysql_ping()==1)
{
print("MySQL: Reconnection successful.");
return 1;
}
else
{
print("MySQL: Could not reconnect to database, terminating server...");
SendRconCommand("exit");
return 0;
}
}
}
public MySQLUpdateBuild(query[], sqlplayerid)
{
new querylen = strlen(query);
//new querymax = sizeof(query);
new querymax = MAX_STRING;
if (querylen < 1) format(query, querymax, "UPDATE players SET ");
else if (querymax-querylen < 50)
{
// query is too large, send this one and reset
new whereclause[32];
format(whereclause, sizeof(whereclause), " WHERE id=%d", sqlplayerid);
strcat(query, whereclause, querymax);
mysql_query(query);
printf("MYSQL(UpdateBuild): %s", query);
format(query, querymax, "UPDATE players SET ");
}
else if (strfind(query, "=", true) != -1) strcat(query, ",", MAX_STRING);
return 1;
}
public MySQLUpdateFinish(query[], sqlplayerid)
{
if (strcmp(query, "WHERE id=", false) == 0) mysql_query(query);
else
{
new whereclause[32];
format(whereclause, sizeof(whereclause)," WHERE id=%d",sqlplayerid);
strcat(query, whereclause, MAX_STRING);
mysql_query(query);
printf("MYSQL(UpdateFinish): %s", query);
format(query, MAX_STRING, "UPDATE players SET ");
}
return 1;
}
public MySQLUpdatePlayerInt(query[], sqlplayerid, sqlvalname[], sqlupdateint)
{
MySQLUpdateBuild(query, sqlplayerid);
new updval[64];
format(updval, sizeof(updval), "%s=%d", sqlvalname, sqlupdateint);
strcat(query, updval, MAX_STRING);
return 1;
}
public MySQLUpdatePlayerFlo(query[], sqlplayerid, sqlvalname[], Float:sqlupdateflo)
{
new flotostr[32];
format(flotostr, sizeof(flotostr), "%f", sqlupdateflo);
MySQLUpdatePlayerStr(query, sqlplayerid, sqlvalname, flotostr);
return 1;
}
public MySQLUpdatePlayerStr(query[], sqlplayerid, sqlvalname[], sqlupdatestr[])
{
MySQLUpdateBuild(query, sqlplayerid);
new escstr[128];
new updval[128];
mysql_real_escape_string(sqlupdatestr, escstr);
format(updval, sizeof(updval), "%s='%s'", sqlvalname, escstr);
strcat(query, updval, MAX_STRING);
return 1;
}
public MySQLUpdatePlayerIntSingle(sqlplayerid, sqlvalname[], sqlupdateint)
{
new query[128];
format(query, sizeof(query), "UPDATE players SET %s=%d WHERE id=%d", sqlvalname, sqlupdateint, sqlplayerid);
mysql_query(query);
return 1;
}
public MySQLCheckAccount(sqlplayersname[])
{
new query[128];
new escstr[MAX_PLAYER_NAME];
mysql_real_escape_string(sqlplayersname, escstr);
format(query, sizeof(query), "SELECT id FROM players WHERE LOWER(Name) = LOWER('%s') LIMIT 1", escstr);
mysql_query(query);
mysql_store_result();
if(mysql_num_rows()==0)
{
return 0;
}
else
{
new strid[32];
new intid;
mysql_fetch_row(strid);
intid = strval(strid);
return intid;
}
}
public MySQLFetchAcctSingle(sqlplayerid, sqlvalname[], sqlresult[])
{
new query[128];
format(query, sizeof(query), "SELECT %s FROM players WHERE id = %d LIMIT 1", sqlvalname, sqlplayerid);
mysql_query(query);
mysql_store_result();
if(mysql_fetch_row(sqlresult)==1)
{
return 1;
}
return 0;
}
public MySQLFetchAcctRecord(sqlplayerid, sqlresult[])
{
new query[64];
format(query, sizeof(query), "SELECT * FROM players WHERE id=%d LIMIT 1", sqlplayerid);
mysql_query(query);
mysql_store_result();
if(mysql_fetch_row(sqlresult)==1)
{
return 1;
}
return 0;
}
public MySQLCreateAccount(newplayersname[], newpassword[])
{
new query[128];
new sqlplyname[64];
new sqlpassword[64];
mysql_real_escape_string(newplayersname, sqlplyname);
mysql_real_escape_string(newpassword, sqlpassword);
format(query, sizeof(query), "INSERT INTO players (Name, Password) VALUES ('%s', '%s')", sqlplyname, sqlpassword);
mysql_query(query);
new newplayersid = MySQLCheckAccount(newplayersname);
if(newplayersid != 0)
{
return newplayersid;
}
return 0;
}
/* OnUpdatePlayer Function */
public OnUpdatePlayer(playerid)
{
printf("OnUpdatePlayer(%d) (0)", playerid);
if(IsPlayerConnected(playerid))
{
printf("OnUpdatePlayer(%d) (1)", playerid);
if(gPlayerLogged[playerid])
{
printf("OnUpdatePlayer(%d) (2)", playerid);
MySQLCheckConnection();
new query[MAX_STRING];
format(query, MAX_STRING, "UPDATE players SET ");
//MySQLUpdatePlayerStr(query, PlayerInfo[playerid][pSQLID], "Password", PlayerInfo[playerid][pPassword]);
PlayerInfo[playerid][pMoney] = GetPlayerMoney(playerid);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Money", PlayerInfo[playerid][pMoney]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Bank", PlayerInfo[playerid][pBank]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Skin", PlayerInfo[playerid][pSkin]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Staff", PlayerInfo[playerid][pStaff]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Donator", PlayerInfo[playerid][pDonator]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Respect", PlayerInfo[playerid][pRespect]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Drugs", PlayerInfo[playerid][pDrugs]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Weapons", PlayerInfo[playerid][pWeapons]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Kills", PlayerInfo[playerid][pKills]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Deaths", PlayerInfo[playerid][pDeaths]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Traffics", PlayerInfo[playerid][pTF]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Exterminations", PlayerInfo[playerid][pEX]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "VehicleRobbery", PlayerInfo[playerid][pVR]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "StreetRaces", PlayerInfo[playerid][pSR]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "WantedLevel", PlayerInfo[playerid][pWanted]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "FightingStyle", PlayerInfo[playerid][pFStyle]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "MeleeSkill", PlayerInfo[playerid][pMelee]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "PistolSkill", PlayerInfo[playerid][pPistol]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "SMGSkill", PlayerInfo[playerid][pSMG]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "ShotgunSkill", PlayerInfo[playerid][pShotgun]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "MGSkill", PlayerInfo[playerid][pMG]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "RifleSkill", PlayerInfo[playerid][pRifle]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Team", PlayerInfo[playerid][pTeam]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "House", PlayerInfo[playerid][pHouse]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Business", PlayerInfo[playerid][pBusiness]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "Clan", PlayerInfo[playerid][pClan]);
MySQLUpdatePlayerInt(query, PlayerInfo[playerid][pSQLID], "ClanRank", PlayerInfo[playerid][pClanRank]);
MySQLUpdateFinish(query, PlayerInfo[playerid][pSQLID]);
printf("OnUpdatePlayer(%d) Finished", playerid);
}
}
return 1;
}
/* SERVER LOG
(After change Respect in-game and quit) */
SA-MP Dedicated Server
----------------------
v0.3a R3, (C)2005-2009 SA-MP Team
[12:04:04] filterscripts = "" (string)
[12:04:04]
[12:04:04] Server Plugins
[12:04:04] --------------
[12:04:04] Loading plugin: mysql
[12:04:04]
> MySQL plugin loaded on. |
[12:04:04] Loaded.
[12:04:04] Loaded 1 plugins.
[12:04:04]
[12:04:04] Filter Scripts
[12:04:04] ---------------
[12:04:04] Loaded 0 filter scripts.
[12:04:04]
[12:04:04] Number of pickups: 259
[12:04:04]
[12:04:04] DEBUG TeamCarLockInit()
[12:04:04]
[12:04:04] =======================================
[12:04:04] | XXXXXXXXXXXX© |
[12:04:04] | |
[12:04:04] | XXXXXXX® |
[12:04:04] =======================================
[12:04:04]
[12:04:04] MySQL: Attempting to connect to database...
[12:04:04] MYSQL: Database connection established.
[12:04:04] Number of vehicle models: 59
[12:04:50] Incoming connection: 127.0.0.1:4119
[12:04:50] [join] Cr0ssFir3 has joined the server (0:127.0.0.1)
[12:04:50] DEBUG OnPlayerConnect(0)
[12:04:50] Player connecting as [ID:0]Cr0ssFir3
[12:04:50] I will check if connection is alive
[12:04:50] I Have checked the connection and is alive
[12:04:50] I Will hceck if you accounts exists
[12:04:50] Yes your Account exist
[12:04:53] Se tiver conta, ele faz isto(1)
[12:04:57] Conta lida(1)
[12:04:57] Conta lida(2)
[12:04:57] DEBUG OnPropUpdate()
[12:04:57] DEBUG OnPropUpdate()
[12:04:57] Conta lida(3)
[12:04:57] OnPlayerStateChange 0 8 0
[12:04:57] z =1100.374633 int =0
[12:04:57] DEBUG SPAWNED: Playerid:0 Team:3 SpawnPoint:4
[12:04:57] overhight or ob
[12:04:57] DEBUG SetPlayerWeapons(0)
[12:04:57] OnPlayerSpawn Playerid:0
[12:04:57] DEBUG TeamLockDoors(0)
[12:04:57] DEBUG1 InitLockDoors(0)
[12:04:57] OnPlayerStateChange 0 1 8
[12:05:16] DEBUG OnPlayerCommandText(0)
[12:05:16] DEBUG OnPlayerDisconnect(0)1
[12:05:16] OnUpdatePlayer(0) (0)
[12:05:16] OnUpdatePlayer(0) (1)
[12:05:16] OnUpdatePlayer(0) (2)
[12:05:16] MYSQL(UpdateFinish): UPDATE players SET PistolSkill=0,SMGSkill=0,ShotgunSkill=0,MGSkill=0,RifleSkill=0,Team=3,House=255,Business=255,Clan=0,ClanRank=0 WHERE id=1
[12:05:16] OnUpdatePlayer(0) Finished
[12:05:16] DEBUG OnPlayerDisconnect(0)2
[12:05:16] DEBUG OnPlayerDisconnect(0)3
[12:05:16] DEBUG OnPlayerDisconnect(0)4
[12:05:16] [part] Cr0ssFir3 has left the server (0:1)
[12:05:36] --- Server Shutting Down.
[12:05:36]
> MySQL plugin unloaded.
/* ON DATABASE */
No changes.
Originally Posted by Kieren
I would advise saving player stats OnPlayerUpdate.
See the important notice in red: https://sampwiki.blast.hk/wiki/OnPlayerUpdate |
new query[256];
format(query,sizeof(query),"UPDATE players SET money=%d,skin=%d,/*your stuff*/ WHERE id=%d",GetPlayerMoney(playerid),GetPlayerSkin(playerid),/*other stuff*/,sqlplayerid);
mysql_query(query);
SA-MP Dedicated Server
----------------------
v0.3a R3, (C)2005-2009 SA-MP Team
[12:07:09] filterscripts = "" (string)
[12:07:09]
[12:07:09] Server Plugins
[12:07:09] --------------
[12:07:09] Loading plugin: mysql
[12:07:09]
> MySQL plugin loaded on. |
[12:07:09] Loaded.
[12:07:09] Loaded 1 plugins.
[12:07:09]
[12:07:09] Filter Scripts
[12:07:09] ---------------
[12:07:09] Loaded 0 filter scripts.
[12:07:09]
[12:07:09] Number of pickups: 259
[12:07:09]
[12:07:09] DEBUG TeamCarLockInit()
[12:07:09]
[12:07:09] =======================================
[12:07:09] | XXXXXXXXXXXXXXXXX© |
[12:07:09] | |
[12:07:09] | XXXXXXXXXX® |
[12:07:09] =======================================
[12:07:09]
[12:07:09] MySQL: Attempting to connect to database...
[12:07:09] MYSQL: Database connection established.
[12:07:09] Number of vehicle models: 58
[12:08:05] Incoming connection: 127.0.0.1:2444
[12:08:05] [join] Cr0ssFir3 has joined the server (0:127.0.0.1)
[12:08:05] DEBUG OnPlayerConnect(0)
[12:08:05] Player connecting as [ID:0]Cr0ssFir3
[12:08:05] I will check if connection is alive
[12:08:05] I Have checked the connection and is alive
[12:08:05] I Will hceck if you accounts exists
[12:08:05] Yes your Account exist
[12:08:09] Se tiver conta, ele faz isto(1)
[12:08:10] Conta lida(1)
[12:08:10] Conta lida(2)
[12:08:10] DEBUG OnPropUpdate()
[12:08:10] DEBUG OnPropUpdate()
[12:08:10] Conta lida(3)
[12:08:10] OnPlayerStateChange 0 8 0
[12:08:10] z =1100.374633 int =0
[12:08:10] DEBUG SPAWNED: Playerid:0 Team:3 SpawnPoint:2
[12:08:10] overhight or ob
[12:08:10] DEBUG SetPlayerWeapons(0)
[12:08:10] OnPlayerSpawn Playerid:0
[12:08:10] DEBUG TeamLockDoors(0)
[12:08:10] DEBUG1 InitLockDoors(0)
[12:08:10] OnPlayerStateChange 0 1 8
[12:08:55] DEBUG OnPlayerDisconnect(0)1
[12:08:55] UPDATE players SET Money=5000,Bank=100,Skin=0,Staff=3000,Donator=0,Respect=10000,Kills=0,Deaths=0,TF=1,ET=1,VR=1,SR=0,WL=0,FS=0,MeleeSkill=0,PistolSkill=0,SMGSkill=0,ShotgunSkill=0,MGSkill=0,RifleSkill=0,Team=3,House=2,Biz=1,Clan=0,ClanRank=0 WHERE id=1
[12:08:55] DEBUG OnPlayerDisconnect(0)2
[12:08:55] DEBUG OnPlayerDisconnect(0)3
[12:08:55] DEBUG OnPlayerDisconnect(0)4
[12:08:55] [part] Cr0ssFir3 has left the server (0:1)
[12:09:05] --- Server Shutting Down.
[12:09:05]
> MySQL plugin unloaded.
public OnUpdatePlayer(playerid)
{
if(IsPlayerConnected(playerid))
{
if(gPlayerLogged[playerid])
{
new query[256];
MySQLCheckConnection();
PlayerInfo[playerid][pMoney] = GetPlayerMoney(playerid);
PlayerInfo[playerid][pSkin] = GetPlayerSkin(playerid);
format(query,sizeof(query),"UPDATE players SET Money=%d,Bank=%d,Skin=%d,Staff=%d,Donator=%d,Respect=%d,Kills=%d,Deaths=%d,TF=%d,ET=%d,VR=%d,SR=%d,WL=%d,FS=%d,MeleeSkill=%d,PistolSkill=%d,SMGSkill=%d,ShotgunSkill=%d,MGSkill=%d,RifleSkill=%d,Team=%d,House=%d,Biz=%d,Clan=%d,ClanRank=%d WHERE id=%d",
PlayerInfo[playerid][pMoney],
PlayerInfo[playerid][pBank],
PlayerInfo[playerid][pSkin],
PlayerInfo[playerid][pStaff],
PlayerInfo[playerid][pDonator],
PlayerInfo[playerid][pRespect],
PlayerInfo[playerid][pKills],
PlayerInfo[playerid][pDeaths],
PlayerInfo[playerid][pTF],
PlayerInfo[playerid][pEX],
PlayerInfo[playerid][pVR],
PlayerInfo[playerid][pSR],
PlayerInfo[playerid][pWanted],
PlayerInfo[playerid][pFStyle],
PlayerInfo[playerid][pMelee],
PlayerInfo[playerid][pPistol],
PlayerInfo[playerid][pSMG],
PlayerInfo[playerid][pShotgun],
PlayerInfo[playerid][pMG],
PlayerInfo[playerid][pRifle],
PlayerInfo[playerid][pTeam],
PlayerInfo[playerid][pHouse],
PlayerInfo[playerid][pBusiness],
PlayerInfo[playerid][pClan],
PlayerInfo[playerid][pClanRank],
PlayerInfo[playerid][pSQLID]);
mysql_query(query);
printf("%s", query);
}
}
return 1;
}