Memory Posted August 13, 2013 Posted August 13, 2013 Здравствуйте, сижу уже пол ночи, нашёл код, но мне многое там непонятно, например эти символы "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. Очень хочу разобраться во всём этом и повысить уровень своих знаний в области программирования, перечитал кучу всего, так что помогите, пожалуйста.
Flaker Posted August 13, 2013 Posted August 13, 2013 "list($name,$Points,$ping) = split("||||",$player);" Функция split делит строку на подстроки по указанному разделителю ( в данном случае разделитель это "||||" ). Возвращает массив из этих подстрок. Функция list последовательно присваивает своим аргументам значения массива, который идет после знака "=". Идиотский туториал... Что ты вообще пытаешься сделать?
Memory Posted August 14, 2013 Author Posted August 14, 2013 Для начала хотел что-нибудь получить с сервера и отобразить это на странице 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'] выводит игроков, а где всё посмотреть, что можно вывести
Kernell Posted August 14, 2013 Posted August 14, 2013 Попробуй мой... <?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 строки..
Flaker Posted August 14, 2013 Posted August 14, 2013 Можешь сам установить, что будет видно: https://wiki.multitheftauto.com/wiki/SetPlayerAnnounceValue
Memory Posted August 14, 2013 Author Posted August 14, 2013 Большое спасибо, можно ещё узнать как получить имена игроков из массива. Пробовал через foreach, не выходит.
Kernell Posted August 14, 2013 Posted August 14, 2013 А мы должны сами догадываться как ты пробовал? Код в студию
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now