From 1beee1c6e1454040b774c9e15cf3c205dfb1cc64 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Mon, 22 Jan 2024 16:00:04 +0100 Subject: [PATCH] Remade the Blueprint Collection item to MISC, added automatically with the first found blueprint, added an option to store single unique copies automatically --- Blueprint control.esp | Bin 0 -> 19297 bytes scripts/_00E_BlueprintCollectionItem.pex | Bin 0 -> 2862 bytes scripts/_00E_BlueprintControlAlias.pex | Bin 0 -> 1107 bytes scripts/_00e_nq24_leveledlistcheck.pex | Bin 3500 -> 2888 bytes scripts/enderalfunctions.pex | Bin 1933 -> 2048 bytes source/Enderal DLL/src/PapyrusFunctions.h | 29 ++++++ source/Enderal DLL/src/Util.h | 34 ++++++- .../scripts/_00E_BlueprintCollectionItem.psc | 85 ++++++++++++++++++ source/scripts/_00E_BlueprintControlAlias.psc | 19 ++++ source/scripts/_00e_nq24_leveledlistcheck.psc | 23 ++--- source/scripts/enderalfunctions.psc | 2 + 11 files changed, 180 insertions(+), 12 deletions(-) create mode 100644 Blueprint control.esp create mode 100644 scripts/_00E_BlueprintCollectionItem.pex create mode 100644 scripts/_00E_BlueprintControlAlias.pex create mode 100644 source/scripts/_00E_BlueprintCollectionItem.psc create mode 100644 source/scripts/_00E_BlueprintControlAlias.psc diff --git a/Blueprint control.esp b/Blueprint control.esp new file mode 100644 index 0000000000000000000000000000000000000000..a086381494bfe9027a496389886ae88216511d6b GIT binary patch literal 19297 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 z z-koxCUWRwq&eCzWC!$7GTkI#Za+qMy+V~8CRQ*_ZdB+(Eqr0q literal 0 HcmV?d00001 diff --git a/scripts/_00E_BlueprintControlAlias.pex b/scripts/_00E_BlueprintControlAlias.pex new file mode 100644 index 0000000000000000000000000000000000000000..510a9c0085ecadc3b22bc1dcdc8f79d1bbf405fa GIT binary patch literal 1107 zcmah{TTj$L6#i!K+l5_0P+1j<%SDYLh)?!y7XgV0CXmP@8Qa-q+%mIir)+%m5BVGX zCH@efJTvWrm>Ap6<$UM%ozwH{{KwC72@Ldz@89;Yda=8Ea50E8F-fE{`&yYq$NgCH zbZ3%=@D8F#XGxmHKH6e--KXCnA(XDWW1$Ly2k8$RM!6K2e#TRtG97GNd9N zVos}p7)h059v=^QDr{#^In>D&T3lLbUuVjod`w%1kBiRbeZ~SGpV99Qg&hPgl}JEk zkke!r-jz(loahXEjmkjlcqZ=6E^pwy=jn%{%guNCL{pj6yg3?)o4<-ipBi~>2c)_m z3!coz@)gQ7J`5#0ruJe*dMc;_ZQAa>HPp~RlU|QpYCxUk6V672+n|hGOHS|Nv@qvR z!sf}xrLB{?O?V-+D5oV*LI?M9W4p61!vd)maX$wcmdJu(nV|ARh6fC^FFV5XWJ`LI zAN_$66-EUt=9z3!E9l}ep5Q5QS*2CQ8hotd8G5vA=7|%SnguUS&&2dmKG~vi;!)HY&iNPK4)ka5lajkRa@JO JTPI)(_zf+M>^=Yh literal 0 HcmV?d00001 diff --git a/scripts/_00e_nq24_leveledlistcheck.pex b/scripts/_00e_nq24_leveledlistcheck.pex index 62a90a70d448ef742636461d703b17dc6610476c..fc2433b39a5eda283a7e8ebbc22b634b0d5dc400 100644 GIT binary patch literal 2888 zcma)7TUXmg5dH+_VmsKlggXJ{p57=BLO@NMaxs*15=fz?4}EZjwHVd%t|Q5C_)+~2 z{U1H2f1+=B>g=x8md)iKsmDS2S zcEJMXz4N1Z`|utiS%rTj>p)uvWL=fk6kvFd z#mBK5Gi3KfEHqm<#$uwl=Qdd7 zL*QPqP$tVN&NHNs?B!&l3IKCjKam5(9}gpR~v)l$h&5Bas|la^@+Qg<2p^ z-GHoo_cUObOlKHvxxCIa?%^{LHe}Dyg+ilF0qD4Xn0A#aRto5?1?UvCs{l{$D!_rD z1XNN*$I-Zs%DYN1;8y8m;89O0Qum3O?SVep6sY#5_>#2Vs)k(lX?5~*)%xCFAs_II$+omh0~%b6@Q^CMeN89Nqg zN=8jq_0N3fC8-W`cBymC30~%2l6S;{Gu#t=i`9ItWabm{FZyZJTj-OY6v@b?Vlu!Q z1{DoK(lAk0Q4W&wxTmNHNuxw1MV~>^815^2gl>9_$9SUXDI`6^^Mv{^U{N^zb<6y& zB5Ei_ikeffR8Yl@7)gPGt7p_OB?_+|i9tQ%n9$6mkxUu$X=62GtY$H%l^+<%ys;`` zfz(y)hA3Z~6q3aZ9+FwIn5CTCYSWbPgxMLV%-c2(DE;=LM3u-HwJepSy_muail4Y1 z!{;5>1$@!jna7tMn-P3Py-95H_`0JuNmAM6J}lxJou_;6)e28Fk7^+O8T^zAWoj3)kzEAS)litI#8ssZg|pJm%>4^ zb}WpN()Sih7T!o{KMCc(rCwTPN~??~Di*2Sm)pbFqiiHmEQ+!rbp}Z1ZO1)29)GZK z&7-9~&KsV{EGGA-yd9^8>>_U=s6xJMuPOw&^evIuiAh*^Y&Bf)yiltZAR5yD8~^AFEf| literal 3500 zcma)8*;X4z5WQo>DkCr$gINdTHBJb|b{s2Wvv80qHsxz1*t0wM@7F{q^sEdTzi04ff|>?=fFpSt(U_e_nl2-DaOy z$o%afPBxBNt+CvUYZxl|zGy{pD|As{cD{TXa2M||P1>x=KazH+wL{XbNo{g4P+`eI z;w21&6_E%%E$s1MqM%-9QHdukLf>)V`-~%B6WkAyKyWX_$ll@atd{JvBNj1UWB9Ga z<5t9CH#zna`eE*|XvG1qyS}KkP8d&O*Nfd#7KZY#1RRDf){Fw4xN#yPuTDEcG+ZxY zuHfOB8;j7V85w_AEOyPpTXMm6yr{vF>L)Kk-ozLr?4(`kUFe;$D1+ZS<;+(~g?cCs zy^!<+?=WPzXPlJ}DC;Y)vRU60B2qdd#iF*jUn;AOUav+mV7OScYLZXy#}& zW<0qLn`USsg{q8vVB8nct~l^QrY!b1*x9Lwd`UnbZczo^MWV@~`r;}QyX%wr}*y1H|W_ocl3yIe~ z-Y^9oI1UA>)G9JkVQlhmwAx4L51QtS3P<4)V@dCy?U?ss;I{E}2J zn9G@R&>fTww`((9R@(D;tG2_lHO!dOWzb}DyMi;kF1L71-qQLej!y%5-OC#{h+Tb8 zxQS2~aNK0I;3!}|UBL1Y7~t$wzX5#*30=%}3>J&h=m)yXh6FEhUmxdU79OF$Sk%j# zg0HiB!1XHcHP#dXdK@H%Zi42DojgO1vKQLrDtfkfVpq@YLi$l z_m5HZ&;#kTaPZu-zBGsA3GO;o`i}*4< zna4`1GmK{xj)Bc#HC;^NIVH@TOyEU&vVfOq2($PqJ;@VZ_EryG;cJ}|2d`12&2MO{ zXVSs94!)z6>c3$J-_tqmzRBz&M^NQgHtG+mDc9(C9UIuBW-Zg-3jKSFEoHS-aIof} zFydgH@U*x?GwEQ1EdS^r?_g8;BShKG2~(DveWd-?!8k#GaxiG9_0Xm~b<~fBxEiu( zAPzxp%j1DgFBRj(Aukn)=_Sl|Y96V@9S0p29c^*JawXo@BCJKjdsdU0xq|n!hIDu_ zyt7_xb|i0=9mCt2H@v0AD|plCwfUaVq{gn`J%2UttQVV|i}|+Z4R2}j3f^-W-qxbj zqO<&@F2ie%w diff --git a/scripts/enderalfunctions.pex b/scripts/enderalfunctions.pex index 89990827770bcf500abb51b4806fd5364b329ac5..8c4ef08adefee6f71568275cf5efecfea1925031 100644 GIT binary patch delta 932 zcmZ8f$x;+S5PjJ_3nSY&s0g^@fQW#yDz0p!?1+X!s9}s_NsMB5MAL&o7zTRsAy!jhOc=Bb6!WF@ekVO3%R7_5 zT3hD*O*0*umm7Ee3BTlp<6E<4>y;lojYef98gWXzvMb89C+zErCw-#lcA8iZ1XOJ8#gnsbg5$YyN0ly08%%)k7zRJv0YQrxD z1;cVkh52C3Xl2A-Xk#QR6ChEvBOx~K`|C&qX07OZsL4Oxu$?}-!_jxQKl<$UMXRx) z$cf#ntulOvO!O)CW?Kmh(twMTc4@dDNTS28PL!9z8BJEFNsWU8z(HZC!9!a0DzUX0 z#Bs=?tR6=*4x|&x`8R( zf-W8nSg*&Tt-{)M7~DHe4TkmtwYwye80PRJ1TIo9QAeqlsoPh$sWk4gi{UCMU!z{f z4UF+XB}F<)lvi1n28>q$!34>x?Ay%}OfpcZ|9{qW^;7cKhn!-M95I(ybyILlFr{6@ z!E{EDtArr&9JAXoqgBfy1ZVkY3}UVdscj-K|1aPYSSSO6MLXpZp$?aq+a$OxShB?U M8na9w%Fch$Kgoq}`2YX_ delta 828 zcmZ8fTTc^F5dLO&+kyhUh$4uvDAaOOgcdJ&<5mTUCK@HgsHx3?)YRQ%T{VW7s_#CK z{R=)C-+cF9_~wJJ{s0r7_|DmqTIXakGvCaaGvDmK&wNT}{%(H%XC5<9`tGymsv6!?+ltjy6&0-?&XVufqi^PX*DSGZX!` zXQPkK0}I7y$eHY|ys5l(w*&u0bI8V5WTRisyM~QnbHMR4KnkPgj3GW6&T3xT$!TNZ z2+%7rTWf(eG28FF}P&#m|9XO0W12kBY!g2ItfXE5zAoV15h&oKw(hax$ z`k~eXf)NHP-De}pup6u@umzqAncvSTs)0_oS%UdON4B`H7~dzDC*jV zSh$!Il$tSkw}b>P9WY7YG8S+JS8)y3af7EnxG<{<%E@!m`2SsUm6<1+{Ridm KGetInventory([&](RE::TESBoundObject& a_exform) { + auto miscItem = a_exform.As(); + return miscItem && miscItem->HasKeyword(a_keyword); + }); + + uint32_t iResult = 0; + for (const auto& item : inv) { + if (item.second.first > 0) { + int32_t iMoveCount = a_count - GetItemCount(a_targetRef, item.first); + if (iMoveCount > 0) { + a_sourceRef->RemoveItem(item.first, iMoveCount, RE::ITEM_REMOVE_REASON::kStoreInContainer, nullptr, a_targetRef); + iResult += iMoveCount; + } + } + } + + auto inventory_menu = RE::UI::GetSingleton()->GetMenu(); + + if (inventory_menu) { + inventory_menu->GetRuntimeData().itemList->Update(); + } + + return iResult; + } + inline void Bind(VM& a_vm) { BIND(CreatePotion); @@ -150,5 +177,7 @@ namespace Papyrus::PapyrusFunctions logger::info("{}", "Registered ComputeNeededExp"sv); BIND(IsInRegion); logger::info("{}", "Registered IsInRegion"sv); + BIND(MoveItemsToCountByKeyword); + logger::info("{}", "Registered MoveItemsToCountByKeyword"sv); } } diff --git a/source/Enderal DLL/src/Util.h b/source/Enderal DLL/src/Util.h index 8d526efd..353ccb19 100644 --- a/source/Enderal DLL/src/Util.h +++ b/source/Enderal DLL/src/Util.h @@ -192,4 +192,36 @@ inline float ComputeNeededExpPoints(std::uint32_t CurrentLevel, float Slope, flo result += (pow(40, Slope) - pow(30, Slope)) * Mult * fExpAcc_Level30; result += (pow(CurrentLevel, Slope) - pow(40, Slope)) * Mult * fExpAcc_Level40; return result; -} \ No newline at end of file +} + +inline std::uint32_t GetItemCount(RE::TESObjectREFR* a_container, RE::TESForm* a_form) +{ + std::int32_t iResult = 0; + + auto invChanges = a_container->GetInventoryChanges(); + if (invChanges && invChanges->entryList) { + for (auto& entry : *invChanges->entryList) { + if (entry && entry->object == a_form) { + if (entry->IsLeveled()) { + return entry->countDelta > 0 ? entry->countDelta : 0; + } else { + iResult = entry->countDelta; + break; + } + } + } + } + + auto container = a_container->GetContainer(); + if (container) { + container->ForEachContainerObject([&](RE::ContainerObject& a_entry) { + if (a_entry.obj == a_form) { + iResult += a_entry.count; + return RE::BSContainer::ForEachResult::kStop; + } + return RE::BSContainer::ForEachResult::kContinue; + }); + } + + return iResult > 0 ? iResult : 0; +} diff --git a/source/scripts/_00E_BlueprintCollectionItem.psc b/source/scripts/_00E_BlueprintCollectionItem.psc new file mode 100644 index 00000000..31d2a871 --- /dev/null +++ b/source/scripts/_00E_BlueprintCollectionItem.psc @@ -0,0 +1,85 @@ +Scriptname _00E_BlueprintCollectionItem extends ObjectReference Hidden + +Event OnEquipped(Actor akActor) + + If akActor != PlayerREF || ! (GetBaseObject() as MiscObject) + return + endif + + bInventoryMenu = SKSE.GetVersion() > 0 && UI.IsMenuOpen("InventoryMenu") + _00E_FS_BlueprintContainerActorREF.SetPlayerTeammate(True, True) + + Int iButton = _00E_FS_Blueprint_Message_SE.Show() + If iButton == 0 + AddBlueprints() + ElseIf iButton == 1 + StoreSingleCopy() + ElseIf iButton == 2 + TakeBlueprints() + EndIf + +EndEvent + +Function AddBlueprints() + if bInventoryMenu + ; The DisablePlayerControls method does not remember last inventory tab to return where we were + Input.TapKey(Input.GetMappedKey("Tween Menu")) + endif + Game.DisablePlayerControls(abMenu = true) + Game.EnablePlayerControls(abMenu = true) + Utility.Wait(0.05) + _00E_FS_BlueprintContainerActorREF.ShowGiftMenu(True, _00E_FS_BlueprintList, True, False) + if bInventoryMenu + Utility.wait(0.2) + Input.TapKey(Input.GetMappedKey("Quick Inventory")) + endif +EndFunction + +function StoreSingleCopy() +;/ Too slow + int iItemsToStore = PlayerREF.GetItemCount(Blueprint) - _00E_FS_BlueprintContainerActorREF.GetItemCount(Blueprint) + bool bStoreSilently = iItemsToStore > 3 + Int iFormIndex = PlayerREF.GetNumItems() + While iFormIndex > 0 + iFormIndex -= 1 + Form kForm = PlayerREF.GetNthForm(iFormIndex) + If kForm as MiscObject && kForm.HasKeyword(Blueprint) && _00E_FS_BlueprintContainerActorREF.GetItemCount(kForm) == 0 + PlayerREF.RemoveItem(kForm, 1, bStoreSilently, _00E_FS_BlueprintContainerActorREF) + EndIf + EndWhile + if bStoreSilently + _00E_FS_BlueprintItemsStored.Show(iItemsToStore) + endif +/; + ITMBookClose.Play(PlayerREF) + _00E_FS_BlueprintItemsStored.Show(EnderalFunctions.MoveItemsToCountByKeyword(PlayerREF, _00E_FS_BlueprintContainerActorREF, Blueprint, 1)) +endfunction + +Function TakeBlueprints() + if bInventoryMenu + ; The DisablePlayerControls method does not remember last inventory tab to return where we were + Input.TapKey(Input.GetMappedKey("Tween Menu")) + endif + Game.DisablePlayerControls(abMenu = true) + Game.EnablePlayerControls(abMenu = true) + Utility.Wait(0.05) + _00E_FS_BlueprintContainerActorREF.ShowGiftMenu(False, _00E_FS_BlueprintList, True, False) + if bInventoryMenu + Utility.wait(0.2) + Input.TapKey(Input.GetMappedKey("Quick Inventory")) + endif +EndFunction + +bool bInventoryMenu + +Actor Property PlayerRef Auto +Actor Property _00E_FS_BlueprintContainerActorREF Auto + +Message Property _00E_FS_Blueprint_Message_SE Auto +Message Property _00E_FS_BlueprintItemsStored Auto + +FormList Property _00E_FS_BlueprintList Auto + +Keyword Property Blueprint Auto + +Sound Property ITMBookClose Auto diff --git a/source/scripts/_00E_BlueprintControlAlias.psc b/source/scripts/_00E_BlueprintControlAlias.psc new file mode 100644 index 00000000..58881422 --- /dev/null +++ b/source/scripts/_00E_BlueprintControlAlias.psc @@ -0,0 +1,19 @@ +Scriptname _00E_BlueprintControlAlias extends ReferenceAlias Hidden + +auto state Waiting + Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) + if ! (akBaseItem as MiscObject) || ! akBaseItem.HasKeyword(Blueprint) + return + endif + GotoState("DoNothing") + _00E_BlueprintCollectionItemRef.Activate(GetReference()) + Clear() + EndEvent +endstate + +state DoNothing +endstate + +Keyword Property Blueprint Auto + +ObjectReference Property _00E_BlueprintCollectionItemRef Auto diff --git a/source/scripts/_00e_nq24_leveledlistcheck.psc b/source/scripts/_00e_nq24_leveledlistcheck.psc index dfd969d5..cc8de016 100644 --- a/source/scripts/_00e_nq24_leveledlistcheck.psc +++ b/source/scripts/_00e_nq24_leveledlistcheck.psc @@ -21,13 +21,14 @@ Event OnTriggerEnter (ObjectReference akActionRef) EndIf ;not NQ24 related but still needs to be handled the same way, did not want to create a new script - If _00E_FS_BlueprintContainerBookOwned.GetValueInt() == 0 - _00E_FS_LeveledListBlueprintContainer.AddForm(_00E_FS_BlueprintContainerBook, 1, 1) - VendorItemsBanker.AddForm(VendorItemFSBlueprintContainer) - ElseIf _00E_FS_BlueprintContainerBookOwned.GetValueInt() == 1 - _00E_FS_LeveledListBlueprintContainer.Revert() - VendorItemsBanker.RemoveAddedForm(VendorItemFSBlueprintContainer) - EndIf + ;2.1: Replaced with a misc item + ;If _00E_FS_BlueprintContainerBookOwned.GetValueInt() == 0 + ; _00E_FS_LeveledListBlueprintContainer.AddForm(_00E_FS_BlueprintContainerBook, 1, 1) + ; VendorItemsBanker.AddForm(VendorItemFSBlueprintContainer) + ;ElseIf _00E_FS_BlueprintContainerBookOwned.GetValueInt() == 1 + ; _00E_FS_LeveledListBlueprintContainer.Revert() + ; VendorItemsBanker.RemoveAddedForm(VendorItemFSBlueprintContainer) + ;EndIf ;just for FS_NQ07 If _00E_FS_NQ07_DoorOwned.GetValueInt() == 0 && FS_NQ07.GetCurrentStageID() >= 115 @@ -47,22 +48,22 @@ Quest Property FS_NQ07 Auto GlobalVariable Property _00E_NQ24_PlayerHouseMarketOwned Auto GlobalVariable Property _00E_NQ24_PlayerHouseNobleOwned Auto -GlobalVariable Property _00E_FS_BlueprintContainerBookOwned Auto +;GlobalVariable Property _00E_FS_BlueprintContainerBookOwned Auto GlobalVariable Property _00E_FS_NQ07_DoorOwned Auto FormList Property VendorItemsBanker Auto LeveledItem Property _00E_NQ24_LeveledListHouseMarket Auto LeveledItem Property _00E_NQ24_LeveledListHouseNoble Auto -LeveledItem Property _00E_FS_LeveledListBlueprintContainer Auto +;LeveledItem Property _00E_FS_LeveledListBlueprintContainer Auto LeveledItem Property _00E_FS_NQ07_LeveledListDoor Auto MiscObject Property _00E_Game_Playerhouse_ArkMarket_Document Auto MiscObject Property _00E_Game_Playerhouse_UpperCity_Document Auto -Book Property _00E_FS_BlueprintContainerBook Auto +;Book Property _00E_FS_BlueprintContainerBook Auto MiscObject Property _00E_FS_NQ07_MiscDoor Auto Keyword Property VendorItemPropertyArkMarket Auto Keyword Property VendorItemPropertyArkUpperCity Auto -Keyword Property VendorItemFSBlueprintContainer Auto +;Keyword Property VendorItemFSBlueprintContainer Auto Keyword Property _00E_FS_NQ07_VendorNoSale Auto \ No newline at end of file diff --git a/source/scripts/enderalfunctions.psc b/source/scripts/enderalfunctions.psc index f1ba4c5e..301a6863 100644 --- a/source/scripts/enderalfunctions.psc +++ b/source/scripts/enderalfunctions.psc @@ -27,6 +27,8 @@ Function EnableDialogueQuitting() native global bool function IsInRegion(Form region) native global +int function MoveItemsToCountByKeyword(ObjectReference sourceRef, ObjectReference targetRef, Keyword kword, int iCount = 1) native global + bool function IsDLLLoaded() global return SKSE.GetPluginVersion("EnderalSE") > 0 endfunction