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

Тема в разделе "SourceBans", создана пользователем romchik4021, 17 сен 2016.

  1. romchik4021

    romchik4021

    Сообщения:
    26
    Симпатии:
    4
    Недавно я задался вопросом, как вывести общий онлайн и количество слотов со всех серверов в 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'], $trunchostnamefalse));
                
    $objResponse->addAssign("players_$sid""innerHTML""<center>(" $info['numplayers'] . "/" $info['maxplayers'] . ")</center>");
                
    $objResponse->addAssign("procentplayers_$sid""innerHTML""[" round($info['numplayers'] / $info['maxplayers'] * 1000PHP_ROUND_HALF_DOWN) . "%]");
                
    $objResponse->addAssign("os_$sid""innerHTML""<img src='images/bage-available.png' title='[Online] Сервер активен! Можно играть!'>");
                if( 
    $info['secure'] == )
                {
                    
    $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'] == || 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')=='{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) + * ($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'], $trunchostnamefalse));
            }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'], $trunchostnamefalse));
            }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'] со всех серверов, которые есть в базе? Знающие люди, помогите пожалуйста.
     
  2. AS TRO

    AS TRO

    Сообщения:
    1.056
    Симпатии:
    509
    @romchik4021, в чем проблема создать переменную(как глобальную и как) и в функции где идет получение количества игроков у сервера тупо ее складывать? А потом вывести
    --- Добавлено позже ---
    Кстати, я что-то подобное пытался сделать, что что-то не особо вышло) но я тогда по другому методу делал)
     
  3. romchik4021

    romchik4021

    Сообщения:
    26
    Симпатии:
    4
    К сожалению я не на столько хорошо знаю php :ac:
     
  4. AS TRO

    AS TRO

    Сообщения:
    1.056
    Симпатии:
    509
    @romchik4021, к сожаления у меня нету пк под рукой, так бы помог. Ты бы в вк мне маякнул, чтобы я не забыл) помогу)
     
  5. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    876
    Симпатии:
    545
    СБ какой? 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>
    *здесь была ссылка на СБ с примером этого кода в действии, но я её убрал, т.к. ссылка потеряла актуальность*
     
    Последнее редактирование: 7 дек 2016 в 21:32
    ruskydubl, 666FoX666, AS TRO и 2 другим нравится это.
  6. romchik4021

    romchik4021

    Сообщения:
    26
    Симпатии:
    4
    • Флуд
    Огромное спасибо, все работает!
     
    Последнее редактирование модератором: 21 сен 2016
  7. 666FoX666

    666FoX666

    Сообщения:
    629
    Симпатии:
    61
    ruskydubl, Meowmurmur и CrazyHackGUT нравится это.
  8. romchik4021

    romchik4021

    Сообщения:
    26
    Симпатии:
    4
    Немножечко изменил и доработал код. Оформлю тему как полагается, что бы каждый смог разобраться!:ab: