From 228e40d17f6fe5c9eed47a06899127c05fceff22 Mon Sep 17 00:00:00 2001 From: mo Date: Mon, 29 Jun 2026 07:28:45 +0100 Subject: [PATCH] feat: T4 MapEnts dumper (#865) * feat: T4 MapEnts dumper * chore: use common map_ents logic for filename --------- Co-authored-by: Jan Laupetin --- docs/SupportedAssetTypes.md | 2 +- src/ObjCommon/Maps/MapEntsCommon.cpp | 11 ++++++++++ src/ObjCommon/Maps/MapEntsCommon.h | 8 ++++++++ .../Game/IW3/Maps/MapEntsDumperIW3.cpp | 4 +++- .../Game/T4/Maps/MapEntsDumperT4.cpp | 20 +++++++++++++++++++ src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.h | 13 ++++++++++++ src/ObjWriting/Game/T4/ObjWriterT4.cpp | 2 ++ .../Game/T6/Maps/MapEntsDumperT6.cpp | 9 ++++----- 8 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 src/ObjCommon/Maps/MapEntsCommon.cpp create mode 100644 src/ObjCommon/Maps/MapEntsCommon.h create mode 100644 src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.cpp create mode 100644 src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.h diff --git a/docs/SupportedAssetTypes.md b/docs/SupportedAssetTypes.md index 55a22359..f57ef1b1 100644 --- a/docs/SupportedAssetTypes.md +++ b/docs/SupportedAssetTypes.md @@ -142,7 +142,7 @@ using `Linker`): | ComWorld | ❌ | ❌ | | | GameWorldSp | ❌ | ❌ | | | GameWorldMp | ❌ | ❌ | | -| MapEnts | ❌ | ❌ | | +| MapEnts | ✅ | ❌ | | | GfxWorld | ❌ | ❌ | | | GfxLightDef | ❌ | ❌ | | | Font_s | ❌ | ❌ | | diff --git a/src/ObjCommon/Maps/MapEntsCommon.cpp b/src/ObjCommon/Maps/MapEntsCommon.cpp new file mode 100644 index 00000000..1c03af80 --- /dev/null +++ b/src/ObjCommon/Maps/MapEntsCommon.cpp @@ -0,0 +1,11 @@ +#include "MapEntsCommon.h" + +#include + +namespace map_ents +{ + std::string GetEntsFileNameForAssetName(const std::string& assetName) + { + return std::format("{}.ents", assetName); + } +} // namespace map_ents diff --git a/src/ObjCommon/Maps/MapEntsCommon.h b/src/ObjCommon/Maps/MapEntsCommon.h new file mode 100644 index 00000000..a274bc1e --- /dev/null +++ b/src/ObjCommon/Maps/MapEntsCommon.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace map_ents +{ + std::string GetEntsFileNameForAssetName(const std::string& assetName); +} diff --git a/src/ObjWriting/Game/IW3/Maps/MapEntsDumperIW3.cpp b/src/ObjWriting/Game/IW3/Maps/MapEntsDumperIW3.cpp index 53af032e..3f9dc67d 100644 --- a/src/ObjWriting/Game/IW3/Maps/MapEntsDumperIW3.cpp +++ b/src/ObjWriting/Game/IW3/Maps/MapEntsDumperIW3.cpp @@ -1,5 +1,7 @@ #include "MapEntsDumperIW3.h" +#include "Maps/MapEntsCommon.h" + using namespace IW3; namespace map_ents @@ -7,7 +9,7 @@ namespace map_ents void DumperIW3::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) { const auto* mapEnts = asset.Asset(); - const auto assetFile = context.OpenAssetFile(asset.m_name + ".ents"); + const auto assetFile = context.OpenAssetFile(GetEntsFileNameForAssetName(asset.m_name)); if (!assetFile) return; diff --git a/src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.cpp b/src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.cpp new file mode 100644 index 00000000..6598eb01 --- /dev/null +++ b/src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.cpp @@ -0,0 +1,20 @@ +#include "MapEntsDumperT4.h" + +#include "Maps/MapEntsCommon.h" + +using namespace T4; + +namespace map_ents +{ + void DumperT4::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) + { + const auto* mapEnts = asset.Asset(); + const auto assetFile = context.OpenAssetFile(GetEntsFileNameForAssetName(asset.m_name)); + + if (!assetFile) + return; + + auto& stream = *assetFile; + stream.write(mapEnts->entityString, mapEnts->numEntityChars); + } +} // namespace map_ents diff --git a/src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.h b/src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.h new file mode 100644 index 00000000..6851a1f4 --- /dev/null +++ b/src/ObjWriting/Game/T4/Maps/MapEntsDumperT4.h @@ -0,0 +1,13 @@ +#pragma once + +#include "Dumping/AbstractAssetDumper.h" +#include "Game/T4/T4.h" + +namespace map_ents +{ + class DumperT4 final : public AbstractAssetDumper + { + protected: + void DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) override; + }; +} // namespace map_ents diff --git a/src/ObjWriting/Game/T4/ObjWriterT4.cpp b/src/ObjWriting/Game/T4/ObjWriterT4.cpp index 50f72e2b..95b23659 100644 --- a/src/ObjWriting/Game/T4/ObjWriterT4.cpp +++ b/src/ObjWriting/Game/T4/ObjWriterT4.cpp @@ -4,6 +4,7 @@ #include "Game/T4/XAnim/XAnimDumperT4.h" #include "Game/T4/XModel/XModelDumperT4.h" #include "Localize/LocalizeDumperT4.h" +#include "Maps/MapEntsDumperT4.h" #include "RawFile/RawFileDumperT4.h" #include "StringTable/StringTableDumperT4.h" @@ -14,6 +15,7 @@ void ObjWriter::RegisterAssetDumpers(AssetDumpingContext& context) RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); + RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); diff --git a/src/ObjWriting/Game/T6/Maps/MapEntsDumperT6.cpp b/src/ObjWriting/Game/T6/Maps/MapEntsDumperT6.cpp index e3d4b888..67978522 100644 --- a/src/ObjWriting/Game/T6/Maps/MapEntsDumperT6.cpp +++ b/src/ObjWriting/Game/T6/Maps/MapEntsDumperT6.cpp @@ -1,6 +1,6 @@ #include "MapEntsDumperT6.h" -#include +#include "Maps/MapEntsCommon.h" using namespace T6; @@ -9,13 +9,12 @@ namespace map_ents void DumperT6::DumpAsset(AssetDumpingContext& context, const XAssetInfo& asset) { const auto* mapEnts = asset.Asset(); + const auto assetFile = context.OpenAssetFile(GetEntsFileNameForAssetName(asset.m_name)); - const auto mapEntsFile = context.OpenAssetFile(std::format("{}.ents", mapEnts->name)); - - if (!mapEntsFile) + if (!assetFile) return; - auto& stream = *mapEntsFile; + auto& stream = *assetFile; stream.write(mapEnts->entityString, mapEnts->numEntityChars - 1); } } // namespace map_ents