Jump to content

Recommended Posts

Posted

It's supposed to work with the latest Steam AE version, but my game displays an error. The other version runs smoothly, yet I encounter this issue when attempting to launch the game with this version of the mod. I'm not expert with modding, but it doesn't seem to be interference of other mods... somebody helps me?

Captura de tela 2024-11-11 190705.png

Posted
20 hours ago, The_Reader said:

It's supposed to work with the latest Steam AE version, but my game displays an error. The other version runs smoothly, yet I encounter this issue when attempting to launch the game with this version of the mod. I'm not expert with modding, but it doesn't seem to be interference of other mods... somebody helps me?

Captura de tela 2024-11-11 190705.png

Do you mean 0.6.0 runs for you, but 0.6.1 not ? And you are on Skyrim 1.6.1170 ?

Posted
2 hours ago, nopse0 said:

Do you mean 0.6.0 runs for you, but 0.6.1 not ? And you are on Skyrim 1.6.1170 ?

No, sorry, I expressed it incorrectly, I mean the original slavetats works, none of the versions of SlaveTatsNG works... and yes, I'm on skyrim 1.6.1170 
I have over 400 mods and one of them would show that message if the game version was different from 1170 but none of them have this problem. The game is working well. This message only appears when I install this mod. I installed it with MO2, together with the original to get the mcm function with this overwriting the original. I tested with this mod alone, without the original. And completely alone, without any mods and this damn message appeared.

Posted (edited)
36 minutes ago, The_Reader said:

No, sorry, I expressed it incorrectly, I mean the original slavetats works, none of the versions of SlaveTatsNG works... and yes, I'm on skyrim 1.6.1170 
I have over 400 mods and one of them would show that message if the game version was different from 1170 but none of them have this problem. The game is working well. This message only appears when I install this mod. I installed it with MO2, together with the original to get the mcm function with this overwriting the original. I tested with this mod alone, without the original. And completely alone, without any mods and this damn message appeared.

 

Strange, I am using this on 1.6.1170 and have no problems, and I think I would have heard this error more often, if something serious would be wrong with my plugin.

Maybe the DLL is damaged, can you try to redownload and reinstall it ? (I should add a MD5 checksum). Or some requirements are missing. If the original SlaveTats runs for you, you have RaceMenu and JContainers, this seems to be ok. Do you have the Skyrim Address Library?, CommonLibSSE needs that. And the Visual Studio DLL's (VC Redistributable) ? But if you have 400 mods, I think it's very improbable that something is missing.  Do you get a SlaveTatsNG.log in your home directory + "Documents\My Games\Skyrim Special Edition\SKSE" folder ? Ps: Maybe the problem is language related, are you using a non-english Skyrim version ?

 

Edited by nopse0
Posted
1 hour ago, nopse0 said:

 

Strange, I am using this on 1.6.1170 and have no problems, and I think I would have heard this error more often, if something serious would be wrong with my plugin.

Maybe the DLL is damaged, can you try to redownload and reinstall it ? (I should add a MD5 checksum). Or some requirements are missing. If the original SlaveTats runs for you, you have RaceMenu and JContainers, this seems to be ok. Do you have the Skyrim Address Library?, CommonLibSSE needs that. And the Visual Studio DLL's (VC Redistributable) ? But if you have 400 mods, I think it's very improbable that something is missing.  Do you get a SlaveTatsNG.log in your home directory + "Documents\My Games\Skyrim Special Edition\SKSE" folder ? Ps: Maybe the problem is language related, are you using a non-english Skyrim version ?

 

Yeah, I have everything haha  like you said... nothing is missing since other mods need the same requirements... I'm testing what may have gone wrong but not success... I downloaded it again and reinstalled, not worked. I thought it would be some DLL loader I installed in root folder, because I didn't test without it, but nah... I use English language, so it can't be it... I didn't get the log... It doesn't make sense... everything seems in its place... I'm very thankful for your help, I'll try to find what's going wrong 'til I'm tired haha

Posted

 

14 hours ago, The_Reader said:

Yeah, I have everything haha  like you said... nothing is missing since other mods need the same requirements... I'm testing what may have gone wrong but not success... I downloaded it again and reinstalled, not worked. I thought it would be some DLL loader I installed in root folder, because I didn't test without it, but nah... I use English language, so it can't be it... I didn't get the log... It doesn't make sense... everything seems in its place... I'm very thankful for your help, I'll try to find what's going wrong 'til I'm tired haha

im using 0.6.1 with 1170 and i have about 1k mods running,  i got no pop up errors.

just checking, do you have engine fix installed?

Posted
3 hours ago, Unknown22923 said:

 

im using 0.6.1 with 1170 and i have about 1k mods running,  i got no pop up errors.

just checking, do you have engine fix installed?

Yeah, I do... I even checked if this was the problem, but nothing changed

Posted (edited)

It's the same for me. I downloaded it last week.
I have Engine Fixes installed (both parts) and the plugin won't load.

 tried to debug it and I think it's somehow related to the VC++ runtime library, but I'm not sure. Also I'm running it in Linux, more or less successfully until today.

 

It gives an 0xC0000005 exception (ACCESS VIOLATION):

0758:Call ntdll.LdrDisableThreadCalloutsForDll(03e20000) ret=7b01a2d9
0758:Ret  ntdll.LdrDisableThreadCalloutsForDll() retval=c0000135 ret=7b01a2d9
0758:Call ntdll.RtlNtStatusToDosError(c0000135) ret=7b01a2f8
0758:Ret  ntdll.RtlNtStatusToDosError() retval=0000007e ret=7b01a2f8
0758:Ret  KERNEL32.DisableThreadLibraryCalls() retval=00000000 ret=03e7a9b5
0758:Ret  PE DLL (proc=0000000003E7A0EC,module=0000000003E20000 L"AASlaveTatsNG.dll",reason=PROCESS_ATTACH,res=0000000000000000) retval=1
0758:Ret  ntdll.LdrLoadDll() retval=00000000 ret=7b07f569
0758:Call ntdll.RtlReleasePath(004fb3b0) ret=7b07f579
0758:Ret  ntdll.RtlReleasePath() retval=00000001 ret=7b07f579
0758:Ret  KERNEL32.LoadLibraryA() retval=03e20000 ret=01711baf
0758:Call KERNEL32.GetProcAddress(03e20000,0176d030 "SKSEPlugin_Load") ret=01711bcc
0758:Ret  KERNEL32.GetProcAddress() retval=03e7f830 ret=01711bcc
0758:warn:seh:dispatch_exception backtrace: --- Exception 0xc0000005.
0758:trace:seh:dispatch_exception code=c0000005 flags=0 addr=0000000000698C34 ip=698c34
0758:trace:seh:dispatch_exception  info[0]=0000000000000000
0758:trace:seh:dispatch_exception  info[1]=0000000000000000
0758:warn:seh:dispatch_exception EXCEPTION_ACCESS_VIOLATION exception (code=c0000005) raised
0758:trace:seh:dispatch_exception  rax=0000000000000000 rbx=0000000003ee44d0 rcx=0000000003ee44d0 rdx=0000000000000000
0758:trace:seh:dispatch_exception  rsi=0000000001751480 rdi=7fffffffffffffff rbp=000000000011f7f0 rsp=000000000011f6e0
0758:trace:seh:dispatch_exception   r8=0000000000000000  r9=000000007fee3445 r10=00007f1a5fd4b600 r11=0000000000000202
0758:trace:seh:dispatch_exception  r12=0000000000000000 r13=8ad8f2fba9386823 r14=0000000003ee44d0 r15=0000000000000000
0758:trace:seh:call_vectored_handlers calling handler at 000000035906B320 code=c0000005 flags=0
0758:trace:seh:call_vectored_handlers handler at 000000035906B320 returned 0
0758:trace:seh:call_vectored_handlers calling handler at 00000002EDF1C050 code=c0000005 flags=0
0758:trace:seh:call_vectored_handlers handler at 00000002EDF1C050 returned 0
0758:warn:seh:virtual_unwind backtrace: 0000000000698C34: L"MSVCP140.dll" + 0000000000018C34.
0758:trace:seh:call_handler calling handler 00000000006CB180 (rec=000000000011F4E0, frame=000000000011F6E0 context=000000000011EA40, dispatch=000000000011E910)
0758:trace:seh:call_handler handler at 00000000006CB180 returned 1
0758:warn:seh:virtual_unwind backtrace: 0000000003E3BC6A: L"AASlaveTatsNG.dll" + 000000000001BC6A.
0758:warn:seh:virtual_unwind backtrace: 0000000003E54F5A: L"AASlaveTatsNG.dll" + 0000000000034F5A.
0758:trace:seh:call_handler calling handler 0000000003E7AD60 (rec=000000000011F4E0, frame=000000000011F780 context=000000000011EA40, dispatch=000000000011E910)
0758:Call vcruntime140_1.__CxxFrameHandler4(0011f4e0,0011f780,0011eff0,0011e910) ret=17000ef74
0758:Call KERNEL32.GetModuleHandleW(2ac817588 L"ntdll.dll") ret=2ac814084
0758:Call ntdll.RtlInitUnicodeString(0011e480,2ac817588 L"ntdll.dll") ret=7b02d422




I'm glad I'm not alone. Habitually these errors are my fault because I don't have some requirements installed, but in this case VC2015 runtime is installed and used as native.

Also, I'm running this in a Ryzen 9. Oh, and not Slavetats.log present afterwards.
 

Edited by metoo
Posted
1 hour ago, metoo said:

It's the same for me. I downloaded it last week.
I have Engine Fixes installed (both parts) and the plugin won't load.

 tried to debug it and I think it's somehow related to the VC++ runtime library, but I'm not sure. Also I'm running it in Linux, more or less successfully until today.

 

It gives an 0xC0000005 exception (ACCESS VIOLATION):

0758:Call ntdll.LdrDisableThreadCalloutsForDll(03e20000) ret=7b01a2d9
0758:Ret  ntdll.LdrDisableThreadCalloutsForDll() retval=c0000135 ret=7b01a2d9
0758:Call ntdll.RtlNtStatusToDosError(c0000135) ret=7b01a2f8
0758:Ret  ntdll.RtlNtStatusToDosError() retval=0000007e ret=7b01a2f8
0758:Ret  KERNEL32.DisableThreadLibraryCalls() retval=00000000 ret=03e7a9b5
0758:Ret  PE DLL (proc=0000000003E7A0EC,module=0000000003E20000 L"AASlaveTatsNG.dll",reason=PROCESS_ATTACH,res=0000000000000000) retval=1
0758:Ret  ntdll.LdrLoadDll() retval=00000000 ret=7b07f569
0758:Call ntdll.RtlReleasePath(004fb3b0) ret=7b07f579
0758:Ret  ntdll.RtlReleasePath() retval=00000001 ret=7b07f579
0758:Ret  KERNEL32.LoadLibraryA() retval=03e20000 ret=01711baf
0758:Call KERNEL32.GetProcAddress(03e20000,0176d030 "SKSEPlugin_Load") ret=01711bcc
0758:Ret  KERNEL32.GetProcAddress() retval=03e7f830 ret=01711bcc
0758:warn:seh:dispatch_exception backtrace: --- Exception 0xc0000005.
0758:trace:seh:dispatch_exception code=c0000005 flags=0 addr=0000000000698C34 ip=698c34
0758:trace:seh:dispatch_exception  info[0]=0000000000000000
0758:trace:seh:dispatch_exception  info[1]=0000000000000000
0758:warn:seh:dispatch_exception EXCEPTION_ACCESS_VIOLATION exception (code=c0000005) raised
0758:trace:seh:dispatch_exception  rax=0000000000000000 rbx=0000000003ee44d0 rcx=0000000003ee44d0 rdx=0000000000000000
0758:trace:seh:dispatch_exception  rsi=0000000001751480 rdi=7fffffffffffffff rbp=000000000011f7f0 rsp=000000000011f6e0
0758:trace:seh:dispatch_exception   r8=0000000000000000  r9=000000007fee3445 r10=00007f1a5fd4b600 r11=0000000000000202
0758:trace:seh:dispatch_exception  r12=0000000000000000 r13=8ad8f2fba9386823 r14=0000000003ee44d0 r15=0000000000000000
0758:trace:seh:call_vectored_handlers calling handler at 000000035906B320 code=c0000005 flags=0
0758:trace:seh:call_vectored_handlers handler at 000000035906B320 returned 0
0758:trace:seh:call_vectored_handlers calling handler at 00000002EDF1C050 code=c0000005 flags=0
0758:trace:seh:call_vectored_handlers handler at 00000002EDF1C050 returned 0
0758:warn:seh:virtual_unwind backtrace: 0000000000698C34: L"MSVCP140.dll" + 0000000000018C34.
0758:trace:seh:call_handler calling handler 00000000006CB180 (rec=000000000011F4E0, frame=000000000011F6E0 context=000000000011EA40, dispatch=000000000011E910)
0758:trace:seh:call_handler handler at 00000000006CB180 returned 1
0758:warn:seh:virtual_unwind backtrace: 0000000003E3BC6A: L"AASlaveTatsNG.dll" + 000000000001BC6A.
0758:warn:seh:virtual_unwind backtrace: 0000000003E54F5A: L"AASlaveTatsNG.dll" + 0000000000034F5A.
0758:trace:seh:call_handler calling handler 0000000003E7AD60 (rec=000000000011F4E0, frame=000000000011F780 context=000000000011EA40, dispatch=000000000011E910)
0758:Call vcruntime140_1.__CxxFrameHandler4(0011f4e0,0011f780,0011eff0,0011e910) ret=17000ef74
0758:Call KERNEL32.GetModuleHandleW(2ac817588 L"ntdll.dll") ret=2ac814084
0758:Call ntdll.RtlInitUnicodeString(0011e480,2ac817588 L"ntdll.dll") ret=7b02d422




I'm glad I'm not alone. Habitually these errors are my fault because I don't have some requirements installed, but in this case VC2015 runtime is installed and used as native.

Also, I'm running this in a Ryzen 9. Oh, and not Slavetats.log present afterwards.
 

 

Do you have apart from SlaveTatsNG.dll also a "AASlaveTatsNG.dll" in your skse/plugins folder (this name appears in the stacktrace) ? Or did you rename "SlaveTatsNG.dll" to "AASlaveTatsNG.dll" to see what happens, if it is loaded as the first skse plugin ? If you have both, delete the "AA" one.

 

Otherwise, it seems the dependencies of the dll don't have changed, still vcruntime1.40, so the Vc redistributable 2015 should be Ok (though it can do no harm to update to the latest one, they are downwards compatible)

Spoiler

C:\Build\SlaveTatsNG\build\Release>dumpbin /dependents SlaveTatsNG.dll
Microsoft (R) COFF/PE Dumper Version 14.41.34120.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file SlaveTatsNG.dll

File Type: DLL

  Image has the following dependencies:

    KERNEL32.dll
    MSVCP140.dll
    MSVCP140_ATOMIC_WAIT.dll
    VCRUNTIME140_1.dll
    VCRUNTIME140.dll
    api-ms-win-crt-heap-l1-1-0.dll
    api-ms-win-crt-runtime-l1-1-0.dll
    api-ms-win-crt-math-l1-1-0.dll
    api-ms-win-crt-string-l1-1-0.dll
    api-ms-win-crt-stdio-l1-1-0.dll
    api-ms-win-crt-multibyte-l1-1-0.dll
    api-ms-win-crt-convert-l1-1-0.dll
    api-ms-win-crt-filesystem-l1-1-0.dll
    api-ms-win-crt-locale-l1-1-0.dll
    api-ms-win-crt-time-l1-1-0.dll
    ole32.dll
    VERSION.dll
    USER32.dll
    SHELL32.dll

  Summary

        A000 .data
        6000 .pdata
       49000 .rdata
        2000 .reloc
        1000 .rsrc
       7A000 .text

C:\Build\SlaveTatsNG\build\Release>

 

 

 

Posted
10 minutes ago, nopse0 said:

 

Do you have apart from SlaveTatsNG.dll also a "AASlaveTatsNG.dll" in your skse/plugins folder (this name appears in the stacktrace) ? Or did you rename "SlaveTatsNG.dll" to "AASlaveTatsNG.dll" to see what happens, if it is loaded as the first skse plugin ? If you have both, delete the "AA" one.

 

Otherwise, it seems the dependencies of the dll don't have changed, still vcruntime1.40, so the Vc redistributable 2015 should be Ok (though it can do no harm to update to the latest one, they are downwards compatible)

  Hide contents

C:\Build\SlaveTatsNG\build\Release>dumpbin /dependents SlaveTatsNG.dll
Microsoft (R) COFF/PE Dumper Version 14.41.34120.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file SlaveTatsNG.dll

File Type: DLL

  Image has the following dependencies:

    KERNEL32.dll
    MSVCP140.dll
    MSVCP140_ATOMIC_WAIT.dll
    VCRUNTIME140_1.dll
    VCRUNTIME140.dll
    api-ms-win-crt-heap-l1-1-0.dll
    api-ms-win-crt-runtime-l1-1-0.dll
    api-ms-win-crt-math-l1-1-0.dll
    api-ms-win-crt-string-l1-1-0.dll
    api-ms-win-crt-stdio-l1-1-0.dll
    api-ms-win-crt-multibyte-l1-1-0.dll
    api-ms-win-crt-convert-l1-1-0.dll
    api-ms-win-crt-filesystem-l1-1-0.dll
    api-ms-win-crt-locale-l1-1-0.dll
    api-ms-win-crt-time-l1-1-0.dll
    ole32.dll
    VERSION.dll
    USER32.dll
    SHELL32.dll

  Summary

        A000 .data
        6000 .pdata
       49000 .rdata
        2000 .reloc
        1000 .rsrc
       7A000 .text

C:\Build\SlaveTatsNG\build\Release>

 

 

 

 

I can try to update Visual Studio, and build a new version.  I am using 17.11.0, but there's an update available to 17.12, maybe this is a compiler bug or so.

 

 

Posted
1 hour ago, nopse0 said:

 

Do you have apart from SlaveTatsNG.dll also a "AASlaveTatsNG.dll" in your skse/plugins folder (this name appears in the stacktrace) ? Or did you rename "SlaveTatsNG.dll" to "AASlaveTatsNG.dll" to see what happens, if it is loaded as the first skse plugin ? If you have both, delete the "AA" one.

 

  Hide contents

 

 

 

 

No, I have only one, AASlaveTatsNG.dll. I renamed it because it was advised in order to load this one first. Here are the md5sums of the files present:

 

d29ccac82641a9e7b7c7ffa00c8379db  AASlaveTatsNG.dll
41adc1a53ca6a0df009f05249eb66cc4  SlaveTatsNG.pdb

 

Posted (edited)
47 minutes ago, metoo said:

No, I have only one, AASlaveTatsNG.dll. I renamed it because it was advised in order to load this one first. Here are the md5sums of the files present:

 

d29ccac82641a9e7b7c7ffa00c8379db  AASlaveTatsNG.dll
41adc1a53ca6a0df009f05249eb66cc4  SlaveTatsNG.pdb

 

 

Yes, that's the same hash I get with "certutil -hashfile slavetatsng.dll MD5", that's the same file I uploaded.

 

I advised to load the SlaveTats.dll first, when I tried to find out the NiOverride function addresses on VR, and also installed a "SlaveTatsNG.ini" in skse/plugins with "vm_hook=true". This is not needed any more, I know the addresses now. If you have a "SlaveTatsNG.ini" remove it, or set vm_hook=false, and remove the "AA" from SlaveTatsNG, maybe the load order is the problem.

 

I think the only thing which can be seen in your stacktrace is, that an exception is thrown in AASlaveTatsNG.dll (the 4 lines at the bottom), everything else in the stack trace is related to stack unwinding ("seh:: ..."), when it is tried to catch the exception, which at the end fails with an address violation, probably because Skyrim is compiled with different compiler options, and doesn't support this).

 

Edited by nopse0
Posted

After starting a new game with the latest version of Skyrim I had to reinstall my ENB and noticed tattoos get brighter with subsurface scattering, meaning black tattoos don't appear as really black, but dark brown. I think I toned down the SS in my previous setup, but is there a way around this besides that?

Posted
On 11/15/2024 at 5:25 AM, OmniCaptor said:

After starting a new game with the latest version of Skyrim I had to reinstall my ENB and noticed tattoos get brighter with subsurface scattering, meaning black tattoos don't appear as really black, but dark brown. I think I toned down the SS in my previous setup, but is there a way around this besides that?

 

I found out with Google that the game engine uses the *_sk.dds (specular maps) for the SSS effect, while ENB uses the diffuse maps for this. In SlaveTats you can only set the bump maps. I don't know, maybe there are other shader properties (apart from the maps) which have an influence on the SSS effect. If someone knows, what they are and how they can be set via NiOverride, I could perhaps add a global correction factor. Currently the following shader properties are set in SlaveTats:

 

		NiOverride::AddNodeOverrideString(a_target, a_is_female, nodeName.c_str(), 9, 0, a_path.c_str(), true);
		if (!a_bump.empty())
			NiOverride::AddNodeOverrideString(a_target, a_is_female, nodeName.c_str(), 9, 1, a_bump.c_str(), true);
		NiOverride::AddNodeOverrideInt(a_target, a_is_female, nodeName.c_str(), 7, -1, a_color, true);
		NiOverride::AddNodeOverrideInt(a_target, a_is_female, nodeName.c_str(), 0, -1, a_glow, true);
		NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 1, -1, 1.0, true);
		NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 8, -1, a_alpha, true);
		if (a_gloss) {
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 2, -1, 5.0, true);
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 3, -1, 5.0, true);
		} else {
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 2, -1, 0.0, true);
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 3, -1, 0.0, true);
		}

 

 

Posted
1 hour ago, nopse0 said:

 

I found out with Google that the game engine uses the *_sk.dds (specular maps) for the SSS effect, while ENB uses the diffuse maps for this. In SlaveTats you can only set the bump maps. I don't know, maybe there are other shader properties (apart from the maps) which have an influence on the SSS effect. If someone knows, what they are and how they can be set via NiOverride, I could perhaps add a global correction factor. Currently the following shader properties are set in SlaveTats:

 

		NiOverride::AddNodeOverrideString(a_target, a_is_female, nodeName.c_str(), 9, 0, a_path.c_str(), true);
		if (!a_bump.empty())
			NiOverride::AddNodeOverrideString(a_target, a_is_female, nodeName.c_str(), 9, 1, a_bump.c_str(), true);
		NiOverride::AddNodeOverrideInt(a_target, a_is_female, nodeName.c_str(), 7, -1, a_color, true);
		NiOverride::AddNodeOverrideInt(a_target, a_is_female, nodeName.c_str(), 0, -1, a_glow, true);
		NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 1, -1, 1.0, true);
		NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 8, -1, a_alpha, true);
		if (a_gloss) {
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 2, -1, 5.0, true);
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 3, -1, 5.0, true);
		} else {
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 2, -1, 0.0, true);
			NiOverride::AddNodeOverrideFloat(a_target, a_is_female, nodeName.c_str(), 3, -1, 0.0, true);
		}

 

 

 

If I edit the diffuse maps to be darker, will that look ugly in the game?

 

I managed to find a decent middle ground between SSS and darker tats for now, but if you somehow find a way to add a global correction factor, of coruse that would be great!

Posted
On 11/14/2024 at 7:36 PM, metoo said:

Also I'm running it in Linux, more or less successfully until today.

 

A long time, but one idea I got, when looking at the code again:

 

If loading the SlaveTatsNG.dll fails in Linux in the SKSE_LoadPlugin function, there probably is an exception in the InitializeLog() function. Because otherwise, assuming that the SKSE::LoadInterface* is not null, you would have a log file with some content:

 

extern "C" DLLEXPORT bool SKSEAPI SKSEPlugin_Load(const SKSE::LoadInterface* a_skse)
{
	SKSE::Init(a_skse);

	InitializeLog();

	CSimpleIniA config;
	SI_Error    rc = config.LoadFile(slavetats_ng::config_file);
	logger::info("Load {}, result = {}", slavetats_ng::config_file, rc);

 

This could be a filename/path problem in Linux, because:

 

void InitializeLog()
{
	auto path = logger::log_directory();
	if (!path) {
		stl::report_and_fail("Failed to find standard logging directory"sv);
	}

 

and

 

namespace log
{
	std::optional<std::filesystem::path> log_directory()
	{
		wchar_t* buffer{ nullptr };
		const auto result = REX::W32::SHGetKnownFolderPath(REX::W32::FOLDERID_Documents, REX::W32::KF_FLAG_DEFAULT, nullptr, std::addressof(buffer));
		std::unique_ptr<wchar_t[], decltype(&REX::W32::CoTaskMemFree)> knownPath(buffer, REX::W32::CoTaskMemFree);
		if (!knownPath || result != 0) {
			error("failed to get known folder path"sv);
			return std::nullopt;
		}

		std::filesystem::path path = knownPath.get();
		path /= "My Games"sv;

 

I don't know, if this "REX::W32::SHGetKnownFolderPath(REX::W32::FOLDERID_Documents" + "My Games" stuff in Linux works with Wine (or whatever Steam is using on Linux).

 

 

  • 2 weeks later...
Posted (edited)

@nopse0 Just a note: I just released an update to Bathing in Skyrim here. It necessitated some tweaks to the script that your BiS patch modifies. Which means your script is only compatible with BiS Tweaked atm.

 

So far the changes have been minimal. We'll see what to do with this particular script once I'm done investigating a couple more issues with my BISR.

 

Edit: There doesn't seem to be an incompatibility any longer - or there wasn't one in the first place since your script never uses AreasTexNames.

Edited by Nuascura
Posted

Can you add a function which allows you to modify the emissive multiplier when adding a tattoo?

Deviously Accessible uses it but since there is no equivalent to such a function in vanilla slavetats it copies the entire function just to add a singular float value which means its not as fast as slavetatNG

The function is in SlaveTats_simpleglowextension.psc

Posted (edited)

I have a question regarding this mod @nopse0

 

Since I realized this mod would work in my setup, I made some changes to my own mod setup that automatically applies tattoos to all female characters in my games.

 

This works really well and it is so nice to see SlaveTats finally performing like it should.

 

However, as I have continued in my playthough I have started to notice something: My .skse co-save file is continuously increasing in size and saving is taking longer and longer.

 

Of course, MANY tattoos are applied in my game, so any potential problems would be exasperated.

 

You mention that you can add/remove the mod at any point since it uses the same save structures. Naturally, I therefore tried to remove this mod (keeping just the old SlaveTats 1.3.9) and it does indeed looks like this causes no problems (as far as I can see from only a quick look). So I tried saving without SlaveTatsNG, and my co-save file immediately decreased from 26 MB to 14 MB. I will point out that if I then re-enable SlaveTatsNG and try to save again, the save process seems to become somewhat unstable, often causing a CTD (based on 5 attempts where it crashed 3 times and worked 2 times). However, when it does work it retains it's much smaller co-save size.

 

This leaves me with two questions:

  • Perhaps there is an issue here?
  • Is it "safe" to do what I did here (saving with 1.3.9), in order to decrease the size of the co-save file?

 

(I became suspicious that it was SlaveTats that was causing it, when I opened the co-save file in Notepad++ and noticed it looked like most of the data related to SlaveTats)

 

DISCLAIMER: I will point out, that while my co-save is definitely *somehow* getting bloated, this does not prove that it is SlaveTatsNG causing this. The only thing this proves is that SlaveTatsNG somehow uses more data in the co-save than the original mod (or it uses data differently). The fact that my co-save file is constantly increasing could be caused by something else.

Edited by leakim
Posted (edited)

Normally it should be totally safe to interchange SlaveTatsNG and the original SlaveTats, because they use the same JContainer "structures" (principally this is only one structure, the JFormDB/JFormMap ".SlaveTats.applied", which contains, which NPC's have which tattoos applied).  Neither my  mod nor SlaveTats directly manipulate the save file, they store stuff in JContainers, and JContainers persists its data in the save file.

 

But there is one difference. The original SlaveTats tries to cache which tattoo packs are installed (the content of the file "Data/slavetats_cache.json" file) in the JDB/JMap ".SlaveTats.cache". I noticed that this doesn't work, because ".SlaveTats" already is a JFormDB (because of the ".SlaveTats.applied" JFormMap above), and you cannot mix both types (in a JFormDB you can only store JFormMaps, and in a JDB you can only store JMaps). So the original SlaveTats parses the file "Data/slavetats_cache.json" again and again, because creating ".SlaveTats.cache" always fails. I solved the problem, by using a different name for the cache (".SlaveTatsNG.cache"), so there is no name clash between the JFormDB and the JDB. So, both are not totally synchronous, SlaveTats always reads "slavetats_cache.json" anew, while I am using the cached value. Maybe this is the problem, try to click "Add/Remove tattoos" in the MCM, then "Data/slavetats_cache.json" and the cache should be in sync again.

 

But I don't think that this is the problem, this would only be a problem if manually editing "slavetats_cache.json". I think if there are memory leaks, then I probably forgot to clean up temporary pools. For example SlaveTats contains code like this:

int areas = JValue:addToPool(JMap::object(), "SlaveTats-cache_available_tattoos");
/* do some stuff */
JValue::cleanPool("SlaveTats-cache_available_tattoos");

This would explain why the save file size get's smaller after running the old SlaveTats. But this doesn't explain why the game crashes when saving. Maybe JContainers garbage collects unreferenced stuff, while saving is in progress ? But I cannot imagine that, I think (hope) everything is suspended while a save is made.

 

Edit: I found one leak:

			int keys = JValue::addToPool(JMap::allKeys(a_obj), "SlaveTats-_log_jcontainer");

But no cleanPool("SlaveTats-_log_jcontainer"), this could be it.

 

 

Edited by nopse0
Posted
30 minutes ago, nopse0 said:

Normally it should be totally safe to interchange SlaveTatsNG and the original SlaveTats, because they use the same JContainer "structures" (principally this is only one structure, the JFormDB/JFormMap ".SlaveTats.applied", which contains, which NPC's have which tattoos applied).  Neither my  mod nor SlaveTats directly manipulate the save file, they store stuff in JContainers, and JContainers persists its data in the save file.

 

But there is one difference. The original SlaveTats tries to cache which tattoo packs are installed (the content of the file "Data/slavetats_cache.json" file) in the JDB/JMap ".SlaveTats.cache". I noticed that this doesn't work, because ".SlaveTats" already is a JFormDB (because of the ".SlaveTats.applied" JFormMap above), and you cannot mix both types (in a JFormDB you can only store JFormMaps, and in a JDB you can only store JMaps). So the original SlaveTats parses the file "Data/slavetats_cache.json" again and again, because creating ".SlaveTats.cache" always fails. I solved the problem, by using a different name for the cache (".SlaveTatsNG.cache"), so there is no name clash between the JFormDB and the JDB. So, both are not totally synchronous, SlaveTats always reads "slavetats_cache.json" anew, while I am using the cached value. Maybe this is the problem, try to click "Add/Remove tattoos" in the MCM, then "Data/slavetats_cache.json" and the cache should be in sync again.

 

 

 

 

I tried loading my original save game (where I had not removed SlaveTatsNG) and clicked "Add/remove tattoos" in the MCM. That certainly recreated the "slavetats_cache.json" file but it the new file had the same amount of lines, so I assume there were no difference.

 

Saving afterwards has no effect on the co-save file size, although I am not entirely sure from your answer whether or not you expected this result.

Posted
2 hours ago, nopse0 said:

But I don't think that this is the problem, this would only be a problem if manually editing "slavetats_cache.json". I think if there are memory leaks, then I probably forgot to clean up temporary pools. For example SlaveTats contains code like this:

int areas = JValue:addToPool(JMap::object(), "SlaveTats-cache_available_tattoos");
/* do some stuff */
JValue::cleanPool("SlaveTats-cache_available_tattoos");

This would explain why the save file size get's smaller after running the old SlaveTats. But this doesn't explain why the game crashes when saving. Maybe JContainers garbage collects unreferenced stuff, while saving is in progress ? But I cannot imagine that, I think (hope) everything is suspended while a save is made.

 

Edit: I found one leak:

			int keys = JValue::addToPool(JMap::allKeys(a_obj), "SlaveTats-_log_jcontainer");

But no cleanPool("SlaveTats-_log_jcontainer"), this could be it.

 

 

 

I'd certainly be interested in testing this for you if you think you've found the problem. ;)

Posted
1 hour ago, leakim said:

 

I tried loading my original save game (where I had not removed SlaveTatsNG) and clicked "Add/remove tattoos" in the MCM. That certainly recreated the "slavetats_cache.json" file but it the new file had the same amount of lines, so I assume there were no difference.

 

Saving afterwards has no effect on the co-save file size, although I am not entirely sure from your answer whether or not you expected this result.

There definitely was a memory leak in _log_jcontainer. Fixed this

Posted (edited)

The new version reduces my co-save file by as much as "downgrading" to 1.3.9 did. So it works great.

 

As for the crashes I mentioned after "downgrading". These are still happening for me, and they did not happen before. However, I do not believe this mod is the cause of this at all.

 

I did have occasional crashes when saving previously, but it was fairly rare. After updating here my crash rate and increased massively when saving. I strongly believe it is due to some other problem that I will investigate. It's probably some race condition that was always present but was rarely an issue before because saving took longer (or something similar). Do not waste time worrying about that. :)

 

UPDATE: That didn't take long. Turned out it was "iNeed - Food, Water and Sleep - Continued" that was causing my save crashes. I am not exactly sure I want to understand how exactly this mod "fixing" my skse co-save file would aggrevate this issue, Anyway, I'll move away from iNeed. Maybe I will try that Sunhelm thing. Think it would fit in rather well since I recently removed Frostfall and that can replace both.

Edited by leakim

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...