· 8 years ago · Mar 04, 2018, 07:38 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <zombieplague>
4#include <sqlx>
5#include <ColorChat>
6
7#define flag_get(%1,%2) (%1 & (1 << (%2 & 31)))
8#define flag_get_boolean(%1,%2) (flag_get(%1,%2) ? true : false)
9#define flag_set(%1,%2) %1 |= (1 << (%2 & 31))
10#define flag_unset(%1,%2) %1 &= ~(1 << (%2 & 31))
11
12new g_loadSuccess
13new g_maxplayers
14new c_SqlHost
15new c_SqlUser
16new c_SqlPass
17new c_SqlDB
18new c_SqlType
19
20new g_Error[512]
21
22new Handle:g_SqlTuple
23
24public plugin_init()
25{
26 register_plugin("ZP Ammo Saving", "1.0.4", "wbyokomo")
27
28 c_SqlHost = register_cvar( "zp_ammo_bank_host", "linuxclub.ro" )
29 c_SqlUser = register_cvar( "zp_ammo_bank_user", "s_zm" )
30 c_SqlPass = register_cvar( "zp_ammo_bank_pass", " )
31 c_SqlDB = register_cvar( "zp_ammo_bank_db", "" )
32 c_SqlType = register_cvar( "zp_ammo_bank_type", "mysql" )
33
34 if( !_PrepareSQL() )
35 {
36 set_fail_state( "[ZP Ammo Bank] Fail to prepare SQL" )
37 return;
38 }
39
40 g_maxplayers = get_maxplayers()
41}
42
43stock client_printcolor(const id, const input[], any:...)
44{
45 new iCount = 1, iPlayers[32]
46 static szMsg[191]
47
48 vformat(szMsg, charsmax(szMsg), input, 3)
49 replace_all(szMsg, 190, "!g", "^4")
50 replace_all(szMsg, 190, "!y", "^1")
51 replace_all(szMsg, 190, "!t", "^3")
52
53 if(id) iPlayers[0] = id
54 else get_players(iPlayers, iCount, "ch")
55
56 for (new i = 0; i < iCount; i++)
57 {
58 if(is_user_connected(iPlayers[i]))
59 {
60 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i])
61 write_byte(iPlayers[i])
62 write_string(szMsg)
63 message_end()
64 }
65 }
66}
67public client_putinserver(id)
68{
69 _LoadSQL(id)
70}
71
72public client_disconnect(id)
73{
74 DeleteVIP(id)
75}
76_PrepareSQL() {
77
78 new host[32], user[32], pass[32], db[32], type[12]
79 get_pcvar_string( c_SqlHost, host, charsmax(host) )
80 get_pcvar_string( c_SqlUser, user, charsmax(user) )
81 get_pcvar_string( c_SqlPass, pass, charsmax(pass) )
82 get_pcvar_string( c_SqlDB, db, charsmax(db) )
83 get_pcvar_string( c_SqlType, type, charsmax(type) )
84
85 new get_type[12]
86 SQL_GetAffinity( get_type, charsmax(get_type) )
87
88 log_amx( "[ZP Ammo Bank] SQL affinity type is %s", get_type )
89
90 if( !equali(get_type, type) )
91 {
92 if( !SQL_SetAffinity(type) )
93 {
94 log_amx( "[ZP Ammo Bank] Failed to set affinity from %s to %s", get_type, type )
95 }
96 }
97
98 g_SqlTuple = SQL_MakeDbTuple( host, user, pass, db )
99
100 if( g_SqlTuple == Empty_Handle )
101 {
102 log_amx( "[ZP Ammo Bank] Failed to create SQL tuple." )
103 return 0;
104 }
105
106 new const queryString[] = "CREATE TABLE IF NOT EXISTS `achievement` (\
107 `auth` VARCHAR(64) NOT NULL,\
108 PRIMARY KEY (`auth`) );"
109
110 new errcode, error[128];
111 new Handle:link = SQL_Connect( g_SqlTuple, errcode, error, charsmax(error) )
112
113 if( link == Empty_Handle )
114 {
115 log_amx( "[ZP Ammo Bank] Failed to connect to database (%d): %s", errcode, error )
116 return 0;
117 }
118
119 new Handle:query = SQL_PrepareQuery( link, "%s", queryString )
120
121 if( !SQL_Execute(query) )
122 {
123 SQL_QueryError( query, error, charsmax(error) )
124 log_amx( "[ZP Ammo Bank] Error creating table: %s", error )
125
126 return 0;
127 }
128 else
129 {
130 server_print( "[ZP Ammo Bank] SQL table successful create!" )
131 }
132
133 SQL_FreeHandle(query)
134 SQL_FreeHandle(link)
135
136 return 1;
137}
138
139_MakeStringSQLSafe( output[], len ) {
140
141 replace_all( output, len, "'", "*" )
142 replace_all( output, len, "^"", "*" ) //" - fix Sublime Text syntax highlight
143 replace_all( output, len, "`", "*" )
144}
145
146_LoadSQL(id) {
147
148 new Name[64]
149 get_user_name( id, Name, charsmax(Name) )
150
151 _MakeStringSQLSafe( Name, charsmax(Name) )
152
153 new queryString[96]
154
155 new data[2]
156 data[0] = id
157
158 // ok, we're ready to connect
159 new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511)
160 if(SqlConnection == Empty_Handle)
161 set_fail_state(g_Error)
162
163 // run a random query
164 formatex( queryString, charsmax(queryString), "SELECT HHunter FROM achievement WHERE auth = '%s'", Name )
165 new Handle:Query = SQL_PrepareQuery(SqlConnection,queryString)
166
167 if(!SQL_Execute(Query))
168 {
169 SQL_QueryError(Query,g_Error,511)
170 }
171
172 while(SQL_MoreResults(Query))
173 {
174
175 //User [ id ] [ g_zh_kill ] = SQL_ReadResult(Query,0);
176
177
178 SQL_NextRow(Query)
179 }
180
181 // of course, free the handle
182 SQL_FreeHandle(Query)
183
184 // and of course, free the connection
185 SQL_FreeHandle(SqlConnection)
186}
187
188_SaveSQL(id) {
189
190 if(!flag_get(g_loadSuccess,id))
191 {
192 server_print( "[ZP Achievement] User [%i] failed to save Ammo because it not loaded yet!", id )
193 return;
194 }
195
196 new data[2]
197 data[0] = id
198
199 new Name[64]
200 get_user_name( id, Name, charsmax(Name) )
201
202 _MakeStringSQLSafe( Name, charsmax(Name) )
203
204 new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511)
205 if(SqlConnection == Empty_Handle)
206 set_fail_state(g_Error)
207
208 new queryString[ 1024 ];
209
210 formatex( queryString, charsmax(queryString),
211 "INSERT INTO achievement(auth, ZHunter) VALUES ('%s',%d) ON DUPLICATE KEY UPDATE auth = VALUES(auth)",
212 Name);
213
214 new Handle:Query = SQL_PrepareQuery(SqlConnection,queryString)
215
216 // run the query
217 if(!SQL_Execute(Query))
218 {
219 // if there were any problems
220 SQL_QueryError(Query,g_Error,511)
221 set_fail_state(g_Error)
222 }
223
224 // of course, free the handle
225 SQL_FreeHandle(Query)
226
227 // and of course, free the connection
228 SQL_FreeHandle(SqlConnection)
229}
230
231
232public DeleteVIP( id ) {
233
234 new Name[ 32 ], szName[ 32 ];
235 get_user_name( id, Name, sizeof ( Name ) -1 );
236 //get_user_name( iPlayer, szName, sizeof ( szName ) -1 );
237
238 new szTemp[512];
239
240 format(szTemp, charsmax(szTemp),"DELETE FROM `achievement` WHERE `name`='%s';", Name);
241
242 new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511);
243 if(SqlConnection == Empty_Handle)
244 set_fail_state(g_Error);
245
246 new Handle:Queries;
247 Queries = SQL_PrepareQuery(SqlConnection, szTemp);
248
249
250 if(!SQL_Execute(Queries))
251 {
252 SQL_QueryError(Queries,g_Error,511);
253 set_fail_state(g_Error);
254 }
255 SQL_FreeHandle(Queries);
256
257 SQL_FreeHandle(SqlConnection);
258
259 return 1;
260
261
262}
263public QuerySaveData( failstate, Handle:query, error[], errcode, data[], size, Float:queueTime )
264{
265 if( failstate == TQUERY_CONNECT_FAILED )
266 {
267 log_amx( "[ZP Achievement] Failed connecting to save data (%d): %s", errcode, error )
268 }
269 else if( failstate == TQUERY_QUERY_FAILED )
270 {
271 log_amx( "[ZP Achievement] Failed query on save data (%d): %s", errcode, error )
272 }
273 else
274 {
275 }
276}