|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Копаем клиент Копаем клиент |
|
Опции темы | Поиск в этой теме | Опции просмотра |
19.07.2010, 22:11 | #1 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
0x00A9 SMSG_UPDATE_OBJECT (GAMEOBJECT_PARENTROTATION)
Пакет А9, в нем содержится данные о координатах в часности и ГО, все бы так и ничего, но вот до 3.1.0 поля GAMEOBJECT_PARENTROTATION[4] содержали содержали информацию об наклонах ГО вокруг своей оси.
А с обновлением 3.1.0 было добавлено еще одно поле (uint64)rotation, которое содержится в мовемент блоке, и сейчас, на сколько я понимаю, ротация упакована как раз в в это поле. В мангосе есть функция, которая упаковывает значения с БД в это поле: Код:
void GameObject::UpdateRotationFields(float rotation2 /*=0.0f*/, float rotation3 /*=0.0f*/) { static double const atan_pow = atan(pow(2.0f, -20.0f)); double f_rot1 = sin(GetOrientation() / 2.0f); double f_rot2 = cos(GetOrientation() / 2.0f); int64 i_rot1 = int64(f_rot1 / atan_pow *(f_rot2 >= 0 ? 1.0f : -1.0f)); int64 rotation = (i_rot1 << 43 >> 43) & 0x00000000001FFFFF; //float f_rot2 = sin(0.0f / 2.0f); //int64 i_rot2 = f_rot2 / atan(pow(2.0f, -20.0f)); //rotation |= (((i_rot2 << 22) >> 32) >> 11) & 0x000003FFFFE00000; //float f_rot3 = sin(0.0f / 2.0f); //int64 i_rot3 = f_rot3 / atan(pow(2.0f, -21.0f)); //rotation |= (i_rot3 >> 42) & 0x7FFFFC0000000000; m_rotation = rotation; if(rotation2==0.0f && rotation3==0.0f) { rotation2 = (float)f_rot1; rotation3 = (float)f_rot2; } SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2); SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rotation3); } в клиенте нашел вот такое: Код:
int __thiscall CGObject_C__TranslateRotation(void *this, int a2) { int v3; // edx@1 void (*v4)(void); // eax@1 int v5; // [sp+Ch] [bp-Ch]@1 float v6; // [sp+10h] [bp-8h]@1 float v7; // [sp+14h] [bp-4h]@1 v3 = *(_DWORD *)this; *(float *)a2 = 0.0; *(float *)(a2 + 4) = 0.0; v4 = *(void (**)(void))(v3 + 52); *(float *)(a2 + 8) = 0.0; *(float *)(a2 + 12) = 1.0; v7 = 1.0; *(float *)&v5 = 0.0; v6 = 0.0; v4(); sub_982400(0.0, (int)&v5); return a2; } int __thiscall sub_982400(int this, float a2, int a3) { int result; // eax@1 float v4; // ST08_4@1 double v5; // st7@1 float v6; // [sp+Ch] [bp-4h]@1 v4 = a2 * 0.5; a2 = cos(v4); v6 = sin(v4); result = a3; *(float *)(this + 12) = a2; v5 = v6; *(float *)this = *(float *)result * v6; *(float *)(this + 4) = *(float *)(result + 4) * v5; *(float *)(this + 8) = v5 * *(float *)(result + 8); return result; } Пробовал написать обратную функцию, чтоб получить из (uint64)rotation и orientation получить 2 поля (float)rotation2 и (float)rotation3 но получил совсем не то, что надо. Объясните пожалуйста, как это должно работать? или подскажите куда копать. И вообще, содержатся ли в апдейтполях GAMEOBJECT_PARENTROTATION[4] хоть какая-то полезная информация? или они остались как осколки прошлого? Последний раз редактировалось Konctantin; 11.12.2010 в 14:11. |
19.07.2010, 22:26 | #2 |
WowCore Dev
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
|
Вот так выглядели апдейт поля до 3.1.0
Код:
GAMEOBJECT_DISPLAYID = 8; // 001 - [1] Integer - [001] PUBLIC GAMEOBJECT_FLAGS = 9; // 001 - [2] TwoWords - [001] PUBLIC GAMEOBJECT_ROTATION = 10; // 002 - [4] uInt64 - [001] PUBLIC GAMEOBJECT_PARENTROTATION = 12; // 004 - [3] Single - [001] PUBLIC GAMEOBJECT_POS_X = 16; // 001 - [3] Single - [001] PUBLIC GAMEOBJECT_POS_Y = 17; // 001 - [3] Single - [001] PUBLIC GAMEOBJECT_POS_Z = 18; // 001 - [3] Single - [001] PUBLIC GAMEOBJECT_FACING = 19; // 001 - [3] Single - [001] PUBLIC GAMEOBJECT_DYNAMIC = 20; // 001 - [2] TwoWords - [256] DYNAMIC GAMEOBJECT_FACTION = 21; // 001 - [1] Integer - [001] PUBLIC GAMEOBJECT_LEVEL = 22; // 001 - [1] Integer - [001] PUBLIC GAMEOBJECT_BYTES_1 = 23; // 001 - [5] FourBytes - [001] PUBLIC GAMEOBJECT_END = 24; А вот для чего нужны GAMEOBJECT_PARENTROTATION лично для меня остается загадкой. |
Пользователь сказал cпасибо: | Konctantin (19.07.2010) |
20.07.2010, 04:14 | #4 | |
Гость
Сообщений: n/a
|
Цитата:
Код:
enum EGameObjectFields { ... GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC ... } Когда-то делал для трупожорки: Код:
obj0361: f01_update_type: UPDATETYPE_CREATE_OBJECT (0x2) f02_guid: 0xF11002FB970009B0 f03_type_id: TYPEID_GAMEOBJECT (0x5) f04_movement_updateblock: f010_rotation: 1355697 f01_flags1: UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION | UPDATEFLAG_ROTATION (0x350) f03_3_1_x: 563.069 f03_3_2_y: 70.785 f03_3_3_z: 395.695 f03_3_4_o: -1.571 f05_4_pos_x: 563.069 f05_4_pos_y: 70.785 f05_4_pos_z: 395.695 f05_GUID_HIPART: 0x970009b0L f05_p_orient: 0.000 unk_q: 0 f05_values_updateblock: 0000: ('OBJECT_GUID_LOW', 2533362096L) 0001: ('OBJECT_GUID_HIGH', 4044358395L) 0002: ('OBJECT_TYPE', 33) 0003: ('OBJECT_ENTRY', 195479) 0004: ('OBJECT_SCALE_X', 2.1942160129547119) 0008: ('GAMEOBJECT_DISPLAYID', 9041) 0012: ('GAMEOBJECT_PARENTROTATION3', 0.70710670948028564) 0013: ('GAMEOBJECT_PARENTROTATION4', 0.7071068286895752) 0014: ('GAMEOBJECT_DYNAMIC', 4294901762L) 0017: ('GAMEOBJECT_BYTES_1', 4278198017L) orientation = f03_3_4_o rotation0 = 0 rotation1 = 0 rotation2 = GAMEOBJECT_PARENTROTATION3 rotation3 = GAMEOBJECT_PARENTROTATION4 ----------------------------------- Если конечно ничего не изменилось.... Последний раз редактировалось GriffonHeart; 20.07.2010 в 04:27. |
|
20.07.2010, 09:15 | #5 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
Вот по этому, и спрашиваю. |
|
20.07.2010, 10:33 | #6 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
А Вы уверены что все корректно залилось в базу? Кроме вас пока на это никто не жаловался...
|
20.07.2010, 14:00 | #7 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Вот скрины с оффа:
вот полученный обработанный дамп: PHP код:
в базу заливал, значения такие-же. Выложить скрины с сервака не могу, так как его у меня нету, сейчас соберу и "сфоткаю результат", но и без скринов понятно, что что-то не правильно, так как у всех одинаковая ротация: Код:
OBJECT_FIELD_ENTRY 175680 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 OBJECT_FIELD_ENTRY 175679 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 OBJECT_FIELD_ENTRY 175682 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 OBJECT_FIELD_ENTRY 175683 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 OBJECT_FIELD_ENTRY 175686 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 OBJECT_FIELD_ENTRY 175687 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 OBJECT_FIELD_ENTRY 175688 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 OBJECT_FIELD_ENTRY 175689 GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 |
20.07.2010, 14:04 | #8 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
|
20.07.2010, 14:36 | #9 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Вот скрин с сервера:
http://dl.dropbox.com/u/9241118/WoWS...010_153059.jpg |
20.07.2010, 16:28 | #10 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
я чот смотрю смотрю и не пойму проблемы.
если взять снифф, влить в базу респонс ГО, влить в мир А9 со снифа, один в один. то какая проблема тогда может возникнуть то? чудес не бывает, значит где то ошибаетесь в парсинге. не те поля не в свои места складываете в базе. размышляю: однозначно можно сказать, что респонс на ГО ни как не должен влиять на расположение ГО в мире - ГО может быть несколько одинаковых, но стоять по разному. значит расположением в мире занимается А9, больше вроде нечему. значит парсинг А9 у вас с ошибкой, какой нибудь копипаст в программе. либо где данные извлекаются из буфера, либо где они сохраняются в базу. я все же надеюсь, что когда нибудь PKT формат станет централизованным стандартом добавлено. парсинг снифа: Код:
--- NEW OBJECT [015/063]--------------------------------------------------------------- update type = UPDATE_TYPE_CREATE_FULL, ofs=0843 GUID F11002AE40000A6C unit type = (5) GAME_OBJECT, ofs=0844 20.07.2010, 17:35:07: create flags: 0x0350 flag0 (0x100): guid_unk1 = 0000000000000000 flag0 (0x100): x1=-4698.273926, y1=-1312.965088, z1=503.944275 flag0 (0x100): x2=-4698.273926, y2=-1312.965088, z2=503.944275 flag0 (0x100): f1=1.039072, f2=0.000000 flag0 (0x10) = 40000A6C flag0 (0x200): guid_unk2 = 00000000E489B91B BitMask blocks = 1 20.07.2010, 17:35:07: A9: added ParseGameobject 20.07.2010, 17:35:07: 0 OBJECT_FIELD_GUID_LO 40000A6C (1073744492) 1 OBJECT_FIELD_GUID_HI F11002AE (-250608978) 2 OBJECT_FIELD_TYPE 00000021 (33) 3 OBJECT_FIELD_ENTRY 0002AE40 (175680) 4 OBJECT_FIELD_SCALE_X 3FCCCCCD (1.600000) 8 GAMEOBJECT_DISPLAYID 000000D6 (214) 12 GAMEOBJECT_PARENTROTATION_3 3F678A60 (0.904455) 13 GAMEOBJECT_PARENTROTATION_4 3EDA6737 (0.426569) 14 GAMEOBJECT_DYNAMIC FFFF0000 (-65536) 17 GAMEOBJECT_BYTES_1 FF000901 (-16774911) Код:
--- NEW OBJECT [016/063]--------------------------------------------------------------- update type = UPDATE_TYPE_CREATE_FULL, ofs=08A9 GUID F11002AE3F000A8F unit type = (5) GAME_OBJECT, ofs=08AA 20.07.2010, 17:35:07: create flags: 0x0350 flag0 (0x100): guid_unk1 = 0000000000000000 flag0 (0x100): x1=-4714.706055, y1=-1325.925049, z1=504.599030 flag0 (0x100): x2=-4714.706055, y2=-1325.925049, z2=504.599030 flag0 (0x100): f1=-0.165149, f2=0.000000 flag0 (0x10) = 3F000A8F flag0 (0x200): guid_unk2 = 00000000DF825A2D BitMask blocks = 1 20.07.2010, 17:35:07: A9: added ParseGameobject 20.07.2010, 17:35:07: 0 OBJECT_FIELD_GUID_LO 3F000A8F (1056967311) 1 OBJECT_FIELD_GUID_HI F11002AE (-250608978) 2 OBJECT_FIELD_TYPE 00000021 (33) 3 OBJECT_FIELD_ENTRY 0002AE3F (175679) 4 OBJECT_FIELD_SCALE_X 3FCCCCCD (1.600000) 8 GAMEOBJECT_DISPLAYID 000000D6 (214) 12 GAMEOBJECT_PARENTROTATION_3 3F678A60 (0.904455) 13 GAMEOBJECT_PARENTROTATION_4 3EDA6737 (0.426569) 14 GAMEOBJECT_DYNAMIC FFFF0000 (-65536) 17 GAMEOBJECT_BYTES_1 FF000901 (-16774911) З.Ы. кстати, снифф имеет неправильный заголовок. первые три байта понятно - PKT четвертый и пятый байты - версия сниффа. у вас 2.2, значит тут должно быть 0х0202 далее SnifferID - 0х06. у вас же вот так: P,K,T,0x06,0x00,0x00. должно быть P,K,T,0x02,0x02,0x06. Последний раз редактировалось RomanRom2; 20.07.2010 в 16:43. |
Пользователь сказал cпасибо: | Konctantin (20.07.2010) |
20.07.2010, 16:40 | #11 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Ну как видите, координаты нормальные, а вот сама ротация косячит.
Ротация это как раз эти самые 4 апдейт поля: GAMEOBJECT_PARENTROTATION[4], но ведь остальные поля парсятся нормально, нифига понять не могу. |
20.07.2010, 17:11 | #12 | ||
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
Цитата:
Вот так пойдет? Код:
private void OpenFileAndWriter() { CurrentFile = new WPLFileInfo(String.Format(@"{0}/{1:yyyy-MM-dd_HH-mm-ss-ffff}.pkt", LogsFolder, DateTime.Now), DateTime.Now); Writer = new BinaryWriter(new FileStream(CurrentFile.FileName, FileMode.Create)); Writer.Write('P'); Writer.Write('K'); Writer.Write('T'); Writer.Write((byte)0x02); Writer.Write((byte)0x02); Writer.Write((byte)0x06); Writer.Write((ushort)12340);// build (todo: read from config) Writer.Write((uint)0); // locale Writer.Write(new byte[20]); // sessionKey Writer.Write(new byte[64]); // realmName } Последний раз редактировалось Konctantin; 20.07.2010 в 17:17. |
||
20.07.2010, 17:35 | #13 | |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
Цитата:
на сайте опубликована версия 2.1 сниффа. но существует еще и версия 2.2, она отличается от 2.1 только заголовком самого сниффа, а именно: P,K,T, - вид сниффа, PKT или RAW. 0х02, 0х02 - версия сниффа эти пять байт всегда означают эти поля - вид и версия. дальнейший заголовок зависит от версии сниффа. - для 2.1 2 bytes: client build 40 bytes: session key - для 2.2 1 byte: sniffer ID 2 bytes: client build 4 bytes: language 20 bytes: session key (obsolete) 64 bytes: realm name по поводу вашего сниффа: ваш содержит в заголовке следующие данные: 0000000000: 50 4B 54 06 00 00 34 30 │ 00 00 00 00 00 00 00 00 50 4B 54 - PKT далее должно быть 0х02, 0х02 - версия сниффа, а у вас 0х06. далее у вас два нуля, далее билд клиента ну видно что формат 2.2 используется, мои вьюверы просто не приняли снифф изза неправильной версии сниффа. поэтому я и сказал вам о неправильных данных в заголовке. у вас получилось 0х0600 вместо 0х0202 или 0х0102 ожидаемых. я не знаю, почему получил распространение формат 2.2 у "сторонних" разработчиков, назовем их так, у нас он как то не прижился. мы сами используем версию заголовка 2.1. как я уже говорил ранее, 2.2 "родился" в тот короткий момент, когда близзы сделали ключ 20ти байтным. это продолжалось буквально какие то 2-3 билда. поэтому 2.2 не может использоваться для хранения session key. наверное поэтому мы его и не используем. но раз уж столько софта написано и сниффов наснифано, то приходится вот поддерживать. теперь собсно по делу: вы так и не ответили на вопрос - вы создаете ГО в мире с флагами 0х100 и соответствующими флоатами или нет? |
|
20.07.2010, 18:12 | #14 | ||
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
с форматом вроде уже все ок, поправил
Цитата:
Цитата:
И из апдейт полей: (float)GAMEOBJECT_PARENTROTATION[4] |
||
20.07.2010, 18:24 | #15 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
что кладете вот сюда для разных объектов ГО?
Код:
flag0 (0x100): f1=1.039072, f2=0.000000 |
20.07.2010, 18:34 | #16 | |
WowCore Dev
Регистрация: 11.03.2010
Сообщений: 112
Сказал(а) спасибо: 10
Поблагодарили 51 раз(а) в 25 сообщениях
|
Цитата:
Код:
flag0 (0x100): x1=-4698.273926, y1=-1312.965088, z1=503.944275 flag0 (0x100): x2=-4698.273926, y2=-1312.965088, z2=503.944275 По теме: если декомпилированный код, приведенный в первом посте действительно относится к ParentRotation, то он как-то забавно применяется... Числа полученные от элементов ParentRotation поэлементно домнажаются к уже существующему вектору. Но HexRays криво распарсил ассемблированный код и что там на самом деле происходит сейчас сказать трудно. |
|
23.07.2010, 21:34 | #17 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
давайте дальше продолжим.
данные для полей rotation0, rotation1, rotation2, rotation3 (таблицы gameobject) упакованы в (uint64)rotation в movement блоке пакета A9. а в самих полях GAMEOBJECT_PARENTROTATION[4] содержится какая-то дополнительная информация: Цитата:
Код:
int64 i_rot1 = int64(f_rot1 / atan_pow *(f_rot2 >= 0 ? 1.0f : -1.0f)); int64 rotation = (i_rot1 << 43 >> 43) & 0x00000000001FFFFF; //float f_rot2 = sin(0.0f / 2.0f); //int64 i_rot2 = f_rot2 / atan(pow(2.0f, -20.0f)); //rotation |= (((i_rot2 << 22) >> 32) >> 11) & 0x000003FFFFE00000; //float f_rot3 = sin(0.0f / 2.0f); //int64 i_rot3 = f_rot3 / atan(pow(2.0f, -21.0f)); //rotation |= (i_rot3 >> 42) & 0x7FFFFC0000000000; а если смотреть сюда, и если я понял правильно, то все 4: Код:
*(float *)(this + 12) = orientation; v5 = v6; *(float *)this = *(float *)result * v6; *(float *)(this + 4) = *(float *)(result + 4) * v5; *(float *)(this + 8) = v5 * *(float *)(result + 8); |
|
24.07.2010, 23:12 | #18 |
Пользователь
Регистрация: 20.06.2010
Сообщений: 42
Сказал(а) спасибо: 4
Поблагодарили 5 раз(а) в 5 сообщениях
|
а в чем проблема? у вас ГО криво стоят?
|
24.07.2010, 23:16 | #19 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
именно так, стоят криво...
Но все что я не пробовал не дало ни какого результата... Объясните мне пожалуйста, что передается в поле (long)rotation не упакованные ли поля (float)rotation[4] для таблицы gameobject а то я уже совсем запутался... ЗЫ. Криво стоят те, которые должны бвть наклонены или повернуты по y-z оси (не отностится к ориентации) ЗЫЫ.. Если все говорят что нет проблем, и все правильно, то приведите пожалуйста "правильную" запись для ГО что находятся в этом посте Последний раз редактировалось Konctantin; 24.07.2010 в 23:21. |
24.07.2010, 23:31 | #20 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
единственное в чем я уже точно уверен, так это то, что 0.904455, 0.426569, это как-бы соотношение сторон в данных табличках в 2d плоскости.
|
25.07.2010, 05:38 | #21 | |
Гость
Сообщений: n/a
|
Цитата:
Далее GAMEOBJECT_PARENTROTATION+0 - напрямую берётся из базы GAMEOBJECT_PARENTROTATION+1 - напрямую берётся из базы GAMEOBJECT_PARENTROTATION+2 - если = 0, то перерасчитывается на основе ориентации GetOrientation() GAMEOBJECT_PARENTROTATION+3 - если = 0, то перерасчитывается на основе ориентации GetOrientation() -------------------- От сюда напрашивается вывод, что из снифа нам нужна только ориентация (не та которая лонг упакованная) из мувмент-блока и GAMEOBJECT_PARENTROTATION+0, GAMEOBJECT_PARENTROTATION+1 - из апдейт-блока, причём GAMEOBJECT_PARENTROTATION+2 и GAMEOBJECT_PARENTROTATION+3 брать со снифа и записывать в базу не обязательно, их можно оставить равными нулю, тогда их мангос сам расчитает на основе ориентации (не той которая long упакованная) |
|
25.07.2010, 05:59 | #22 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Уже пробовали, в самый первый раз (по крайней мере, со слов Konctantin) делать именно так — фиг вам, все-равно криво они показываются.
|
25.07.2010, 12:43 | #23 |
Пользователь
Регистрация: 20.06.2010
Сообщений: 42
Сказал(а) спасибо: 4
Поблагодарили 5 раз(а) в 5 сообщениях
|
дайте координаты по которым можно портанутся, гляну у себя криво ли ГО стоит.
|
25.07.2010, 12:49 | #24 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
такс, оки, давайте будем рассуждать логически и откинем то что есть в мангосе.
давайте еще раз взглянем на на этот пост, посмотрим скрины, посмотрим, сам снифф, посмотрим полученные sql statements. или если не верите, залейте сами. Как вы можете видеть, у все одинаковые значения: GAMEOBJECT_PARENTROTATION_2 0.904455 GAMEOBJECT_PARENTROTATION_3 0.426569 и честное слове меня это поражает: Цитата:
|
|
25.07.2010, 12:50 | #25 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
|
|
25.07.2010, 13:03 | #26 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Вот еще:
Код:
//id name (ulong)rotation // таблички которые "лежат" (наклон 90) 175681 Roc Talon 4DC8DB46E489B91B 175680 Fossilized Egg 4DC8DB46E489B91B // наклон приблизительно на 30-40 градусов 175686 Highborne Astrolabe D77F2BF3F610DE59 // наклон приблизительно на 10-15 градусов 175682 Geru Strider 08A737EB9CADBE5A // ГО стоит прямо 152095 Moonpetal Lily 00000000001007A4 int64 rotation = (i_rot1 << 43 >> 43) & 0x00000000001FFFFF; Последний раз редактировалось Konctantin; 25.07.2010 в 14:59. |
25.07.2010, 15:20 | #27 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
Код:
int __thiscall sub_982340(UnkFloats *this, int *a2) { long double v2; // st5@1 long double v4; // st6@1 wtf is v4? int result; // eax@2 this->float0 = 0.0; this->float4 = 0.0; this->float8 = 0.0; this->floatC = 0.0; this->float0 = (double)(signed int)(*(_QWORD *)a2 >> 42) * 0.000000476837158203125; this->float4 = (double)((signed int)(*(_QWORD *)a2 << 22 >> 32) >> 11) * 0.00000095367431640625; this->float8 = (double)(signed int)(*(_QWORD *)a2 << 43 >> 43) * v4; // * 0.00000095367431640625 ? v2 = this->float8 * this->float8 + this->float0 * this->float0 + this->float4 * this->float4; if ( fabs(v2 - 1.0) >= v4 ) // ??? { result = (int)this; this->floatC = sqrt(1.0 - v2); } else { result = (int)this; this->floatC = 0.0; } return result; } Последний раз редактировалось TOM_RUS; 25.07.2010 в 16:16. |
Пользователь сказал cпасибо: | Konctantin (25.07.2010) |
25.07.2010, 17:51 | #29 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
Из uint64 поля, находящегося в мувмент блоке клиент получает 4 флоата посредством приведенного выше кода. Видимо это как-то связано с вашей проблемой.
|
26.07.2010, 00:36 | #30 |
Пользователь
Регистрация: 20.06.2010
Сообщений: 42
Сказал(а) спасибо: 4
Поблагодарили 5 раз(а) в 5 сообщениях
|
Видимо теперь этим числом задается поворот ГО в пространстве и больше не используются GAMEOBJECT_PARENTROTATION.
И кроме как держать его в базе я другого пути пока не вижу. Скриншот не могу прикрепить, форум режет урлы ( Вот разбор одного из такого ГО: Код:
UpdateType = UPDATETYPE_CREATE_OBJECT objGuid = $F11002AE3F000A87 objType = TYPEID_GAMEOBJECT ($5) obj_flag (word) = $0358 ($0008,$0010,$0040,$0100,$0200) if (obj_flag and UPDATEFLAG_POSITION) > 0 then begin GUID (pGUID) = $0000000000000000 posX=-4714,7060546875 posY=-1325,92492675781 posZ=504,599029541016 posX=-4714,7060546875 posY=-1325,92492675781 posZ=504,599029541016 posR=-0,165148675441742 posR=0 end; if (obj_flag and UPDATEFLAG_LOWGUID) > 0 then begin LowGUID (int) = $00002AAA end; if (obj_flag and UPDATEFLAG_HIGHGUID) > 0 then begin HighGUID (int) = $00000100 end; if (obj_flag and UPDATEFLAG_ROTATION) > 0 then begin GameobjectRotation (int64) = 1355986587154012717 end; IndexCount = 1 OBJECT_FIELD_GUID = $F11002AE3F000A87 OBJECT_FIELD_TYPE = 33 OBJECT_FIELD_ENTRY = 175679 OBJECT_FIELD_SCALE_X = 1,60000002384186 GAMEOBJECT_DISPLAYID = 214 GAMEOBJECT_PARENTROTATION_3 = 0,904455184936523 GAMEOBJECT_PARENTROTATION_4 = 0,426568686962128 GAMEOBJECT_DYNAMIC = $FFFF0000 GAMEOBJECT_BYTES_1 = $FF000901 Последний раз редактировалось Fmut; 26.07.2010 в 00:42. |
26.07.2010, 01:00 | #31 | ||
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
Цитата:
Код:
void UnpackRotation(ulong data, ref float[] rotation) { double v1 = 0.000000476837158203125; double v2 = 0.000000953674316406250; rotation[0] = (float)( (data >> 42) * v1); rotation[1] = (float)(((data << 22 >> 32) >> 11) * v2); rotation[2] = (float)( (data << 43 >> 43) * v2); float temp = (float)(Math.Pow(rotation[2], 2) + Math.Pow(rotation[1], 2) + Math.Pow(rotation[0], 2)); if (Math.Abs(temp - 1.0f) >= v2) rotation[3] = (float)(Math.Sqrt(1.0f - temp)); else rotation[3] = 0.0f; } я еще попробую помучить это все. Последний раз редактировалось Konctantin; 26.07.2010 в 01:05. |
||
26.07.2010, 01:09 | #32 |
Пользователь
Регистрация: 20.06.2010
Сообщений: 42
Сказал(а) спасибо: 4
Поблагодарили 5 раз(а) в 5 сообщениях
|
Вот как у меня сейчас упаковывается поворот в горизонтали:
Код:
function GetGORotation(R: Single): Int64; begin if Cos(R / 2) >= 0 then Result := $1FFFFF and (Round(Sin(R / 2) / ArcTan(Power(2, -20)))) else Result := $1FFFFF and (Round(Sin(R / 2) / ArcTan(Power(2, -20)) * (-1))); end; |
03.08.2010, 02:30 | #33 |
Kobold Dev
|
ребят не мучайтесь
константин уже сам ответил сам же в первом посту вырезка из клиента v3 = *(_DWORD *)this; *(float *)a2 = 0.0; *(float *)(a2 + 4) = 0.0; v4 = *(void (**)(void))(v3 + 52); *(float *)(a2 + 8) = 0.0; *(float *)(a2 + 12) = 1.0; v7 = 1.0; *(float *)&v5 = 0.0; v6 = 0.0; v4(); Vladimir/- (02:24:14 3/08/2010) ну блин, весь ответ в первом посту Vladimir/- (02:24:23 3/08/2010) преобразование кватерниона в матрицу вращения Vladimir/- (02:24:29 3/08/2010) 99.9% что оно Vladimir/- человек который не дописал колиду в кобольде -)))) (падлец) ниже прилагаеца статья http://www.gamedev.ru/code/articles/?id=4215
__________________
Вообще-то я не специалист по этим гравицаппам... |
25.05.2011, 19:04 | #34 |
MaNGOS Dev
Регистрация: 14.03.2010
Сообщений: 38
Сказал(а) спасибо: 23
Поблагодарили 49 раз(а) в 16 сообщениях
|
С последними изменениями вновь стало возможно получать повороты гейм объектов из сниффов
Я надеюсь разработчики базы воспользуются ею, т.к. в базах уже ~11к го без поворотов.. |
Пользователь сказал cпасибо: | Konctantin (25.05.2011) |
25.05.2011, 19:10 | #35 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
Т.е теперь мы их берем не из GAMEOBJECT_PARENTROTATION 1 -4, а вытаскиваем из UPDATEFLAG_ROTATION?Или можно оттуда и оттуда брать?
|
25.05.2011, 19:12 | #36 | |
MaNGOS Dev
Регистрация: 14.03.2010
Сообщений: 38
Сказал(а) спасибо: 23
Поблагодарили 49 раз(а) в 16 сообщениях
|
только из UPDATEFLAG_ROTATION т.к.
Цитата:
Последний раз редактировалось SilverIce; 25.05.2011 в 19:18. |
|
Пользователь сказал cпасибо: | Konctantin (25.05.2011) |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[13329] SMSG_UPDATE_OBJECT | Konctantin | Копаем клиент | 7 | 19.07.2011 20:17 |