HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Plugin generated by AMXX-Studio */
  2.  
  3. #include < amxmodx >
  4. #include < engine >
  5. #include < fakemeta >
  6. #include < fun >
  7. #include < hamsandwich >
  8.  
  9. #define IS_PLAYER(%0) ( 0 < ( %0 ) < MaxClients )
  10. //#define SQL
  11.  
  12. #if defined SQL
  13. #include < sqlx >
  14. new const g_sSQL_INFOS[ ][ ] =
  15. {
  16. "127.0.0.1",
  17. "USERNAME",
  18. "PASSWORD",
  19. "DATABASE",
  20. }
  21. new Handle:g_iSqlTuple;
  22. #else
  23. #include < nvault >
  24. new const g_sNVAULTNAME[ ] = "PlayerDatas";
  25. new g_iNvaultId;
  26. #endif
  27.  
  28. enum _:ePlayerInfos
  29. {
  30. iPlayerLvl,
  31. iPlayerXp,
  32. iPlayerPoints,
  33. iPlayerSelected
  34. };
  35.  
  36. new const g_sPLUGIN[] = "KnifeSystem";
  37. new const g_sVERSION[] = "v2";
  38. new const g_sAUTHOR[] = "Akosch:.";
  39. new const g_sPREFIX[] = "[A:.]";
  40.  
  41. const g_iADD_FLAG = ADMIN_CVAR;
  42.  
  43. new Array:g_daKnives[ 10 ], Array:g_daLevels, Array:g_daItemName;
  44. new Array:g_daItemCost, Array:g_daItemFuncId, Array:g_daItemPluginId, g_pCvars[ 6 ];
  45. new g_iPlayerInfos[ MAX_PLAYERS + 1 ][ ePlayerInfos ], g_iTarget[ MAX_PLAYERS + 1 ];
  46. new g_sPlayerName[ MAX_PLAYERS + 1 ][ MAX_NAME_LENGTH ], g_iForwards[ 3 ], g_iMap;
  47.  
  48. public plugin_natives( )
  49. {
  50. register_native( "ks_register_item", "@naRegItem" );
  51. register_native( "ks_get_player_info", "@naGetPlayerInfo" );
  52. register_native( "ks_get_knife_info", "@naGetKnifeInfo" );
  53. register_native( "ks_get_max_level", "@naGetMaxLvl" );
  54. }
  55.  
  56. public plugin_init( )
  57. {
  58. RegisterHam( Ham_CS_Player_ResetMaxSpeed, "player", "@fwResetMaxSpeedPost", 1, true );
  59. RegisterHam( Ham_Item_Deploy, "weapon_knife", "@fwWeaponKnifePost", 1, true );
  60. RegisterHam( Ham_TakeDamage, "player", "@fwTakeDamagePre", 0, true );
  61. RegisterHam( Ham_Spawn, "player", "@fwPlayerSpawnPost", 1, true );
  62.  
  63. register_message( get_user_msgid( "Health" ), "@msgHealth" );
  64.  
  65. register_event( "DeathMsg", "@evDeath", "a" );
  66.  
  67. register_clcmd( "drop", "@fnShowMenu" );
  68. register_clcmd( "say /menu", "@fnShowMenu" );
  69. register_clcmd( "GIFT", "@fnGiftHandler" );
  70. register_clcmd( "ADD", "@fnAddHandler" );
  71.  
  72. g_iForwards[ 0 ] = CreateMultiForward( "ks_level_up", ET_IGNORE, FP_CELL, FP_CELL );
  73. g_iForwards[ 1 ] = CreateMultiForward( "ks_max_lvl_reached", ET_IGNORE, FP_CELL );
  74. g_iForwards[ 2 ] = CreateMultiForward( "ks_knife_selected", ET_IGNORE, FP_CELL, FP_CELL );
  75.  
  76. g_pCvars[ 0 ] = register_cvar( "kill_msgs", "0" );
  77. g_pCvars[ 1 ] = register_cvar( "kill_xp", "1" );
  78. g_pCvars[ 2 ] = register_cvar( "kill_point", "1" );
  79. g_pCvars[ 3 ] = register_cvar( "hs_xp", "3" );
  80. g_pCvars[ 4 ] = register_cvar( "hs_point", "2" );
  81.  
  82. new sMapName[ 32 ];
  83. get_mapname( sMapName, charsmax( sMapName ) );
  84.  
  85. if ( equal( sMapName, "1hp", 3 ) )
  86. g_iMap = 1;
  87. else if ( equal( sMapName, "35hp", 4 ) )
  88. g_iMap = 35;
  89. else
  90. g_iMap = 100;
  91.  
  92. #if defined SQL
  93. g_iSqlTuple = SQL_MakeDbTuple( g_sSQL_INFOS[ 0 ], g_sSQL_INFOS[ 1 ], g_sSQL_INFOS[ 2 ], g_sSQL_INFOS[ 3 ] );
  94.  
  95. new sThread[ 256 ];
  96. formatex( sThread, charsmax( sThread ), "CREATE TABLE IF NOT EXISTS `KnifeSystem` (`SteamId` varchar( 32 ) NOT NULL, `Level` INT( 11 ) NOT NULL, `Xp` INT( 11 ) NOT NULL, `Points` INT( 11 ) NOT NULL, `Selected` INT( 11 ) NOT NULL, `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY )" );
  97.  
  98. SQL_ThreadQuery( g_iSqlTuple, "@fnThreadHandler", sThread );
  99. #else
  100. g_iNvaultId = nvault_open( g_sNVAULTNAME );
  101.  
  102. if ( g_iNvaultId == INVALID_HANDLE )
  103. set_fail_state( "%L", LANG_SERVER, "INVALIDNVAULTID" )
  104. #endif
  105. }
  106.  
  107. public plugin_precache( )
  108. {
  109. register_dictionary( "KnifeSystem.txt" );
  110. register_plugin(g_sPLUGIN,g_sVERSION,g_sAUTHOR);
  111.  
  112. g_daKnives[ 0 ] = ArrayCreate( 32 );
  113. g_daKnives[ 1 ] = ArrayCreate( 32 );
  114. g_daKnives[ 2 ] = ArrayCreate( 32 );
  115. g_daKnives[ 3 ] = ArrayCreate( 1 );
  116. g_daKnives[ 4 ] = ArrayCreate( 1 );
  117. g_daKnives[ 5 ] = ArrayCreate( 1 );
  118. g_daKnives[ 6 ] = ArrayCreate( 1 );
  119. g_daKnives[ 7 ] = ArrayCreate( 1 );
  120. g_daKnives[ 8 ] = ArrayCreate( 1 );
  121. g_daKnives[ 9 ] = ArrayCreate( 1 );
  122.  
  123. g_daItemName = ArrayCreate( 32 );
  124. g_daItemFuncId = ArrayCreate( 1 );
  125. g_daItemCost = ArrayCreate( 1 );
  126. g_daItemPluginId = ArrayCreate( 1 );
  127.  
  128. g_daLevels = ArrayCreate( 1 );
  129.  
  130. new sBuffer[ 128 ], sFile[ 64 ], pFile;
  131. get_localinfo( "amxx_configsdir", sFile, charsmax( sFile ) );
  132. add( sFile, charsmax( sFile ), "/knives.txt" );
  133.  
  134. pFile = fopen( sFile, "rt" );
  135.  
  136. if ( pFile )
  137. {
  138. new sKey[ 64 ], sValue[ 64 ], sKEYS[ sizeof( g_daKnives ) ][ 32 ];
  139. new iSize, iSize2, i;
  140.  
  141. for ( i = 1; i < sizeof( sKEYS ); ++i )
  142. {
  143. formatex( sKEYS[ i ], charsmax( sKEYS[ ] ), "KEY%i", i );
  144. formatex( sKEYS[ i ], charsmax( sKEYS[ ] ), "%L", LANG_SERVER, sKEYS[ i ] );
  145. }
  146.  
  147. while ( !feof( pFile ) )
  148. {
  149. fgets( pFile, sBuffer, charsmax( sBuffer ) );
  150. trim( sBuffer );
  151.  
  152. if ( sBuffer[ 0 ] == '/' || sBuffer[ 0 ] == ';' || !sBuffer[ 0 ] )
  153. continue;
  154.  
  155. if ( sBuffer[ 0 ] == '[' )
  156. {
  157. iSize = ArraySize( g_daKnives[ 0 ] );
  158.  
  159. for ( i = 1; i < sizeof ( g_daKnives ); ++i )
  160. {
  161. iSize2 = ArraySize( g_daKnives[ i ] );
  162.  
  163. switch ( i )
  164. {
  165. case 1:
  166. while ( iSize2 < iSize )
  167. {
  168. ArrayPushString( g_daKnives[ 1 ], "models/v_knife.mdl" );
  169. ++iSize2;
  170. }
  171. case 2:
  172. while ( iSize2 < iSize )
  173. {
  174. ArrayPushString( g_daKnives[ 2 ], "models/p_knife.mdl" );
  175. ++iSize2;
  176. }
  177. case 3:
  178. while ( iSize2 < iSize )
  179. {
  180. ArrayPushCell( g_daKnives[ 3 ], 250.0 );
  181. ++iSize2;
  182. }
  183. case 4:
  184. while ( iSize2 < iSize )
  185. {
  186. ArrayPushCell( g_daKnives[ 4 ], 1.0 );
  187. ++iSize2;
  188. }
  189. case 5:
  190. while ( iSize2 < iSize )
  191. {
  192. ArrayPushCell( g_daKnives[ 5 ], 0.0 );
  193. ++iSize2;
  194. }
  195. case 8:
  196. while ( iSize2 < iSize )
  197. {
  198. ArrayPushCell( g_daKnives[ 8 ], 255 );
  199. ++iSize2;
  200. }
  201. default:
  202. while ( iSize2 < iSize )
  203. {
  204. ArrayPushCell( g_daKnives[ i ], 0 );
  205. ++iSize2;
  206. }
  207. }
  208.  
  209. while ( iSize2 > iSize )
  210. ArrayDeleteItem( g_daKnives[ i ], --iSize2 );
  211. }
  212.  
  213. sBuffer[ strlen( sBuffer ) - 1 ] = 0;
  214. ArrayPushString( g_daKnives[ 0 ], sBuffer[ 1 ] );
  215. continue;
  216. }
  217.  
  218. strtok( sBuffer, sKey, charsmax( sKey ), sValue, charsmax( sValue ), '=' );
  219. trim( sKey );
  220. trim( sValue );
  221.  
  222. for ( new i; i < sizeof ( g_daKnives ); ++i )
  223. if ( equali( sKEYS[ i ], sKey ) )
  224. switch ( i )
  225. {
  226. case 1, 2: fnArrayPushModel( sValue, charsmax( sValue ), i );
  227. case 3, 4, 5: ArrayPushCell( g_daKnives[ i ], ( i == 4 ) ? ( str_to_float( sValue ) / 800.00 ) : ( str_to_float( sValue ) ) );
  228. default: ArrayPushCell( g_daKnives[ i ], str_to_num( sValue ) );
  229. }
  230. }
  231.  
  232. fclose( pFile );
  233. iSize = ArraySize( g_daKnives[ 0 ] );
  234.  
  235. for ( i = 1; i < sizeof ( g_daKnives ); ++i )
  236. {
  237. iSize2 = ArraySize( g_daKnives[ i ] );
  238.  
  239. switch ( i )
  240. {
  241. case 1:
  242. while ( iSize2 < iSize )
  243. {
  244. ArrayPushString( g_daKnives[ 1 ], "models/v_knife.mdl" );
  245. ++iSize2;
  246. }
  247. case 2:
  248. while ( iSize2 < iSize )
  249. {
  250. ArrayPushString( g_daKnives[ 2 ], "models/p_knife.mdl" );
  251. ++iSize2;
  252. }
  253. case 3:
  254. while ( iSize2 < iSize )
  255. {
  256. ArrayPushCell( g_daKnives[ 3 ], 250.0 );
  257. ++iSize2;
  258. }
  259. case 4:
  260. while ( iSize2 < iSize )
  261. {
  262. ArrayPushCell( g_daKnives[ 4 ], 1.0 );
  263. ++iSize2;
  264. }
  265. case 5:
  266. while ( iSize2 < iSize )
  267. {
  268. ArrayPushCell( g_daKnives[ 5 ], 0.0 );
  269. ++iSize2;
  270. }
  271. case 8:
  272. while ( iSize2 < iSize )
  273. {
  274. ArrayPushCell( g_daKnives[ 8 ], 255 );
  275. ++iSize2;
  276. }
  277. default:
  278. while ( iSize2 < iSize )
  279. {
  280. ArrayPushCell( g_daKnives[ i ], 0 );
  281. ++iSize2;
  282. }
  283. }
  284.  
  285. while ( iSize2 > iSize )
  286. ArrayDeleteItem( g_daKnives[ i ], --iSize2 );
  287. }
  288. }
  289. else
  290. {
  291. format( sFile, charsmax( sFile ), "%L", LANG_SERVER, "MISSINGFILE", sFile );
  292. set_fail_state( sFile );
  293. }
  294.  
  295. get_localinfo( "amxx_configsdir", sFile, charsmax( sFile ) );
  296. add( sFile, charsmax( sFile ), "/levels.txt" );
  297.  
  298. pFile = fopen( sFile, "rt" );
  299.  
  300. if ( pFile )
  301. {
  302. new sData[ 3 ][ 16 ], iNum, iFrom, iTo, iWith, iSize;
  303.  
  304. while ( !feof( pFile ) )
  305. {
  306. fgets( pFile, sBuffer, charsmax( sBuffer ) );
  307. replace( sBuffer, charsmax( sBuffer ), "^n", "" );
  308. remove_quotes( sBuffer );
  309.  
  310. if ( is_str_num( sBuffer ) )
  311. ArrayPushCell( g_daLevels, str_to_num( sBuffer ) );
  312. else
  313. {
  314. replace( sBuffer, charsmax( sBuffer ), "...", " " );
  315. replace( sBuffer, charsmax( sBuffer ), ",", " " );
  316. parse( sBuffer, sData[ 0 ], charsmax( sData[ ] ), sData[ 1 ], charsmax( sData[ ] ), sData[ 2 ], charsmax( sData[ ] ) );
  317.  
  318. iFrom = str_to_num( sData[ 0 ] );
  319. iTo = str_to_num( sData[ 1 ] );
  320. iWith = str_to_num( sData[ 2 ] );
  321. iSize = ArraySize( g_daLevels );
  322.  
  323. if ( iFrom > iSize )
  324. iFrom = iSize;
  325.  
  326. iNum = ArrayGetCell( g_daLevels, iFrom - 1 );
  327.  
  328. for ( new i = iFrom; i <= iTo; ++i )
  329. ArrayPushCell( g_daLevels, iNum += iWith );
  330. }
  331. }
  332. fclose( pFile );
  333. }
  334. else
  335. {
  336. format( sFile, charsmax( sFile ), "%L", LANG_SERVER, "MISSINGFILE", sFile );
  337. set_fail_state( sFile );
  338. }
  339. }
  340.  
  341. @naRegItem( iPluginId, iParamNum )
  342. {
  343. new sItemName[ 32 ], sItemFunc[ 32 ], iCost;
  344.  
  345. get_string( 1, sItemName, charsmax( sItemName ) );
  346. get_string( 2, sItemFunc, charsmax( sItemFunc ) );
  347. iCost = get_param( 3 );
  348.  
  349. if ( iCost < 0 )
  350. iCost = 0;
  351.  
  352. ArrayPushString( g_daItemName, sItemName );
  353. ArrayPushCell( g_daItemPluginId, iPluginId );
  354. ArrayPushCell( g_daItemCost, iCost );
  355. ArrayPushCell( g_daItemFuncId, get_func_id( sItemFunc, iPluginId ) );
  356.  
  357. return ( ArraySize( g_daItemCost ) - 1 );
  358. }
  359.  
  360. @naGetKnifeInfo( iPluginId, iParamNum )
  361. if ( iParamNum == 3 )
  362. {
  363. new sKnifeInfo[ 32 ];
  364. ArrayGetString( g_daKnives[ get_param( 1 ) ], get_param( 2 ), sKnifeInfo, charsmax( sKnifeInfo ) );
  365. set_string( 3, sKnifeInfo, charsmax( sKnifeInfo ) );
  366. return 1;
  367. }
  368. else
  369. return ArrayGetCell( g_daKnives[ get_param( 1 ) ], get_param( 2 ) );
  370.  
  371. @naGetPlayerInfo( iPluginId, iParamNum )
  372. return g_iPlayerInfos[ get_param( 1 ) ][ get_param( 2 ) ];
  373.  
  374. @naGetMaxLvl( iPluginId, iParamNum )
  375. return ( ArraySize( g_daLevels ) - 1 );
  376.  
  377. @fwTakeDamagePre( iVictim, iInflictor, iAttacker, Float:fDamagePre, iDmgBits )
  378. if ( IS_PLAYER( iAttacker ) && iAttacker != iVictim )
  379. if ( get_user_weapon( iAttacker ) == CSW_KNIFE )
  380. {
  381. SetHamParamFloat( 4, fDamagePre + Float:ArrayGetCell( g_daKnives[ 5 ], g_iPlayerInfos[ iAttacker ][ iPlayerSelected ] ) );
  382. new iKB = ArrayGetCell( g_daKnives[ 6 ], g_iPlayerInfos[ iAttacker ][ iPlayerSelected ] );
  383.  
  384. if ( iKB > 0 )
  385. {
  386. new Float:fOldVelo[ 3 ], Float:fVec[ 3 ];
  387. entity_get_vector( iVictim, EV_VEC_velocity, fOldVelo );
  388. if ( fnCreateKnockback( iVictim, iAttacker, fVec, iKB ) )
  389. {
  390. fVec[0] += fOldVelo[0];
  391. fVec[1] += fOldVelo[1];
  392. entity_set_vector( iVictim, EV_VEC_velocity, fVec );
  393. }
  394. }
  395. }
  396.  
  397. @fwWeaponKnifePost( iEnt )
  398. if ( pev_valid( iEnt ) == 2 )
  399. {
  400. new iOwner = get_pdata_cbase( iEnt, 41, 4 );
  401. if ( pev_valid( iOwner ) )
  402. {
  403. new sModels[ 32 ];
  404. ArrayGetString( g_daKnives[ 1 ], g_iPlayerInfos[ iOwner ][ iPlayerSelected ], sModels, charsmax( sModels ) );
  405. entity_set_string( iOwner, EV_SZ_viewmodel, sModels );
  406. ArrayGetString( g_daKnives[ 2 ], g_iPlayerInfos[ iOwner ][ iPlayerSelected ], sModels, charsmax( sModels ) );
  407. entity_set_string( iOwner, EV_SZ_weaponmodel, sModels );
  408. }
  409. }
  410.  
  411. @fwPlayerSpawnPost( iPlayerId )
  412. if ( is_user_alive( iPlayerId ) )
  413. switch ( g_iMap )
  414. {
  415. case 1: set_task( 2.5, "@fnSpawnSettings", iPlayerId );
  416. case 35: set_task( 2.0, "@fnSpawnSettings", iPlayerId );
  417. default: @fnSpawnSettings( iPlayerId );
  418. }
  419.  
  420. @fwResetMaxSpeedPost( iPlayerId )
  421. if ( is_user_alive( iPlayerId ) && get_user_maxspeed( iPlayerId ) > 1.0 )
  422. set_user_maxspeed( iPlayerId, Float:ArrayGetCell( g_daKnives[ 3 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  423.  
  424. //Bugfix
  425. @fnSpawnSettings( iPlayerId )
  426. {
  427. set_user_health( iPlayerId, g_iMap + ArrayGetCell( g_daKnives[ 7 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  428.  
  429. set_user_rendering( iPlayerId, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, ArrayGetCell( g_daKnives[ 8 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  430.  
  431. set_user_gravity( iPlayerId, Float:ArrayGetCell( g_daKnives[ 4 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  432. }
  433.  
  434. // Bugfix
  435. @msgHealth( iMsgId, iMsgDest, iMsgEnt )
  436. {
  437. new iHp = get_msg_arg_int( 1 );
  438. if ( iHp > 256 )
  439. {
  440. if ( iHp % 256 == 0 )
  441. ( iHp > 0 ) ? set_user_health( iMsgEnt, get_user_health( iMsgEnt ) + 1 ) : user_kill( iMsgEnt, 1 );
  442.  
  443. set_msg_arg_int( 1, get_msg_argtype( 1 ), 255 );
  444. }
  445. }
  446.  
  447. @evDeath( )
  448. {
  449. new iKiller = read_data( 1 );
  450.  
  451. if ( IS_PLAYER( iKiller ) && is_user_connected( iKiller ) )
  452. {
  453. new iVictim = read_data( 2 );
  454. new iHs = read_data( 3 );
  455. new iXp, iPoint;
  456.  
  457. iXp = iHs ? get_pcvar_num( g_pCvars[ 1 ] ) : get_pcvar_num( g_pCvars[ 3 ] );
  458. iPoint = iHs ? get_pcvar_num( g_pCvars[ 2 ] ) : get_pcvar_num( g_pCvars[ 4 ] );
  459.  
  460. g_iPlayerInfos[ iKiller ][ iPlayerXp ] += iXp;
  461. g_iPlayerInfos[ iKiller ][ iPlayerPoints ] += iPoint;
  462.  
  463. switch ( get_pcvar_num( g_pCvars[ 0 ] ) )
  464. {
  465. case 1: client_print_color( iKiller, iKiller, "%L", LANG_SERVER, "KILLSGMKILLER", g_sPlayerName[ iVictim ], iXp, iPoint );
  466. case 2:
  467. {
  468. client_print_color( iKiller, iKiller, "%L", LANG_SERVER, "KILLSGMKILLER", g_sPlayerName[ iVictim ], iXp, iPoint );
  469. client_print_color( iVictim, iVictim, "%L", LANG_SERVER, "KILLMSGVICTIM", g_sPlayerName[ iKiller ] );
  470. }
  471. }
  472. }
  473. fnCheckLevel( iKiller );
  474. }
  475.  
  476. @fnShowMenu( iPlayerId )
  477. fnMainMenu( iPlayerId, 0 );
  478.  
  479. fnMainMenu( iPlayerId, iMenu )
  480. {
  481. new sMenu[ 78 ], sInfo[ 16 ], iMenuId;
  482.  
  483. switch ( iMenu )
  484. {
  485. case 0:
  486. {
  487. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU0", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ), g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] );
  488. iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  489.  
  490. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "KNIFEMENU" );
  491. menu_additem( iMenuId, sMenu, "1 0" );
  492. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "GIFTINGMENU" );
  493. menu_additem( iMenuId, sMenu, "2 0" );
  494. if ( ArraySize( g_daItemCost ) )
  495. {
  496. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "SHOPMENU" );
  497. menu_additem( iMenuId, sMenu, "3 0" );
  498. }
  499. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "PLAYERSMENU" );
  500. menu_additem( iMenuId, sMenu, "4 0" );
  501. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "ADDINGMENU" );
  502. menu_additem( iMenuId, sMenu, "5 0", g_iADD_FLAG );
  503. }
  504. case 1:
  505. {
  506. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU1", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ) );
  507. iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  508.  
  509. new iSize = ArraySize( g_daKnives[ 0 ] );
  510. for ( new i; i < iSize; ++i )
  511. {
  512. ArrayGetString( g_daKnives[ 0 ], i, sMenu, charsmax( sMenu ) );
  513. format( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "KNIVES", sMenu, ArrayGetCell( g_daKnives[ 9 ], i ) );
  514. formatex( sInfo, charsmax( sInfo ), "%i 1", i );
  515. menu_additem( iMenuId, sMenu, sInfo );
  516. }
  517. }
  518. case 2:
  519. {
  520. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU2", g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] );
  521. iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  522.  
  523. new iPlayers[ 32 ], iPlayerNum;
  524. get_players( iPlayers, iPlayerNum, "ch" );
  525.  
  526. for ( new i; i < iPlayerNum; ++i )
  527. if ( iPlayers[ i ] != iPlayerId )
  528. {
  529. formatex( sInfo, charsmax( sInfo ), "%i 2", iPlayers[ i ] );
  530. menu_additem( iMenuId, g_sPlayerName[ iPlayers[ i ] ], sInfo );
  531. }
  532. }
  533. case 3:
  534. {
  535. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU3", g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] );
  536. iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  537.  
  538. new iSize = ArraySize( g_daItemCost );
  539. for ( new i; i < iSize; ++i )
  540. {
  541. ArrayGetString( g_daItemName, i, sMenu, charsmax( sMenu ) );
  542. format( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "ITEMINSHOP", sMenu, ArrayGetCell( g_daItemCost, i ) );
  543. formatex( sInfo, charsmax( sInfo ), "%i 3", i );
  544. menu_additem( iMenuId, sMenu, sInfo );
  545. }
  546. }
  547. case 4:
  548. {
  549. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU4", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ), g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] );
  550. iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  551.  
  552. new iPlayers[ 32 ], iPlayerNum, iTempId;
  553. get_players( iPlayers, iPlayerNum, "ch" );
  554.  
  555. for ( new i; i < iPlayerNum; ++i )
  556. if ( iPlayers[ i ] != iPlayerId )
  557. {
  558. iTempId = iPlayers[ i ];
  559. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "PLAYERINMENU", g_sPlayerName[ iTempId ], g_iPlayerInfos[ iTempId ][ iPlayerLvl ], g_iPlayerInfos[ iTempId ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iTempId ][ iPlayerLvl ] ), g_iPlayerInfos[ iTempId ][ iPlayerPoints ] );
  560. formatex( sInfo, charsmax( sInfo ), "%i 4", iTempId );
  561. menu_additem( iMenuId, sMenu, sInfo );
  562. }
  563. }
  564. case 5:
  565. {
  566. formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU5" );
  567. iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  568.  
  569. new iPlayers[ 32 ], iPlayerNum;
  570. get_players( iPlayers, iPlayerNum, "ch" );
  571.  
  572. for ( new i; i < iPlayerNum; ++i )
  573. {
  574. formatex( sInfo, charsmax( sInfo ), "%i 5", iPlayers[ i ] );
  575. menu_additem( iMenuId, g_sPlayerName[ iPlayers[ i ] ], sInfo );
  576. }
  577. }
  578. }
  579. menu_setprop( iMenuId, MPROP_EXIT, MEXIT_ALL );
  580. menu_display( iPlayerId, iMenuId, 0 );
  581. }
  582.  
  583. @fnMenuHandler( iPlayerId, iMenuId, iItem )
  584. {
  585. if ( iItem != MENU_EXIT )
  586. {
  587. new sMenuName[ 78 ], sInfo[ 32 ], sDatas[ 2 ][ 16 ], iKey, iMenuNum;
  588. menu_item_getinfo( iMenuId, iItem, iKey, sInfo, charsmax( sInfo ), sMenuName, charsmax( sMenuName ), iMenuNum );
  589. parse( sInfo, sDatas[ 0 ], charsmax( sDatas[ ] ), sDatas[ 1 ], charsmax( sDatas[ ] ) );
  590. iKey = str_to_num( sDatas[ 0 ] );
  591. iMenuNum = str_to_num( sDatas[ 1 ] );
  592.  
  593. switch ( iMenuNum )
  594. {
  595. case 0:
  596. {
  597. fnMainMenu( iPlayerId, iKey );
  598. }
  599. case 1:
  600. {
  601. if ( g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] >= ArrayGetCell( g_daKnives[ 9 ], iKey ) )
  602. {
  603. new iRet;
  604. g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] = iKey;
  605. ExecuteForward( g_iForwards[ 2 ], iRet, iPlayerId, g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] );
  606.  
  607. if ( get_user_weapon( iPlayerId ) == CSW_KNIFE )
  608. {
  609. ArrayGetString( g_daKnives[ 1 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ], sMenuName, charsmax( sMenuName ) );
  610. entity_set_string( iPlayerId, EV_SZ_viewmodel, sMenuName );
  611.  
  612. ArrayGetString( g_daKnives[ 2 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ], sMenuName, charsmax( sMenuName ) );
  613. entity_set_string( iPlayerId, EV_SZ_weaponmodel, sMenuName );
  614. }
  615.  
  616. set_user_rendering( iPlayerId, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, ArrayGetCell( g_daKnives[ 8 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  617.  
  618. set_user_gravity( iPlayerId, Float:ArrayGetCell( g_daKnives[ 4 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  619.  
  620. if ( get_user_maxspeed( iPlayerId ) > 1.0 )
  621. set_user_maxspeed( iPlayerId, Float:ArrayGetCell( g_daKnives[ 3 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  622. }
  623. else
  624. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "NOTENOUGHLVL", g_sPREFIX );
  625. }
  626. case 2:
  627. {
  628. if ( is_user_connected( iKey ) )
  629. {
  630. g_iTarget[ iPlayerId ] = iKey;
  631. client_cmd( iPlayerId, "messagemode GIFT" );
  632. }
  633. else
  634. {
  635. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "TARGETDISCONNECTED", g_sPREFIX );
  636. fnMainMenu( iPlayerId, 2 );
  637. }
  638. }
  639. case 3:
  640. {
  641. if ( g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] >= ArrayGetCell( g_daItemCost, iKey ) )
  642. {
  643. new sItemName[ 32 ];
  644. g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] -= ArrayGetCell( g_daItemCost, iKey );
  645. ArrayGetString( g_daItemName, iKey, sItemName, charsmax( sItemName ) );
  646.  
  647. callfunc_begin_i( ArrayGetCell( g_daItemFuncId, iKey ), ArrayGetCell( g_daItemPluginId, iKey ) );
  648. callfunc_push_int( iPlayerId );
  649. callfunc_push_int( iKey );
  650. callfunc_end( );
  651.  
  652. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "SUCCPURCHASE", g_sPREFIX, sItemName );
  653. }
  654. else
  655. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "UNSUCCPURCHASE", g_sPREFIX );
  656. }
  657. case 4:
  658. {
  659. if ( is_user_connected( iKey ) )
  660. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "PLAYERINMENU", g_sPlayerName[ iKey ], g_iPlayerInfos[ iKey ][ iPlayerLvl ], g_iPlayerInfos[ iKey ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iKey ][ iPlayerLvl ] ) );
  661. else
  662. {
  663. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "TARGETDISCONNECTED", g_sPREFIX );
  664. fnMainMenu( iPlayerId, 4 );
  665. }
  666. }
  667. case 5:
  668. {
  669. if ( is_user_connected( iKey ) )
  670. {
  671. g_iTarget[ iPlayerId ] = iKey;
  672. client_cmd( iPlayerId, "messagemode ADD" );
  673. }
  674. else
  675. {
  676. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "TARGETDISCONNECTED", g_sPREFIX );
  677. fnMainMenu( iPlayerId, 5 );
  678. }
  679. }
  680. }
  681. }
  682. menu_destroy( iMenuId );
  683. return PLUGIN_HANDLED;
  684. }
  685.  
  686. @fnGiftHandler( iPlayerId )
  687. {
  688. new sData[ 191 ], iNum;
  689. read_args( sData, charsmax( sData ) );
  690. remove_quotes( sData );
  691.  
  692. if ( is_str_num( sData ) )
  693. {
  694. iNum = str_to_num( sData );
  695.  
  696. if ( g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] >= iNum )
  697. {
  698. g_iPlayerInfos[ g_iTarget[ iPlayerId ] ][ iPlayerPoints ] += iNum;
  699. g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] -= iNum;
  700. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "SUCCGIFTING", g_sPREFIX, g_sPlayerName[ g_iTarget [ iPlayerId ] ], iNum );
  701. client_print_color( g_iTarget[ iPlayerId ], g_iTarget[ iPlayerId ], "%L", LANG_SERVER, "GETPOINTS", g_sPREFIX, iNum, g_sPlayerName[ iPlayerId ] );
  702. }
  703. else
  704. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "NOTENOUGHPOINT", g_sPREFIX );
  705. }
  706. else
  707. {
  708. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "INVALIDVALUE", g_sPREFIX );
  709. client_cmd( iPlayerId, "messagemode GIFT" );
  710. }
  711. }
  712.  
  713. @fnAddHandler( iPlayerId )
  714. {
  715. new sData[ 191 ], iNum;
  716. read_args( sData, charsmax( sData ) );
  717. remove_quotes( sData );
  718.  
  719. if ( is_str_num( sData ) )
  720. {
  721. iNum = str_to_num( sData );
  722.  
  723. g_iPlayerInfos[ g_iTarget[ iPlayerId ] ][ iPlayerPoints ] += iNum;
  724. client_print_color( 0, print_team_default, "%L", LANG_SERVER, "ADDTEXT", g_sPREFIX, g_sPlayerName[ iPlayerId ], g_sPlayerName[ g_iTarget[ iPlayerId ] ], iNum );
  725. }
  726. else
  727. {
  728. client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "INVALIDVALUE", g_sPREFIX );
  729. client_cmd( iPlayerId, "messagemode ADD" );
  730. }
  731. }
  732.  
  733. public client_infochanged( iPlayerId )
  734. {
  735. new sNewName[ 32 ];
  736. get_user_info( iPlayerId, "name", sNewName, charsmax( sNewName ) );
  737.  
  738. if ( !equal( g_sPlayerName[ iPlayerId ], sNewName ) )
  739. {
  740. g_sPlayerName[ iPlayerId ][ 0 ] = EOS;
  741. copy( g_sPlayerName[ iPlayerId ], charsmax( g_sPlayerName[ ] ), sNewName );
  742. }
  743. }
  744.  
  745. public client_authorized( iPlayerId )
  746. if ( !is_user_bot( iPlayerId ) )
  747. {
  748. new sSteamId[ 32 ];
  749. get_user_authid( iPlayerId, sSteamId, charsmax( sSteamId ) );
  750. get_user_name( iPlayerId, g_sPlayerName[ iPlayerId ], charsmax( g_sPlayerName[ ] ) );
  751. fnLoadPlayerDatas( iPlayerId, sSteamId );
  752. }
  753.  
  754. public client_disconnect( iPlayerId )
  755. if ( !is_user_bot( iPlayerId ) )
  756. {
  757. new sSteamId[ 32 ];
  758. get_user_authid( iPlayerId, sSteamId, charsmax( sSteamId ) );
  759. #if defined SQL
  760. fnSavePlayerDatas( iPlayerId, sSteamId, 0 );
  761. #else
  762. fnSavePlayerDatas( iPlayerId, sSteamId );
  763. #endif
  764. }
  765.  
  766. #if defined SQL
  767.  
  768. fnLoadPlayerDatas( iPlayerId, const sSteamId[ ] )
  769. {
  770. new sText[ 128 ], iArray[ 2 ];
  771. iArray[ 0 ] = iPlayerId;
  772. iArray[ 1 ] = get_user_userid( iPlayerId );
  773.  
  774. formatex( sText, charsmax( sText ), "SELECT * FROM `KnifeSystem` WHERE SteamId = ^"%s^"", sSteamId );
  775. SQL_ThreadQuery( g_iSqlTuple, "@fnThreadHandler", sTxt, iArray, sizeof( iArray ) );
  776. }
  777.  
  778. fnSavePlayerDatas( iPlayerId, const sSteamId[ ], iMode )
  779. {
  780. new sText[ 512 ];
  781.  
  782. if ( iMode )
  783. formatex( sText, charsmax( sText ), "INSERT INTO `KnifeSystem` ( `SteamId`,`Level`,`Xp`,`Points`,`Selected` ) VALUES ( ^"%s^", ^"0^", ^"0^", ^"0^", ^"0^" )", sSteamId );
  784. else
  785. formatex( sText, charsmax( sText ), "UPDATE `KnifeSystem` SET Level = ^"%i^" Xp = ^"%i^" Points = ^"%i^" Selected = ^"%i^" WHERE SteamId = ^"%s^"", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ], sSteamId );
  786. }
  787.  
  788. @fnThreadHandler( iFailState, Handle:iQuery, sErrorMsg[ ], iErrorCode, Array[ ], iArraySize, Float:fQueueTime )
  789. {
  790. new sText[ 128 ];
  791. if ( iFailState == TQUERY_CONNECT_FAILED )
  792. {
  793. formatex( sText, charsmax( sText ), "%L", LANG_SERVER, "TQUERY_CONNECT_FAILED" );
  794. set_fail_state( sText );
  795. return;
  796. }
  797. else if ( iFailState == TQUERY_QUERY_FAILED )
  798. {
  799. formatex( sText, charsmax( sText ), "%L", LANG_SERVER, "TQUERY_QUERY_FAILED" );
  800. set_fail_state( sText );
  801. return;
  802. }
  803.  
  804. if ( iErrorCode )
  805. {
  806. log_amx( "%i - %s", iErrorCode, sErrorMsg );
  807. return;
  808. }
  809.  
  810. new iPlayerId = Array[ 0 ];
  811.  
  812. if ( iPlayerId && Array[ 1 ] == get_user_userid( iPlayerId ) )
  813. if ( SQL_NumResults( iQuery ) > 0 )
  814. {
  815. g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Selected" ) );
  816. g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Points" ) );
  817. g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Level" ) );
  818. g_iPlayerInfos[ iPlayerId ][ iPlayerXp ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Xp" ) );
  819. }
  820. else
  821. fnSavePlayerDatas( iPlayerId, 1 );
  822.  
  823. return;
  824. }
  825.  
  826. #else
  827.  
  828. fnLoadPlayerDatas( iPlayerId, const sSteamId[ ] )
  829. {
  830. new sData[ 51 ];
  831.  
  832. if ( nvault_get( g_iNvaultId, sSteamId, sData, charsmax( sData ) ) )
  833. {
  834. new sLevel[ 11 ], sXp[ 11 ], sPoints[ 11 ], sSelected[ 11 ];
  835. parse( sData, sLevel, charsmax( sLevel ), sXp, charsmax( sXp ), sPoints, charsmax( sPoints ), sSelected, charsmax( sSelected ) );
  836. g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] = str_to_num( sLevel );
  837. g_iPlayerInfos[ iPlayerId ][ iPlayerXp ] = str_to_num( sXp );
  838. g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] = str_to_num( sPoints );
  839. g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] = str_to_num( sSelected );
  840. }
  841. else
  842. arrayset( g_iPlayerInfos[ iPlayerId ], 0, sizeof( g_iPlayerInfos[ ] ) );
  843. }
  844.  
  845. fnSavePlayerDatas( iPlayerId, const sSteamId[ ] )
  846. {
  847. new sData[ 51 ];
  848.  
  849. formatex( sData, charsmax( sData ), " %i %i %i %i ", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] );
  850. nvault_set( g_iNvaultId, sSteamId, sData );
  851. }
  852.  
  853. #endif
  854.  
  855. fnArrayPushModel( sMdl[ ], iMdl, iArrayId )
  856. {
  857. if ( !equal( sMdl, "models/", 7 ) )
  858. format( sMdl, iMdl, "models/%s", sMdl );
  859.  
  860. if ( !equal( sMdl[ strlen( sMdl ) - 4 ], ".mdl", 4 ) )
  861. add( sMdl, iMdl, ".mdl" );
  862.  
  863. precache_model( sMdl );
  864. ArrayPushString( g_daKnives[ iArrayId ], sMdl );
  865. }
  866.  
  867. fnCheckLevel( iPlayerId )
  868. {
  869. new iMax = ArraySize( g_daLevels ) - 1;
  870. if ( g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] < iMax )
  871. {
  872. new iRet;
  873. while ( g_iPlayerInfos[ iPlayerId ][ iPlayerXp ] >= ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ) )
  874. {
  875. ++g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ];
  876. ExecuteForward( g_iForwards[ 0 ], iRet, iPlayerId, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] );
  877.  
  878. if ( g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] == iMax )
  879. {
  880. ExecuteForward( g_iForwards[ 1 ], iRet, iPlayerId );
  881. break;
  882. }
  883. }
  884. }
  885. }
  886.  
  887. fnCreateKnockback( iVictim, iAttacker, Float:fVec[ 3 ], iKB )
  888. {
  889. if ( !is_user_alive( iVictim ) || !is_user_alive( iAttacker ) )
  890. return 0;
  891.  
  892. new Float:fVictimO[ 3 ], Float:fAttackerO[ 3 ], Float:fOrigin[ 3 ];
  893. entity_get_vector( iVictim, EV_VEC_origin, fVictimO );
  894. entity_get_vector( iAttacker, EV_VEC_origin, fAttackerO );
  895.  
  896. fOrigin[ 0 ] = fVictimO[ 0 ] - fAttackerO[ 0 ];
  897. fOrigin[ 1 ] = fVictimO[ 1 ] - fAttackerO[ 0 ];
  898.  
  899. new Float:iLargestNum = 0.0;
  900.  
  901. if ( floatabs( fOrigin[0] ) > iLargestNum ) iLargestNum = floatabs( fOrigin[0] );
  902. if ( floatabs( fOrigin[1] ) > iLargestNum ) iLargestNum = floatabs( fOrigin[1] );
  903.  
  904. fOrigin[0] /= iLargestNum;
  905. fOrigin[1] /= iLargestNum;
  906.  
  907. fVec[0] = ( fOrigin[0] * ( iKB * 3000) ) / get_entity_distance( iVictim, iAttacker );
  908. fVec[1] = ( fOrigin[1] * ( iKB * 3000) ) / get_entity_distance( iVictim, iAttacker );
  909. if( fVec[0] <= 20.0 || fVec[1] <= 20.0 )
  910. fVec[2] = random_float( 200.0, 275.0 );
  911.  
  912. return 1;
  913. }
  914.  
  915. public plugin_end( )
  916. {
  917. for ( new i; i < sizeof( g_daKnives ); ++i )
  918. ArrayDestroy( g_daKnives[ i ] );
  919.  
  920. ArrayDestroy( g_daLevels );
  921. ArrayDestroy( g_daItemCost );
  922. ArrayDestroy( g_daItemFuncId );
  923. ArrayDestroy( g_daItemName );
  924. ArrayDestroy( g_daItemPluginId );
  925.  
  926. #if defined SQL
  927. SQL_FreeHandle( g_iSqlTuple );
  928. #else
  929. nvault_close( g_iNvaultId );
  930. #endif
  931. }
  932.  
  933. /*
  934. new const g_sWeaponEntNames[ ][ ] =
  935. {
  936. "x", "weapon_p228", "x", "weapon_scout", "weapon_hegrenade", "weapon_xm1014",
  937. "weapon_c4", "weapon_mac10", "weapon_aug", "weapon_smokegrenade",
  938. "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
  939. "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18",
  940. "weapon_awp", "weapon_mp5navy", "weapon_m249", "weapon_m3",
  941. "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang",
  942. "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90"
  943. }
  944. */
  945.