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