· 4 years ago · Dec 12, 2020, 08:30 PM
1#include <zombie_escape>
2
3// Defines
4#define MAX_LEVEL 50
5#define MAX_XP 500000
6#define TASK_SHOWHUD 2020
7#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
8#define LEVELUP "levelup_ZE/ze_levelup.wav"
9
10enum
11{
12 Host = 0,
13 User,
14 Pass,
15 DB
16}
17
18// Constants
19new const g_szLevelsVault[] = "Levels"
20new const g_szRanksVault[] = "Ranks"
21new const g_szLogFile[] = "Levels.log" // MySQL Errors log file
22new const g_szTable[] =
23" \
24 CREATE TABLE IF NOT EXISTS `ze_levels` \
25 ( \
26 `SteamID` varchar(34) NOT NULL, \
27 `EC` int(16) NOT NULL, \
28 `Level` int(16) NOT NULL, \
29 `XP` int(16) NOT NULL, \
30 `Max_XP` int(16) NOT NULL, \
31 PRIMARY KEY (`SteamID`) \
32 ); \
33"
34
35// Messages
36const Float:HUD_SPECT_X = -1.0
37const Float:HUD_SPECT_Y = 0.70
38const Float:HUD_STATS_X = -1.0
39const Float:HUD_STATS_Y = 0.90
40
41const HUD_STATS_ZOMBIE_R = 200
42const HUD_STATS_ZOMBIE_G = 220
43const HUD_STATS_ZOMBIE_B = 0
44
45const HUD_STATS_HUMAN_R = 0
46const HUD_STATS_HUMAN_G = 200
47const HUD_STATS_HUMAN_B = 210
48
49const HUD_STATS_SPEC_R = 100
50const HUD_STATS_SPEC_G = 100
51const HUD_STATS_SPEC_B = 100
52
53// Variables
54new g_iLevel[33],
55 g_iXP[33],
56 g_iMaxXP[33],
57 Float:g_fDamage[33],
58 g_MsgSync,
59 g_iLevelsVaultHandle,
60 g_iRanksVaultHandle,
61 Handle:g_hTuple,
62 Fw_LevelUP,
63 ForwardReturn
64
65// Cvars
66new g_pCvarZombieInfect,
67 g_pCvarEscapeSuccess,
68 g_pCvarEnableDamage,
69 g_pCvarRequiredDamage,
70 g_pCvarDamageAward,
71 g_pCvarStartXP,
72 g_pCvarMaxLevelsIncrement,
73 g_pCvarMaxXPFirstLevel,
74 g_pCvarPercentageStyle,
75 g_pCvarStartFromZero,
76 g_pCvarAddCommas,
77 g_pCvarLevelEffects,
78 g_pCvarSaveType,
79 g_pCvarDBInfo[4]
80
81public plugin_natives()
82{
83 register_native("ze_get_user_xp", "native_ze_get_user_xp", 1)
84 register_native("ze_set_user_xp", "native_ze_set_user_xp", 1)
85 register_native("ze_get_user_level", "native_ze_get_user_level", 1)
86 register_native("ze_set_user_level", "native_ze_set_user_level", 1)
87 register_native("ze_get_user_max_xp", "native_ze_get_user_max_xp", 1)
88 register_native("ze_set_user_max_xp", "native_ze_set_user_max_xp", 1)
89}
90
91public plugin_precache()
92{
93 precache_sound(LEVELUP)
94}
95
96public plugin_init()
97{
98 register_plugin("[ZE] Level-XP System", "1.9", "Raheem/JaCk")
99
100 // Hook Chains
101 RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_TakeDamage_Post", 1)
102
103 Fw_LevelUP = CreateMultiForward("ze_on_levelup", ET_IGNORE, FP_CELL)
104
105 // Cvars
106 g_pCvarZombieInfect = register_cvar("ze_zombie_infect", "3")
107 g_pCvarEscapeSuccess = register_cvar("ze_escape_success", "5")
108 g_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
109 g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0")
110 g_pCvarDamageAward = register_cvar("ze_dmg_award", "3")
111 g_pCvarStartXP = register_cvar("ze_start_xp", "50")
112 g_pCvarMaxLevelsIncrement = register_cvar("ze_maxlevels_increment", "2.0")
113 g_pCvarMaxXPFirstLevel = register_cvar("ze_max_xp_first_level", "100")
114 g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "1")
115 g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0")
116 g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "1")
117 g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "1")
118 g_pCvarSaveType = register_cvar("ze_levels_save_type", "0")
119 g_pCvarDBInfo[Host] = register_cvar("ze_levels_host", "127.0.0.1")
120 g_pCvarDBInfo[User] = register_cvar("ze_levels_user", "root")
121 g_pCvarDBInfo[Pass] = register_cvar("ze_levels_pass", "password")
122 g_pCvarDBInfo[DB] = register_cvar("ze_levels_dbname", "levels_db")
123
124 // Messages
125 g_MsgSync = CreateHudSyncObj()
126
127 if (get_pcvar_num(g_pCvarSaveType))
128 {
129 set_task(0.1, "Delay_MySQL_Init")
130 }
131}
132
133public plugin_end()
134{
135 if (get_pcvar_num(g_pCvarSaveType))
136 {
137 if (g_hTuple != Empty_Handle)
138 {
139 SQL_FreeHandle(g_hTuple)
140 }
141 }
142}
143
144public Delay_MySQL_Init()
145{
146 MySQL_Init()
147}
148
149public MySQL_Init()
150{
151 if (!get_pcvar_num(g_pCvarSaveType))
152 return
153
154 new szHost[64], szUser[32], szPass[32], szDB[128]
155
156 get_pcvar_string(g_pCvarDBInfo[Host], szHost, charsmax(szHost))
157 get_pcvar_string(g_pCvarDBInfo[User], szUser, charsmax(szUser))
158 get_pcvar_string(g_pCvarDBInfo[Pass], szPass, charsmax(szPass))
159 get_pcvar_string(g_pCvarDBInfo[DB], szDB, charsmax(szDB))
160
161 g_hTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB)
162
163 // Let's ensure that the g_hTuple will be valid, we will access the database to make sure
164 new iErrorCode, szError[512], Handle:hSQLConnection
165
166 hSQLConnection = SQL_Connect(g_hTuple, iErrorCode, szError, charsmax(szError))
167
168 if (hSQLConnection != Empty_Handle)
169 {
170 log_amx("[MySQL][LVL] Successfully connected to host: %s (ALL IS OK).", szHost)
171 SQL_FreeHandle(hSQLConnection)
172 }
173 else
174 {
175 // Disable plugin
176 set_fail_state("[LVL] Failed to connect to MySQL database: %s.", szError)
177 }
178
179 SQL_ThreadQuery(g_hTuple, "QueryCreateTable", g_szTable)
180}
181
182public QueryCreateTable(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
183{
184 SQL_IsFail(iFailState, iError, szError, g_szLogFile)
185}
186
187public client_putinserver(id)
188{
189 if(is_user_hltv(id) || is_user_bot(id))
190 return
191
192 // Just 1 second delay
193 set_task(1.0, "DelayLoad", id)
194
195 // Other tasks
196 set_task(1.0, "Show_Hud", id+TASK_SHOWHUD, _, _, "b")
197 set_task(0.1, "Check_MaxXP", id, _, _, "b")
198}
199
200public DelayLoad(id)
201{
202 // Load his data
203 LoadData(id)
204}
205
206public client_disconnected(id)
207{
208 if(is_user_hltv(id) || is_user_bot(id))
209 return
210
211 remove_task(id+TASK_SHOWHUD)
212 remove_task(id)
213}
214
215public Check_MaxXP(id)
216{
217 new iCurrentMaxXP = g_iMaxXP[id]
218
219 new iMaxXP = get_pcvar_num(g_pCvarMaxXPFirstLevel)
220
221 for (new i = 1; i <= g_iLevel[id]; i++)
222 {
223 iMaxXP = floatround(float(iMaxXP) * get_pcvar_float(g_pCvarMaxLevelsIncrement))
224 }
225
226 if (iCurrentMaxXP != iMaxXP)
227 {
228 g_iMaxXP[id] = iMaxXP
229 }
230}
231
232public Show_Hud(taskid)
233{
234 new iPlayer = ID_SHOWHUD
235
236 if (!is_user_alive(iPlayer))
237 {
238 iPlayer = pev(iPlayer, pev_iuser2)
239
240 if (!is_user_alive(iPlayer))
241 return
242 }
243
244 if (get_pcvar_num(g_pCvarPercentageStyle) != 0)
245 {
246 if(iPlayer != ID_SHOWHUD)
247 {
248 set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
249 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0)
250 }
251 else if (ze_is_user_zombie(iPlayer))
252 {
253 set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
254 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
255 }
256 else
257 {
258 set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
259 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
260 }
261 }
262 else
263 {
264 if(iPlayer != ID_SHOWHUD)
265 {
266 if (get_pcvar_num(g_pCvarAddCommas) == 1)
267 {
268 new szSpecXP[15], szSpecMaxXP[15]
269
270 AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP))
271 AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP))
272
273 set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
274 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP)
275 }
276 else
277 {
278 set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
279 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer])
280 }
281 }
282 else if (ze_is_user_zombie(iPlayer))
283 {
284 if (get_pcvar_num(g_pCvarAddCommas) == 1)
285 {
286 new szZombieXP[15], szZombieMaxXP[15]
287
288 AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP))
289 AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP))
290
291 set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
292 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP)
293 }
294 else
295 {
296 set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
297 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
298 }
299 }
300 else
301 {
302 if (get_pcvar_num(g_pCvarAddCommas) == 1)
303 {
304 new szHumanXP[15], szHumanMaxXP[15]
305
306 AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP))
307 AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP))
308
309 set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
310 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP)
311 }
312 else
313 {
314 set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
315 ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
316 }
317 }
318 }
319}
320
321public ze_roundend(WinTeam)
322{
323 if (WinTeam == ZE_TEAM_HUMAN)
324 {
325 for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
326 {
327 if (!is_user_alive(id) || get_member(id, m_iTeam) == TEAM_TERRORIST)
328 continue
329
330 g_iXP[id] += get_pcvar_num(g_pCvarEscapeSuccess)
331 SaveData(id)
332 Check_User_Level(id)
333 }
334 }
335
336 remove_task(TASK_SHOWHUD)
337}
338
339public Check_User_Level(id)
340{
341 if(!is_user_connected(id))
342 return
343
344 if(g_iXP[id] >= g_iMaxXP[id])
345 {
346 if (get_pcvar_num(g_pCvarStartFromZero) == 1)
347 {
348 g_iXP[id] = 0
349 }
350
351 new szName[32]
352 g_iLevel[id] ++
353 g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * get_pcvar_float(g_pCvarMaxLevelsIncrement))
354 get_user_name(id, szName, charsmax(szName))
355 ze_colored_print(0, "!g%s !tNow in Level %i!y!", szName, g_iLevel[id])
356 ExecuteForward(Fw_LevelUP, ForwardReturn, id)
357
358 SaveData(id)
359
360 PlaySound(id, LEVELUP)
361
362 if (get_pcvar_num(g_pCvarLevelEffects) != 0)
363 {
364 // Screen Fade
365 message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
366 write_short(4096*2)
367 write_short(4096*5)
368 write_short(0x0001)
369 write_byte(random(256))
370 write_byte(random(256))
371 write_byte(random(256))
372 write_byte(150)
373 message_end()
374
375 // Screen Shake
376 message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, id)
377 write_short(255<<14)
378 write_short(10<<14)
379 write_short(255<<14)
380 message_end()
381 }
382 }
383}
384
385public ze_user_infected(iVictim, iInfector)
386{
387 if (iInfector == 0)
388 return
389
390 g_iXP[iInfector] += get_pcvar_num(g_pCvarZombieInfect)
391 SaveData(iInfector)
392 Check_User_Level(iInfector)
393}
394
395public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
396{
397 // Player Damage Himself
398 if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_user_zombie(iAttacker) || !get_pcvar_num(g_pCvarEnableDamage))
399 return HC_CONTINUE
400
401 // Same Team?
402 if (get_member(iAttacker, m_iTeam) == get_member(iVictim, m_iTeam))
403 return HC_CONTINUE
404
405 // Store Damage For every Player
406 g_fDamage[iAttacker] += fDamage
407
408 // Damage Calculator Equal or Higher than needed damage
409 if (g_fDamage[iAttacker] >= get_pcvar_float(g_pCvarRequiredDamage))
410 {
411 // Give Player The Coins
412 g_iXP[iAttacker] += get_pcvar_num(g_pCvarDamageAward)
413 SaveData(iAttacker)
414 Check_User_Level(iAttacker)
415
416 // Rest The Damage Calculator
417 g_fDamage[iAttacker] = 0.0
418 }
419 return HC_CONTINUE
420}
421
422public SaveData(id)
423{
424 new szAuthID[35], szName[32]
425 get_user_authid(id, szAuthID, charsmax(szAuthID))
426 get_user_name(id, szName, charsmax(szName))
427
428 // Set Him to max if he Higher than Max Value
429 if (g_iLevel[id] > MAX_LEVEL)
430 {
431 g_iLevel[id] = MAX_LEVEL
432 }
433
434 if (g_iXP[id] > MAX_XP)
435 {
436 g_iXP[id] = MAX_XP
437 }
438
439 if (!get_pcvar_num(g_pCvarSaveType))
440 {
441 new szData[256]
442 formatex(szData , charsmax(szData), "%i %i %i", g_iLevel[id], g_iXP[id], g_iMaxXP[id])
443
444 // Open the Vaults
445 g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
446 g_iRanksVaultHandle = nvault_open(g_szRanksVault)
447
448 // Saves His Data
449 nvault_set(g_iLevelsVaultHandle, szAuthID, szData)
450 nvault_set(g_iRanksVaultHandle, szAuthID, szName)
451
452 // Close Vaults
453 nvault_close(g_iLevelsVaultHandle)
454 nvault_close(g_iRanksVaultHandle)
455 }
456 else
457 {
458 new szQuery[128]
459 formatex(szQuery, charsmax(szQuery), "UPDATE `ze_levels` SET `Level` = '%d', `XP` = '%d', `Max_XP` = '%d' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[id], g_iMaxXP[id], szAuthID)
460 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery)
461 }
462}
463
464public QuerySetData(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
465{
466 SQL_IsFail(iFailState, iError, szError, g_szLogFile)
467}
468
469public QuerySetData2(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
470{
471 SQL_IsFail(iFailState, iError, szError, g_szLogFile)
472}
473
474public LoadData(id)
475{
476 new szData[256], szAuthID[35]
477
478 get_user_authid(id, szAuthID, charsmax(szAuthID))
479
480 if (!get_pcvar_num(g_pCvarSaveType))
481 {
482 // Useless Variable
483 new iTimestamp, iExists
484
485 // Open the Vault
486 g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
487
488 iExists = nvault_lookup(g_iLevelsVaultHandle, szAuthID, szData, charsmax(szData), iTimestamp)
489
490 // Close Vault
491 nvault_close(g_iLevelsVaultHandle)
492
493 if (!iExists)
494 {
495 g_iLevel[id] = 0
496 g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
497 g_iMaxXP[id] = get_pcvar_num(g_pCvarMaxXPFirstLevel)
498 SaveData(id)
499 }
500 else
501 {
502 new iLevel[32], iXP[32], iMaxLevel[32]
503 parse(szData, iLevel, 31, iXP, 31, iMaxLevel, 31)
504
505 g_iLevel[id] = str_to_num(iLevel)
506 g_iXP[id] = str_to_num(iXP)
507 g_iMaxXP[id] = str_to_num(iMaxLevel)
508 }
509 }
510 else
511 {
512 new szQuery[128], szData[5]
513 formatex(szQuery, charsmax(szQuery), "SELECT * FROM `ze_levels` WHERE ( `SteamID` = '%s' );", szAuthID)
514
515 num_to_str(id, szData, charsmax(szData))
516 SQL_ThreadQuery(g_hTuple, "QuerySelectData", szQuery, szData, charsmax(szData))
517 }
518}
519
520public QuerySelectData(iFailState, Handle:hQuery, szError[], iError, szData[])
521{
522 if (SQL_IsFail(iFailState, iError, szError, g_szLogFile))
523 return
524
525 new id = str_to_num(szData)
526
527 // No results for this query means this is new player
528 if (!SQL_NumResults(hQuery))
529 {
530 new szSteamId[36], szQuery[128]
531 get_user_authid(id, szSteamId, charsmax(szSteamId))
532
533 g_iLevel[id] = 0
534 g_iXP[id] = 0
535 g_iMaxXP[id] = get_pcvar_num(g_pCvarMaxXPFirstLevel)
536 return
537 }
538
539 g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level"))
540 g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP"))
541 g_iMaxXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Max_XP"))
542}
543
544public native_ze_get_user_xp(id)
545{
546 if(!is_user_connected(id))
547 {
548 log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
549 return false;
550 }
551
552 return g_iXP[id]
553}
554
555public native_ze_set_user_xp(id, amount)
556{
557 if(!is_user_connected(id))
558 {
559 log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
560 return false;
561 }
562
563 g_iXP[id] = amount
564
565 Check_User_Level(id)
566 return true;
567}
568
569public native_ze_get_user_level(id)
570{
571 if(!is_user_connected(id))
572 {
573 log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
574 return false;
575 }
576
577 return g_iLevel[id]
578}
579
580public native_ze_set_user_level(id, amount)
581{
582 if(!is_user_connected(id))
583 {
584 log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
585 return false;
586 }
587
588 g_iLevel[id] = amount
589
590 if (get_pcvar_num(g_pCvarStartFromZero) == 1)
591 {
592 g_iXP[id] = 0
593 }
594
595 return true;
596}
597
598public native_ze_get_user_max_xp(id)
599{
600 if(!is_user_connected(id))
601 {
602 log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
603 return false;
604 }
605
606 return g_iMaxXP[id]
607}
608
609public native_ze_set_user_max_xp(id, amount)
610{
611 if(!is_user_connected(id))
612 {
613 log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
614 return false;
615 }
616
617 g_iMaxXP[id] = amount
618 return true;
619}