Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Опкоды, Формулы, Клиент > Копаем клиент

Важная информация

Копаем клиент Копаем клиент

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.07.2010, 22:11   #1
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию 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);
}
Но исходя из этой функции, реально задействованы только 2 поля из 4 (rotation2 и rotation3), а как же быть с rotation0 и rotation1 если в самом этом поле, (uint64)rotation содержится 3 значения.

в клиенте нашел вот такое:
Код:
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.
Konctantin вне форума   Ответить с цитированием
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[13329] SMSG_UPDATE_OBJECT Konctantin Копаем клиент 7 19.07.2011 20:17


Текущее время: 06:26. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot