Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Настройка Банд Для сервер Jail

, Система Банд
Статус пользователя Karapuz121
сообщение 16.2.2018, 16:38
Сообщение #1
Стаж: 6 лет 1 месяц
Город: Гомель

Сообщений: 39
Благодарностей: 1
Полезность: 21

Ребят такой вопрос как сделать банды не по очкам , а денежную?
Код:
	
/*
Jailbreak Система Банды

Описание
-----------
Этот плагин позволяет заключенным создавать банды и совершенствовании конкретных навыков, которые применимы ко всем членам банды.


Меню банды
----------
Создать банду - Позволяет пользователю создавать банды, заплатив очки.
Пригласить в банду - Только главарь банды может пригласить людей в банду.
Навыки - Открывает меню навыков, где любой член банды может заплатить очки, чтобы модернизировать свои навыки.
Top-10 - Показывает сообщение дня (motd) с ТОП10 банд, отсортированный по убийствам. (Если у вас есть хороший способ, чтобы сортировать его, пожалуйста, задайте его ниже)
Покинуть Банду - Позволяет игроку покинуть банду. Лидер не может покинуть банду, пока он передает лидерство кому-то другому (объяснил позже).
Меню админа банды - Показывает меню с нужным распустить банду, кикнуть игрока из банды, или передать лидерство кому-то другому в банде.
Онлайн участники - Показывает список участников банды, которые в данный момент на сервере.


Навыки
------
HP - Увеличено здоровье.
Stealing - Увеличили сумму заработка.
Gravity - Низкая гравитация.
Damage - Наносимый урон увеличен.
Stamina - Обеспечивает более высокую скорость для игроков.
Weapon Drop - Шанс сделать охранник брось оружие, когда ты им нож. (%1 увеличить шанс за уровень)


Переменные
----------
jb_gang_cost - Стоимость создания банды.
jb_health_cost - Стоимость апгрейда здоровья банды.
jb_stealing_cost - Затраты на обновление банды деньги зарабатывать.
jb_gravity_cost - Затраты на обновление банды гравитации.
jb_damage_cost - Затраты на обновление банды повреждения.
jb_stamina_cost - Затраты на обновление банды выносливость (скорость).
jb_weapondrop_cost - Затраты на обновление банды оружие процент падения.

Дополнительно есть переменные (cvars для уровня Max для каждого типа обновления, так что заменить _cost выше с _max.
Также есть переменные (cvars) в сумме за уровень, так что заменить _cost выше с каждого.

jb_points_per_kill - Количество очков, которые вы получаете за убийство.
jb_headshot_bonus - Количество очков вы получите за убийство в голову.

jb_max_members - Максимальное количество участников в банде.
jb_admin_create - Админ может создавать банды без использования очков.

Кредиты
-------
F0RCE - Оригинальный Плагин Идеи
Exolent - SQLVault Включают
Drekes - Заморозка времени исправить (мне было лень) :)


Список изменений
----------------
Сентябрь 26, 2011 - v1.0 - Первоначальный выпуск.
Сентябрь 27, 2011 - v1.01 - Добавлено больше переменных, исправлено несколько ошибок.
Сентябрь 28, 2011 - v1.1 - Добавлено банда админов, очки вместо денег, и несколько других вещей, которые я не могу вспомнить :)
Январь 21, 2011 - v1.1.1 - Добавлен квар для администратора может создать банду без использования очков.
Январь 23, 2011 - v1.1.2 - Исправлена проблема заморозка времени.

*/

/* Includes */

#include < amxmodx >
#include < amxmisc >
#include < sqlvault_ex >
#include < cstrike >
#include < colorchat >
#include < hamsandwich >
#include < fun >

/* Defines */

#define ADMIN_CREATE ADMIN_LEVEL_A

/* Constants */

new const g_szVersion[ ] = "1.1.2";

enum _:GangInfo
{
Trie:GangMembers,
GangName[ 64 ],
GangHP,
GangStealing,
GangGravity,
GangDamage,
GangStamina,
GangWeaponDrop,
GangKills,
NumMembers
};

enum
{
VALUE_HP,
VALUE_STEALING,
VALUE_GRAVITY,
VALUE_DAMAGE,
VALUE_STAMINA,
VALUE_WEAPONDROP,
VALUE_KILLS
}

enum
{
STATUS_NONE,
STATUS_MEMBER,
STATUS_ADMIN,
STATUS_LEADER
};

new const g_szGangValues[ ][ ] =
{
"HP",
"Stealing",
"Gravity",
"Damage",
"Stamina",
"WeaponDrop",
"Kills"
};

new const g_szPrefix[ ] = "^04[JBE]^01";

/* Tries */

new Trie:g_tGangNames;
new Trie:g_tGangValues;

/* Vault */

new SQLVault:g_hVault;
new SQLVault:g_hPointsVault;

/* Arrays */

new Array:g_aGangs;

/* Pcvars */

new g_pCreateCost;

new g_pHealthCost;
new g_pStealingCost;
new g_pGravityCost;
new g_pDamageCost;
new g_pStaminaCost;
new g_pWeaponDropCost;

new g_pHealthMax;
new g_pStealingMax;
new g_pGravityMax;
new g_pDamageMax;
new g_pStaminaMax;
new g_pWeaponDropMax;

new g_pHealthPerLevel;
new g_pStealingPerLevel;
new g_pGravityPerLevel;
new g_pDamagePerLevel;
new g_pStaminaPerLevel;
new g_pWeaponDropPerLevel;

new g_pPointsPerKill;
new g_pHeadshotBonus;

new g_pMaxMembers;
new g_pAdminCreate;

/* Integers */

new g_iGang[ 33 ];
new g_iPoints[ 33 ];


public plugin_init()
{
register_plugin( "Jailbreak Gang System", g_szVersion, "H3avY Ra1n" );

g_aGangs = ArrayCreate( GangInfo );

g_tGangValues = TrieCreate();
g_tGangNames = TrieCreate();

g_hVault = sqlv_open_local( "jb_gangs", false );
sqlv_init_ex( g_hVault );

g_hPointsVault = sqlv_open_local( "jb_points", true );

g_pCreateCost = register_cvar( "jb_gang_cost", "200" );
g_pHealthCost = register_cvar( "jb_health_cost", "20" );
g_pStealingCost = register_cvar( "jb_stealing_cost", "20" );
g_pGravityCost = register_cvar( "jb_gravity_cost", "20" );
g_pDamageCost = register_cvar( "jb_damage_cost", "20" );
g_pStaminaCost = register_cvar( "jb_stamina_cost", "20" );
g_pWeaponDropCost = register_cvar( "jb_weapondrop_cost", "20" );

g_pHealthMax = register_cvar( "jb_health_max", "10" );
g_pStealingMax = register_cvar( "jb_stealing_max", "10" );
g_pGravityMax = register_cvar( "jb_gravity_max", "10" ); // Макс * сила тяжести на каждом уровне должно быть меньше, чем 800
g_pDamageMax = register_cvar( "jb_damage_max", "10" );
g_pStaminaMax = register_cvar( "jb_stamina_max", "10" );
g_pWeaponDropMax = register_cvar( "jb_weapondrop_max", "10" );

g_pHealthPerLevel = register_cvar( "jb_health_per", "10" );
g_pStealingPerLevel = register_cvar( "jb_stealing_per", "0.05" );
g_pGravityPerLevel = register_cvar( "jb_gravity_per", "50" );
g_pDamagePerLevel = register_cvar( "jb_damage_per", "3" );
g_pStaminaPerLevel = register_cvar( "jb_stamina_per", "3" );
g_pWeaponDropPerLevel = register_cvar( "jb_weapondrop_per", "1" );

g_pPointsPerKill = register_cvar( "jb_points_per_kill", "3" );
g_pHeadshotBonus = register_cvar( "jb_headshot_bonus", "2" );

g_pMaxMembers = register_cvar( "jb_max_members", "100" );
g_pAdminCreate = register_cvar( "jb_admin_create", "0" ); // Администраторы могут создавать банды без очков

register_cvar( "jb_gang_version", g_szVersion, FCVAR_SPONLY | FCVAR_SERVER );

register_menu( "Gang Menu", 1023, "GangMenu_Handler" );
register_menu( "Skills Menu", 1023, "SkillsMenu_Handler" );

for( new i = 0; i < sizeof g_szGangValues; i++ )
{
TrieSetCell( g_tGangValues, g_szGangValues[ i ], i );
}

RegisterHam( Ham_Spawn, "player", "Ham_PlayerSpawn_Post", 1 );
RegisterHam( Ham_TakeDamage, "player", "Ham_TakeDamage_Pre", 0 );
RegisterHam( Ham_TakeDamage, "player", "Ham_TakeDamage_Post", 1 );
RegisterHam( Ham_Item_PreFrame, "player", "Ham_PlayerResetSpeedPost", 1);

register_event( "DeathMsg", "Event_DeathMsg", "a" );

register_clcmd( "say /gang", "Cmd_Gang" );
register_clcmd( "gang_name", "Cmd_CreateGang" );

LoadGangs();
}

public client_disconnect( id )
{
g_iGang[ id ] = -1;

new szAuthID[ 35 ];
get_user_authid( id, szAuthID, charsmax( szAuthID ) );

sqlv_set_num( g_hPointsVault, szAuthID, g_iPoints[ id ] );
}

public client_putinserver( id )
{
g_iGang[ id ] = get_user_gang( id );
new szAuthID[ 35 ];
get_user_authid( id, szAuthID, charsmax( szAuthID ) );

g_iPoints[ id ] = sqlv_get_num( g_hPointsVault, szAuthID );
}

public plugin_end()
{
SaveGangs();
sqlv_close( g_hVault );
}

public Ham_PlayerSpawn_Post( id )
{
if( !is_user_alive( id ) || cs_get_user_team( id ) != CS_TEAM_T )
return HAM_IGNORED;

if( g_iGang[ id ] == -1 )
{
return HAM_IGNORED;
}

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, g_iGang[ id ], aData );

new iHealth = 100 + aData[ GangHP ] * get_pcvar_num( g_pHealthPerLevel );
set_user_health( id, iHealth );

new iGravity = 800 - ( get_pcvar_num( g_pGravityPerLevel ) * aData[ GangGravity ] );
set_user_gravity( id, float( iGravity ) / 800.0 );

return HAM_IGNORED;
}

public Ham_TakeDamage_Pre( iVictim, iInflictor, iAttacker, Float:flDamage, iBits )
{
if( !is_user_alive( iAttacker ) || cs_get_user_team( iAttacker ) != CS_TEAM_T )
return HAM_IGNORED;

if( g_iGang[ iAttacker ] == -1 )
return HAM_IGNORED;

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, g_iGang[ iAttacker ], aData );

SetHamParamFloat( 4, flDamage + ( get_pcvar_num( g_pDamagePerLevel ) * ( aData[ GangDamage ] ) ) );

return HAM_IGNORED;
}

public Ham_TakeDamage_Post( iVictim, iInflictor, iAttacker, Float:flDamage, iBits )
{
if( !is_user_alive( iAttacker ) || g_iGang[ iAttacker ] == -1 || get_user_weapon( iAttacker ) != CSW_KNIFE || cs_get_user_team( iAttacker ) != CS_TEAM_T )
{
return HAM_IGNORED;
}

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, g_iGang[ iAttacker ], aData );

new iChance = aData[ GangWeaponDrop ] * get_pcvar_num( g_pWeaponDropPerLevel );

if( iChance == 0 )
return HAM_IGNORED;

new bool:bDrop = ( random_num( 1, 100 ) <= iChance );

if( bDrop )
client_cmd( iVictim, "drop" );

return HAM_IGNORED;
}

public Ham_PlayerResetSpeedPost( id )
{
if( g_iGang[ id ] == -1 || !is_user_alive( id ) || cs_get_user_team( id ) != CS_TEAM_T )
{
return HAM_IGNORED;
}

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, g_iGang[ id ], aData );

if( aData[ GangStamina ] > 0 && get_user_maxspeed( id ) > 1.0 )
set_user_maxspeed( id, 250.0 + ( aData[ GangStamina ] * get_pcvar_num( g_pStaminaPerLevel ) ) );

return HAM_IGNORED;
}

public Event_DeathMsg()
{
new iKiller = read_data( 1 );
new iVictim = read_data( 2 );

if( !is_user_alive( iKiller ) || cs_get_user_team( iVictim ) != CS_TEAM_CT || cs_get_user_team( iKiller ) != CS_TEAM_T )
return PLUGIN_CONTINUE;

new iTotal = get_pcvar_num( g_pPointsPerKill ) + ( bool:read_data( 3 ) ? get_pcvar_num( g_pHeadshotBonus ) : 0 );

if( g_iGang[ iKiller ] > -1 )
{
new aData[ GangInfo ];
ArrayGetArray( g_aGangs, g_iGang[ iKiller ], aData );
aData[ GangKills ]++;
ArraySetArray( g_aGangs, g_iGang[ iKiller ], aData );

iTotal += iTotal * ( aData[ GangStealing ] * get_pcvar_num( g_pStealingPerLevel ) );
}

g_iPoints[ iKiller ] += iTotal;

return PLUGIN_CONTINUE;
}

public Cmd_Gang( id )
{
if( !is_user_connected( id ) || cs_get_user_team( id ) != CS_TEAM_T )
{
ColorChat( id, NORMAL, "%s Только ^03заключенные^01 могут открыть это меню.", g_szPrefix );
return PLUGIN_HANDLED;
}

static szMenu[ 512 ], iLen, aData[ GangInfo ], iKeys, iStatus;

iKeys = MENU_KEY_0 | MENU_KEY_4;

iStatus = getStatus( id, g_iGang[ id ] );

if( g_iGang[ id ] > -1 )
{
ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
iLen = formatex( szMenu, charsmax( szMenu ), "\r[\w~ \yМеню Банды \w~\r]^n\r[ \dТекущая Банда\r: \y%s \r]^n", aData[ GangName ] );
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[ \dJB Очки\r: \y%i \r]^n^n", g_iPoints[ id ] );
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w1\r] \dСоздать банду \r[\y%i Очков\r]^n", get_pcvar_num( g_pCreateCost ) );
}

else
{
iLen = formatex( szMenu, charsmax( szMenu ), "\r[\w~ \yМеню Банды \w~\r]^n\r[ \dТекущей Банды\r: \yНету :( \r]^n" );
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[ \dJB Очки\r: \y%i \r]^n^n", g_iPoints[ id ] );
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w1\r] \wСоздать банду \r[\y%i Очков\r]^n", get_pcvar_num( g_pCreateCost ) );

iKeys |= MENU_KEY_1;
}


if( iStatus > STATUS_MEMBER && g_iGang[ id ] > -1 && get_pcvar_num( g_pMaxMembers ) > aData[ NumMembers ] )
{
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w2\r] \wПриглосить зека в банду^n" );
iKeys |= MENU_KEY_2;
}
else
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w2\r] \dПриглосить зека в банду^n" );

if( g_iGang[ id ] > -1 )
{
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w3\r] \wНавыки^n" );
iKeys |= MENU_KEY_3;
}

else
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w3\r] \dНавыки^n" );

iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w4\r] \wTop-10 банд^n" );

if( g_iGang[ id ] > -1 )
{
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w5\r] \wПокинуть банду^n" );
iKeys |= MENU_KEY_5;
}

else
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w5\r] \dПокинуть банду^n" );


if( iStatus > STATUS_MEMBER )
{
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w6\r] \wМеню админа банды^n" );
iKeys |= MENU_KEY_6;
}

else
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w6\r] \dМеню админа банды^n" );

if( g_iGang[ id ] > -1 )
{
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w7\r] \wОнлайн участники^n" );
iKeys |= MENU_KEY_7;
}

else
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r[\w7\r] \dОнлайн участники^n" );

iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "^n\r[\w0\r] \wВыход" );

show_menu( id, iKeys, szMenu, -1, "Gang Menu" );

return PLUGIN_CONTINUE;
}

public GangMenu_Handler( id, iKey )
{
switch( ( iKey + 1 ) % 10 )
{
case 0: return PLUGIN_HANDLED;

case 1:
{
if( get_pcvar_num( g_pAdminCreate ) && get_user_flags( id ) & ADMIN_CREATE )
{
client_cmd( id, "messagemode gang_name" );
}

else if( g_iPoints[ id ] < get_pcvar_num( g_pCreateCost ) )
{
ColorChat( id, NORMAL, "%s Вы не имеете достаточно очков, чтобы создать банду!", g_szPrefix );
return PLUGIN_HANDLED;
}

else
client_cmd( id, "messagemode gang_name" );
}

case 2:
{
ShowInviteMenu( id );
}

case 3:
{
ShowSkillsMenu( id );
}

case 4:
{
Cmd_Top10( id );
}

case 5:
{
ShowLeaveConfirmMenu( id );
}

case 6:
{
ShowLeaderMenu( id );
}

case 7:
{
ShowMembersMenu( id );
}
}

return PLUGIN_HANDLED;
}

public Cmd_CreateGang( id )
{
new bool:bAdmin = false;

if( get_pcvar_num( g_pAdminCreate ) && get_user_flags( id ) & ADMIN_CREATE )
{
bAdmin = true;
}

else if( g_iPoints[ id ] < get_pcvar_num( g_pCreateCost ) )
{
ColorChat( id, NORMAL, "%s Вы не имеете достаточно очков, чтобы создать банду.", g_szPrefix );
return PLUGIN_HANDLED;
}

else if( g_iGang[ id ] > -1 )
{
ColorChat( id, NORMAL, "%s Нельзя создавать банду, если вы уже находитесь в другой!", g_szPrefix );
return PLUGIN_HANDLED;
}

else if( cs_get_user_team( id ) != CS_TEAM_T )
{
ColorChat( id, NORMAL, "%s Только ^03заключенные^01 могут создавать банды!", g_szPrefix );
return PLUGIN_HANDLED;
}

new szArgs[ 60 ];
read_args( szArgs, charsmax( szArgs ) );

remove_quotes( szArgs );

if( TrieKeyExists( g_tGangNames, szArgs ) )
{
ColorChat( id, NORMAL, "%s Банда с таким названием уже существует.", g_szPrefix );
Cmd_Gang( id );
return PLUGIN_HANDLED;
}

new aData[ GangInfo ];

aData[ GangName ] = szArgs;
aData[ GangHP ] = 0;
aData[ GangStealing ] = 0;
aData[ GangGravity ] = 0;
aData[ GangStamina ] = 0;
aData[ GangWeaponDrop ] = 0;
aData[ GangDamage ] = 0;
aData[ NumMembers ] = 0;
aData[ GangMembers ] = _:TrieCreate();

ArrayPushArray( g_aGangs, aData );

if( !bAdmin )
g_iPoints[ id ] -= get_pcvar_num( g_pCreateCost );

set_user_gang( id, ArraySize( g_aGangs ) - 1, STATUS_LEADER );

ColorChat( id, NORMAL, "%s Вы успешно создали банду '^03%s^01'.", g_szPrefix, szArgs );

return PLUGIN_HANDLED;
}

public ShowInviteMenu( id )
{
new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum );

new szInfo[ 6 ], hMenu;
hMenu = menu_create( "Выберите игрока, чтобы пригласить:", "InviteMenu_Handler" );
new szName[ 32 ];

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];


if( iPlayer == id || g_iGang[ iPlayer ] == g_iGang[ id ] || cs_get_user_team( iPlayer ) != CS_TEAM_T )
continue;

get_user_name( iPlayer, szName, charsmax( szName ) );

num_to_str( iPlayer, szInfo, charsmax( szInfo ) );

menu_additem( hMenu, szName, szInfo );
}

menu_display( id, hMenu, 0 );
}

public InviteMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
{
Cmd_Gang( id );
return PLUGIN_HANDLED;
}

new szData[ 6 ], iAccess, hCallback, szName[ 32 ];
menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, 31, hCallback );

new iPlayer = str_to_num( szData );

if( !is_user_connected( iPlayer ) )
return PLUGIN_HANDLED;

ShowInviteConfirmMenu( id, iPlayer );

ColorChat( id, NORMAL, "%s Вы успешно пригласили %s, в вашу банду.", g_szPrefix, szName );

Cmd_Gang( id );
return PLUGIN_HANDLED;
}

public ShowInviteConfirmMenu( id, iPlayer )
{
new szName[ 32 ];
get_user_name( id, szName, charsmax( szName ) );

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, g_iGang[ id ], aData );

new szMenuTitle[ 128 ];
formatex( szMenuTitle, charsmax( szMenuTitle ), "%s Пригласил вас присоединиться к %s", szName, aData[ GangName ] );
new hMenu = menu_create( szMenuTitle, "InviteConfirmMenu_Handler" );

new szInfo[ 6 ];
num_to_str( g_iGang[ id ], szInfo, 5 );

menu_additem( hMenu, "Принять приглашение", szInfo );
menu_additem( hMenu, "Отклонить приглашение", "-1" );

menu_display( iPlayer, hMenu, 0 );
}

public InviteConfirmMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
return PLUGIN_HANDLED;

new szData[ 6 ], iAccess, hCallback;
menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );

new iGang = str_to_num( szData );

if( iGang == -1 )
return PLUGIN_HANDLED;

if( getStatus( id, g_iGang[ id ] ) == STATUS_LEADER )
{
ColorChat( id, NORMAL, "%s Вы не можете оставить свою банду, пока вы являетесь лидером.", g_szPrefix );
return PLUGIN_HANDLED;
}

set_user_gang( id, iGang );

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, iGang, aData );

ColorChat( id, NORMAL, "%s Вы успешно присоединились к банде ^03%s^01.", g_szPrefix, aData[ GangName ] );

return PLUGIN_HANDLED;
}


public ShowSkillsMenu( id )
{
static szMenu[ 512 ], iLen, iKeys, aData[ GangInfo ];

if( !iKeys )
{
iKeys = MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_3 | MENU_KEY_4 | MENU_KEY_5 | MENU_KEY_6 | MENU_KEY_0;
}

ArrayGetArray( g_aGangs, g_iGang[ id ], aData );

iLen = formatex( szMenu, charsmax( szMenu ), "\r[\yМеню навыков\r]^n^n" );
iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r1. \wЗдоровье \r[\dЦена: \y%i \dОчков\r][\dLevel:\y%i/%i\r]^n", get_pcvar_num( g_pHealthCost ), aData[ GangHP ], get_pcvar_num( g_pHealthMax ) );
iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r2. \wВоровство \r[\dЦена: \y%i \dОчков\r][\dLevel:\y%i/%i\r]^n", get_pcvar_num( g_pStealingCost ), aData[ GangStealing ], get_pcvar_num( g_pStealingMax ) );
iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r3. \wГравитация \r[\dЦена: \y%i \dОчков\r][\dLevel:\y%i/%i\r]^n", get_pcvar_num( g_pGravityCost ), aData[ GangGravity ], get_pcvar_num( g_pGravityMax ) );
iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r4. \wНеуязвимость \r[\dЦена: \y%i \dОчков\r][\dLevel:\y%i/%i\r]^n", get_pcvar_num( g_pDamageCost ), aData[ GangDamage ], get_pcvar_num( g_pDamageMax ) );
iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r5. \wСила урона \r[\dЦена: \y%i \dОчков\r][\dLevel:\y%i/%i\r]^n", get_pcvar_num( g_pWeaponDropCost ), aData[ GangWeaponDrop ], get_pcvar_num( g_pWeaponDropMax ) );
iLen += formatex( szMenu[ iLen ], 511 - iLen, "\r6. \wСкорость \r[\dЦена: \y%i \dОчков\r][\dLevel:\y%i/%i\r]^n", get_pcvar_num( g_pStaminaCost ), aData[ GangStamina ], get_pcvar_num( g_pStaminaMax ) );

iLen += formatex( szMenu[ iLen ], 511 - iLen, "^n\r0. \wВыход" );

show_menu( id, iKeys, szMenu, -1, "Skills Menu" );
}

public SkillsMenu_Handler( id, iKey )
{
new aData[ GangInfo ];
ArrayGetArray( g_aGangs, g_iGang[ id ], aData );

switch( ( iKey + 1 ) % 10 )
{
case 0:
{
Cmd_Gang( id );
return PLUGIN_HANDLED;
}

case 1:
{
if( aData[ GangHP ] == get_pcvar_num( g_pHealthMax ) )
{
ColorChat( id, NORMAL, "%s Ваша банда уже на максимальном уровне для этого навыка.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pHealthCost );

if( iRemaining < 0 )
{
ColorChat( id, NORMAL, "%s У вас недостаточно очков для этого.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

aData[ GangHP ]++;

g_iPoints[ id ] = iRemaining;
}

case 2:
{
if( aData[ GangStealing ] == get_pcvar_num( g_pStealingMax ) )
{
ColorChat( id, NORMAL, "%s Ваша банда уже на максимальном уровне для этого навыка.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pStealingCost );

if( iRemaining < 0 )
{
ColorChat( id, NORMAL, "%s У вас недостаточно очков для этого.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

aData[ GangStealing ]++;

g_iPoints[ id ] = iRemaining;
}

case 3:
{
if( aData[ GangGravity ] == get_pcvar_num( g_pGravityMax ) )
{
ColorChat( id, NORMAL, "%s Ваша банда уже на максимальном уровне для этого навыка.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pGravityCost );

if( iRemaining < 0 )
{
ColorChat( id, NORMAL, "%s У вас недостаточно очков для этого.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

aData[ GangGravity ]++;

g_iPoints[ id ] = iRemaining;
}

case 4:
{
if( aData[ GangDamage ] == get_pcvar_num( g_pDamageMax ) )
{
ColorChat( id, NORMAL, "%s Ваша банда уже на максимальном уровне для этого навыка.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pDamageCost );

if( iRemaining < 0 )
{
ColorChat( id, NORMAL, "%s У вас недостаточно очков для этого.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

aData[ GangDamage ]++;

g_iPoints[ id ] = iRemaining;
}

case 5:
{
if( aData[ GangWeaponDrop ] == get_pcvar_num( g_pWeaponDropMax ) )
{
ColorChat( id, NORMAL, "%s Ваша банда уже на максимальном уровне для этого навыка.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pWeaponDropCost );

if( iRemaining < 0 )
{
ColorChat( id, NORMAL, "%s У вас недостаточно очков для этого.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

aData[ GangWeaponDrop ]++;

g_iPoints[ id ] = iRemaining;
}

case 6:
{
if( aData[ GangStamina ] == get_pcvar_num( g_pStaminaMax ) )
{
ColorChat( id, NORMAL, "%s Ваша банда уже на максимальном уровне для этого навыка.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

new iRemaining = g_iPoints[ id ] - get_pcvar_num( g_pStaminaCost );

if( iRemaining < 0 )
{
ColorChat( id, NORMAL, "%s У вас недостаточно очков для этого.", g_szPrefix );
ShowSkillsMenu( id );
return PLUGIN_HANDLED;
}

aData[ GangStamina ]++;

g_iPoints[ id ] = iRemaining;
}
}

ArraySetArray( g_aGangs, g_iGang[ id ], aData );

new iPlayers[ 32 ], iNum, iPlayer;
new szName[ 32 ];
get_players( iPlayers, iNum );

for( new i = 0; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( iPlayer == id || g_iGang[ iPlayer ] != g_iGang[ id ] )
continue;

ColorChat( iPlayer, NORMAL, "%s ^03%s ^01Только что был повышен один навык из вашей банды.", g_szPrefix, szName );
}

ColorChat( id, NORMAL, "%s Вы успешно обновили свою банду.", g_szPrefix );

ShowSkillsMenu( id );

return PLUGIN_HANDLED;
}


public Cmd_Top10( id )
{
new iSize = ArraySize( g_aGangs );

new iOrder[ 100 ][ 2 ];

new aData[ GangInfo ];

for( new i = 0; i < iSize; i++ )
{
ArrayGetArray( g_aGangs, i, aData );

iOrder[ i ][ 0 ] = i;
iOrder[ i ][ 1 ] = aData[ GangKills ];
}

SortCustom2D( iOrder, iSize, "Top10_Sort" );

new szMessage[ 2048 ];
formatex( szMessage, charsmax( szMessage ), "<body bgcolor=#000000><font color=#FFB000><pre>" );
format( szMessage, charsmax( szMessage ), "%s%2s %-22.22s %7s %4s %10s %9s %9s %11s %8s^n", szMessage, "#", "Name", "Kills", "HP", "Stealing",
"Gravity", "Stamina", "WeaponDrop", "Damage" );

for( new i = 0; i < min( 10, iSize ); i++ )
{
ArrayGetArray( g_aGangs, iOrder[ i ][ 0 ], aData );

format( szMessage, charsmax( szMessage ), "%s%-2d %22.22s %7d %4d %10d %9d %9d %11d %8d^n", szMessage, i + 1, aData[ GangName ],
aData[ GangKills ], aData[ GangHP ], aData[ GangStealing ], aData[ GangGravity ], aData[ GangStamina], aData[ GangWeaponDrop ], aData[ GangDamage ] );
}

show_motd( id, szMessage, "Gang Top 10" );
}

public Top10_Sort( const iElement1[ ], const iElement2[ ], const iArray[ ], szData[], iSize )
{
if( iElement1[ 1 ] > iElement2[ 1 ] )
return -1;

else if( iElement1[ 1 ] < iElement2[ 1 ] )
return 1;

return 0;
}

public ShowLeaveConfirmMenu( id )
{
new hMenu = menu_create( "Ты уверен, что хочешь уйти?", "LeaveConfirmMenu_Handler" );
menu_additem( hMenu, "Да, уйти сейчас", "0" );
menu_additem( hMenu, "Нет, останусь", "1" );

menu_display( id, hMenu, 0 );
}

public LeaveConfirmMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
return PLUGIN_HANDLED;

new szData[ 6 ], iAccess, hCallback;
menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );

switch( str_to_num( szData ) )
{
case 0:
{
if( getStatus( id, g_iGang[ id ] ) == STATUS_LEADER )
{
ColorChat( id, NORMAL, "%s Вы должны передать руководство перед выходом из этой банды.", g_szPrefix );
Cmd_Gang( id );

return PLUGIN_HANDLED;
}

ColorChat( id, NORMAL, "%s Вы успешно покинул свою банду.", g_szPrefix );
set_user_gang( id, -1 );
Cmd_Gang( id );
}

case 1: Cmd_Gang( id );
}

return PLUGIN_HANDLED;
}

public ShowLeaderMenu( id )
{
new hMenu = menu_create( "Меню лидера банды", "LeaderMenu_Handler" );

new iStatus = getStatus( id, g_iGang[ id ] );

if( iStatus == STATUS_LEADER )
{
menu_additem( hMenu, "Распустить банду", "0" );
menu_additem( hMenu, "Передать лидерство", "1" );
menu_additem( hMenu, "Назначить админом", "4" );
menu_additem( hMenu, "Разжаловать админа", "5" );
}

menu_additem( hMenu, "Удалить из банды", "2" );
menu_additem( hMenu, "Изменить название банды", "3" );


menu_display( id, hMenu, 0 );
}

public LeaderMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
{
Cmd_Gang( id );
return PLUGIN_HANDLED;
}

new iAccess, hCallback, szData[ 6 ];
menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );

switch( str_to_num( szData ) )
{
case 0:
{
ShowDisbandConfirmMenu( id );
}

case 1:
{
ShowTransferMenu( id );
}

case 2:
{
ShowKickMenu( id );
}

case 3:
{
client_cmd( id, "messagemode New_Name" );
}

case 4:
{
ShowAddAdminMenu( id );
}

case 5:
{
ShowRemoveAdminMenu( id );
}
}

return PLUGIN_HANDLED;
}

public ShowDisbandConfirmMenu( id )
{
new hMenu = menu_create( "Вы уверены, что хотите распустить банду?", "DisbandConfirmMenu_Handler" );
menu_additem( hMenu, "Да, распустить сейчас", "0" );
menu_additem( hMenu, "Нет, не распускать", "1" );

menu_display( id, hMenu, 0 );
}

public DisbandConfirmMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
return PLUGIN_HANDLED;

new szData[ 6 ], iAccess, hCallback;
menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, _, _, hCallback );

switch( str_to_num( szData ) )
{
case 0:
{

ColorChat( id, NORMAL, "%s Вы успешно разогнали свою банду.", g_szPrefix );

new iPlayers[ 32 ], iNum;

get_players( iPlayers, iNum );

new iPlayer;

for( new i = 0; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( iPlayer == id )
continue;

if( g_iGang[ id ] != g_iGang[ iPlayer ] )
continue;

ColorChat( iPlayer, NORMAL, "%s Ваша банда была распушена её лидером.", g_szPrefix );
set_user_gang( iPlayer, -1 );
}

new iGang = g_iGang[ id ];

set_user_gang( id, -1 );

ArrayDeleteItem( g_aGangs, iGang );

Cmd_Gang( id );
}

case 1: Cmd_Gang( id );
}

return PLUGIN_HANDLED;
}

public ShowTransferMenu( id )
{
new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum, "e", "TERRORIST" );

new hMenu = menu_create( "Передача лидера банды:", "TransferMenu_Handler" );
new szName[ 32 ], szData[ 6 ];

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ iPlayer ] != g_iGang[ id ] || id == iPlayer )
continue;

get_user_name( iPlayer, szName, charsmax( szName ) );
num_to_str( iPlayer, szData, charsmax( szData ) );

menu_additem( hMenu, szName, szData );
}

menu_display( id, hMenu, 0 );
}

public TransferMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
{
ShowLeaderMenu( id );
return PLUGIN_HANDLED;
}

new iAccess, hCallback, szData[ 6 ], szName[ 32 ];

menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, charsmax( szName ), hCallback );

new iPlayer = str_to_num( szData );

if( !is_user_connected( iPlayer ) )
{
ColorChat( id, NORMAL, "%s Игрок не подключен.", g_szPrefix );
ShowTransferMenu( id );
return PLUGIN_HANDLED;
}

set_user_gang( iPlayer, g_iGang[ id ], STATUS_LEADER );
set_user_gang( id, g_iGang[ id ], STATUS_ADMIN );

Cmd_Gang( id );

new iPlayers[ 32 ], iNum, iTemp;
get_players( iPlayers, iNum );

for( new i = 0; i < iNum; i++ )
{
iTemp = iPlayers[ i ];

if( iTemp == iPlayer )
{
ColorChat( iTemp, NORMAL, "%s Вы новый лидер вашей банды.", g_szPrefix );
continue;
}

else if( g_iGang[ iTemp ] != g_iGang[ id ] )
continue;

ColorChat( iTemp, NORMAL, "%s ^03%s^01 - новый лидер вашей банды.", g_szPrefix, szName );
}

return PLUGIN_HANDLED;
}


public ShowKickMenu( id )
{
new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum );

new hMenu = menu_create( "Удалить игрока из банды:", "KickMenu_Handler" );
new szName[ 32 ], szData[ 6 ];


for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ iPlayer ] != g_iGang[ id ] || id == iPlayer )
continue;

get_user_name( iPlayer, szName, charsmax( szName ) );
num_to_str( iPlayer, szData, charsmax( szData ) );

menu_additem( hMenu, szName, szData );
}

menu_display( id, hMenu, 0 );
}

public KickMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
{
ShowLeaderMenu( id );
return PLUGIN_HANDLED;
}

new iAccess, hCallback, szData[ 6 ], szName[ 32 ];

menu_item_getinfo( hMenu, iItem, iAccess, szData, 5, szName, charsmax( szName ), hCallback );

new iPlayer = str_to_num( szData );

if( !is_user_connected( iPlayer ) )
{
ColorChat( id, NORMAL, "%s Игрок не подключен.", g_szPrefix );
ShowTransferMenu( id );
return PLUGIN_HANDLED;
}

set_user_gang( iPlayer, -1 );

Cmd_Gang( id );

new iPlayers[ 32 ], iNum, iTemp;
get_players( iPlayers, iNum );

for( new i = 0; i < iNum; i++ )
{
iTemp = iPlayers[ i ];

if( iTemp == iPlayer || g_iGang[ iTemp ] != g_iGang[ id ] )
continue;

ColorChat( iTemp, NORMAL, "%s ^03%s^01 был удален из банды.", g_szPrefix, szName );
}

ColorChat( iPlayer, NORMAL, "%s Вы были выкинуты из банды.", g_szPrefix, szName );

return PLUGIN_HANDLED;
}

public ChangeName_Handler( id )
{
if( g_iGang[ id ] == -1 || getStatus( id, g_iGang[ id ] ) == STATUS_MEMBER )
{
return;
}

new iGang = g_iGang[ id ];

new szArgs[ 64 ];
read_args( szArgs, charsmax( szArgs ) );

new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum );

new bool:bInGang[ 33 ];
new iStatus[ 33 ];

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ id ] != g_iGang[ iPlayer ] )
continue;

bInGang[ iPlayer ] = true;
iStatus[ iPlayer ] = getStatus( id, iGang );

set_user_gang( iPlayer, -1 );
}

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, iGang, aData );

aData[ GangName ] = szArgs;

ArraySetArray( g_aGangs, iGang, aData );

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( !bInGang[ iPlayer ] )
continue;

set_user_gang( iPlayer, iGang, iStatus[ id ] );
}
}

public ShowAddAdminMenu( id )
{
new iPlayers[ 32 ], iNum;
new szName[ 32 ], szData[ 6 ];
new hMenu = menu_create( "Выберите игрока, чтобы повысить:", "AddAdminMenu_Handler" );

get_players( iPlayers, iNum );

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ id ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) > STATUS_MEMBER )
continue;

get_user_name( iPlayer, szName, charsmax( szName ) );

num_to_str( iPlayer, szData, charsmax( szData ) );

menu_additem( hMenu, szName, szData );
}

menu_display( id, hMenu, 0 );
}

public AddAdminMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
{
menu_destroy( hMenu );
ShowLeaderMenu( id );
return PLUGIN_HANDLED;
}

new iAccess, hCallback, szData[ 6 ], szName[ 32 ];

menu_item_getinfo( hMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), hCallback );

new iChosen = str_to_num( szData );

if( !is_user_connected( iChosen ) )
{
menu_destroy( hMenu );
ShowLeaderMenu( id );
return PLUGIN_HANDLED;
}

set_user_gang( iChosen, g_iGang[ id ], STATUS_LEADER );

new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum );

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ iPlayer ] != g_iGang[ id ] || iPlayer == iChosen )
continue;

ColorChat( iPlayer, NORMAL, "%s ^03%s ^01был повышен в должности администратора вашей банды.", g_szPrefix, szName );
}

ColorChat( iChosen, NORMAL, "%s ^01Вы были повышены в должности админа вашей банды", g_szPrefix );

menu_destroy( hMenu );
return PLUGIN_HANDLED;
}

public ShowRemoveAdminMenu( id )
{
new iPlayers[ 32 ], iNum;
new szName[ 32 ], szData[ 6 ];
new hMenu = menu_create( "Выберите игрока, чтобы понизить:", "RemoveAdminMenu_Handler" );

get_players( iPlayers, iNum );

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ id ] != g_iGang[ iPlayer ] || getStatus( iPlayer, g_iGang[ iPlayer ] ) != STATUS_ADMIN )
continue;

get_user_name( iPlayer, szName, charsmax( szName ) );

num_to_str( iPlayer, szData, charsmax( szData ) );

menu_additem( hMenu, szName, szData );
}

menu_display( id, hMenu, 0 );
}

public RemoveAdminMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
{
menu_destroy( hMenu );
ShowLeaderMenu( id );
return PLUGIN_HANDLED;
}

new iAccess, hCallback, szData[ 6 ], szName[ 32 ];

menu_item_getinfo( hMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), hCallback );

new iChosen = str_to_num( szData );

if( !is_user_connected( iChosen ) )
{
menu_destroy( hMenu );
ShowLeaderMenu( id );
return PLUGIN_HANDLED;
}

set_user_gang( iChosen, g_iGang[ id ], STATUS_MEMBER );

new iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum );

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ iPlayer ] != g_iGang[ id ] || iPlayer == iChosen )
continue;

ColorChat( iPlayer, NORMAL, "%s ^03%s ^01был разжалован в должности администратора вашей банды.", g_szPrefix, szName );
}

ColorChat( iChosen, NORMAL, "%s ^01Вы были разжалованы в должности администратора вашей банды.", g_szPrefix );

menu_destroy( hMenu );
return PLUGIN_HANDLED;
}

public ShowMembersMenu( id )
{
new szName[ 64 ], iPlayers[ 32 ], iNum;
get_players( iPlayers, iNum );

new hMenu = menu_create( "Онлайн участники:", "MemberMenu_Handler" );

for( new i = 0, iPlayer; i < iNum; i++ )
{
iPlayer = iPlayers[ i ];

if( g_iGang[ id ] != g_iGang[ iPlayer ] )
continue;

get_user_name( iPlayer, szName, charsmax( szName ) );

switch( getStatus( iPlayer, g_iGang[ id ] ) )
{
case STATUS_MEMBER:
{
add( szName, charsmax( szName ), " \r[Участник]" );
}

case STATUS_ADMIN:
{
add( szName, charsmax( szName ), " \r[Админ]" );
}

case STATUS_LEADER:
{
add( szName, charsmax( szName ), " \r[Лидер]" );
}
}

menu_additem( hMenu, szName );
}

menu_display( id, hMenu, 0 );
}

public MemberMenu_Handler( id, hMenu, iItem )
{
if( iItem == MENU_EXIT )
{
menu_destroy( hMenu );
Cmd_Gang( id );
return PLUGIN_HANDLED;
}

menu_destroy( hMenu );

ShowMembersMenu( id )
return PLUGIN_HANDLED;
}

// Credits to Tirant from zombie mod and xOR from xRedirect
public LoadGangs()
{
new szConfigsDir[ 60 ];
get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );
add( szConfigsDir, charsmax( szConfigsDir ), "/jb_gangs.ini" );

new iFile = fopen( szConfigsDir, "rt" );

new aData[ GangInfo ];

new szBuffer[ 512 ], szData[ 6 ], szValue[ 6 ], i, iCurGang;

while( !feof( iFile ) )
{
fgets( iFile, szBuffer, charsmax( szBuffer ) );

trim( szBuffer );
remove_quotes( szBuffer );

if( !szBuffer[ 0 ] || szBuffer[ 0 ] == ';' )
{
continue;
}

if( szBuffer[ 0 ] == '[' && szBuffer[ strlen( szBuffer ) - 1 ] == ']' )
{
copy( aData[ GangName ], strlen( szBuffer ) - 2, szBuffer[ 1 ] );
aData[ GangHP ] = 0;
aData[ GangStealing ] = 0;
aData[ GangGravity ] = 0;
aData[ GangStamina ] = 0;
aData[ GangWeaponDrop ] = 0;
aData[ GangDamage ] = 0;
aData[ GangKills ] = 0;
aData[ NumMembers ] = 0;
aData[ GangMembers ] = _:TrieCreate();

if( TrieKeyExists( g_tGangNames, aData[ GangName ] ) )
{
new szError[ 256 ];
formatex( szError, charsmax( szError ), "[Dead-Frag.Ru] Банда уже существует: %s", aData[ GangName ] );
set_fail_state( szError );
}

ArrayPushArray( g_aGangs, aData );

TrieSetCell( g_tGangNames, aData[ GangName ], iCurGang );

log_amx( "Gang Created: %s", aData[ GangName ] );

iCurGang++;

continue;
}

strtok( szBuffer, szData, 31, szValue, 511, '=' );
trim( szData );
trim( szValue );

if( TrieGetCell( g_tGangValues, szData, i ) )
{
ArrayGetArray( g_aGangs, iCurGang - 1, aData );

switch( i )
{
case VALUE_HP:
aData[ GangHP ] = str_to_num( szValue );

case VALUE_STEALING:
aData[ GangStealing ] = str_to_num( szValue );

case VALUE_GRAVITY:
aData[ GangGravity ] = str_to_num( szValue );

case VALUE_STAMINA:
aData[ GangStamina ] = str_to_num( szValue );

case VALUE_WEAPONDROP:
aData[ GangWeaponDrop ] = str_to_num( szValue );

case VALUE_DAMAGE:
aData[ GangDamage ] = str_to_num( szValue );

case VALUE_KILLS:
aData[ GangKills ] = str_to_num( szValue );
}

ArraySetArray( g_aGangs, iCurGang - 1, aData );
}
}

new Array:aSQL;
sqlv_read_all_ex( g_hVault, aSQL );

new aVaultData[ SQLVaultEntryEx ];

new iGang;

for( i = 0; i < ArraySize( aSQL ); i++ )
{
ArrayGetArray( aSQL, i, aVaultData );

if( TrieGetCell( g_tGangNames, aVaultData[ SQLVEx_Key2 ], iGang ) )
{
ArrayGetArray( g_aGangs, iGang, aData );

TrieSetCell( aData[ GangMembers ], aVaultData[ SQLVEx_Key1 ], str_to_num( aVaultData[ SQLVEx_Data ] ) );

aData[ NumMembers ]++;

ArraySetArray( g_aGangs, iGang, aData );
}
}

fclose( iFile );
}

public SaveGangs()
{
new szConfigsDir[ 64 ];
get_configsdir( szConfigsDir, charsmax( szConfigsDir ) );

add( szConfigsDir, charsmax( szConfigsDir ), "/jb_gangs.ini" );

if( file_exists( szConfigsDir ) )
delete_file( szConfigsDir );

new iFile = fopen( szConfigsDir, "wt" );

new aData[ GangInfo ];

new szBuffer[ 256 ];

for( new i = 0; i < ArraySize( g_aGangs ); i++ )
{
ArrayGetArray( g_aGangs, i, aData );

formatex( szBuffer, charsmax( szBuffer ), "[%s]^n", aData[ GangName ] );
fputs( iFile, szBuffer );

formatex( szBuffer, charsmax( szBuffer ), "XP=%i^n", aData[ GangHP ] );
fputs( iFile, szBuffer );

formatex( szBuffer, charsmax( szBuffer ), "Деньги=%i^n", aData[ GangStealing ] );
fputs( iFile, szBuffer );

formatex( szBuffer, charsmax( szBuffer ), "Грава=%i^n", aData[ GangGravity ] );
fputs( iFile, szBuffer );

formatex( szBuffer, charsmax( szBuffer ), "Скорость=%i^n", aData[ GangStamina ] );
fputs( iFile, szBuffer );

formatex( szBuffer, charsmax( szBuffer ), "Оружие=%i^n", aData[ GangWeaponDrop ] );
fputs( iFile, szBuffer );

formatex( szBuffer, charsmax( szBuffer ), "Урон=%i^n", aData[ GangDamage ] );
fputs( iFile, szBuffer );

formatex( szBuffer, charsmax( szBuffer ), "Урона по вам=%i^n^n", aData[ GangKills ] );
fputs( iFile, szBuffer );
}

fclose( iFile );
}



set_user_gang( id, iGang, iStatus=STATUS_MEMBER )
{
new szAuthID[ 35 ];
get_user_authid( id, szAuthID, charsmax( szAuthID ) );

new aData[ GangInfo ];

if( g_iGang[ id ] > -1 )
{
ArrayGetArray( g_aGangs, g_iGang[ id ], aData );
TrieDeleteKey( aData[ GangMembers ], szAuthID );
aData[ NumMembers ]--;
ArraySetArray( g_aGangs, g_iGang[ id ], aData );

sqlv_remove_ex( g_hVault, szAuthID, aData[ GangName ] );
}

if( iGang > -1 )
{
ArrayGetArray( g_aGangs, iGang, aData );
TrieSetCell( aData[ GangMembers ], szAuthID, iStatus );
aData[ NumMembers ]++;
ArraySetArray( g_aGangs, iGang, aData );

sqlv_set_num_ex( g_hVault, szAuthID, aData[ GangName ], iStatus );
}

g_iGang[ id ] = iGang;

return 1;
}

get_user_gang( id )
{
new szAuthID[ 35 ];
get_user_authid( id, szAuthID, charsmax( szAuthID ) );

new aData[ GangInfo ];

for( new i = 0; i < ArraySize( g_aGangs ); i++ )
{
ArrayGetArray( g_aGangs, i, aData );

if( TrieKeyExists( aData[ GangMembers ], szAuthID ) )
return i;
}

return -1;
}

getStatus( id, iGang )
{
if( !is_user_connected( id ) || iGang == -1 )
return STATUS_NONE;

new aData[ GangInfo ];
ArrayGetArray( g_aGangs, iGang, aData );

new szAuthID[ 35 ];
get_user_authid( id, szAuthID, charsmax( szAuthID ) );

new iStatus;
TrieGetCell( aData[ GangMembers ], szAuthID, iStatus );

return iStatus;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Jelly
сообщение 16.2.2018, 17:41
Сообщение #2


Стаж: 7 лет 5 месяцев
Город: Красноярск

Сообщений: 202
Благодарностей: 42
Полезность: 106

Меценат Меценат

Karapuz121, не советую ставить данный плагин.
Что бы сделать под систему денежки , надо будет переписать 60% кода это в среднем , надо сделать запись в бд что бы было , а не в файл и т.д.
За такое может взяться только скриптер. Бесплатно не будут не кто делать...

Отредактировал: Jelly, - 16.2.2018, 17:42
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Karapuz121
сообщение 16.2.2018, 17:57
Сообщение #3
Стаж: 6 лет 1 месяц
Город: Гомель

Сообщений: 39
Благодарностей: 1
Полезность: 21

Цитата(Jelly @ 16.2.2018, 17:41) *
Karapuz121, не советую ставить данный плагин.
Что бы сделать под систему денежки , надо будет переписать 60% кода это в среднем , надо сделать запись в бд что бы было , а не в файл и т.д.
За такое может взяться только скриптер. Бесплатно не будут не кто делать...



А если оставить с очками, то какие плагины ещё нужны для создания банды и добычи очков??
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Jelly
сообщение 17.2.2018, 9:08
Сообщение #4


Стаж: 7 лет 5 месяцев
Город: Красноярск

Сообщений: 202
Благодарностей: 42
Полезность: 106

Меценат Меценат

Цитата(Karapuz121 @ 16.2.2018, 22:57) *
А если оставить с очками, то какие плагины ещё нужны для создания банды и добычи очков??

Даю совет что не надо вообще использовать данный плагин.
Он будет крашить сервер , спустя некоторое время.

Отредактировал: Jelly, - 17.2.2018, 9:08
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: