|
Копаем клиент Копаем клиент |
|
Опции темы | Поиск в этой теме | Опции просмотра |
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. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[13329] SMSG_UPDATE_OBJECT | Konctantin | Копаем клиент | 7 | 19.07.2011 20:17 |