/////////////////////////////////////////////////////////// // MobSurgeon // // Редактор mob-ов для Проклятых Земель // // Copyright (C) 2005-2007 Gipat Group // // Распространяется на условиях // // Gipat Group's opened EI-editor-utility license // // версии 1.0 // // // // www.gipatgroup.org // /////////////////////////////////////////////////////////// //К работе над данным файлом приложили руки, ноги.... короче аффтары: // 1) Sagrer (sagrer@yandex.ru) //////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- #pragma hdrstop #include "MobParticle3Obj.h" #include "MobFormat.h" //--------------------------------------------------------------------------- #pragma package(smart_init) /////////////////////////////////// //TParticle3ObjBlock /////////////////////////////////// DWORD TParticle3ObjBlock::GetBlockSize() //Считает сколько будет весить блок в виде байтов. { //Переменные... DWORD Result = 72; int i; //72 - минимальный размер без учета длины вариабельных переменных. //Строки и массивы байтов... Result = Result + NameStr.Length() + UnknStr1.Length(); //Поскольку базовая часть у этого типа объекта не используется - //просто присобачить длину сигнатуры и размера блока - 8 байт. Result = Result + 8; return Result; }; bool TParticle3ObjBlock::ReadBlock(byte *Buff, DWORD BuffSize, bool UseLog, TMob *PMobObj) //Читает инфу о рычаге в структуру. { //Локальные переменные... DWORD TempDW1, MinBlockSgn, MinBlockSize, TempDW2, i; bool Result = true; __int64 Cursor = 8; //Читать сам блок в цикле. do { //Прочитать сигнатуру подблока... memcpy(&MinBlockSgn,&Buff[Cursor],4); Cursor = Cursor+4; //Теперь в зависимости от типа подблока... if (MinBlockSgn == Ptl3_Sgn_ID) { //Типа идешник ентого партикла... //DWORD //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&ID,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl3_Sgn_Coords) { //Координаты //float X 3 //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значения... memcpy(&CoordX,&Buff[Cursor],4); Cursor = Cursor+4; memcpy(&CoordY,&Buff[Cursor],4); Cursor = Cursor+4; memcpy(&CoordZ,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl3_Sgn_NameStr) { //Типа имя партикла //String //Прочитать длину блока... memcpy(&MinBlockSize,&Buff[Cursor],4); Cursor = Cursor+4; NameStr.SetLength(MinBlockSize-8); //Прочитать значение... if ((MinBlockSize-8) != 0) { memcpy(&NameStr[1],&Buff[Cursor],(MinBlockSize-8)); Cursor = Cursor+(MinBlockSize-8); } else { NameStr = ""; }; } else if (MinBlockSgn == Ptl3_Sgn_UnknStr1) { //Строка неизвестного назначения //String //Прочитать длину блока... memcpy(&MinBlockSize,&Buff[Cursor],4); Cursor = Cursor+4; UnknStr1.SetLength(MinBlockSize-8); //Прочитать значение... if ((MinBlockSize-8) != 0) { memcpy(&UnknStr1[1],&Buff[Cursor],(MinBlockSize-8)); Cursor = Cursor+(MinBlockSize-8); } else { UnknStr1 = ""; }; } else if (MinBlockSgn == Ptl3_Sgn_UnknDw1) { //Неизвестный DW 1 //DWORD //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UnknDw1,&Buff[Cursor],4); Cursor = Cursor+4; } else if (MinBlockSgn == Ptl3_Sgn_UnknFloat1) { //Неизвестный float 1 //float //Проскочить длину блока... Cursor = Cursor+4; //Прочитать значение... memcpy(&UnknFloat1,&Buff[Cursor],4); Cursor = Cursor+4; }; } while (Cursor != BuffSize); StopLoadUnitBlock: //Метка для скачка сюда при сбое. ; return Result; }; byte* TParticle3ObjBlock::GenBlock(DWORD& BlockSize) //Генерирует блок... { //Переменные byte* Result = NULL; int i = 0; //счетчик DWORD ChetireBaita, BlockSignature; DWORD Cursor = 0; //Итак, поехали. В начале выделить память под блок... BlockSize = GetBlockSize(); Result = new byte[BlockSize]; //Затем сигнатура... memcpy(&Result[Cursor],&OB_Sgn_Particle3,4); Cursor = Cursor+4; //Длина блока. memcpy(&Result[Cursor],&BlockSize,4); Cursor = Cursor+4; //Типа идешник ентого партикла... //DWORD //Сигнатура подблока memcpy(&Result[Cursor],&Ptl3_Sgn_ID,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&ID,4); Cursor = Cursor+4; //Координаты //float X 3 //Сигнатура подблока memcpy(&Result[Cursor],&Ptl3_Sgn_Coords,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 20; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значения memcpy(&Result[Cursor],&CoordX,4); Cursor = Cursor+4; memcpy(&Result[Cursor],&CoordY,4); Cursor = Cursor+4; memcpy(&Result[Cursor],&CoordZ,4); Cursor = Cursor+4; //Типа имя партикла //String //Сигнатура подблока memcpy(&Result[Cursor],&Ptl3_Sgn_NameStr,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 8+NameStr.Length(); memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значние... if (ChetireBaita > 8) { memcpy(&Result[Cursor],&NameStr[1],NameStr.Length()); Cursor = Cursor+NameStr.Length(); }; //Строка неизвестного назначения //String //Сигнатура подблока memcpy(&Result[Cursor],&Ptl3_Sgn_UnknStr1,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 8+UnknStr1.Length(); memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значние... if (ChetireBaita > 8) { memcpy(&Result[Cursor],&UnknStr1[1],UnknStr1.Length()); Cursor = Cursor+UnknStr1.Length(); }; //Неизвестный DW 1 //DWORD //Сигнатура подблока memcpy(&Result[Cursor],&Ptl3_Sgn_UnknDw1,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknDw1,4); Cursor = Cursor+4; //Неизвестный float 1 //float //Сигнатура подблока memcpy(&Result[Cursor],&Ptl3_Sgn_UnknFloat1,4); Cursor = Cursor+4; //Длина блока... ChetireBaita = 12; memcpy(&Result[Cursor],&ChetireBaita,4); Cursor = Cursor+4; //Значение memcpy(&Result[Cursor],&UnknFloat1,4); Cursor = Cursor+4; //И вернуть результат... return Result; };