Увы он тупо файл не открывает даже( У тебя руки из жопы что ли? Я для кого его фиксил? Прекрасно открывает твой файл. [ATTACH]
Разве? Вроде NPC подгружаются только там где появился. Это на очень древнем билде клиента 1.5.2
Desmond Hume, все можно было куда проще сделать, просто поставить версию 1.5.2 в glinkd и зайти с nocheck. Это естественно, я про это написал, но так не будет видно нпсов, ради чего это все и делалось.
Смотрю троллинг наркотика удался на славу. И да, окстись, на самом деле это реально 1.5.2 клиент. /fin Цыгане сперли лошадь.
Наркот, это ранний китай клиент. Хочешь, запусти под новым или где там у тебя, если тебе нужные новые модельки. Вижу по интерфейсу. Что запустить, коричневый интерфейс на 151? был бы сервер хотя бы на компе, без проблем как и ты наскринил тонну бессмысленных скринов. Расскажи мне, что ты видишь по скрину.
Наркот, это ранний китай клиент. Хочешь, запусти под новым или где там у тебя, если тебе нужные новые модельки.
Раз уж пошла такая тема... В 1.5.2 китайцы изменили опкоды, структуру пакетов и т.д. и т.п. Наша цель - сделать скриншот, где мы посреди 1.5.2 стоим. В glinkd/gamesys.conf везде, где встретится 10501, меняем на 10502 Далее надо починить вывод нпсов в округе, а то никто не поверит. Бредем в IDA в ядро по функции S2C::CMD::Make<S2C::INFO::npc_info>::From<packet_raw_wrapper>(packet_raw_wrapper *const wrapper, gnpc *pObject) Суть: "удвоить" выбранное. Т.к. китайцы слепили в очередной раз фигню: первый раз ID указывает на облик, второй раз на его функции (моб, проститутка и т.д.) [ATTACH] Запоминанием, куда сувать будем — 0x080724E3 Бредем по elementdataman::save_data(elementdataman *const this, const char *pathname), смотрим, что она няш мяш, её и будем затирать, все равно нигде не вызывается. [ATTACH] Записываем адрес, где push ebp — 0x0829B974 Переводим jmp 829B974h с учетом позиции, куда будем сувать в опкод E9 8C 94 22 00 Ой вей, пять байт, как раз весь call затрется. Бредем обратно в S2C::CMD::Make<S2C::INFO::npc_info>::From<packet_raw_wrapper>(packet_raw_wrapper *const wrapper, gnpc *pObject) И лепим прыжок вместо вызова [ATTACH] Терь переводим в опкод, учитывая, что будем сувать по 0x0829B974 call 0806922Eh add esp, 4 push eax call 0806922Eh jmp 080724E8h Получаем E8 B5 D8 DC FF 83 C4 04 50 E8 AC D8 DC FF E9 61 6B DD FF И суем это вместо данных той функции, оставшиеся 3 байта от инструкции затираем 0x90, чтобы красиво было. [ATTACH] Загружаем на сервер и заходим через 1.5.2 клиент и ловим ошибку, т.к. опкоды кривые (ну а что? один пакет пофиксили и все? да хрен там, кому надо правьте хештейбл опкодов в глинкд) [ATTACH] Клацаем Esc, становимся няшнее и делаем скриншот [ATTACH]
Хм, Десмонд, ты случаем не Китаец? Nein.
Просто это один из немногих пакетов, в которых китайцы наделали какую-то каку. И приходится иногда лезть в дизасм и смотреть, что происходит внутри функции. [ATTACH] А потому, та самая маска должна равняться 0x20 <? require_once("packet_class.php"); $GetRole = new WritePacket(); $GetRole -> WriteUInt32(-1); $GetRole -> WriteUInt32(1024); $GetRole -> WriteUInt32(0x20); // mask $GetRole -> Pack(0xBBD); if (!$GetRole -> Send("localhost", 29400)) return; $GetRole_Re = new ReadPacket($GetRole); $GetRole_Re -> ReadPacketInfo(); $GetRole_Re -> ReadUInt32(); $GetRole_Re -> ReadUInt32(); // retcode $GetRole_Re -> ReadUInt32(); // mask $GetRole_Re -> ReadUByte(); // gameserver_id ??? // GRoleDetail start $GetRole_Re -> ReadUByte(); // char $GetRole_Re -> ReadUInt32(); // id $GetRole_Re -> ReadUInt32(); // userid // GRoleStatus start $GetRole_Re -> ReadUByte(); // version $GetRole_Re -> ReadUInt32(); // level $GetRole_Re -> ReadUInt32(); // level2 $GetRole_Re -> ReadUInt32(); // exp $GetRole_Re -> ReadUInt32(); // sp $GetRole_Re -> ReadUInt32(); // pp $GetRole_Re -> ReadUInt32(); // hp $GetRole_Re -> ReadUInt32(); // mp $GetRole_Re -> ReadFloat(); // posx $GetRole_Re -> ReadFloat(); // posy $GetRole_Re -> ReadFloat(); // posz $GetRole_Re -> ReadUInt32(); // worldtag $GetRole_Re -> ReadUInt32(); // invader_state $GetRole_Re -> ReadUInt32(); // invader_time $GetRole_Re -> ReadUInt32(); // pariah_time $GetRole_Re -> ReadUInt32(); // reputation $GetRole_Re -> ReadOctets(); // custom_status $GetRole_Re -> ReadOctets(); // filter_data $GetRole_Re -> ReadOctets(); // charactermode $GetRole_Re -> ReadOctets(); // instancekeylist $GetRole_Re -> ReadUInt32(); // dbltime_expire $GetRole_Re -> ReadUInt32(); // dbltime_mode $GetRole_Re -> ReadUInt32(); // dbltime_begin $GetRole_Re -> ReadUInt32(); // dbltime_used $GetRole_Re -> ReadUInt32(); // dbltime_max $GetRole_Re -> ReadUInt32(); // time_used $GetRole_Re -> ReadOctets(); // dbltime_data $GetRole_Re -> ReadUInt16(); // storesize $GetRole_Re -> ReadOctets(); // petcorral $GetRole_Re -> ReadOctets(); // property $GetRole_Re -> ReadOctets(); // var_data $GetRole_Re -> ReadOctets(); // skills $GetRole_Re -> ReadOctets(); // storehousepasswd $GetRole_Re -> ReadOctets(); // waypointlist $GetRole_Re -> ReadOctets(); // coolingtime $GetRole_Re -> ReadOctets(); // npc_relation $GetRole_Re -> ReadOctets(); // multi_exp_ctrl $GetRole_Re -> ReadOctets(); // storage_task $GetRole_Re -> ReadOctets(); // faction_contrib $GetRole_Re -> ReadOctets(); // force_data $GetRole_Re -> ReadOctets(); // online_award $GetRole_Re -> ReadOctets(); // profit_time_data $GetRole_Re -> ReadOctets(); // country_data $GetRole_Re -> ReadOctets(); // king_data $GetRole_Re -> ReadOctets(); // meridian_data $GetRole_Re -> ReadOctets(); // extraprop $GetRole_Re -> ReadOctets(); // title_data $GetRole_Re -> ReadOctets(); // reincarnation_data $GetRole_Re -> ReadOctets(); // realm_data $GetRole_Re -> ReadUByte(); // reserved2 $GetRole_Re -> ReadUByte(); // reserved3 // GRoleStatus end $GetRole_Re -> ReadUString(); // name $GetRole_Re -> ReadUInt32(); // race $GetRole_Re -> ReadUInt32(); // cls $GetRole_Re -> ReadUInt32(); // spouse $GetRole_Re -> ReadUByte(); // gender $GetRole_Re -> ReadUInt32(); // create_time $GetRole_Re -> ReadUInt32(); // lastlogin_time $GetRole_Re -> ReadUInt32(); // cash_add $GetRole_Re -> ReadUInt32(); // cash_total $GetRole_Re -> ReadUInt32(); // cash_used $GetRole_Re -> ReadUInt32(); // cash_serial echo "FactionID: " . $GetRole_Re -> ReadUInt32() . "<br>"; // factionid echo "FactionRole: ". $GetRole_Re -> ReadUInt32(); // factionrole 2 - Master ... 6 - Member ?>
А около ника рыбы показываются:( Я написал про это. Другие, должно быть, тоже так видят. Хз, не проверял. Да и нафиг оно кому-то надо на голову смотреть.
Кстати может вопрос не совсем корректный и где то обсуждалось,но интерисует вопрос,а реально ли данным образом вставить смайлы в ГМ чат?(Когда красным пишешь) Пакетами только, из гм-панели вряд ли: <><0:3> Где 3 - порядковый номер смайла
При отправке в горн выставляется определенный набор смайлов, что мне вообще не понравилось. После изменений ниже в горн-чат будут отправляться смайлы, которые сейчас напялены на персе, но важно учитывать, что при выборе смайлов для отправки в горн вместо них все равно будут отображаться те, что задуманы китайцами (какие-то рыбы, или что это?). Открываем ядро и бредем до gplayer_imp::SendFarCryChat Там смотрим, что у нас какие-то сравнения и прыжки идут. Кому они нахрен нужны? Стираем их и захватываем со всем этим всовывание 6-го набора смайлов в emote_id [ATTACH] Открываем gs hex редактором, находим 80 7D FF 01 75 0F 8B 45 08 0F BE 80 7F 0C 00 00 89 45 EC EB 07 C7 45 EC 06 00 00 00 И заменяем на 90 90 90 90 90 90 8B 45 08 0F BE 80 7F 0C 00 00 89 45 EC 90 90 90 90 90 90 90 90 90 [ATTACH] Загружаем обратно на сервер, запускаем и прыгаем як не москали до потолка. [ATTACH]
UPD (thnx @vieraw): Удалена WriteInt32 Удалена WriteString Буфер увеличен до 128 кбайт Свойства объявлены как public Переписана функция упаковки в CUInt32
По поводу предложений: ввести 2 переменных done и overflow для проверки статуса после завершения чтения пакета. А также учесть при чтении, что чтение может продолжаться даже после выхода из размеров буфера и добавить соотв. проверки и возврат дефолтного нуля. Сяп, добавлю, когда в очередной раз спонтанно накроет.
Какой же это UInt если с минусом?) Разницы все равно нет.
А в PHP разве нет перегрузки методов? procedure Write(Value: Byte); overload; procedure Write(Value: SmallInt); overload; procedure Write(Value: Word); overload; procedure Write(Value: Integer); overload; procedure Write(Value: Cardinal); overload; procedure Write(Value: Int64); overload; procedure Write(Value: UInt64); overload; procedure Write(Value: Single); overload; procedure Write(Value: Real); overload; procedure Write(Value: Boolean); overload; Кому как удобнее. Мне, например, так. Это как Int16/Word.
Позволяет собирать и читать пакеты на PHP. Слеплен на скорую руку. Приветствуются предложения. Структура: [ATTACH] Пример получения ника перса по его ID (в пакете есть и другая инфа, чтобы было, смотреть структуру GRoleBase), чтобы понять работу класса: struct __cppobj __attribute__((aligned(2))) GRoleBase : Rpc::Data { char version; unsigned int id; Octets name; int race; int cls; unsigned __int8 gender; Octets custom_data; Octets config_data; unsigned int custom_stamp; unsigned __int8 status; int delete_time; int create_time; int lastlogin_time; GRoleForbidVector forbid; Octets help_states; unsigned int spouse; unsigned int userid; Octets cross_data; unsigned __int8 reserved2; unsigned __int8 reserved3; unsigned __int8 reserved4; }; <? include("packet_class.php"); $GetRoleBase = new WritePacket(); $GetRoleBase -> WriteUInt32(-1); // always $GetRoleBase -> WriteUInt32(1024); // userid $GetRoleBase -> Pack(0xBC5); if (!$GetRoleBase -> Send("localhost", 29400)) // send to gamedbd return; $GetRoleBase_Re = new ReadPacket($GetRoleBase); // reading packet from stream $packetinfo = $GetRoleBase_Re -> ReadPacketInfo(); // read opcode and length $GetRoleBase_Re -> ReadUInt32(); // always $GetRoleBase_Re -> ReadUInt32(); // retcode $GetRoleBase_Re -> ReadUByte(); // version $GetRoleBase_Re -> ReadUInt32(); // id echo $GetRoleBase_Re -> ReadUString(); // show rolename ?>
, post: 152810, member: 12202"]Ну или ко мне sasah2111 не поверю, что ты сам догадался до фикса За него всё Joslian делает. Сам LiptoN[Triton] по-моему только копирайт ставит :D Как ни печально.
CUInt Дополнение на случай, если тс запросит готовые функции для работы с куинтами: GNET::Marshal::OctetsStream::compact_uint32(Marshal::OctetsStream *const this, unsigned int x) GNET::Marshal::OctetsStream::uncompact_uint32(const Marshal::OctetsStream *const this, const unsigned int *const x)
Не посылайте меня читать то, что я учил 20 лет назад Каким форматом пакуются unsigned int ?? Мда. Это ж что там учить можно было? Перевод в двоичную систему? Никого на этом форуме кодить не учили — у всех знания получены собственным трудом; вся информация лежит в интернете.
Имена участников (разделяйте запятой).