Вывод игроков на сайт.Нужна помощь

Diversant

Участник
Сообщения
9
Реакции
0
Здравствуйте подскажите как вывести на сайт Ники; Счет; игроков counter-strike source
Вывод информации сервера сделал а вот как информацию о игроках не могу
Сам Код:

PHP:
<?php
use xPaw\SourceQuery\SourceQuery;

if ( !$cfg["server"]["enable"] )
{
    $tpl->SetResult( 'server', "<b>Статус серверов временно не доступен</b>" );
}
else {
    $mod_server = $controller->GetCache( 'mod_server' );
    
define( 'SQ_TIMEOUT',     1 );
define( 'SQ_ENGINE',      SourceQuery::SOURCE );

$Query = new SourceQuery();
$information = array();
$info_players = Array( );

$db->gdb( 1 );

    $servers = $gdb[1]->query("SELECT * FROM `servers`");
    if ($servers){
        foreach($servers as $info){
        $Query->Connect($info['ip'], $info['port'], SQ_TIMEOUT, SQ_ENGINE);
        foreach ($Query->GetInfo() as $infoKey => $infoValue) {
            $information[$infoKey] = $infoValue;
        }

        $information['GameIp'] = $info['ip'];
        $information['Online'] = round($information['Players']*100/$information['MaxPlayers']);

        $name_server = $information['HostName'];
        $map_name = $information['Map'];
        $players = $information['Players'];
        $max_players = $information['MaxPlayers'];
        

        if ($information['Secure'] == 1){
            $secure = "<b><font color='0cff03'>Включен</font></b>";
        }else {
            $secure = "<b><font color='FF0000'>Выключен</font></b>";
        }
        
        if (strpos($map_name, 'workshop') !== false) {
            $arr = explode('/', $map_name);
            $map_file = $arr[2] . '.jpg';
        } else {
            $map_file = $map_name . '.jpg';
        }
        $information['Image'] = (file_exists('/templates/default/img/maps/' . $map_file)) ? $map_file : 'de_dust2.jpg';
        
    }

}
                                
$tpl->SetResult('server', '<table class="table table-striped table-bordered table-hover">
<tbody><tr></tr>
<tr>
<td><div class="slider-item" style="background-image: url(./templates/default/img/maps/'.$information['Image'].')"><b><font color="6495ED">'.$name_server.'</font></b></div></td>
<td>Карта: '.$map_name.' <br>
Играков: '.$players.'/'.$max_players.'<br>                               
Статус: '.$secure.'

<div class="slider-item-play">
    <a href="steam://connect/'.$info['ip'].':'.$info['port'].'"><button>Играть</button></a>
</div>
</td>
<td><center><u><b>Игроки</b></u></center><br>В Доработке!</td>
</tr></tbody>
</table>' );

}

?>
 

xtance

Участник
Сообщения
513
Реакции
743
Можно сделать свой костыль, отдающий информацию об игроках, так как инфа отдаваемая сервером не очень полезна:

PHP:
            $p = $query->Rcon("sm_web_getplayers");
            $pieces = explode("ArrayEnd", $p);
            $arr = str_replace(",\n]","]",$pieces[0]);
            $players = json_decode($arr, true);

            array_multisort(array_column($players, 'k'), SORT_DESC, $players);
            foreach ($players as $key => $player){
                echo '[' . $player['k'] . ' / ' . $player['d'] . '] - ' . $player['name']; //простейший вывод инфы - лучше всё же создать таблицу или что-нибудь ещё
            }

+ сделать плагин на сервере, который бы в ответ на эту команду (sm_web_getplayers) или любую другую просто выплёвывал информацию в консоль сервера (SourceQuery ее автоматом подберёт)

C-подобный:
char sName[MAXPLAYERS+1][64];

public void OnPluginStart()
{
    RegServerCmd("sm_web_getplayers", Action_Web_GetPlayers, "Получает массив с игроками - не трогать");
}

public Action Action_Web_GetPlayers(int iArgs){
    PrintToServer("[");
    for (int i = 1; i<=MaxClients; i++){
        if (IsClientInGame(i) && !IsFakeClient(i)){
            PrintToServer("{\"name\": \"%s\", \"k\": %i, \"d\": %i},",sName[i],GetClientFrags(i),GetClientDeaths(i)); //просто пример.
        }
    }
    PrintToServer("]ArrayEnd");
    return Plugin_Handled;
}

public void OnClientPostAdminCheck(int iClient) {
    if (IsClientInGame(iClient) && !IsFakeClient(iClient)){
        GetClientName(iClient, sName[iClient], sizeof(sName[]));
        ReplaceString(sName[iClient], sizeof(sName[]), "\\", "", false);
        ReplaceString(sName[iClient], sizeof(sName[]), "\"", "", false);
        ReplaceString(sName[iClient], sizeof(sName[]), "&", "%26", false);
    }
}

Таким образом можно получать любую инфу об игроках, лишь бы ее отдавал плагин. (Ну например, стимайди, время игры, да хоть текущую команду игрока)
Весь код нагло взят из chat2vk
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Здравствуйте подскажите как вывести на сайт Ники; Счет; игроков counter-strike source
Вывод информации сервера сделал а вот как информацию о игроках не могу
Сам Код:

PHP:
<?php
use xPaw\SourceQuery\SourceQuery;

if ( !$cfg["server"]["enable"] )
{
    $tpl->SetResult( 'server', "<b>Статус серверов временно не доступен</b>" );
}
else {
    $mod_server = $controller->GetCache( 'mod_server' );
 
define( 'SQ_TIMEOUT',     1 );
define( 'SQ_ENGINE',      SourceQuery::SOURCE );

$Query = new SourceQuery();
$information = array();
$info_players = Array( );

$db->gdb( 1 );

    $servers = $gdb[1]->query("SELECT * FROM `servers`");
    if ($servers){
        foreach($servers as $info){
        $Query->Connect($info['ip'], $info['port'], SQ_TIMEOUT, SQ_ENGINE);
        foreach ($Query->GetInfo() as $infoKey => $infoValue) {
            $information[$infoKey] = $infoValue;
        }

        $information['GameIp'] = $info['ip'];
        $information['Online'] = round($information['Players']*100/$information['MaxPlayers']);

        $name_server = $information['HostName'];
        $map_name = $information['Map'];
        $players = $information['Players'];
        $max_players = $information['MaxPlayers'];
     

        if ($information['Secure'] == 1){
            $secure = "<b><font color='0cff03'>Включен</font></b>";
        }else {
            $secure = "<b><font color='FF0000'>Выключен</font></b>";
        }
     
        if (strpos($map_name, 'workshop') !== false) {
            $arr = explode('/', $map_name);
            $map_file = $arr[2] . '.jpg';
        } else {
            $map_file = $map_name . '.jpg';
        }
        $information['Image'] = (file_exists('/templates/default/img/maps/' . $map_file)) ? $map_file : 'de_dust2.jpg';
     
    }

}
                             
$tpl->SetResult('server', '<table class="table table-striped table-bordered table-hover">
<tbody><tr></tr>
<tr>
<td><div class="slider-item" style="background-image: url(./templates/default/img/maps/'.$information['Image'].')"><b><font color="6495ED">'.$name_server.'</font></b></div></td>
<td>Карта: '.$map_name.' <br>
Играков: '.$players.'/'.$max_players.'<br>                            
Статус: '.$secure.'

<div class="slider-item-play">
    <a href="steam://connect/'.$info['ip'].':'.$info['port'].'"><button>Играть</button></a>
</div>
</td>
<td><center><u><b>Игроки</b></u></center><br>В Доработке!</td>
</tr></tbody>
</table>' );

}

?>

PHP:
$player_list = $Query->GetPlayers();
Вернёт массив с игроками на сервере.

@⚡xlittlemermaid, реализация через RCON не лучшая идея.
 

xtance

Участник
Сообщения
513
Реакции
743
@Primo, да, ну зато можно больше чего получить и данные будут настоящими (помню для кс:го сервер отдаёт не кол-во фрагов, а кол-во очков, что странно)
p.s. - наверно полезная ссылка для этой темы Server queries - Valve Developer Community
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
@Primo, да, ну зато можно больше чего получить и данные будут настоящими (помню для кс:го сервер отдаёт не кол-во фрагов, а кол-во очков, что странно)
p.s. - наверно полезная ссылка для этой темы Server queries - Valve Developer Community
Зато время ответа через RCON будет ощутимо больше.
Сообщения автоматически склеены:

А вообще. Я бы сделал отправку данных в бд, либо с помощью REST in Pawn
 
Последнее редактирование:
Сверху Снизу