Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
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
16
char
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
25
char
*
GetPlainName
(
char
* FileName)
26
{
27
char
* szTemp;
28
29
if
((szTemp = strrchr(FileName,
'\\'
)) != NULL)
30
FileName = szTemp + 1;
31
return
FileName;
32
}
33
34
void
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
51
void
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
60
char
*
GetExtension
(
char
* FileName)
61
{
62
if
(
char
* szTemp = strrchr(FileName,
'.'
))
63
return
szTemp;
64
return
NULL;
65
}
66
67
extern
HANDLE
WorldMpq
;
68
69
ADTFile::ADTFile
(
char
* filename) :
ADT
(
WorldMpq
, filename, false),
nWMO
(0),
nMDX
(0)
70
{
71
Adtfilename
.append(filename);
72
}
73
74
bool
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
204
ADTFile::~ADTFile
()
205
{
206
ADT
.close();
207
}
uint32
std::uint32_t uint32
Definition
Define.h:77
WorldMpq
HANDLE WorldMpq
Definition
System.cpp:49
GetPlainName
char const * GetPlainName(char const *FileName)
Definition
adtfile.cpp:16
FixNameCase
void FixNameCase(char *name, size_t len)
Definition
adtfile.cpp:34
GetExtension
char * GetExtension(char *FileName)
Definition
adtfile.cpp:60
FixNameSpaces
void FixNameSpaces(char *name, size_t len)
Definition
adtfile.cpp:51
adtfile.h
GetPlainName
char const * GetPlainName(char const *FileName)
Definition
adtfile.cpp:16
FixNameCase
void FixNameCase(char *name, size_t len)
Definition
adtfile.cpp:34
FixNameSpaces
void FixNameSpaces(char *name, size_t len)
Definition
adtfile.cpp:51
ADTFile::Adtfilename
std::string Adtfilename
Definition
adtfile.h:104
ADTFile::nWMO
int nWMO
Definition
adtfile.h:108
ADTFile::ModelInstanceNames
std::vector< std::string > ModelInstanceNames
Definition
adtfile.h:111
ADTFile::ADTFile
ADTFile(char *filename)
Definition
adtfile.cpp:69
ADTFile::ADT
MPQFile ADT
Definition
adtfile.h:102
ADTFile::init
bool init(uint32 map_num, uint32 tileX, uint32 tileY)
Definition
adtfile.cpp:74
ADTFile::WmoInstanceNames
std::vector< std::string > WmoInstanceNames
Definition
adtfile.h:110
ADTFile::~ADTFile
~ADTFile()
Definition
adtfile.cpp:204
ADTFile::nMDX
int nMDX
Definition
adtfile.h:109
ModelInstance
Definition
model.h:41
WMOInstance
Definition
wmo.h:105
ExtractSingleModel
bool ExtractSingleModel(std::string &fname)
Definition
gameobject_extract.cpp:14
flipcc
void flipcc(char *fcc)
Definition
mpqfile.h:75
szWorkDirWmo
const char * szWorkDirWmo
Definition
vmapexport.cpp:115
vmapexport.h
src
tools
vmap4_extractor
adtfile.cpp
Generated on
for Project SkyFire Core by
1.17.0