Функция получения списка игроков CS сервера?

Тема в разделе "Как сделать...", создана пользователем new_forward, 18 апр 2013.

  1. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Доброго времени суток! Есть ли кого такая функция, что бы нормально список игроков вытягивала...?

    Вот нашел одну, так она либо не правильно тянет...видно из-за имен игроков со всякими закарлючками...

    PHP:
    function getString(&$packet){
        
    $str "";
        
    $n strlen($packet);
        for(
    $i=0;($packet[$i]!=chr(0)) && ($i $n);++$i)
            
    $str .= $packet[$i];
        
    $packet substr($packetstrlen($str));
        return 
    trim($str);
    }
     
    function 
    playersInfo($server) {
        list(
    $ip,$port) = explode(":"$server);
        
    $array = array();
        
    $fp = @fsockopen('udp://'.$ip$port);
        if(
    $fp) {
            
    stream_set_timeout($fp2);
            
    $command pack("V", -1) . 'W';
            
    fwrite($fp$commandstrlen($command));
            
    $temp fread($fp5);
            
    $lo = (ord($temp[1]) << 8) | ord($temp[0]);
            
    $hi = (ord($temp[3]) << 8) | ord($temp[2]);
            
    $data "\xFF\xFF\xFF\xFF\x55".pack("V", ($hi << 16) | $lo);
            
    fwrite($fp$data);
            
    $temp fread($fp4);
            
    $status socket_get_status($fp);
            if(
    $status['unread_bytes']>0) {
                
    //echo $status['unread_bytes'];
                
    $temp fread($fp$status['unread_bytes']);
                while(
    strlen($temp) > 0) {
                    
    $player['name'] = getString($temp);
                    
    $temp substr($temp1);
                    
    $lo = (ord($temp[1]) << 8) | ord($temp[0]);
                    
    $hi = (ord($temp[2]) << 8) | ord($temp[3]);
                    
    $player['kills'] = ($hi << 16) | $lo;
                    
    $temp substr($temp4);
                    
    $f = @unpack("f1float"$temp);
                    
    $temp substr($temp4);
                    
    $player['time'] = gmdate("H:i:s", (int)$f['float']);
                    
    $array[] = $player;
                }
                
    usort($array"sortByKills");
            }
        }
        return 
    $array;
    }
    latteo: стоит приводить полный скрипт, у тебя функций не хватает.
    Похоже что взято отсюда http://www.cyberforum.ru/php-beginners/thread717230.html
     
  2. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    latteo, полный скрипт тут не нужен эта функция как раз сама выводит массив игроков в онлайне... только вот с одних серверов правильно выводит а с других нет...
     
  3. newbik

    newbik Создатель

    Регистр.:
    22 апр 2008
    Сообщения:
    14
    Симпатии:
    8
    Покажи как неправильно выводит, либо дай ip сервера, т.к. у меня везде получается, что $status['unread_bytes'] === 0 и следовательно дальше не узнать как и что...
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.450
    Симпатии:
    1.244
    Быть такого не может. У тебя есть строка $player['name'] = getString($temp); и без функции getString объявленной в скрипте, скрипт будет падать с Fatal error: Call to undefined function. А вот содержимое этой функции ты не привёл...
     
  5. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Да извиняюсь, думал она стандартная... добавил функцию getString в первый пост.