1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

1.5.3 (145) Структура .dhmap

Тема в разделе 'PW Вопросник', создана пользователем lukacho, 16 июл 2017.

Статус темы:
Закрыта.
  1. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Всем доброго времени суток.
    Уже N кол-во времени потратил что бы разобрать такой файл как .dhmap.Если кто не знает,то этот файл расположен в серверной части,в папке "карта/movemap/" и является одним из контролирующих файлов передвижения мобов.Судя по информации в ядре это 2d картинка,но вопрос в том как она строится?
    Структура файла выглядит так [​IMG]
    Как показало расследование файл разбивает на arrBlkSize(В структуре) количества картинок с размером 64х64,которые после соединяются согласно указанным в m_BlockIds(в структуре) значениям.
    В Blocks(В структуре) хранятся красивые,но непонятные значения(от 0 до 65536( 65536 около двух десятков во всех файлах пв)....
    [​IMG]
    Вопрос заключается в следующем:каким образом строятся изображения 64х64...Принимаются предположения.готов перепроверить все...
    Mr.Fleks и werewolf нравится это.
  2. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Впрочем сама структура для 010 editor,сам файл не загружается(rar в том числе).
    Mr.Fleks нравится это.
  3. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Еще один нюанс о котором узнал сегодня во время теста.Файл влияет абсолютно на все будь то мобы,нипы,игроки и даже выкапываемые ресурсы.Без него они просто проваливаются под объекты.
    Mr.Fleks нравится это.
  4. MorzE nullptr AngeliCore Пользователи

    Сообщения:
    198
    Лайки:
    134
    Пол:
    Мужской
    Репутация:
    3
    Страна:
    Russian Federation Russian Federation
    Размер изображения задан в структуре.
    Получаешь каждый пиксель этой функцией:
    Код:
    FIX16 CBlockImage::GetPixel(int u, int v) const
    {
      int uBlkOffset;
      int vBlkOffset;
      FIX16 pixel;
      FIX16 tDefault;
      int BlkID;
      int vBlkID;
      int uBlkID;
    
      if ( this->m_BlockIDs && u < this->m_iImageWidth && u >= 0 && v < this->m_iImageLength && v >= 0 )
      {
        uBlkID = u >> LOBYTE(this->m_iBlockSizeExp);
        vBlkID = v >> LOBYTE(this->m_iBlockSizeExp);
        BlkID = this->m_BlockIDs[uBlkID + this->m_iWidth * vBlkID];
        if ( BlkID == -1 )
        {
          memcpy(&tDefault, &this->m_defaultVal, 2u);
          pixel = tDefault;
        }
        else
        {
          uBlkOffset = u & (this->m_iBlockSize - 1);
          vBlkOffset = v & (this->m_iBlockSize - 1);
          int pixelPos = uBlkOffset + (vBlkOffset << LOBYTE(this->m_iBlockSizeExp));
          pixel = this->m_arrBlocks[BlkID][pixelPos];
        }
      }
      else
      {
        pixel = this->m_defaultVal;
      }
      return pixel;
    }
    Mr.Fleks и lukacho нравится это.
  5. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Пару раз смотрел подобную функцию,но каждый раз пропускал ее из за следующего:она возвращает uint16 значение,как его в пиксель преобразовать?Почти со всеми числами в файле получаются ужасные цвета если использовать
    Код:
    Color co = Color.FromArgb(uint16);
    как в шарпе.
    Mr.Fleks нравится это.
  6. MorzE nullptr AngeliCore Пользователи

    Сообщения:
    198
    Лайки:
    134
    Пол:
    Мужской
    Репутация:
    3
    Страна:
    Russian Federation Russian Federation
    Это карта высот, какие цвета должны быть не ужасными?
    [​IMG]
    По-моему, вполне нормальные цвета.
    Mr.Fleks и lukacho нравится это.
  7. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Я так понимаю поскольку в функции передается Pos2D u,v то это значения x,y позиции пикселя?
    Mr.Fleks нравится это.
  8. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    И ко всему прочему непонятно откуда m_defaultVal берется.Появляется только в этой функции.
    Mr.Fleks нравится это.
  9. MorzE nullptr AngeliCore Пользователи

    Сообщения:
    198
    Лайки:
    134
    Пол:
    Мужской
    Репутация:
    3
    Страна:
    Russian Federation Russian Federation
    Да.
    m_defaultVal появился во 2 версии. В 1 версии он равен 0.
    Mr.Fleks нравится это.
  10. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Ну и тогда последний вопрос.В структуре переменные в Blocks имеют тип FIX16,как показывает Ida это unsigned int16.Но у uint16 слишком маленький диапазон значений для представления html цвета в числовом формате.Может там uint32 используется?
    Mr.Fleks нравится это.
  11. MorzE nullptr AngeliCore Пользователи

    Сообщения:
    198
    Лайки:
    134
    Пол:
    Мужской
    Репутация:
    3
    Страна:
    Russian Federation Russian Federation
    Да, FIX16 это 16-ти битное целое число. Разработчики посчитали, что двух байт будет достаточно для этой карты.
    Mr.Fleks и Unix нравится это.
  12. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Mr.Fleks нравится это.
  13. MorzE nullptr AngeliCore Пользователи

    Сообщения:
    198
    Лайки:
    134
    Пол:
    Мужской
    Репутация:
    3
    Страна:
    Russian Federation Russian Federation
    Значит неправильно перевел.
  14. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
  15. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Последнее редактирование: 22 июл 2017
  16. MorzE nullptr AngeliCore Пользователи

    Сообщения:
    198
    Лайки:
    134
    Пол:
    Мужской
    Репутация:
    3
    Страна:
    Russian Federation Russian Federation
    Ошибка в 92 строке.
    Должно быть так:
    Код:
    BlkID = this.m_BlockIDs[uBlkID + this.m_iWidth * vBlkID];
    И функция LOBYTE должна быть так:
    Код:
            public static Byte LOBYTE(Int32 nValue)
            {
                return (Byte)(nValue & 0xFFFFFF);
            }
    Хотя ее (LOBYTE) можно вообще убрать из кода.
    lukacho нравится это.
  17. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    Так еще хуже получается.Изображение карты что ты скинул,там 93 блока.Но если использовать ту формулу что в ядре,максимум BlkId получает значение 23.

    Сколько карт не посмотрел везде значение BlockSizeExp=6;
  18. TopicStarter Overlay

    lukacho B L A C K    L I S T Пользователи

    Сообщения:
    537
    Лайки:
    156
    Пол:
    Мужской
    Репутация:
    -1
    Команда:
    XXXX
    Страна:
    Georgia Georgia
    1)Большое спасибо MorzE за то что навел меня на функцию в ядре,и прочие наводки.
    2)Проблема решена.Ошибка была в структуре...Опять же из за незнания c/c++ допустил ошибку.
    21 строка в структуре на первом скрине должна выглядеть так: int m_BlockIDs[BlkIDSize/4];
    Для примера так выглядит .dhmap могильника героя [​IMG]
    Тему можно закрывать.
Черновик сохранён Черновик удалён
Similar Threads
  1. Fituchini
    Ответов:
    36
    Просмотров:
    5.663
  2. vladick322
    Ответов:
    2
    Просмотров:
    1.305
  3. Semmi
    Ответов:
    6
    Просмотров:
    2.125
  4. Violence
    Ответов:
    6
    Просмотров:
    1.565
  5. kostik21730
    Ответов:
    3
    Просмотров:
    2.040
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей