Общий онлайн в SourceBans

romchik4021

Участник
Сообщения
42
Реакции
15
Недавно я задался вопросом, как вывести общий онлайн и количество слотов со всех серверов в SourceBans?
Например: "Общее количество игроков на наших серверах: 70/150"

Не понимаю, как сложить игроков и слоты со всех серверов в базе.
В файле /includes/sb-callback.php есть функция которая выводит данные игроков на сервере:
PHP:
function ServerHostPlayers($sid, $type="servers", $obId="", $tplsid="", $open="", $inHome=false, $trunchostname=48)
{
    $objResponse = new xajaxResponse();
    global $userbank;
    require INCLUDES_PATH.'/CServerInfo.php';
   
    $sid = (int)$sid;

    $res = $GLOBALS['db']->GetRow("SELECT sid, ip, port FROM ".DB_PREFIX."_servers WHERE sid = $sid");
    if(empty($res[1]) || empty($res[2]))
        return $objResponse;
    $info = array();
    $sinfo = new CServerInfo($res[1],$res[2]);
    $info = $sinfo->getInfo();
    if($type == "servers")
    {
        if(!empty($info['hostname']))
        {
            $objResponse->addAssign("host_$sid", "innerHTML", trunc($info['hostname'], $trunchostname, false));
            $objResponse->addAssign("players_$sid", "innerHTML", "<center>(" . $info['numplayers'] . "/" . $info['maxplayers'] . ")</center>");
            $objResponse->addAssign("procentplayers_$sid", "innerHTML", "[" . round($info['numplayers'] / $info['maxplayers'] * 100, 0, PHP_ROUND_HALF_DOWN) . "%]");
            $objResponse->addAssign("os_$sid", "innerHTML", "<img src='images/bage-available.png' title='[Online] Сервер активен! Можно играть!'>");
            if( $info['secure'] == 1 )
            {
                $objResponse->addAssign("vac_$sid", "innerHTML", "<img src='images/shield.png' width=\"28\" align=\"absmiddle\">");
                $objResponse->addAssign("vacv_$sid", "innerHTML", "<img src='images/playserver.png' width=\"28\" align=\"absmiddle\">");
            }
            $objResponse->addAssign("map_$sid", "innerHTML", $info['map']);
            if(!$inHome) {
                $objResponse->addScript("$('mapimg_$sid').setProperty('src', '".GetMapImage($info['map'])."').setProperty('alt', '".$info['map']."').setProperty('title', '".$info['map']."');");
                if($info['numplayers'] == 0 || empty($info['numplayers']))
                {
                    $objResponse->addScript("$('sinfo_$sid').setStyle('display', 'none');");
                    $objResponse->addScript("$('noplayer_$sid').setStyle('display', 'block');");
                    $objResponse->addScript("$('serverwindow_$sid').setStyle('height', '64px');");
                } else {
                    $objResponse->addScript("$('sinfo_$sid').setStyle('display', 'block');");
                    $objResponse->addScript("$('noplayer_$sid').setStyle('display', 'none');");
                    if(!defined('IN_HOME')) {
                        $players = $sinfo->getPlayers();
                        // remove childnodes
                        $objResponse->addScript('var toempty = document.getElementById("playerlist_'.$sid.'");
                        var empty = toempty.cloneNode(false);
                        toempty.parentNode.replaceChild(empty,toempty);');
                        //draw table headlines
                        $objResponse->addScript('var e = document.getElementById("playerlist_'.$sid.'");
                        var tr = e.insertRow("-1");
                            // Name Top TD
                            var td = tr.insertCell("-1");
                                td.setAttribute("width","45%");
                                td.setAttribute("height","16");
                                td.className = "listtable_top";
                                    var b = document.createElement("b");
                                    var txt = document.createTextNode("Ник");
                                    b.appendChild(txt);
                                td.appendChild(b);
                            // Score Top TD
                            var td = tr.insertCell("-1");
                                td.setAttribute("width","10%");
                                td.setAttribute("height","16");
                                td.className = "listtable_top";
                                    var b = document.createElement("b");
                                    var txt = document.createTextNode("Очки");
                                    b.appendChild(txt);
                                td.appendChild(b);
                            // Time Top TD
                            var td = tr.insertCell("-1");
                                td.setAttribute("height","16");
                                td.className = "listtable_top";
                                    var b = document.createElement("b");
                                    var txt = document.createTextNode("Время игры");
                                    b.appendChild(txt);
                                td.appendChild(b);');
                        // add players
                        $playercount = 0;
                        foreach($players AS $player) {
                            $objResponse->addScript('var e = document.getElementById("playerlist_'.$sid.'");
                                                    var tr = e.insertRow("-1");
                                                    tr.className="tbl_out";
                                                    tr.onmouseout = function(){this.className="tbl_out"};
                                                    tr.onmouseover = function(){this.className="tbl_hover"};
                                                    tr.id = "player_s'.$sid.'p'.$player["index"].'";
                                                        // Name TD
                                                        var td = tr.insertCell("-1");
                                                            td.className = "listtable_1";
                                                            var txt = document.createTextNode("'.$player["name"].'");
                                                            td.appendChild(txt);
                                                        // Score TD
                                                        var td = tr.insertCell("-1");
                                                            td.className = "listtable_1";
                                                            var txt = document.createTextNode("'.$player["kills"].'");
                                                            td.appendChild(txt);
                                                        // Time TD
                                                        var td = tr.insertCell("-1");
                                                            td.className = "listtable_1";
                                                            var txt = document.createTextNode("'.$player["time"].'");
                                                            td.appendChild(txt);
                                                        ');
                            if($userbank->HasAccess(ADMIN_OWNER|ADMIN_ADD_BAN)) {
                                $objResponse->addScript('AddContextMenu("#player_s'.$sid.'p'.$player["index"].'", "contextmenu", true, "|Админ-меню|", [
                                                        {name: "Кикнуть", callback: function(){KickPlayerConfirm("'.$sid.'", "'.$player["name"].'", 0);}},
                                                        {name: "Забанить", callback: function(){window.location = "index.php?p=admin&c=bans&action=pasteBan&sid='.$sid.'&pName='.$player["name"].'"}},
                                                        {name: "Выкл микро/чат", callback: function(){window.location = "index.php?p=admin&c=comms&action=pasteBan&sid='.$sid.'&pName='.str_replace('"', '\"', $player["name"]).'"}},
                                                        {separator: true},
                                                        '.(ini_get('safe_mode')==0 ? '{name: "Профиль в Steam", callback: function(){ViewCommunityProfile("'.$sid.'", "'.$player["name"].'")}},':'').'
                                                        {name: "Отправить сообщение", callback: function(){OpenMessageBox("'.$sid.'", "'.$player["name"].'", "1")}}
                                                        ]);');
                            }
                            $playercount++;
                        }
                    }
                    if($playercount>15)
                        $height = 329 + 16 * ($playercount-15) + 4 * ($playercount-15) . "px";
                    else
                        $height = 329 . "px";
                    $objResponse->addScript("$('serverwindow_$sid').setStyle('height', '".$height."');");
                }
            }
        }else{
            $objResponse->addAssign("host_$sid", "innerHTML", "<font color=#999999>Тех-работы на сервере ::{" . $res[1] . ":" . $res[2]. "}::</font>");
            $objResponse->addAssign("players_$sid", "innerHTML", "<center><font color=#999999>...</font></center>");
            $objResponse->addAssign("os_$sid", "innerHTML", "<img src='images/bage-busy.png' title='[Offline] К сожалению сервер временно не доступен (возможно на нем ведутся тех.работы)'>");
            $objResponse->addAssign("vac_$sid", "innerHTML", "<center><font color=#999999>...</font></center>");
            $objResponse->addAssign("vacv_$sid", "innerHTML", "<center><font color=#999999>...</font></center>");
            $objResponse->addAssign("map_$sid", "innerHTML", "<center><font color=#999999>...</font></center>");
            if(!$inHome) {
                $connect = "onclick = \"document.location = 'steam://connect/" .  $res['ip'] . ":" . $res['port'] . "'\"";
                $objResponse->addScript("$('sinfo_$sid').setStyle('display', 'none');");
                $objResponse->addScript("$('noplayer_$sid').setStyle('display', 'block');");
                $objResponse->addScript("$('serverwindow_$sid').setStyle('height', '64px');");
                $objResponse->addScript("if($('sid_$sid'))$('sid_$sid').setStyle('color', '#adadad');");
            }
        }
        if($tplsid != "" && $open != "" && $tplsid==$open)
            $objResponse->addScript("InitAccordion('tr.opener', 'div.opener', 'mainwrapper', '".$open."');");
        $objResponse->addScript("$('dialog-control').setStyle('display', 'block');");
        $objResponse->addScript("$('dialog-placement').setStyle('display', 'none');");
    }
    elseif($type=="id")
    {
        if(!empty($info['hostname']))
        {
            $objResponse->addAssign("$obId", "innerHTML", trunc($info['hostname'], $trunchostname, false));
        }else{
            $objResponse->addAssign("$obId", "innerHTML", "<b>Проблемы со связью</b> (<i>" . $res[1] . ":" . $res[2]. "</i>)");
        }
    }
    else
    {
        if(!empty($info['hostname']))
        {
            $objResponse->addAssign("ban_server_$type", "innerHTML", trunc($info['hostname'], $trunchostname, false));
        }else{
            $objResponse->addAssign("ban_server_$type", "innerHTML", "<b>Нет соединения</b> (<i>" . $res[1] . ":" . $res[2]. "</i>)");
        }
    }
    return $objResponse;
}
а конкретно строчка:
PHP:
$objResponse->addAssign("players_$sid", "innerHTML", "<center>(" . $info['numplayers'] . "/" . $info['maxplayers'] . ")</center>");

Она отвечает за вывод игроков/слотов на конкретном сервере. Как сложить переменные $info['numplayers'] и $info['maxplayers'] со всех серверов, которые есть в базе? Знающие люди, помогите пожалуйста.
 

AS TRO

Участник
Сообщения
1,159
Реакции
750
@romchik4021, в чем проблема создать переменную(как глобальную и как) и в функции где идет получение количества игроков у сервера тупо ее складывать? А потом вывести
--- Добавлено позже ---
Кстати, я что-то подобное пытался сделать, что что-то не особо вышло) но я тогда по другому методу делал)
 

romchik4021

Участник
Сообщения
42
Реакции
15
@romchik4021, в чем проблема создать переменную(как глобальную и как) и в функции где идет получение количества игроков у сервера тупо ее складывать? А потом вывести
--- Добавлено позже ---
Кстати, я что-то подобное пытался сделать, что что-то не особо вышло) но я тогда по другому методу делал)
К сожалению я не на столько хорошо знаю php :ac:
 

AS TRO

Участник
Сообщения
1,159
Реакции
750
@romchik4021, к сожаления у меня нету пк под рукой, так бы помог. Ты бы в вк мне маякнул, чтобы я не забыл) помогу)
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #5
СБ какой? 1.4.11, 1.5.4.7 или от Онотоле?
--- Добавлено позже ---
Набросал, впринципе, вариант, который должен работать на любой версии СБ. Он не без изъянов (делает лишнюю нагрузку на БД и на сервера), но работает.

1. Открываем файл includes/sb-callback.php и находим строчку:
PHP:
$xajax->registerFunction("ServerHostPlayers");
После неё добавляем:
PHP:
$xajax->registerFunction("SumOnline");
Ищем строку:
PHP:
function ServerHostPlayers($sid, $type="servers", $obId="", $tplsid="", $open="", $inHome=false, $trunchostname=48)
Добавляем перед ней:
PHP:
function SumOnline($obIdCurrPlayers, $obIdMaxPlayers, $obPropCurrPlayers, $obPropMaxPlayers) {
    require INCLUDES_PATH.'/CServerInfo.php';
    $objResponse = new xajaxResponse();

    $playersMax = 0;
    $playersOnline = 0;
    $servers = $GLOBALS['db']->GetAll(sprintf("SELECT ip, port FROM %s_servers", DB_PREFIX));
    foreach ($servers as $server) {
        $srvSock = new CServerInfo($server["ip"], $server["port"]);
        $srvInfo = $srvSock->getInfo();
        if (empty($srvInfo['hostname'])) continue;
        $playersMax += $srvInfo['maxplayers'];
        $playersOnline += $srvInfo['numplayers'];
    }

    $objResponse->addAssign($obIdCurrPlayers, $obPropCurrPlayers, $playersOnline);
    $objResponse->addAssign($obIdMaxPlayers, $obPropMaxPlayers, $playersMax);
    return $objResponse;
}
2. Открываем нужный шаблон, куда собираемся выводить общий онлайн. Для примера, я решил выводить на главной странице, после сообщения СБ, которое настраивается. Это файл page_dashboard.tpl, потому его я и открываю.
Добавляем в нужное место этот код:
PHP:
<div style="text-align: center;">Общий онлайн на серверах: <span id="sbCurrent">0</span> из <span id="sbMax">0</span></div>
И в самый конец шаблона:
PHP:
<script>xajax_SumOnline("sbCurrent", "sbMax", "innerHTML", "innerHTML");</script>

*здесь была ссылка на СБ с примером этого кода в действии, но я её убрал, т.к. ссылка потеряла актуальность*
 
Последнее редактирование:

romchik4021

Участник
Сообщения
42
Реакции
15
Флуд
СБ какой? 1.4.11, 1.5.4.7 или от Онотоле?
--- Добавлено позже ---
Набросал, впринципе, вариант, который должен работать на любой версии СБ. Он не без изъянов (делает лишнюю нагрузку на БД и на сервера), но работает.

1. Открываем файл includes/sb-callback.php и находим строчку:
PHP:
$xajax->registerFunction("ServerHostPlayers");
После неё добавляем:
PHP:
$xajax->registerFunction("SumOnline");
Ищем строку:
PHP:
function ServerHostPlayers($sid, $type="servers", $obId="", $tplsid="", $open="", $inHome=false, $trunchostname=48)
Добавляем перед ней:
PHP:
function SumOnline($obIdCurrPlayers, $obIdMaxPlayers, $obPropCurrPlayers, $obPropMaxPlayers) {
    require INCLUDES_PATH.'/CServerInfo.php';
    $objResponse = new xajaxResponse();

    $playersMax = 0;
    $playersOnline = 0;
    $servers = $GLOBALS['db']->GetAll(sprintf("SELECT ip, port FROM %s_servers", DB_PREFIX));
    foreach ($servers as $server) {
        $srvSock = new CServerInfo($server["ip"], $server["port"]);
        $srvInfo = $srvSock->getInfo();
        if (empty($srvInfo['hostname'])) continue;
        $playersMax += $srvInfo['maxplayers'];
        $playersOnline += $srvInfo['numplayers'];
    }

    $objResponse->addAssign($obIdCurrPlayers, $obPropCurrPlayers, $playersOnline);
    $objResponse->addAssign($obIdMaxPlayers, $obPropMaxPlayers, $playersMax);
    return $objResponse;
}
2. Открываем нужный шаблон, куда собираемся выводить общий онлайн. Для примера, я решил выводить на главной странице, после сообщения СБ, которое настраивается. Это файл page_dashboard.tpl, потому его я и открываю.
Добавляем в нужное место этот код:
PHP:
<div style="text-align: center;">Общий онлайн на серверах: <span id="sbCurrent">0</span> из <span id="sbMax">0</span></div>
И в самый конец шаблона:
PHP:
<script>xajax_SumOnline("sbCurrent", "sbMax", "innerHTML", "innerHTML");</script>

Результат можно глянуть тут: G-44 Bans
Огромное спасибо, все работает!
 
Последнее редактирование модератором:

romchik4021

Участник
Сообщения
42
Реакции
15
СБ какой? 1.4.11, 1.5.4.7 или от Онотоле?
--- Добавлено позже ---
Набросал, впринципе, вариант, который должен работать на любой версии СБ. Он не без изъянов (делает лишнюю нагрузку на БД и на сервера), но работает.

1. Открываем файл includes/sb-callback.php и находим строчку:
PHP:
$xajax->registerFunction("ServerHostPlayers");
После неё добавляем:
PHP:
$xajax->registerFunction("SumOnline");
Ищем строку:
PHP:
function ServerHostPlayers($sid, $type="servers", $obId="", $tplsid="", $open="", $inHome=false, $trunchostname=48)
Добавляем перед ней:
PHP:
function SumOnline($obIdCurrPlayers, $obIdMaxPlayers, $obPropCurrPlayers, $obPropMaxPlayers) {
    require INCLUDES_PATH.'/CServerInfo.php';
    $objResponse = new xajaxResponse();

    $playersMax = 0;
    $playersOnline = 0;
    $servers = $GLOBALS['db']->GetAll(sprintf("SELECT ip, port FROM %s_servers", DB_PREFIX));
    foreach ($servers as $server) {
        $srvSock = new CServerInfo($server["ip"], $server["port"]);
        $srvInfo = $srvSock->getInfo();
        if (empty($srvInfo['hostname'])) continue;
        $playersMax += $srvInfo['maxplayers'];
        $playersOnline += $srvInfo['numplayers'];
    }

    $objResponse->addAssign($obIdCurrPlayers, $obPropCurrPlayers, $playersOnline);
    $objResponse->addAssign($obIdMaxPlayers, $obPropMaxPlayers, $playersMax);
    return $objResponse;
}
2. Открываем нужный шаблон, куда собираемся выводить общий онлайн. Для примера, я решил выводить на главной странице, после сообщения СБ, которое настраивается. Это файл page_dashboard.tpl, потому его я и открываю.
Добавляем в нужное место этот код:
PHP:
<div style="text-align: center;">Общий онлайн на серверах: <span id="sbCurrent">0</span> из <span id="sbMax">0</span></div>
И в самый конец шаблона:
PHP:
<script>xajax_SumOnline("sbCurrent", "sbMax", "innerHTML", "innerHTML");</script>

Результат можно глянуть тут: G-44 Bans
Немножечко изменил и доработал код. Оформлю тему как полагается, что бы каждый смог разобраться!:ab:
 
Сверху Снизу