DakiLLa Posted April 8, 2011 Share Posted April 8, 2011 Не совсем относится к луа, но к мта точно. В общем решил поставить на сайт простой пхп скрипт, который выводит имя текущей карты. Собственно, код пхп: include( "mta_sdk.php" );$mtaServer = new mta( $s_ip, $s_port ); //$s_ip и $s_port объявлены выше (айпишник и порт)$retn_m = $mtaServer -> getResource( "myResource" ) -> call( "getCurrentMap" ); echo "Текущая карта: ".$retn_m[ 0 ]; Моя функция 'getCurrentMap': function getCurrentMap() return getMapName(); end; Все прекрасно выводится на страничку, проблем нет. Но одна загвоздка: если часто обновлять страницу, либо к странице обращаются несколько человек, вместо названия карты вылетает ошибка: Notice: Undefined offset: 1 in mta_sdk.php on line 182 Notice: Undefined offset: 1 in mta_sdk.php on line 185 Не буду описывать, что находится в тех злополучных строках, скрипт mta_sdk без труда можно достать с мта вики. Ну и после некоторого времени, если обновить страничку, все работает так, как надо. Но если опять начать часто обновлять страницу, появляется все то, что описал выше. Сломал себе голову. Пробовал вместо include писать include_once и require_once - не помогло. Кто встречался с такой проблемой, подскажите решение. Link to comment
LoveFist Posted April 8, 2011 Share Posted April 8, 2011 Незнаю в чем проблема, но можно сделать все немного проще и надежнее. Зачем каждый раз при загрузке страницы спрашивать у сервера название карты? При загрузке карты отправляй на сайт её название (в текстовый файл, бд), а потом при загрузке страницы бери название из файла. Link to comment
MX_Master Posted April 8, 2011 Share Posted April 8, 2011 название карты можно прекрасно и 100%тно получить без PHP SDK $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']; // ... } } Link to comment
DakiLLa Posted April 8, 2011 Author Share Posted April 8, 2011 MX_Master Насколько я понял, чтобы вызвать какую-то функцию из Lua, ваш код уже не подойдет? Link to comment
MX_Master Posted April 9, 2011 Share Posted April 9, 2011 этот код может узнать только анонс данные сервера, и этим он хорош ну а для для каждого дела свой инструмент (: тут речь шла про имя карты.. Link to comment
DakiLLa Posted April 9, 2011 Author Share Posted April 9, 2011 тут речь шла про имя карты.. Мм, моя оплошность. Вкупе с именем карты по тому примеру, который я указал в первом посте, я так же вызываю несколько lua - функций, почему как бы сразу и начал использовать mta_sdk. Link to comment
lil Toady Posted April 9, 2011 Share Posted April 9, 2011 Честн не знаю почему php_sdk так работает, то мест того чтобы вызывать несколько функций удалённо, лучше и намного быстрее будет создать html страницу на сервере которая будет показывать всю инфу которая тебе нужна, и отображать её на твоем сайте через аякс или айфреймы. Link to comment
DakiLLa Posted April 18, 2011 Author Share Posted April 18, 2011 to MX_Master Можешь, пожалуйста, рассказать, как на твоем сайте реализован блок мониторинга сервера? Тоже через php_sdk или через что-то другое? Я сделал точь в точь такой же блок, как у тебя (выводит ники, пинг и проч.), но его пришлось выпилить из-за того, что вот ошибки спамит. Link to comment
MX_Master Posted April 19, 2011 Share Posted April 19, 2011 Я просто знаю порядок данных, составляющих UDP ответ на UDP запрос "s" серверу. Как показано выше в моем коде, идет просто сохранение этих данных и одновременный разбор последующих. Такой код, обычно, называется MTA:SA Server Query и его можно найти в разных местах инета, допустим здесь Link to comment
DakiLLa Posted April 19, 2011 Author Share Posted April 19, 2011 Хмм, по-моему, это совершенно то, что я искал. Спасибо, буду вникать. Link to comment
MX_Master Posted April 19, 2011 Share Posted April 19, 2011 У меня, канеш, чуток другой вид, т.к. я сам катал свой РНР скрипт, но в целом результат один. В случае, если нужного ответа от сокета нет, можно показывать какое-то сообщение, типа "Мониторинг недоступен" или "Сервер сейчас недоступен". У меня и серв и веб серв на одной тачке стоят, поэтому этот запрос я на себя же и делаю (127.0.0.1) Link to comment
Other Languages Moderators Disinterpreter Posted April 28, 2011 Other Languages Moderators Share Posted April 28, 2011 Все понятно стало 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