собственно сабж, так и не понял как это сделать. в пакетах, которые получают информацию о персах аккаунта отсутствует информация о клане. Вообще ищу возможность пакетно вытянуть айди клана, в котором состоит перс. Пакет factioninfo к сожалению в качестве аргумента для поиска принимает только айди клана, т.е. найти нужный клан по айди перса не выйдет... интересует именно пакетное решение.
в общем суть проблемы такая, роутер asus rt-g32, не могу открыть порт 29000, открывал разными способами(TCP и тд) айпи адрес писал и виртуальной машины, и основного ПК, суть не изменилась, порт как был закрыт, так и остался, помогите, в чем может быть проблема? если нужны какие то определенные скрины скажите, я выложу [IMG] ну в принципе все правильно, но я думаю UDP протокол необходим для игрового порта. Вот как я сделал: [IMG] чтоб убедится, что виртуальная машина вообще в принципе доступна, хотя бы локально (за роутером) набери в браузере адрес вебсервера твоей машины, в моем случае это 192.168.0.32, в твоем случае другой локальный адрес у вебсервера. Если страничка вебсервера доступна, значит все норм, в пределах домашней сети все как надо. Остается лишь прокинуть порт с внешки на IP сервера к виртуальной машине. Попробуй для начала 80 порт прокинуть (протокол TCP) и обратись из внешки. Одно но, сам себе не сможешь обратится напрямую, используй прокси либо юзай в браузере хром ZENMATE расширение, которое меняет твою сеть на другую, с которой и сможешь обратиться на свой внешний IP ну или попроси друга, чтоб он обратился по указанному адресу. Если при обращении страничка видна, то все норм, если нет, значит пинай провайдера, чтоб выделил статический IP. Данная услуга обычно платная и может стоить в пределах 100 руб в месяц (бывает дороже или дешевле, зависит от провайдера). --- добавлено: 5 мар 2015 в 01:48 --- а насчет того, что провайдер запрещает открывать часть портов - истинный маразм, лучше от такого провайдера валить подальше.
[ATTACH]
Товарищ wsok предложил использовать его песочницу, но это не очень удобно как с физической, так и с моральной точки зрения, да и времени у меня мало. ну почему же с моральной? я не давлю морально на тебя и на себя не ощущаю этого )) Тебя все в скайпе нету, сам ведь обещал постучать, когда начнешь тестить в моей песочнице ) да и времени у меня мало так понимаю проект умирает? выкладывать всё как есть? Или же попытаться оттестировать самостоятельно? Или же может всё таки кто-нибудь согласиться стать тестером? Пару человек бы и проще стало бы жить. Ну если тут есть программисты, которые дружат с делфи и есть у них желание. --- добавлено: 27 фев 2015 в 19:14 --- насчет недостатка времени, понимаю, тоже есть такое у меня, но по мере свободного времени и выходных что то кодю ) Ну о совмещении хобби - это уже отдельный вопрос, сложно совмещать разные хобби. И программирование и фотодело и музыка (последним кстати вроде ТС и занмиается ещё)
как порезать дамаг синам как пофиксить скилы шама вообще уже как бы выкладывали методы фикса рыб и шамов и синов, главное поискать терпеливо. Как вариант вовсе выпилить эту расу, либо внести в неё некоторые ограничения, чтоб побуждать игроков играть другими расами (например запретить рыбам повышать культивацию)
$str = $str+174; if($rolerace[1] == 0) { $roleconfigdata = bin2hex(substr($buf,$str,308)); $str = $str+308; }else{ $roleconfigdata = bin2hex(substr($buf,$str,322)); $str = $str+322; } Очень криво. Там куинты в длине. Чуть что и скрипт отвалится. Ну вчера единственное, что я мог, найти подобное решение и показать. Сам знаешь, я на работе был и условий чтоб написать свой скрипт и проверить не было. Это решение я взял отсюда http://mmorpg-devs.ru/threads/php-getrolebase-getroleequipments.15732/
отвечу чуточку поразвернутее, дабы это поможет больше реализации сабжа. $rid = $_GET['rid']; function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("I", $data)); } $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($sock, "127.0.0.1", "29400"); $data = cuint(3013)."\x08\x80\x00\x00\x01".pack("N", $rid); $sbytes = socket_send($sock, $data, 8192, 0); $rbytes = socket_recv($sock, $buf, 8192, 0); $str = 13; $roleid = unpack( "N", substr( $buf, $str, 4 ) ); if($roleid[1] == 0){ echo ("Персонажа или аккаунта не существует!"); }else{ $str = $str+4; $namelarge = unpack( "c*", substr( $buf, $str, 1 ) ); $str = $str+1; $rolename = iconv( "UTF-16", "UTF-8", substr( $buf, $str, $namelarge[1] ) ); $str = $str+$namelarge[1]; $rolerace = unpack( "N", substr( $buf, $str, 4)); $str = $str+4; $rolecls = unpack ("N", substr($buf, $str, 4)); $str = $str+4; $rolegender = unpack("C", substr($buf, $str, 1)); $str = $str+3; $rolecustomdata = bin2hex(substr($buf,$str,172)); $str = $str+174; if($rolerace[1] == 0) { $roleconfigdata = bin2hex(substr($buf,$str,308)); $str = $str+308; }else{ $roleconfigdata = bin2hex(substr($buf,$str,322)); $str = $str+322; } $customstamp = unpack("N", substr($buf,$str,4)); $str = $str+4; $rolestatus = unpack("C", substr($buf,$str,1)); $str = $str+1; $roledeletetime = unpack("N", substr($buf,$str,4)); $str = $str+4; $rolecreatetime = unpack("N", substr($buf,$str,4)); $str = $str+4; $rolelastlogintime = unpack("N", substr($buf,$str,4)); $str = $str+6; $rolehelpstates = bin2hex(substr($buf,$str,54)); if($rolehelpstates[1] == 0){ $str = $str; }else{ $str = $str+54; } $rolereserved1 = unpack("N", substr($buf,$str,4)); $str = $str+4; $rolereserved2 = unpack("N", substr($buf,$str,4)); $str = $str+4; $rolereserved3 = unpack("N", substr($buf,$str,4)); $str = $str+4; echo ("ID - " .$roleid[1]. "</br>"); echo ("Nick - " .$rolename. "</br>"); echo ("Race - " .$rolerace[1]. "</br>"); echo ("Cls - " .$rolecls[1]. "</br>"); echo ("Gender - " .$rolegender[1]. "</br>"); echo ("Custom_data - " .$rolecustomdata. "</br>"); echo ("Config_data - " .$roleconfigdata. "</br>"); echo ("Custom_stamp - " .$customstamp[1]. "</br>"); echo ("Status - " .$rolestatus[1]. "</br>"); echo ("Delete_time - " .$roledeletetime[1]. "</br>"); echo ("Create_time - " .$rolecreatetime[1]. "</br>"); echo ("Lastlogin_time - " .$rolelastlogintime[1]. "</br>"); if($rolehelpstates[1] == 0){ }else{ echo ("Help_states - " .$rolehelpstates. "</br>"); } echo ("Reserved1 - " .$rolereserved1[1]. "</br>"); echo ("Reserved2 - " .$rolereserved2[1]. "</br>"); echo ("Reserved3 - " .$rolereserved3[1]. "</br>"); } socket_close($sock);
практически во всех таблицах ключ - это id нужного ресурса (персонаж, клан, аккаунт и т.д.), но т.к. в качестве key пакету нужен октет - формировать его нужно по всем правилам - cuint длинна октета, а дальше сами данные (id). Например: WriteByte(4); - размер инта WriteUInt(FactionID); - тело октета тогда HANDLE чем является и формируется тоже как октет кея?
Ответ содержится в вопросе - достаточно указать ключ в параметрах запроса. указывал, например искал по 1024, т.е. по ид мастера клана, но толку не было, все равно показывал 3 клана (т.е. их всего 3 на сервере)
в общем чуточку начал понимать, теперь волнует метод поиска нужной записи по ключу, уже мозг сломал... $bdname = 'factioninfo'; $bdlen = pack("n*", strlen($bdname)+32768); $data = pack('N', -1) . $bdlen . $bdname.pack('N', 1); $Socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $Data = cuint(3055).cuint(strlen($data)).$data; в общем как бы пытаюсь найти клан с айди 1... но эффекта нет... --- добавлено: 17 фев 2015 в 19:58 --- ну или так $sendpacket = new WritePacket(); $sendpacket -> WriteUInt32(-1); $sendpacket -> WriteUString("factioninfo"); // table $sendpacket -> WriteOctets(""); // handler $sendpacket -> WriteOctets(""); // key $sendpacket -> Pack(3055); все равно непонятно как пользоваться поиском через ключ
и там просто мастер и мембер указаны будто как векторы оба. И где я писал про то, что master vector? member - vector, т.е. roleid и role читаются в цикле. ну я и не говорю, что ты говорил о векторе, просто я сам воспринял тот порядок, как они там указаны, что вектор. Теперь понимаю, что только список мемберов идет как цикл, мастер всегда один.
Ранее уже писали структуру type = struct GMember { unsigned int rid; char role; } type = struct GFactionInfo { unsigned int fid; Octets name; char level; GMember master; GetFactionDetail::GMemberVector member; Octets announce; Octets sysinfo; } Octets тоже по сути массив, из байт или символов. да я понял, просто вирав приводил пример структуры: 'fid'=>'int', 'name'=>'string', 'level'=>'byte', 'master'=>[ 'roleid'=>'int', 'role'=>'byte' ], 'member'=>[ 'roleid'=>'int', 'role'=>'byte' ], 'announce'=>'string', 'sysinfo'=>'octets' и там просто мастер и мембер указаны будто как векторы оба. --- добавлено: 16 фев 2015 в 21:34 --- вот и пытался понять, где собака порылась ) --- добавлено: 16 фев 2015 в 21:36 --- не понял суть вопроса ну мастер клана ведь один? Но в структуре пакета я вижу, что мастер клана указан как бы в массиве, будто их может быть более одного... Ну и вообще, в пакете этом ведь два массива, я не ошибаюсь? на мастеров и мемберов? Мастер один спс, а то уже хотел пытаться его в векторе декодировать ))
зачем мастер в цикле вектора если он и так один? не понял суть вопроса ну мастер клана ведь один? Но в структуре пакета я вижу, что мастер клана указан как бы в массиве, будто их может быть более одного... Ну и вообще, в пакете этом ведь два массива, я не ошибаюсь? на мастеров и мемберов?
В общем я понял, что метод passthru и подобные мягко говоря плохой способ получения информации из бд, время от времени эта функция отказывается работать. Потому мне все же придется учится работать с хекс данными в пакетах... чем и занимаюсь уже ) --- добавлено: 16 фев 2015 в 19:36 --- Насчет factionname не изучал, я использую таблицу factioninfo, там все что надо есть. ну как раз её и разбираю, так понимаю там два участка с вектором? Только не пойму, зачем мастер в цикле вектора если он и так один?
И вектор тоже? Я вот тоже почти разобрал, но парсинг вектора пока с толку сбивает, собственно на нем парсинг и валится... RecNo / RecLen / IDFaction / NameLen / Name / Level / ID Master / MasterRole / PeopleCount / n=1...PeopleCount [IDRole / Role] / MsgLen / Msg все равно не могу въехать ))) короче я байты вектора добавил в расчет их длины и пропустил
а я разобрал И вектор тоже? Я вот тоже почти разобрал, но парсинг вектора пока с толку сбивает, собственно на нем парсинг и валится...
вот я пытаюсь тут разобрать пакет от factioninfo, ради того, чтоб получить список кланов включающий в себя айди мастеров, может можно это получить с пакета factionname, или там нет данных о мастерах? Вообще какая структура там?
ну на боевом 777 даю только тем файлам или папкам, который точно требуют этих прав. Если честно, подобные права нужны единицам файлов на игровом сервере (и то в большинстве случаев можно обойтись сменой владельца). ок, кстати не в курсе, пакет factionname кроме айди клана и его названия, что то ещё хранит в себе? Например айди мастера? А то параллельно рассматриваю возможность получения пакетом списка кланов, но к сожалению factioninfo, если ты читал ту тему требует распаривать ещё и вектор (вложенные массивы). Потому и подумал насчет factionname, удалось декодировать только айди клана и его имя, но там ещё вроде 4 байта, хз что они означают, но в айди мастеров кланов они не декодируются... --- добавлено: 16 фев 2015 в 09:36 --- $strlarge = unpack( "H", substr( $buf, 2, 1 ) ); if(substr($strlarge[1], 0, 1) == "8") { $start = 13; } else { $start = 12; } $clancount = unpack( "c", substr( $buf, $start, 2 ) ); $start = $start+2; for($c=0; $i<$clancount[1]; $i++) { $namelarge = unpack( "c*", substr( $buf, $start, 1 ) ); $start = $start+1; $clanname = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge[1] ) ); $start = $start+$namelarge[1]; $clan2 = unpack( "C*", substr( $buf, $start, 4 ) ); $start = $start+4; $clan_id = unpack( "C*", substr( $buf, $start, 2 ) ); $start = $start+2; $clan_list .="<font color='red'>{$clanname} ID: $clan_id[1] | $clan2[1] | </font><hr>"; }
Из этого следует, что chown -R www-data /home/gamedbd вместо home - подставь свой путь, команду эту выполнять из консоли под рутом. Потом пробуй получить через веб скрипт нужные данные помогло ) сервер тестовый локальный, потому ничего страшного нет в безопасности. держу пари, что если что-то у тебя не выйдет на боевом, ты тупо установишь права 777 :D ну на боевом 777 даю только тем файлам или папкам, который точно требуют этих прав.
Почему я должен давать его вам бесплатно? ну почему бы и не заплатить за конструктивный ответ? Главное чтоб он был.
Имена участников (разделяйте запятой).