diff --git a/SKSE/Plugins/ArtifactTracker.dll b/SKSE/Plugins/ArtifactTracker.dll index 9d8fb5c..9e8eaa1 100644 Binary files a/SKSE/Plugins/ArtifactTracker.dll and b/SKSE/Plugins/ArtifactTracker.dll differ diff --git a/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp b/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp index f64aba4..8a195d5 100644 --- a/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp +++ b/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp @@ -8,9 +8,13 @@ using namespace SKSE::log; namespace ArtifactTracker { - bool g_bLoaded; - bool g_bHomeContainer; - bool g_bBookShelf; + bool g_bLoaded = false; + bool g_bHomeContainer = false; + bool g_bBookShelf = false; + bool g_bTakeAll = false; + bool g_bNotifyNewArtifact = false; + std::uint32_t g_bTakeAllCount = 0; + std::int32_t g_iFollowerIndex = 0; RE::TESBoundObject* g_cellContainer; RE::BGSListForm* g_listNew; RE::BGSListForm* g_listStored; @@ -22,7 +26,6 @@ namespace ArtifactTracker std::unordered_map g_persistentMap; RE::TESObjectREFR* g_cellStorage; const SKSE::LoadInterface* g_loadInterface; - std::int32_t g_iFollowerIndex; bool Init(bool bKID) { @@ -61,9 +64,12 @@ namespace ArtifactTracker std::map settings{ { "DumpItemList", false }, + { "NewArtifactNotifications", true }, }; LoadINI(&settings, "Data/SKSE/Plugins/ArtifactTracker.ini"); + g_bNotifyNewArtifact = settings.at("NewArtifactNotifications"); + // Preloading item lists g_artifactFormTypes.insert(RE::FormType::Weapon); @@ -279,7 +285,7 @@ namespace ArtifactTracker if (cellStorage) { g_bHomeContainer = false; g_cellStorage = cellStorage; - RE::UI::GetSingleton()->AddEventSink(EventListener::GetSingleton()); + //RE::UI::GetSingleton()->AddEventSink(EventListener::GetSingleton()); RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink(EventListener::GetSingleton()); #ifdef _DEBUG log::info("Home mode ON"); @@ -288,7 +294,7 @@ namespace ArtifactTracker } else if (g_cellStorage) { g_bHomeContainer = false; g_cellStorage = nullptr; - RE::UI::GetSingleton()->RemoveEventSink(EventListener::GetSingleton()); + //RE::UI::GetSingleton()->RemoveEventSink(EventListener::GetSingleton()); RE::ScriptEventSourceHolder::GetSingleton()->RemoveEventSink(EventListener::GetSingleton()); #ifdef _DEBUG log::info("Home mode OFF"); @@ -521,6 +527,14 @@ namespace ArtifactTracker if (!g_listStored->HasForm(form) && !g_listFound->HasForm(form)) { // it's a new item, move it to found ListRemoveItem(g_listNew, form); g_listFound->AddForm(form); + + if (g_bNotifyNewArtifact) { + if (g_bTakeAll) { + g_bTakeAllCount++; + } else { + RE::DebugNotification(fmt::format("New artifact acquired: {}", form->GetName()).c_str()); + } + } } } else if (g_cellStorage && g_cellStorage->formID == a_event->newContainer) { diff --git a/Source/ArtifactTrackerDLL/src/ArtifactTracker.h b/Source/ArtifactTrackerDLL/src/ArtifactTracker.h index dfc3065..386c78b 100644 --- a/Source/ArtifactTrackerDLL/src/ArtifactTracker.h +++ b/Source/ArtifactTrackerDLL/src/ArtifactTracker.h @@ -5,6 +5,9 @@ namespace ArtifactTracker extern bool g_bLoaded; extern bool g_bHomeContainer; extern bool g_bBookShelf; + extern bool g_bTakeAll; + extern bool g_bNotifyNewArtifact; + extern std::uint32_t g_bTakeAllCount; extern RE::TESBoundObject* g_cellContainer; extern RE::BGSListForm* g_listNew; extern RE::BGSListForm* g_listStored; diff --git a/Source/ArtifactTrackerDLL/src/EventListener.cpp b/Source/ArtifactTrackerDLL/src/EventListener.cpp index bfe36b5..3c67cff 100644 --- a/Source/ArtifactTrackerDLL/src/EventListener.cpp +++ b/Source/ArtifactTrackerDLL/src/EventListener.cpp @@ -13,6 +13,7 @@ void EventListener::Install() RE::PlayerCharacter::GetSingleton()->AddEventSink(EventListener::GetSingleton()); RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink(EventListener::GetSingleton()); RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink(EventListener::GetSingleton()); + RE::UI::GetSingleton()->AddEventSink(EventListener::GetSingleton()); } auto EventListener::ProcessEvent( @@ -78,12 +79,25 @@ auto EventListener::ProcessEvent( RE::BSTEventSource* a_eventSource) -> RE::BSEventNotifyControl { - // This listener is expected to be unregistered outside of home. - if (ArtifactTracker::IsHome() && a_event->menuName == "ContainerMenu") { + if (a_event->menuName == "ContainerMenu") { #ifdef _DEBUG SKSE::log::info("MenuOpenCloseEvent"); #endif - ArtifactTracker::SetContainerMode(a_event->opening); + + if (a_event->opening) { + RE::BSInputDeviceManager::GetSingleton()->AddEventSink(EventListener::GetSingleton()); + } else { + RE::BSInputDeviceManager::GetSingleton()->RemoveEventSink(EventListener::GetSingleton()); + if (ArtifactTracker::g_bTakeAll && ArtifactTracker::g_bTakeAllCount > 0) { + RE::DebugNotification(fmt::format("{} new artifact(s) acquired", ArtifactTracker::g_bTakeAllCount).c_str()); + } + ArtifactTracker::g_bTakeAll = false; + ArtifactTracker::g_bTakeAllCount = 0; + } + + if (ArtifactTracker::IsHome()) { + ArtifactTracker::SetContainerMode(a_event->opening); + } } return RE::BSEventNotifyControl::kContinue; @@ -119,3 +133,24 @@ auto EventListener::ProcessEvent( return RE::BSEventNotifyControl::kContinue; } + +RE::BSEventNotifyControl EventListener::ProcessEvent( + RE::InputEvent* const* a_event, + RE::BSTEventSource* a_eventSource) +{ + if (RE::UI::GetSingleton()->GameIsPaused()) { + auto inputEvent = a_event ? *a_event : nullptr; + auto buttonEvent = inputEvent ? inputEvent->AsButtonEvent() : nullptr; + + if (!buttonEvent) { + return RE::BSEventNotifyControl::kContinue; + } + + if (RE::UI::GetSingleton()->IsMenuOpen("ContainerMenu") && buttonEvent->QUserEvent() == RE::UserEvents::GetSingleton()->xButton) { + ArtifactTracker::g_bTakeAll = true; + ArtifactTracker::g_bTakeAllCount = 0; + } + } + + return RE::BSEventNotifyControl::kContinue; +} diff --git a/Source/ArtifactTrackerDLL/src/EventListener.h b/Source/ArtifactTrackerDLL/src/EventListener.h index d64623c..579b67d 100644 --- a/Source/ArtifactTrackerDLL/src/EventListener.h +++ b/Source/ArtifactTrackerDLL/src/EventListener.h @@ -7,7 +7,8 @@ class EventListener : public RE::BSTEventSink, public RE::BSTEventSink, public RE::BSTEventSink, - public RE::BSTEventSink + public RE::BSTEventSink, + public RE::BSTEventSink { public: ~EventListener() = default; @@ -54,6 +55,11 @@ public: RE::BSTEventSource* a_eventSource) -> RE::BSEventNotifyControl override; + RE::BSEventNotifyControl ProcessEvent( + RE::InputEvent* const* a_event, + RE::BSTEventSource* a_eventSource) + override; + private: EventListener() = default; }; \ No newline at end of file