From 13635df9f80c60af99c6d9bda016735c80806815 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Fri, 15 Dec 2023 07:26:39 +0100 Subject: [PATCH] Handle blocking dialogs with DLL, replaced dialoguemenu.swf with unchanged Better Dialogue Controls --- SKSE/Plugins/EnderalSE.dll | 4 +- interface/dialoguemenu.swf | 4 +- scripts/_00e_confirmdialogquit.pex | Bin 0 -> 930 bytes scripts/_00e_questfunctions.pex | Bin 41874 -> 40455 bytes scripts/enderalfunctions.pex | Bin 1256 -> 1357 bytes source/Enderal DLL/src/DialogueMenuPatch.h | 47 +++++++++++++++++++++ source/Enderal DLL/src/EventListener.cpp | 38 +++++++++++------ source/Enderal DLL/src/Main.cpp | 6 ++- source/Enderal DLL/src/PapyrusFunctions.h | 15 +++++++ source/scripts/_00e_confirmdialogquit.psc | 7 +++ source/scripts/_00e_questfunctions.psc | 45 ++------------------ source/scripts/enderalfunctions.psc | 4 ++ 12 files changed, 108 insertions(+), 62 deletions(-) create mode 100644 scripts/_00e_confirmdialogquit.pex create mode 100644 source/Enderal DLL/src/DialogueMenuPatch.h create mode 100644 source/scripts/_00e_confirmdialogquit.psc diff --git a/SKSE/Plugins/EnderalSE.dll b/SKSE/Plugins/EnderalSE.dll index 802dfa88..4a7faf19 100644 --- a/SKSE/Plugins/EnderalSE.dll +++ b/SKSE/Plugins/EnderalSE.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8d35facd4bb9cdb353723f53a96e7222fd14b9558b0ba143eea3f06522a1a07 -size 733184 +oid sha256:c6abc73fa679391aeb55f82f4318f642081b8422b5c5c91af3c84c485457277a +size 735744 diff --git a/interface/dialoguemenu.swf b/interface/dialoguemenu.swf index c0f951b5..1eade07d 100644 --- a/interface/dialoguemenu.swf +++ b/interface/dialoguemenu.swf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8a0091104d54e023bd4902f8c3510caaff2ec1fd409d04237af12d128530e4d -size 24622 +oid sha256:59ceed60457378a29ba00ae1cfa9bc9f961eef88143ae2edda69fc436d7a77b3 +size 24551 diff --git a/scripts/_00e_confirmdialogquit.pex b/scripts/_00e_confirmdialogquit.pex new file mode 100644 index 0000000000000000000000000000000000000000..336f943c5d1e979975a09b28295986a622ad14f5 GIT binary patch literal 930 zcmb7CO>fgc5Ph3CA5PPxl#$FVZ@Bw1wdM)tZE;?MCX zxbj0dF>A-ANF2bHW@p~aym@2q&yU}JG#e1$hrWJ)hQo`=WOnh==!Hs?S1O3j@@=l{ zc%6ml&7#QUX_m(l1FHRTp|r$3jQ-xq#NAV}=Qgke|I}Dhx!(E86zCg$LQAD9tY`F0 zN0r}RsVE|itip);LYO4bv23zH^w_z<0hvMg9$6+A-owYGKsF}xFF zV))akWBCxI@RmVB7_z)M6U|eT%vDV2yM1c;WO_@PpYUX)99- zNnLVVu_8ByiAw_MoN8XgGw|d;%7Y^KA{V?M?*F+!N;Xfm(@!$Y)6@wlr`1>D7%l#V z0u6UXoYSlw59q+VdRv=9SI&<>+Z_$AL042aOg!b&5pUx1Y%zmhqNQn}hb{E6jRA(( z!42$kx^p0KQ(#Y^=jJ!qj9xTwYaq~PY+t}Dy@AX6tPIThZ)Pa4BTzPq5&MpzS&idx z*M-<~)~)Vi-^DJtjRUq$T$9JQ1rF=#ZGj`sGupa_^5^k!r|Pb3n}NI6fd*3^{{{pz G9{mFP;JOI_ literal 0 HcmV?d00001 diff --git a/scripts/_00e_questfunctions.pex b/scripts/_00e_questfunctions.pex index 34202d885756bd445f1473d74e2b9967144be38b..99b1a3daa59a46a294889245274727cec0c2b6d4 100644 GIT binary patch literal 40455 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 v;0qE`{7_dXY&Gp?_+T9W)h4-6?bQFzHv0bokST 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 Wcb{_HGE9y94|9uAL!(=_?f(IAy=L41 diff --git a/scripts/enderalfunctions.pex b/scripts/enderalfunctions.pex index 3d2ab3beb8b38610f11b16363102340f4293a0a5..9cedf24145145489fd87ff6fbe4ffec0a83dcb07 100644 GIT binary patch delta 686 zcmZuuO-~d-5PdbXpDgUIAiJ`x-(M>rtPl>u30+ONXp}^w#+YHZ#W7=#S(+1vy?Wiu zpYRuWHr)LSo=v!L_QdNRHh{4@)Ai<6)$6M6KgC~T)xWQQ{`NfxXlnmxby!`IJ@?yyD7>%i?u?2qif>+yZ6XGjpD$dNKq4nTJ=$RzWrHs z%}e!B^_A|bWK-TIk@u=V^(_+^l|1z3l9IQS9C+*5{iAu56VHD$u)_()t+QYP$Y7SM z$z_SM3lLN+@K6<8uslt^(OZ=6sV`Gv@+8iXk11TlG^rYWW=2pKToO$Aw$8&~Wn+{PW;MT_4(rduohdwh<1=lb!PG3Rp0&%0h0Nco()BDgPDa0hbeMaJvW fLHP{L`)yz;Ew{VyCKmYwO|(x*@F|*jaE3SrC^%Rt delta 576 zcmY*WyG{a85IwWI2*@HRDuN>TMDQJ~=rqQ}#)iUIjM)I{ChM-j+w%?Pmi~Z+A7PA^ z7XE;RvG5zLoO^+wbCaE!b7#(++50y59ZmimK7E)52y9L7>*X$4p^dxU2brVd=)jfR zXf%Dq>Ve;Ig&X*eC*LWRsEL;AUn0C+7eVXvOn%Zy%G~z_teqh65Uy55^ZI5(dQ>Sy zob%gGd1%iI9Dyja3CH!DEm#MEFQ1J~d2f`$+*K2fkX7S|w&bg^Ec0d}Q4IeFA{hA(gple1p*BV_ zhH)(+gDf(b#FXZVA=jx=Gfhl0oM))O-pUYW2(yG~HI)p^#R&yYM+kY2w3aN#80@Pd z%yXj5!a`3#o3O|mC<`;QezD#rHi}r%SKW`n{iQxYJfY0eidgP|gcUt*l_4|DKasFT WSk-(Sm-(Ji`wxm_oNL$nocINLH9_P6 diff --git a/source/Enderal DLL/src/DialogueMenuPatch.h b/source/Enderal DLL/src/DialogueMenuPatch.h new file mode 100644 index 00000000..942b4c15 --- /dev/null +++ b/source/Enderal DLL/src/DialogueMenuPatch.h @@ -0,0 +1,47 @@ +#pragma once + +inline bool bTabBlocked = false; + +class DialogueMenuPatch final : public RE::DialogueMenu +{ +public: + static void Install() + { + REL::Relocation OpenJournalMenuFunc{ 0x0092412C }; + + REL::Relocation vtbl(RE::VTABLE_DialogueMenu[0]); + _ProcessMessageFn = vtbl.write_vfunc(0x4, &ProcessMessageEx); + } + + static void BlockTab(bool a_block = true) + { + bTabBlocked = a_block; + } + +private: + RE::UI_MESSAGE_RESULTS ProcessMessageEx(RE::UIMessage& a_message) + { + if (bTabBlocked && a_message.type == RE::UI_MESSAGE_TYPE::kScaleformEvent) { + RE::BSUIScaleformData* data = static_cast(a_message.data); + + if (data && data->scaleformEvent->type == RE::GFxEvent::EventType::kKeyDown) { + RE::GFxKeyEvent* key = (RE::GFxKeyEvent*)data->scaleformEvent; + + // Escape triggers a kTab event, added kEscape just in case + if (key && (key->keyCode == RE::GFxKey::kTab || key->keyCode == RE::GFxKey::kEscape) && !RE::UI::GetSingleton()->IsMenuOpen(RE::ContainerMenu::MENU_NAME) && !RE::UI::GetSingleton()->IsMenuOpen(RE::BarterMenu::MENU_NAME)) { + // The best solution is to show the quest journal, like in LE, but showing a journal seems to mess with framerate of the UI, see dialogue menu after showing journal + //RE::UIMessageQueue::GetSingleton()->AddMessage(RE::InterfaceStrings::GetSingleton()->journalMenu, RE::UI_MESSAGE_TYPE::kShow, 0i64); + RE::BSTSmartPointer stackCallback; + RE::BSScript::Internal::VirtualMachine::GetSingleton()->DispatchStaticCall("_00E_ConfirmDialogQuit", "Show", RE::MakeFunctionArguments(), stackCallback); + return RE::UI_MESSAGE_RESULTS::kIgnore; + } + } + } + + return _ProcessMessageFn(this, a_message); + } + + using ProcessMessageFn = decltype(&RE::DialogueMenu::ProcessMessage); + + inline static REL::Relocation _ProcessMessageFn; +}; diff --git a/source/Enderal DLL/src/EventListener.cpp b/source/Enderal DLL/src/EventListener.cpp index 873c0a59..12999a8c 100644 --- a/source/Enderal DLL/src/EventListener.cpp +++ b/source/Enderal DLL/src/EventListener.cpp @@ -1,5 +1,6 @@ #include "EventListener.h" #include "Util.h" +#include "DialogueMenuPatch.h" #include auto EventListener::GetSingleton() -> EventListener* @@ -11,8 +12,9 @@ auto EventListener::GetSingleton() -> EventListener* // Unused void EventListener::Install() { - RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink(EventListener::GetSingleton()); + //RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink(EventListener::GetSingleton()); RE::UI::GetSingleton()->AddEventSink(EventListener::GetSingleton()); + SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton()); } auto EventListener::ProcessEvent( @@ -46,21 +48,29 @@ auto EventListener::ProcessEvent( RE::BSTEventSource* a_eventSource) -> RE::BSEventNotifyControl { - if (a_event->opening && a_event->menuName == RE::JournalMenu::MENU_NAME) { - if (RE::UI::GetSingleton()->IsMenuOpen(RE::DialogueMenu::MENU_NAME)) { - const auto movie = RE::UI::GetSingleton()->GetMovieView(RE::JournalMenu::MENU_NAME); - if (movie) { - // skse.OpenMenu("Journal Menu") opens quest journal uninitialized, without any tab active and hotkeys bound - // We have to activate a tab for it to work properly - std::array args; - args[0].SetNumber(2); - args[1].SetBoolean(true); - movie->Invoke("_root.QuestJournalFader.Menu_mc.RestoreSavedSettings", nullptr, args.data(), static_cast(args.size())); + if (a_event->opening) { + if (a_event->menuName == RE::JournalMenu::MENU_NAME) { + if (RE::UI::GetSingleton()->IsMenuOpen(RE::DialogueMenu::MENU_NAME)) { + const auto movie = RE::UI::GetSingleton()->GetMovieView(RE::JournalMenu::MENU_NAME); + if (movie) { + // UIMessage opens quest journal uninitialized, without any tab active and hotkeys bound + // We have to activate a tab for it to work properly + std::array args; + args[0].SetNumber(2); + args[1].SetBoolean(false); + movie->Invoke("_root.QuestJournalFader.Menu_mc.RestoreSavedSettings", nullptr, args.data(), static_cast(args.size())); + } } + } else if (a_event->menuName == RE::DialogueMenu::MENU_NAME) { + // Make sure Tab is not blocked. If it should be, a Papyrus script will block it a few frames later. + DialogueMenuPatch::BlockTab(false); + } + } else { + if (a_event->menuName == RE::DialogueMenu::MENU_NAME) { + DialogueMenuPatch::BlockTab(false); + } else if (a_event->menuName == RE::MainMenu::MENU_NAME) { + CheckScriptVersions(); } - } else if (!a_event->opening && a_event->menuName == RE::MainMenu::MENU_NAME) { - RE::UI::GetSingleton()->RemoveEventSink(EventListener::GetSingleton()); - CheckScriptVersions(); } return RE::BSEventNotifyControl::kContinue; diff --git a/source/Enderal DLL/src/Main.cpp b/source/Enderal DLL/src/Main.cpp index 14d6c53e..d96a1bb5 100644 --- a/source/Enderal DLL/src/Main.cpp +++ b/source/Enderal DLL/src/Main.cpp @@ -6,6 +6,7 @@ #include "MapMarkerPlacement.h" #include "AchievementFix.h" #include "BinkInterruptPatch.h" +#include "DialogueMenuPatch.h" using namespace SKSE; @@ -158,11 +159,12 @@ SKSEPluginLoad(const LoadInterface* skse) { setting->data.s = nullptr; RE::INISettingCollection::GetSingleton()->WriteSetting(setting); - SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton()); - RE::UI::GetSingleton()->AddEventSink(EventListener::GetSingleton()); + EventListener::Install(); GetPapyrusInterface()->Register(Papyrus::Bind); + DialogueMenuPatch::Install(); + if (g_settings.at("VideoInterruptPatch")) { logger::info("Making videos interruptible..."); BinkInterruptPatch::Install(); diff --git a/source/Enderal DLL/src/PapyrusFunctions.h b/source/Enderal DLL/src/PapyrusFunctions.h index b376eacb..18720627 100644 --- a/source/Enderal DLL/src/PapyrusFunctions.h +++ b/source/Enderal DLL/src/PapyrusFunctions.h @@ -2,6 +2,7 @@ #include "Util.h" #include "PersistentFormManager.h" +#include "DialogueMenuPatch.h" namespace Papyrus::PapyrusFunctions { @@ -87,6 +88,16 @@ namespace Papyrus::PapyrusFunctions return sstream.str(); } + void DisableDialogueQuitting(RE::StaticFunctionTag*) + { + DialogueMenuPatch::BlockTab(); + } + + void EnableDialogueQuitting(RE::StaticFunctionTag*) + { + DialogueMenuPatch::BlockTab(false); + } + inline void Bind(VM& a_vm) { BIND(CreatePotion); @@ -101,5 +112,9 @@ namespace Papyrus::PapyrusFunctions logger::info("{}", "Registered GetPlayerHash"sv); BIND(StringToHex); logger::info("{}", "Registered StringToHex"sv); + BIND(DisableDialogueQuitting); + logger::info("{}", "Registered DisableDialogueQuitting"sv); + BIND(EnableDialogueQuitting); + logger::info("{}", "Registered EnableDialogueQuitting"sv); } } diff --git a/source/scripts/_00e_confirmdialogquit.psc b/source/scripts/_00e_confirmdialogquit.psc new file mode 100644 index 00000000..b279a972 --- /dev/null +++ b/source/scripts/_00e_confirmdialogquit.psc @@ -0,0 +1,7 @@ +Scriptname _00E_ConfirmDialogQuit Hidden + +function Show() global + if (Game.GetFormFromFile(0x163D, "Update.esm") as Message).Show() == 1 + Game.QuitToMainMenu() + endif +endfunction diff --git a/source/scripts/_00e_questfunctions.psc b/source/scripts/_00e_questfunctions.psc index f31554f1..1f381818 100644 --- a/source/scripts/_00e_questfunctions.psc +++ b/source/scripts/_00e_questfunctions.psc @@ -139,58 +139,21 @@ Function DisableDialogueQuitting() Global {Disables the TAB Key during dialogue. Resets automatically upon dialogue exit via Goodbye.} if ! UI.IsMenuOpen("Dialogue Menu") - UnregisterDialogQuitKey() + EnableDialogueQuitting() return endif - if UI.GetBool("Dialogue Menu", "_root.DialogueMenu_mc.bEnableTab") != true - ; Suspected non-Enderal dialoguemenu.swf replacer, rechecking value in order to be sure. - UI.InvokeBool("Dialogue Menu", "_root.DialogueMenu_mc.SetVariable", True) - if UI.GetBool("Dialogue Menu", "_root.DialogueMenu_mc.bEnableTab") != true - Debug.Notification("Detected incompatible dialoguemenu.swf!") - endif - endif - - UI.InvokeBool("Dialogue Menu", "_root.DialogueMenu_mc.SetVariable", False) - - Quest Levelsystem = Game.GetForm(0x10AA2) as Quest - Levelsystem.RegisterForKey(1) ; Escape - Levelsystem.RegisterForKey(15) ; Tab - int iControllerKey = Input.GetMappedKey("Tween Menu", 0x02) - if iControllerKey > -1 - Levelsystem.RegisterForKey(iControllerKey) ; Controller - endif - - Levelsystem.RegisterForMenu("Dialogue Menu") + EnderalFunctions.DisableDialogueQuitting() EndFunction Function EnableDialogueQuitting() Global {Disables the TAB Key during dialogue. Resets automatically upon dialogue exit via Goodbye.} - UI.InvokeBool("Dialogue Menu", "_root.DialogueMenu_mc.SetVariable", True) - UnregisterDialogQuitKey() + EnderalFunctions.EnableDialogueQuitting() EndFunction -function UnregisterDialogQuitKey() Global - Quest Levelsystem = Game.GetForm(0x10AA2) as Quest - Levelsystem.UnregisterForAllKeys() - Levelsystem.UnregisterForMenu("Dialogue Menu") -endfunction - -Event OnKeyDown(Int KeyCode) - if UI.IsMenuOpen("Dialogue Menu") - if ! UI.IsMenuOpen("MessageBoxMenu") && ! UI.GetBool("Dialogue Menu", "_root.DialogueMenu_mc.bEnableTab") - if (Game.GetFormFromFile(0x163D, "Update.esm") as Message).Show() == 1 - Game.QuitToMainMenu() - endif - endif - else - UnregisterDialogQuitKey() - endif -EndEvent - Function RefreshFace() Global String facegen = "bUseFaceGenPreprocessedHeads:General" @@ -934,8 +897,6 @@ Event OnMenuClose(String MenuName) If MenuName == "Book Menu" MTToRemove.Remove() UnregisterForMenu("Book Menu") - elseif MenuName == "Dialogue Menu" - UnregisterDialogQuitKey() EndIf EndEvent diff --git a/source/scripts/enderalfunctions.psc b/source/scripts/enderalfunctions.psc index cf6e258c..80d94a0f 100644 --- a/source/scripts/enderalfunctions.psc +++ b/source/scripts/enderalfunctions.psc @@ -19,6 +19,10 @@ String Function GetPlayerHash() Global Native ; RETURN - Returns the hexadecimal equivalent of the passed string. String Function StringToHex(String a_string) Global Native +; Disables the TAB Key during dialogue. Resets automatically upon dialogue exit via Goodbye. +Function DisableDialogueQuitting() Global Native +Function EnableDialogueQuitting() Global Native + bool function IsDLLLoaded() global int iVer = SKSE.GetPluginVersion("EnderalSE") return iVer > 0