From 06092dfea471f2b78eb1a47e70b8f56dd087e5eb Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Tue, 12 Aug 2025 08:20:58 -0700 Subject: [PATCH] Add delete handler --- LEGO1/lego/legoomni/src/main/legomain.cpp | 9 +++++++++ extensions/include/extensions/siloader.h | 3 +++ extensions/src/siloader.cpp | 24 +++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/LEGO1/lego/legoomni/src/main/legomain.cpp b/LEGO1/lego/legoomni/src/main/legomain.cpp index abe922c5..25e0fc62 100644 --- a/LEGO1/lego/legoomni/src/main/legomain.cpp +++ b/LEGO1/lego/legoomni/src/main/legomain.cpp @@ -474,6 +474,15 @@ LegoWorld* LegoOmni::FindWorld(const MxAtomId& p_atom, MxS32 p_entityid) // STUB: BETA10 0x1008e93e void LegoOmni::DeleteObject(MxDSAction& p_dsAction) { + auto result = Extension::Call( + HandleDelete, + SiLoader::StreamObject{p_dsAction.GetAtomId(), p_dsAction.GetObjectId()} + ) + .value_or(std::nullopt); + if (result && result.value()) { + return; + } + if (p_dsAction.GetAtomId().GetInternal() != NULL) { LegoWorld* world = FindWorld(p_dsAction.GetAtomId(), p_dsAction.GetObjectId()); if (world) { diff --git a/extensions/include/extensions/siloader.h b/extensions/include/extensions/siloader.h index e8c3fa9d..2a8b50ca 100644 --- a/extensions/include/extensions/siloader.h +++ b/extensions/include/extensions/siloader.h @@ -19,6 +19,7 @@ class SiLoader { static std::optional HandleFind(StreamObject p_object, LegoWorld* world); static std::optional HandleStart(StreamObject p_object); static std::optional HandleRemove(StreamObject p_object, LegoWorld* world); + static std::optional HandleDelete(StreamObject p_object); static std::map options; static std::vector files; @@ -38,10 +39,12 @@ constexpr auto Load = &SiLoader::Load; constexpr auto HandleFind = &SiLoader::HandleFind; constexpr auto HandleStart = &SiLoader::HandleStart; constexpr auto HandleRemove = &SiLoader::HandleRemove; +constexpr auto HandleDelete = &SiLoader::HandleDelete; #else constexpr decltype(&SiLoader::Load) Load = nullptr; constexpr decltype(&SiLoader::HandleFind) HandleFind = nullptr; constexpr decltype(&SiLoader::HandleStart) HandleStart = nullptr; constexpr decltype(&SiLoader::HandleRemove) HandleRemove = nullptr; +constexpr decltype(&SiLoader::HandleDelete) HandleDelete = nullptr; #endif }; // namespace Extensions diff --git a/extensions/src/siloader.cpp b/extensions/src/siloader.cpp index 42b79548..48a010af 100644 --- a/extensions/src/siloader.cpp +++ b/extensions/src/siloader.cpp @@ -87,6 +87,30 @@ std::optional SiLoader::HandleRemove(StreamObject p_object, LegoWorld* w return std::nullopt; } +std::optional SiLoader::HandleDelete(StreamObject p_object) +{ + for (const auto& key : removeWith) { + if (key.first == p_object) { + MxDSAction action; + action.SetAtomId(key.second.first); + action.SetObjectId(key.second.second); + DeleteObject(&action); + } + } + + for (const auto& key : replace) { + if (key.first == p_object) { + MxDSAction action; + action.SetAtomId(key.second.first); + action.SetObjectId(key.second.second); + DeleteObject(&action); + return TRUE; + } + } + + return std::nullopt; +} + bool SiLoader::LoadFile(const char* p_file) { si::Interleaf si;