From fbbf0bd7f75dfaaa641bfcbe6affd51a087246db Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Mon, 15 Jan 2024 02:47:42 +0100 Subject: [PATCH] Manage combat music with a quest, removed _00E_CombatSoundtrackScript from 800+ objects --- CombatMusicControl update.esp | Bin 0 -> 771 bytes SKSE/Plugins/EnderalSE.dll | 4 +- scripts/_00E_CombatMusicControl.pex | Bin 4168 -> 5886 bytes scripts/_00e_combatsoundtrackscript.pex | Bin 2039 -> 0 bytes scripts/enderalfunctions.pex | Bin 1902 -> 1933 bytes source/Enderal DLL/src/EventListener.cpp | 24 ++++++++ source/Enderal DLL/src/EventListener.h | 9 ++- source/Enderal DLL/src/PapyrusFunctions.h | 21 +++++++ source/scripts/_00E_CombatMusicControl.psc | 54 +++++++++++++++++- .../scripts/_00e_combatsoundtrackscript.psc | 38 ------------ source/scripts/enderalfunctions.psc | 17 +++--- 11 files changed, 114 insertions(+), 53 deletions(-) create mode 100644 CombatMusicControl update.esp delete mode 100644 scripts/_00e_combatsoundtrackscript.pex delete mode 100644 source/scripts/_00e_combatsoundtrackscript.psc diff --git a/CombatMusicControl update.esp b/CombatMusicControl update.esp new file mode 100644 index 0000000000000000000000000000000000000000..790127082f902e3ccbde1b6dd16122a3e761abfa GIT binary patch literal 771 zcmaJY5S^I#aTps7ej)_H&X0&TR^*yV<*_5Zz*#dGlu8+ncknxzvQ;XGWy!SkFe`{OollBC@MxfMf<4 zeW2qMveOnA$h7*wJgj@A@*H7h(2<4u+H+Ldt`;0l{wT)*R|>>)-1uxfMZF^BoK)f_ zr(TJ$4m}$gYdZoVA+eUVH!nr7Wt)~%oKGlSnR7`H=ix;929R&T`i4FPNm|}_xKU%J ze3DkUM_t%9kiHn|hAuI71agT4&UIjEFs5p)UZ0W6l48wuypYiQ{CsDi5AkIU=rtPp3oB13NXsI8lhv9D+$-+ctB^b(KAn z)+z<=Ir&3h=81)2w1Y`}OnE7c*R|D2w48p^mCbbzKTN>!%Ux>=j zi{vFw2JebpAc24H=vLsV^zR+XywU0akXkYfb~N#iJ4m-izgn6fE!@ZaXst2mM~`;_ Wc7Y>4w*D4i(RRoDbAU~~gy9R#@xP}4 literal 0 HcmV?d00001 diff --git a/SKSE/Plugins/EnderalSE.dll b/SKSE/Plugins/EnderalSE.dll index 77d83cb7..d339a69d 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:7c3f64719f244c37e335b2029182b51bea05957a1636d1dedf7bf5a854403de6 -size 751616 +oid sha256:ca655e941a261df2f688427ef906c5bdd91cf3ce1d55cc262638fc15b4c582bb +size 757248 diff --git a/scripts/_00E_CombatMusicControl.pex b/scripts/_00E_CombatMusicControl.pex index 6bdafae2bfe7d63f869548434c82b1a375107a0f..d4fab48cdd50047e1f277e14449d71e9db61c352 100644 GIT binary patch literal 5886 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 diff --git a/scripts/_00e_combatsoundtrackscript.pex b/scripts/_00e_combatsoundtrackscript.pex deleted file mode 100644 index 36da9b9c3abef160a525bdb8ccdb073cfdeca15c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2039 zcmaJ>+fv*{5IwW^3(MjF#(*7Uav{MsEG*cIoWwQ+94Z&5vc#!8Q9>FP1tD!ov! zjY3bwj(gd6V}GbNhKY;Dq31=TI2i>Nre%&duKm!$*H~t_JatWYG7e8nI8)SKO4V16 zlBmCoRFuNntMKQcr;T&3!Ys4)Ik<4bf%MRHqtNq}AB9eU%7yQFGDP`>tD+dUZ2QN+ zxsmaA@{J5m-#9U*2SIe^1cbhG7D&w6w(&i=8Or@ANsLqVQr=ugv4<7gHaGr$l=yCT z@6(^;U=%p9@vL9z6UAWEPhx*CkTErt_M<4k;(J5UdMhWI6Dm>qAqpk-jz*!YZ)K?q zM_I|WuiOinaOWphboQHcm8BwXrIie&>!175vl3IhS}3p6+Ew~0_QL_{wyjBD^Ztz} zJPf_`xRl7?997#+w^LELF9&{@?r2u>YS=;PJc_Thm)>sWU>lX8DQ#}(Vqv1YrY!7? zidl%#z`2sBvb#r`s&SkgXPv|Xi|Hpy#ysg$Y9RAw8?rRTc~*)9^W;cpz;xswOVIAC zXgFa<&AB{r;(=6XIdWoXP&^J*u6QR0yE%BAgC{xY!cw z(;vDVabC>~-}q!_jCS$Jw%$7<)-aBSGFCSh8_vqB8A;eXa0+`*z*OIV&*1ylrcrT>$P zzcQ&&%Xf*%8>zr1)tRS71?Fi}03XUK;uei2sEQUoplh~iQeY$B)Cn|ak&5S24q+q< z3Y$Z5L10l}i91u2mcTO4X}vpPW&B)9s2M7_hYztr$rjbz=dWg3#YdPT)yD##2;9?b zLcivw1y*Pv^L-*Re`=6r^4%6NK-Tq z=lV^EZrfOI0S~C~As(@T8`QhWW@)`0-eHR;+u0qu^w=TZ#bZ3-Uypc?Hk z*brz@&W6#&du>uN%f+9~0=}TKF9p8Jq!eg03YXG*h_;D;sBI!ASsfRwW9<5+3$`WD zNei~cux)_{tQmv0wZmQB`I)IzS8qYbJ%R45zz$JPLA*21KfSLq;<-RwVAn)2!xIhK zB?21xrinj$B=B&k<$nQa`gQ35 diff --git a/scripts/enderalfunctions.pex b/scripts/enderalfunctions.pex index 289e1f896aef291cd94c54c7b72e53b518ea6bb0..89990827770bcf500abb51b4806fd5364b329ac5 100644 GIT binary patch delta 852 zcmY*XTW=Ck5dLO&Vd;eeMO#}hpwfyIYHxS}Z?qMqC7QGkM2#9G#|DGDX1n_01M%7T z(44=}SAFmo_)Gi)CjJ1QoY@6Q=VV~!JKxNiZ?b=;z9y1?TR(r91_*5G`18x7e4i^B0KJdv4pu^ z+{s#xT}L6-esvg@C7!%~t2+LkdZU=#Q95qqsIJ$HA2XY-+k;)H`0CyJm0_@|lV(nT zqi1O^m;qxQ*YVq3M|mjernRIqRx!p^`+nP3TAMAsYgHr1{qIQWFP7gBL4*WgA`=`* zlYos}a260Afm1@3U|RkRq=8e!sU%fhi=_K0jNx>Mm;$rKFmn=^!0ZsPaRzgkXW%UR zIrj7H7uYlGVsT`LwaaD%WB^f7RAnou63Qd&j?w}yHnsGy45xP!a6hx_a`ZX`A}?9bz3 zlckAG@}~Oo;Qt+1yu$%N*y0t5+1%p{sdxsVm>D3Pi#y`_{6~u*gy#RI|w8qC9)!fjMYI#(O8;H*s$;k zSVXg86>$Z&Y`8)$zy**vKvul&VPr&=YP$MW_p8@E{Wz-`?_-R`Z(A3fK!J#`V z8;483!lrCh>~$|dVr8%22{6*_dqJn?DId94?>?w*@LKIEUwK^>*6f|+X5ja{_hH#8 z$!^%PzGYwbJ%x1V?S51^v5HP_OZj2mE@eg+4}5M7UZ{_1FZ?d8bZVg+^!=STq2+9+ zQ;o)E&W_lT=$m88=bEEllDzrdXclJT)%3Be*M=&?+n&(*9)OURF>hmJv+L0Of+vUm`Ix?-b7<#j@H939GfD0n2O z*%+{+g$A|Eah?~{nZ?cO7#VUKT8#eR{q*o&Q)rU@F@YzHr;K^VGsXf#TN=+}sS%yM zPrk({7c7}>%YAddEventSink(EventListener::GetSingleton()); RE::UI::GetSingleton()->AddEventSink(EventListener::GetSingleton()); SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton()); + RE::ScriptEventSourceHolder::GetSingleton()->GetEventSource()->AddEventSink(EventListener::GetSingleton()); } auto EventListener::ProcessEvent( @@ -75,3 +76,26 @@ auto EventListener::ProcessEvent( return RE::BSEventNotifyControl::kContinue; } + +auto EventListener::ProcessEvent( + const RE::TESCombatEvent* a_event, + RE::BSTEventSource* a_eventSource) + -> RE::BSEventNotifyControl +{ + if (!a_event) { + return RE::BSEventNotifyControl::kContinue; + } + + RE::Actor* sourceActor = a_event->actor ? a_event->actor->As() : nullptr; + + if (!sourceActor) { + return RE::BSEventNotifyControl::kContinue; + } + + RE::Actor* targetActor = a_event->targetActor ? a_event->targetActor->As() : nullptr; + + SKSE::ModCallbackEvent modEvent{ "Enderal_CombatStateChanged", targetActor && targetActor->IsPlayerRef() ? "1" : "", a_event->newState.underlying(), sourceActor }; + SKSE::GetModCallbackEventSource()->SendEvent(&modEvent); + + return RE::BSEventNotifyControl::kContinue; +} diff --git a/source/Enderal DLL/src/EventListener.h b/source/Enderal DLL/src/EventListener.h index 3edd03bb..be09e7ee 100644 --- a/source/Enderal DLL/src/EventListener.h +++ b/source/Enderal DLL/src/EventListener.h @@ -9,7 +9,8 @@ class EventListener : public RE::BSTEventSink, public RE::BSTEventSink, public RE::BSTEventSink, - public RE::BSTEventSink + public RE::BSTEventSink, + public RE::BSTEventSink { public: ~EventListener() = default; @@ -26,7 +27,6 @@ public: RE::BSTEventSource* a_eventSource) -> RE::BSEventNotifyControl override; - auto ProcessEvent( const RE::MenuOpenCloseEvent* a_event, RE::BSTEventSource* a_eventSource) @@ -42,6 +42,11 @@ public: RE::BSTEventSource* a_eventSource) -> RE::BSEventNotifyControl override; + auto ProcessEvent( + const RE::TESCombatEvent* a_event, + RE::BSTEventSource* a_eventSource) + -> RE::BSEventNotifyControl override; + private: EventListener() = default; }; \ No newline at end of file diff --git a/source/Enderal DLL/src/PapyrusFunctions.h b/source/Enderal DLL/src/PapyrusFunctions.h index 5797a4d5..c769242c 100644 --- a/source/Enderal DLL/src/PapyrusFunctions.h +++ b/source/Enderal DLL/src/PapyrusFunctions.h @@ -103,6 +103,25 @@ namespace Papyrus::PapyrusFunctions return ComputeNeededExpPoints(CurrentLevel, Slope, Mult, fExpAcc, fExpAcc_Level20, fExpAcc_Level30, fExpAcc_Level40); } + bool IsInRegion(RE::StaticFunctionTag*, RE::TESForm* playerRegion) + { + auto* parentCell = RE::PlayerCharacter::GetSingleton()->parentCell; + + if (!parentCell) { + return false; + } + + auto regions = parentCell->GetRegionList(false); + + for (auto it = regions->begin(); it != regions->end(); it++) { + if ((*it)->formID == playerRegion->formID) { + return true; + } + } + + return false; + } + inline void Bind(VM& a_vm) { BIND(CreatePotion); @@ -123,5 +142,7 @@ namespace Papyrus::PapyrusFunctions logger::info("{}", "Registered EnableDialogueQuitting"sv); BIND(ComputeNeededExp); logger::info("{}", "Registered ComputeNeededExp"sv); + BIND(IsInRegion); + logger::info("{}", "Registered IsInRegion"sv); } } diff --git a/source/scripts/_00E_CombatMusicControl.psc b/source/scripts/_00E_CombatMusicControl.psc index 7972993d..dff46ca3 100644 --- a/source/scripts/_00E_CombatMusicControl.psc +++ b/source/scripts/_00E_CombatMusicControl.psc @@ -17,6 +17,8 @@ Event OnInit() EndEvent Function InitCombatMusic() + RegisterForModEvent("Enderal_CombatStateChanged", "OnCombatStateChange") + If ActiveCombatMusics.Length == 0 ActiveCombatMusics = _NewMusicArray() EndIf @@ -30,6 +32,41 @@ Function InitCombatMusic() EndIf EndFunction +Event OnCombatStateChange(string eventName, string bTargetIsPlayer, float fCombatState, Form sender) + if bTargetIsPlayer ; start combat or searching + if fCombatState as int == 1 ; combat + ; start music + Actor sourceActor = sender as Actor + Int encounterLevel = sourceActor.GetLevel() + + If encounterLevel >= 20 || (encounterLevel >= PlayerLevel.GetValue() - 15) || HasKeyword(ActorTypeBoss) + MusicType combatMusic + if _00E_ActorsCombatMusicEpic.HasForm(sourceActor.GetActorBase()) + combatMusic = _00E_Music_Combat_Epic + elseif EnderalFunctions.IsInRegion(Wueste) + combatMusic = _00E_Music_Combat_Exotic + else + combatMusic = _00E_Music_Combat_Regular + endif + + if StartCombatMusic(combatMusic) + RegisterForSingleUpdate(5.0) + EndIf + EndIf + elseif ! PlayerRef.IsInCombat() + if GetState() == "" + GoToState("CombatMusicTracking") + endif + RegisterForSingleUpdate(2.0) + endif + elseif ! PlayerRef.IsInCombat() + if GetState() == "" + GoToState("CombatMusicTracking") + endif + RegisterForSingleUpdate(2.0) + endif +endEvent + Bool Function StartCombatMusic(MusicType newMusic) ; Debug.Trace(self + ", StartCombatMusic, newMusic = " + newMusic) @@ -95,11 +132,9 @@ State CombatMusicTracking Event OnUpdate() - ; Debug.Trace("_00E_PlayerFunctions, OnUpdate") - RegisterForSingleUpdate(3.5) - If (Game.GetForm(0x14) as Actor).IsInCombat() || CombatMusicLockLevel > COMBAT_MUSIC_LOCK_NONE + If CombatMusicLockLevel > COMBAT_MUSIC_LOCK_NONE || PlayerRef.IsInCombat() Return EndIf @@ -170,4 +205,17 @@ Function RemoveCombatSoundtracks() EndFunction +Keyword Property ActorTypeBoss Auto + +GlobalVariable Property PlayerLevel Auto + +MusicType Property _00E_Music_Combat_Regular Auto +MusicType Property _00E_Music_Combat_Exotic Auto +MusicType Property _00E_Music_Combat_Epic Auto + FormList Property _00E_MUS_AllCombatSoundtracks Auto +FormList Property _00E_ActorsCombatMusicEpic Auto + +Form Property Wueste Auto ; Powder Desert + +Actor Property PlayerRef Auto diff --git a/source/scripts/_00e_combatsoundtrackscript.psc b/source/scripts/_00e_combatsoundtrackscript.psc deleted file mode 100644 index 4842a383..00000000 --- a/source/scripts/_00e_combatsoundtrackscript.psc +++ /dev/null @@ -1,38 +0,0 @@ -Scriptname _00E_CombatSoundtrackScript extends Actor - -Event OnUpdate() - Actor player = Game.GetForm(0x14) as Actor - If player.IsInCombat() - RegisterForSingleUpdate(2.0) - ElseIf Triggered - Triggered = False - _00E_PlayerFunctions.GetCombatMusicControl().StopCombatMusic() - EndIf -EndEvent - -Event OnCombatStateChanged(Actor akTarget, int aeCombatState) - If !_00E_Music_Combat_Regular - Debug.Trace(self + ": _00E_Music_Combat_Regular property is empty") - Return - EndIf - - If aeCombatState == 1 - Actor player = Game.GetForm(0x14) as Actor - If akTarget == player - Int encounterLevel = GetLevel() - If encounterLevel >= 20 || (encounterLevel >= (PlayerLevel.GetValue() - 15)) || HasKeyword(ActorTypeBoss) ; Frage ab ob Gegnerstufe über Spielerstufe oder Boss ist, wenn ja spiele Combatmusic - If Triggered == False ; player.IsInCombat() && - Triggered = _00E_PlayerFunctions.GetCombatMusicControl().StartCombatMusic(_00E_Music_Combat_Regular) - If Triggered - RegisterForSingleUpdate(5.0) - EndIf - EndIf - EndIf - EndIf - EndIf -EndEvent - -MusicType Property _00E_Music_Combat_Regular Auto -GlobalVariable Property PlayerLevel Auto -Keyword Property ActorTypeBoss Auto -Bool Triggered = False diff --git a/source/scripts/enderalfunctions.psc b/source/scripts/enderalfunctions.psc index e10a564c..f1ba4c5e 100644 --- a/source/scripts/enderalfunctions.psc +++ b/source/scripts/enderalfunctions.psc @@ -12,25 +12,26 @@ Actor[] function GetPlayerFollowers() native global ; Gets the player hash used to uniquely identify the player's save profile. ; RETURN - Returns the player hash as an 8-digit string. -String Function GetPlayerHash() Global Native +String Function GetPlayerHash() native global ; Converts the given string to it's hexadecimal equivalent. Preserves case. ; a_string - The string to convert to hexadecimal. ; RETURN - Returns the hexadecimal equivalent of the passed string. -String Function StringToHex(String a_string) Global Native +String Function StringToHex(String a_string) native global -float function ComputeNeededExp(int CurrentLevel, float Slope, float Mult, float fExpAcc = 1.0, float fExpAcc_Level20 = 1.2, float fExpAcc_Level30 = 1.5, float fExpAcc_Level40 = 2.0) global native +float function ComputeNeededExp(int CurrentLevel, float Slope, float Mult, float fExpAcc = 1.0, float fExpAcc_Level20 = 1.2, float fExpAcc_Level30 = 1.5, float fExpAcc_Level40 = 2.0) native global ; Disables the TAB Key during dialogue. Resets automatically upon dialogue exit via Goodbye. -Function DisableDialogueQuitting() Global Native -Function EnableDialogueQuitting() Global Native +Function DisableDialogueQuitting() native global +Function EnableDialogueQuitting() native global + +bool function IsInRegion(Form region) native global bool function IsDLLLoaded() global - int iVer = SKSE.GetPluginVersion("EnderalSE") - return iVer > 0 + return SKSE.GetPluginVersion("EnderalSE") > 0 endfunction -String Function GetPlayerClassNameGlobal() Global +String Function GetPlayerClassNameGlobal() global {Called by EnderalSE.dll} Quest AffinityQuest = Game.GetFormFromFile(0x1597B, "Enderal - Forgotten Stories.esm") as Quest return (AffinityQuest.GetAlias(0) as _00E_AffinityControl).GetPlayerClassName()