Djuro_Guzijan

Untitled

Feb 4th, 2015
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.32 KB | None | 0 0
  1. #include < amxmodx >
  2. #include < amxmisc >
  3. #include < nvault >
  4. #include < engine >
  5. #include < fun >
  6. #include < hamsandwich >
  7.  
  8. #pragma semicolon 1
  9.  
  10. #define NAME "Knife Experience Mod"
  11. #define VERSION "1.0.0 beta"
  12. #define AUTHOR "SNIPER"
  13. #define VAR "KNFexpMOD"
  14.  
  15. #define Slots 32
  16. #define Cvars 6
  17. #define Task 517
  18.  
  19. new vault;
  20.  
  21. new SyncHudObj1;
  22. new SyncHudObj2;
  23.  
  24. enum {
  25. LevelRatio,
  26. HappyHourStart,
  27. HappyHourStop,
  28. InstantLoad,
  29. ChangeDelay, // 5(4)
  30. ChatPrefix
  31. };
  32.  
  33. new cvar_pointer[Cvars];
  34.  
  35. new const knife_names[][] = {
  36. "KNIFE_NONE", // 0
  37. "KNIFE_DEFAULT",
  38. "KNIFE_MACHETE",
  39. "KNIFE_BAK",
  40. "KNIFE_POCKET",
  41. "KNIFE_BUTCHER",// 5
  42. "KNIFE_WOODEN",
  43. "KNIFE_DRAGON",
  44. "KNIFE_NINJA",
  45. "KNIFE_BLACK",
  46. "KNIFE_HITMAN", // 10
  47. "KNIFE_ICE",
  48. "KNIFE_JEDAJ"
  49. };
  50.  
  51. new const file_names[][] = {
  52. "machete", // 2
  53. "bak",
  54. "pocket",
  55. "butcher", // 5
  56. "wooden",
  57. "dragon",
  58. "ninja",
  59. "black",
  60. "hitman", // 10
  61. "ice",
  62. "jedaj"
  63. };
  64.  
  65. new g_msg_bartime;
  66. new g_msg_saytext;
  67.  
  68. new user_exp[Slots+1];
  69. new user_knife[Slots+1];
  70. new user_lvl[Slots+1] = 1;
  71. new earned_knifes[Slots+1] = 3;
  72. new user_new_knife[Slots+1];
  73.  
  74. new AuthID[Slots+1][35];
  75.  
  76. public plugin_init()
  77. {
  78. register_plugin(NAME, VERSION, AUTHOR);
  79. register_cvar(VAR, VERSION, (FCVAR_SERVER|FCVAR_SPONLY));
  80.  
  81. RegisterHam(Ham_Killed, "player", "PlayerKilled", 1);
  82. RegisterHam(Ham_Spawn, "player", "PlayerSpawn", 1);
  83.  
  84. register_event("CurWeapon", "CurWeapon", "be", "1=1");
  85.  
  86. register_clcmd("say", "SayHandle");
  87. register_clcmd("say_team", "SayHandle");
  88.  
  89. register_concmd("knife_setlvl", "CmdSetLvl", ADMIN_RCON, "<nick> <level>");
  90.  
  91. register_dictionary("knife_expmod.txt");
  92.  
  93. vault = nvault_open("KnifeExpMod");
  94.  
  95. g_msg_bartime = get_user_msgid("BarTime");
  96. g_msg_saytext = get_user_msgid("SayText");
  97.  
  98. SyncHudObj1 = CreateHudSyncObj();
  99. SyncHudObj2 = CreateHudSyncObj();
  100.  
  101. register_message(get_user_msgid("SayText"), "SayTextHandle");
  102.  
  103. static const cvar_defaults[][] = { "80", "22", "10", "1", "7", "[Knife EXP]" };
  104. static const cvar_names[][] = { "knife_level_ratio", "knife_happy_hour_start", "knife_happy_hour_stop",
  105. "knife_instant_load", "knife_change_delay", "knife_chat_prefix" };
  106.  
  107. for(new i = 0; i < Cvars; i++)
  108. cvar_pointer[i] = register_cvar(cvar_names[i], cvar_defaults[i]);
  109.  
  110. static cfg_file[] = "addons/amxmodx/configs/knife/settings.cfg";
  111. new line_num = file_size(cfg_file, 1);
  112.  
  113. if(!file_exists(cfg_file) || line_num != Cvars+1)
  114. {
  115. if(!dir_exists("addons/amxmodx/configs/knife/"))
  116. mkdir("addons/amxmodx/configs/knife/");
  117.  
  118. if(file_exists(cfg_file))
  119. delete_file(cfg_file);
  120.  
  121. static const cvar_descriptions[][] = { "LEVEL_RATIO", "START", "STOP", "PREFIX", "INST_LOAD", "DELAY" };
  122. static line[128];
  123.  
  124. for(new i = 0; i < Cvars; i++)
  125. {
  126. formatex(line, charsmax(line), "%s ^"%s^" // %L", cvar_names[i], cvar_defaults[i], LANG_SERVER, cvar_descriptions[i]);
  127. write_file(cfg_file, line);
  128. }
  129. }
  130.  
  131. server_cmd("exec %s", cfg_file);
  132. }
  133.  
  134. public plugin_precache()
  135. {
  136. precache_model("models/v_knife.mdl");
  137. precache_model("models/p_knife.mdl");
  138. static dir[34];
  139.  
  140. for(new i = 0; i < sizeof file_names; i++)
  141. {
  142. formatex(dir, charsmax(dir), "models/knife_expmod/v_%s.mdl", file_names[i]);
  143. precache_model(dir);
  144. formatex(dir, charsmax(dir), "models/knife_expmod/p_%s.mdl", file_names[i]);
  145. precache_model(dir);
  146. }
  147.  
  148. precache_sound("knife_expmod/select");
  149. precache_sound("knife_expmod/level_up");
  150. precache_sound("knife_expmod/exit");
  151. }
  152.  
  153. public KnifeMenu(id)
  154. {
  155. static szText[60];
  156. formatex(szText, charsmax(szText), "%L", id, "MENU_TITLE");
  157. new menu = menu_create(szText, "KnifeMenu_Handle");
  158.  
  159. for(new i = 1; i <= earned_knifes[id]; i++)
  160. {
  161. LoadData(id, i);
  162. formatex(szText, charsmax(szText), "\y%L \rLvl:\y %i \rExp:\y %i", id, knife_names[i], user_lvl[id], user_exp[id]);
  163. menu_additem(menu, szText);
  164. }
  165.  
  166. LoadData(id, user_knife[id]);
  167.  
  168. formatex(szText, charsmax(szText), "%L",id, "MENU_NEXT");
  169. menu_setprop(menu, MPROP_NEXTNAME, szText);
  170. formatex(szText, charsmax(szText), "%L",id, "MENU_BACK");
  171. menu_setprop(menu, MPROP_BACKNAME, szText);
  172. formatex(szText, charsmax(szText), "%L",id, "MENU_EXIT", earned_knifes[id]);
  173. menu_setprop(menu, MPROP_EXITNAME, szText);
  174.  
  175. client_cmd(id, "spk knife_expmod/select");
  176. menu_display(id, menu);
  177. }
  178.  
  179. public KnifeMenu_Handle(id, menu, item)
  180. {
  181. if(item == MENU_EXIT)
  182. {
  183. client_cmd(id, "spk knife_expmod/exit");
  184. menu_destroy(menu);
  185. return PLUGIN_CONTINUE;
  186. }
  187. item++;
  188. SaveData(id);
  189.  
  190. if(item == user_knife[id])
  191. {
  192. PrintChat(id, "%L", id, "ALREADY_HAVE");
  193. client_cmd(id, "spk knife_expmod/exit");
  194. return PLUGIN_CONTINUE;
  195. }
  196.  
  197. if(user_new_knife[id])
  198. {
  199. PrintChat(id, "%L", id, "CHANGE_PROGRES");
  200. client_cmd(id, "spk knife_expmod/exit");
  201. return PLUGIN_CONTINUE;
  202. }
  203.  
  204. if(user_knife[id])
  205. {
  206. user_new_knife[id] = item;
  207.  
  208. if(is_user_alive(id))
  209. {
  210. PrintChat(id, "%L", id, "WILL_BE_CHANGED");
  211. SetTask(id);
  212. strip_user_weapons(id);
  213. user_knife[id] = 0;
  214. }
  215. else
  216. PrintChat(id, "%L", id, "WILL_NEXT_ROUND");
  217. }
  218. else
  219. {
  220. if(is_user_alive(id))
  221. {
  222. strip_user_weapons(id);
  223. give_item(id, "weapon_knife");
  224. }
  225.  
  226. user_knife[id] = item;
  227. LoadData(id, user_knife[id]);
  228. }
  229.  
  230. menu_destroy(menu);
  231. client_cmd(id, "spk knife_expmod/select");
  232. return PLUGIN_CONTINUE;
  233. }
  234.  
  235. public client_putinserver(id)
  236. {
  237. user_exp[id] = 0;
  238. user_knife[id] = 0;
  239. user_lvl[id] = 0;
  240. earned_knifes[id] = 0;
  241. user_new_knife[id] = 0;
  242.  
  243. get_user_authid(id, AuthID[id], charsmax(AuthID));
  244. LoadData(id, user_knife[id]);
  245. }
  246.  
  247. public client_disconnect(id)
  248. {
  249. SaveData(id);
  250. SetTask(id, 0);
  251. }
  252.  
  253. public client_PreThink(id)
  254. {
  255. if(!is_user_connected(id))
  256. return PLUGIN_CONTINUE;
  257.  
  258. if(!is_user_alive(id))
  259. {
  260. new target = entity_get_int(id, EV_INT_iuser2);
  261.  
  262. if(!target || target == id)
  263. return PLUGIN_CONTINUE;
  264.  
  265. new nick[64];
  266. get_user_name(target, nick, charsmax(nick));
  267. set_hudmessage(0, 255, 255, 0.02, 0.56, 0, 0.0, 0.3, 0.0, 0.0, -1);
  268. ShowSyncHudMsg(id, SyncHudObj1, "Nick: %s^n%L: %L^nLvl: %i^nExp: %i / %i^n%L: %i",nick, id, "KNIFE", id, knife_names[user_knife[target]], user_lvl[target], user_exp[target], ExpForLevel(target), id, "EARNED", earned_knifes[target]);
  269. return PLUGIN_CONTINUE;
  270. }
  271.  
  272. set_hudmessage(255, 0, 0, 0.02, 0.17, 0, 0.0, 0.3, 0.0, 0.0, -1);
  273. ShowSyncHudMsg(id, SyncHudObj1, "[%L: %L ]^n[Lvl: %i ]^n[Exp: %i /%i ]^n[%L: %i ]", id, "KNIFE", id, knife_names[user_knife[id]], user_lvl[id], user_exp[id], ExpForLevel(id), id, "EARNED", earned_knifes[id]);
  274. return PLUGIN_CONTINUE;
  275. }
  276.  
  277. public SayHandle(id)
  278. {
  279. new cmd[25], argv[25];
  280. formatex(cmd, charsmax(cmd), "/%L", id, "SAY_CMD");
  281. read_argv(1, argv, charsmax(argv));
  282.  
  283. if(containi(argv, cmd) != -1)
  284. KnifeMenu(id);
  285. }
  286.  
  287. public SayTextHandle()
  288. {
  289. new id = get_msg_arg_int(1);
  290.  
  291. if(!is_user_connected(id))
  292. return PLUGIN_CONTINUE;
  293.  
  294. new Message[256];
  295. get_msg_arg_string(2, Message, charsmax(Message));
  296.  
  297. if(equal(Message,"#Cstrike_Chat_All"))
  298. {
  299. copy(Message, charsmax(Message), "");
  300. formatex(Message, charsmax(Message), "^x04[lvl: %i]", user_lvl[id]);
  301. add(Message, charsmax(Message), "^x03 %s1^x01 : %s2");
  302. }
  303. else
  304. {
  305. copy(Message, charsmax(Message), "");
  306. new len = formatex(Message, charsmax(Message), "^x04[lvl: %i]", user_lvl[id]);
  307. len += formatex(Message[len], charsmax(Message)-len, " ");
  308. get_msg_arg_string(2, Message[len], charsmax(Message)-len);
  309. }
  310.  
  311. set_msg_arg_string(2, Message);
  312. return PLUGIN_CONTINUE;
  313. }
  314.  
  315. public CallSpawn(id)
  316. {
  317. id -= Task;
  318. PlayerSpawn(id);
  319. }
  320.  
  321. public PlayerSpawn(id)
  322. {
  323. SetTask(id, 0);
  324. if(!is_user_alive(id))
  325. return PLUGIN_CONTINUE;
  326.  
  327. SaveData(id);
  328. strip_user_weapons(id);
  329.  
  330. if(user_new_knife[id])
  331. {
  332. user_knife[id] = user_new_knife[id];
  333. user_new_knife[id] = 0;
  334. }
  335.  
  336. if(!user_knife[id])
  337. {
  338. KnifeMenu(id);
  339. return PLUGIN_CONTINUE;
  340. }
  341.  
  342. LoadData(id, user_knife[id]);
  343. give_item(id, "weapon_knife");
  344.  
  345. return PLUGIN_CONTINUE;
  346. }
  347.  
  348. public PlayerKilled(id, attacker)
  349. {
  350. if(!is_user_alive(attacker) || is_user_alive(id))
  351. return PLUGIN_CONTINUE;
  352.  
  353. if(user_new_knife[id])
  354. {
  355. SetTask(id, 0);
  356. PrintChat(id, "%L", id, "WILL_NEXT_ROUND");
  357. }
  358.  
  359. new new_exp = random_num(50, 150);
  360.  
  361. if(IsHappyHour())
  362. new_exp*=2;
  363.  
  364. user_exp[attacker] += new_exp;
  365.  
  366. CheckLevel(attacker);
  367.  
  368. return PLUGIN_CONTINUE;
  369. }
  370.  
  371. public CheckLevel(id)
  372. {
  373. new current_lvl = user_lvl[id];
  374.  
  375. while(user_exp[id] >= ExpForLevel(id))
  376. user_lvl[id]++;
  377.  
  378. if(user_lvl[id] == current_lvl)
  379. {
  380. SaveData(id);
  381. return PLUGIN_CONTINUE;
  382. }
  383.  
  384. set_hudmessage(255, 0, 0, -1.0, 0.20, 2, 2.0, 8.0);
  385. ShowSyncHudMsg(id, SyncHudObj2, "%L", id, "WELCOME_LEVEL", user_lvl[id]);
  386. client_cmd(id, "spk knife_expmod/level_up");
  387.  
  388. if(is_user_alive(id))
  389. {
  390. static MapName[32], Health;
  391. get_mapname(MapName, charsmax(MapName));
  392.  
  393. if(contain(MapName, "1hp") != -1) Health = 1;
  394. else if(contain(MapName, "35hp") != -1) Health = 35;
  395. else if(contain(MapName, "65hp") != -1) Health = 65;
  396. else if(contain(MapName, "200hp") != -1) Health = 200;
  397. else Health = 0;
  398.  
  399. if(is_user_alive(id) && get_user_health(id) < Health)
  400. {
  401. set_user_health(id, Health);
  402. PrintChat(id, "%L", id, "WON_HEALTH");
  403. }
  404. }
  405.  
  406. Calculate(id);
  407. SaveData(id);
  408. return PLUGIN_CONTINUE;
  409. }
  410.  
  411. public Calculate(id)
  412. {
  413. while((earned_knifes[id] < 4 && user_lvl[id] > 9 && user_knife[id] <= 3) || (earned_knifes[id] < 5 && user_lvl[id] > 19 && user_knife[id] == 4) || (earned_knifes[id] < 6 && user_lvl[id] > 29 && user_knife[id] == 5))
  414. {
  415. earned_knifes[id] ++;
  416. set_hudmessage(255, 0, 0, -1.0, 0.15, 2, 2.0, 12.0);
  417. ShowSyncHudMsg(id, SyncHudObj2, "%L %L!",id, "YOU_EARNED", id, knife_names[earned_knifes[id]]);
  418. }
  419. while((earned_knifes[id] < 7 && user_lvl[id] >= 40 && user_knife[id] == 6) || (earned_knifes[id] < 9 && user_lvl[id] >= 50 && user_knife[id] > 6 && user_knife[id] < 9) || (earned_knifes[id] < 11 && user_lvl[id] >= 60 && user_knife[id] > 8 && user_knife[id] < 11))
  420. {
  421. earned_knifes[id] += 2;
  422. set_hudmessage(255, 0, 0, -1.0, 0.15, 2, 2.0, 12.0);
  423. ShowSyncHudMsg(id, SyncHudObj2, "%L %L %L %L!",id, "YOU_EARNED", id, knife_names[earned_knifes[id]-1], id, "AND", id, knife_names[earned_knifes[id]]);
  424. }
  425.  
  426. if(earned_knifes[id] >= sizeof knife_names)
  427. earned_knifes[id] = sizeof knife_names - 1;
  428. }
  429.  
  430. stock ExpForLevel(id)
  431. return user_lvl[id]*get_pcvar_num(cvar_pointer[LevelRatio]) + user_lvl[id]*get_pcvar_num(cvar_pointer[LevelRatio]);
  432.  
  433. public CmdSetLvl(id, level, cid)
  434. {
  435. if(!cmd_access(id, level, cid, 3))
  436. {
  437. client_cmd(id, "spk knife_expmod/exit");
  438. return PLUGIN_CONTINUE;
  439. }
  440.  
  441. new arg[35];
  442. read_argv(1, arg, sizeof arg -1);
  443. new player = cmd_target(id, arg);
  444.  
  445. if(!player)
  446. return PLUGIN_CONTINUE;
  447.  
  448. read_argv(2, arg, sizeof arg -1);
  449. new value = str_to_num(arg);
  450.  
  451. if(value < 3)
  452. value = 3;
  453.  
  454. else if(value >= sizeof knife_names)
  455. value = sizeof knife_names -1;
  456.  
  457. earned_knifes[player] = value;
  458. SaveData(player);
  459.  
  460. if(!dir_exists("addons/amxmodx/configs/knife/logs/"))
  461. mkdir("addons/amxmodx/configs/knife/logs/");
  462.  
  463. static LogFile[58]; new LogText[196];
  464. static Date[9]; new Time[9];
  465. new Name[32], Name2[32];
  466.  
  467. get_time("%H:%M:%S", Time, charsmax(Time));
  468. get_time("%y%m%d", Date, charsmax(Date));
  469. get_user_name(id, Name, charsmax(Name));
  470. get_user_name(player, Name2, charsmax(Name2));
  471. formatex(LogFile, charsmax(LogFile), "addons/amxmodx/configs/knife/logs/%s.log", Date);
  472. formatex(LogText, charsmax(LogText), "^n^n^n[%s] Admin: %s^"<%s>^" %L: knife_setlvl ^"%s<%s>^" level %i",Time, Name, AuthID[id], LANG_SERVER, "COMMAND", Name2, AuthID[player], value);
  473. write_file(LogFile, LogText);
  474. client_cmd(id, "spk knife_expmod/select");
  475.  
  476. return PLUGIN_CONTINUE;
  477. }
  478.  
  479. public CurWeapon(id)
  480. {
  481. if(get_user_weapon(id) != CSW_KNIFE || !is_user_connected(id))
  482. return PLUGIN_CONTINUE;
  483.  
  484. if(user_knife[id] == 1 || !user_knife[id])
  485. {
  486. entity_set_string(id, EV_SZ_viewmodel, "models/v_knife.mdl");
  487. entity_set_string(id, EV_SZ_weaponmodel, "models/p_knife.mdl");
  488. return PLUGIN_CONTINUE;
  489. }
  490.  
  491. static Model[34];
  492. formatex(Model, charsmax(Model), "models/knife_expmod/v_%s.mdl", file_names[user_knife[id]-2]);
  493. entity_set_string(id, EV_SZ_viewmodel, Model);
  494. formatex(Model, charsmax(Model), "models/knife_expmod/p_%s.mdl", file_names[user_knife[id]-2]);
  495. entity_set_string(id, EV_SZ_weaponmodel, Model);
  496.  
  497. return PLUGIN_CONTINUE;
  498. }
  499.  
  500. public SaveData(id)
  501. {
  502. new VaultKey[45], VaultData[25];
  503.  
  504. formatex(VaultKey, charsmax(VaultKey),"%s-%i-exp", AuthID[id], user_knife[id]);
  505. formatex(VaultData, charsmax(VaultData),"#%i#%i", user_exp[id], user_lvl[id]);
  506. nvault_set(vault, VaultKey, VaultData);
  507.  
  508. formatex(VaultKey, charsmax(VaultKey), "%s-knifes", AuthID[id]);
  509. formatex(VaultData, charsmax(VaultData), "#%i#%i", earned_knifes[id], user_knife[id]);
  510. nvault_set(vault, VaultKey, VaultData);
  511. }
  512.  
  513. public LoadData(id, knife)
  514. {
  515. new VaultKey[45], VaultData[15], PlayerData[2][8];
  516.  
  517. formatex(VaultKey, charsmax(VaultKey), "%s-knifes", AuthID[id]);
  518. nvault_get(vault, VaultKey, VaultData, charsmax(VaultData));
  519. replace_all(VaultData, charsmax(VaultData), "#", " ");
  520. parse(VaultData, PlayerData[0], 7, PlayerData[1], 7);
  521.  
  522. earned_knifes[id] = str_to_num(PlayerData[0])>3?str_to_num(PlayerData[0]):3;
  523.  
  524. if(!user_knife[id] && get_pcvar_num(cvar_pointer[InstantLoad]) && !user_exp[id])
  525. {
  526. user_knife[id] = str_to_num(PlayerData[1]);
  527. knife = user_knife[id];
  528. }
  529.  
  530. copy(PlayerData[0], 7, "");
  531. copy(PlayerData[1], 7, "");
  532.  
  533. formatex(VaultKey, charsmax(VaultKey),"%s-%i-exp", AuthID[id], knife);
  534. nvault_get(vault, VaultKey, VaultData, charsmax(VaultData));
  535. replace_all(VaultData, charsmax(VaultData), "#", " ");
  536. parse(VaultData, PlayerData[0], 7, PlayerData[1], 7);
  537.  
  538. user_exp[id] = str_to_num(PlayerData[0]);
  539. user_lvl[id] = str_to_num(PlayerData[1])>0?str_to_num(PlayerData[1]):1;
  540. }
  541.  
  542. stock bool: IsHappyHour()
  543. {
  544. static Hours, Minutes, Seconds;
  545. time(Hours, Minutes, Seconds);
  546.  
  547. new BeginHour = get_pcvar_num(cvar_pointer[HappyHourStart]);
  548. new EndHour = get_pcvar_num(cvar_pointer[HappyHourStop]);
  549.  
  550. if(BeginHour == EndHour)
  551. return false;
  552.  
  553. if(BeginHour > EndHour && (Hours >= BeginHour || Hours < EndHour))
  554. return true;
  555.  
  556. if(BeginHour < EndHour && (Hours >= BeginHour || Hours < EndHour))
  557. return true;
  558.  
  559. return false;
  560. }
  561.  
  562. stock MakeBarTime(index, seconds)
  563. {
  564. message_begin(MSG_ONE_UNRELIABLE, g_msg_bartime, _, index);
  565. write_short(seconds);
  566. message_end();
  567. }
  568.  
  569. stock PrintChat(index, const input[], any:...)
  570. {
  571. static prefix[25];
  572. static message[191];
  573.  
  574. get_pcvar_string(cvar_pointer[ChatPrefix], prefix, charsmax(prefix));
  575.  
  576. new len = formatex(message, charsmax(message), "^4%s^1 ", prefix);
  577. vformat(message[len], 190-len, input, 3);
  578.  
  579. message_begin(MSG_ONE_UNRELIABLE, g_msg_saytext, _, index);
  580. write_byte(index);
  581. write_string(message);
  582. message_end();
  583. }
  584.  
  585. stock SetTask(index, set = 1)
  586. {
  587. if(set && !task_exists(index+Task))
  588. {
  589. set_task(get_pcvar_float(cvar_pointer[ChangeDelay]), "CallSpawn", index+Task);
  590. MakeBarTime(index, get_pcvar_num(cvar_pointer[ChangeDelay]));
  591. return PLUGIN_CONTINUE;
  592. }
  593.  
  594. if(task_exists(index+Task))
  595. {
  596. remove_task(index+Task);
  597. MakeBarTime(index, 0);
  598. }
  599. return PLUGIN_CONTINUE;
  600. }
  601.  
  602. public plugin_end()
  603. nvault_close(vault);
Add Comment
Please, Sign In to add comment