31 std::size_t lastSeparatorPos = fileName.find_last_of(
"\\/"sv);
33 if (lastSeparatorPos != std::string_view::npos)
34 fileName.remove_prefix(lastSeparatorPos + 1);
41 if (name.starts_with(
"FILE"sv))
44 auto ptr = name.begin() + (name.length() - 1);
47 for (; *ptr !=
'.' && ptr > name.begin(); --ptr)
48 if (*ptr >=
'A' && *ptr <=
'Z')
51 for (; ptr > name.begin(); --ptr)
53 if (ptr > name.begin() && *ptr >=
'A' && *ptr <=
'Z' && isalpha(*(ptr - 1)))
55 else if ((ptr == name.begin() || !isalpha(*(ptr - 1))) && *ptr >=
'a' && *ptr <=
'z')
86 auto dirfile = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(dirname.c_str(),
"ab"));
89 printf(
"Can't open dirfile!'%s'\n", dirname.c_str());
101 std::ranges::reverse(fourcc);
105 if (!memcmp(fourcc,
"MMDX", 4))
121 else if (!memcmp(fourcc,
"MWMO", 4))
138 else if (!memcmp(fourcc,
"MDDF", 4))
143 for (
uint32 i = 0; i < doodadCount; ++i)
148 std::string fileName;
149 if (doodadDef.
Flags & 0x40)
161 else if (!memcmp(fourcc,
"MODF", 4))
166 for (
uint32 i = 0; i < mapObjectCount; ++i)
171 std::string fileName;
172 if (mapObjDef.
Flags & 0x8)
179 if (extracted->HasCollision())
182 if (extracted->Doodads)
205 auto dirfile = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(dirname.c_str(),
"ab"));
208 printf(
"Can't open dirfile!'%s'\n", dirname.c_str());
215 if (map_num != originalMapId)
217 fwrite(&
flags,
sizeof(
uint8), 1, dirfile.get());
218 fwrite(cached.Data.data(), cached.Data.size(), 1, dirfile.get());
struct CStringSentinel_T CStringSentinel
std::shared_ptr< CASC::Storage > CascStorage
void NormalizeFileName(std::string &name)
std::string_view GetPlainName(std::string_view fileName)
ADTFile(std::string const &filename, bool cache)
std::vector< std::string > ModelInstanceNames
std::vector< ADTOutputCache > * dirfileCache
std::vector< std::string > WmoInstanceNames
bool init(uint32 map_num, uint32 originalMapId)
bool initFromCache(uint32 map_num, uint32 originalMapId)
void seekRelative(int offset)
size_t read(void *dest, size_t bytes)
void Extract(ADT::MDDF const &doodadDef, char const *ModelInstName, uint32 mapID, uint32 originalMapId, FILE *pDirfile, std::vector< ADTOutputCache > *dirfileCache)
void ExtractSet(WMODoodadData const &doodadData, ADT::MODF const &wmo, bool isGlobalWmo, uint32 mapID, uint32 originalMapId, FILE *pDirfile, std::vector< ADTOutputCache > *dirfileCache)
void Extract(ADT::MODF const &mapObjDef, char const *WmoInstName, bool isGlobalWmo, uint32 mapID, uint32 originalMapId, FILE *pDirfile, std::vector< ADTOutputCache > *dirfileCache)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
constexpr CStringBoundedSentinel< Iterator > Checked(Iterator end) const
ExtractedModelData const * ExtractSingleWmo(std::string &fname)
char const * szWorkDirWmo