· 7 years ago · Mar 03, 2019, 09:58 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <nvault>
4#include <hamsandwich>
5#include <colorchat>
6#include <fakemeta>
7#include <fun>
8#include <cstrike>
9#include <sqlx>
10
11#define PLUGIN "AWP Mod"
12#define VERSION "1.0.0"
13#define AUTHOR "Megastorm"
14
15new Array:aVmodels, Array:aAWPNames, Array:aAWPUnlock, Array:aAWPFlag, iPlayerAWP[33], gVault, iRegisteredModels, iPlayerKills[33], iPlayerDeaths[33], iPlayerXP[33], iPlayerLevel[33], szPlayerWpnModel[33][96], szPlayerAWP[33][32], iNextKills[33], gMaxplayers, fwdAwpSpawn, iDummy, gSyncMsg
16
17new const config_file[] = "addons/amxmodx/configs/AWP_Settings.ini"
18
19new Handle:dbTuple
20
21new szPlayerAuthID[33][32]
22
23new pCvarKillXP, pCvarHSXP
24
25enum _:RDATA {
26 NAME[32], STEAMID[32], PXP, PLEVEL, PKILLS, PDEATHS
27};
28
29public plugin_init() {
30 register_plugin(PLUGIN, VERSION, AUTHOR)
31 new ip[32]
32 get_user_ip(0, ip, 31)
33 if(!equal(ip, "134.255.231.251:27020")) set_fail_state("Failed to run on this server...")
34
35 RegisterHam(Ham_Spawn, "player", "HamPlayerSpawnPost", .Post = true)
36 RegisterHam(Ham_Killed, "player", "HamPlayerKilledPost", .Post = true)
37 RegisterHam(Ham_Item_Deploy, "weapon_awp", "HamWpnDeploy", .Post = true)
38
39 fwdAwpSpawn = CreateMultiForward("awp__PlayerSpawn", ET_CONTINUE, FP_CELL)
40
41 register_clcmd("say /awp", "cmdAwp")
42 register_clcmd("say /awptop", "cmdAwpTop")
43 gVault = nvault_open("AWP_1.0")
44 gMaxplayers = get_maxplayers()
45 gSyncMsg = CreateHudSyncObj()
46
47 pCvarKillXP = register_cvar("awp_killxp", "5")
48 pCvarHSXP = register_cvar("awp_hsxp", "10")
49
50 register_concmd("awp_setkills", "CmdSetKills", ADMIN_RCON, "<nick> <kills>")
51
52 set_task(0.1, "HUD__Task", _, _, _, "b")
53
54 dbTuple = SQL_MakeDbTuple("", "", "", "AWP_2", .timeout = 5)
55 GenerateTable()
56}
57
58public HamWpnDeploy(ent) {
59 new id = get_pdata_cbase(ent, 41, 4);
60 if(!is_user_connected(id) || !is_user_alive(id) || is_user_bot(id)) return HAM_IGNORED
61
62 set_pev(id, pev_viewmodel2, szPlayerWpnModel[id])
63 return HAM_IGNORED
64}
65
66public CmdSetKills(id, level, cid) {
67 if(!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED
68 new szArg[2][32]
69 read_argv(1, szArg[0], 31)
70 read_argv(2, szArg[1], 31)
71 new iTarget, iKills = 0
72 iKills = str_to_num(szArg[1])
73 iTarget = cmd_target(id, szArg[0], CMDTARGET_ALLOW_SELF)
74 if(!is_user_connected(iTarget)) return PLUGIN_HANDLED
75
76 iPlayerKills[iTarget] = iKills
77 SavePlayerData(iTarget)
78
79 return PLUGIN_CONTINUE
80}
81
82public cmdAwpTop(id) {
83 if(is_user_bot(id)) return
84
85 new limit[5]
86 read_argv(1, limit, 4)
87 new QueryStr[192], Data[4]
88 Data[0] = id
89 formatex(QueryStr, 191, "SELECT name,steamid,xp,level,kills,deaths FROM players ORDER BY xp DESC LIMIT 16;")
90 SQL_ThreadQuery(dbTuple, "RankHandler", QueryStr, Data, 1)
91}
92
93public RankHandler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime) {
94 new target = data[0]
95 if(SQL_NumResults(query)) {
96 new playerData[10][RDATA], iterator = 0
97 while(iterator < SQL_NumResults(query)) {
98 PrintMsg(target, "Loading Top 10 list...")
99 SQL_ReadResult(query, 0, playerData[iterator][NAME], 31)
100 SQL_ReadResult(query, 1, playerData[iterator][STEAMID], 31)
101 playerData[iterator][PXP] = SQL_ReadResult(query, 2)
102 playerData[iterator][PLEVEL] = SQL_ReadResult(query, 3)
103 playerData[iterator][PKILLS] = SQL_ReadResult(query, 4)
104 playerData[iterator][PDEATHS] = SQL_ReadResult(query, 5)
105 iterator++
106 SQL_NextRow(query)
107 }
108 FormatAndShowMotd(target, playerData)
109 } else {
110 PrintMsg(target, "No players were ranked...")
111 }
112 SQL_FreeHandle(query)
113}
114
115public FormatAndShowMotd(id, data[][]) {
116 static motd[8192], row[192]
117 motd[0] = '^0'
118 format(motd, charsmax(motd), "<style>body{margin:0;padding:0;background:#222;}td{background:#222;text-align:center;padding:2px 5px;border:1px solid #333;color:#f79621;}thead td{background:#ccc;color:#555}table{border-spacing:0;border-collapse:collapse;width:100%%;}</style>")
119 add(motd, charsmax(motd), "<body><table><thead><tr><td>#</td><td>Name</td><td>Steam ID</td><td>XP</td><td>Level</td><td>Kills</td><td>Deaths</td><td>K/D</td></tr></thead><tbody>")
120 for(new i = 0; i < 10; i++) {
121 static Float:kd = 0
122 if(data[i][PDEATHS]) {
123 kd = 1.0*data[i][PKILLS]/data[i][PDEATHS]
124 } else {
125 kd = 1.0*data[i][PKILLS]/1
126 }
127 formatex(row, charsmax(row), "<tr><td>%d</td><td>%s</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%.2f</td></tr>", (i+1), data[i][NAME], data[i][STEAMID], data[i][PXP], data[i][PLEVEL], data[i][PKILLS], data[i][PDEATHS], kd)
128 add(motd, charsmax(motd), row)
129 }
130
131 add(motd, charsmax(motd), "</tbody></body>")
132 show_motd(id, motd, "Top 10 AWP")
133}
134
135public GenerateTable() {
136 new szErr[192], iErrCode
137 new Handle:conn = SQL_Connect(dbTuple, iErrCode, szErr, 191)
138 if (conn == Empty_Handle)
139 {
140 log_amx( "[SQLITE] Database Connection Failed: [%d] %s", iErrCode, szErr );
141 return;
142 } else {
143 new Handle:tblQuery = SQL_PrepareQuery(conn, "CREATE TABLE IF NOT EXISTS players (id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(32) NOT NULL; steamid varchar(32) NOT NULL, xp int(8) NOT NULL, level int(8) NOT NULL, kills int(8) NOT NULL, lastlogin int(24) NOT NULL);")
144 SQL_Execute(tblQuery)
145 SQL_FreeHandle(tblQuery)
146 }
147 SQL_FreeHandle(conn)
148}
149
150public LoadPlayerData(id) {
151 if(is_user_bot(id)) return
152 new QueryStr[192], Data[4]
153 Data[0] = id
154 formatex(QueryStr, 191, "SELECT xp, level, kills, deaths FROM players WHERE steamid='%s';", szPlayerAuthID[id])
155 SQL_ThreadQuery(dbTuple, "PlayerFindHandler", QueryStr, Data, 1)
156}
157
158public PlayerFindHandler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime) {
159 new target = data[0]
160 if(SQL_NumResults(query)) {
161 // read data
162 new XP, LEVEL, KILLS, DEATHS
163 XP = SQL_ReadResult(query, 0)
164 LEVEL = SQL_ReadResult(query, 1)
165 KILLS = SQL_ReadResult(query, 2)
166 DEATHS = SQL_ReadResult(query, 3)
167 iPlayerXP[target] = XP
168 iPlayerLevel[target] = LEVEL
169 iPlayerKills[target] = KILLS
170 iPlayerDeaths[target] = DEATHS
171 SQL_FreeHandle(query)
172 return
173 } else {
174 // Insert player...
175 if(is_user_connected(target)) {
176 new name[32], QueryStr[192]
177 get_user_name(target, name, 31)
178 formatex(QueryStr, 191, "INSERT INTO players (name, steamid, xp, level, kills, deaths, lastlogin) VALUES ('%s', '%s', '%d', '%d', '%d', '%d', '%d')", name, szPlayerAuthID[target], 0, 1, 0, 0, get_systime())
179
180 SQL_FreeHandle(query)
181 SQL_ThreadQuery(dbTuple, "DummyHandler", QueryStr, _)
182 }
183 }
184}
185
186public DummyHandler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime) {
187 SQL_FreeHandle(query)
188 return 0
189}
190
191public SavePlayerData(id) {
192 if(is_user_bot(id)) return
193 new QueryStr[192], name[32]
194 get_user_name(id, name, 31)
195 formatex(QueryStr, 191, "UPDATE players SET name='%s',xp='%d', level='%d', kills='%d', deaths='%d', lastlogin='%d' WHERE steamid='%s';", name, iPlayerXP[id], iPlayerLevel[id], iPlayerKills[id], iPlayerDeaths[id], get_systime(), szPlayerAuthID[id])
196
197 SQL_ThreadQuery(dbTuple, "DummyHandler", QueryStr, _)
198}
199
200public client_disconnect(id) {
201 SavePlayerData(id)
202 szPlayerAuthID[id][0] = '^0'
203 szPlayerAWP[id][0] = '^0'
204 szPlayerWpnModel[id][0] = '^0'
205 iPlayerAWP[id] = 0
206 iPlayerKills[id] = 0
207 iPlayerDeaths[id] = 0
208 iPlayerXP[id] = 0
209 iPlayerLevel[id] = 0
210}
211
212public HamPlayerSpawnPost(id) {
213 if(is_user_bot(id)) return HAM_IGNORED
214 if(iPlayerAWP[id] < 0) SetPlayerAWP(id, 0)
215 //LoadPlayerData(id)
216
217 if(is_user_alive(id)) {
218 strip_user_weapons(id)
219 give_item(id, "weapon_knife")
220 give_item(id, "weapon_awp")
221 cs_set_user_bpammo(id, CSW_AWP, 30)
222
223 set_pev(id, pev_viewmodel2, szPlayerWpnModel[id])
224 ExecuteForward(fwdAwpSpawn, iDummy, id)
225 }
226 return HAM_IGNORED
227}
228
229public HamPlayerKilledPost(id, attacker, shouldgib) {
230 if(!is_user_connected(attacker) || !is_user_connected(id)) return HAM_IGNORED
231 if(get_user_team(attacker) != get_user_team(id)) {
232 iPlayerKills[attacker]++
233 iNextKills[attacker] = GetMaxKills(attacker)
234
235 static addXP = 0
236 if(IsHs(id)) {
237 addXP = get_pcvar_num(pCvarHSXP)
238 } else {
239 addXP = get_pcvar_num(pCvarKillXP)
240 }
241 iPlayerXP[attacker] += addXP
242
243 CheckPlayerLevel(attacker)
244 SavePlayerData(id)
245 SavePlayerData(attacker)
246 }
247 iPlayerDeaths[id]++
248 return HAM_IGNORED
249}
250
251public CheckPlayerLevel(id) {
252 while(iPlayerXP[id] >= GetLevelXP(iPlayerLevel[id])) {
253 iPlayerLevel[id]++
254 }
255}
256
257public GetLevelXP(level) {
258 return 1 + (level * level) * (5 + level)
259
260}
261stock IsHs(id) {
262 return (get_pdata_int(id, 75) == HIT_HEAD)
263}
264
265public HUD__Task(tid) {
266 for(new i = 1; i <= gMaxplayers; i++) {
267 if(!is_user_connected(i)) continue
268
269 RefreshHUD(i)
270 }
271}
272
273public RefreshHUD(id) {
274 new iTarget = (!is_user_alive(id)?pev(id, pev_iuser2):id)
275
276 static hudmsg[256]
277 static Float:kd = 0.0
278
279 if(is_user_connected(id) && is_user_connected(iTarget)) {
280 get_user_name(iTarget, hudmsg, 31)
281 if(iPlayerDeaths[iTarget]) {
282 kd = 1.0*iPlayerKills[iTarget]/iPlayerDeaths[iTarget]
283 } else {
284 kd = 1.0*iPlayerKills[iTarget]/1
285 }
286 static maxKills[16]
287 if(iNextKills[iTarget] < 0) num_to_str(iPlayerKills[iTarget]+1, maxKills, 15)
288 else num_to_str(iNextKills[iTarget], maxKills, 15)
289 format(hudmsg, charsmax(hudmsg), "[ Nick: %s ]^n[ Class: %s ]^n[ Level: %d ]^n[ XP: %d / %d ]^n[ Kills: %d / %s ]^n[ Deaths: %d ]^n[ K/D: %.2f ]", hudmsg, \
290 szPlayerAWP[iTarget], \
291 iPlayerLevel[iTarget], \
292 iPlayerXP[iTarget], GetLevelXP(iPlayerLevel[iTarget]), \
293 iPlayerKills[iTarget], \
294 maxKills, \
295 iPlayerDeaths[iTarget], \
296 kd)
297 set_hudmessage(250, 250, 250, 0.02, 0.2, 0, 0.0, 0.15, 0.0, 0.0)
298 ShowSyncHudMsg(id, gSyncMsg, hudmsg)
299 }
300}
301
302public cmdAwp(id) {
303 new iMenu = menu_create("Choose AWP: ", "AWPMHandle")
304 new szName[64], iKills, szFlag[4], szTag[4]
305 for(new i = 0; i <= iRegisteredModels; i++) {
306 ArrayGetString(aAWPNames, i, szName, charsmax(szName))
307 iKills = ArrayGetCell(aAWPUnlock, i)
308 ArrayGetString(aAWPFlag, i, szFlag, 3)
309 trim(szFlag)
310
311 if(strlen(szFlag) && has_flag(id, szFlag)) {
312 format(szName, 63, "%s \r[\y VIPS ONLY \r]", szName)
313 num_to_str(i, szTag, 3)
314 menu_additem(iMenu, szName, szTag)
315 } else {
316 if(iKills <= iPlayerKills[id]) {
317 format(szName, 63, "%s \r[\y Unlocked \r]", szName)
318 } else {
319 format(szName, 63, "%s \r[\d %d / \r%d ]", szName, iPlayerKills[id], iKills)
320 }
321 num_to_str(i, szTag, 3)
322 menu_additem(iMenu, szName, szTag)
323 }
324 }
325 menu_display(id, iMenu)
326}
327
328public AWPMHandle(id, mMenu, iItm) {
329 if(iItm == MENU_EXIT) {
330 menu_destroy(mMenu)
331 return PLUGIN_CONTINUE
332 }
333 new iAccess, szInfo[4], szName[32], iCallback
334 menu_item_getinfo(mMenu, iItm, iAccess, szInfo, 3, szName, 31, iCallback)
335 new iID = str_to_num(szInfo)
336 new iKills = ArrayGetCell(aAWPUnlock, iID)
337 if(iKills <= iPlayerKills[id]) {
338 SetPlayerAWP(id, iItm)
339 } else {
340 PrintMsg(id, "You haven't unlocked that skin yet...")
341 }
342 return PLUGIN_CONTINUE
343}
344
345public SetPlayerAWP(id, iAWP) {
346 iPlayerAWP[id] = iAWP
347 // setuj model
348 ArrayGetString(aAWPNames, iAWP, szPlayerAWP[id], 31)
349 ClearString(szPlayerAWP[id], charsmax(szPlayerAWP[]))
350 ArrayGetString(aVmodels, iAWP, szPlayerWpnModel[id], 95)
351
352 iNextKills[id] = GetMaxKills(id)
353
354 if(is_user_alive(id)) set_pev(id, pev_viewmodel2, szPlayerWpnModel[id])
355}
356
357public ClearString(str[], len) {
358 replace_all(str, len, "\r", "")
359 replace_all(str, len, "\d", "")
360 replace_all(str, len, "\y", "")
361 replace_all(str, len, "\w", "")
362}
363
364public plugin_precache() {
365 aVmodels = ArrayCreate(64, 1)
366 aAWPNames = ArrayCreate(32, 1)
367 aAWPUnlock = ArrayCreate(1, 1)
368 aAWPFlag = ArrayCreate(4, 1)
369
370 ArrayPushString(aVmodels, "models/v_awp.mdl")
371 ArrayPushString(aAWPNames, "Default")
372 ArrayPushCell(aAWPUnlock, 0)
373 ArrayPushString(aAWPFlag, "")
374
375 LoadConfig()
376}
377
378public LoadConfig() {
379 new file = fopen(config_file, "r")
380 new buffer[256], args[4][96]
381
382 if(file) {
383 while(!feof(file)) {
384 fgets(file, buffer, sizeof(buffer) - 1)
385 trim(buffer)
386 if(strlen(buffer) < 10) continue;
387 parse(buffer, args[0], 63, args[1], 63, args[2], 63, args[3], 63)
388
389 new iUnlock = str_to_num(args[2])
390
391 trim(args[3])
392
393 precache_model(args[1])
394 ArrayPushString(aAWPNames, args[0])
395 ArrayPushString(aVmodels, args[1])
396 ArrayPushCell(aAWPUnlock, iUnlock)
397 ArrayPushString(aAWPFlag, args[3])
398 iRegisteredModels++
399 }
400 fclose(file)
401 }
402}
403
404public client_putinserver(id) {
405 get_user_authid(id, szPlayerAuthID[id], 31)
406 iPlayerAWP[id] = -1
407 LoadPlayerData(id)
408}
409
410stock GetMaxKills(id) {
411 new maxKills = -1
412 new iKills = 0
413
414 for(new i = 0; i < iRegisteredModels; i++) {
415 iKills = ArrayGetCell(aAWPUnlock, i)
416 if(iKills > iPlayerKills[id]) {
417 maxKills = iKills
418 break
419 }
420 }
421 return maxKills
422}
423
424public plugin_end() {
425 ArrayDestroy(aVmodels)
426 ArrayDestroy(aAWPNames)
427 ArrayDestroy(aAWPUnlock)
428 ArrayDestroy(aAWPFlag)
429 nvault_close(gVault)
430 SQL_FreeHandle(dbTuple)
431}
432
433stock PrintMsg(client, message[]) {
434 static msg[192]
435 formatex(msg, 191, "^4[ AWP 2.0 ]^3 %s", message)
436 ColorChat(client, TEAM_COLOR, msg)
437}