· 8 years ago · Jan 21, 2018, 03:22 PM
1new Handle:db = INVALID_HANDLE;
2new bool:loaded[MAXPLAYERS+1] = {false, ...};
3
4public OnPluginStart()
5{
6 HookEvent("player_team", event_team);
7
8 RegAdminCmd("sm_scores_x_clear", admcmd_clear, ADMFLAG_CONVARS, "Clear scores_x database");
9
10 SQL_TConnect(GotDatabase, "scores_x");
11}
12
13public Action:admcmd_clear(client, args)
14{
15 if(db == INVALID_HANDLE)
16 {
17 ReplyToCommand(client, "Database scores_x INVALID !!!")
18 return Plugin_Handled;
19 }
20
21 ShowActivity(client, "clear scores_x database");
22 LogAction(client, -1, "%L clear scores_x database", client);
23
24
25 SQL_LockDatabase(db);
26
27 if(!SQL_FastQuery(db, "DELETE FROM `scores_x`"))
28 {
29 decl String:error[256];
30 SQL_GetError(db, error, sizeof(error));
31 LogError(" Query DELETE FROM `scores_x` failed! %s", error);
32 SQL_UnlockDatabase(db);
33 return Plugin_Handled;
34 }
35
36 SQL_UnlockDatabase(db);
37
38 ReplyToCommand(client, "DELETE FROM `scores_x` was successful");
39
40 for(new i = 1; i <= MaxClients; i++)
41 {
42 if(IsClientInGame(i) && !IsFakeClient(i))
43 {
44 SetEntProp(i, Prop_Data, "m_iFrags", 0);
45 SetEntProp(i, Prop_Data, "m_iDeaths", 0);
46 DoLoadScores(i);
47 }
48 }
49 return Plugin_Handled;
50}
51
52public GotDatabase(Handle:owner, Handle:hndl, const String:error[], any:data)
53{
54 // Can't connect database
55 if(hndl == INVALID_HANDLE)
56 {
57 SetFailState("Database failure: %s", error);
58 return;
59 }
60
61 db = hndl;
62
63 if(!SQL_FastQuery(db, "CREATE TABLE IF NOT EXISTS `scores_x` (`steamid` VARCHAR( 20 ) NOT NULL , `m_iScore` INT NOT NULL , `m_iDeaths` INT NOT NULL, PRIMARY KEY ( `steamid` ))"))
64 {
65 decl String:err[300]; err[0] = '\0';
66 SQL_GetError(db, err, sizeof(err));
67 SetFailState("Query CREATE TABLE failed! %s", err);
68 }
69}
70
71
72public event_team(Handle:event, const String:name[], bool:dontBroadcast)
73{
74 if(GetEventBool(event, "disconnect"))
75 {
76 return;
77 }
78
79 if(GetEventInt(event, "team") >= 2)
80 {
81 decl client;
82 client = GetClientOfUserId(GetEventInt(event, "userid"));
83
84 if(!loaded[client] && !IsFakeClient(client))
85 {
86 DoLoadScores(client);
87 }
88 }
89}
90
91DoLoadScores(client)
92{
93 decl String:auth[20], String:query[256];
94 GetClientAuthString(client, auth, sizeof(auth));
95 Format(query, sizeof(query), "SELECT `m_iScore` , `m_iDeaths` FROM `scores_x` WHERE `steamid` = '%s'", auth);
96 SQL_TQuery(db, load_scores, query, GetClientUserId(client));
97}
98
99public load_scores(Handle:owner, Handle:hndl, const String:error[], any:userid)
100{
101 decl client;
102
103 /* Make sure the client didn't disconnect while the thread was running */
104 if ((client = GetClientOfUserId(userid)) == 0)
105 {
106 return;
107 }
108
109 loaded[client] = true;
110
111 if (hndl == INVALID_HANDLE)
112 {
113 LogError(" Query load_scores failed! %s", error);
114 return;
115 }
116
117 decl String:buffer[256];
118
119 if(SQL_GetRowCount(hndl) > 0)
120 {
121 SQL_FetchString(hndl, 0, buffer, sizeof(buffer));
122 SetEntProp(client, Prop_Data, "m_iFrags", StringToInt(buffer));
123 SQL_FetchString(hndl, 1, buffer, sizeof(buffer));
124 SetEntProp(client, Prop_Data, "m_iDeaths", StringToInt(buffer));
125 }
126 else
127 {
128 decl String:auth[20];
129 GetClientAuthString(client, auth, sizeof(auth));
130 Format(buffer, sizeof(buffer), "INSERT INTO `scores_x` VALUES ('%s', '%i', '%i')", auth, GetClientFrags(client), GetClientDeaths(client));
131
132 SQL_LockDatabase(db);
133
134 if(!SQL_FastQuery(db, buffer))
135 {
136 SQL_GetError(db, buffer, sizeof(buffer));
137 LogError(" Query INSERT INTO `scores_x` in db failed! %s", buffer);
138 SQL_UnlockDatabase(db);
139 return;
140 }
141
142 SQL_UnlockDatabase(db);
143 }
144}
145
146public OnClientDisconnect(client)
147{
148 if(loaded[client] && !IsFakeClient(client))
149 {
150 decl String:auth[20], String:query[256];
151 GetClientAuthString(client, auth, sizeof(auth));
152 Format(query, sizeof(query), "UPDATE `scores_x` SET `m_iScore` = '%i', `m_iDeaths` = '%i' WHERE `steamid` = '%s'", GetClientFrags(client), GetClientDeaths(client), auth);
153
154 SQL_LockDatabase(db);
155
156 if(!SQL_FastQuery(db, query))
157 {
158 SQL_GetError(db, query, sizeof(query));
159 LogError(" Query UPDATE `scores_x` in db failed! %s", query);
160 }
161
162 SQL_UnlockDatabase(db);
163 }
164
165 loaded[client] = false;
166}