Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
adtfile.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "vmapexport.h"
7#include "adtfile.h"
8
9#include <algorithm>
10#include <cstdio>
11
12#ifdef WIN32
13#define snprintf _snprintf
14#endif
15
16char const* GetPlainName(char const* FileName)
17{
18 const char * szTemp;
19
20 if((szTemp = strrchr(FileName, '\\')) != NULL)
21 FileName = szTemp + 1;
22 return FileName;
23}
24
25char* GetPlainName(char* FileName)
26{
27 char * szTemp;
28
29 if((szTemp = strrchr(FileName, '\\')) != NULL)
30 FileName = szTemp + 1;
31 return FileName;
32}
33
34void FixNameCase(char* name, size_t len)
35{
36 char* ptr = name + len - 1;
37
38 //extension in lowercase
39 for (; *ptr != '.'; --ptr)
40 *ptr |= 0x20;
41
42 for (; ptr >= name; --ptr)
43 {
44 if (ptr > name && *ptr >= 'A' && *ptr <= 'Z' && isalpha(*(ptr - 1)))
45 *ptr |= 0x20;
46 else if ((ptr == name || !isalpha(*(ptr - 1))) && *ptr >= 'a' && *ptr <= 'z')
47 *ptr &= ~0x20;
48 }
49}
50
51void FixNameSpaces(char* name, size_t len)
52{
53 for (size_t i=0; i<len-3; i++)
54 {
55 if(name[i] == ' ')
56 name[i] = '_';
57 }
58}
59
60char* GetExtension(char* FileName)
61{
62 if (char* szTemp = strrchr(FileName, '.'))
63 return szTemp;
64 return NULL;
65}
66
67extern HANDLE WorldMpq;
68
69ADTFile::ADTFile(char* filename) : ADT(WorldMpq, filename, false), nWMO(0), nMDX(0)
70{
71 Adtfilename.append(filename);
72}
73
74bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY)
75{
76 if(ADT.isEof ())
77 return false;
78
79 uint32 size;
80
81 string xMap;
82 string yMap;
83
84 Adtfilename.erase(Adtfilename.find(".adt"),4);
85 string TempMapNumber;
86 TempMapNumber = Adtfilename.substr(Adtfilename.length()-6,6);
87 xMap = TempMapNumber.substr(TempMapNumber.find("_")+1,(TempMapNumber.find_last_of("_")-1) - (TempMapNumber.find("_")));
88 yMap = TempMapNumber.substr(TempMapNumber.find_last_of("_")+1,(TempMapNumber.length()) - (TempMapNumber.find_last_of("_")));
89 Adtfilename.erase((Adtfilename.length()-xMap.length()-yMap.length()-2), (xMap.length()+yMap.length()+2));
90 //string AdtMapNumber = xMap + ' ' + yMap + ' ' + GetPlainName((char*)Adtfilename.c_str());
91 //printf("Processing map %s...\n", AdtMapNumber.c_str());
92 //printf("MapNumber = %s\n", TempMapNumber.c_str());
93 //printf("xMap = %s\n", xMap.c_str());
94 //printf("yMap = %s\n", yMap.c_str());
95
96 std::string dirname = std::string(szWorkDirWmo) + "/dir_bin";
97 FILE *dirfile;
98 dirfile = fopen(dirname.c_str(), "ab");
99 if(!dirfile)
100 {
101 printf("Can't open dirfile!'%s'\n", dirname.c_str());
102 return false;
103 }
104
105 while (!ADT.isEof())
106 {
107 char fourcc[5];
108 ADT.read(&fourcc,4);
109 ADT.read(&size, 4);
110 flipcc(fourcc);
111 fourcc[4] = 0;
112
113 size_t nextpos = ADT.getPos() + size;
114
115 if (!strcmp(fourcc,"MCIN"))
116 {
117 }
118 else if (!strcmp(fourcc,"MTEX"))
119 {
120 }
121 else if (!strcmp(fourcc,"MMDX"))
122 {
123 if (size)
124 {
125 char* buf = new char[size];
126 ADT.read(buf, size);
127 char* p = buf;
128 while (p < buf + size)
129 {
130 std::string path(p);
131
132 char* s = GetPlainName(p);
133 FixNameCase(s, strlen(s));
134 FixNameSpaces(s, strlen(s));
135
136 ModelInstanceNames.push_back(s);
137
138 ExtractSingleModel(path);
139
140 p += strlen(p) + 1;
141 }
142 delete[] buf;
143 }
144 }
145 else if (!strcmp(fourcc,"MWMO"))
146 {
147 if (size)
148 {
149 char* buf = new char[size];
150 ADT.read(buf, size);
151 char* p = buf;
152 while (p < buf + size)
153 {
154 char* s = GetPlainName(p);
155 FixNameCase(s, strlen(s));
156 FixNameSpaces(s, strlen(s));
157
158 WmoInstanceNames.push_back(s);
159
160 p += strlen(p) + 1;
161 }
162 delete[] buf;
163 }
164 }
165 //======================
166 else if (!strcmp(fourcc,"MDDF"))
167 {
168 if (size)
169 {
170 nMDX = (int)size / 36;
171 for (int i=0; i<nMDX; ++i)
172 {
173 uint32 id;
174 ADT.read(&id, 4);
175 ModelInstance inst(ADT, ModelInstanceNames[id].c_str(), map_num, tileX, tileY, dirfile);
176 }
177 ModelInstanceNames.clear();
178 }
179 }
180 else if (!strcmp(fourcc,"MODF"))
181 {
182 if (size)
183 {
184 nWMO = (int)size / 64;
185 for (int i=0; i<nWMO; ++i)
186 {
187 uint32 id;
188 ADT.read(&id, 4);
189 WMOInstance inst(ADT, WmoInstanceNames[id].c_str(), map_num, tileX, tileY, dirfile);
190 }
191 WmoInstanceNames.clear();
192 }
193 }
194
195 //======================
196 ADT.seek(nextpos);
197 }
198
199 ADT.close();
200 fclose(dirfile);
201 return true;
202}
203
205{
206 ADT.close();
207}
std::uint32_t uint32
Definition Define.h:77
HANDLE WorldMpq
Definition System.cpp:49
char const * GetPlainName(char const *FileName)
Definition adtfile.cpp:16
void FixNameCase(char *name, size_t len)
Definition adtfile.cpp:34
char * GetExtension(char *FileName)
Definition adtfile.cpp:60
void FixNameSpaces(char *name, size_t len)
Definition adtfile.cpp:51
char const * GetPlainName(char const *FileName)
Definition adtfile.cpp:16
void FixNameCase(char *name, size_t len)
Definition adtfile.cpp:34
void FixNameSpaces(char *name, size_t len)
Definition adtfile.cpp:51
std::string Adtfilename
Definition adtfile.h:104
int nWMO
Definition adtfile.h:108
std::vector< std::string > ModelInstanceNames
Definition adtfile.h:111
ADTFile(char *filename)
Definition adtfile.cpp:69
MPQFile ADT
Definition adtfile.h:102
bool init(uint32 map_num, uint32 tileX, uint32 tileY)
Definition adtfile.cpp:74
std::vector< std::string > WmoInstanceNames
Definition adtfile.h:110
int nMDX
Definition adtfile.h:109
bool ExtractSingleModel(std::string &fname)
void flipcc(char *fcc)
Definition mpqfile.h:75
const char * szWorkDirWmo