From a3523bd45af5b70cc23f4fd81a36e16d0423e641 Mon Sep 17 00:00:00 2001 From: shadow578 <52449218+shadow578@users.noreply.github.com> Date: Thu, 4 Jun 2026 17:46:12 +0200 Subject: [PATCH 1/2] add invisible world effect / "Where did Everything go?" --- .../World/ZInvisibleWorldGeometryEffect.cpp | 72 +++++++++++++++++++ .../World/ZInvisibleWorldGeometryEffect.h | 33 +++++++++ src/Entity/Bindings/SZRoomEntityBinding.h | 22 ++++++ 3 files changed, 127 insertions(+) create mode 100644 src/Effects/World/ZInvisibleWorldGeometryEffect.cpp create mode 100644 src/Effects/World/ZInvisibleWorldGeometryEffect.h create mode 100644 src/Entity/Bindings/SZRoomEntityBinding.h diff --git a/src/Effects/World/ZInvisibleWorldGeometryEffect.cpp b/src/Effects/World/ZInvisibleWorldGeometryEffect.cpp new file mode 100644 index 0000000..d617b5e --- /dev/null +++ b/src/Effects/World/ZInvisibleWorldGeometryEffect.cpp @@ -0,0 +1,72 @@ +#include "ZInvisibleWorldGeometryEffect.h" + +#include +#include + +#include "Registry.h" +#include "Helpers/EntityUtils.h" +#include "Helpers/Math.h" + +#define TAG "[ZInvisibleWorldGeometryEffect] " + +void ZInvisibleWorldGeometryEffect::OnEnterScene() +{ + m_aRooms.clear(); + m_aCurrentlyHiddenRooms.clear(); + + const auto s_aRooms = Utils::ZEntityFinder() + .EntityType("ZRoomEntity") + .Find(); + + for (auto& s_rRoom : s_aRooms) + { + m_aRooms.emplace_back(SZRoomEntityBinding(s_rRoom)); + } + + Logger::Debug(TAG "Found {} room entities!", m_aRooms.size()); +} + +void ZInvisibleWorldGeometryEffect::OnClearScene() +{ + m_aRooms.clear(); + m_aCurrentlyHiddenRooms.clear(); +} + +bool ZInvisibleWorldGeometryEffect::Available() const +{ + return IChaosEffect::Available() && !m_aRooms.empty(); +} + +void ZInvisibleWorldGeometryEffect::Start() +{ + if (!m_aCurrentlyHiddenRooms.empty()) + { + Stop(); + } + + for (auto& s_Room : m_aRooms) + { + // only apply to currently visible rooms, as Stop() would otherwise make by-default invisible rooms visible. + if (auto s_boVisible = s_Room.m_bVisible; s_boVisible.has_value()) + { + if (!s_boVisible.value()) + { + continue; + } + } + + s_Room.MakeInvisible(); + m_aCurrentlyHiddenRooms.emplace_back(s_Room); + } +} + +void ZInvisibleWorldGeometryEffect::Stop() +{ + for (auto& s_Room : m_aCurrentlyHiddenRooms) + { + s_Room.MakeVisible(); + } + m_aCurrentlyHiddenRooms.clear(); +} + +REGISTER_CHAOS_EFFECT(ZInvisibleWorldGeometryEffect) diff --git a/src/Effects/World/ZInvisibleWorldGeometryEffect.h b/src/Effects/World/ZInvisibleWorldGeometryEffect.h new file mode 100644 index 0000000..7b86cd4 --- /dev/null +++ b/src/Effects/World/ZInvisibleWorldGeometryEffect.h @@ -0,0 +1,33 @@ +#pragma once +#include "IChaosEffect.h" + +#include + +#include + +#include "Entity/Bindings/SZRoomEntityBinding.h" + +class ZInvisibleWorldGeometryEffect : public IChaosEffect +{ + public: + void OnEnterScene() override; + void OnClearScene() override; + bool Available() const override; + + void Start() override; + void Stop() override; + + std::string GetDisplayName(const bool p_bVoting) const override + { + return "Where did Everything go?"; + } + + EDuration GetDuration() const override + { + return EDuration::Short; + } + + private: + std::vector m_aRooms; + std::vector m_aCurrentlyHiddenRooms; +}; diff --git a/src/Entity/Bindings/SZRoomEntityBinding.h b/src/Entity/Bindings/SZRoomEntityBinding.h new file mode 100644 index 0000000..c20e521 --- /dev/null +++ b/src/Entity/Bindings/SZRoomEntityBinding.h @@ -0,0 +1,22 @@ +#pragma once +#include "Entity/Bindings/EntityBinding.h" + +// [modules:/zroomentity.class].pc_entitytype (partial) +struct SZRoomEntityBinding : public SEntityBinding +{ + using SEntityBinding::SEntityBinding; + + PROPERTY(bool, m_bVisible); + PROPERTY(bool, m_bForceVisible); + PROPERTY(bool, m_bIsPrivate); + PROPERTY(bool, m_bVisibleInBoxReflection); + + PROPERTY(ZEntityRef, m_eidParent); + + PROPERTY(bool, m_bOutside); + PROPERTY(bool, m_bOutsideMaster); + + INPUT_PIN(MakeVisible); + INPUT_PIN(MakeInvisible); + INPUT_PIN(Detach); +}; From 7dcf05fc8f0d77a640ca8df10b263e854ee81052 Mon Sep 17 00:00:00 2001 From: shadow578 <52449218+shadow578@users.noreply.github.com> Date: Thu, 4 Jun 2026 17:49:10 +0200 Subject: [PATCH 2/2] remove unneeded includes --- src/Effects/World/ZInvisibleWorldGeometryEffect.cpp | 3 --- src/Effects/World/ZInvisibleWorldGeometryEffect.h | 2 -- 2 files changed, 5 deletions(-) diff --git a/src/Effects/World/ZInvisibleWorldGeometryEffect.cpp b/src/Effects/World/ZInvisibleWorldGeometryEffect.cpp index d617b5e..e1a2b6d 100644 --- a/src/Effects/World/ZInvisibleWorldGeometryEffect.cpp +++ b/src/Effects/World/ZInvisibleWorldGeometryEffect.cpp @@ -1,11 +1,8 @@ #include "ZInvisibleWorldGeometryEffect.h" #include -#include #include "Registry.h" -#include "Helpers/EntityUtils.h" -#include "Helpers/Math.h" #define TAG "[ZInvisibleWorldGeometryEffect] " diff --git a/src/Effects/World/ZInvisibleWorldGeometryEffect.h b/src/Effects/World/ZInvisibleWorldGeometryEffect.h index 7b86cd4..6bd7069 100644 --- a/src/Effects/World/ZInvisibleWorldGeometryEffect.h +++ b/src/Effects/World/ZInvisibleWorldGeometryEffect.h @@ -1,8 +1,6 @@ #pragma once #include "IChaosEffect.h" -#include - #include #include "Entity/Bindings/SZRoomEntityBinding.h"