From 33ab86a11276a09030829caa3cfd2185e6ff3224 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Wed, 24 Jan 2024 18:12:06 +0100 Subject: [PATCH] Moved getting autosave name to DLL --- scripts/_00e_autosavesystem_functions.pex | Bin 2539 -> 2367 bytes scripts/enderalfunctions.pex | Bin 2048 -> 2008 bytes source/Enderal DLL/src/PapyrusFunctions.h | 53 +++++++++++------- source/Enderal DLL/src/Util.h | 25 +++++++++ .../scripts/_00e_autosavesystem_functions.psc | 18 +----- source/scripts/enderalfunctions.psc | 9 +-- 6 files changed, 60 insertions(+), 45 deletions(-) diff --git a/scripts/_00e_autosavesystem_functions.pex b/scripts/_00e_autosavesystem_functions.pex index 952fad39432cd8df7dce74daecdb88381900ff5c..75d2366474327133a7322528344afe7630374d0f 100644 GIT binary patch literal 2367 zcmbVM>sBL05Ux%pAqnA*%SBiR*o(U=%Wan>3n+vH<2fuV*0T6i zP3uxNuY*u_PV13sg^s6!|3WJDOYzrD>zVFG927ZeBT^4tHdx5!9XYix7I%Q=#v=aDqoMN=neCnnVg*(Nf% zG8v{(i4pKEw?BU)s34t>*IZ+P=lqbhB91Ka|d zc&Ge+FOn{d+-Q&PSNR*2GJ%KSq5%NfeJMEzoblM z8iI^M#vv10CTWtUv~YgV8KwJLJ|Ppb1bGN~1bL$6sV15ypgn`E_GFFL6Ul%v6$J3` z7$;PWHM}!a0(U%dp-d=wI64RSFpb0>0VZQ`j>DCm5;P%b5|-XLBY1RG{}i>FM2QTo zC2;75E;9%F0oR{Hz3cs>6>z7G0-+5-&jl^$z6mPD^}I-i1F;MEE@D9k;IL5PVqC{2 zH0{mMOAHk1=C$5oa4at;XOgnn&Lh8|GTwK2QNBN5g0?V9d8%NDUSXiN@!i3I?IuH2 zj#+#usFJYw3MqGCBGoHoz|S@uBZ79cV;l6K?SSD9@5mz@GRpPHKoJPUvKu}H4o-Tb%(0-~T?LIqsmh1iFzy*r2d*xJblmmX%7^IAU jG2$z#L9)!<*!%rPcl9=|p{i@B-l>5-hyBDDnXmr@BHD%} literal 2539 zcmbVM=~mlD6#m8*1}`iLI|+$Nlcq~TZI&#oVX=wR64E$H`_D(%1E>`eM+<~U=}Yt( z`XqgY_IH2vn;FTbC&_6~b-}vZ-22^S^w$r+{hrN0fRFt3j}6SVDwSGmD~|l8eJ-1q zVI)sm_1J4ij_-x@XJH$KTBqa3K^VJb49S$Azi_-VUSXC2WXooNkO4vy;3y5iGy{7w zYDRV>k>B%~MzaG4-rKW|Qcjq6ilE^|GB~$g6c4<8>BT#)A4=p-oK8o2D7JmC<0xqK z==(mFVT9t5iSWibmFTOxz8zu6QSlU@hS!nrk!4s|FMUsgES`N3%_R?%m- zBR@#x1z6j@@228n$}A(-i~`3yP8E+*<}va*!l6yPNs=eXzjEzM8N9C5Q{58sD=P}g zJ3D}NY!h@pJ5*O-a*c3T+8q=cVZ+<;PY+p2z7et$e#`=>ZeBR2rz-t)Bdj~eClUD_ z--`m@4Qrl#=*kZIG7{Bx(RB5V|D4mh+p3vR%^H_WJ;}=m6sxT&2Gqjtsl$0jX?TvB@uVKS zvh1jqt#o|`R6#n`fLVa*0#a_V%Pn=eWsDxB<<-t*aQWlD-^YffrJc<#rqd(u>NWz6)Fyb19OodD;b0>2g(A;m=&G0`tFssBaOn8pn0)+eZp zGUhbh!5!Swq>vEU2p(v9hCUtQ)c>X4Bv-G>gV{6j_ zw*|@q!z!jwKVw4z*Qgj2xJhnOU`}(RI_rdhX0kIF(?@8(bH&cXqx>6B-Dv(yo5%HW zV;=vA*WG{hvJBXJ0wz|04F5h6lFpwC+)tf9?e&Ggm;cG@tHeuW@O2U{?M5HvSyf;k z>wO^bP~evC4%KO+=tB3>4Zbp%=da?l@C~t61gZj4x=D$FBDpE;vcR~Dxf zCPk)NV+Ov~sTda6(28~DB)36?8|p-k?o@5kPe)M5R<&yN17xeF2;Q?vZ1ZgLh#7$$ zUau>c%fc>!)(Eto039LFJ%Q%}ySg8|IJJ}~mYPyp%-HDd1ivsQVYkNml^O}UZh{o} zVT0Nb9YnRfU~T=$`>DNIm_DWotLwt*9~7oEFM5f&x8L&9F@*0-g#!DmnA<>AmaZ>* Ou3)wu+NnLbqWv304yW}1 diff --git a/scripts/enderalfunctions.pex b/scripts/enderalfunctions.pex index 8c4ef08adefee6f71568275cf5efecfea1925031..6afc9a125fe4d2f6d498af1e1cef58dd65ef970f 100644 GIT binary patch delta 849 zcmZ8fOK;Oa5dOyNBox}l2~A&=Hk4A*C#6lwo03vmN+9JS1Qp_7!nO)(ZDh<#2pMta z68Ud%;efbsfL{S84qW>WI5E4n6~wN_GxP22?0hqRXZ_4tf9`$zB@7UF$xlmPTh;>I zYOQ>*vTM?>KKI>c_6u3JcV%nu`-E9{9f|ZE-)lPCNHv|u@)g9o<0DgT_^$WhAyTV5 zuI-2Y;=YyLc=SXz{M&L%deUjgux$J=mtA)!{45s3kF*&+6|?!YC%2ofgN}yl_;%Bg zUN~gVg?nN?d~e=0P!5O9sUG{K{kpj2xw}cBUyuubn{NYwLA}8gEFgmsy^Dypf^&+S zGV)3pI0*C*yUMAtR#xn5ox=eXGzy`Dcy*vR0SJBQ*Wf-3Akb-&u>D+03}kSK!-g0* z%reX}!ct^8!lG8^|Bs|Gn%vd_%%>Mem8o*3F@|Fp$8nS}fk{kZnva7S1~LPLS;7gz zn5x7Opv^Z1=DG>vjCB!a*y zR^x!KqypxHH72i?$=!=@5w0Q_)o7-jOZzX<6o9K&;zr!c*%(89jo!p&!&z!yYp4t5s|By)heYm+LED+e_*VmtViAh@R z&3_(?ElRK6ZoHM9YGdOiqW8Q`%UQqgR^^-CpKoeTtQAGg@ep5m{z^8zRrx}8q|=lb zsI=XNhe*?Pyhh8B9fbUMRmu7pTXr3Z@J!QlJCC2L@AOE05rwop>$+`(I&!_`Iv8v` z+c4c!OiZaEyQF@LB9+ya$g52|qNeQ!(O}?@NU9(9`g0*)4WznB4B&u|2oBRYh!Kop42N)-{Roa~GD0{OkW3DnTbnw9 zw-bD-EzImbXmTDagOfVcXb9sxU>2v5!x`jp78B@ZP+%ZDLMRf>5yk~GEiStD&cgX& zLYA=@p}gX`OEk=jM)Gn%&~ZFdv;ia?mTDOV*d}D z2;S8dEi7=43PXZ#YLQSSEa)y|p_U|6`YBj=h1nV0(nWnE2AB9(DC2ej={?239rHH@ is9TFOQ;)R{56*NoKfz)js64tD`5Qq diff --git a/source/Enderal DLL/src/PapyrusFunctions.h b/source/Enderal DLL/src/PapyrusFunctions.h index 5213bd7a..08d96184 100644 --- a/source/Enderal DLL/src/PapyrusFunctions.h +++ b/source/Enderal DLL/src/PapyrusFunctions.h @@ -63,28 +63,41 @@ namespace Papyrus::PapyrusFunctions return result; } - // Copied from Named Quicksaves by Ryan McKenzie (MIT) - RE::BSFixedString GetPlayerHash(RE::StaticFunctionTag*) + RE::BSFixedString GetAutosaveName(RE::StaticFunctionTag*, std::int32_t a_index) { - char buf[] = "DEADBEEF"; - auto saveData = RE::BSWin32SaveDataSystemUtility::GetSingleton(); - if (saveData->profileHash == static_cast(-1)) { - std::snprintf(buf, sizeof(buf), "%08o", 0); - } else { - std::snprintf(buf, sizeof(buf), "%08X", saveData->profileHash); - } - return buf; - } - - RE::BSFixedString StringToHex(RE::StaticFunctionTag*, RE::BSFixedString a_string) - { - std::string_view str(a_string); + /* + Save Name Structure (from NQS NamedQuicksaves by Ryan McKenzie) + + Save3_0C2D58E2_0_507269736F6E6572_Tamriel_000002_20180503063315_4_1.ess + Save3: Type and index of save + 0C2D58E2: Unique hash used to identify your save profile. Regenerated on closing racemenu. + 0: Flag for modded game. + 507269736F6E6572: Character name in hex. + Tamriel: coc code. + 000002: Days, hours, minutes played. + 20180503063315: Year, month, day, hour, minute, second in GMT + 0. + 4: Player level. + 1: Unknown flag. + */ std::stringstream sstream; - for (auto ch : str) { - sstream << std::uppercase << std::hex << static_cast(ch); + sstream << "Autosave0"; + sstream << a_index; + sstream << "_"; + sstream << GetPlayerHash().c_str(); + sstream << "_0_"; + sstream << StringToHex(RE::PlayerCharacter::GetSingleton()->GetName()).c_str(); + sstream << "_"; + + RE::TESObjectCELL* parentCell = RE::PlayerCharacter::GetSingleton()->parentCell; + if (parentCell->IsInteriorCell()) { + sstream << parentCell->GetFormEditorID(); + } else { + sstream << RE::PlayerCharacter::GetSingleton()->GetWorldspace()->GetFormEditorID(); } + sstream << "_000000_00000000000000_1_1"; + return sstream.str(); } @@ -165,10 +178,8 @@ namespace Papyrus::PapyrusFunctions logger::info("{}", "Registered GetCurrentContainer"sv); BIND(GetPlayerFollowers); logger::info("{}", "Registered GetPlayerFollowers"sv); - BIND(GetPlayerHash); - logger::info("{}", "Registered GetPlayerHash"sv); - BIND(StringToHex); - logger::info("{}", "Registered StringToHex"sv); + BIND(GetAutosaveName); + logger::info("{}", "Registered GetAutosaveName"sv); BIND(DisableDialogueQuitting); logger::info("{}", "Registered DisableDialogueQuitting"sv); BIND(EnableDialogueQuitting); diff --git a/source/Enderal DLL/src/Util.h b/source/Enderal DLL/src/Util.h index 353ccb19..7f3869fb 100644 --- a/source/Enderal DLL/src/Util.h +++ b/source/Enderal DLL/src/Util.h @@ -225,3 +225,28 @@ inline std::uint32_t GetItemCount(RE::TESObjectREFR* a_container, RE::TESForm* a return iResult > 0 ? iResult : 0; } + +// Copied from Named Quicksaves by Ryan McKenzie (MIT) +inline RE::BSFixedString GetPlayerHash() +{ + char buf[] = "DEADBEEF"; + auto saveData = RE::BSWin32SaveDataSystemUtility::GetSingleton(); + if (saveData->profileHash == static_cast(-1)) { + std::snprintf(buf, sizeof(buf), "%08o", 0); + } else { + std::snprintf(buf, sizeof(buf), "%08X", saveData->profileHash); + } + return buf; +} + +inline RE::BSFixedString StringToHex(RE::BSFixedString a_string) +{ + std::string_view str(a_string); + + std::stringstream sstream; + for (auto ch : str) { + sstream << std::uppercase << std::hex << static_cast(ch); + } + + return sstream.str(); +} \ No newline at end of file diff --git a/source/scripts/_00e_autosavesystem_functions.psc b/source/scripts/_00e_autosavesystem_functions.psc index c17396bb..f0c7ab86 100644 --- a/source/scripts/_00e_autosavesystem_functions.psc +++ b/source/scripts/_00e_autosavesystem_functions.psc @@ -1,23 +1,10 @@ Scriptname _00E_AutoSaveSystem_Functions extends Quest -; Save Name Structure (from NQS NamedQuicksaves by Ryan McKenzie) - -; Save3_0C2D58E2_0_507269736F6E6572_Tamriel_000002_20180503063315_4_1.ess -; Save3: Type and index of save -; 0C2D58E2: Unique hash used to identify your save profile. Regenerated on closing racemenu. -; 0: Flag for modded game. -; 507269736F6E6572: Character name in hex. -; Tamriel: coc code. -; 000002: Days, hours, minutes played. -; 20180503063315: Year, month, day, hour, minute, second in GMT + 0. -; 4: Player level. -; 1: Unknown flag. - Event OnUpdate() Actor PlayerREF = Game.GetForm(0x14) as Actor - if PlayerREF.IsDead() + if PlayerREF.IsDead() || ! PlayerREF.GetParentCell() return endif @@ -26,8 +13,7 @@ Event OnUpdate() return endif - ; Eddoursul: Index prefixed with 0 ensures the engine does not rotate these saves out - Game.SaveGame("Autosave0" + iAutosaveIndex + "_" + EnderalFunctions.GetPlayerHash() + "_0_" + EnderalFunctions.StringToHex(PlayerREF.GetActorBase().GetName()) + "_EnderalSE_000000_00000000000000_1_1") + Game.SaveGame(EnderalFunctions.GetAutosaveName(iAutosaveIndex)) iAutosaveIndex += 1 if iAutosaveIndex >= Utility.GetIniInt("iAutoSaveCount:SaveGame") diff --git a/source/scripts/enderalfunctions.psc b/source/scripts/enderalfunctions.psc index 301a6863..2ee11fc3 100644 --- a/source/scripts/enderalfunctions.psc +++ b/source/scripts/enderalfunctions.psc @@ -10,14 +10,7 @@ int function GetNewGameCount() native global 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() 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) native global +String Function GetAutosaveName(int index) 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) native global