hlmod.hu
https://hlmod.hu/

JB Gang rendszer!
https://hlmod.hu/viewtopic.php?f=9&t=16707
Oldal: 1 / 1

Szerző:  NuD[!]e [2014.07.30. 11:54 ]
Hozzászólás témája:  JB Gang rendszer!

Segitenétek ezt javitani?:(
SMA Forráskód: [ Mindet kijelol ]
  1.  
  2. /*
  3. Jailbreak Gang System
  4. H3avY Ra1n
  5.  
  6. Description
  7. -----------
  8. This plugin allows prisoners to create gangs and upgrade specific skills that apply to everybody in the gang.
  9.  
  10.  
  11. Gang Menu
  12. ---------
  13. Banda keszitese - Allows a user to create a gang by paying money.
  14. Invite to Gang - Only the leader of the gang can invite people to the gang.
  15. Skills - Opens the skills menu, where any member of the gang can pay money to upgrade their skills.
  16. Top-10 - Shows a MOTD with the top10 gangs, SORTED BY KILLS. (If you have a good way to sort it, please post it below)
  17. Leave Gang - Allows a player to leave the gang. The leader cannot leave the gang until he transfers leadership to somebody else (explained later).
  18. Gang Menu - Shows a menu with options to disband the gang, kick a player from the gang, or transfer leadership to somebody else in the gang.
  19. Online Jatekosok - Shows a list of gang members that are currently in the server.
  20.  
  21.  
  22. Skills
  23. ------
  24. HP - Increased health
  25. Stealing - Increased money earnings.
  26. Gravity - Lower Gravity
  27. Damage - Increased damage
  28. Stamina - Gives higher speed to players.
  29. Weapon Drop - Chance of making the guard drop the weapon when you knife them. (%1 chance increase per level)
  30.  
  31.  
  32. CVARS
  33. -----
  34. jb_gang_cost - The cost to create a gang.
  35. jb_health_cost - The cost to upgrade gang health.
  36. jb_stealing_cost - The cost to upgrade gang money earning.
  37. jb_gravity_cost - The cost to upgrade gang gravity.
  38. jb_damage_cost - The cost to upgrade gang damage.
  39. jb_stamina_cost - The cost to upgrade gang stamina (speed).
  40. jb_weapondrop_cost - The cost to upgrade gang weapon drop percentage.
  41.  
  42. Additionally there are CVars for the max level for each type of upgrade, so replace _cost above with _max.
  43. Also there are CVars for the amount per level, so replace _cost above with _per.
  44.  
  45. jb_points_per_kill - The amount of points you get for a kill
  46. jb_headshot_bonus - The amount of points you get for a headshot
  47.  
  48. jb_max_members - The max amount of members a gang can hold
  49. jb_admin_create - Whether or not an admin can create gangs without using points
  50.  
  51. Credits
  52. -------
  53. F0RCE - Original Plugin Idea
  54. Exolent - SQLVault Include
  55. Drekes - Freezetime Fix (I was too lazy) <!-- s:) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":)\" title=\"mosoly\" /><!-- s:) -->
  56.  
  57.  
  58. Changelog
  59. ---------
  60. September 26, 2011 - v1.0 - Initial Release
  61. September 27, 2011 - v1.01 - Added more cvars, fixed a few bugs.
  62. September 28, 2011 - v1.1 - Added gang admins, jb points instead of money, and a few other things I can't remember <!-- s:) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":)\" title=\"mosoly\" /><!-- s:) -->
  63. January 21, 2011 - v1.1.1 - Added a cvar for whether an admin can create a gang without using points.
  64. January 23, 2011 - v1.1.2 - Fixed freezetime problem
  65.  
  66.  
  67. */
  68.  
  69. /* Includes */
  70.  
  71. #include < amxmodx >
  72. #include < amxmisc >
  73. #include < sqlvault_ex >
  74. #include < cstrike >
  75. #include < colorchat >
  76. #include < hamsandwich >
  77. #include < fun >
  78.  
  79. /* Defines */
  80.  
  81. #define ADMIN_CREATE ADMIN_LEVEL_B
  82.  
  83. /* Constants */
  84.  
  85. new const g_szVersion[ ] = "1.1.2";
  86.  
  87. enum _:GangInfo
  88. {
  89. Trie:GangMembers,
  90. GangName[ 64 ],
  91. GangHP,
  92. GangStealing,
  93. GangGravity,
  94. GangDamage,
  95. GangStamina,
  96. GangWeaponDrop,
  97. GangKills,
  98. NumMembers
  99. };
  100.  
  101. enum
  102. {
  103. VALUE_HP,
  104. VALUE_STEALING,
  105. VALUE_GRAVITY,
  106. VALUE_DAMAGE,
  107. VALUE_STAMINA,
  108. VALUE_WEAPONDROP,
  109. VALUE_KILLS
  110. }
  111.  
  112. enum
  113. {
  114. STATUS_NONE,
  115. STATUS_MEMBER,
  116. STATUS_ADMIN,
  117. STATUS_LEADER
  118. };
  119.  
  120. new const g_szGangValues[ ][ ] =
  121. {
  122. "HP",
  123. "Stealing",
  124. "Gravity",
  125. "Damage",
  126. "Stamina",
  127. "WeaponDrop",
  128. "Kills"
  129. };
  130.  
  131. new const g_szPrefix[ ] = "^04[Gang System]^01";
  132.  
  133. /* Tries */
  134.  
  135. new Trie:g_tGangNames;
  136. new Trie:g_tGangValues;
  137.  
  138. /* Vault */
  139.  
  140. new SQLVault:g_hVault;
  141. new SQLVault:g_hPointsVault;
  142.  
  143. /* Arrays */
  144.  
  145. new Array:g_aGangs;
  146.  
  147. /* Pcvars */
  148.  
  149. new g_pCreateCost;
  150.  
  151. new g_pHealthCost;
  152. new g_pStealingCost;
  153. new g_pGravityCost;
  154. new g_pDamageCost;
  155. new g_pStaminaCost;
  156. new g_pWeaponDropCost;
  157.  
  158. new g_pHealthMax;
  159. new g_pStealingMax;
  160. new g_pGravityMax;
  161. new g_pDamageMax;
  162. new g_pStaminaMax;
  163. new g_pWeaponDropMax;
  164.  
  165. new g_pHealthPerLevel;
  166. new g_pStealingPerLevel;
  167. new g_pGravityPerLevel;
  168. new g_pDamagePerLevel;
  169. new g_pStaminaPerLevel;
  170. new g_pWeaponDropPerLevel;
  171.  
  172. new g_pPointsPerKill;
  173. new g_pHeadshotBonus;
  174.  
  175. new g_pMaxMembers;
  176. new g_pAdminCreate;
  177.  
  178. /* Integers */
  179.  
  180. new g_iGang[ 33 ];
  181. new g_iPoints[ 33 ];
  182.  
  183.  
  184. public plugin_init()
  185. {
  186. register_plugin( "Jailbreak Gang System", g_szVersion, "H3avY Ra1n" );
  187.  
  188. g_aGangs = ArrayCreate( GangInfo );
  189.  
  190. g_tGangValues = TrieCreate();
  191. g_tGangNames = TrieCreate();
  192.  
  193. g_hVault = sqlv_open_local( "jb_gangs", false );
  194. sqlv_init_ex( g_hVault );
  195.  
  196. g_hPointsVault = sqlv_open_local( "jb_points", true );
  197.  
  198. g_pCreateCost = register_cvar( "jb_gang_cost", "50" );
  199. g_pHealthCost = register_cvar( "jb_health_cost", "20" );
  200. g_pStealingCost = register_cvar( "jb_stealing_cost", "20" );
  201. g_pGravityCost = register_cvar( "jb_gravity_cost", "20" );
  202. g_pDamageCost = register_cvar( "jb_damage_cost", "20" );
  203. g_pStaminaCost = register_cvar( "jb_stamina_cost", "20" );
  204. g_pWeaponDropCost = register_cvar( "jb_weapondrop_cost", "20" );
  205.  
  206. g_pHealthMax = register_cvar( "jb_health_max", "10" );
  207. g_pStealingMax = register_cvar( "jb_stealing_max", "10" );
  208. g_pGravityMax = register_cvar( "jb_gravity_max", "10" ); // Max * Gravity Per Level must be LESS than 800
  209. g_pDamageMax = register_cvar( "jb_damage_max", "10" );
  210. g_pStaminaMax = register_cvar( "jb_stamina_max", "10" );
  211. g_pWeaponDropMax = register_cvar( "jb_weapondrop_max", "10" );
  212.  
  213. g_pHealthPerLevel = register_cvar( "jb_health_per", "10" );
  214. g_pStealingPerLevel = register_cvar( "jb_stealing_per", "0.05" );
  215. g_pGravityPerLevel = register_cvar( "jb_gravity_per", "50" );
  216. g_pDamagePerLevel = register_cvar( "jb_damage_per", "3" );
  217. g_pStaminaPerLevel = register_cvar( "jb_stamina_per", "3" );
  218. g_pWeaponDropPerLevel = register_cvar( "jb_weapondrop_per", "1" );
  219.  
  220. g_pPointsPerKill = register_cvar( "jb_points_per_kill", "3" );
  221. g_pHeadshotBonus = register_cvar( "jb_headshot_bonus", "2" );
  222.  
  223. g_pMaxMembers = register_cvar( "jb_max_members", "10" );
  224. g_pAdminCreate = register_cvar( "jb_admin_create", "0" ); // Admins can create gangs without points
  225.  
  226. register_cvar( "jb_gang_version", g_szVersion, FCVAR_SPONLY | FCVAR_SERVER );
  227.  
  228. register_menu( "Gang Menu", 1023, "GangMenu_Handler" );
  229. register_menu( "Skills Menu", 1023, "SkillsMenu_Handler" );
  230.  
  231. for( new i = 0; i < sizeof g_szGangValues; i++ )
  232. {
  233. TrieSetCell( g_tGangValues, g_szGangValues[ i ], i );
  234. }
  235.  
  236. RegisterHam( Ham_Spawn, "player", "Ham_PlayerSpawn_Post", 1 );
  237. RegisterHam( Ham_TakeDamage, "player", "Ham_TakeDamage_Pre", 0 );
  238. RegisterHam( Ham_TakeDamage, "player", "Ham_TakeDamage_Post", 1 );
  239. RegisterHam( Ham_Item_PreFrame, "player", "Ham_PlayerResetSpeedPost", 1);
  240.  
  241. register_event( "DeathMsg", "Event_DeathMsg", "a" );
  242.  
  243. register_clcmd( "say /gang", "Cmd_Gang" );
  244. register_clcmd( "gang_name", "Cmd_CreateGang" );
  245.  
  246. LoadGangs();
  247. }
  248.  
  249. public client_disconnect( id )
  250. {
  251. g_iGang[ id ] = -1;
  252.  
  253. new szAuthID[ 35 ];
  254. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  255.  
  256. sqlv_set_num( g_hPointsVault, szAuthID, g_iPoints[ id ] );
  257. }
  258.  
  259. public client_putinserver( id )
  260. {
  261. g_iGang[ id ] = get_user_gang( id );
  262. new szAuthID[ 35 ];
  263. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  264.  
  265. g_iPoints[ id ] = sqlv_get_num( g_hPointsVault, szAuthID );
  266. }
  267.  
  268. public plugin_end()
  269. {
  270. SaveGangs();
  271. sqlv_close( g_hVault );
  272. }
  273.  
  274. public Ham_PlayerSpawn_Post( id )
  275. {
  276. if( !is_user_alive( id ) || cs_get_user_team( id ) != CS_TEAM_T )
  277. return HAM_IGNORED;
  278.  
  279. if( g_iGang[ id ] == -1 )
  280. {
  281. return HAM_IGNORED;
  282. }
  283.  
  284. new aData[ GangInfo ];
  285. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  286.  
  287. new iHealth = 100 + aData[ GangHP ] * get_pcvar_num( g_pHealthPerLevel );
  288. set_user_health( id, iHealth );
  289.  
  290. new iGravity = 800 - ( get_pcvar_num( g_pGravityPerLevel ) * aData[ GangGravity ] );
  291. set_user_gravity( id, float( iGravity ) / 800.0 );
  292.  
  293. return HAM_IGNORED;
  294. }
  295.  
  296. public Ham_TakeDamage_Pre( iVictim, iInflictor, iAttacker, Float:flDamage, iBits )
  297. {
  298. if( !is_user_alive( iAttacker ) || cs_get_user_team( iAttacker ) != CS_TEAM_T )
  299. return HAM_IGNORED;
  300.  
  301. if( g_iGang[ iAttacker ] == -1 )
  302. return HAM_IGNORED;
  303.  
  304. new aData[ GangInfo ];
  305. ArrayGetArray( g_aGangs, g_iGang[ iAttacker ], aData );
  306.  
  307. SetHamParamFloat( 4, flDamage + ( get_pcvar_num( g_pDamagePerLevel ) * ( aData[ GangDamage ] ) ) );
  308.  
  309. return HAM_IGNORED;
  310. }
  311.  
  312. public Ham_TakeDamage_Post( iVictim, iInflictor, iAttacker, Float:flDamage, iBits )
  313. {
  314. if( !is_user_alive( iAttacker ) || g_iGang[ iAttacker ] == -1 || get_user_weapon( iAttacker ) != CSW_KNIFE || cs_get_user_team( iAttacker ) != CS_TEAM_T )
  315. {
  316. return HAM_IGNORED;
  317. }
  318.  
  319. new aData[ GangInfo ];
  320. ArrayGetArray( g_aGangs, g_iGang[ iAttacker ], aData );
  321.  
  322. new iChance = aData[ GangWeaponDrop ] * get_pcvar_num( g_pWeaponDropPerLevel );
  323.  
  324. if( iChance == 0 )
  325. return HAM_IGNORED;
  326.  
  327. new bool:bDrop = ( random_num( 1, 100 ) <= iChance );
  328.  
  329. if( bDrop )
  330. client_cmd( iVictim, "drop" );
  331.  
  332. return HAM_IGNORED;
  333. }
  334.  
  335. public Ham_PlayerResetSpeedPost( id )
  336. {
  337. if( g_iGang[ id ] == -1 || !is_user_alive( id ) || cs_get_user_team( id ) != CS_TEAM_T )
  338. {
  339. return HAM_IGNORED;
  340. }
  341.  
  342. new aData[ GangInfo ];
  343. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  344.  
  345. if( aData[ GangStamina ] > 0 && get_user_maxspeed( id ) > 1.0 )
  346. set_user_maxspeed( id, 250.0 + ( aData[ GangStamina ] * get_pcvar_num( g_pStaminaPerLevel ) ) );
  347.  
  348. return HAM_IGNORED;
  349. }
  350.  
  351. public Event_DeathMsg()
  352. {
  353. new iKiller = read_data( 1 );
  354. new iVictim = read_data( 2 );
  355.  
  356. if( !is_user_alive( iKiller ) || cs_get_user_team( iVictim ) != CS_TEAM_CT || cs_get_user_team( iKiller ) != CS_TEAM_T )
  357. return PLUGIN_CONTINUE;
  358.  
  359. new iTotal = get_pcvar_num( g_pPointsPerKill ) + ( bool:read_data( 3 ) ? get_pcvar_num( g_pHeadshotBonus ) : 0 );
  360.  
  361. if( g_iGang[ iKiller ] > -1 )
  362. {
  363. new aData[ GangInfo ];
  364. ArrayGetArray( g_aGangs, g_iGang[ iKiller ], aData );
  365. aData[ GangKills ]++;
  366. ArraySetArray( g_aGangs, g_iGang[ iKiller ], aData );
  367.  
  368. iTotal += iTotal * ( aData[ GangStealing ] * get_pcvar_num( g_pStealingPerLevel ) );
  369. }
  370.  
  371. g_iPoints[ iKiller ] += iTotal;
  372.  
  373. return PLUGIN_CONTINUE;
  374. }
  375.  
  376. public Cmd_Gang( id )
  377. {
  378. if( !is_user_connected( id ) || cs_get_user_team( id ) != CS_TEAM_T )
  379. {
  380. ColorChat( id, NORMAL, "%s Only ^03prisoners ^01can access this menu.", g_szPrefix );
  381. return PLUGIN_HANDLED;
  382. }
  383.  
  384. static szMenu[ 512 ], iLen, aData[ GangInfo ], iKeys, iStatus;
  385.  
  386. iKeys = MENU_KEY_0 | MENU_KEY_4;
  387.  
  388. iStatus = getStatus( id, g_iGang[ id ] );
  389.  
  390. if( g_iGang[ id ] > -1 )
  391. {
  392. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  393. iLen = formatex( szMenu, charsmax( szMenu ), "\yGang Menu^n\wCurrent Gang:\y %s^n", aData[ GangName ] );
  394. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\yJB Points: \w%i^n^n", g_iPoints[ id ] );
  395. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r1. \dCreate a Gang [%i Points]^n", get_pcvar_num( g_pCreateCost ) );
  396. }
  397.  
  398. else
  399. {
  400. iLen = formatex( szMenu, charsmax( szMenu ), "\yGang Menu^n\wCurrent Gang:\r None^n" );
  401. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\yJB Points: \w%i^n^n", g_iPoints[ id ] );
  402. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r1. \wCreate a Gang [%i Points]^n", get_pcvar_num( g_pCreateCost ) );
  403.  
  404. iKeys |= MENU_KEY_1;
  405. }
  406.  
  407.  
  408. if( iStatus > STATUS_MEMBER && g_iGang[ id ] > -1 && get_pcvar_num( g_pMaxMembers ) > aData[ NumMembers ] )
  409. {
  410. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r2. \wInvite Player to Gang^n" );
  411. iKeys |= MENU_KEY_2;
  412. }
  413. else
  414. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r2. \dInvite Player to Gang^n" );
  415.  
  416. if( g_iGang[ id ] > -1 )
  417. {
  418. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r3. \wSkills^n" );
  419. iKeys |= MENU_KEY_3;
  420. }
  421.  
  422. else
  423. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r3. \dSkills^n" );
  424.  
  425. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r4. \wTop-10^n" );
  426.  
  427. if( g_iGang[ id ] > -1 )
  428. {
  429. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r5. \wLeave Gang^n" );
  430. iKeys |= MENU_KEY_5;
  431. }
  432.  
  433. else
  434. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r5. \dLeave Gang^n" );
  435.  
  436.  
  437. if( iStatus > STATUS_MEMBER )
  438. {
  439. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r6. \wGang Admin Menu^n" );
  440. iKeys |= MENU_KEY_6;
  441. }
  442.  
  443. else
  444. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r6. \dGang Admin Menu^n" );
  445.  
  446. if( g_iGang[ id ] > -1 )
  447. {
  448. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r7. \wOnline Members^n" );
  449. iKeys |= MENU_KEY_7;
  450. }
  451.  
  452. else
  453. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r7. \dOnline Members^n" );
  454.  
  455. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "^n\r0. \wExit" );
  456.  
  457. show_menu( id, iKeys, szMenu, -1, "Gang Menu" );
  458.  
  459. return PLUGIN_CONTINUE;
  460. }
  461.  
  462. public GangMenu_Handler( id, iKey )
  463. {
  464. switch( ( iKey + 1 ) % 10 )
  465. {
  466. case 0: return PLUGIN_HANDLED;
  467.  
  468. case 1:
  469. {
  470. if( get_pcvar_num( g_pAdminCreate ) && get_user_flags( id ) & ADMIN_CREATE )
  471. {
  472. client_cmd( id, "messagemode gang_name" );
  473. }
  474.  
  475. else if( g_iPoints[ id ] < get_pcvar_num( g_pCreateCost ) )
  476. {
  477. ColorChat( id, NORMAL, "%s You do not have enough points to create a gang!", g_szPrefix );
  478. return PLUGIN_HANDLED;
  479. }
  480.  
  481. else
  482. client_cmd( id, "messagemode gang_name" );
  483. }
  484.  
  485. case 2:
  486. {
  487. ShowInviteMenu( id );
  488. }
  489.  
  490. case 3:
  491. {
  492. ShowSkillsMenu( id );
  493. }
  494.  
  495. case 4:
  496. {
  497. Cmd_Top10( id );
  498. }
  499.  
  500. case 5:
  501. {
  502. ShowLeaveConfirmMenu( id );
  503. }
  504.  
  505. case 6:
  506. {
  507. ShowLeaderMenu( id );
  508. }
  509.  
  510. case 7:
  511. {
  512. ShowMembersMenu( id );
  513. }
  514. }
  515.  
  516. return PLUGIN_HANDLED;
  517. }
  518.  
  519. public Cmd_CreateGang( id )
  520. {
  521. new bool:bAdmin = false;
  522.  
  523. if( get_pcvar_num( g_pAdminCreate ) && get_user_flags( id ) & ADMIN_CREATE )
  524. {
  525. bAdmin = true;
  526. }
  527.  
  528. else if( g_iPoints[ id ] < get_pcvar_num( g_pCreateCost ) )
  529. {
  530. ColorChat( id, NORMAL, "%s You do not have enough points to create a gang.", g_szPrefix );
  531. return PLUGIN_HANDLED;
  532. }
  533.  
  534. else if( g_iGang[ id ] > -1 )
  535. {
  536. ColorChat( id, NORMAL, "%s You cannot create a gang if you are already in one!", g_szPrefix );
  537. return PLUGIN_HANDLED;
  538. }
  539.  
  540. else if( cs_get_user_team( id ) != CS_TEAM_T )
  541. {
  542. ColorChat( id, NORMAL, "%s Only ^03prisoners ^01can create gangs!", g_szPrefix );
  543. return PLUGIN_HANDLED;
  544. }
  545.  
  546. new szArgs[ 60 ];
  547. read_args( szArgs, charsmax( szArgs ) );
  548.  
  549. remove_quotes( szArgs );
  550.  
  551. if( TrieKeyExists( g_tGangNames, szArgs ) )
  552. {
  553. ColorChat( id, NORMAL, "%s That gang with that name already exists.", g_szPrefix );
  554. Cmd_Gang( id );
  555. return PLUGIN_HANDLED;
  556. }
  557.  
  558. new aData[ GangInfo ];
  559.  
  560. aData[ GangName ] = szArgs;
  561. aData[ GangHP ] = 0;
  562. aData[ GangStealing ] = 0;
  563. aData[ GangGravity ] = 0;
  564. aData[ GangStamina ] = 0;
  565. aData[ GangWeaponDrop ] = 0;
  566. aData[ GangDamage ] = 0;
  567. aData[ NumMembers ] = 0;
  568. aData[ GangMembers ] = _:TrieCreate();
  569.  
  570. ArrayPushArray( g_aGangs, aData );
  571.  
  572. if( !bAdmin )
  573. g_iPoints[ id ] -= get_pcvar_num( g_pCreateCost );
  574.  
  575. set_user_gang( id, ArraySize( g_aGangs ) - 1, STATUS_LEADER );
  576.  
  577. ColorChat( id, NORMAL, "%s You have successfully created gang '^03%s^01'.", g_szPrefix, szArgs );
  578.  
  579. return PLUGIN_HANDLED;
  580. }
  581.  
  582. public ShowInviteMenu( id )
  583. {
  584. new iPlayers[ 32 ], iNum;
  585. get_players( iPlayers, iNum );
  586.  
  587. new szInfo[ 6 ], hMenu;
  588. hMenu = menu_create( "Choose a Player to Invite:", "InviteMenu_Handler" );
  589. new szName[ 32 ];
  590.  
  591. for( new i = 0, iPlayer; i < iNum; i++ )
  592. {
  593. iPlayer = iPlayers[ i ];
  594.  
  595.  
  596. if( iPlayer == id || g_iGang[ iPlayer ] == g_iGang[ id ] || cs_get_user_team( iPlayer ) != CS_TEAM_T )
  597. continue;
  598.  
  599. get_user_name( iPlayer, szName, charsmax( szName ) );
  600.  
  601. num_to_str( iPlayer, szInfo, charsmax( szInfo ) );
  602.  
  603. menu_additem( hMenu, szName, szInfo );
  604. }
  605.  
  606. menu_display( id, hMenu, 0 );
  607. }
  608.  
  609. public InviteMenu_Handler( id, hMenu, iItem )
  610. {
  611. if( iItem == MENU_EXIT )
  612. {
  613. Cmd_Gang( id );
  614. return PLUGIN_HANDLED;
  615. }
  616.  
  617. new szData[ 6 ], iAccess, hCallback, szName[ 32 ];
  618. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, 31, hCallback );
  619.  
  620. new iPlayer = str_to_num( szData );
  621.  
  622. if( !is_user_connected( iPlayer ) )
  623. return PLUGIN_HANDLED;
  624.  
  625. ShowInviteConfirmMenu( id, iPlayer );
  626.  
  627. ColorChat( id, NORMAL, "%s You have successfully invited %s to join your gang.", g_szPrefix, szName );
  628.  
  629. Cmd_Gang( id );
  630. return PLUGIN_HANDLED;
  631. }
  632.  
  633. public ShowInviteConfirmMenu( id, iPlayer )
  634. {
  635. new szName[ 32 ];
  636. get_user_name( id, szName, charsmax( szName ) );
  637.  
  638. new aData[ GangInfo ];
  639. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  640.  
  641. new szMenuTitle[ 128 ];
  642. formatex( szMenuTitle, charsmax( szMenuTitle ), "%s Invited You to Join %s", szName, aData[ GangName ] );
  643. new hMenu = menu_create( szMenuTitle, "InviteConfirmMenu_Handler" );
  644.  
  645. new szInfo[ 6 ];
  646. num_to_str( g_iGang[ id ], szInfo, 5 );
  647.  
  648. menu_additem( hMenu, "Accept Invitation", szInfo );
  649. menu_additem( hMenu, "Decline Invitation", "-1" );
  650.  
  651. menu_display( iPlayer, hMenu, 0 );
  652. }
  653.  
  654. public InviteConfirmMenu_Handler( id, hMenu, iItem )
  655. {
  656. if( iItem == MENU_EXIT )
  657. return PLUGIN_HANDLED;
  658.  
  659. new szData[ 6 ], iAccess, hCallback;
  660. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  661.  
  662. new iGang = str_to_num( szData );
  663.  
  664. if( iGang == -1 )
  665. return PLUGIN_HANDLED;
  666.  
  667. if( getStatus( id, g_iGang[ id ] ) == STATUS_LEADER )
  668. {
  669. ColorChat( id, NORMAL, "%s You cannot leave your gang while you are the leader.", g_szPrefix );
  670. return PLUGIN_HANDLED;
  671. }
  672.  
  673. set_user_gang( id, iGang );
  674.  
  675. new aData[ GangInfo ];
  676. ArrayGetArray( g_aGangs, iGang, aData );
  677.  
  678. ColorChat( id, NORMAL, "%s You have successfully joined the gang ^03%s^01.", g_szPrefix, aData[ GangName ] );
  679.  
  680. return PLUGIN_HANDLED;
  681. }
  682.  
  683.  
  684. public ShowSkillsMenu( id )
  685. {
  686. static szMenu[ 512 ], iLen, iKeys, aData[ GangInfo ];
  687.  
  688. if( !iKeys )
  689. {
  690. iKeys = MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0;
  691. }
  692.  
  693. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  694.  
  695. iLen = formatex( szMenu, charsmax( szMenu ), "\ySkills Menu^n^n" );
  696. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r1. \wHealth Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pHealthCost ), aData[ GangHP ], get_pcvar_num( g_pHealthMax ) );
  697. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r2. \wStealing Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pStealingCost ), aData[ GangStealing ], get_pcvar_num( g_pStealingMax ) );
  698. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r3. \wGravity Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pGravityCost ), aData[ GangGravity ], get_pcvar_num( g_pGravityMax ) );
  699. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r4. \wDamage Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pDamageCost ), aData[ GangDamage ], get_pcvar_num( g_pDamageMax ) );
  700. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r5. \wWeapon Drop Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pWeaponDropCost ), aData[ GangWeaponDrop ], get_pcvar_num( g_pWeaponDropMax ) );
  701. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r6. \wSpeed Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pStaminaCost ), aData[ GangStamina ], get_pcvar_num( g_pStaminaMax ) );
  702.  
  703. iLen += formatex( szMenu[ iLen ], 511 - iLen, "^n\r0. \wExit" );
  704.  
  705. show_menu( id, iKeys, szMenu, -1, "Skills Menu" );
  706. }
  707.  
  708. public SkillsMenu_Handler( id, iKey )
  709. {
  710. new aData[ GangInfo ];
  711. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  712.  
  713. switch( ( iKey + 1 ) % 10 )
  714. {
  715. case 0:
  716. {
  717. Cmd_Gang( id );
  718. return PLUGIN_HANDLED;
  719. }
  720.  
  721. case 1:
  722. {
  723. if( aData[ GangHP ] == get_pcvar_num( g_pHealthMax ) )
  724. {
  725. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  726. ShowSkillsMenu( id );
  727. return PLUGIN_HANDLED;
  728. }
  729.  
  730. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pHealthCost );
  731.  
  732. if( iRemaining < 0 )
  733. {
  734. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  735. ShowSkillsMenu( id );
  736. return PLUGIN_HANDLED;
  737. }
  738.  
  739. aData[ GangHP ]++;
  740.  
  741. g_iPoints[ id ] = iRemaining;
  742. }
  743.  
  744. case 2:
  745. {
  746. if( aData[ GangStealing ] == get_pcvar_num( g_pStealingMax ) )
  747. {
  748. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  749. ShowSkillsMenu( id );
  750. return PLUGIN_HANDLED;
  751. }
  752.  
  753. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pStealingCost );
  754.  
  755. if( iRemaining < 0 )
  756. {
  757. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  758. ShowSkillsMenu( id );
  759. return PLUGIN_HANDLED;
  760. }
  761.  
  762. aData[ GangStealing ]++;
  763.  
  764. g_iPoints[ id ] = iRemaining;
  765. }
  766.  
  767. case 3:
  768. {
  769. if( aData[ GangGravity ] == get_pcvar_num( g_pGravityMax ) )
  770. {
  771. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  772. ShowSkillsMenu( id );
  773. return PLUGIN_HANDLED;
  774. }
  775.  
  776. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pGravityCost );
  777.  
  778. if( iRemaining < 0 )
  779. {
  780. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  781. ShowSkillsMenu( id );
  782. return PLUGIN_HANDLED;
  783. }
  784.  
  785. aData[ GangGravity ]++;
  786.  
  787. g_iPoints[ id ] = iRemaining;
  788. }
  789.  
  790. case 4:
  791. {
  792. if( aData[ GangDamage ] == get_pcvar_num( g_pDamageMax ) )
  793. {
  794. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  795. ShowSkillsMenu( id );
  796. return PLUGIN_HANDLED;
  797. }
  798.  
  799. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pDamageCost );
  800.  
  801. if( iRemaining < 0 )
  802. {
  803. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  804. ShowSkillsMenu( id );
  805. return PLUGIN_HANDLED;
  806. }
  807.  
  808. aData[ GangDamage ]++;
  809.  
  810. g_iPoints[ id ] = iRemaining;
  811. }
  812.  
  813. case 5:
  814. {
  815. if( aData[ GangWeaponDrop ] == get_pcvar_num( g_pWeaponDropMax ) )
  816. {
  817. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  818. ShowSkillsMenu( id );
  819. return PLUGIN_HANDLED;
  820. }
  821.  
  822. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pWeaponDropCost );
  823.  
  824. if( iRemaining < 0 )
  825. {
  826. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  827. ShowSkillsMenu( id );
  828. return PLUGIN_HANDLED;
  829. }
  830.  
  831. aData[ GangWeaponDrop ]++;
  832.  
  833. g_iPoints[ id ] = iRemaining;
  834. }
  835.  
  836. case 6:
  837. {
  838. if( aData[ GangStamina ] == get_pcvar_num( g_pStaminaMax ) )
  839. {
  840. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  841. ShowSkillsMenu( id );
  842. return PLUGIN_HANDLED;
  843. }
  844.  
  845. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pStaminaCost );
  846.  
  847. if( iRemaining < 0 )
  848. {
  849. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  850. ShowSkillsMenu( id );
  851. return PLUGIN_HANDLED;
  852. }
  853.  
  854. aData[ GangStamina ]++;
  855.  
  856. g_iPoints[ id ] = iRemaining;
  857. }
  858. }
  859.  
  860. ArraySetArray( g_aGangs, g_iGang[ id ], aData );
  861.  
  862. new iPlayers[ 32 ], iNum, iPlayer;
  863. new szName[ 32 ];
  864. get_players( iPlayers, iNum );
  865.  
  866. for( new i = 0; i < iNum; i++ )
  867. {
  868. iPlayer = iPlayers[ i ];
  869.  
  870. if( iPlayer == id || g_iGang[ iPlayer ] != g_iGang[ id ] )
  871. continue;
  872.  
  873. ColorChat( iPlayer, NORMAL, "%s ^03%s ^01has just upgraded one of your gang's skills.", g_szPrefix, szName );
  874. }
  875.  
  876. ColorChat( id, NORMAL, "%s You have successfully upgraded your gang.", g_szPrefix );
  877.  
  878. ShowSkillsMenu( id );
  879.  
  880. return PLUGIN_HANDLED;
  881. }
  882.  
  883.  
  884. public Cmd_Top10( id )
  885. {
  886. new iSize = ArraySize( g_aGangs );
  887.  
  888. new iOrder[ 100 ][ 2 ];
  889.  
  890. new aData[ GangInfo ];
  891.  
  892. for( new i = 0; i < iSize; i++ )
  893. {
  894. ArrayGetArray( g_aGangs, i, aData );
  895.  
  896. iOrder[ i ][ 0 ] = i;
  897. iOrder[ i ][ 1 ] = aData[ GangKills ];
  898. }
  899.  
  900. SortCustom2D( iOrder, iSize, "Top10_Sort" );
  901.  
  902. new szMessage[ 2048 ];
  903. formatex( szMessage, charsmax( szMessage ), "<body bgcolor=#000000><font color=#FFB000><pre>" );
  904. format( szMessage, charsmax( szMessage ), "%s%2s %-22.22s %7s %4s %10s %9s %9s %11s %8s^n", szMessage, "#", "Name", "Kills", "HP", "Stealing",
  905. "Gravity", "Stamina", "WeaponDrop", "Damage" );
  906.  
  907. for( new i = 0; i < min( 10, iSize ); i++ )
  908. {
  909. ArrayGetArray( g_aGangs, iOrder[ i ][ 0 ], aData );
  910.  
  911. format( szMessage, charsmax( szMessage ), "%s%-2d %22.22s %7d %4d %10d %9d %9d %11d %8d^n", szMessage, i + 1, aData[ GangName ],
  912. aData[ GangKills ], aData[ GangHP ], aData[ GangStealing ], aData[ GangGravity ], aData[ GangStamina], aData[ GangWeaponDrop ], aData[ GangDamage ] );
  913. }
  914.  
  915. show_motd( id, szMessage, "Gang Top 10" );
  916. }
  917.  
  918. public Top10_Sort( const iElement1[ ], const iElement2[ ], const iArray[ ], szData[], iSize )
  919. {
  920. if( iElement1[ 1 ] > iElement2[ 1 ] )
  921. return -1;
  922.  
  923. else if( iElement1[ 1 ] < iElement2[ 1 ] )
  924. return 1;
  925.  
  926. return 0;
  927. }
  928.  
  929. public ShowLeaveConfirmMenu( id )
  930. {
  931. new hMenu = menu_create( "Are you sure you want to leave?", "LeaveConfirmMenu_Handler" );
  932. menu_additem( hMenu, "Yes, Leave Now", "0" );
  933. menu_additem( hMenu, "No, Don't Leave", "1" );
  934.  
  935. menu_display( id, hMenu, 0 );
  936. }
  937.  
  938. public LeaveConfirmMenu_Handler( id, hMenu, iItem )
  939. {
  940. if( iItem == MENU_EXIT )
  941. return PLUGIN_HANDLED;
  942.  
  943. new szData[ 6 ], iAccess, hCallback;
  944. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  945.  
  946. switch( str_to_num( szData ) )
  947. {
  948. case 0:
  949. {
  950. if( getStatus( id, g_iGang[ id ] ) == STATUS_LEADER )
  951. {
  952. ColorChat( id, NORMAL, "%s You must transfer leadership before leaving this gang.", g_szPrefix );
  953. Cmd_Gang( id );
  954.  
  955. return PLUGIN_HANDLED;
  956. }
  957.  
  958. ColorChat( id, NORMAL, "%s You have successfully left your gang.", g_szPrefix );
  959. set_user_gang( id, -1 );
  960. Cmd_Gang( id );
  961. }
  962.  
  963. case 1: Cmd_Gang( id );
  964. }
  965.  
  966. return PLUGIN_HANDLED;
  967. }
  968.  
  969. public ShowLeaderMenu( id )
  970. {
  971. new hMenu = menu_create( "Gang Leader Menu", "LeaderMenu_Handler" );
  972.  
  973. new iStatus = getStatus( id, g_iGang[ id ] );
  974.  
  975. if( iStatus == STATUS_LEADER )
  976. {
  977. menu_additem( hMenu, "Disband Gang", "0" );
  978. menu_additem( hMenu, "Transfer Leadership", "1" );
  979. menu_additem( hMenu, "Add An Admin", "4" );
  980. menu_additem( hMenu, "Remove An Admin", "5" );
  981. }
  982.  
  983. menu_additem( hMenu, "Kick From Gang", "2" );
  984. menu_additem( hMenu, "Change Gang Name", "3" );
  985.  
  986.  
  987. menu_display( id, hMenu, 0 );
  988. }
  989.  
  990. public LeaderMenu_Handler( id, hMenu, iItem )
  991. {
  992. if( iItem == MENU_EXIT )
  993. {
  994. Cmd_Gang( id );
  995. return PLUGIN_HANDLED;
  996. }
  997.  
  998. new iAccess, hCallback, szData[ 6 ];
  999. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  1000.  
  1001. switch( str_to_num( szData ) )
  1002. {
  1003. case 0:
  1004. {
  1005. ShowDisbandConfirmMenu( id );
  1006. }
  1007.  
  1008. case 1:
  1009. {
  1010. ShowTransferMenu( id );
  1011. }
  1012.  
  1013. case 2:
  1014. {
  1015. ShowKickMenu( id );
  1016. }
  1017.  
  1018. case 3:
  1019. {
  1020. client_cmd( id, "messagemode New_Name" );
  1021. }
  1022.  
  1023. case 4:
  1024. {
  1025. ShowAddAdminMenu( id );
  1026. }
  1027.  
  1028. case 5:
  1029. {
  1030. ShowRemoveAdminMenu( id );
  1031. }
  1032. }
  1033.  
  1034. return PLUGIN_HANDLED;
  1035. }
  1036.  
  1037. public ShowDisbandConfirmMenu( id )
  1038. {
  1039. new hMenu = menu_create( "Are you sure you want to disband the gang?", "DisbandConfirmMenu_Handler" );
  1040. menu_additem( hMenu, "Yes, Disband Now", "0" );
  1041. menu_additem( hMenu, "No, Don't Disband", "1" );
  1042.  
  1043. menu_display( id, hMenu, 0 );
  1044. }
  1045.  
  1046. public DisbandConfirmMenu_Handler( id, hMenu, iItem )
  1047. {
  1048. if( iItem == MENU_EXIT )
  1049. return PLUGIN_HANDLED;
  1050.  
  1051. new szData[ 6 ], iAccess, hCallback;
  1052. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  1053.  
  1054. switch( str_to_num( szData ) )
  1055. {
  1056. case 0:
  1057. {
  1058.  
  1059. ColorChat( id, NORMAL, "%s You have successfully disbanded your gang.", g_szPrefix );
  1060.  
  1061. new iPlayers[ 32 ], iNum;
  1062.  
  1063. get_players( iPlayers, iNum );
  1064.  
  1065. new iPlayer;
  1066.  
  1067. for( new i = 0; i < iNum; i++ )
  1068. {
  1069. iPlayer = iPlayers[ i ];
  1070.  
  1071. if( iPlayer == id )
  1072. continue;
  1073.  
  1074. if( g_iGang[ id ] != g_iGang[ iPlayer ] )
  1075. continue;
  1076.  
  1077. ColorChat( iPlayer, NORMAL, "%s Your gang has been disband by its leader.", g_szPrefix );
  1078. set_user_gang( iPlayer, -1 );
  1079. }
  1080.  
  1081. new iGang = g_iGang[ id ];
  1082.  
  1083. set_user_gang( id, -1 );
  1084.  
  1085. ArrayDeleteItem( g_aGangs, iGang );
  1086.  
  1087. Cmd_Gang( id );
  1088. }
  1089.  
  1090. case 1: Cmd_Gang( id );
  1091. }
  1092.  
  1093. return PLUGIN_HANDLED;
  1094. }
  1095.  
  1096. public ShowTransferMenu( id )
  1097. {
  1098. new iPlayers[ 32 ], iNum;
  1099. get_players( iPlayers, iNum, "e", "TERRORIST" );
  1100.  
  1101. new hMenu = menu_create( "Transfer Leadership to:", "TransferMenu_Handler" );
  1102. new szName[ 32 ], szData[ 6 ];
  1103.  
  1104. for( new i = 0, iPlayer; i < iNum; i++ )
  1105. {
  1106. iPlayer = iPlayers[ i ];
  1107.  
  1108. if( g_iGang[ iPlayer ] != g_iGang[ id ] || id == iPlayer )
  1109. continue;
  1110.  
  1111. get_user_name( iPlayer, szName, charsmax( szName ) );
  1112. num_to_str( iPlayer, szData, charsmax( szData ) );
  1113.  
  1114. menu_additem( hMenu, szName, szData );
  1115. }
  1116.  
  1117. menu_display( id, hMenu, 0 );
  1118. }
  1119.  
  1120. public TransferMenu_Handler( id, hMenu, iItem )
  1121. {
  1122. if( iItem == MENU_EXIT )
  1123. {
  1124. ShowLeaderMenu( id );
  1125. return PLUGIN_HANDLED;
  1126. }
  1127.  
  1128. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1129.  
  1130. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, charsmax( szName ), hCallback );
  1131.  
  1132. new iPlayer = str_to_num( szData );
  1133.  
  1134. if( !is_user_connected( iPlayer ) )
  1135. {
  1136. ColorChat( id, NORMAL, "%s That player is no longer connected.", g_szPrefix );
  1137. ShowTransferMenu( id );
  1138. return PLUGIN_HANDLED;
  1139. }
  1140.  
  1141. set_user_gang( iPlayer, g_iGang[ id ], STATUS_LEADER );
  1142. set_user_gang( id, g_iGang[ id ], STATUS_ADMIN );
  1143.  
  1144. Cmd_Gang( id );
  1145.  
  1146. new iPlayers[ 32 ], iNum, iTemp;
  1147. get_players( iPlayers, iNum );
  1148.  
  1149. for( new i = 0; i < iNum; i++ )
  1150. {
  1151. iTemp = iPlayers[ i ];
  1152.  
  1153. if( iTemp == iPlayer )
  1154. {
  1155. ColorChat( iTemp, NORMAL, "%s You are the new leader of your gang.", g_szPrefix );
  1156. continue;
  1157. }
  1158.  
  1159. else if( g_iGang[ iTemp ] != g_iGang[ id ] )
  1160. continue;
  1161.  
  1162. ColorChat( iTemp, NORMAL, "%s ^03%s^01 is the new leader of your gang.", g_szPrefix, szName );
  1163. }
  1164.  
  1165. return PLUGIN_HANDLED;
  1166. }
  1167.  
  1168.  
  1169. public ShowKickMenu( id )
  1170. {
  1171. new iPlayers[ 32 ], iNum;
  1172. get_players( iPlayers, iNum );
  1173.  
  1174. new hMenu = menu_create( "Kick Player From Gang:", "KickMenu_Handler" );
  1175. new szName[ 32 ], szData[ 6 ];
  1176.  
  1177.  
  1178. for( new i = 0, iPlayer; i < iNum; i++ )
  1179. {
  1180. iPlayer = iPlayers[ i ];
  1181.  
  1182. if( g_iGang[ iPlayer ] != g_iGang[ id ] || id == iPlayer )
  1183. continue;
  1184.  
  1185. get_user_name( iPlayer, szName, charsmax( szName ) );
  1186. num_to_str( iPlayer, szData, charsmax( szData ) );
  1187.  
  1188. menu_additem( hMenu, szName, szData );
  1189. }
  1190.  
  1191. menu_display( id, hMenu, 0 );
  1192. }
  1193.  
  1194. public KickMenu_Handler( id, hMenu, iItem )
  1195. {
  1196. if( iItem == MENU_EXIT )
  1197. {
  1198. ShowLeaderMenu( id );
  1199. return PLUGIN_HANDLED;
  1200. }
  1201.  
  1202. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1203.  
  1204. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, charsmax( szName ), hCallback );
  1205.  
  1206. new iPlayer = str_to_num( szData );
  1207.  
  1208. if( !is_user_connected( iPlayer ) )
  1209. {
  1210. ColorChat( id, NORMAL, "%s That player is no longer connected.", g_szPrefix );
  1211. ShowTransferMenu( id );
  1212. return PLUGIN_HANDLED;
  1213. }
  1214.  
  1215. set_user_gang( iPlayer, -1 );
  1216.  
  1217. Cmd_Gang( id );
  1218.  
  1219. new iPlayers[ 32 ], iNum, iTemp;
  1220. get_players( iPlayers, iNum );
  1221.  
  1222. for( new i = 0; i < iNum; i++ )
  1223. {
  1224. iTemp = iPlayers[ i ];
  1225.  
  1226. if( iTemp == iPlayer || g_iGang[ iTemp ] != g_iGang[ id ] )
  1227. continue;
  1228.  
  1229. ColorChat( iTemp, NORMAL, "%s ^03%s^01 has been kicked from the gang.", g_szPrefix, szName );
  1230. }
  1231.  
  1232. ColorChat( iPlayer, NORMAL, "%s You have been kicked from your gang.", g_szPrefix, szName );
  1233.  
  1234. return PLUGIN_HANDLED;
  1235. }
  1236.  
  1237. public ChangeName_Handler( id )
  1238. {
  1239. if( g_iGang[ id ] == -1 || getStatus( id, g_iGang[ id ] ) == STATUS_MEMBER )
  1240. {
  1241. return;
  1242. }
  1243.  
  1244. new iGang = g_iGang[ id ];
  1245.  
  1246. new szArgs[ 64 ];
  1247. read_args( szArgs, charsmax( szArgs ) );
  1248.  
  1249. new iPlayers[ 32 ], iNum;
  1250. get_players( iPlayers, iNum );
  1251.  
  1252. new bool:bInGang[ 33 ];
  1253. new iStatus[ 33 ];
  1254.  
  1255. for( new i = 0, iPlayer; i < iNum; i++ )
  1256. {
  1257. iPlayer = iPlayers[ i ];
  1258.  
  1259. if( g_iGang[ id ] != g_iGang[ iPlayer ] )
  1260. continue;
  1261.  
  1262. bInGang[ iPlayer ] = true;
  1263. iStatus[ iPlayer ] = getStatus( id, iGang );
  1264.  
  1265. set_user_gang( iPlayer, -1 );
  1266. }
  1267.  
  1268. new aData[ GangInfo ];
  1269. ArrayGetArray( g_aGangs, iGang, aData );
  1270.  
  1271. aData[ GangName ] = szArgs;
  1272.  
  1273. ArraySetArray( g_aGangs, iGang, aData );
  1274.  
  1275. for( new i = 0, iPlayer; i < iNum; i++ )
  1276. {
  1277. iPlayer = iPlayers[ i ];
  1278.  
  1279. if( !bInGang[ iPlayer ] )
  1280. continue;
  1281.  
  1282. set_user_gang( iPlayer, iGang, iStatus[ id ] );
  1283. }
  1284. }
  1285.  
  1286. public ShowAddAdminMenu( id )
  1287. {
  1288. new iPlayers[ 32 ], iNum;
  1289. new szName[ 32 ], szData[ 6 ];
  1290. new hMenu = menu_create( "Choose a Player to Promote:", "AddAdminMenu_Handler" );
  1291.  
  1292. get_players( iPlayers, iNum );
  1293.  
  1294. for( new i = 0, iPlayer; i < iNum; i++ )
  1295. {
  1296. iPlayer = iPlayers[ i ];
  1297.  
  1298. if( g_iGang[ id ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) > STATUS_MEMBER )
  1299. continue;
  1300.  
  1301. get_user_name( iPlayer, szName, charsmax( szName ) );
  1302.  
  1303. num_to_str( iPlayer, szData, charsmax( szData ) );
  1304.  
  1305. menu_additem( hMenu, szName, szData );
  1306. }
  1307.  
  1308. menu_display( id, hMenu, 0 );
  1309. }
  1310.  
  1311. public AddAdminMenu_Handler( id, hMenu, iItem )
  1312. {
  1313. if( iItem == MENU_EXIT )
  1314. {
  1315. menu_destroy( hMenu );
  1316. ShowLeaderMenu( id );
  1317. return PLUGIN_HANDLED;
  1318. }
  1319.  
  1320. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1321.  
  1322. menu_item_getinfo( hMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), hCallback );
  1323.  
  1324. new iChosen = str_to_num( szData );
  1325.  
  1326. if( !is_user_connected( iChosen ) )
  1327. {
  1328. menu_destroy( hMenu );
  1329. ShowLeaderMenu( id );
  1330. return PLUGIN_HANDLED;
  1331. }
  1332.  
  1333. set_user_gang( iChosen, g_iGang[ id ], STATUS_LEADER );
  1334.  
  1335. new iPlayers[ 32 ], iNum;
  1336. get_players( iPlayers, iNum );
  1337.  
  1338. for( new i = 0, iPlayer; i < iNum; i++ )
  1339. {
  1340. iPlayer = iPlayers[ i ];
  1341.  
  1342. if( g_iGang[ iPlayer ] != g_iGang[ id ] || iPlayer == iChosen )
  1343. continue;
  1344.  
  1345. ColorChat( iPlayer, NORMAL, "%s ^03%s ^01has been promoted to an admin of your gang.", g_szPrefix, szName );
  1346. }
  1347.  
  1348. ColorChat( iChosen, NORMAL, "%s ^01You have been promoted to an admin of your gang.", g_szPrefix );
  1349.  
  1350. menu_destroy( hMenu );
  1351. return PLUGIN_HANDLED;
  1352. }
  1353.  
  1354. public ShowRemoveAdminMenu( id )
  1355. {
  1356. new iPlayers[ 32 ], iNum;
  1357. new szName[ 32 ], szData[ 6 ];
  1358. new hMenu = menu_create( "Choose a Player to Demote:", "RemoveAdminMenu_Handler" );
  1359.  
  1360. get_players( iPlayers, iNum );
  1361.  
  1362. for( new i = 0, iPlayer; i < iNum; i++ )
  1363. {
  1364. iPlayer = iPlayers[ i ];
  1365.  
  1366. if( g_iGang[ id ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) != STATUS_ADMIN )
  1367. continue;
  1368.  
  1369. get_user_name( iPlayer, szName, charsmax( szName ) );
  1370.  
  1371. num_to_str( iPlayer, szData, charsmax( szData ) );
  1372.  
  1373. menu_additem( hMenu, szName, szData );
  1374. }
  1375.  
  1376. menu_display( id, hMenu, 0 );
  1377. }
  1378.  
  1379. public RemoveAdminMenu_Handler( id, hMenu, iItem )
  1380. {
  1381. if( iItem == MENU_EXIT )
  1382. {
  1383. menu_destroy( hMenu );
  1384. ShowLeaderMenu( id );
  1385. return PLUGIN_HANDLED;
  1386. }
  1387.  
  1388. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1389.  
  1390. menu_item_getinfo( hMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), hCallback );
  1391.  
  1392. new iChosen = str_to_num( szData );
  1393.  
  1394. if( !is_user_connected( iChosen ) )
  1395. {
  1396. menu_destroy( hMenu );
  1397. ShowLeaderMenu( id );
  1398. return PLUGIN_HANDLED;
  1399. }
  1400.  
  1401. set_user_gang( iChosen, g_iGang[ id ], STATUS_MEMBER );
  1402.  
  1403. new iPlayers[ 32 ], iNum;
  1404. get_players( iPlayers, iNum );
  1405.  
  1406. for( new i = 0, iPlayer; i < iNum; i++ )
  1407. {
  1408. iPlayer = iPlayers[ i ];
  1409.  
  1410. if( g_iGang[ iPlayer ] != g_iGang[ id ] || iPlayer == iChosen )
  1411. continue;
  1412.  
  1413. ColorChat( iPlayer, NORMAL, "%s ^03%s ^01has been demoted from being an admin of your gang.", g_szPrefix, szName );
  1414. }
  1415.  
  1416. ColorChat( iChosen, NORMAL, "%s ^01You have been demoted from being an admin of your gang.", g_szPrefix );
  1417.  
  1418. menu_destroy( hMenu );
  1419. return PLUGIN_HANDLED;
  1420. }
  1421.  
  1422. public ShowMembersMenu( id )
  1423. {
  1424. new szName[ 64 ], iPlayers[ 32 ], iNum;
  1425. get_players( iPlayers, iNum );
  1426.  
  1427. new hMenu = menu_create( "Online Members:", "MemberMenu_Handler" );
  1428.  
  1429. for( new i = 0, iPlayer; i < iNum; i++ )
  1430. {
  1431. iPlayer = iPlayers[ i ];
  1432.  
  1433. if( g_iGang[ id ] != g_iGang[ iPlayer ] )
  1434. continue;
  1435.  
  1436. get_user_name( iPlayer, szName, charsmax( szName ) );
  1437.  
  1438. switch( getStatus( iPlayer, g_iGang[ id ] ) )
  1439. {
  1440. case STATUS_MEMBER:
  1441. {
  1442. add( szName, charsmax( szName ), " \r[Member]" );
  1443. }
  1444.  
  1445. case STATUS_ADMIN:
  1446. {
  1447. add( szName, charsmax( szName ), " \r[Admin]" );
  1448. }
  1449.  
  1450. case STATUS_LEADER:
  1451. {
  1452. add( szName, charsmax( szName ), " \r[Leader]" );
  1453. }
  1454. }
  1455.  
  1456. menu_additem( hMenu, szName );
  1457. }
  1458.  
  1459. menu_display( id, hMenu, 0 );
  1460. }
  1461.  
  1462. public MemberMenu_Handler( id, hMenu, iItem )
  1463. {
  1464. if( iItem == MENU_EXIT )
  1465. {
  1466. menu_destroy( hMenu );
  1467. Cmd_Gang( id );
  1468. return PLUGIN_HANDLED;
  1469. }
  1470.  
  1471. menu_destroy( hMenu );
  1472.  
  1473. ShowMembersMenu( id )
  1474. return PLUGIN_HANDLED;
  1475. }
  1476.  
  1477. // Credits to Tirant from zombie mod and xOR from xRedirect
  1478. public LoadGangs()
  1479. {
  1480. new szConfigsDir[ 60 ];
  1481. get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );
  1482. add( szConfigsDir, charsmax( szConfigsDir ), "/jb_gangs.ini" );
  1483.  
  1484. new iFile = fopen( szConfigsDir, "rt" );
  1485.  
  1486. new aData[ GangInfo ];
  1487.  
  1488. new szBuffer[ 512 ], szData[ 6 ], szValue[ 6 ], i, iCurGang;
  1489.  
  1490. while( !feof( iFile ) )
  1491. {
  1492. fgets( iFile, szBuffer, charsmax( szBuffer ) );
  1493.  
  1494. trim( szBuffer );
  1495. remove_quotes( szBuffer );
  1496.  
  1497. if( !szBuffer[ 0 ] || szBuffer[ 0 ] == ';' )
  1498. {
  1499. continue;
  1500. }
  1501.  
  1502. if( szBuffer[ 0 ] == '[' && szBuffer[ strlen( szBuffer ) - 1 ] == ']' )
  1503. {
  1504. copy( aData[ GangName ], strlen( szBuffer ) - 2, szBuffer[ 1 ] );
  1505. aData[ GangHP ] = 0;
  1506. aData[ GangStealing ] = 0;
  1507. aData[ GangGravity ] = 0;
  1508. aData[ GangStamina ] = 0;
  1509. aData[ GangWeaponDrop ] = 0;
  1510. aData[ GangDamage ] = 0;
  1511. aData[ GangKills ] = 0;
  1512. aData[ NumMembers ] = 0;
  1513. aData[ GangMembers ] = _:TrieCreate();
  1514.  
  1515. if( TrieKeyExists( g_tGangNames, aData[ GangName ] ) )
  1516. {
  1517. new szError[ 256 ];
  1518. formatex( szError, charsmax( szError ), "[JB Gangs] Gang already exists: %s", aData[ GangName ] );
  1519. set_fail_state( szError );
  1520. }
  1521.  
  1522. ArrayPushArray( g_aGangs, aData );
  1523.  
  1524. TrieSetCell( g_tGangNames, aData[ GangName ], iCurGang );
  1525.  
  1526. log_amx( "Gang Created: %s", aData[ GangName ] );
  1527.  
  1528. iCurGang++;
  1529.  
  1530. continue;
  1531. }
  1532.  
  1533. strtok( szBuffer, szData, 31, szValue, 511, '=' );
  1534. trim( szData );
  1535. trim( szValue );
  1536.  
  1537. if( TrieGetCell( g_tGangValues, szData, i ) )
  1538. {
  1539. ArrayGetArray( g_aGangs, iCurGang - 1, aData );
  1540.  
  1541. switch( i )
  1542. {
  1543. case VALUE_HP:
  1544. aData[ GangHP ] = str_to_num( szValue );
  1545.  
  1546. case VALUE_STEALING:
  1547. aData[ GangStealing ] = str_to_num( szValue );
  1548.  
  1549. case VALUE_GRAVITY:
  1550. aData[ GangGravity ] = str_to_num( szValue );
  1551.  
  1552. case VALUE_STAMINA:
  1553. aData[ GangStamina ] = str_to_num( szValue );
  1554.  
  1555. case VALUE_WEAPONDROP:
  1556. aData[ GangWeaponDrop ] = str_to_num( szValue );
  1557.  
  1558. case VALUE_DAMAGE:
  1559. aData[ GangDamage ] = str_to_num( szValue );
  1560.  
  1561. case VALUE_KILLS:
  1562. aData[ GangKills ] = str_to_num( szValue );
  1563. }
  1564.  
  1565. ArraySetArray( g_aGangs, iCurGang - 1, aData );
  1566. }
  1567. }
  1568.  
  1569. new Array:aSQL;
  1570. sqlv_read_all_ex( g_hVault, aSQL );
  1571.  
  1572. new aVaultData[ SQLVaultEntryEx ];
  1573.  
  1574. new iGang;
  1575.  
  1576. for( i = 0; i < ArraySize( aSQL ); i++ )
  1577. {
  1578. ArrayGetArray( aSQL, i, aVaultData );
  1579.  
  1580. if( TrieGetCell( g_tGangNames, aVaultData[ SQLVEx_Key2 ], iGang ) )
  1581. {
  1582. ArrayGetArray( g_aGangs, iGang, aData );
  1583.  
  1584. TrieSetCell( aData[ GangMembers ], aVaultData[ SQLVEx_Key1 ], str_to_num( aVaultData[ SQLVEx_Data ] ) );
  1585.  
  1586. aData[ NumMembers ]++;
  1587.  
  1588. ArraySetArray( g_aGangs, iGang, aData );
  1589. }
  1590. }
  1591.  
  1592. fclose( iFile );
  1593. }
  1594.  
  1595. public SaveGangs()
  1596. {
  1597. new szConfigsDir[ 64 ];
  1598. get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );
  1599.  
  1600. add( szConfigsDir, charsmax( szConfigsDir ), "/jb_gangs.ini" );
  1601.  
  1602. if( file_exists( szConfigsDir ) )
  1603. delete_file( szConfigsDir );
  1604.  
  1605. new iFile = fopen( szConfigsDir, "wt" );
  1606.  
  1607. new aData[ GangInfo ];
  1608.  
  1609. new szBuffer[ 256 ];
  1610.  
  1611. for( new i = 0; i < ArraySize( g_aGangs ); i++ )
  1612. {
  1613. ArrayGetArray( g_aGangs, i, aData );
  1614.  
  1615. formatex( szBuffer, charsmax( szBuffer ), "[%s]^n", aData[ GangName ] );
  1616. fputs( iFile, szBuffer );
  1617.  
  1618. formatex( szBuffer, charsmax( szBuffer ), "HP=%i^n", aData[ GangHP ] );
  1619. fputs( iFile, szBuffer );
  1620.  
  1621. formatex( szBuffer, charsmax( szBuffer ), "Stealing=%i^n", aData[ GangStealing ] );
  1622. fputs( iFile, szBuffer );
  1623.  
  1624. formatex( szBuffer, charsmax( szBuffer ), "Gravity=%i^n", aData[ GangGravity ] );
  1625. fputs( iFile, szBuffer );
  1626.  
  1627. formatex( szBuffer, charsmax( szBuffer ), "Stamina=%i^n", aData[ GangStamina ] );
  1628. fputs( iFile, szBuffer );
  1629.  
  1630. formatex( szBuffer, charsmax( szBuffer ), "WeaponDrop=%i^n", aData[ GangWeaponDrop ] );
  1631. fputs( iFile, szBuffer );
  1632.  
  1633. formatex( szBuffer, charsmax( szBuffer ), "Damage=%i^n", aData[ GangDamage ] );
  1634. fputs( iFile, szBuffer );
  1635.  
  1636. formatex( szBuffer, charsmax( szBuffer ), "Kills=%i^n^n", aData[ GangKills ] );
  1637. fputs( iFile, szBuffer );
  1638. }
  1639.  
  1640. fclose( iFile );
  1641. }
  1642.  
  1643.  
  1644.  
  1645. set_user_gang( id, iGang, iStatus=STATUS_MEMBER )
  1646. {
  1647. new szAuthID[ 35 ];
  1648. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  1649.  
  1650. new aData[ GangInfo ];
  1651.  
  1652. if( g_iGang[ id ] > -1 )
  1653. {
  1654. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  1655. TrieDeleteKey( aData[ GangMembers ], szAuthID );
  1656. aData[ NumMembers ]--;
  1657. ArraySetArray( g_aGangs, g_iGang[ id ], aData );
  1658.  
  1659. sqlv_remove_ex( g_hVault, szAuthID, aData[ GangName ] );
  1660. }
  1661.  
  1662. if( iGang > -1 )
  1663. {
  1664. ArrayGetArray( g_aGangs, iGang, aData );
  1665. TrieSetCell( aData[ GangMembers ], szAuthID, iStatus );
  1666. aData[ NumMembers ]++;
  1667. ArraySetArray( g_aGangs, iGang, aData );
  1668.  
  1669. sqlv_set_num_ex( g_hVault, szAuthID, aData[ GangName ], iStatus );
  1670. }
  1671.  
  1672. g_iGang[ id ] = iGang;
  1673.  
  1674. return 1;
  1675. }
  1676.  
  1677. get_user_gang( id )
  1678. {
  1679. new szAuthID[ 35 ];
  1680. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  1681.  
  1682. new aData[ GangInfo ];
  1683.  
  1684. for( new i = 0; i < ArraySize( g_aGangs ); i++ )
  1685. {
  1686. ArrayGetArray( g_aGangs, i, aData );
  1687.  
  1688. if( TrieKeyExists( aData[ GangMembers ], szAuthID ) )
  1689. return i;
  1690. }
  1691.  
  1692. return -1;
  1693. }
  1694.  
  1695. getStatus( id, iGang )
  1696. {
  1697. if( !is_user_connected( id ) || iGang == -1 )
  1698. return STATUS_NONE;
  1699.  
  1700. new aData[ GangInfo ];
  1701. ArrayGetArray( g_aGangs, iGang, aData );
  1702.  
  1703. new szAuthID[ 35 ];
  1704. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  1705.  
  1706. new iStatus;
  1707. TrieGetCell( aData[ GangMembers ], szAuthID, iStatus );
  1708.  
  1709. return iStatus;
  1710. }

Szerző:  theglorious [2014.07.30. 12:06 ]
Hozzászólás témája:  Re: JB Gang rendszer!

NuD[!]e írta:
Segitenétek ezt javitani?:(
SMA Forráskód: [ Mindet kijelol ]
  1.  
  2. /*
  3. Jailbreak Gang System
  4. H3avY Ra1n
  5.  
  6. Description
  7. -----------
  8. This plugin allows prisoners to create gangs and upgrade specific skills that apply to everybody in the gang.
  9.  
  10.  
  11. Gang Menu
  12. ---------
  13. Banda keszitese - Allows a user to create a gang by paying money.
  14. Invite to Gang - Only the leader of the gang can invite people to the gang.
  15. Skills - Opens the skills menu, where any member of the gang can pay money to upgrade their skills.
  16. Top-10 - Shows a MOTD with the top10 gangs, SORTED BY KILLS. (If you have a good way to sort it, please post it below)
  17. Leave Gang - Allows a player to leave the gang. The leader cannot leave the gang until he transfers leadership to somebody else (explained later).
  18. Gang Menu - Shows a menu with options to disband the gang, kick a player from the gang, or transfer leadership to somebody else in the gang.
  19. Online Jatekosok - Shows a list of gang members that are currently in the server.
  20.  
  21.  
  22. Skills
  23. ------
  24. HP - Increased health
  25. Stealing - Increased money earnings.
  26. Gravity - Lower Gravity
  27. Damage - Increased damage
  28. Stamina - Gives higher speed to players.
  29. Weapon Drop - Chance of making the guard drop the weapon when you knife them. (%1 chance increase per level)
  30.  
  31.  
  32. CVARS
  33. -----
  34. jb_gang_cost - The cost to create a gang.
  35. jb_health_cost - The cost to upgrade gang health.
  36. jb_stealing_cost - The cost to upgrade gang money earning.
  37. jb_gravity_cost - The cost to upgrade gang gravity.
  38. jb_damage_cost - The cost to upgrade gang damage.
  39. jb_stamina_cost - The cost to upgrade gang stamina (speed).
  40. jb_weapondrop_cost - The cost to upgrade gang weapon drop percentage.
  41.  
  42. Additionally there are CVars for the max level for each type of upgrade, so replace _cost above with _max.
  43. Also there are CVars for the amount per level, so replace _cost above with _per.
  44.  
  45. jb_points_per_kill - The amount of points you get for a kill
  46. jb_headshot_bonus - The amount of points you get for a headshot
  47.  
  48. jb_max_members - The max amount of members a gang can hold
  49. jb_admin_create - Whether or not an admin can create gangs without using points
  50.  
  51. Credits
  52. -------
  53. F0RCE - Original Plugin Idea
  54. Exolent - SQLVault Include
  55. Drekes - Freezetime Fix (I was too lazy) <!-- s:) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":)\" title=\"mosoly\" /><!-- s:) -->
  56.  
  57.  
  58. Changelog
  59. ---------
  60. September 26, 2011 - v1.0 - Initial Release
  61. September 27, 2011 - v1.01 - Added more cvars, fixed a few bugs.
  62. September 28, 2011 - v1.1 - Added gang admins, jb points instead of money, and a few other things I can't remember <!-- s:) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":)\" title=\"mosoly\" /><!-- s:) -->
  63. January 21, 2011 - v1.1.1 - Added a cvar for whether an admin can create a gang without using points.
  64. January 23, 2011 - v1.1.2 - Fixed freezetime problem
  65.  
  66.  
  67. */
  68.  
  69. /* Includes */
  70.  
  71. #include < amxmodx >
  72. #include < amxmisc >
  73. #include < sqlvault_ex >
  74. #include < cstrike >
  75. #include < colorchat >
  76. #include < hamsandwich >
  77. #include < fun >
  78.  
  79. /* Defines */
  80.  
  81. #define ADMIN_CREATE ADMIN_LEVEL_B
  82.  
  83. /* Constants */
  84.  
  85. new const g_szVersion[ ] = "1.1.2";
  86.  
  87. enum _:GangInfo
  88. {
  89. Trie:GangMembers,
  90. GangName[ 64 ],
  91. GangHP,
  92. GangStealing,
  93. GangGravity,
  94. GangDamage,
  95. GangStamina,
  96. GangWeaponDrop,
  97. GangKills,
  98. NumMembers
  99. };
  100.  
  101. enum
  102. {
  103. VALUE_HP,
  104. VALUE_STEALING,
  105. VALUE_GRAVITY,
  106. VALUE_DAMAGE,
  107. VALUE_STAMINA,
  108. VALUE_WEAPONDROP,
  109. VALUE_KILLS
  110. }
  111.  
  112. enum
  113. {
  114. STATUS_NONE,
  115. STATUS_MEMBER,
  116. STATUS_ADMIN,
  117. STATUS_LEADER
  118. };
  119.  
  120. new const g_szGangValues[ ][ ] =
  121. {
  122. "HP",
  123. "Stealing",
  124. "Gravity",
  125. "Damage",
  126. "Stamina",
  127. "WeaponDrop",
  128. "Kills"
  129. };
  130.  
  131. new const g_szPrefix[ ] = "^04[Gang System]^01";
  132.  
  133. /* Tries */
  134.  
  135. new Trie:g_tGangNames;
  136. new Trie:g_tGangValues;
  137.  
  138. /* Vault */
  139.  
  140. new SQLVault:g_hVault;
  141. new SQLVault:g_hPointsVault;
  142.  
  143. /* Arrays */
  144.  
  145. new Array:g_aGangs;
  146.  
  147. /* Pcvars */
  148.  
  149. new g_pCreateCost;
  150.  
  151. new g_pHealthCost;
  152. new g_pStealingCost;
  153. new g_pGravityCost;
  154. new g_pDamageCost;
  155. new g_pStaminaCost;
  156. new g_pWeaponDropCost;
  157.  
  158. new g_pHealthMax;
  159. new g_pStealingMax;
  160. new g_pGravityMax;
  161. new g_pDamageMax;
  162. new g_pStaminaMax;
  163. new g_pWeaponDropMax;
  164.  
  165. new g_pHealthPerLevel;
  166. new g_pStealingPerLevel;
  167. new g_pGravityPerLevel;
  168. new g_pDamagePerLevel;
  169. new g_pStaminaPerLevel;
  170. new g_pWeaponDropPerLevel;
  171.  
  172. new g_pPointsPerKill;
  173. new g_pHeadshotBonus;
  174.  
  175. new g_pMaxMembers;
  176. new g_pAdminCreate;
  177.  
  178. /* Integers */
  179.  
  180. new g_iGang[ 33 ];
  181. new g_iPoints[ 33 ];
  182.  
  183.  
  184. public plugin_init()
  185. {
  186. register_plugin( "Jailbreak Gang System", g_szVersion, "H3avY Ra1n" );
  187.  
  188. g_aGangs = ArrayCreate( GangInfo );
  189.  
  190. g_tGangValues = TrieCreate();
  191. g_tGangNames = TrieCreate();
  192.  
  193. g_hVault = sqlv_open_local( "jb_gangs", false );
  194. sqlv_init_ex( g_hVault );
  195.  
  196. g_hPointsVault = sqlv_open_local( "jb_points", true );
  197.  
  198. g_pCreateCost = register_cvar( "jb_gang_cost", "50" );
  199. g_pHealthCost = register_cvar( "jb_health_cost", "20" );
  200. g_pStealingCost = register_cvar( "jb_stealing_cost", "20" );
  201. g_pGravityCost = register_cvar( "jb_gravity_cost", "20" );
  202. g_pDamageCost = register_cvar( "jb_damage_cost", "20" );
  203. g_pStaminaCost = register_cvar( "jb_stamina_cost", "20" );
  204. g_pWeaponDropCost = register_cvar( "jb_weapondrop_cost", "20" );
  205.  
  206. g_pHealthMax = register_cvar( "jb_health_max", "10" );
  207. g_pStealingMax = register_cvar( "jb_stealing_max", "10" );
  208. g_pGravityMax = register_cvar( "jb_gravity_max", "10" ); // Max * Gravity Per Level must be LESS than 800
  209. g_pDamageMax = register_cvar( "jb_damage_max", "10" );
  210. g_pStaminaMax = register_cvar( "jb_stamina_max", "10" );
  211. g_pWeaponDropMax = register_cvar( "jb_weapondrop_max", "10" );
  212.  
  213. g_pHealthPerLevel = register_cvar( "jb_health_per", "10" );
  214. g_pStealingPerLevel = register_cvar( "jb_stealing_per", "0.05" );
  215. g_pGravityPerLevel = register_cvar( "jb_gravity_per", "50" );
  216. g_pDamagePerLevel = register_cvar( "jb_damage_per", "3" );
  217. g_pStaminaPerLevel = register_cvar( "jb_stamina_per", "3" );
  218. g_pWeaponDropPerLevel = register_cvar( "jb_weapondrop_per", "1" );
  219.  
  220. g_pPointsPerKill = register_cvar( "jb_points_per_kill", "3" );
  221. g_pHeadshotBonus = register_cvar( "jb_headshot_bonus", "2" );
  222.  
  223. g_pMaxMembers = register_cvar( "jb_max_members", "10" );
  224. g_pAdminCreate = register_cvar( "jb_admin_create", "0" ); // Admins can create gangs without points
  225.  
  226. register_cvar( "jb_gang_version", g_szVersion, FCVAR_SPONLY | FCVAR_SERVER );
  227.  
  228. register_menu( "Gang Menu", 1023, "GangMenu_Handler" );
  229. register_menu( "Skills Menu", 1023, "SkillsMenu_Handler" );
  230.  
  231. for( new i = 0; i < sizeof g_szGangValues; i++ )
  232. {
  233. TrieSetCell( g_tGangValues, g_szGangValues[ i ], i );
  234. }
  235.  
  236. RegisterHam( Ham_Spawn, "player", "Ham_PlayerSpawn_Post", 1 );
  237. RegisterHam( Ham_TakeDamage, "player", "Ham_TakeDamage_Pre", 0 );
  238. RegisterHam( Ham_TakeDamage, "player", "Ham_TakeDamage_Post", 1 );
  239. RegisterHam( Ham_Item_PreFrame, "player", "Ham_PlayerResetSpeedPost", 1);
  240.  
  241. register_event( "DeathMsg", "Event_DeathMsg", "a" );
  242.  
  243. register_clcmd( "say /gang", "Cmd_Gang" );
  244. register_clcmd( "gang_name", "Cmd_CreateGang" );
  245.  
  246. LoadGangs();
  247. }
  248.  
  249. public client_disconnect( id )
  250. {
  251. g_iGang[ id ] = -1;
  252.  
  253. new szAuthID[ 35 ];
  254. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  255.  
  256. sqlv_set_num( g_hPointsVault, szAuthID, g_iPoints[ id ] );
  257. }
  258.  
  259. public client_putinserver( id )
  260. {
  261. g_iGang[ id ] = get_user_gang( id );
  262. new szAuthID[ 35 ];
  263. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  264.  
  265. g_iPoints[ id ] = sqlv_get_num( g_hPointsVault, szAuthID );
  266. }
  267.  
  268. public plugin_end()
  269. {
  270. SaveGangs();
  271. sqlv_close( g_hVault );
  272. }
  273.  
  274. public Ham_PlayerSpawn_Post( id )
  275. {
  276. if( !is_user_alive( id ) || cs_get_user_team( id ) != CS_TEAM_T )
  277. return HAM_IGNORED;
  278.  
  279. if( g_iGang[ id ] == -1 )
  280. {
  281. return HAM_IGNORED;
  282. }
  283.  
  284. new aData[ GangInfo ];
  285. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  286.  
  287. new iHealth = 100 + aData[ GangHP ] * get_pcvar_num( g_pHealthPerLevel );
  288. set_user_health( id, iHealth );
  289.  
  290. new iGravity = 800 - ( get_pcvar_num( g_pGravityPerLevel ) * aData[ GangGravity ] );
  291. set_user_gravity( id, float( iGravity ) / 800.0 );
  292.  
  293. return HAM_IGNORED;
  294. }
  295.  
  296. public Ham_TakeDamage_Pre( iVictim, iInflictor, iAttacker, Float:flDamage, iBits )
  297. {
  298. if( !is_user_alive( iAttacker ) || cs_get_user_team( iAttacker ) != CS_TEAM_T )
  299. return HAM_IGNORED;
  300.  
  301. if( g_iGang[ iAttacker ] == -1 )
  302. return HAM_IGNORED;
  303.  
  304. new aData[ GangInfo ];
  305. ArrayGetArray( g_aGangs, g_iGang[ iAttacker ], aData );
  306.  
  307. SetHamParamFloat( 4, flDamage + ( get_pcvar_num( g_pDamagePerLevel ) * ( aData[ GangDamage ] ) ) );
  308.  
  309. return HAM_IGNORED;
  310. }
  311.  
  312. public Ham_TakeDamage_Post( iVictim, iInflictor, iAttacker, Float:flDamage, iBits )
  313. {
  314. if( !is_user_alive( iAttacker ) || g_iGang[ iAttacker ] == -1 || get_user_weapon( iAttacker ) != CSW_KNIFE || cs_get_user_team( iAttacker ) != CS_TEAM_T )
  315. {
  316. return HAM_IGNORED;
  317. }
  318.  
  319. new aData[ GangInfo ];
  320. ArrayGetArray( g_aGangs, g_iGang[ iAttacker ], aData );
  321.  
  322. new iChance = aData[ GangWeaponDrop ] * get_pcvar_num( g_pWeaponDropPerLevel );
  323.  
  324. if( iChance == 0 )
  325. return HAM_IGNORED;
  326.  
  327. new bool:bDrop = ( random_num( 1, 100 ) <= iChance );
  328.  
  329. if( bDrop )
  330. client_cmd( iVictim, "drop" );
  331.  
  332. return HAM_IGNORED;
  333. }
  334.  
  335. public Ham_PlayerResetSpeedPost( id )
  336. {
  337. if( g_iGang[ id ] == -1 || !is_user_alive( id ) || cs_get_user_team( id ) != CS_TEAM_T )
  338. {
  339. return HAM_IGNORED;
  340. }
  341.  
  342. new aData[ GangInfo ];
  343. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  344.  
  345. if( aData[ GangStamina ] > 0 && get_user_maxspeed( id ) > 1.0 )
  346. set_user_maxspeed( id, 250.0 + ( aData[ GangStamina ] * get_pcvar_num( g_pStaminaPerLevel ) ) );
  347.  
  348. return HAM_IGNORED;
  349. }
  350.  
  351. public Event_DeathMsg()
  352. {
  353. new iKiller = read_data( 1 );
  354. new iVictim = read_data( 2 );
  355.  
  356. if( !is_user_alive( iKiller ) || cs_get_user_team( iVictim ) != CS_TEAM_CT || cs_get_user_team( iKiller ) != CS_TEAM_T )
  357. return PLUGIN_CONTINUE;
  358.  
  359. new iTotal = get_pcvar_num( g_pPointsPerKill ) + ( bool:read_data( 3 ) ? get_pcvar_num( g_pHeadshotBonus ) : 0 );
  360.  
  361. if( g_iGang[ iKiller ] > -1 )
  362. {
  363. new aData[ GangInfo ];
  364. ArrayGetArray( g_aGangs, g_iGang[ iKiller ], aData );
  365. aData[ GangKills ]++;
  366. ArraySetArray( g_aGangs, g_iGang[ iKiller ], aData );
  367.  
  368. iTotal += iTotal * ( aData[ GangStealing ] * get_pcvar_num( g_pStealingPerLevel ) );
  369. }
  370.  
  371. g_iPoints[ iKiller ] += iTotal;
  372.  
  373. return PLUGIN_CONTINUE;
  374. }
  375.  
  376. public Cmd_Gang( id )
  377. {
  378. if( !is_user_connected( id ) || cs_get_user_team( id ) != CS_TEAM_T )
  379. {
  380. ColorChat( id, NORMAL, "%s Only ^03prisoners ^01can access this menu.", g_szPrefix );
  381. return PLUGIN_HANDLED;
  382. }
  383.  
  384. static szMenu[ 512 ], iLen, aData[ GangInfo ], iKeys, iStatus;
  385.  
  386. iKeys = MENU_KEY_0 | MENU_KEY_4;
  387.  
  388. iStatus = getStatus( id, g_iGang[ id ] );
  389.  
  390. if( g_iGang[ id ] > -1 )
  391. {
  392. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  393. iLen = formatex( szMenu, charsmax( szMenu ), "\yGang Menu^n\wCurrent Gang:\y %s^n", aData[ GangName ] );
  394. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\yJB Points: \w%i^n^n", g_iPoints[ id ] );
  395. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r1. \dCreate a Gang [%i Points]^n", get_pcvar_num( g_pCreateCost ) );
  396. }
  397.  
  398. else
  399. {
  400. iLen = formatex( szMenu, charsmax( szMenu ), "\yGang Menu^n\wCurrent Gang:\r None^n" );
  401. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\yJB Points: \w%i^n^n", g_iPoints[ id ] );
  402. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r1. \wCreate a Gang [%i Points]^n", get_pcvar_num( g_pCreateCost ) );
  403.  
  404. iKeys |= MENU_KEY_1;
  405. }
  406.  
  407.  
  408. if( iStatus > STATUS_MEMBER && g_iGang[ id ] > -1 && get_pcvar_num( g_pMaxMembers ) > aData[ NumMembers ] )
  409. {
  410. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r2. \wInvite Player to Gang^n" );
  411. iKeys |= MENU_KEY_2;
  412. }
  413. else
  414. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r2. \dInvite Player to Gang^n" );
  415.  
  416. if( g_iGang[ id ] > -1 )
  417. {
  418. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r3. \wSkills^n" );
  419. iKeys |= MENU_KEY_3;
  420. }
  421.  
  422. else
  423. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r3. \dSkills^n" );
  424.  
  425. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r4. \wTop-10^n" );
  426.  
  427. if( g_iGang[ id ] > -1 )
  428. {
  429. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r5. \wLeave Gang^n" );
  430. iKeys |= MENU_KEY_5;
  431. }
  432.  
  433. else
  434. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r5. \dLeave Gang^n" );
  435.  
  436.  
  437. if( iStatus > STATUS_MEMBER )
  438. {
  439. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r6. \wGang Admin Menu^n" );
  440. iKeys |= MENU_KEY_6;
  441. }
  442.  
  443. else
  444. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r6. \dGang Admin Menu^n" );
  445.  
  446. if( g_iGang[ id ] > -1 )
  447. {
  448. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r7. \wOnline Members^n" );
  449. iKeys |= MENU_KEY_7;
  450. }
  451.  
  452. else
  453. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r7. \dOnline Members^n" );
  454.  
  455. iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "^n\r0. \wExit" );
  456.  
  457. show_menu( id, iKeys, szMenu, -1, "Gang Menu" );
  458.  
  459. return PLUGIN_CONTINUE;
  460. }
  461.  
  462. public GangMenu_Handler( id, iKey )
  463. {
  464. switch( ( iKey + 1 ) % 10 )
  465. {
  466. case 0: return PLUGIN_HANDLED;
  467.  
  468. case 1:
  469. {
  470. if( get_pcvar_num( g_pAdminCreate ) && get_user_flags( id ) & ADMIN_CREATE )
  471. {
  472. client_cmd( id, "messagemode gang_name" );
  473. }
  474.  
  475. else if( g_iPoints[ id ] < get_pcvar_num( g_pCreateCost ) )
  476. {
  477. ColorChat( id, NORMAL, "%s You do not have enough points to create a gang!", g_szPrefix );
  478. return PLUGIN_HANDLED;
  479. }
  480.  
  481. else
  482. client_cmd( id, "messagemode gang_name" );
  483. }
  484.  
  485. case 2:
  486. {
  487. ShowInviteMenu( id );
  488. }
  489.  
  490. case 3:
  491. {
  492. ShowSkillsMenu( id );
  493. }
  494.  
  495. case 4:
  496. {
  497. Cmd_Top10( id );
  498. }
  499.  
  500. case 5:
  501. {
  502. ShowLeaveConfirmMenu( id );
  503. }
  504.  
  505. case 6:
  506. {
  507. ShowLeaderMenu( id );
  508. }
  509.  
  510. case 7:
  511. {
  512. ShowMembersMenu( id );
  513. }
  514. }
  515.  
  516. return PLUGIN_HANDLED;
  517. }
  518.  
  519. public Cmd_CreateGang( id )
  520. {
  521. new bool:bAdmin = false;
  522.  
  523. if( get_pcvar_num( g_pAdminCreate ) && get_user_flags( id ) & ADMIN_CREATE )
  524. {
  525. bAdmin = true;
  526. }
  527.  
  528. else if( g_iPoints[ id ] < get_pcvar_num( g_pCreateCost ) )
  529. {
  530. ColorChat( id, NORMAL, "%s You do not have enough points to create a gang.", g_szPrefix );
  531. return PLUGIN_HANDLED;
  532. }
  533.  
  534. else if( g_iGang[ id ] > -1 )
  535. {
  536. ColorChat( id, NORMAL, "%s You cannot create a gang if you are already in one!", g_szPrefix );
  537. return PLUGIN_HANDLED;
  538. }
  539.  
  540. else if( cs_get_user_team( id ) != CS_TEAM_T )
  541. {
  542. ColorChat( id, NORMAL, "%s Only ^03prisoners ^01can create gangs!", g_szPrefix );
  543. return PLUGIN_HANDLED;
  544. }
  545.  
  546. new szArgs[ 60 ];
  547. read_args( szArgs, charsmax( szArgs ) );
  548.  
  549. remove_quotes( szArgs );
  550.  
  551. if( TrieKeyExists( g_tGangNames, szArgs ) )
  552. {
  553. ColorChat( id, NORMAL, "%s That gang with that name already exists.", g_szPrefix );
  554. Cmd_Gang( id );
  555. return PLUGIN_HANDLED;
  556. }
  557.  
  558. new aData[ GangInfo ];
  559.  
  560. aData[ GangName ] = szArgs;
  561. aData[ GangHP ] = 0;
  562. aData[ GangStealing ] = 0;
  563. aData[ GangGravity ] = 0;
  564. aData[ GangStamina ] = 0;
  565. aData[ GangWeaponDrop ] = 0;
  566. aData[ GangDamage ] = 0;
  567. aData[ NumMembers ] = 0;
  568. aData[ GangMembers ] = _:TrieCreate();
  569.  
  570. ArrayPushArray( g_aGangs, aData );
  571.  
  572. if( !bAdmin )
  573. g_iPoints[ id ] -= get_pcvar_num( g_pCreateCost );
  574.  
  575. set_user_gang( id, ArraySize( g_aGangs ) - 1, STATUS_LEADER );
  576.  
  577. ColorChat( id, NORMAL, "%s You have successfully created gang '^03%s^01'.", g_szPrefix, szArgs );
  578.  
  579. return PLUGIN_HANDLED;
  580. }
  581.  
  582. public ShowInviteMenu( id )
  583. {
  584. new iPlayers[ 32 ], iNum;
  585. get_players( iPlayers, iNum );
  586.  
  587. new szInfo[ 6 ], hMenu;
  588. hMenu = menu_create( "Choose a Player to Invite:", "InviteMenu_Handler" );
  589. new szName[ 32 ];
  590.  
  591. for( new i = 0, iPlayer; i < iNum; i++ )
  592. {
  593. iPlayer = iPlayers[ i ];
  594.  
  595.  
  596. if( iPlayer == id || g_iGang[ iPlayer ] == g_iGang[ id ] || cs_get_user_team( iPlayer ) != CS_TEAM_T )
  597. continue;
  598.  
  599. get_user_name( iPlayer, szName, charsmax( szName ) );
  600.  
  601. num_to_str( iPlayer, szInfo, charsmax( szInfo ) );
  602.  
  603. menu_additem( hMenu, szName, szInfo );
  604. }
  605.  
  606. menu_display( id, hMenu, 0 );
  607. }
  608.  
  609. public InviteMenu_Handler( id, hMenu, iItem )
  610. {
  611. if( iItem == MENU_EXIT )
  612. {
  613. Cmd_Gang( id );
  614. return PLUGIN_HANDLED;
  615. }
  616.  
  617. new szData[ 6 ], iAccess, hCallback, szName[ 32 ];
  618. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, 31, hCallback );
  619.  
  620. new iPlayer = str_to_num( szData );
  621.  
  622. if( !is_user_connected( iPlayer ) )
  623. return PLUGIN_HANDLED;
  624.  
  625. ShowInviteConfirmMenu( id, iPlayer );
  626.  
  627. ColorChat( id, NORMAL, "%s You have successfully invited %s to join your gang.", g_szPrefix, szName );
  628.  
  629. Cmd_Gang( id );
  630. return PLUGIN_HANDLED;
  631. }
  632.  
  633. public ShowInviteConfirmMenu( id, iPlayer )
  634. {
  635. new szName[ 32 ];
  636. get_user_name( id, szName, charsmax( szName ) );
  637.  
  638. new aData[ GangInfo ];
  639. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  640.  
  641. new szMenuTitle[ 128 ];
  642. formatex( szMenuTitle, charsmax( szMenuTitle ), "%s Invited You to Join %s", szName, aData[ GangName ] );
  643. new hMenu = menu_create( szMenuTitle, "InviteConfirmMenu_Handler" );
  644.  
  645. new szInfo[ 6 ];
  646. num_to_str( g_iGang[ id ], szInfo, 5 );
  647.  
  648. menu_additem( hMenu, "Accept Invitation", szInfo );
  649. menu_additem( hMenu, "Decline Invitation", "-1" );
  650.  
  651. menu_display( iPlayer, hMenu, 0 );
  652. }
  653.  
  654. public InviteConfirmMenu_Handler( id, hMenu, iItem )
  655. {
  656. if( iItem == MENU_EXIT )
  657. return PLUGIN_HANDLED;
  658.  
  659. new szData[ 6 ], iAccess, hCallback;
  660. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  661.  
  662. new iGang = str_to_num( szData );
  663.  
  664. if( iGang == -1 )
  665. return PLUGIN_HANDLED;
  666.  
  667. if( getStatus( id, g_iGang[ id ] ) == STATUS_LEADER )
  668. {
  669. ColorChat( id, NORMAL, "%s You cannot leave your gang while you are the leader.", g_szPrefix );
  670. return PLUGIN_HANDLED;
  671. }
  672.  
  673. set_user_gang( id, iGang );
  674.  
  675. new aData[ GangInfo ];
  676. ArrayGetArray( g_aGangs, iGang, aData );
  677.  
  678. ColorChat( id, NORMAL, "%s You have successfully joined the gang ^03%s^01.", g_szPrefix, aData[ GangName ] );
  679.  
  680. return PLUGIN_HANDLED;
  681. }
  682.  
  683.  
  684. public ShowSkillsMenu( id )
  685. {
  686. static szMenu[ 512 ], iLen, iKeys, aData[ GangInfo ];
  687.  
  688. if( !iKeys )
  689. {
  690. iKeys = MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0;
  691. }
  692.  
  693. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  694.  
  695. iLen = formatex( szMenu, charsmax( szMenu ), "\ySkills Menu^n^n" );
  696. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r1. \wHealth Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pHealthCost ), aData[ GangHP ], get_pcvar_num( g_pHealthMax ) );
  697. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r2. \wStealing Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pStealingCost ), aData[ GangStealing ], get_pcvar_num( g_pStealingMax ) );
  698. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r3. \wGravity Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pGravityCost ), aData[ GangGravity ], get_pcvar_num( g_pGravityMax ) );
  699. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r4. \wDamage Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pDamageCost ), aData[ GangDamage ], get_pcvar_num( g_pDamageMax ) );
  700. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r5. \wWeapon Drop Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pWeaponDropCost ), aData[ GangWeaponDrop ], get_pcvar_num( g_pWeaponDropMax ) );
  701. iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r6. \wSpeed Upgrade [\rCost: \y%i Points\w] \y[Level:%i/%i]^n", get_pcvar_num( g_pStaminaCost ), aData[ GangStamina ], get_pcvar_num( g_pStaminaMax ) );
  702.  
  703. iLen += formatex( szMenu[ iLen ], 511 - iLen, "^n\r0. \wExit" );
  704.  
  705. show_menu( id, iKeys, szMenu, -1, "Skills Menu" );
  706. }
  707.  
  708. public SkillsMenu_Handler( id, iKey )
  709. {
  710. new aData[ GangInfo ];
  711. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  712.  
  713. switch( ( iKey + 1 ) % 10 )
  714. {
  715. case 0:
  716. {
  717. Cmd_Gang( id );
  718. return PLUGIN_HANDLED;
  719. }
  720.  
  721. case 1:
  722. {
  723. if( aData[ GangHP ] == get_pcvar_num( g_pHealthMax ) )
  724. {
  725. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  726. ShowSkillsMenu( id );
  727. return PLUGIN_HANDLED;
  728. }
  729.  
  730. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pHealthCost );
  731.  
  732. if( iRemaining < 0 )
  733. {
  734. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  735. ShowSkillsMenu( id );
  736. return PLUGIN_HANDLED;
  737. }
  738.  
  739. aData[ GangHP ]++;
  740.  
  741. g_iPoints[ id ] = iRemaining;
  742. }
  743.  
  744. case 2:
  745. {
  746. if( aData[ GangStealing ] == get_pcvar_num( g_pStealingMax ) )
  747. {
  748. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  749. ShowSkillsMenu( id );
  750. return PLUGIN_HANDLED;
  751. }
  752.  
  753. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pStealingCost );
  754.  
  755. if( iRemaining < 0 )
  756. {
  757. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  758. ShowSkillsMenu( id );
  759. return PLUGIN_HANDLED;
  760. }
  761.  
  762. aData[ GangStealing ]++;
  763.  
  764. g_iPoints[ id ] = iRemaining;
  765. }
  766.  
  767. case 3:
  768. {
  769. if( aData[ GangGravity ] == get_pcvar_num( g_pGravityMax ) )
  770. {
  771. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  772. ShowSkillsMenu( id );
  773. return PLUGIN_HANDLED;
  774. }
  775.  
  776. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pGravityCost );
  777.  
  778. if( iRemaining < 0 )
  779. {
  780. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  781. ShowSkillsMenu( id );
  782. return PLUGIN_HANDLED;
  783. }
  784.  
  785. aData[ GangGravity ]++;
  786.  
  787. g_iPoints[ id ] = iRemaining;
  788. }
  789.  
  790. case 4:
  791. {
  792. if( aData[ GangDamage ] == get_pcvar_num( g_pDamageMax ) )
  793. {
  794. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  795. ShowSkillsMenu( id );
  796. return PLUGIN_HANDLED;
  797. }
  798.  
  799. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pDamageCost );
  800.  
  801. if( iRemaining < 0 )
  802. {
  803. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  804. ShowSkillsMenu( id );
  805. return PLUGIN_HANDLED;
  806. }
  807.  
  808. aData[ GangDamage ]++;
  809.  
  810. g_iPoints[ id ] = iRemaining;
  811. }
  812.  
  813. case 5:
  814. {
  815. if( aData[ GangWeaponDrop ] == get_pcvar_num( g_pWeaponDropMax ) )
  816. {
  817. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  818. ShowSkillsMenu( id );
  819. return PLUGIN_HANDLED;
  820. }
  821.  
  822. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pWeaponDropCost );
  823.  
  824. if( iRemaining < 0 )
  825. {
  826. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  827. ShowSkillsMenu( id );
  828. return PLUGIN_HANDLED;
  829. }
  830.  
  831. aData[ GangWeaponDrop ]++;
  832.  
  833. g_iPoints[ id ] = iRemaining;
  834. }
  835.  
  836. case 6:
  837. {
  838. if( aData[ GangStamina ] == get_pcvar_num( g_pStaminaMax ) )
  839. {
  840. ColorChat( id, NORMAL, "%s Your gang is already at the max level for that skill.", g_szPrefix );
  841. ShowSkillsMenu( id );
  842. return PLUGIN_HANDLED;
  843. }
  844.  
  845. new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pStaminaCost );
  846.  
  847. if( iRemaining < 0 )
  848. {
  849. ColorChat( id, NORMAL, "%s You don't have enough points for that.", g_szPrefix );
  850. ShowSkillsMenu( id );
  851. return PLUGIN_HANDLED;
  852. }
  853.  
  854. aData[ GangStamina ]++;
  855.  
  856. g_iPoints[ id ] = iRemaining;
  857. }
  858. }
  859.  
  860. ArraySetArray( g_aGangs, g_iGang[ id ], aData );
  861.  
  862. new iPlayers[ 32 ], iNum, iPlayer;
  863. new szName[ 32 ];
  864. get_players( iPlayers, iNum );
  865.  
  866. for( new i = 0; i < iNum; i++ )
  867. {
  868. iPlayer = iPlayers[ i ];
  869.  
  870. if( iPlayer == id || g_iGang[ iPlayer ] != g_iGang[ id ] )
  871. continue;
  872.  
  873. ColorChat( iPlayer, NORMAL, "%s ^03%s ^01has just upgraded one of your gang's skills.", g_szPrefix, szName );
  874. }
  875.  
  876. ColorChat( id, NORMAL, "%s You have successfully upgraded your gang.", g_szPrefix );
  877.  
  878. ShowSkillsMenu( id );
  879.  
  880. return PLUGIN_HANDLED;
  881. }
  882.  
  883.  
  884. public Cmd_Top10( id )
  885. {
  886. new iSize = ArraySize( g_aGangs );
  887.  
  888. new iOrder[ 100 ][ 2 ];
  889.  
  890. new aData[ GangInfo ];
  891.  
  892. for( new i = 0; i < iSize; i++ )
  893. {
  894. ArrayGetArray( g_aGangs, i, aData );
  895.  
  896. iOrder[ i ][ 0 ] = i;
  897. iOrder[ i ][ 1 ] = aData[ GangKills ];
  898. }
  899.  
  900. SortCustom2D( iOrder, iSize, "Top10_Sort" );
  901.  
  902. new szMessage[ 2048 ];
  903. formatex( szMessage, charsmax( szMessage ), "<body bgcolor=#000000><font color=#FFB000><pre>" );
  904. format( szMessage, charsmax( szMessage ), "%s%2s %-22.22s %7s %4s %10s %9s %9s %11s %8s^n", szMessage, "#", "Name", "Kills", "HP", "Stealing",
  905. "Gravity", "Stamina", "WeaponDrop", "Damage" );
  906.  
  907. for( new i = 0; i < min( 10, iSize ); i++ )
  908. {
  909. ArrayGetArray( g_aGangs, iOrder[ i ][ 0 ], aData );
  910.  
  911. format( szMessage, charsmax( szMessage ), "%s%-2d %22.22s %7d %4d %10d %9d %9d %11d %8d^n", szMessage, i + 1, aData[ GangName ],
  912. aData[ GangKills ], aData[ GangHP ], aData[ GangStealing ], aData[ GangGravity ], aData[ GangStamina], aData[ GangWeaponDrop ], aData[ GangDamage ] );
  913. }
  914.  
  915. show_motd( id, szMessage, "Gang Top 10" );
  916. }
  917.  
  918. public Top10_Sort( const iElement1[ ], const iElement2[ ], const iArray[ ], szData[], iSize )
  919. {
  920. if( iElement1[ 1 ] > iElement2[ 1 ] )
  921. return -1;
  922.  
  923. else if( iElement1[ 1 ] < iElement2[ 1 ] )
  924. return 1;
  925.  
  926. return 0;
  927. }
  928.  
  929. public ShowLeaveConfirmMenu( id )
  930. {
  931. new hMenu = menu_create( "Are you sure you want to leave?", "LeaveConfirmMenu_Handler" );
  932. menu_additem( hMenu, "Yes, Leave Now", "0" );
  933. menu_additem( hMenu, "No, Don't Leave", "1" );
  934.  
  935. menu_display( id, hMenu, 0 );
  936. }
  937.  
  938. public LeaveConfirmMenu_Handler( id, hMenu, iItem )
  939. {
  940. if( iItem == MENU_EXIT )
  941. return PLUGIN_HANDLED;
  942.  
  943. new szData[ 6 ], iAccess, hCallback;
  944. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  945.  
  946. switch( str_to_num( szData ) )
  947. {
  948. case 0:
  949. {
  950. if( getStatus( id, g_iGang[ id ] ) == STATUS_LEADER )
  951. {
  952. ColorChat( id, NORMAL, "%s You must transfer leadership before leaving this gang.", g_szPrefix );
  953. Cmd_Gang( id );
  954.  
  955. return PLUGIN_HANDLED;
  956. }
  957.  
  958. ColorChat( id, NORMAL, "%s You have successfully left your gang.", g_szPrefix );
  959. set_user_gang( id, -1 );
  960. Cmd_Gang( id );
  961. }
  962.  
  963. case 1: Cmd_Gang( id );
  964. }
  965.  
  966. return PLUGIN_HANDLED;
  967. }
  968.  
  969. public ShowLeaderMenu( id )
  970. {
  971. new hMenu = menu_create( "Gang Leader Menu", "LeaderMenu_Handler" );
  972.  
  973. new iStatus = getStatus( id, g_iGang[ id ] );
  974.  
  975. if( iStatus == STATUS_LEADER )
  976. {
  977. menu_additem( hMenu, "Disband Gang", "0" );
  978. menu_additem( hMenu, "Transfer Leadership", "1" );
  979. menu_additem( hMenu, "Add An Admin", "4" );
  980. menu_additem( hMenu, "Remove An Admin", "5" );
  981. }
  982.  
  983. menu_additem( hMenu, "Kick From Gang", "2" );
  984. menu_additem( hMenu, "Change Gang Name", "3" );
  985.  
  986.  
  987. menu_display( id, hMenu, 0 );
  988. }
  989.  
  990. public LeaderMenu_Handler( id, hMenu, iItem )
  991. {
  992. if( iItem == MENU_EXIT )
  993. {
  994. Cmd_Gang( id );
  995. return PLUGIN_HANDLED;
  996. }
  997.  
  998. new iAccess, hCallback, szData[ 6 ];
  999. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  1000.  
  1001. switch( str_to_num( szData ) )
  1002. {
  1003. case 0:
  1004. {
  1005. ShowDisbandConfirmMenu( id );
  1006. }
  1007.  
  1008. case 1:
  1009. {
  1010. ShowTransferMenu( id );
  1011. }
  1012.  
  1013. case 2:
  1014. {
  1015. ShowKickMenu( id );
  1016. }
  1017.  
  1018. case 3:
  1019. {
  1020. client_cmd( id, "messagemode New_Name" );
  1021. }
  1022.  
  1023. case 4:
  1024. {
  1025. ShowAddAdminMenu( id );
  1026. }
  1027.  
  1028. case 5:
  1029. {
  1030. ShowRemoveAdminMenu( id );
  1031. }
  1032. }
  1033.  
  1034. return PLUGIN_HANDLED;
  1035. }
  1036.  
  1037. public ShowDisbandConfirmMenu( id )
  1038. {
  1039. new hMenu = menu_create( "Are you sure you want to disband the gang?", "DisbandConfirmMenu_Handler" );
  1040. menu_additem( hMenu, "Yes, Disband Now", "0" );
  1041. menu_additem( hMenu, "No, Don't Disband", "1" );
  1042.  
  1043. menu_display( id, hMenu, 0 );
  1044. }
  1045.  
  1046. public DisbandConfirmMenu_Handler( id, hMenu, iItem )
  1047. {
  1048. if( iItem == MENU_EXIT )
  1049. return PLUGIN_HANDLED;
  1050.  
  1051. new szData[ 6 ], iAccess, hCallback;
  1052. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );
  1053.  
  1054. switch( str_to_num( szData ) )
  1055. {
  1056. case 0:
  1057. {
  1058.  
  1059. ColorChat( id, NORMAL, "%s You have successfully disbanded your gang.", g_szPrefix );
  1060.  
  1061. new iPlayers[ 32 ], iNum;
  1062.  
  1063. get_players( iPlayers, iNum );
  1064.  
  1065. new iPlayer;
  1066.  
  1067. for( new i = 0; i < iNum; i++ )
  1068. {
  1069. iPlayer = iPlayers[ i ];
  1070.  
  1071. if( iPlayer == id )
  1072. continue;
  1073.  
  1074. if( g_iGang[ id ] != g_iGang[ iPlayer ] )
  1075. continue;
  1076.  
  1077. ColorChat( iPlayer, NORMAL, "%s Your gang has been disband by its leader.", g_szPrefix );
  1078. set_user_gang( iPlayer, -1 );
  1079. }
  1080.  
  1081. new iGang = g_iGang[ id ];
  1082.  
  1083. set_user_gang( id, -1 );
  1084.  
  1085. ArrayDeleteItem( g_aGangs, iGang );
  1086.  
  1087. Cmd_Gang( id );
  1088. }
  1089.  
  1090. case 1: Cmd_Gang( id );
  1091. }
  1092.  
  1093. return PLUGIN_HANDLED;
  1094. }
  1095.  
  1096. public ShowTransferMenu( id )
  1097. {
  1098. new iPlayers[ 32 ], iNum;
  1099. get_players( iPlayers, iNum, "e", "TERRORIST" );
  1100.  
  1101. new hMenu = menu_create( "Transfer Leadership to:", "TransferMenu_Handler" );
  1102. new szName[ 32 ], szData[ 6 ];
  1103.  
  1104. for( new i = 0, iPlayer; i < iNum; i++ )
  1105. {
  1106. iPlayer = iPlayers[ i ];
  1107.  
  1108. if( g_iGang[ iPlayer ] != g_iGang[ id ] || id == iPlayer )
  1109. continue;
  1110.  
  1111. get_user_name( iPlayer, szName, charsmax( szName ) );
  1112. num_to_str( iPlayer, szData, charsmax( szData ) );
  1113.  
  1114. menu_additem( hMenu, szName, szData );
  1115. }
  1116.  
  1117. menu_display( id, hMenu, 0 );
  1118. }
  1119.  
  1120. public TransferMenu_Handler( id, hMenu, iItem )
  1121. {
  1122. if( iItem == MENU_EXIT )
  1123. {
  1124. ShowLeaderMenu( id );
  1125. return PLUGIN_HANDLED;
  1126. }
  1127.  
  1128. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1129.  
  1130. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, charsmax( szName ), hCallback );
  1131.  
  1132. new iPlayer = str_to_num( szData );
  1133.  
  1134. if( !is_user_connected( iPlayer ) )
  1135. {
  1136. ColorChat( id, NORMAL, "%s That player is no longer connected.", g_szPrefix );
  1137. ShowTransferMenu( id );
  1138. return PLUGIN_HANDLED;
  1139. }
  1140.  
  1141. set_user_gang( iPlayer, g_iGang[ id ], STATUS_LEADER );
  1142. set_user_gang( id, g_iGang[ id ], STATUS_ADMIN );
  1143.  
  1144. Cmd_Gang( id );
  1145.  
  1146. new iPlayers[ 32 ], iNum, iTemp;
  1147. get_players( iPlayers, iNum );
  1148.  
  1149. for( new i = 0; i < iNum; i++ )
  1150. {
  1151. iTemp = iPlayers[ i ];
  1152.  
  1153. if( iTemp == iPlayer )
  1154. {
  1155. ColorChat( iTemp, NORMAL, "%s You are the new leader of your gang.", g_szPrefix );
  1156. continue;
  1157. }
  1158.  
  1159. else if( g_iGang[ iTemp ] != g_iGang[ id ] )
  1160. continue;
  1161.  
  1162. ColorChat( iTemp, NORMAL, "%s ^03%s^01 is the new leader of your gang.", g_szPrefix, szName );
  1163. }
  1164.  
  1165. return PLUGIN_HANDLED;
  1166. }
  1167.  
  1168.  
  1169. public ShowKickMenu( id )
  1170. {
  1171. new iPlayers[ 32 ], iNum;
  1172. get_players( iPlayers, iNum );
  1173.  
  1174. new hMenu = menu_create( "Kick Player From Gang:", "KickMenu_Handler" );
  1175. new szName[ 32 ], szData[ 6 ];
  1176.  
  1177.  
  1178. for( new i = 0, iPlayer; i < iNum; i++ )
  1179. {
  1180. iPlayer = iPlayers[ i ];
  1181.  
  1182. if( g_iGang[ iPlayer ] != g_iGang[ id ] || id == iPlayer )
  1183. continue;
  1184.  
  1185. get_user_name( iPlayer, szName, charsmax( szName ) );
  1186. num_to_str( iPlayer, szData, charsmax( szData ) );
  1187.  
  1188. menu_additem( hMenu, szName, szData );
  1189. }
  1190.  
  1191. menu_display( id, hMenu, 0 );
  1192. }
  1193.  
  1194. public KickMenu_Handler( id, hMenu, iItem )
  1195. {
  1196. if( iItem == MENU_EXIT )
  1197. {
  1198. ShowLeaderMenu( id );
  1199. return PLUGIN_HANDLED;
  1200. }
  1201.  
  1202. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1203.  
  1204. menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, charsmax( szName ), hCallback );
  1205.  
  1206. new iPlayer = str_to_num( szData );
  1207.  
  1208. if( !is_user_connected( iPlayer ) )
  1209. {
  1210. ColorChat( id, NORMAL, "%s That player is no longer connected.", g_szPrefix );
  1211. ShowTransferMenu( id );
  1212. return PLUGIN_HANDLED;
  1213. }
  1214.  
  1215. set_user_gang( iPlayer, -1 );
  1216.  
  1217. Cmd_Gang( id );
  1218.  
  1219. new iPlayers[ 32 ], iNum, iTemp;
  1220. get_players( iPlayers, iNum );
  1221.  
  1222. for( new i = 0; i < iNum; i++ )
  1223. {
  1224. iTemp = iPlayers[ i ];
  1225.  
  1226. if( iTemp == iPlayer || g_iGang[ iTemp ] != g_iGang[ id ] )
  1227. continue;
  1228.  
  1229. ColorChat( iTemp, NORMAL, "%s ^03%s^01 has been kicked from the gang.", g_szPrefix, szName );
  1230. }
  1231.  
  1232. ColorChat( iPlayer, NORMAL, "%s You have been kicked from your gang.", g_szPrefix, szName );
  1233.  
  1234. return PLUGIN_HANDLED;
  1235. }
  1236.  
  1237. public ChangeName_Handler( id )
  1238. {
  1239. if( g_iGang[ id ] == -1 || getStatus( id, g_iGang[ id ] ) == STATUS_MEMBER )
  1240. {
  1241. return;
  1242. }
  1243.  
  1244. new iGang = g_iGang[ id ];
  1245.  
  1246. new szArgs[ 64 ];
  1247. read_args( szArgs, charsmax( szArgs ) );
  1248.  
  1249. new iPlayers[ 32 ], iNum;
  1250. get_players( iPlayers, iNum );
  1251.  
  1252. new bool:bInGang[ 33 ];
  1253. new iStatus[ 33 ];
  1254.  
  1255. for( new i = 0, iPlayer; i < iNum; i++ )
  1256. {
  1257. iPlayer = iPlayers[ i ];
  1258.  
  1259. if( g_iGang[ id ] != g_iGang[ iPlayer ] )
  1260. continue;
  1261.  
  1262. bInGang[ iPlayer ] = true;
  1263. iStatus[ iPlayer ] = getStatus( id, iGang );
  1264.  
  1265. set_user_gang( iPlayer, -1 );
  1266. }
  1267.  
  1268. new aData[ GangInfo ];
  1269. ArrayGetArray( g_aGangs, iGang, aData );
  1270.  
  1271. aData[ GangName ] = szArgs;
  1272.  
  1273. ArraySetArray( g_aGangs, iGang, aData );
  1274.  
  1275. for( new i = 0, iPlayer; i < iNum; i++ )
  1276. {
  1277. iPlayer = iPlayers[ i ];
  1278.  
  1279. if( !bInGang[ iPlayer ] )
  1280. continue;
  1281.  
  1282. set_user_gang( iPlayer, iGang, iStatus[ id ] );
  1283. }
  1284. }
  1285.  
  1286. public ShowAddAdminMenu( id )
  1287. {
  1288. new iPlayers[ 32 ], iNum;
  1289. new szName[ 32 ], szData[ 6 ];
  1290. new hMenu = menu_create( "Choose a Player to Promote:", "AddAdminMenu_Handler" );
  1291.  
  1292. get_players( iPlayers, iNum );
  1293.  
  1294. for( new i = 0, iPlayer; i < iNum; i++ )
  1295. {
  1296. iPlayer = iPlayers[ i ];
  1297.  
  1298. if( g_iGang[ id ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) > STATUS_MEMBER )
  1299. continue;
  1300.  
  1301. get_user_name( iPlayer, szName, charsmax( szName ) );
  1302.  
  1303. num_to_str( iPlayer, szData, charsmax( szData ) );
  1304.  
  1305. menu_additem( hMenu, szName, szData );
  1306. }
  1307.  
  1308. menu_display( id, hMenu, 0 );
  1309. }
  1310.  
  1311. public AddAdminMenu_Handler( id, hMenu, iItem )
  1312. {
  1313. if( iItem == MENU_EXIT )
  1314. {
  1315. menu_destroy( hMenu );
  1316. ShowLeaderMenu( id );
  1317. return PLUGIN_HANDLED;
  1318. }
  1319.  
  1320. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1321.  
  1322. menu_item_getinfo( hMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), hCallback );
  1323.  
  1324. new iChosen = str_to_num( szData );
  1325.  
  1326. if( !is_user_connected( iChosen ) )
  1327. {
  1328. menu_destroy( hMenu );
  1329. ShowLeaderMenu( id );
  1330. return PLUGIN_HANDLED;
  1331. }
  1332.  
  1333. set_user_gang( iChosen, g_iGang[ id ], STATUS_LEADER );
  1334.  
  1335. new iPlayers[ 32 ], iNum;
  1336. get_players( iPlayers, iNum );
  1337.  
  1338. for( new i = 0, iPlayer; i < iNum; i++ )
  1339. {
  1340. iPlayer = iPlayers[ i ];
  1341.  
  1342. if( g_iGang[ iPlayer ] != g_iGang[ id ] || iPlayer == iChosen )
  1343. continue;
  1344.  
  1345. ColorChat( iPlayer, NORMAL, "%s ^03%s ^01has been promoted to an admin of your gang.", g_szPrefix, szName );
  1346. }
  1347.  
  1348. ColorChat( iChosen, NORMAL, "%s ^01You have been promoted to an admin of your gang.", g_szPrefix );
  1349.  
  1350. menu_destroy( hMenu );
  1351. return PLUGIN_HANDLED;
  1352. }
  1353.  
  1354. public ShowRemoveAdminMenu( id )
  1355. {
  1356. new iPlayers[ 32 ], iNum;
  1357. new szName[ 32 ], szData[ 6 ];
  1358. new hMenu = menu_create( "Choose a Player to Demote:", "RemoveAdminMenu_Handler" );
  1359.  
  1360. get_players( iPlayers, iNum );
  1361.  
  1362. for( new i = 0, iPlayer; i < iNum; i++ )
  1363. {
  1364. iPlayer = iPlayers[ i ];
  1365.  
  1366. if( g_iGang[ id ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) != STATUS_ADMIN )
  1367. continue;
  1368.  
  1369. get_user_name( iPlayer, szName, charsmax( szName ) );
  1370.  
  1371. num_to_str( iPlayer, szData, charsmax( szData ) );
  1372.  
  1373. menu_additem( hMenu, szName, szData );
  1374. }
  1375.  
  1376. menu_display( id, hMenu, 0 );
  1377. }
  1378.  
  1379. public RemoveAdminMenu_Handler( id, hMenu, iItem )
  1380. {
  1381. if( iItem == MENU_EXIT )
  1382. {
  1383. menu_destroy( hMenu );
  1384. ShowLeaderMenu( id );
  1385. return PLUGIN_HANDLED;
  1386. }
  1387.  
  1388. new iAccess, hCallback, szData[ 6 ], szName[ 32 ];
  1389.  
  1390. menu_item_getinfo( hMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), hCallback );
  1391.  
  1392. new iChosen = str_to_num( szData );
  1393.  
  1394. if( !is_user_connected( iChosen ) )
  1395. {
  1396. menu_destroy( hMenu );
  1397. ShowLeaderMenu( id );
  1398. return PLUGIN_HANDLED;
  1399. }
  1400.  
  1401. set_user_gang( iChosen, g_iGang[ id ], STATUS_MEMBER );
  1402.  
  1403. new iPlayers[ 32 ], iNum;
  1404. get_players( iPlayers, iNum );
  1405.  
  1406. for( new i = 0, iPlayer; i < iNum; i++ )
  1407. {
  1408. iPlayer = iPlayers[ i ];
  1409.  
  1410. if( g_iGang[ iPlayer ] != g_iGang[ id ] || iPlayer == iChosen )
  1411. continue;
  1412.  
  1413. ColorChat( iPlayer, NORMAL, "%s ^03%s ^01has been demoted from being an admin of your gang.", g_szPrefix, szName );
  1414. }
  1415.  
  1416. ColorChat( iChosen, NORMAL, "%s ^01You have been demoted from being an admin of your gang.", g_szPrefix );
  1417.  
  1418. menu_destroy( hMenu );
  1419. return PLUGIN_HANDLED;
  1420. }
  1421.  
  1422. public ShowMembersMenu( id )
  1423. {
  1424. new szName[ 64 ], iPlayers[ 32 ], iNum;
  1425. get_players( iPlayers, iNum );
  1426.  
  1427. new hMenu = menu_create( "Online Members:", "MemberMenu_Handler" );
  1428.  
  1429. for( new i = 0, iPlayer; i < iNum; i++ )
  1430. {
  1431. iPlayer = iPlayers[ i ];
  1432.  
  1433. if( g_iGang[ id ] != g_iGang[ iPlayer ] )
  1434. continue;
  1435.  
  1436. get_user_name( iPlayer, szName, charsmax( szName ) );
  1437.  
  1438. switch( getStatus( iPlayer, g_iGang[ id ] ) )
  1439. {
  1440. case STATUS_MEMBER:
  1441. {
  1442. add( szName, charsmax( szName ), " \r[Member]" );
  1443. }
  1444.  
  1445. case STATUS_ADMIN:
  1446. {
  1447. add( szName, charsmax( szName ), " \r[Admin]" );
  1448. }
  1449.  
  1450. case STATUS_LEADER:
  1451. {
  1452. add( szName, charsmax( szName ), " \r[Leader]" );
  1453. }
  1454. }
  1455.  
  1456. menu_additem( hMenu, szName );
  1457. }
  1458.  
  1459. menu_display( id, hMenu, 0 );
  1460. }
  1461.  
  1462. public MemberMenu_Handler( id, hMenu, iItem )
  1463. {
  1464. if( iItem == MENU_EXIT )
  1465. {
  1466. menu_destroy( hMenu );
  1467. Cmd_Gang( id );
  1468. return PLUGIN_HANDLED;
  1469. }
  1470.  
  1471. menu_destroy( hMenu );
  1472.  
  1473. ShowMembersMenu( id )
  1474. return PLUGIN_HANDLED;
  1475. }
  1476.  
  1477. // Credits to Tirant from zombie mod and xOR from xRedirect
  1478. public LoadGangs()
  1479. {
  1480. new szConfigsDir[ 60 ];
  1481. get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );
  1482. add( szConfigsDir, charsmax( szConfigsDir ), "/jb_gangs.ini" );
  1483.  
  1484. new iFile = fopen( szConfigsDir, "rt" );
  1485.  
  1486. new aData[ GangInfo ];
  1487.  
  1488. new szBuffer[ 512 ], szData[ 6 ], szValue[ 6 ], i, iCurGang;
  1489.  
  1490. while( !feof( iFile ) )
  1491. {
  1492. fgets( iFile, szBuffer, charsmax( szBuffer ) );
  1493.  
  1494. trim( szBuffer );
  1495. remove_quotes( szBuffer );
  1496.  
  1497. if( !szBuffer[ 0 ] || szBuffer[ 0 ] == ';' )
  1498. {
  1499. continue;
  1500. }
  1501.  
  1502. if( szBuffer[ 0 ] == '[' && szBuffer[ strlen( szBuffer ) - 1 ] == ']' )
  1503. {
  1504. copy( aData[ GangName ], strlen( szBuffer ) - 2, szBuffer[ 1 ] );
  1505. aData[ GangHP ] = 0;
  1506. aData[ GangStealing ] = 0;
  1507. aData[ GangGravity ] = 0;
  1508. aData[ GangStamina ] = 0;
  1509. aData[ GangWeaponDrop ] = 0;
  1510. aData[ GangDamage ] = 0;
  1511. aData[ GangKills ] = 0;
  1512. aData[ NumMembers ] = 0;
  1513. aData[ GangMembers ] = _:TrieCreate();
  1514.  
  1515. if( TrieKeyExists( g_tGangNames, aData[ GangName ] ) )
  1516. {
  1517. new szError[ 256 ];
  1518. formatex( szError, charsmax( szError ), "[JB Gangs] Gang already exists: %s", aData[ GangName ] );
  1519. set_fail_state( szError );
  1520. }
  1521.  
  1522. ArrayPushArray( g_aGangs, aData );
  1523.  
  1524. TrieSetCell( g_tGangNames, aData[ GangName ], iCurGang );
  1525.  
  1526. log_amx( "Gang Created: %s", aData[ GangName ] );
  1527.  
  1528. iCurGang++;
  1529.  
  1530. continue;
  1531. }
  1532.  
  1533. strtok( szBuffer, szData, 31, szValue, 511, '=' );
  1534. trim( szData );
  1535. trim( szValue );
  1536.  
  1537. if( TrieGetCell( g_tGangValues, szData, i ) )
  1538. {
  1539. ArrayGetArray( g_aGangs, iCurGang - 1, aData );
  1540.  
  1541. switch( i )
  1542. {
  1543. case VALUE_HP:
  1544. aData[ GangHP ] = str_to_num( szValue );
  1545.  
  1546. case VALUE_STEALING:
  1547. aData[ GangStealing ] = str_to_num( szValue );
  1548.  
  1549. case VALUE_GRAVITY:
  1550. aData[ GangGravity ] = str_to_num( szValue );
  1551.  
  1552. case VALUE_STAMINA:
  1553. aData[ GangStamina ] = str_to_num( szValue );
  1554.  
  1555. case VALUE_WEAPONDROP:
  1556. aData[ GangWeaponDrop ] = str_to_num( szValue );
  1557.  
  1558. case VALUE_DAMAGE:
  1559. aData[ GangDamage ] = str_to_num( szValue );
  1560.  
  1561. case VALUE_KILLS:
  1562. aData[ GangKills ] = str_to_num( szValue );
  1563. }
  1564.  
  1565. ArraySetArray( g_aGangs, iCurGang - 1, aData );
  1566. }
  1567. }
  1568.  
  1569. new Array:aSQL;
  1570. sqlv_read_all_ex( g_hVault, aSQL );
  1571.  
  1572. new aVaultData[ SQLVaultEntryEx ];
  1573.  
  1574. new iGang;
  1575.  
  1576. for( i = 0; i < ArraySize( aSQL ); i++ )
  1577. {
  1578. ArrayGetArray( aSQL, i, aVaultData );
  1579.  
  1580. if( TrieGetCell( g_tGangNames, aVaultData[ SQLVEx_Key2 ], iGang ) )
  1581. {
  1582. ArrayGetArray( g_aGangs, iGang, aData );
  1583.  
  1584. TrieSetCell( aData[ GangMembers ], aVaultData[ SQLVEx_Key1 ], str_to_num( aVaultData[ SQLVEx_Data ] ) );
  1585.  
  1586. aData[ NumMembers ]++;
  1587.  
  1588. ArraySetArray( g_aGangs, iGang, aData );
  1589. }
  1590. }
  1591.  
  1592. fclose( iFile );
  1593. }
  1594.  
  1595. public SaveGangs()
  1596. {
  1597. new szConfigsDir[ 64 ];
  1598. get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );
  1599.  
  1600. add( szConfigsDir, charsmax( szConfigsDir ), "/jb_gangs.ini" );
  1601.  
  1602. if( file_exists( szConfigsDir ) )
  1603. delete_file( szConfigsDir );
  1604.  
  1605. new iFile = fopen( szConfigsDir, "wt" );
  1606.  
  1607. new aData[ GangInfo ];
  1608.  
  1609. new szBuffer[ 256 ];
  1610.  
  1611. for( new i = 0; i < ArraySize( g_aGangs ); i++ )
  1612. {
  1613. ArrayGetArray( g_aGangs, i, aData );
  1614.  
  1615. formatex( szBuffer, charsmax( szBuffer ), "[%s]^n", aData[ GangName ] );
  1616. fputs( iFile, szBuffer );
  1617.  
  1618. formatex( szBuffer, charsmax( szBuffer ), "HP=%i^n", aData[ GangHP ] );
  1619. fputs( iFile, szBuffer );
  1620.  
  1621. formatex( szBuffer, charsmax( szBuffer ), "Stealing=%i^n", aData[ GangStealing ] );
  1622. fputs( iFile, szBuffer );
  1623.  
  1624. formatex( szBuffer, charsmax( szBuffer ), "Gravity=%i^n", aData[ GangGravity ] );
  1625. fputs( iFile, szBuffer );
  1626.  
  1627. formatex( szBuffer, charsmax( szBuffer ), "Stamina=%i^n", aData[ GangStamina ] );
  1628. fputs( iFile, szBuffer );
  1629.  
  1630. formatex( szBuffer, charsmax( szBuffer ), "WeaponDrop=%i^n", aData[ GangWeaponDrop ] );
  1631. fputs( iFile, szBuffer );
  1632.  
  1633. formatex( szBuffer, charsmax( szBuffer ), "Damage=%i^n", aData[ GangDamage ] );
  1634. fputs( iFile, szBuffer );
  1635.  
  1636. formatex( szBuffer, charsmax( szBuffer ), "Kills=%i^n^n", aData[ GangKills ] );
  1637. fputs( iFile, szBuffer );
  1638. }
  1639.  
  1640. fclose( iFile );
  1641. }
  1642.  
  1643.  
  1644.  
  1645. set_user_gang( id, iGang, iStatus=STATUS_MEMBER )
  1646. {
  1647. new szAuthID[ 35 ];
  1648. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  1649.  
  1650. new aData[ GangInfo ];
  1651.  
  1652. if( g_iGang[ id ] > -1 )
  1653. {
  1654. ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
  1655. TrieDeleteKey( aData[ GangMembers ], szAuthID );
  1656. aData[ NumMembers ]--;
  1657. ArraySetArray( g_aGangs, g_iGang[ id ], aData );
  1658.  
  1659. sqlv_remove_ex( g_hVault, szAuthID, aData[ GangName ] );
  1660. }
  1661.  
  1662. if( iGang > -1 )
  1663. {
  1664. ArrayGetArray( g_aGangs, iGang, aData );
  1665. TrieSetCell( aData[ GangMembers ], szAuthID, iStatus );
  1666. aData[ NumMembers ]++;
  1667. ArraySetArray( g_aGangs, iGang, aData );
  1668.  
  1669. sqlv_set_num_ex( g_hVault, szAuthID, aData[ GangName ], iStatus );
  1670. }
  1671.  
  1672. g_iGang[ id ] = iGang;
  1673.  
  1674. return 1;
  1675. }
  1676.  
  1677. get_user_gang( id )
  1678. {
  1679. new szAuthID[ 35 ];
  1680. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  1681.  
  1682. new aData[ GangInfo ];
  1683.  
  1684. for( new i = 0; i < ArraySize( g_aGangs ); i++ )
  1685. {
  1686. ArrayGetArray( g_aGangs, i, aData );
  1687.  
  1688. if( TrieKeyExists( aData[ GangMembers ], szAuthID ) )
  1689. return i;
  1690. }
  1691.  
  1692. return -1;
  1693. }
  1694.  
  1695. getStatus( id, iGang )
  1696. {
  1697. if( !is_user_connected( id ) || iGang == -1 )
  1698. return STATUS_NONE;
  1699.  
  1700. new aData[ GangInfo ];
  1701. ArrayGetArray( g_aGangs, iGang, aData );
  1702.  
  1703. new szAuthID[ 35 ];
  1704. get_user_authid( id, szAuthID, charsmax( szAuthID ) );
  1705.  
  1706. new iStatus;
  1707. TrieGetCell( aData[ GangMembers ], szAuthID, iStatus );
  1708.  
  1709. return iStatus;
  1710. }

Hiba?

Szerző:  NuD[!]e [2014.07.30. 12:37 ]
Hozzászólás témája:  Re: JB Gang rendszer!

sqvault.inc

Szerző:  pocok5 [2014.07.30. 14:42 ]
Hozzászólás témája:  Re: JB Gang rendszer!

Nemigaz hogy nemtudsz keresgélni google-n ...
Én legelsőre megtaláltam .

Csatolmányok:
sqlvault.inc [33.5KiB]
Letöltve 41 alkalommal.

Oldal: 1 / 1 Minden időpont UTC+02:00 időzóna szerinti
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/