Skip to content

Commit ad739de

Browse files
committed
parse actor label
1 parent 75a5ab9 commit ad739de

10 files changed

Lines changed: 43 additions & 2 deletions

File tree

libsave/include/SatisfactorySave/GameTypes/UE/Engine/GameFramework/Actor.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,21 @@ namespace SatisfactorySave {
1313
public:
1414
FObjectReferenceDisc Owner;
1515
std::vector<FObjectReferenceDisc> Components;
16+
std::string ActorLabel;
1617

1718
void serialize(Archive& ar) override {
18-
ar << Owner;
19-
ar << Components;
19+
if (!ar.IsPersistent()) {
20+
ar << Owner;
21+
ar << Components;
22+
}
2023
UObject::serialize(ar);
24+
if (ar.IsPersistent()) {
25+
bool bIsCooked = true;
26+
ar << bIsCooked;
27+
if (bIsCooked) {
28+
ar << ActorLabel;
29+
}
30+
}
2131
}
2232
};
2333

libsave/include/SatisfactorySave/IO/Archive/Archive.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ namespace SatisfactorySave {
150150
: std::numeric_limits<int32_t>::max();
151151
}
152152

153+
inline bool IsPersistent() const {
154+
return ArIsPersistent;
155+
}
156+
157+
inline void SetIsPersistent(bool bInIsPersistent) {
158+
ArIsPersistent = bInIsPersistent;
159+
}
160+
153161
protected:
154162
Archive() = default;
155163
virtual ~Archive() = default;
@@ -162,5 +170,6 @@ namespace SatisfactorySave {
162170

163171
std::stack<int32_t> save_version_stack_;
164172
std::stack<int32_t> lightweight_version_stack_;
173+
uint8_t ArIsPersistent : 1 = 0;
165174
};
166175
} // namespace SatisfactorySave

libsave/include/SatisfactorySave/Pak/AssetObjectVisitor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "../GameTypes/UE/Engine/Engine/StaticMesh.h"
66
#include "../GameTypes/UE/Engine/Engine/Texture2D.h"
77
#include "SatisfactorySave/GameTypes/UE/CoreUObject/UObject/Object.h"
8+
#include "SatisfactorySave/GameTypes/UE/Engine/GameFramework/Actor.h"
89
#include "satisfactorysave_export.h"
910

1011
namespace SatisfactorySave {
@@ -13,12 +14,15 @@ namespace SatisfactorySave {
1314
virtual ~AssetObjectVisitor() = default;
1415

1516
virtual void visit(UObject& o) = 0;
17+
virtual void visit(AActor& o) = 0;
1618
virtual void visit(UStaticMesh& o) = 0;
1719
virtual void visit(UTexture2D& o) = 0;
1820

1921
void dispatch(UObject& obj) {
2022
if (typeid(obj) == typeid(UObject)) {
2123
visit(static_cast<UObject&>(obj));
24+
} else if (typeid(obj) == typeid(AActor)) {
25+
visit(static_cast<AActor&>(obj));
2226
} else if (typeid(obj) == typeid(UStaticMesh)) {
2327
visit(static_cast<UStaticMesh&>(obj));
2428
} else if (typeid(obj) == typeid(UTexture2D)) {

libsave/src/Pak/AssetExport.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
#include "GameTypes/UE/Engine/Engine/StaticMesh.h"
44
#include "GameTypes/UE/Engine/Engine/Texture2D.h"
5+
#include "GameTypes/UE/Engine/GameFramework/Actor.h"
56

67
std::shared_ptr<SatisfactorySave::UObject> SatisfactorySave::AssetUObjectFactory(const std::string& class_name) {
78
if (class_name == "/Script/Engine/StaticMesh") {
89
return std::make_shared<UStaticMesh>();
910
} else if (class_name == "/Script/Engine/Texture2D") {
1011
return std::make_shared<UTexture2D>();
12+
} else if (class_name == "/Script/Engine/WorldPartitionHLOD") {
13+
return std::make_shared<AActor>();
1114
} else {
1215
return std::make_shared<UObject>();
1316
}

libsave/src/Pak/AssetFile.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ SatisfactorySave::AssetFile::AssetFile(std::shared_ptr<PakManager> pakManager, s
1111
std::unique_ptr<IStream> ubulkStream)
1212
: IStreamArchive(std::move(uassetStream)),
1313
pakManager_(std::move(pakManager)) {
14+
SetIsPersistent(true);
1415
if (ubulkStream != nullptr) {
1516
ubulk_ar_ = std::make_unique<IStreamArchive>(std::move(ubulkStream));
17+
ubulk_ar_->SetIsPersistent(true);
1618
}
1719

1820
// Check old asset format

libsave/src/Pak/IoStoreFile.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ SatisfactorySave::IoStoreFile::IoStoreFile(Private p, std::shared_ptr<PakManager
5252
}
5353

5454
IStreamArchive utocAr(path);
55+
utocAr.SetIsPersistent(true);
5556
utocAr << utoc_;
5657

5758
// Debug validation
@@ -61,6 +62,7 @@ SatisfactorySave::IoStoreFile::IoStoreFile(Private p, std::shared_ptr<PakManager
6162

6263
if (!utoc_.DirectoryIndexBuffer.empty()) {
6364
IStreamArchive dirIndexAr(vector_to_char_span(utoc_.DirectoryIndexBuffer));
65+
dirIndexAr.SetIsPersistent(true);
6466

6567
FIoDirectoryIndexResource dirIndexRes;
6668
dirIndexAr << dirIndexRes;
@@ -69,6 +71,7 @@ SatisfactorySave::IoStoreFile::IoStoreFile(Private p, std::shared_ptr<PakManager
6971
}
7072

7173
ucasAr_ = std::make_unique<IStreamArchive>(ucas_path);
74+
ucasAr_->SetIsPersistent(true);
7275
}
7376

7477
std::vector<std::string> SatisfactorySave::IoStoreFile::getAllAssetFilenames() const {

libsave/src/Pak/PakFile.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ SatisfactorySave::PakFile::PakFile(Private p, std::shared_ptr<PakManager> pakMan
1616
}
1717

1818
pakAr_ = std::make_unique<IStreamArchive>(pakPath);
19+
pakAr_->SetIsPersistent(true);
1920
auto& ar = *pakAr_;
2021

2122
if (ar.size() < 221) {

libsave/src/Pak/PakManager.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ void SatisfactorySave::PakManager::init(const std::filesystem::path& gameDir) {
2121
auto globalUtoc = IoStoreFile::create(shared_from_this(), globalUtocPath);
2222
const auto globalBuf = globalUtoc->readChunkContent(0);
2323
IStreamArchive globalAr(globalBuf);
24+
globalAr.SetIsPersistent(true);
2425
globalAr << GlobalNameMap;
2526
globalAr << ScriptObjectEntries;
2627
if (globalAr.tell() != globalBuf.size()) {

map/src/MapWindow/UI/AssetObjectEditor.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ void Satisfactory3DMap::UI::AssetObjectEditor::AssetUObjectEditor::visit(s::UObj
2727
});
2828
}
2929

30+
void Satisfactory3DMap::UI::AssetObjectEditor::AssetUObjectEditor::visit(s::AActor& o) {
31+
visit(static_cast<s::UObject&>(o));
32+
EditorSectionWrap(0, "AActor", [&]() {
33+
EditorString("ActorLabel", o.ActorLabel);
34+
});
35+
}
36+
3037
void Satisfactory3DMap::UI::AssetObjectEditor::AssetUObjectEditor::visit(s::UStaticMesh& o) {
3138
visit(static_cast<s::UObject&>(o));
3239
if (ImGui::CollapsingHeader("UStaticMesh", ImGuiTreeNodeFlags_DefaultOpen)) {

map/src/MapWindow/UI/AssetObjectEditor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ namespace Satisfactory3DMap::UI {
4141
explicit AssetUObjectEditor(AssetObjectEditor& parent) : parent_(parent) {}
4242

4343
void visit(s::UObject& o) override;
44+
void visit(s::AActor& o) override;
4445
void visit(s::UStaticMesh& o) override;
4546
void visit(s::UTexture2D& o) override;
4647
};

0 commit comments

Comments
 (0)