Jump to content

Код php


Recommended Posts

Здравствуйте, сижу уже пол ночи, нашёл код, но мне многое там непонятно, например эти символы "list($name,$Points,$ping) = split("||||",$player);". Не могли бы мне объяснить что к чему и упорядочить. Также пытался получить Point (вместо score, который там стоял по умолчанию), и убрать повторение названия карты. Ещё всё начилось с установки php SDK (https://forum.multitheftauto.com/viewtopic.php?f=148&t=38344), в первых двух частях разобрался, всё работает, а вот с третьей никак (Example 1: Use PHP/MYSQL), особенно непонятно по поводу CREATE TABLE...

Найденный код

<? 
function format_player($player) { 
  $player = htmlentities(substr($player,1)); 
  list($name,$Points,$ping) = split("||||",$player); 
  $colors = array("yy"=>"#FF0000"); 
  
  foreach($colors as $key => $val) { 
    $name = ereg_replace($key,"</font><font color=\"$val\">",$name); 
  } 
  
  $player = array("Points"=>$Points,"name"=>$name,"ping"=>$ping); 
  
  return $player; 
} 
  
$fp = @fsockopen("udp://ip сервера", порт); 
  
if(!$fp) { 
  die("No Response"); 
} else { 
  fwrite($fp,"s"); 
  $data = fread($fp,4096); 
  $data = preg_replace("/{5}\??|\?/","/////",$data); 
  $data = explode("/////",$data); 
  
  $raw = preg_replace("/^EYE1??(gta3)?mta\" . $server['port'] . "||||/","/////",$data[0]); 
  list($null,$server['name'],$server['version'],$null,$server['current'],$server['max']) = explode("/////",$raw); 
  
  $server['players'] = array_slice($data,1); 
} 
  
echo "<pre>"; 
  
print_r($server); 
  
echo "\n\nActual Player Output:\n"; 
  
for($i=0;$i<$server['current'];$i++) { 
  $temp = format_player($server['players'][$i]); 
  print_r($temp); 
  echo "\n"; 
} 
  
echo "</pre>"; 
?> 

Как отображается http://s2.ipicture.ru/uploads/20130814/DFOtb32a.png

P.S. Очень хочу разобраться во всём этом и повысить уровень своих знаний в области программирования, перечитал кучу всего, так что помогите, пожалуйста.

Link to comment

"list($name,$Points,$ping) = split("||||",$player);" 

Функция split делит строку на подстроки по указанному разделителю ( в данном случае разделитель это "||||" ). Возвращает массив из этих подстрок.

Функция list последовательно присваивает своим аргументам значения массива, который идет после знака "=".

Идиотский туториал...

Что ты вообще пытаешься сделать?

Link to comment

Для начала хотел что-нибудь получить с сервера и отобразить это на странице php. С php SDK не получается (я уже писал выше), решил так поискать находил ещё кучу рабочих кодов, где получают название карты и т.п., но везде без описаний.

Например код от MX_Master'а.

$MAP_NAME = 'Unknown'; 
  
$mtasa_ip =     '127.0.0.1'; // какой хотите поставьте 
$mtasa_port =   22003; 
$mtasa_pre =    'EYE1'; 
$mtasa_fp =     fsockopen( "udp://{$mtasa_ip}", (string) ($mtasa_port+123),  
                    $mtasa_errno, $mtasa_errstr, 3 ); 
  
if ( $mtasa_fp !== FALSE ) 
{ 
    fwrite( $mtasa_fp, 's' ); 
    $mtasa_packet = fread( $mtasa_fp, 16384 ); 
    fclose($mtasa_fp); 
  
    if ( substr( $mtasa_packet, 0, 4 ) == $mtasa_pre ) 
    { 
        $mtasa = array(); 
        $pos = 4; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['gameShortName'] =   substr( $mtasa_packet, ++$pos, $len ); 
        $pos +=                     $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['serverPort'] =      substr( $mtasa_packet, ++$pos, $len ); 
        $pos +=                     $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['serverName'] =      substr( $mtasa_packet, ++$pos, $len ); 
        $pos                        += $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['gameModeName'] =    substr( $mtasa_packet, ++$pos, $len ); 
        $pos                        += $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['mapName'] =         substr( $mtasa_packet, ++$pos, $len ); 
     
        $MAP_NAME = $mtasa['mapName']; 
         
        // ... 
    } 
} 

Ну дописываешь echo {$MAP_NAME} и работает. Написал $mtasa['players'] выводит игроков, а где всё посмотреть, что можно вывести

Link to comment

Попробуй мой...

<?php 
  
class CSocketMTA 
{ 
    function CSocketMTA( $IP, $PORT = 22003 ) 
    { 
        if( $socket = fsockopen( "udp://$IP", $PORT + 123, $errno, $errstr ) ) 
        { 
            stream_set_timeout( $socket, 1, 0 );  
             
            fwrite( $socket, "s" );  
             
            $data = fread( $socket, 16384 );  
             
            fclose( $socket );  
             
            if( substr( $data, 0, 4 ) == "EYE1" )  
            { 
                $data = substr( $data, 4 );  
  
                for( $i = 0; $data != ""; $i++ ) 
                {  
                    if( substr( $data, 0, 2 ) == chr( 1 ) . "?" ) 
                        $data   = substr( $data, 2 ); 
  
                    $l              = ord( substr( $data, 0, 1 ) );  
                    $buffer[ $i ]   = substr( $data, 1, $l - 1 ); 
                    $data           = substr( $data, $l ); 
                }  
  
                $this->gameshort            = $buffer[ 0 ];  
                $this->port                 = $buffer[ 1 ];  
                $this->name                 = $buffer[ 2 ];  
                $this->rules[ 'game' ]      = $buffer[ 3 ];  
                $this->map                  = $buffer[ 4 ];  
                $this->rules[ 'version' ]   = $buffer[ 5 ]; 
                $this->public               = $buffer[ 6 ] != "0";  
                $this->players              = $buffer[ 7 ];  
                $this->maxplayers           = $buffer[ 8 ]; 
                 
                $j = 0;  
                 
                for( $i = 11; $i < sizeof( $buffer ) - 2; $i += 5 ) 
                {  
                    $this->player[ $j ]->name   = $buffer[ $i ];  
                    $this->player[ $j ]->score  = $buffer[ $i + 3 ];  
                    $this->player[ $j ]->time   = 0;  
                    $j++;  
                }  
            } 
            else 
                echo "Data is invalid\n"; 
        } 
        else 
            echo "Can not open socket $IP:$PORT - $errstr\n"; 
    } 
}; 

Пример использования:

<?php 
$MTA = new CSocketMTA( "79.174.71.100", 22003 ); 
  
echo "CSocketMTA::port = $MTA->port\n"; 
echo "CSocketMTA::name = $MTA->name\n"; 
  
print_r( $MTA ); // или если вывести всё  
// а вобще члены описаны с 31 строки.. 
  

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...