Неверно определяет булевую

Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Имеется булевая g_bSpectator, которая переключается, когда игрок заходит в наблюдатели или спавнится.

При коннекте игрока булевая переключается в true по дефолту, так-как игрок первым делом увидит мотд-окно и будем считать, что он в спектрах, до тех пор, пока не спавнится.

А магия вот в чем, продебажил эту булевую и не пойму что происходит =D

Код:
"25.01.2020 - 00:14:46" id = 21 | connect g_bSpectator = 1
"25.01.2020 - 00:14:46" id = 21 | authorized g_bSpectator = 1
"25.01.2020 - 00:14:54" id = 21 | ChooseTeam g_bSpectator = 0
"25.01.2020 - 00:14:54" id = 21 | ChooseTeam 2 g_bSpectator = 1
При connect имеем true, затем authorized тоже true, через 8 секунд я жму кнопку выбора команды за наблюдателей и она какого-то фига стала false, затем true(срабатывает условие переключения)

Со 159 строку думаю можно начать смотреть )

C++:
#include < amxmodx >
#include < amxmisc >
#include < reapi >
#include < sqlx >

#pragma loadlib sqlite

#pragma semicolon 1

new const LOGS_FOLDER_NAME[ ]                =            "online_players";            // Наименование каталога ведение журналов
new const LOGS_FILE_NAME[ ]                    =            "online_players_error";        // Наименование журналов для ведение ошибочной информации

new const SQL_DATABASE[ ]                    =            "online_players";            // Наименование базы данных
new const SQL_TABLE[ ]                        =            "online_players";            // Наименование таблицы базы данных

const ELLIPSES_ARG                            =    4;
const RESET_VALUE                            =    0;

const MAX_LENGTH__PATH                        =    64;
const MAX_LENGTH__AUTHID                    =    64;
const MAX_LENGTH__SQL_QUERY                    =    1024;
const MAX_LENGTH__TIME                        =    32;
const MAX_LENGTH__MESSAGE                    =    512;

enum _: SQL_DATA_STRUCT
{
    SQL_DATA__QUERY_TYPE,
    SQL_DATA__PLAYER_USERID,
    SQL_DATA__PLAYER_AUTHID[ MAX_LENGTH__AUTHID ]
}

enum
{
    QUERY_TYPE__TABLE_CREATE,
    QUERY_TYPE__SET_ONLINE_PLAYER,
    QUERY_TYPE__GET_ONLINE_PLAYER,
    QUERY_TYPE__UPDATE_ONLINE_PLAYER
}

enum _: SQL_TABLE_COLUMNS_ENUM
{
    SQL_TABLE_COLUMN__PLAYER_AUTHID,
    SQL_TABLE_COLUMN__TOTAL_ONLINE_PLAYER,
    SQL_TABLE_COLUMN__GAMING_ONLINE_PLAYER,
    SQL_TABLE_COLUMN__LIVE_ONLINE_PLAYER
}

new const SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMNS_ENUM ][ ] =
{
    "player_authid",
    "total_online_player",
    "gaming_online_player",
    "live_online_player"
};

new Handle: g_hSqlTuple;

new g_sLogsDir[ MAX_LENGTH__PATH ];
new g_sSqlQuery[ MAX_LENGTH__SQL_QUERY ];

new g_iPlTotalOnline[ MAX_PLAYERS + 1 ];
new g_iPlGamingOnline[ MAX_PLAYERS + 1 ];
new g_iPlLiveOnline[ MAX_PLAYERS + 1 ];

new g_iCachePlGamingOnline[ MAX_PLAYERS + 1 ];

new g_bAuthPlayer[ MAX_PLAYERS + 1 ];

new g_eSqlData[ SQL_DATA_STRUCT ];

new bool: g_bSpectator[ MAX_PLAYERS + 1 ];

public plugin_init( )
{
    register_plugin( "Online Players", "1.0", "Javekson" );
   
    RegisterHookChain( RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", .post = true );
    //RegisterHookChain( RG_CBasePlayer_Killed, "CBasePlayer_Killed", .post = true );
    RegisterHookChain( RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam", .post = true );
}

public plugin_cfg( )
{
    get_localinfo( "amxx_logs", g_sLogsDir, charsmax( g_sLogsDir ) );
   
    formatex( g_sLogsDir, charsmax( g_sLogsDir ), "%s/%s", g_sLogsDir, LOGS_FOLDER_NAME );
   
    if( !dir_exists( g_sLogsDir ) )
    {
        mkdir( g_sLogsDir );
    }
   
    SQL_SetAffinity( "sqlite" );
   
    g_hSqlTuple = SQL_MakeDbTuple( "", "", "", SQL_DATABASE );
   
    func_SqlQueryTableCreate( );
}

public client_connect( id )
{
    g_bAuthPlayer[ id ] = false;
   
    g_bSpectator[ id ] = true;
   
    g_iPlTotalOnline[ id ] = RESET_VALUE;
    g_iPlGamingOnline[ id ] = RESET_VALUE;
    g_iPlLiveOnline[ id ] = RESET_VALUE;
   
    func_Logging( g_sLogsDir, "debug", "id = %d | connect g_bSpectator = %d", id, g_bSpectator[ id ] );
   
    return PLUGIN_CONTINUE;
}

public client_authorized( id, const sAuthID[ ] )
{
    if( is_user_bot( id ) || is_user_hltv( id ) )
    {
        return PLUGIN_CONTINUE;
    }
   
    g_bAuthPlayer[ id ] = true;
   
    func_SqlQueryGetOnlinePlayer( id, sAuthID );
   
    func_Logging( g_sLogsDir, "debug", "id = %d | authorized g_bSpectator = %d", id, g_bSpectator[ id ] );
   
    return PLUGIN_CONTINUE;
}

public client_disconnected( id )
{
    if( is_user_bot( id ) || is_user_hltv( id ) )
    {
        return PLUGIN_CONTINUE;
    }
   
    if( g_bAuthPlayer[ id ] )
    {
        new sAuthID[ MAX_LENGTH__AUTHID ];
        get_user_authid( id, sAuthID, charsmax( sAuthID ) );
       
        func_SqlQueryUpdateOnlinePlayer( id, sAuthID );
    }
   
    return PLUGIN_CONTINUE;
}

public CBasePlayer_Spawn( const id )
{
    if( g_bSpectator[ id ] )
    {
        g_bSpectator[ id ] = false;
       
        g_iCachePlGamingOnline[ id ] = get_user_time( id );
    }
}

public HandleMenu_ChooseTeam( const id, const MenuChooseTeam: iTeam )
{
    func_Logging( g_sLogsDir, "debug", "id = %d | ChooseTeam g_bSpectator = %d", id, g_bSpectator[ id ] );
   
    switch( iTeam )
    {
        case MenuChoose_CT:
        {
            return;
        }
       
        case MenuChoose_T:
        {
            return;
        }
       
        case MenuChoose_Spec:
        {
            if( !g_bSpectator[ id ] )
            {
                g_iPlGamingOnline[ id ] += get_user_time( id ) - g_iCachePlGamingOnline[ id ];
               
                g_bSpectator[ id ] = true;
            }
           
            func_Logging( g_sLogsDir, "debug", "id = %d | ChooseTeam 2 g_bSpectator = %d", id, g_bSpectator[ id ] );
           
            client_print_color( 0, 0, "g_iPlGamingOnline[ id ] = %d", g_iPlGamingOnline[ id ] );
        }
    }
}

func_SqlQueryTableCreate( )
{
    formatex( g_sSqlQuery, charsmax( g_sSqlQuery ),
        "CREATE TABLE IF NOT EXISTS `%s` ( \
        `%s` TEXT NOT NULL PRIMARY KEY ASC, \
        `%s` INTEGER NOT NULL, \
        `%s` INTEGER NOT NULL, \
        `%s` INTEGER NOT NULL )",
       
        SQL_TABLE,
       
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__PLAYER_AUTHID ],
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__TOTAL_ONLINE_PLAYER ],
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__GAMING_ONLINE_PLAYER ],
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__LIVE_ONLINE_PLAYER ]
    );
   
    func_MakeSqlQuery( QUERY_TYPE__TABLE_CREATE );
}

func_SqlQueryGetOnlinePlayer( const id, const sAuthID[ ] )
{
    formatex( g_sSqlQuery, charsmax( g_sSqlQuery ),
        "SELECT * FROM `%s` WHERE `%s` = '%s'",
        SQL_TABLE, SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__PLAYER_AUTHID ], sAuthID
    );
   
    g_eSqlData[ SQL_DATA__PLAYER_USERID ] = get_user_userid( id );
   
    copy( g_eSqlData[ SQL_DATA__PLAYER_AUTHID ], charsmax( g_eSqlData[ SQL_DATA__PLAYER_AUTHID ] ), sAuthID );
   
    func_MakeSqlQuery( QUERY_TYPE__GET_ONLINE_PLAYER );
}

func_SqlQuerySetOnlinePlayer( const id, const sAuthID[ ] )
{
    formatex( g_sSqlQuery, charsmax( g_sSqlQuery ),
        "INSERT INTO `%s` ( `%s`, `%s`, `%s`, `%s` ) \
        VALUES ( '%s', %d, %d, %d )",
       
        SQL_TABLE,
       
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__PLAYER_AUTHID ],
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__TOTAL_ONLINE_PLAYER ],
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__GAMING_ONLINE_PLAYER ],
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__LIVE_ONLINE_PLAYER ],
       
        sAuthID,
        g_iPlTotalOnline[ id ],
        g_iPlGamingOnline[ id ],
        g_iPlLiveOnline[ id ]
    );
   
    func_MakeSqlQuery( QUERY_TYPE__SET_ONLINE_PLAYER );
}

func_SqlQueryUpdateOnlinePlayer( const id, const sAuthID[ ] )
{
    formatex( g_sSqlQuery, charsmax( g_sSqlQuery ),
        "UPDATE `%s` SET `%s` = %d, `%s` = %d, `%s` = %d WHERE `%s` = '%s'",
       
        SQL_TABLE,
       
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__TOTAL_ONLINE_PLAYER ],
        g_iPlTotalOnline[ id ],
       
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__GAMING_ONLINE_PLAYER ],
        g_iPlGamingOnline[ id ],
       
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__LIVE_ONLINE_PLAYER ],
        g_iPlLiveOnline[ id ],
       
        SQL_TABLE_COLUMNS[ SQL_TABLE_COLUMN__PLAYER_AUTHID ],
       
        sAuthID
    );
   
    func_MakeSqlQuery( QUERY_TYPE__UPDATE_ONLINE_PLAYER );
}

public handler_SqlQuery( iFailState, Handle: hQueryHandle, sError[ ], iErrorCode, eSqlData[ ], iDataSize, Float: fQueryTime )
{
    if( iFailState != TQUERY_SUCCESS )
    {
        SQL_GetQueryString( hQueryHandle, g_sSqlQuery, charsmax( g_sSqlQuery ) );
       
        func_Logging( g_sLogsDir, LOGS_FILE_NAME, "^"[SQL] Query error^"" );
        func_Logging( g_sLogsDir, LOGS_FILE_NAME, "^"[SQL] Error^" ^"#%d^", ^"%s^"", iErrorCode, sError );
        func_Logging( g_sLogsDir, LOGS_FILE_NAME, "^"[SQL] Query^" ^"%s^"", g_sSqlQuery );
       
        return PLUGIN_CONTINUE;
    }
   
    switch( eSqlData[ SQL_DATA__QUERY_TYPE ] )
    {
        case QUERY_TYPE__TABLE_CREATE:
        {
            return PLUGIN_CONTINUE;
        }
       
        case QUERY_TYPE__GET_ONLINE_PLAYER:
        {
            new iPlUserID = eSqlData[ SQL_DATA__PLAYER_USERID ];
           
            new iPlayerID = func_FindPlayerID( iPlUserID );
           
            if( iPlayerID )
            {
                if( SQL_MoreResults( hQueryHandle ) )
                {
                    g_iPlTotalOnline[ iPlayerID ] = SQL_ReadResult( hQueryHandle, 1 );
                    g_iPlGamingOnline[ iPlayerID ] = SQL_ReadResult( hQueryHandle, 2 );
                    g_iPlLiveOnline[ iPlayerID ] = SQL_ReadResult( hQueryHandle, 3 );
                }
                else
                {
                    new sAuthID[ MAX_LENGTH__AUTHID ];
                    copy( sAuthID, charsmax( sAuthID ), eSqlData[ SQL_DATA__PLAYER_AUTHID ] );
                   
                    func_SqlQuerySetOnlinePlayer( iPlayerID, sAuthID );
                }
            }
        }
       
        case QUERY_TYPE__SET_ONLINE_PLAYER:
        {
            return PLUGIN_CONTINUE;
        }
       
        case QUERY_TYPE__UPDATE_ONLINE_PLAYER:
        {
            return PLUGIN_CONTINUE;
        }
    }
   
    return PLUGIN_CONTINUE;
}

stock func_FindPlayerID( const iPlUserID )
{
    new aPlayersID[ MAX_PLAYERS ], iPlCount;
    get_players_ex( aPlayersID, iPlCount, GetPlayers_IncludeConnecting | GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV );
   
    new iPlayerID;
   
    for( new i; i < iPlCount; i++ )
    {
        iPlayerID = aPlayersID[ i ];
       
        if( get_user_userid( iPlayerID ) == iPlUserID )
        {
            break;
        }
    }
   
    return iPlayerID;
}

stock func_MakeSqlQuery( iQueryType )
{
    g_eSqlData[ SQL_DATA__QUERY_TYPE ] = iQueryType;
   
    SQL_ThreadQuery( g_hSqlTuple, "handler_SqlQuery", g_sSqlQuery, g_eSqlData, sizeof( g_eSqlData ) );
}

stock func_Logging( const sLogsDir[ ], const sFileName[ ], const sMessage[ ], any:... )
{
    new sFmtMsg[ MAX_LENGTH__MESSAGE ];
    vformat( sFmtMsg, charsmax( sFmtMsg ), sMessage, ELLIPSES_ARG );
   
    new sFileTime[ MAX_LENGTH__TIME ];
    get_time( "%m.%Y", sFileTime, charsmax( sFileTime ) );
   
    new sLogFile[ MAX_LENGTH__PATH + 32 ];
    formatex( sLogFile, charsmax( sLogFile ), "%s/%s_%s.log", sLogsDir, sFileName, sFileTime );
   
    new iFileID = fopen( sLogFile, "at" );
   
    new sRecordTime[ MAX_LENGTH__TIME ];
    get_time( "%d.%m.%Y - %H:%M:%S", sRecordTime, charsmax( sRecordTime ) );
   
    fprintf( iFileID, "^"%s^" %s^n", sRecordTime, sFmtMsg );
   
    fclose( iFileID );
}
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Подключившийся не спектатор ещё, а UNASSIGNED
24 Янв 2020
Спавн игрока - спавн и спектатора. Проверка на жи ли подойдет.
24 Янв 2020
Да и какой смысл от булевой? Проверяй команду.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Javekson, спавн будет вызван и на наблюдателе, в тот момент ты и сетаешь 0, да и согласен с fl0wer. В чем проблема чекать мембер m_iTeam
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fantom, я сейчас не совсем понимаю, где именно то чекать имеете ввиду?
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Javekson, зависит от задачи.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fl0wer, не учитывать онлайн зрителей, лишь самого игрового процесса
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Javekson, public HandleMenu_ChooseTeam( const id, const MenuChooseTeam: iTeam )
тут всё сделать можно.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fantom, Да и собственно, почему это так работает вообще? "спавн будет вызван и на наблюдателе "
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Никогда не думал, что такое может быть, ладно ) Спавн вызвался до putinservera даже )

Код:
"25.01.2020 - 11:59:12" id = 21 | connect g_bSpectator = 1
"25.01.2020 - 11:59:12" id = 21 | authorized g_bSpectator = 1
"25.01.2020 - 11:59:13" id = 21 | Spawn g_bSpectator = 1
"25.01.2020 - 11:59:13" id = 21 | putinserver g_bSpectator = 1
"25.01.2020 - 12:00:28" id = 21 | ChooseTeam g_bSpectator = 1
Тут дело в том, что игрок может провисеть на мотд-окне минут 5, поэтому что бы начать отсчет игрового времени мне один фиг нужно чекать спавн игрока, поэтому, проверка на жив ли при спавне подойдет, как ты и сказал fl0wer, я просто не сразу понял тебя, затем соответственно при переходе в спектры, останавливаем подсчет и сохраняем.
 

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
shadow, во всяком случае залогировался спавн раньше
25 Янв 2020
Я же правильно понимаю, что при первом спавне(коннекте) можно чекать и m_bTeamChanged, и m_iTeam = UNASSIGNED и обычный is_user_alive ?
 

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
shadow, ну да, я так и понял, m_bTeamChanged переключается в true когда происходит выбор команды, значит вместо is_user_alive при спавне можно просто чекнуть m_bTeamChanged, если правильно понимаю
 
Сообщения
141
Реакции
201
Помог
5 раз(а)
123
 
Последнее редактирование:
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
juice, m_iJoiningState тоже подойдет, m_iTeam будет UNASSIGNED вроде в этот момент, куча вариантов короче )
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу