Fix Pet Taming causing seg fault (#818)

* Fix Pet Taming

* Fix Pet Taming

* fix pet taming path loading
just make it go to build file since the asset managet handles intermediate steps
there is never res in the path in the live db, so no need to check

* special case BrickModels to uppercase if unpacked
remove redundent variable

Co-authored-by: Aaron Kimbrell <aronwk.aaron@gmail.com>
This commit is contained in:
David Markowitz 2022-11-05 17:09:26 -07:00 committed by GitHub
parent 162f84e285
commit 1d5c71eb9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 21 deletions

View File

@ -67,6 +67,8 @@ bool AssetManager::HasFile(const char* name) {
auto fixedName = std::string(name);
std::transform(fixedName.begin(), fixedName.end(), fixedName.begin(), [](uint8_t c) { return std::tolower(c); });
// Special case for unpacked client have BrickModels in upper case
if (this->m_AssetBundleType == eAssetBundleType::Unpacked) GeneralUtils::ReplaceInString(fixedName, "brickmodels", "BrickModels");
std::replace(fixedName.begin(), fixedName.end(), '\\', '/');
if (std::filesystem::exists(m_ResPath / fixedName)) return true;
@ -92,17 +94,19 @@ bool AssetManager::GetFile(const char* name, char** data, uint32_t* len) {
auto fixedName = std::string(name);
std::transform(fixedName.begin(), fixedName.end(), fixedName.begin(), [](uint8_t c) { return std::tolower(c); });
std::replace(fixedName.begin(), fixedName.end(), '\\', '/'); // On the off chance someone has the wrong slashes, force forward slashes
auto realPathName = fixedName;
if (std::filesystem::exists(m_ResPath / realPathName)) {
// Special case for unpacked client have BrickModels in upper case
if (this->m_AssetBundleType == eAssetBundleType::Unpacked) GeneralUtils::ReplaceInString(fixedName, "brickmodels", "BrickModels");
if (std::filesystem::exists(m_ResPath / fixedName)) {
FILE* file;
#ifdef _WIN32
fopen_s(&file, (m_ResPath / realPathName).string().c_str(), "rb");
fopen_s(&file, (m_ResPath / fixedName).string().c_str(), "rb");
#elif __APPLE__
// macOS has 64bit file IO by default
file = fopen((m_ResPath / realPathName).string().c_str(), "rb");
file = fopen((m_ResPath / fixedName).string().c_str(), "rb");
#else
file = fopen64((m_ResPath / realPathName).string().c_str(), "rb");
file = fopen64((m_ResPath / fixedName).string().c_str(), "rb");
#endif
fseek(file, 0, SEEK_END);
*len = ftell(file);

View File

@ -194,21 +194,7 @@ void PetComponent::OnUse(Entity* originator) {
return;
}
auto lxfAsset = std::string(result.getStringField(0));
std::vector<std::string> lxfAssetSplit = GeneralUtils::SplitString(lxfAsset, '\\');
lxfAssetSplit.erase(lxfAssetSplit.begin());
buildFile = "res/BrickModels";
for (auto part : lxfAssetSplit) {
std::transform(part.begin(), part.end(), part.begin(), [](unsigned char c) {
return std::tolower(c);
});
buildFile += "/" + part;
}
buildFile = std::string(result.getStringField(0));
PetPuzzleData data;
data.buildFile = buildFile;

View File

@ -18,7 +18,7 @@ std::vector<Brick>& BrickDatabase::GetBricks(const std::string& lxfmlPath) {
return cached->second;
}
AssetMemoryBuffer buffer = Game::assetManager->GetFileAsBuffer(("client/" + lxfmlPath).c_str());
AssetMemoryBuffer buffer = Game::assetManager->GetFileAsBuffer((lxfmlPath).c_str());
std::istream file(&buffer);
if (!file.good()) {
return emptyCache;