Русское сообщество по скриптингу

помощь с sqlvaul + Trie + array

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

помощь с sqlvaul + Trie + array

Сообщение MrLegiongame » 19 апр 2020, 18:13

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

в данном плагине данные сохраняются с помощью файла jb_gangs.ini и локальный базы SQL .

Код: Выделить всё


/* Includes */
        
        #include < amxmodx >
        #include < amxmisc >
        #include < sqlvault_ex >
        #include < cstrike >
        #include < colorchat >
        #include < hamsandwich >
        #include < fun >

    /* Defines */
    
        #define ADMIN_CREATE    ADMIN_LEVEL_B

    /* Constants */
    
        
new const g_szVersion[ ] = "1.1.2";

        
enum _:GangInfo
        
{
            
Trie:GangMembers,
            
GangName64 ],
            
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[Gang System]^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_iGang33 ];
        new 
g_iPoints33 ];
        new 
Time_putin[33][10], Time_Out[33][10];

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

        
g_tGangValues             TrieCreate();
        
g_tGangNames             TrieCreate();
        
        
g_hVault                 sqlv_open_local"jb_gangs"false );
        
sqlv_init_exg_hVault );

        
g_hPointsVault            sqlv_open_local"jb_points"true );
        
        
LoadGangs();
    }

    public 
LoadGangs()
    {
        new 
szConfigsDir60 ];
        
get_configsdirszConfigsDircharsmaxszConfigsDir ) );
        
addszConfigsDircharsmaxszConfigsDir ), "/jb_gangs.ini" );
        
        new 
iFile fopenszConfigsDir"rt" );
        
        new 
aDataGangInfo ];
        
        new 
szBuffer512 ], szData], szValue], iiCurGang;
        
        while( !
feofiFile ) )
        {
            
fgetsiFileszBuffercharsmaxszBuffer ) );
            
            
trimszBuffer );
            
remove_quotesszBuffer );
            
            if( !
szBuffer] || szBuffer] == ';' 
            {
                continue;
            }
            
            if( 
szBuffer] == '[' && szBufferstrlenszBuffer ) - ] == ']' )
            {
                
copyaDataGangName ], strlenszBuffer ) - 2szBuffer] );
                
aDataGangHP ] = 0;
                
aDataGangStealing ] = 0;
                
aDataGangGravity ] = 0;
                
aDataGangStamina ] = 0;
                
aDataGangWeaponDrop ] = 0;
                
aDataGangDamage ] = 0;
                
aDataGangKills ] = 0;
                
aDataNumMembers ] = 0;
                
aDataGangMembers ] = _:TrieCreate();
                
                if( 
TrieKeyExistsg_tGangNamesaDataGangName ] ) )
                {
                    new 
szError256 ];
                    
formatexszErrorcharsmaxszError ), "[JB Gangs] Gang already exists: %s"aDataGangName ] );
                    
set_fail_stateszError );
                }
                
                
ArrayPushArrayg_aGangsaData );
                
                
TrieSetCellg_tGangNamesaDataGangName ], iCurGang );

                
log_amx"Gang Created: %s"aDataGangName ] );
                
                
iCurGang++;
                
                continue;
            }
            
            
strtokszBufferszData31szValue511'=' );
            
trimszData );
            
trimszValue );
            
            if( 
TrieGetCellg_tGangValuesszData) )
            {
                
ArrayGetArrayg_aGangsiCurGang 1aData );
                
                switch( 
)
                {                    
                    case 
VALUE_HP:
                        
aDataGangHP ] = str_to_numszValue );
                    
                    case 
VALUE_STEALING:
                        
aDataGangStealing ] = str_to_numszValue );
                    
                    case 
VALUE_GRAVITY:
                        
aDataGangGravity ] = str_to_numszValue );
                    
                    case 
VALUE_STAMINA:
                        
aDataGangStamina ] = str_to_numszValue );
                    
                    case 
VALUE_WEAPONDROP:
                        
aDataGangWeaponDrop ] = str_to_numszValue );
                        
                    case 
VALUE_DAMAGE:
                        
aDataGangDamage ] = str_to_numszValue );
                    
                    case 
VALUE_KILLS:
                        
aDataGangKills ] = str_to_numszValue );
                }
                
                
ArraySetArrayg_aGangsiCurGang 1aData );
            }
        }
        
        new Array:
aSQL;
        
sqlv_read_all_exg_hVaultaSQL );
        
        new 
aVaultDataSQLVaultEntryEx ];
        
        new 
iGang;
        
        for( 
0ArraySizeaSQL ); i++ )
        {
            
ArrayGetArrayaSQLiaVaultData );
            
            if( 
TrieGetCellg_tGangNamesaVaultDataSQLVEx_Key2 ], iGang ) )
            {
                
ArrayGetArrayg_aGangsiGangaData );
                
                
TrieSetCellaDataGangMembers ], aVaultDataSQLVEx_Key1 ], str_to_numaVaultDataSQLVEx_Data ] ) );
                
                
aDataNumMembers ]++;
                
                
ArraySetArrayg_aGangsiGangaData );
            }
        }
        
        
fcloseiFile );
    }

    public 
SaveGangs()
    {
        new 
szConfigsDir64 ];
        
get_configsdirszConfigsDircharsmaxszConfigsDir ) );
        
        
addszConfigsDircharsmaxszConfigsDir ), "/jb_gangs.ini" );
        
        if( 
file_existsszConfigsDir ) )
            
delete_fileszConfigsDir );
            
        new 
iFile fopenszConfigsDir"wt" );
            
        new 
aDataGangInfo ];
        
        new 
szBuffer256 ];

        for( new 
0ArraySizeg_aGangs ); i++ )
        {
            
ArrayGetArrayg_aGangsiaData );
            
            
formatexszBuffercharsmaxszBuffer ), "[%s]^n"aDataGangName ] );
            
fputsiFileszBuffer );
            
            
formatexszBuffercharsmaxszBuffer ), "HP=%i^n"aDataGangHP ] );
            
fputsiFileszBuffer );
            
            
formatexszBuffercharsmaxszBuffer ), "Stealing=%i^n"aDataGangStealing ] );
            
fputsiFileszBuffer );
            
            
formatexszBuffercharsmaxszBuffer ), "Gravity=%i^n"aDataGangGravity ] );
            
fputsiFileszBuffer );
            
            
formatexszBuffercharsmaxszBuffer ), "Stamina=%i^n"aDataGangStamina ] );
            
fputsiFileszBuffer );
            
            
formatexszBuffercharsmaxszBuffer ), "WeaponDrop=%i^n"aDataGangWeaponDrop ] );
            
fputsiFileszBuffer );
            
            
formatexszBuffercharsmaxszBuffer ), "Damage=%i^n"aDataGangDamage ] );
            
fputsiFileszBuffer );
            
            
formatexszBuffercharsmaxszBuffer ), "Kills=%i^n^n"aDataGangKills ] );
            
fputsiFileszBuffer );
        }
        
        
fcloseiFile );
    }
        
        

    
set_user_gangidiGangiStatus=STATUS_MEMBER )
    {
        new 
szAuthID35 ];
        
get_user_authididszAuthIDcharsmaxszAuthID ) );

        new 
aDataGangInfo ];
        
        if( 
g_iGangid ] > -)
        {
            
ArrayGetArrayg_aGangsg_iGangid ], aData );
            
TrieDeleteKeyaDataGangMembers ], szAuthID );
            
aDataNumMembers ]--;
            
ArraySetArrayg_aGangsg_iGangid ], aData );
            
            
sqlv_remove_exg_hVaultszAuthIDaDataGangName ] );
        }

        if( 
iGang > -)
        {
            
ArrayGetArrayg_aGangsiGangaData );
            
TrieSetCellaDataGangMembers ], szAuthIDiStatus );
            
aDataNumMembers ]++;
            
ArraySetArrayg_aGangsiGangaData );
            
            
sqlv_set_num_exg_hVaultszAuthIDaDataGangName ], iStatus );        
        }

        
g_iGangid ] = iGang;
        
        return 
1;
    }
        
    
get_user_gangid )
    {
        new 
szAuthID35 ];
        
get_user_authididszAuthIDcharsmaxszAuthID ) );
        
        new 
aDataGangInfo ];
        
        for( new 
0ArraySizeg_aGangs ); i++ )
        {
            
ArrayGetArrayg_aGangsiaData );
            
            if( 
TrieKeyExistsaDataGangMembers ], szAuthID ) )
                return 
i;
        }
        
        return -
1;
    }
                
    
getStatusidiGang )
    {
        if( !
is_user_connectedid ) || iGang == -)
            return 
STATUS_NONE;
            
        new 
aDataGangInfo ];
        
ArrayGetArrayg_aGangsiGangaData );
        
        new 
szAuthID35 ];
        
get_user_authididszAuthIDcharsmaxszAuthID ) );
        
        new 
iStatus;
        
TrieGetCellaDataGangMembers ], szAuthIDiStatus );
        
        return 
iStatus;
    }
 



задача состоит в том чтобы чтобы создать функцию "исключения из гильдии".
но как можно увидеть, сохранение идёт только по STEAMID.
в моём решение, я пошёл с помощью "костылей" :
создал дополнительный файл где будут записываться Steam ID и nickname.
и произвел сравнение :

Код: Выделить всё

    
public get_all_players_idiGang name id)
    {
        new 
szConfigsDir60 ];
        
get_configsdirszConfigsDircharsmaxszConfigsDir ) );
        
addszConfigsDircharsmaxszConfigsDir ), "/jb_gangs_names.ini" );
        
        new 
iFile fopenszConfigsDir"rt" );
        new 
iStatus;
        new 
aDataGangInfo ];
        
ArrayGetArrayg_aGangsiGangaData );
        
        new 
szBuffer512 ], szData31 ], szValue31 ];
        
        while( !
feofiFile ) )
        {
            
fgetsiFileszBuffercharsmaxszBuffer ) );
            new 
0;
            
strtokszBufferszData31szValue511'=' );
            
trimszData );
            
trimszValue );
            if(
name){
            if(
TrieGetCellaDataGangMembers ], szDataiStatus ))
            {
                switch(
iStatus)
                {
                    case 
STATUS_MEMBER
                    {
                        
gang_players[i][1] = szData;
                        
gang_players[i][2] = szValue;
                        
i++;
                    }
                    case 
STATUS_ADMIN:{
                        
gang_players[i][1] = szData;
                        
gang_players[i][2] = szValue;
                        
i++;
                    }
                }
            }
            }
            else if(!
name)
            {
                
remove_useridgang_players[i][1] );
            }
            
        }
        
fcloseiFile );
    }
    
    public 
SaveGangs_names(id)
    {
        new 
szConfigsDir64 ];
        
get_configsdirszConfigsDircharsmaxszConfigsDir ) );
        
        
addszConfigsDircharsmaxszConfigsDir ), "/jb_gangs_names.ini" );
        
        if( 
file_existsszConfigsDir ) )
            
delete_fileszConfigsDir );
            
        new 
iFile fopenszConfigsDir"wt" );
            
        new 
szAuthID35 ];
        
get_user_authididszAuthIDcharsmaxszAuthID ) );
        new 
name[32];
        
get_user_name(idnamecharsmax(name));
        new 
aDataGangInfo ];
        
        new 
szBuffer256 ];
            
        
formatexszBuffercharsmaxszBuffer ), "%s = %s"szAuthID name);
        
fputsiFileszBuffer );
        
        
        
fcloseiFile );
    }
 



это одно из тестовых решений (естественно нерабочие):
Код: Выделить всё

gang_players
[i][1] = szData;
gang_players[i][2] = szValue;
 


проблемы которые возникли по ходу дела:
1)как сравнить nickname из файла и SteamID из Trie.
2) как создать меню где будут показываться все Steam ID и Ник.
3)как сделать чтобы пункт в меню возвращал не ID a SteamID .

Если кто-то сможет объяснить/помочь/предложить свои услуги(за оплату) .
буду очень благодарен :-)
Аватара пользователя
MrLegiongame
 
Сообщения: 109
Зарегистрирован: 12 июл 2016, 17:42
Благодарил (а): 32 раз.
Поблагодарили: 3 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 3