Advertisement
Guest User

Level system

a guest
Feb 21st, 2017
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.45 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <cstrike>
  3. #include <hamsandwich>
  4. #include <levels>
  5. #include <nvault>
  6. #include <sqlx>
  7.  
  8. #define TASK_SHOW_LEVEL 10113
  9. #define MAXLEVEL 24
  10.  
  11. new const LEVELS[MAXLEVEL] = {
  12. 90, // Needed on level 1
  13. 180, // Needed on level 2
  14. 300, // Needed on level 3
  15. 450, // Needed on level 4
  16. 700, // Needed on level 5
  17. 1200, // Needed on level 6
  18. 1800, // Needed on level 7
  19. 2800, // Needed on level 8
  20. 4100, // Needed on level 9
  21. 5200, // Needed on level 10
  22. 6000, // Needed on level 11
  23. 6800, // Needed on level 12
  24. 8200, // Needed on level 13
  25. 10200, // Needed on level 14
  26. 12000, // Needed on level 15
  27. 15000, // Needed on level 16
  28. 17500, // Needed on level 17
  29. 20500, // Needed on level 18
  30. 25500, // Needed on level 19
  31. 29000, // Needed on level 20
  32. 35000, // Needed on level 21
  33. 46000, // Needed on level 22
  34. 58000, // Needed on level 23
  35. 150000 // Needed on level 24
  36. }; // Needed Xp on each Levels
  37.  
  38. new const szTables[][] =
  39. {
  40. "CREATE TABLE IF NOT EXISTS `mytable` ( `player_id` varchar(32) NOT NULL,`player_level` int(8) default NULL,`player_xp` int(16) default NULL,PRIMARY KEY (`player_id`) ) TYPE=MyISAM;"
  41. }
  42.  
  43. new PlayerXp[33]
  44. new PlayerLevel[33]
  45. new Handle:g_hTuple;
  46.  
  47. new g_Vault
  48. new g_kills[33]
  49. new g_maxplayers, g_msgHudSync1
  50. new savexp, save_type, xp_kill, xp_triple, enable_triple, triple_kills, xp_ultra, ultra_kills, enable_ultra, escape_xp, damage_hp, damage_xp
  51.  
  52. new mysqlx_host, mysqlx_user, mysqlx_db, mysqlx_pass
  53.  
  54. public plugin_init()
  55. {
  56. register_plugin("[ZE] Levels XP", "1.0", "Raheem");
  57.  
  58. save_type = register_cvar("levels_savetype","0"); // Save Xp to : 1 = MySQL, 0 = NVault.
  59. savexp = register_cvar("levels_save","2"); // Save Xp by : 2 = Name, 1 = SteamID, 0 = IP.
  60. xp_kill = register_cvar("levels_xp","10"); // How much xp gain if you killed someone?
  61.  
  62. enable_triple = register_cvar("levels_triple","1"); // Enable Triple Kill bonus xp? 1 = Yes, 0 = No.
  63. xp_triple = register_cvar("levels_triple_xp","3"); // How much bonus xp give for Triple Kill?
  64. triple_kills = register_cvar("levels_triple_kills","3"); // How much kills needed to give bonus xp?
  65. enable_ultra = register_cvar("levels_ultra","1"); // Enable Ultra Kill bonus xp? 1 = Yes, 0 = No.
  66. xp_ultra = register_cvar("levels_ultra_xp","5"); // How much bonus xp give for Ultra Kill?
  67. ultra_kills = register_cvar("levels_ultra_kills","6"); // How much kills needed to give bonus xp?
  68. escape_xp = register_cvar("escape_xp_amount", "20") // How much XP given to Humans when escape success?
  69. damage_hp = register_cvar("required_damage_hp", "60") // The damage if the player made more than it he will awarded.
  70. damage_xp = register_cvar("damage_xp_amount", "2") //How much XP given to human who make damage more than damage_hp?
  71.  
  72.  
  73. // SQLx cvars
  74. mysqlx_host = register_cvar ("levels_host", ""); // The host from the db
  75. mysqlx_user = register_cvar ("levels_user", ""); // The username from the db login
  76. mysqlx_pass = register_cvar ("levels_pass", ""); // The password from the db login
  77. mysqlx_db = register_cvar ("levels_dbname", ""); // The database name
  78.  
  79. // Events
  80. register_event("DeathMsg", "event_deathmsg", "a");
  81. register_event("StatusValue", "Event_StatusValue", "bd", "1=2")
  82. register_event("Damage", "on_damage", "b", "2!0", "3=0", "4!0")
  83.  
  84.  
  85. // Forwards //
  86. RegisterHam(Ham_Spawn, "player", "fwd_PlayerSpawn", 1);
  87.  
  88. MySQLx_Init()
  89.  
  90. g_msgHudSync1 = CreateHudSyncObj()
  91. g_maxplayers = get_maxplayers();
  92. }
  93.  
  94. public plugin_cfg()
  95. {
  96. //Open our vault and have g_Vault store the handle.
  97. g_Vault = nvault_open( "levels" );
  98.  
  99. //Make the plugin error if vault did not successfully open
  100. if ( g_Vault == INVALID_HANDLE )
  101. set_fail_state( "Error opening levels nVault, file does not exist!" );
  102. }
  103.  
  104. public plugin_precache()
  105. {
  106. precache_sound( "levelup_ZE/ze_levelup.wav" );
  107. }
  108.  
  109. public plugin_natives()
  110. {
  111. register_native("get_user_xp", "native_get_user_xp", 1);
  112. register_native("set_user_xp", "native_set_user_xp", 1);
  113. register_native("get_user_level", "native_get_user_level", 1);
  114. register_native("set_user_level", "native_set_user_level", 1);
  115. register_native("get_user_max_level", "native_get_user_max_level", 1);
  116. }
  117.  
  118. public plugin_end()
  119. {
  120. //Close the vault when the plugin ends (map change\server shutdown\restart)
  121. nvault_close( g_Vault );
  122. }
  123.  
  124. public client_connect(id)
  125. {
  126. LoadLevel(id)
  127. }
  128.  
  129. public client_disconnect(id)
  130. {
  131. SaveLevel(id)
  132.  
  133. PlayerXp[id] = 0;
  134. PlayerLevel[id] = 0;
  135.  
  136. remove_task( TASK_SHOW_LEVEL + id );
  137. }
  138.  
  139. public fwd_PlayerSpawn(id)
  140. {
  141.  
  142. if(!is_user_alive(id))
  143. return;
  144.  
  145. g_kills[id] = 0
  146.  
  147. remove_task( TASK_SHOW_LEVEL + id );
  148.  
  149. set_task(0.1, "task_show_level", TASK_SHOW_LEVEL + id)
  150. }
  151.  
  152. public event_deathmsg()
  153. {
  154. new g_attacker = read_data(1);
  155. new g_victim = read_data(2);
  156.  
  157. new counted_triple = get_pcvar_num(xp_kill) + get_pcvar_num(xp_triple)
  158. new counted_ultra = get_pcvar_num(xp_kill) + get_pcvar_num(xp_ultra)
  159.  
  160. if((1 <= g_attacker <= g_maxplayers))
  161. {
  162. if(g_victim != g_attacker)
  163. {
  164. g_kills[g_attacker]++;
  165. if(PlayerLevel[g_attacker] < MAXLEVEL-1)
  166. {
  167.  
  168. if ( g_kills[g_attacker] == get_pcvar_num(triple_kills) && get_pcvar_num(enable_triple) )
  169. {
  170. PlayerXp[g_attacker] += counted_triple
  171.  
  172. set_hudmessage(0, 40, 255, 0.50, 0.33, 1, 2.0, 8.0)
  173. show_hudmessage(g_attacker, "+%i Triple Kill XP!", counted_triple)
  174. }
  175. else if ( g_kills[g_attacker] == get_pcvar_num(ultra_kills) && get_pcvar_num(enable_ultra) )
  176. {
  177. PlayerXp[g_attacker] += counted_ultra
  178.  
  179. set_hudmessage(255, 30, 0, 0.50, 0.33, 1, 2.0, 8.0)
  180. show_hudmessage(g_attacker, "+%i Ultra Kill XP!", counted_ultra)
  181. }
  182. else
  183. {
  184. PlayerXp[g_attacker] += get_pcvar_num(xp_kill)
  185.  
  186. set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 8.0)
  187. show_hudmessage(g_attacker, "+%i XP", get_pcvar_num(xp_kill))
  188. }
  189.  
  190. check_level(g_attacker)
  191. }
  192. }
  193. }
  194. }
  195.  
  196. public ze_roundend()
  197. {
  198. new Alive_Terrorists_Number = GetPlayersNum(CsTeams:CS_TEAM_T)
  199. new Alive_CT_Numbers = GetPlayersNum(CsTeams:CS_TEAM_CT)
  200.  
  201. new iPlayers[32], iNum
  202. get_players(iPlayers, iNum, "ace", "CT")
  203.  
  204. for (new i = 0; i < iNum; i++)
  205. {
  206. if(PlayerLevel[iPlayers[i]] < MAXLEVEL-1)
  207. {
  208. if((Alive_CT_Numbers > Alive_Terrorists_Number) && (Alive_Terrorists_Number == 0))
  209. {
  210. set_user_xp(iPlayers[i], get_user_xp(iPlayers[i]) + get_pcvar_num(escape_xp))
  211. client_print_color(iPlayers[i], "!y[!gLevel!y-!gSystem!y] !t+%i XP!y.", get_pcvar_num(escape_xp))
  212. }
  213. check_level(iPlayers[i])
  214. }
  215. }
  216. }
  217.  
  218. public on_damage(id)
  219. {
  220. static attacker,damage;
  221.  
  222. attacker = get_user_attacker(id)
  223. damage = read_data(2)
  224. if(PlayerLevel[attacker] < MAXLEVEL-1)
  225. {
  226. if ((damage >= get_pcvar_num(damage_hp)) && is_user_connected(attacker) && (cs_get_user_team(attacker) == CS_TEAM_CT) && (attacker != id))
  227. {
  228. set_user_xp(attacker, get_user_xp(attacker) + get_pcvar_num(damage_xp))
  229. set_hudmessage(random(256), random(256), random(256), -1.0, 0.7, 1, 3.0, 8.0, 0.5, 0.5)
  230. show_hudmessage(attacker, "+%i XP", get_pcvar_num(damage_xp))
  231. }
  232.  
  233. check_level(attacker)
  234. }
  235. }
  236.  
  237. public Event_StatusValue(id)
  238. {
  239. new target = read_data(2)
  240. if(target != id && target != 0)
  241. {
  242. static sName[32];
  243. get_user_name(target, sName, 31)
  244.  
  245. set_hudmessage(0, 255, 255, -1.0, 0.3, 0, 0.0, 6.0, 0.0, 0.0, 2)
  246. ShowSyncHudMsg(id, g_msgHudSync1, "[Name: %s || Level: %d]", sName, PlayerLevel[target])
  247. }
  248. }
  249.  
  250. public task_show_level(task)
  251. {
  252. new id = task - TASK_SHOW_LEVEL
  253.  
  254. if(!is_user_alive(id))
  255. return;
  256.  
  257. set_hudmessage(0, 255, 255, 0.02, 0.05, 0, 0.0, 0.3, 0.0, 0.0)
  258. ShowSyncHudMsg(id, g_msgHudSync1 , "[Level : %i || XP : %i / %i]", PlayerLevel[id], PlayerXp[id], LEVELS[PlayerLevel[id]])
  259.  
  260. set_task(0.1, "task_show_level", TASK_SHOW_LEVEL + id)
  261. }
  262.  
  263. public check_level(id)
  264. {
  265. if(PlayerLevel[id] < MAXLEVEL-1)
  266. {
  267. while(PlayerXp[id] >= LEVELS[PlayerLevel[id]])
  268. {
  269. PlayerLevel[id]++;
  270.  
  271. static name[32] ; get_user_name(id, name, charsmax(name));
  272. client_cmd(id,"spk levelup_ZE/ze_levelup.wav")
  273. client_print_color(0, "!y[!gLevel!y-!gSystem!y] !t%s !yReaches Level !t%i!y.", name, PlayerLevel[id]);
  274. }
  275. }
  276. }
  277.  
  278. public MySQLx_Init()
  279. {
  280. if (!get_pcvar_num(save_type))
  281. return;
  282.  
  283. new szHost[64], szUser[32], szPass[32], szDB[128];
  284.  
  285. get_pcvar_string( mysqlx_host, szHost, charsmax( szHost ) );
  286. get_pcvar_string( mysqlx_user, szUser, charsmax( szUser ) );
  287. get_pcvar_string( mysqlx_pass, szPass, charsmax( szPass ) );
  288. get_pcvar_string( mysqlx_db, szDB, charsmax( szDB ) );
  289.  
  290. g_hTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDB );
  291.  
  292. for ( new i = 0; i < sizeof szTables; i++ )
  293. {
  294. SQL_ThreadQuery( g_hTuple, "QueryCreateTable", szTables[i])
  295. }
  296. }
  297.  
  298. public QueryCreateTable( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
  299. {
  300. if( iFailState == TQUERY_CONNECT_FAILED
  301. || iFailState == TQUERY_QUERY_FAILED )
  302. {
  303. log_amx( "%s", szError );
  304.  
  305. return;
  306. }
  307. }
  308.  
  309. SaveLevel(id)
  310. {
  311. new szAuth[33];
  312. new szKey[64];
  313.  
  314. if ( get_pcvar_num(savexp) == 0 )
  315. {
  316. get_user_ip( id, szAuth , charsmax(szAuth), 1);
  317. formatex( szKey , 63 , "%s-IP" , szAuth);
  318. }
  319. else if ( get_pcvar_num(savexp) == 1 )
  320. {
  321. get_user_authid( id , szAuth , charsmax(szAuth) );
  322. formatex( szKey , 63 , "%s-ID" , szAuth);
  323. }
  324. else if ( get_pcvar_num(savexp) == 2 )
  325. {
  326. get_user_name( id, szAuth , charsmax(szAuth) );
  327. formatex( szKey , 63 , "%s-NAME" , szAuth);
  328. }
  329.  
  330. if ( !get_pcvar_num(save_type) )
  331. {
  332. new szData[256];
  333.  
  334. formatex( szData , 255 , "%i#%i#" , PlayerLevel[id], PlayerXp[id] );
  335.  
  336. nvault_set( g_Vault , szKey , szData );
  337. }
  338. else
  339. {
  340. static szQuery[ 128 ];
  341.  
  342. formatex( szQuery, 127, "REPLACE INTO `mytable` (`player_id`, `player_level`, `player_xp`) VALUES ('%s', '%d', '%d');", szAuth , PlayerLevel[id], PlayerXp[id] );
  343.  
  344. SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
  345. }
  346. }
  347.  
  348. LoadLevel(id)
  349. {
  350. new szAuth[33];
  351. new szKey[40];
  352.  
  353. if ( get_pcvar_num(savexp) == 0 )
  354. {
  355. get_user_ip( id, szAuth , charsmax(szAuth), 1);
  356. formatex( szKey , 63 , "%s-IP" , szAuth);
  357. }
  358. else if ( get_pcvar_num(savexp) == 1 )
  359. {
  360. get_user_authid( id , szAuth , charsmax(szAuth) );
  361. formatex( szKey , 63 , "%s-ID" , szAuth);
  362. }
  363. else if ( get_pcvar_num(savexp) == 2 )
  364. {
  365. get_user_name( id, szAuth , charsmax(szAuth) );
  366. formatex( szKey , 63 , "%s-NAME" , szAuth);
  367. }
  368.  
  369. if ( !get_pcvar_num(save_type) )
  370. {
  371. new szData[256];
  372.  
  373. formatex(szData , 255, "%i#%i#", PlayerLevel[id], PlayerXp[id])
  374.  
  375. nvault_get(g_Vault, szKey, szData, 255)
  376.  
  377. replace_all(szData , 255, "#", " ")
  378. new xp[32], level[32]
  379. parse(szData, level, 31, xp, 31)
  380. PlayerLevel[id] = str_to_num(level)
  381. PlayerXp[id] = str_to_num(xp)
  382. }
  383. else
  384. {
  385. static szQuery[ 128 ], iData[ 1 ];
  386. formatex( szQuery, 127, "SELECT `player_level`, `player_xp` FROM `mytable` WHERE ( `player_id` = '%s' );", szAuth );
  387.  
  388. iData[ 0 ] = id;
  389. SQL_ThreadQuery( g_hTuple, "QuerySelectData", szQuery, iData, 1 );
  390. }
  391. }
  392.  
  393. public QuerySelectData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
  394. {
  395. if( iFailState == TQUERY_CONNECT_FAILED
  396. || iFailState == TQUERY_QUERY_FAILED )
  397. {
  398. log_amx( "%s", szError );
  399.  
  400. return;
  401. }
  402. else
  403. {
  404. new id = iData[ 0 ];
  405.  
  406. new ColLevel = SQL_FieldNameToNum(hQuery, "player_level")
  407. new ColXp = SQL_FieldNameToNum(hQuery, "player_xp")
  408.  
  409. while (SQL_MoreResults(hQuery))
  410. {
  411. PlayerLevel[id] = SQL_ReadResult(hQuery, ColLevel);
  412. PlayerXp[id] = SQL_ReadResult(hQuery, ColXp);
  413.  
  414. SQL_NextRow(hQuery)
  415. }
  416. }
  417. }
  418.  
  419. public QuerySetData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
  420. {
  421. if( iFailState == TQUERY_CONNECT_FAILED
  422. || iFailState == TQUERY_QUERY_FAILED )
  423. {
  424. log_amx( "%s", szError );
  425.  
  426. return;
  427. }
  428. }
  429.  
  430. //======================Natives======================//
  431.  
  432. // Native: get_user_xp
  433. public native_get_user_xp(id)
  434. {
  435. return PlayerXp[id];
  436. }
  437. // Native: set_user_xp
  438. public native_set_user_xp(id, amount)
  439. {
  440. PlayerXp[id] = amount;
  441. }
  442. // Native: get_user_level
  443. public native_get_user_level(id)
  444. {
  445. return PlayerLevel[id];
  446. }
  447. // Native: set_user_xp
  448. public native_set_user_level(id, amount)
  449. {
  450. PlayerLevel[id] = amount;
  451. }
  452. // Native: Gets user level by Xp
  453. public native_get_user_max_level(id)
  454. {
  455. return LEVELS[PlayerLevel[id]];
  456. }
  457.  
  458. //==================================================//
  459.  
  460. //======================STOCKS======================//
  461.  
  462. stock GetPlayersNum(CsTeams:iTeam) {
  463. new iNum;
  464. for( new i = 1; i <= get_maxplayers(); i++ ) {
  465. if(is_user_connected(i) && is_user_alive(i) && cs_get_user_team(i) == iTeam)
  466. iNum++;
  467. }
  468. return iNum;
  469. }
  470.  
  471. stock client_print_color(const id, const input[], any:...)
  472. {
  473. new count = 1, players[32];
  474. static msg[191];
  475. vformat(msg, 190, input, 3);
  476.  
  477. replace_all(msg, 190, "!g", "^x04"); // Green Color
  478. replace_all(msg, 190, "!y", "^x01"); // Default Color
  479. replace_all(msg, 190, "!t", "^x03"); // Team Color
  480.  
  481. if (id) players[0] = id; else get_players(players, count, "ch");
  482. {
  483. for (new i = 0; i < count; i++)
  484. {
  485. if (is_user_connected(players[i]))
  486. {
  487. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
  488. write_byte(players[i]);
  489. write_string(msg);
  490. message_end();
  491. }
  492. }
  493. }
  494. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement