Skip to content

Commit 1c53f75

Browse files
committed
asset parsing error handling
1 parent 979594a commit 1c53f75

2 files changed

Lines changed: 24 additions & 6 deletions

File tree

libsave/src/Pak/AssetFile.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,21 @@ std::shared_ptr<SatisfactorySave::AssetExport> SatisfactorySave::AssetFile::getE
6868

6969
seekCookedSerialOffset(exportEntry.CookedSerialOffset);
7070
auto read_limit_stack_pusher = pushReadLimit(exportEntry.CookedSerialSize);
71-
*this << *exp->Object;
71+
try {
72+
*this << *exp->Object;
73+
} catch (const std::exception& ex1) {
74+
// Try a second time as UObject only.
75+
spdlog::error("Error parsing '{}': {} (try again as UObject only!)", class_name, ex1.what());
76+
try {
77+
exp->Object = std::make_shared<UObject>();
78+
seekCookedSerialOffset(exportEntry.CookedSerialOffset);
79+
*this << *exp->Object;
80+
} catch (const std::exception& ex2) {
81+
spdlog::error("Error parsing '{}' as UObject: {}", class_name, ex2.what());
82+
exp->Object = nullptr;
83+
seekCookedSerialOffset(exportEntry.CookedSerialOffset);
84+
}
85+
}
7286

7387
// Read unknown class data as binary buffer
7488
const auto data_read_size = tellCookedSerialOffset() - exportEntry.CookedSerialOffset;

map/src/MapWindow/Pak/AssetWindow.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,16 @@ void Satisfactory3DMap::AssetWindow::showExport(int idx) {
168168
if (asset_ == nullptr) {
169169
return;
170170
}
171-
const auto exportEntry = asset_->exportMap().at(idx);
172-
auto assetExport = asset_->getExportObjectByIdx(idx);
171+
try {
172+
const auto exportEntry = asset_->exportMap().at(idx);
173+
auto assetExport = asset_->getExportObjectByIdx(idx);
173174

174-
exportWindows_.emplace_back(std::make_shared<AssetObjectWindow>(shared_from_this(), std::move(assetExport),
175-
asset_->getNameString(exportEntry.ObjectName) + " [" + SatisfactorySave::splitPathName(assetFilename_).back() +
176-
"]"));
175+
exportWindows_.emplace_back(std::make_shared<AssetObjectWindow>(shared_from_this(), std::move(assetExport),
176+
asset_->getNameString(exportEntry.ObjectName) + " [" +
177+
SatisfactorySave::splitPathName(assetFilename_).back() + "]"));
178+
} catch (const std::exception& ex) {
179+
spdlog::error("Error getting asset export: {}", ex.what());
180+
}
177181
}
178182

179183
void Satisfactory3DMap::AssetWindow::exportExport(int idx) {

0 commit comments

Comments
 (0)