Привет всем. Решил сделать вывод всех игроков и общее количество слотов на всех серверах в SourceBans.
Например: "Общее количество игроков на всех наших серверах: 60/130"
Не понимаю, как сложить игроков и слоты со всех серверов в базе
В файле /includes/sb-callback.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; }
А именно строка:
$objResponse->addAssign("players_$sid", "innerHTML", "<center>(" . $info['numplayers'] . "/" . $info['maxplayers'] . ")</center>");
Она отвечает за вывод игроков/слотов на конкретном сервере. Как сложить переменные $info['numplayers'] и $info['maxplayers'] со всех серверов, которые есть в базе?
Если кто понимает в этом, помогите пожалуйста, нужно сделать всего лишь подсчет игроков на всех серверах, без использования планировщика cron и занесения игроков/слотов каждого сервера в БД. Я думаю многие были бы благодарны