Перейти к содержанию

Лидеры

Популярный контент

Показан контент с высокой репутацией 30.06.2010 во всех областях

  1. Сегодня наткнулся на полезное описание функции __RTDynamicCast похожее на _RTDynamicCast. И её и другие функции я размещу ниже. В игре Sniper: Ghost Warrior из информации сохранения конструктор создаёт в объекте игрока массив (указателей 30 подобъектов и 30-ти типов) из них не более 8-ми могут быть гранаты. Массив типа {{DWORD,VOID *}, ...} Первый например 0x14 (это ID типа гранат) Второй например 16A324D8 (это указатель на объект гранаты) В конструкторе есть функция _RTDynamicCast привидения любого из 30 классов сохранённых объектов к игровым объектам. _RTDynamicCast(v21, 0, &off_10A14088, &off_10A19214, 0); где первый парметр указатель на объект, который приводим к базовому классу второй параметр обычно ставят ноль, не помню что это [off_10A14088] = "AVISaveGame"; [off_10A19214] = "AVInvObject"; Последний ноль - генерировать ли исключение при ошибочном привиденияя Описание на англ. * PARAMS * cppobj [] Any C++ object to cast * unknown [] Reserved, set to 0 * src [] type_info object describing cppobj * dst [] type_info object describing the base class to cast to * do_throw [] TRUE = throw an exception if the cast fails, FALSE = don't Рассмотрим часть кода: v15 = *(_DWORD *)v4; v28 = v9; v17 = *(void (__thiscall **)(_DWORD))(v15 + 56); v27 = -1; v17(v4); sub_10046CD0(&v27); v16 = 0; // v3 - указатель на объект игрока if ( *((_DWORD *)v3 + 318) ) // если у игрока существует массив подобъектов { do { v19 = *(_DWORD *)v4; v27 = *((_DWORD *)v3 + 317) + 8 * v16; // вычислили позицию типа объекта v20 = (*(int (__thiscall **)(int))(v19 + 56))(v4); v21 = (dword_10AD14DC & 1) == 0; v18 = v27; *(_DWORD *)v27 = v20; // важная штука - ID типа подобъектов if ( v21 ) { dword_10AD14DC |= 1u; sub_103DCD90(v18); atexit(sub_1069A880); } v22 = sub_103DEA70(&dword_10AD0C68); ++v16; //позиция типа v27 объекта+4 *(_DWORD *)(v27 + 4) = _RTDynamicCast(v22, 0, &off_10A14088, &off_10A19214, 0); } while ( v16 < *((_DWORD *)v3 + 318) );// повторать пока не более 30-ти подобъектов } Полный код можно посмотреть здесь
    1 балл
×
×
  • Создать...

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

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.