From 6282e8a6b4c0583a3bcb695e4292f279c42f2b86 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 3 Nov 2023 17:08:08 +0600 Subject: [PATCH 1/6] wiw --- .../src/platform_se/skyrim_platform/EventUtils.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h index db10cf288c..ceb14254c3 100644 --- a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h +++ b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h @@ -1,5 +1,11 @@ #pragma once +template <> +inline RE::BSTEventSource* GetEventSource() +{ + return RE::ActorKill::GetEventSource(); +} + template inline RE::BSTEventSource* GetEventSource() { From c38ed3d96ad31c0192aefb26cbad83ad51e41140 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 3 Nov 2023 17:12:32 +0600 Subject: [PATCH 2/6] fix --- .../src/platform_se/skyrim_platform/EventUtils.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h index ceb14254c3..33488dae81 100644 --- a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h +++ b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h @@ -1,17 +1,17 @@ #pragma once -template <> -inline RE::BSTEventSource* GetEventSource() -{ - return RE::ActorKill::GetEventSource(); -} - template inline RE::BSTEventSource* GetEventSource() { return RE::ScriptEventSourceHolder::GetSingleton()->GetEventSource(); } +template <> +inline RE::BSTEventSource* GetEventSource() +{ + return RE::ActorKill::GetEventSource(); +} + template requires HasEvent inline RE::BSTEventSource* GetEventSource() From c1bc0b1e19f3641a392247c07db6c82949cbe0cc Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 3 Nov 2023 18:30:28 +0600 Subject: [PATCH 3/6] remove problemaic actor kill --- skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h b/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h index 4c431507bb..1b6d5dd0b4 100644 --- a/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h +++ b/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h @@ -641,7 +641,7 @@ class EventHandler final // story events // TODO: implement these - AppendSink(std::vector({ "actorKill" })); + // AppendSink(std::vector({ "actorKill" })); AppendSink(std::vector({ "bookRead" })); AppendSink(std::vector({ "criticalHit" })); AppendSink(std::vector({ "disarmedEvent" })); From 5097184b81ce4ff3e3e075fc856901b132af51a6 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 3 Nov 2023 18:31:21 +0600 Subject: [PATCH 4/6] rm --- .../src/platform_se/skyrim_platform/EventUtils.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h index 33488dae81..db10cf288c 100644 --- a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h +++ b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h @@ -6,12 +6,6 @@ inline RE::BSTEventSource* GetEventSource() return RE::ScriptEventSourceHolder::GetSingleton()->GetEventSource(); } -template <> -inline RE::BSTEventSource* GetEventSource() -{ - return RE::ActorKill::GetEventSource(); -} - template requires HasEvent inline RE::BSTEventSource* GetEventSource() From 0f4bb7ecae9c485e3f70cf624c29fccf77a26ec6 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 3 Nov 2023 19:04:30 +0600 Subject: [PATCH 5/6] hope it helps --- .../skyrim_platform/EventHandler.h | 136 ++++++++++++------ .../platform_se/skyrim_platform/EventUtils.h | 2 +- 2 files changed, 93 insertions(+), 45 deletions(-) diff --git a/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h b/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h index 1b6d5dd0b4..de7cf36bd4 100644 --- a/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h +++ b/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h @@ -452,64 +452,83 @@ class EventHandler final activeSinks.reserve(20); // script events - AppendSink(std::vector({ "activate" })); - AppendSink( + AppendSinkScriptEvent(std::vector({ "activate" })); + AppendSinkScriptEvent( std::vector({ "effectStart", "effectFinish" })); - AppendSink( + AppendSinkScriptEvent( std::vector({ "locationChanged" })); - AppendSink( + AppendSinkScriptEvent( std::vector({ "cellAttach", "cellDetach" })); - AppendSink( + AppendSinkScriptEvent( std::vector({ "cellFullyLoaded" })); - AppendSink(std::vector({ "combatState" })); - AppendSink( + AppendSinkScriptEvent(std::vector({ "combatState" })); + AppendSinkScriptEvent( std::vector({ "containerChanged" })); - AppendSink(std::vector({ "deathEnd", "deathStart" })); - AppendSink( + AppendSinkScriptEvent( + std::vector({ "deathEnd", "deathStart" })); + AppendSinkScriptEvent( std::vector({ "destructionStageChanged" })); - AppendSink(std::vector({ "enterBleedout" })); - AppendSink(std::vector({ "equip", "unequip" })); - AppendSink(std::vector({ "fastTravelEnd" })); - AppendSink( + AppendSinkScriptEvent( + std::vector({ "enterBleedout" })); + AppendSinkScriptEvent( + std::vector({ "equip", "unequip" })); + AppendSinkScriptEvent( + std::vector({ "fastTravelEnd" })); + AppendSinkScriptEvent( std::vector({ "furnitureExit", "furnitureEnter" })); - AppendSink(std::vector({ "grabRelease" })); - AppendSink(std::vector({ "hit" })); - AppendSink(std::vector({ "scriptInit" })); - AppendSink(std::vector({ "loadGame" })); - AppendSink(std::vector({ "lockChanged" })); - AppendSink( + AppendSinkScriptEvent( + std::vector({ "grabRelease" })); + AppendSinkScriptEvent(std::vector({ "hit" })); + AppendSinkScriptEvent( + std::vector({ "scriptInit" })); + AppendSinkScriptEvent(std::vector({ "loadGame" })); + AppendSinkScriptEvent( + std::vector({ "lockChanged" })); + AppendSinkScriptEvent( std::vector({ "magicEffectApply" })); - AppendSink(std::vector({ "wardHit" })); - AppendSink( + AppendSinkScriptEvent( + std::vector({ "wardHit" })); + AppendSinkScriptEvent( std::vector({ "moveAttachDetach" })); - AppendSink(std::vector({ "objectLoaded" })); - AppendSink( + AppendSinkScriptEvent( + std::vector({ "objectLoaded" })); + AppendSinkScriptEvent( std::vector({ "translationFailed", "translationAlmostCompleted", "translationCompleted" })); - AppendSink(std::vector({ "open", "close" })); - AppendSink( + AppendSinkScriptEvent( + std::vector({ "open", "close" })); + AppendSinkScriptEvent( std::vector({ "packageStart", "packageChange", "packageEnd" })); - AppendSink(std::vector({ "perkEntryRun" })); - AppendSink(std::vector({ "playerBowShot" })); - AppendSink(std::vector({ "questInit" })); - AppendSink(std::vector({ "questStage" })); - AppendSink( + AppendSinkScriptEvent( + std::vector({ "perkEntryRun" })); + AppendSinkScriptEvent( + std::vector({ "playerBowShot" })); + AppendSinkScriptEvent(std::vector({ "questInit" })); + AppendSinkScriptEvent( + std::vector({ "questStage" })); + AppendSinkScriptEvent( std::vector({ "questStart", "questStop" })); - AppendSink(std::vector({ "reset" })); - AppendSink(std::vector({ "sceneAction" })); - AppendSink(std::vector({ "sell" })); - AppendSink(std::vector({ "sleepStart" })); - AppendSink(std::vector({ "sleepStop" })); - AppendSink(std::vector({ "spellCast" })); - AppendSink( + AppendSinkScriptEvent(std::vector({ "reset" })); + AppendSinkScriptEvent( + std::vector({ "sceneAction" })); + AppendSinkScriptEvent(std::vector({ "sell" })); + AppendSinkScriptEvent( + std::vector({ "sleepStart" })); + AppendSinkScriptEvent(std::vector({ "sleepStop" })); + AppendSinkScriptEvent(std::vector({ "spellCast" })); + AppendSinkScriptEvent( std::vector({ "switchRaceComplete" })); - AppendSink(std::vector({ "trackedStats" })); - AppendSink(std::vector({ "triggerEnter" })); - AppendSink(std::vector({ "trigger" })); - AppendSink(std::vector({ "triggerLeave" })); - AppendSink(std::vector({ "uniqueIdChange" })); - AppendSink(std::vector({ "waitStart" })); - AppendSink(std::vector({ "waitStop" })); + AppendSinkScriptEvent( + std::vector({ "trackedStats" })); + AppendSinkScriptEvent( + std::vector({ "triggerEnter" })); + AppendSinkScriptEvent(std::vector({ "trigger" })); + AppendSinkScriptEvent( + std::vector({ "triggerLeave" })); + AppendSinkScriptEvent( + std::vector({ "uniqueIdChange" })); + AppendSinkScriptEvent(std::vector({ "waitStart" })); + AppendSinkScriptEvent(std::vector({ "waitStop" })); // skse events // at the moment of writing, no way was found to standardize event source @@ -655,6 +674,35 @@ class EventHandler final AppendSink(std::vector({ "spellsLearned" })); } + template + void AppendSinkScriptEvent(std::vector eventNames) + { + // should consider checking if sink exists + // but since we store sink pointers + // the only option it to loop through all sinks + // and check for event names, TODO? + + auto sink = new Sink( + eventNames, + // Activate + [](const ::Sink* sink) { + const auto handler = EventHandler::GetSingleton(); + handler->ActivateSink(sink, GetEventSourceScriptEvent()); + }, + // Deactivate + [](const ::Sink* sink) { + const auto handler = EventHandler::GetSingleton(); + handler->DeactivateSink(sink, GetEventSourceScriptEvent()); + }, + // IsActive + [](const ::Sink* sink) -> bool { + const auto handler = EventHandler::GetSingleton(); + return handler->IsActiveSink(sink); + }); + + sinks.emplace(sink); + } + /** * @brief Create new sink instance and add it to sink set. * Registration via script event source. diff --git a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h index db10cf288c..7bee972353 100644 --- a/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h +++ b/skyrim-platform/src/platform_se/skyrim_platform/EventUtils.h @@ -1,7 +1,7 @@ #pragma once template -inline RE::BSTEventSource* GetEventSource() +inline RE::BSTEventSource* GetEventSourceScriptEvent() { return RE::ScriptEventSourceHolder::GetSingleton()->GetEventSource(); } From 3631d44400b3303de9adf97150de8eb5ee34cb20 Mon Sep 17 00:00:00 2001 From: Leonid Pospelov Date: Fri, 3 Nov 2023 19:41:12 +0600 Subject: [PATCH 6/6] uncomment actorKill --- skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h b/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h index de7cf36bd4..2e769222dd 100644 --- a/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h +++ b/skyrim-platform/src/platform_se/skyrim_platform/EventHandler.h @@ -660,7 +660,7 @@ class EventHandler final // story events // TODO: implement these - // AppendSink(std::vector({ "actorKill" })); + AppendSink(std::vector({ "actorKill" })); AppendSink(std::vector({ "bookRead" })); AppendSink(std::vector({ "criticalHit" })); AppendSink(std::vector({ "disarmedEvent" }));