mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-25 23:17:28 +00:00
bad3845d83
* Implement a server res directory * Only convert if neither exist * Remove unzip, Update RegEx * readme updates Run setup after setting working dir Address several docker issues Revert "Run setup after setting working dir" This reverts commit fd2fb9228e82a350204c1ef61f7ba059479bb12f. Fix docker * Remove extra submodules * Rework logic * Switch if block * Remove need to extract fdb from client * Change log name * Update FdbToSqlite.cpp
78 lines
1.7 KiB
C++
78 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
#include <filesystem>
|
|
|
|
#include "Pack.h"
|
|
#include "PackIndex.h"
|
|
|
|
enum class eAssetBundleType {
|
|
None,
|
|
Unpacked,
|
|
Packed
|
|
};
|
|
|
|
struct AssetMemoryBuffer : std::streambuf {
|
|
char* m_Base;
|
|
bool m_Success;
|
|
|
|
AssetMemoryBuffer(char* base, std::ptrdiff_t n, bool success) {
|
|
m_Base = base;
|
|
m_Success = success;
|
|
if (!m_Success) return;
|
|
this->setg(base, base, base + n);
|
|
}
|
|
|
|
pos_type seekpos(pos_type sp, std::ios_base::openmode which) override {
|
|
return seekoff(sp - pos_type(off_type(0)), std::ios_base::beg, which);
|
|
}
|
|
|
|
pos_type seekoff(off_type off,
|
|
std::ios_base::seekdir dir,
|
|
std::ios_base::openmode which = std::ios_base::in) override {
|
|
if (dir == std::ios_base::cur)
|
|
gbump(off);
|
|
else if (dir == std::ios_base::end)
|
|
setg(eback(), egptr() + off, egptr());
|
|
else if (dir == std::ios_base::beg)
|
|
setg(eback(), eback() + off, egptr());
|
|
return gptr() - eback();
|
|
}
|
|
|
|
void close() {
|
|
delete m_Base;
|
|
}
|
|
};
|
|
|
|
class AssetManager {
|
|
public:
|
|
AssetManager(const std::filesystem::path& path);
|
|
~AssetManager();
|
|
|
|
std::filesystem::path GetResPath();
|
|
eAssetBundleType GetAssetBundleType();
|
|
|
|
bool HasFile(const char* name);
|
|
bool GetFile(const char* name, char** data, uint32_t* len);
|
|
AssetMemoryBuffer GetFileAsBuffer(const char* name);
|
|
|
|
private:
|
|
void LoadPackIndex();
|
|
|
|
// Modified crc algorithm (mpeg2)
|
|
// Reference: https://stackoverflow.com/questions/54339800/how-to-modify-crc-32-to-crc-32-mpeg-2
|
|
inline uint32_t crc32b(uint32_t base, uint8_t* message, size_t l);
|
|
|
|
bool m_SuccessfullyLoaded;
|
|
|
|
std::filesystem::path m_Path;
|
|
std::filesystem::path m_RootPath;
|
|
std::filesystem::path m_ResPath;
|
|
|
|
eAssetBundleType m_AssetBundleType = eAssetBundleType::None;
|
|
|
|
PackIndex* m_PackIndex;
|
|
};
|