/src/tools/vmap4_extractor/adtfile.cpp

https://gitlab.com/tkrokli/TrinityCore_434 · C++ · 227 lines · 170 code · 32 blank · 25 comment · 43 complexity · aef0ac0794ed1ef4648343203acf756b MD5 · raw file

  1. /*
  2. * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
  3. * Copyright (C) 2005-2011 MaNGOS <http://getmangos.com/>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at your
  8. * option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along
  16. * with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include "vmapexport.h"
  19. #include "adtfile.h"
  20. #include <algorithm>
  21. #include <cstdio>
  22. #ifdef WIN32
  23. #define snprintf _snprintf
  24. #endif
  25. char const* GetPlainName(char const* FileName)
  26. {
  27. const char * szTemp;
  28. if((szTemp = strrchr(FileName, '\\')) != NULL)
  29. FileName = szTemp + 1;
  30. return FileName;
  31. }
  32. char* GetPlainName(char* FileName)
  33. {
  34. char * szTemp;
  35. if((szTemp = strrchr(FileName, '\\')) != NULL)
  36. FileName = szTemp + 1;
  37. return FileName;
  38. }
  39. void FixNameCase(char* name, size_t len)
  40. {
  41. char* ptr = name + len - 1;
  42. //extension in lowercase
  43. for (; *ptr != '.'; --ptr)
  44. *ptr |= 0x20;
  45. for (; ptr >= name; --ptr)
  46. {
  47. if (ptr > name && *ptr >= 'A' && *ptr <= 'Z' && isalpha(*(ptr - 1)))
  48. *ptr |= 0x20;
  49. else if ((ptr == name || !isalpha(*(ptr - 1))) && *ptr >= 'a' && *ptr <= 'z')
  50. *ptr &= ~0x20;
  51. }
  52. }
  53. void FixNameSpaces(char* name, size_t len)
  54. {
  55. for (size_t i=0; i<len-3; i++)
  56. {
  57. if(name[i] == ' ')
  58. name[i] = '_';
  59. }
  60. }
  61. char* GetExtension(char* FileName)
  62. {
  63. if (char* szTemp = strrchr(FileName, '.'))
  64. return szTemp;
  65. return NULL;
  66. }
  67. extern HANDLE WorldMpq;
  68. ADTFile::ADTFile(char* filename) : ADT(WorldMpq, filename, false)
  69. {
  70. Adtfilename.append(filename);
  71. }
  72. bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY)
  73. {
  74. if(ADT.isEof ())
  75. return false;
  76. uint32 size;
  77. string xMap;
  78. string yMap;
  79. Adtfilename.erase(Adtfilename.find(".adt"),4);
  80. string TempMapNumber;
  81. TempMapNumber = Adtfilename.substr(Adtfilename.length()-6,6);
  82. xMap = TempMapNumber.substr(TempMapNumber.find("_")+1,(TempMapNumber.find_last_of("_")-1) - (TempMapNumber.find("_")));
  83. yMap = TempMapNumber.substr(TempMapNumber.find_last_of("_")+1,(TempMapNumber.length()) - (TempMapNumber.find_last_of("_")));
  84. Adtfilename.erase((Adtfilename.length()-xMap.length()-yMap.length()-2), (xMap.length()+yMap.length()+2));
  85. //string AdtMapNumber = xMap + ' ' + yMap + ' ' + GetPlainName((char*)Adtfilename.c_str());
  86. //printf("Processing map %s...\n", AdtMapNumber.c_str());
  87. //printf("MapNumber = %s\n", TempMapNumber.c_str());
  88. //printf("xMap = %s\n", xMap.c_str());
  89. //printf("yMap = %s\n", yMap.c_str());
  90. std::string dirname = std::string(szWorkDirWmo) + "/dir_bin";
  91. FILE *dirfile;
  92. dirfile = fopen(dirname.c_str(), "ab");
  93. if(!dirfile)
  94. {
  95. printf("Can't open dirfile!'%s'\n", dirname.c_str());
  96. return false;
  97. }
  98. while (!ADT.isEof())
  99. {
  100. char fourcc[5];
  101. ADT.read(&fourcc,4);
  102. ADT.read(&size, 4);
  103. flipcc(fourcc);
  104. fourcc[4] = 0;
  105. size_t nextpos = ADT.getPos() + size;
  106. if (!strcmp(fourcc,"MCIN"))
  107. {
  108. }
  109. else if (!strcmp(fourcc,"MTEX"))
  110. {
  111. }
  112. else if (!strcmp(fourcc,"MMDX"))
  113. {
  114. if (size)
  115. {
  116. char* buf = new char[size];
  117. ADT.read(buf, size);
  118. char* p = buf;
  119. int t = 0;
  120. ModelInstanceNames = new std::string[size];
  121. while (p < buf + size)
  122. {
  123. std::string path(p);
  124. char* s = GetPlainName(p);
  125. FixNameCase(s, strlen(s));
  126. FixNameSpaces(s, strlen(s));
  127. ModelInstanceNames[t++] = s;
  128. ExtractSingleModel(path);
  129. p += strlen(p) + 1;
  130. }
  131. delete[] buf;
  132. }
  133. }
  134. else if (!strcmp(fourcc,"MWMO"))
  135. {
  136. if (size)
  137. {
  138. char* buf = new char[size];
  139. ADT.read(buf, size);
  140. char* p = buf;
  141. int q = 0;
  142. WmoInstanceNames = new std::string[size];
  143. while (p < buf + size)
  144. {
  145. char* s = GetPlainName(p);
  146. FixNameCase(s, strlen(s));
  147. FixNameSpaces(s, strlen(s));
  148. WmoInstanceNames[q++] = s;
  149. p += strlen(p) + 1;
  150. }
  151. delete[] buf;
  152. }
  153. }
  154. //======================
  155. else if (!strcmp(fourcc,"MDDF"))
  156. {
  157. if (size)
  158. {
  159. nMDX = (int)size / 36;
  160. for (int i=0; i<nMDX; ++i)
  161. {
  162. uint32 id;
  163. ADT.read(&id, 4);
  164. ModelInstance inst(ADT, ModelInstanceNames[id].c_str(), map_num, tileX, tileY, dirfile);
  165. }
  166. delete[] ModelInstanceNames;
  167. ModelInstanceNames = NULL;
  168. }
  169. }
  170. else if (!strcmp(fourcc,"MODF"))
  171. {
  172. if (size)
  173. {
  174. nWMO = (int)size / 64;
  175. for (int i=0; i<nWMO; ++i)
  176. {
  177. uint32 id;
  178. ADT.read(&id, 4);
  179. WMOInstance inst(ADT, WmoInstanceNames[id].c_str(), map_num, tileX, tileY, dirfile);
  180. }
  181. delete[] WmoInstanceNames;
  182. WmoInstanceNames = NULL;
  183. }
  184. }
  185. //======================
  186. ADT.seek(nextpos);
  187. }
  188. ADT.close();
  189. fclose(dirfile);
  190. return true;
  191. }
  192. ADTFile::~ADTFile()
  193. {
  194. ADT.close();
  195. }