Advertisement
Guest User

Untitled

a guest
Apr 10th, 2020
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.99 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <crxknives_const>
  4. #include <cromchat>
  5. #include <fakemeta>
  6. #include <hamsandwich>
  7. #include <nvault>
  8.  
  9. native crxranks_get_max_levels()
  10. native crxranks_get_rank_by_level(level, buffer[], len)
  11. native crxranks_get_user_level(id)
  12. native crxranks_get_user_xp(id)
  13.  
  14. new const g_szNatives[][] =
  15. {
  16. "crxranks_get_max_levels",
  17. "crxranks_get_rank_by_level",
  18. "crxranks_get_user_level",
  19. "crxranks_get_user_xp"
  20. }
  21.  
  22. #if !defined m_pPlayer
  23. const m_pPlayer = 41
  24. #endif
  25.  
  26. #if !defined client_disconnected
  27. #define client_disconnected client_disconnect
  28. #endif
  29.  
  30. new const PLUGIN_VERSION[] = "3.1.1"
  31. const Float:DELAY_ON_CONNECT = 3.0
  32.  
  33. #if !defined MAX_AUTHID_LENGTH
  34. const MAX_AUTHID_LENGTH = 35
  35. #endif
  36.  
  37. #if !defined MAX_NAME_LENGTH
  38. const MAX_NAME_LENGTH = 100
  39. #endif
  40.  
  41. #if !defined MAX_PLAYERS
  42. const MAX_PLAYERS = 32
  43. #endif
  44.  
  45. enum
  46. {
  47. SOUND_NONE = 0,
  48. SOUND_DEPLOY,
  49. SOUND_HIT,
  50. SOUND_HITWALL,
  51. SOUND_SLASH,
  52. SOUND_STAB
  53. }
  54.  
  55. enum _:Knives
  56. {
  57. NAME[MAX_NAME_LENGTH],
  58. V_MODEL[CRXKNIVES_MAX_SOUND_LENGTH],
  59. P_MODEL[CRXKNIVES_MAX_SOUND_LENGTH],
  60. DEPLOY_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
  61. HIT_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
  62. HITWALL_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
  63. SLASH_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
  64. STAB_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
  65. SELECT_SOUND[CRXKNIVES_MAX_SOUND_LENGTH],
  66. FLAG,
  67. LEVEL,
  68. XP,
  69. SELECT_MESSAGES_NUM,
  70. bool:SHOW_RANK,
  71. bool:HAS_CUSTOM_SOUND,
  72. Array:SELECT_MESSAGES,
  73. Trie:ATTRIBUTES
  74. }
  75.  
  76. enum _:CvarsReg
  77. {
  78. cvar_km_open_at_spawn,
  79. cvar_km_save_choice,
  80. cvar_km_only_dead,
  81. cvar_km_select_message,
  82. cvar_km_knife_only_skills,
  83. cvar_km_admin_bypass
  84. }
  85.  
  86. enum _:Cvars
  87. {
  88. km_open_at_spawn,
  89. km_save_choice,
  90. km_only_dead,
  91. km_select_message,
  92. km_knife_only_skills,
  93. km_admin_bypass
  94. }
  95.  
  96. new Array:g_aKnives,
  97. bool:g_bFirstTime[MAX_PLAYERS + 1],
  98. bool:g_bRankSystem,
  99. bool:g_bGetLevel,
  100. bool:g_bGetXP,
  101. g_eCvars[Cvars],
  102. g_eCvarsReg[CvarsReg],
  103. g_eKnife[MAX_PLAYERS + 1][Knives],
  104. g_szAuth[MAX_PLAYERS + 1][MAX_AUTHID_LENGTH],
  105. g_iKnife[MAX_PLAYERS + 1],
  106. g_fwdKnifeUpdated,
  107. g_fwdAttemptChange,
  108. g_iMenuFlags,
  109. g_iKnivesNum,
  110. g_iCallback,
  111. g_iVault
  112.  
  113. public plugin_init()
  114. {
  115. register_plugin("Knife Models", PLUGIN_VERSION, "OciXCrom")
  116. register_cvar("CRXKnifeModels", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
  117.  
  118. if(!g_iKnivesNum)
  119. {
  120. set_fail_state("No knives found in the configuration file.")
  121. }
  122.  
  123. register_dictionary("KnifeModels.txt")
  124.  
  125. RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
  126. register_forward(FM_EmitSound, "OnEmitSound")
  127. RegisterHam(Ham_Item_Deploy, "weapon_knife", "OnSelectKnife", 1)
  128.  
  129. register_clcmd("say /knife", "Cmd_Knife")
  130. register_clcmd("say_team /knife", "Cmd_Knife")
  131. register_clcmd("crxknives_select", "Cmd_Select", _, "<knife id>")
  132.  
  133. g_fwdKnifeUpdated = CreateMultiForward("crxknives_knife_updated", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
  134. g_fwdAttemptChange = CreateMultiForward("crxknives_attempt_change", ET_STOP, FP_CELL, FP_CELL)
  135.  
  136. g_iCallback = menu_makecallback("CheckKnifeAccess")
  137.  
  138. g_eCvarsReg[cvar_km_open_at_spawn] = register_cvar("km_open_at_spawn", "0")
  139. g_eCvarsReg[cvar_km_save_choice] = register_cvar("km_save_choice", "1")
  140. g_eCvarsReg[cvar_km_only_dead] = register_cvar("km_only_dead", "0")
  141. g_eCvarsReg[cvar_km_select_message] = register_cvar("km_select_message", "1")
  142. g_eCvarsReg[cvar_km_knife_only_skills] = register_cvar("km_knife_only_skills", "1")
  143. g_eCvarsReg[cvar_km_admin_bypass] = register_cvar("km_admin_bypass", "0")
  144. }
  145.  
  146. public plugin_precache()
  147. {
  148. if(LibraryExists("crxranks", LibType_Library))
  149. {
  150. g_bRankSystem = true
  151. }
  152.  
  153. g_aKnives = ArrayCreate(Knives)
  154. ReadFile()
  155. }
  156.  
  157. public plugin_cfg()
  158. {
  159. g_eCvars[km_save_choice] = get_pcvar_num(g_eCvarsReg[cvar_km_save_choice])
  160. g_eCvars[km_open_at_spawn] = get_pcvar_num(g_eCvarsReg[cvar_km_open_at_spawn])
  161. g_eCvars[km_only_dead] = get_pcvar_num(g_eCvarsReg[cvar_km_only_dead])
  162. g_eCvars[km_select_message] = get_pcvar_num(g_eCvarsReg[cvar_km_select_message])
  163. g_eCvars[km_knife_only_skills] = get_pcvar_num(g_eCvarsReg[cvar_km_knife_only_skills])
  164. g_eCvars[km_admin_bypass] = get_pcvar_num(g_eCvarsReg[cvar_km_admin_bypass])
  165.  
  166. if(g_eCvars[km_save_choice])
  167. {
  168. g_iVault = nvault_open("KnifeModels")
  169. }
  170. }
  171.  
  172. public plugin_end()
  173. {
  174. for(new eKnife[Knives], i; i < g_iKnivesNum; i++)
  175. {
  176. ArrayGetArray(g_aKnives, i, eKnife)
  177. ArrayDestroy(eKnife[SELECT_MESSAGES])
  178. TrieDestroy(eKnife[ATTRIBUTES])
  179. }
  180.  
  181. ArrayDestroy(g_aKnives)
  182.  
  183. if(g_eCvars[km_save_choice])
  184. {
  185. nvault_close(g_iVault)
  186. }
  187. }
  188.  
  189. ReadFile()
  190. {
  191. new szFilename[256]
  192. get_configsdir(szFilename, charsmax(szFilename))
  193. add(szFilename, charsmax(szFilename), "/KnifeModels.ini")
  194. new iFilePointer = fopen(szFilename, "rt")
  195.  
  196. if(iFilePointer)
  197. {
  198. new szData[160], szKey[32], szValue[128], szSound[128], iMaxLevels
  199. new eKnife[Knives], bool:bCustom
  200.  
  201. if(g_bRankSystem)
  202. {
  203. iMaxLevels = crxranks_get_max_levels()
  204. }
  205.  
  206. while(!feof(iFilePointer))
  207. {
  208. fgets(iFilePointer, szData, charsmax(szData))
  209. trim(szData)
  210.  
  211. switch(szData[0])
  212. {
  213. case EOS, '#', ';': continue
  214. case '[':
  215. {
  216. if(szData[strlen(szData) - 1] == ']')
  217. {
  218. if(g_iKnivesNum)
  219. {
  220. push_knife(eKnife)
  221. }
  222.  
  223. g_iKnivesNum++
  224. replace(szData, charsmax(szData), "[", "")
  225. replace(szData, charsmax(szData), "]", "")
  226. copy(eKnife[NAME], charsmax(eKnife[NAME]), szData)
  227.  
  228. eKnife[V_MODEL][0] = EOS
  229. eKnife[P_MODEL][0] = EOS
  230. eKnife[DEPLOY_SOUND][0] = EOS
  231. eKnife[HIT_SOUND][0] = EOS
  232. eKnife[HITWALL_SOUND][0] = EOS
  233. eKnife[SLASH_SOUND][0] = EOS
  234. eKnife[STAB_SOUND][0] = EOS
  235. eKnife[SELECT_SOUND][0] = EOS
  236. eKnife[FLAG] = ADMIN_ALL
  237. eKnife[HAS_CUSTOM_SOUND] = false
  238. eKnife[SELECT_MESSAGES_NUM] = 0
  239. eKnife[SELECT_MESSAGES] = _:ArrayCreate(CRXKNIVES_MAX_MESSAGE_LENGTH)
  240. eKnife[ATTRIBUTES] = _:TrieCreate()
  241.  
  242. if(g_bRankSystem)
  243. {
  244. eKnife[LEVEL] = 0
  245. eKnife[SHOW_RANK] = false
  246. eKnife[XP] = 0
  247. }
  248.  
  249. static const ATTRIBUTE_NAME[] = "NAME"
  250. TrieSetString(eKnife[ATTRIBUTES], ATTRIBUTE_NAME, szData)
  251. }
  252. else continue
  253. }
  254. default:
  255. {
  256. strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
  257. trim(szKey); trim(szValue)
  258. bCustom = true
  259.  
  260. TrieSetString(eKnife[ATTRIBUTES], szKey, szValue)
  261.  
  262. if(equal(szKey, "FLAG"))
  263. {
  264. eKnife[FLAG] = read_flags(szValue)
  265. g_iMenuFlags |= eKnife[FLAG]
  266. }
  267. else if(equal(szKey, "LEVEL") && g_bRankSystem)
  268. {
  269. eKnife[LEVEL] = clamp(str_to_num(szValue), 0, iMaxLevels)
  270.  
  271. if(!g_bGetLevel)
  272. {
  273. g_bGetLevel = true
  274. }
  275. }
  276. else if(equal(szKey, "SHOW_RANK") && g_bRankSystem)
  277. {
  278. eKnife[SHOW_RANK] = _:clamp(str_to_num(szValue), false, true)
  279. }
  280. else if(equal(szKey, "XP") && g_bRankSystem)
  281. {
  282. eKnife[XP] = _:clamp(str_to_num(szValue), 0)
  283.  
  284. if(!g_bGetXP)
  285. {
  286. g_bGetXP = true
  287. }
  288. }
  289. else if(equal(szKey, "V_MODEL"))
  290. {
  291. copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), szValue)
  292. }
  293. else if(equal(szKey, "P_MODEL"))
  294. {
  295. copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), szValue)
  296. }
  297. else if(equal(szKey, "DEPLOY_SOUND"))
  298. {
  299. copy(eKnife[DEPLOY_SOUND], charsmax(eKnife[DEPLOY_SOUND]), szValue)
  300. }
  301. else if(equal(szKey, "HIT_SOUND"))
  302. {
  303. copy(eKnife[HIT_SOUND], charsmax(eKnife[HIT_SOUND]), szValue)
  304. }
  305. else if(equal(szKey, "HITWALL_SOUND"))
  306. {
  307. copy(eKnife[HITWALL_SOUND], charsmax(eKnife[HITWALL_SOUND]), szValue)
  308. }
  309. else if(equal(szKey, "SLASH_SOUND"))
  310. {
  311. copy(eKnife[SLASH_SOUND], charsmax(eKnife[SLASH_SOUND]), szValue)
  312. }
  313. else if(equal(szKey, "STAB_SOUND"))
  314. {
  315. copy(eKnife[STAB_SOUND], charsmax(eKnife[STAB_SOUND]), szValue)
  316. }
  317. else if(equal(szKey, "SELECT_SOUND"))
  318. {
  319. bCustom = false
  320. copy(eKnife[SELECT_SOUND], charsmax(eKnife[SELECT_SOUND]), szValue)
  321. }
  322. else if(equal(szKey, "SELECT_MESSAGE"))
  323. {
  324. ArrayPushString(eKnife[SELECT_MESSAGES], szValue)
  325. eKnife[SELECT_MESSAGES_NUM]++
  326. }
  327. else continue
  328.  
  329. static const szModelArg[] = "_MODEL"
  330. static const szSoundArg[] = "_SOUND"
  331.  
  332. if(contain(szKey, szModelArg) != -1)
  333. {
  334. if(!file_exists(szValue))
  335. {
  336. log_amx("ERROR: model ^"%s^" not found!", szValue)
  337. }
  338. else
  339. {
  340. precache_model(szValue)
  341. }
  342. }
  343. else if(contain(szKey, szSoundArg) != -1)
  344. {
  345. formatex(szSound, charsmax(szSound), "sound/%s", szValue)
  346.  
  347. if(!file_exists(szSound))
  348. {
  349. log_amx("ERROR: sound ^"%s^" not found!", szSound)
  350. }
  351. else
  352. {
  353. precache_sound(szValue)
  354. }
  355.  
  356. if(bCustom)
  357. {
  358. eKnife[HAS_CUSTOM_SOUND] = true
  359. }
  360. }
  361. }
  362. }
  363. }
  364.  
  365. if(g_iKnivesNum)
  366. {
  367. push_knife(eKnife)
  368. }
  369.  
  370. fclose(iFilePointer)
  371. }
  372. }
  373.  
  374. public client_connect(id)
  375. {
  376. g_bFirstTime[id] = true
  377. ArrayGetArray(g_aKnives, 0, g_eKnife[id])
  378. g_iKnife[id] = 0
  379.  
  380. new iReturn
  381. ExecuteForward(g_fwdKnifeUpdated, iReturn, id, g_iKnife[id], true)
  382.  
  383. if(g_eCvars[km_save_choice])
  384. {
  385. get_user_authid(id, g_szAuth[id], charsmax(g_szAuth[]))
  386. set_task(DELAY_ON_CONNECT, "load_data", id)
  387. }
  388. }
  389.  
  390. public client_disconnected(id)
  391. {
  392. if(g_eCvars[km_save_choice])
  393. {
  394. use_vault(id, true)
  395. }
  396. }
  397.  
  398. public OnEmitSound(id, iChannel, const szSample[])
  399. {
  400. if(!is_user_connected(id) || !g_eKnife[id][HAS_CUSTOM_SOUND] || !is_knife_sound(szSample))
  401. {
  402. return FMRES_IGNORED
  403. }
  404.  
  405. switch(detect_knife_sound(szSample))
  406. {
  407. case SOUND_DEPLOY: if(g_eKnife[id][DEPLOY_SOUND][0]) { play_knife_sound(id, g_eKnife[id][DEPLOY_SOUND][0]); return FMRES_SUPERCEDE; }
  408. case SOUND_HIT: if(g_eKnife[id][HIT_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HIT_SOUND][0]); return FMRES_SUPERCEDE; }
  409. case SOUND_HITWALL: if(g_eKnife[id][HITWALL_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HITWALL_SOUND][0]); return FMRES_SUPERCEDE; }
  410. case SOUND_SLASH: if(g_eKnife[id][SLASH_SOUND][0]) { play_knife_sound(id, g_eKnife[id][SLASH_SOUND][0]); return FMRES_SUPERCEDE; }
  411. case SOUND_STAB: if(g_eKnife[id][STAB_SOUND][0]) { play_knife_sound(id, g_eKnife[id][STAB_SOUND][0]); return FMRES_SUPERCEDE; }
  412. }
  413.  
  414. return FMRES_IGNORED
  415. }
  416.  
  417. public Cmd_Knife(id)
  418. {
  419. if(g_eCvars[km_only_dead] && is_user_alive(id))
  420. {
  421. CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
  422. return PLUGIN_HANDLED
  423. }
  424.  
  425. static eKnife[Knives]
  426. new szTitle[128], szItem[128], iLevel, iXP
  427. formatex(szTitle, charsmax(szTitle), "%L", id, "KM_MENU_TITLE")
  428.  
  429. if(g_bGetLevel)
  430. {
  431. iLevel = crxranks_get_user_level(id)
  432. }
  433.  
  434. if(g_bGetXP)
  435. {
  436. iXP = crxranks_get_user_xp(id)
  437. }
  438.  
  439. new iMenu = menu_create(szTitle, "MenuHandler")
  440.  
  441. for(new iFlags = get_user_flags(id), i; i < g_iKnivesNum; i++)
  442. {
  443. ArrayGetArray(g_aKnives, i, eKnife)
  444. copy(szItem, charsmax(szItem), eKnife[NAME])
  445.  
  446. if(g_bRankSystem)
  447. {
  448. if(eKnife[LEVEL] && iLevel < eKnife[LEVEL])
  449. {
  450. if(eKnife[SHOW_RANK])
  451. {
  452. static szRank[32]
  453. crxranks_get_rank_by_level(eKnife[LEVEL], szRank, charsmax(szRank))
  454. format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_RANK", szRank)
  455. }
  456. else
  457. {
  458. format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_LEVEL", eKnife[LEVEL])
  459. }
  460. }
  461.  
  462. if(eKnife[XP] && iXP < eKnife[XP])
  463. {
  464. format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_XP", eKnife[XP])
  465. }
  466. }
  467.  
  468. if(eKnife[FLAG] != ADMIN_ALL && !(iFlags & eKnife[FLAG]))
  469. {
  470. format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_VIP_ONLY")
  471. }
  472.  
  473. if(g_iKnife[id] == i)
  474. {
  475. format(szItem, charsmax(szItem), "%s %L", szItem, id, "KM_MENU_SELECTED")
  476. }
  477.  
  478. menu_additem(iMenu, szItem, eKnife[NAME], eKnife[FLAG], g_iCallback)
  479. }
  480.  
  481. if(menu_pages(iMenu) > 1)
  482. {
  483. formatex(szItem, charsmax(szItem), "%s%L", szTitle, id, "KM_MENU_TITLE_PAGE")
  484. menu_setprop(iMenu, MPROP_TITLE, szItem)
  485. }
  486.  
  487. menu_display(id, iMenu)
  488. return PLUGIN_HANDLED
  489. }
  490.  
  491. public Cmd_Select(id, iLevel, iCid)
  492. {
  493. if(!cmd_access(id, iLevel, iCid, 2))
  494. {
  495. return PLUGIN_HANDLED
  496. }
  497.  
  498. if(g_eCvars[km_only_dead] && is_user_alive(id))
  499. {
  500. CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
  501. return PLUGIN_HANDLED
  502. }
  503.  
  504. new szKnife[4]
  505. read_argv(1, szKnife, charsmax(szKnife))
  506.  
  507. new iKnife = str_to_num(szKnife)
  508.  
  509. if(!is_knife_valid(iKnife))
  510. {
  511. console_print(id, "%l", "KM_INVALID_KNIFE", g_iKnivesNum - 1)
  512. return PLUGIN_HANDLED
  513. }
  514.  
  515. if(!has_knife_access(id, iKnife))
  516. {
  517. console_print(id, "%l", "KM_NO_ACCESS")
  518. return PLUGIN_HANDLED
  519. }
  520.  
  521. select_knife(id, iKnife)
  522. return PLUGIN_HANDLED
  523. }
  524.  
  525. public MenuHandler(id, iMenu, iItem)
  526. {
  527. if(g_eCvars[km_only_dead] && is_user_alive(id))
  528. {
  529. CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_ONLY_DEAD")
  530. goto @MENU_DESTROY
  531. }
  532.  
  533. if(!is_user_connected(id))
  534. {
  535. goto @MENU_DESTROY
  536. }
  537.  
  538. if(iItem != MENU_EXIT)
  539. {
  540. select_knife(id, iItem)
  541. }
  542.  
  543. @MENU_DESTROY:
  544. menu_destroy(iMenu)
  545. return PLUGIN_HANDLED
  546. }
  547.  
  548. select_knife(id, iKnife)
  549. {
  550. new iReturn
  551. ExecuteForward(g_fwdAttemptChange, iReturn, id, iKnife)
  552.  
  553. if(iReturn == PLUGIN_HANDLED)
  554. {
  555. return
  556. }
  557.  
  558. g_iKnife[id] = iKnife
  559. ArrayGetArray(g_aKnives, iKnife, g_eKnife[id])
  560. ExecuteForward(g_fwdKnifeUpdated, iReturn, id, iKnife, false)
  561.  
  562. if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
  563. {
  564. refresh_knife_model(id)
  565. }
  566.  
  567. if(g_eCvars[km_select_message])
  568. {
  569. CC_SendMessage(id, "%L %L", id, "KM_CHAT_PREFIX", id, "KM_CHAT_SELECTED", g_eKnife[id][NAME])
  570. }
  571.  
  572. if(g_eKnife[id][SELECT_MESSAGES_NUM])
  573. {
  574. for(new i; i < g_eKnife[id][SELECT_MESSAGES_NUM]; i++)
  575. {
  576. CC_SendMessage(id, "%a", ArrayGetStringHandle(g_eKnife[id][SELECT_MESSAGES], i))
  577. }
  578. }
  579.  
  580. if(g_eKnife[id][SELECT_SOUND][0])
  581. {
  582. play_knife_sound(id, g_eKnife[id][SELECT_SOUND])
  583. }
  584. }
  585.  
  586. public load_data(id)
  587. {
  588. if(is_user_connected(id))
  589. {
  590. use_vault(id, false)
  591. }
  592. }
  593.  
  594. public CheckKnifeAccess(id, iMenu, iItem)
  595. {
  596. return ((g_iKnife[id] == iItem) || !has_knife_access(id, iItem)) ? ITEM_DISABLED : ITEM_ENABLED
  597. }
  598.  
  599. public OnPlayerSpawn(id)
  600. {
  601. if(is_user_alive(id) && g_eCvars[km_open_at_spawn] && !g_iKnife[id] && g_bFirstTime[id] && (g_iMenuFlags & ADMIN_USER || get_user_flags(id) & g_iMenuFlags))
  602. {
  603. g_bFirstTime[id] = false
  604. Cmd_Knife(id)
  605. }
  606. }
  607.  
  608. public OnSelectKnife(iEnt)
  609. {
  610. new id = get_pdata_cbase(iEnt, m_pPlayer, 4)
  611.  
  612. if(is_user_connected(id))
  613. {
  614. refresh_knife_model(id)
  615. }
  616. }
  617.  
  618. refresh_knife_model(const id)
  619. {
  620. set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
  621. set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
  622. }
  623.  
  624. push_knife(eKnife[Knives])
  625. {
  626. if(!eKnife[V_MODEL][0])
  627. {
  628. copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), CRXKNIVES_DEFAULT_V)
  629. }
  630.  
  631. if(!eKnife[P_MODEL][0])
  632. {
  633. copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), CRXKNIVES_DEFAULT_P)
  634. }
  635.  
  636. if(!eKnife[FLAG])
  637. {
  638. g_iMenuFlags |= ADMIN_USER
  639. }
  640.  
  641. ArrayPushArray(g_aKnives, eKnife)
  642. }
  643.  
  644. bool:has_knife_access(const id, const iKnife)
  645. {
  646. static eKnife[Knives]
  647. ArrayGetArray(g_aKnives, iKnife, eKnife)
  648.  
  649. if(eKnife[FLAG] != ADMIN_ALL)
  650. {
  651. if(get_user_flags(id) & eKnife[FLAG])
  652. {
  653. if(g_eCvars[km_admin_bypass])
  654. {
  655. return true
  656. }
  657. }
  658. else
  659. {
  660. return false
  661. }
  662. }
  663.  
  664. if(g_bRankSystem)
  665. {
  666. if(eKnife[LEVEL] && crxranks_get_user_level(id) < eKnife[LEVEL])
  667. {
  668. return false
  669. }
  670.  
  671. if(eKnife[XP] && crxranks_get_user_xp(id) < eKnife[XP])
  672. {
  673. return false
  674. }
  675. }
  676.  
  677. return true
  678. }
  679.  
  680. bool:is_knife_sound(const szSample[])
  681. {
  682. return bool:equal(szSample[8], "kni", 3)
  683. }
  684.  
  685. detect_knife_sound(const szSample[])
  686. {
  687. static iSound
  688. iSound = SOUND_NONE
  689.  
  690. if(equal(szSample, "weapons/knife_deploy1.wav"))
  691. {
  692. iSound = SOUND_DEPLOY
  693. }
  694. else if(equal(szSample[14], "hit", 3))
  695. {
  696. iSound = szSample[17] == 'w' ? SOUND_HITWALL : SOUND_HIT
  697. }
  698. else if(equal(szSample[14], "sla", 3))
  699. {
  700. iSound = SOUND_SLASH
  701. }
  702. else if(equal(szSample[14], "sta", 3))
  703. {
  704. iSound = SOUND_STAB
  705. }
  706.  
  707. return iSound
  708. }
  709.  
  710. use_vault(const id, const bool:bSave)
  711. {
  712. if(bSave)
  713. {
  714. new szData[4]
  715. num_to_str(g_iKnife[id], szData, charsmax(szData))
  716. nvault_set(g_iVault, g_szAuth[id], szData)
  717. }
  718. else
  719. {
  720. new iKnife
  721. iKnife = nvault_get(g_iVault, g_szAuth[id])
  722.  
  723. if(!is_knife_valid(iKnife))
  724. {
  725. iKnife = 0
  726. }
  727. else if(has_knife_access(id, iKnife))
  728. {
  729. g_iKnife[id] = iKnife
  730.  
  731. new iReturn
  732. ArrayGetArray(g_aKnives, iKnife, g_eKnife[id])
  733. ExecuteForward(g_fwdKnifeUpdated, iReturn, id, iKnife, false)
  734.  
  735. if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
  736. {
  737. refresh_knife_model(id)
  738. }
  739. }
  740. }
  741. }
  742.  
  743. play_knife_sound(const id, const szSound[])
  744. {
  745. engfunc(EngFunc_EmitSound, id, CHAN_AUTO, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
  746. }
  747.  
  748. bool:is_knife_valid(const iKnife)
  749. {
  750. return 0 <= iKnife < g_iKnivesNum
  751. }
  752.  
  753. public plugin_natives()
  754. {
  755. register_library("crxknives")
  756. register_native("crxknives_can_use_skill", "_crxknives_can_use_skill")
  757. register_native("crxknives_get_attribute_int", "_crxknives_get_attribute_int")
  758. register_native("crxknives_get_attribute_float", "_crxknives_get_attribute_float")
  759. register_native("crxknives_get_attribute_str", "_crxknives_get_attribute_str")
  760. register_native("crxknives_get_knives_num", "_crxknives_get_knives_num")
  761. register_native("crxknives_get_user_knife", "_crxknives_get_user_knife")
  762. register_native("crxknives_has_knife_access", "_crxknives_has_knife_access")
  763. register_native("crxknives_is_knife_valid", "_crxknives_is_knife_valid")
  764. set_native_filter("native_filter")
  765. }
  766.  
  767. public native_filter(const szNative[], id, iTrap)
  768. {
  769. if(!iTrap)
  770. {
  771. static i
  772.  
  773. for(i = 0; i < sizeof(g_szNatives); i++)
  774. {
  775. if(equal(szNative, g_szNatives[i]))
  776. {
  777. return PLUGIN_HANDLED
  778. }
  779. }
  780. }
  781.  
  782. return PLUGIN_CONTINUE
  783. }
  784.  
  785. public bool:_crxknives_can_use_skill(iPlugin, iParams)
  786. {
  787. return !g_eCvars[km_knife_only_skills] || (get_user_weapon(get_param(1)) == CSW_KNIFE)
  788. }
  789.  
  790. public bool:_crxknives_get_attribute_int(iPlugin, iParams)
  791. {
  792. static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
  793. get_string(2, szAttribute, charsmax(szAttribute))
  794. id = get_param(1)
  795.  
  796. if(!get_param(4))
  797. {
  798. if(!is_knife_valid(id))
  799. {
  800. return false
  801. }
  802.  
  803. static eKnife[Knives]
  804. ArrayGetArray(g_aKnives, id, eKnife)
  805.  
  806. if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
  807. {
  808. return false
  809. }
  810.  
  811. TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
  812. goto @SET_ATTRIBUTE
  813. }
  814.  
  815. if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
  816. {
  817. return false
  818. }
  819.  
  820. TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
  821.  
  822. @SET_ATTRIBUTE:
  823. set_param_byref(3, str_to_num(szValue))
  824. return true
  825. }
  826.  
  827. public bool:_crxknives_get_attribute_float(iPlugin, iParams)
  828. {
  829. static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
  830. get_string(2, szAttribute, charsmax(szAttribute))
  831. id = get_param(1)
  832.  
  833. if(!get_param(4))
  834. {
  835. if(!is_knife_valid(id))
  836. {
  837. return false
  838. }
  839.  
  840. static eKnife[Knives]
  841. ArrayGetArray(g_aKnives, id, eKnife)
  842.  
  843. if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
  844. {
  845. return false
  846. }
  847.  
  848. TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
  849. goto @SET_ATTRIBUTE
  850. }
  851.  
  852. if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
  853. {
  854. return false
  855. }
  856.  
  857. TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
  858.  
  859. @SET_ATTRIBUTE:
  860. set_float_byref(3, str_to_float(szValue))
  861. return true
  862. }
  863.  
  864. public bool:_crxknives_get_attribute_str(iPlugin, iParams)
  865. {
  866. static szAttribute[MAX_NAME_LENGTH], szValue[CRXKNIVES_MAX_ATTRIBUTE_LENGTH], id
  867. get_string(2, szAttribute, charsmax(szAttribute))
  868. id = get_param(1)
  869.  
  870. if(!get_param(5))
  871. {
  872. if(!is_knife_valid(id))
  873. {
  874. return false
  875. }
  876.  
  877. static eKnife[Knives]
  878. ArrayGetArray(g_aKnives, id, eKnife)
  879.  
  880. if(!TrieKeyExists(eKnife[ATTRIBUTES], szAttribute))
  881. {
  882. return false
  883. }
  884.  
  885. TrieGetString(eKnife[ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
  886. goto @SET_ATTRIBUTE
  887. }
  888.  
  889. if(!TrieKeyExists(g_eKnife[id][ATTRIBUTES], szAttribute))
  890. {
  891. return false
  892. }
  893.  
  894. TrieGetString(g_eKnife[id][ATTRIBUTES], szAttribute, szValue, charsmax(szValue))
  895.  
  896. @SET_ATTRIBUTE:
  897. set_string(3, szValue, get_param(4))
  898. return true
  899. }
  900.  
  901. public _crxknives_get_knives_num(iPlugin, iParams)
  902. {
  903. return g_iKnivesNum
  904. }
  905.  
  906. public _crxknives_get_user_knife(iPlugin, iParams)
  907. {
  908. return g_iKnife[get_param(1)]
  909. }
  910.  
  911. public bool:_crxknives_has_knife_access(iPlugin, iParams)
  912. {
  913. return has_knife_access(get_param(1), get_param(2))
  914. }
  915.  
  916. public bool:_crxknives_is_knife_valid(iPlugin, iParams)
  917. {
  918. return is_knife_valid(get_param(1))
  919. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement