Jump to content

Recommended Posts

Posted (edited)

So I've been testing my mods with tats packed as BSA and had to notice, that other automatic slavetat mod will not detect or forward the "in_bsa":1 - flag.
Diary of mine, Apropos2 and RapeTats fail to apply BSA-packed tats - FadeTats works on slavetatsMCM applied tats though.
It seems to me that these mods were not written with BSA in mind and all would need their scripts changed to be aware of BSA rather than just calling the tat texture.

Question for you: Would it be possible to write an addon or something that checks the incoming Slavetat application calls from other mods, checks if it's supposed to be in BSA and then if necessary adds the flag before feeding the call into the main Slavetats script?
So that only one patch would be necessary to fix these oversights of not checking BSA, rather than one for each slavetats applicator mod.
Ideally in way that doesn't need to overwrite any of slavetats scripts so that it works for any user
 

Edited by verydarknut
Posted
9 hours ago, verydarknut said:

So I've been testing my mods with tats packed as BSA and had to notice, that other automatic slavetat mod will not detect or forward the "in_bsa":1 - flag.
Diary of mine, Apropos2 and RapeTats fail to apply BSA-packed tats - FadeTats works on slavetatsMCM applied tats though.
It seems to me that these mods were not written with BSA in mind and all would need their scripts changed to be aware of BSA rather than just calling the tat texture.

Question for you: Would it be possible to write an addon or something that checks the incoming Slavetat application calls from other mods, checks if it's supposed to be in BSA and then if necessary adds the flag before feeding the call into the main Slavetats script?
So that only one patch would be necessary to fix these oversights of not checking BSA, rather than one for each slavetats applicator mod.
Ideally in way that doesn't need to overwrite any of slavetats scripts so that it works for any user
 

I think I will simply remove checking that the texture file exists, if "in_bsa: 1" is not set. I mean, this check is nonsense, nothing bad happens if a texture doesn't exist, the character just will look purple, or so, if a texture doesn't exist. And then you will know that something is wrong with the textures, don't need a test for this. 

Posted
1 hour ago, nopse0 said:

I think I will simply remove checking that the texture file exists, if "in_bsa: 1" is not set. I mean, this check is nonsense, nothing bad happens if a texture doesn't exist, the character just will look purple, or so, if a texture doesn't exist. And then you will know that something is wrong with the textures, don't need a test for this. 

I think there is an misunderstanding. I don't want missing textures, I want to redirect calls from mods that do not read the bsa flag. I looked at the scripts of Diary of Mine and Apropos, when reading in the json there isnt a variable set for in_bsa, so if a texture is in bsa and json corrected, those mods will ignore the flag and call for "in_bsa":0 essentially.

 

Do you mean if the texture-file-path check is removed, the texture application will point correctly to the BSA ? No other fuzz needed?
 

Posted
On 7/19/2025 at 3:10 PM, nopse0 said:

 

 

No, but I cannot imagine, it loads a different config file on Mac, never heard of this. I don't know, what functions RaceMenu uses for parsing the config file, but I could imagine the line endings are a problem. Windows uses CRLF, Unix uses LF only, and Mac uses LFCR. I would check, if your skee64.ini has Windows line endings (maybe, you used a wrong editor - I am using NotePad++, with this you have full control over line endings, what charset is used (UTF8/16/32/Latin1/etc), and it can show hidden, non-printable characters)

 

I was using VSCode, I went and pulled NotepadNext which is a clone of Notepad++ for Mac and it didn't change anything. Nothing hidden, converted to a .ini file natively, and was in UTF8. its really driving me nuts, not even having the base 6 is frustrating lol

Posted
3 hours ago, verydarknut said:

Do you mean if the texture-file-path check is removed, the texture application will point correctly to the BSA ? No other fuzz needed?
 

Yes, exactly, no other fuzz needed. In both cases, bsa or not, you simply set the texture path as a triangle strip shader property, and Skyrim automatically handles, if this is a real file or a file from a bsa archive.

I justed wanted to say, if I remove the file exist check, it is possible to apply textures, which don't exist, and then you get the usual missing texture graphics errors, like blue characters 

Posted
16 hours ago, nopse0 said:

Yes, exactly, no other fuzz needed. In both cases, bsa or not, you simply set the texture path as a triangle strip shader property, and Skyrim automatically handles, if this is a real file or a file from a bsa archive.

I justed wanted to say, if I remove the file exist check, it is possible to apply textures, which don't exist, and then you get the usual missing texture graphics errors, like blue characters 

That would be amazing then! Would make compressing tats lots more viable. It's a joke how any decent sized slavetat collection quickly bloats larger than the base game.
If you need someone to test, I'm here

  • 2 weeks later...
Posted
On 6/17/2025 at 9:20 PM, nopse0 said:

 

And you don't have this flickering when you apply overlays with RaceMenu ? Because SlaveTats simply applies NodeOverrides (texture,color,alpha,etc.) to actors by calling NiOverride f (RaceMenu) functions. And, RaceMenu in turn,  implements this by setting shader properties (texture,color,alpha,etc. are shader properties). I can only imagine that the Community Shaders are different (have different properties or so).

Sorry for delayed answer, but I wanted to clarify that yes, black flickering appearing with slavetats, with racemenu overlays and active overlays etc. any overlay texture flickers, when I am not using ENB. Which is wild, I tried to check if it works like that when I remove ALL of the ENB shaders and just disable effects altogether (just ENB binary) and yeah, flickering persists. It's like in ENB there's some shader that makes this black value invisible, or something. But also I've found out that the black flicker appears when I'm updating overlays (some mods can provide this feature, like bac for example) and this black flicker always appear (without ENB) when I'm updating my character, so there's  a possibility that some mod constantly tries to update my character overlays, hence the black stuff reappear all the time. I'm not sure if slavetats have this constant update feature, or maybe there's other mods like this, but I would be extremely grateful if someone would point it out. I've seen similar issue were posted sometime ago by people, but there was never the solution except for new ENB version witch is rather frustrating when trying to transition to CS 🥲    

Posted

I also find out randomly while trying to determine what shader from ENB removes this dark flicker - that if I apply slavetats with the "gloss" ticked - I don't see this flicker for some reason. I don't know if it's helpful for anyone but maaaybe it can be a workaround, if nothing else 

 

Posted

Just wanted to share with people, who could experience similar issue with black flickering and stuff - I've found a fix! On nexus there's a mod that called RaceMenu OverlayFix and Various Mod Fixes - it fixes this horrid flickering issue, and some other issues with racemenu too, all without any ENB. Highly recommend!! 

  • 2 weeks later...
Posted

Hiya @nopse0.  SkyrimVR just got an update to Racemenu that allows for face overlays to finally work.  Yay!  But it seems to immediately CTD upon trying to open the MCM with SlaveTatsNG installed.  Regular SlaveTats seems to work fine.  Could we VR users get an update for this mod please?

 

Attached are my RaceMenu and SlaveTats logs if they help.  The crashlogger doesn't log anything though.

 

https://www.nexusmods.com/skyrimspecialedition/mods/156898

skeevr.log SlaveTatsNG.log

Posted
9 hours ago, kamithemoon said:

Hiya @nopse0.  SkyrimVR just got an update to Racemenu that allows for face overlays to finally work.  Yay!  But it seems to immediately CTD upon trying to open the MCM with SlaveTatsNG installed.  Regular SlaveTats seems to work fine.  Could we VR users get an update for this mod please?

 

Attached are my RaceMenu and SlaveTats logs if they help.  The crashlogger doesn't log anything though.

 

https://www.nexusmods.com/skyrimspecialedition/mods/156898

skeevr.log 11.65 kB · 0 downloads SlaveTatsNG.log 4.6 kB · 0 downloads

 

Ah, ok, new RaceMenu dll => addresses have changed. I don't have SkyrimVR, I can't calculate the new address offsets. But you (or someone else who has VR) can :) ! Follow the instructions I posted a few mails ago, calculate the new address offsets, add them to the tables in slavetats_addresses.json (or whatever I called it), and post the changed file here, so everyone can benefit. 

Posted
7 hours ago, nopse0 said:

 

Ah, ok, new RaceMenu dll => addresses have changed. I don't have SkyrimVR, I can't calculate the new address offsets. But you (or someone else who has VR) can :) ! Follow the instructions I posted a few mails ago, calculate the new address offsets, add them to the tables in slavetats_addresses.json (or whatever I called it), and post the changed file here, so everyone can benefit. 

Okie dokie.  I enabled logging and I think I see the first set of addresses I need.  But where do I find the SKSE addresses I'm supposed to subtract?  I'm also not seeing a file anywhere named "slavetats_addresses.json" or anything similar.  😕

SlaveTatsNG.log

Posted (edited)
44 minutes ago, kamithemoon said:

Okie dokie.  I enabled logging and I think I see the first set of addresses I need.  But where do I find the SKSE addresses I'm supposed to subtract?  I'm also not seeing a file anywhere named "slavetats_addresses.json" or anything similar.  😕

SlaveTatsNG.log 8.98 kB · 0 downloads

 

Ah, ok, you are on the right way :)

 

The base address is here (line 121 in your log):

 

[10:10:31:828] GetModuleHandleA('skeevr.dll') = 140732109684736

 

But logging the NiOverride function addresses didn't work, the [vm_hook] only logged the addresses of SlaveTatsNG itself, nothing else, this are the lines like this:

 

[10:10:30:484] [vm_hook] object: SlaveTatsNG, name: find_required_tattoo, callback: 140732506874296

 

This is, because SKSE loads the plugins in alphabetical order (and both, skeevr.dll and SlaveTatsNG.dll start with an 'S'), so probably the vm_hook was installed too late. Rename the "SlaveTatsNG.dll" to e.g. "AASlaveTatsNG.dll", or so,  then you should get lines in your log with the NiOverride function addresses, e.g something like this:

 

[10:10:30:484] [vm_hook] object: NiOverride, name: ApplyNodeOverides, callback: 14....

 

Thats the addresses you need.

 

Ps: The addresses file is:

 

Data\SKSE\Plugins\SlaveTatsNG\skee_addresses.json

 

 

 

 

 

 

 

Edited by nopse0
Posted (edited)
On 8/16/2025 at 10:52 AM, nopse0 said:

 

Ah, ok, you are on the right way :)

 

The base address is here (line 121 in your log):

 

[10:10:31:828] GetModuleHandleA('skeevr.dll') = 140732109684736

 

But logging the NiOverride function addresses didn't work, the [vm_hook] only logged the addresses of SlaveTatsNG itself, nothing else, this are the lines like this:

 

[10:10:30:484] [vm_hook] object: SlaveTatsNG, name: find_required_tattoo, callback: 140732506874296

 

This is, because SKSE loads the plugins in alphabetical order (and both, skeevr.dll and SlaveTatsNG.dll start with an 'S'), so probably the vm_hook was installed too late. Rename the "SlaveTatsNG.dll" to e.g. "AASlaveTatsNG.dll", or so,  then you should get lines in your log with the NiOverride function addresses, e.g something like this:

 

[10:10:30:484] [vm_hook] object: NiOverride, name: ApplyNodeOverides, callback: 14....

 

Thats the addresses you need.

 

Ps: The addresses file is:

 

Data\SKSE\Plugins\SlaveTatsNG\skee_addresses.json

 

 

 

 

 

 

 

Horray!  Renaming worked and my log is much larger now and contains NiOverride entries.  The next question is, which address need to be subtracted?  Is it all the NiOverride ones or just all of them in general I subtract from the base address?

 

Also, I can't seem to find the skee_addresses.json.  It's not in my mod folder or overwrites or game installation folder, or documents.  I could always make one, of course, but I'm not sure why it didn't exist in the first place.  Was it needed?

 

Update: I realize I was using version 0.72 instead of the current version of 0.76.  It's difficult to keep up with LoversLab updates since they're not hooked into MO2's update system :classic_sad:

SlaveTatsNG.log

Edited by kamithemoon
Posted
25 minutes ago, kamithemoon said:

Horray!  Renaming worked and my log is much larger now and contains NiOverride entries.  The next question is, which address need to be subtracted?  Is it all the NiOverride ones or just all of them in general I subtract from the base address?

 

Also, I can't seem to find the skee_addresses.json.  It's not in my mod folder or overwrites or game installation folder, or documents.  I could always make one, of course, but I'm not sure why it didn't exist in the first place.  Was it needed?

 

Update: I realize I was using version 0.72 instead of the current version of 0.76.  It's difficult to keep up with LoversLab updates since they're not hooked into MO2's update system :classic_sad:

 

Update 2: The game won't start with v0.76.  The last functional version that works with VR is 0.74 and this version does not seem to have a skee_addresses.json.

SlaveTatsNG.log 146.5 kB · 0 downloads

 

Yes, the log files looks good, contains the NiOverride function addresses. You only have to calculate the offsets of the 12 NiOverride functions SlaveTats is using. The skee_addresses.json contains entries like this:

 

	"6df8589175031c701b7fc5d2befa9f4a": {
		"comment": "Skyrim 1.5.97, RaceMenu v0-4-16",
		"offset_GetNodeOverrideInt": 778592,
		"offset_GetNodeOverrideFloat": 778384,
		"offset_GetNodeOverrideString": 778992,
		"offset_AddNodeOverrideInt": 776672,
		"offset_AddNodeOverrideFloat": 776064,
		"offset_AddNodeOverrideString": 777264,
		"offset_HasNodeOverride": 630144,
		"offset_RemoveNodeOverride": 631248,
		"offset_ApplyNodeOverrides": 630064,
		"offset_AddOverlays": 628576,
		"offset_HasOverlays": 628608,
		"offset_RemoveOverlays": 628640
	},

 

The first number ("6df8589175031c701b7fc5d2befa9f4a" in the example above) is the MD5 hash-code of the skee dll, the address offsets are calculated from. When Skyrim is started, SlaveTats calculates the hash-code of the RaceMenu dll which is used, and then takes the corresponding entry from the .json file. In your case, it doesn't find one, because your dll is new and there is no entry for it's hash-code in the .json file, so it cannot continue, and terminates the program (Skyrim).

 

You can calculate the hash-code of your new dll with the command line program "certutil.exe". (I posted how to use it and a screenshot a few mails ago).

 

Posted
58 minutes ago, nopse0 said:

 

Yes, the log files looks good, contains the NiOverride function addresses. You only have to calculate the offsets of the 12 NiOverride functions SlaveTats is using. The skee_addresses.json contains entries like this:

 

	"6df8589175031c701b7fc5d2befa9f4a": {
		"comment": "Skyrim 1.5.97, RaceMenu v0-4-16",
		"offset_GetNodeOverrideInt": 778592,
		"offset_GetNodeOverrideFloat": 778384,
		"offset_GetNodeOverrideString": 778992,
		"offset_AddNodeOverrideInt": 776672,
		"offset_AddNodeOverrideFloat": 776064,
		"offset_AddNodeOverrideString": 777264,
		"offset_HasNodeOverride": 630144,
		"offset_RemoveNodeOverride": 631248,
		"offset_ApplyNodeOverrides": 630064,
		"offset_AddOverlays": 628576,
		"offset_HasOverlays": 628608,
		"offset_RemoveOverlays": 628640
	},

 

The first number ("6df8589175031c701b7fc5d2befa9f4a" in the example above) is the MD5 hash-code of the skee dll, the address offsets are calculated from. When Skyrim is started, SlaveTats calculates the hash-code of the RaceMenu dll which is used, and then takes the corresponding entry from the .json file. In your case, it doesn't find one, because your dll is new and there is no entry for it's hash-code in the .json file, so it cannot continue, and terminates the program (Skyrim).

 

You can calculate the hash-code of your new dll with the command line program "certutil.exe". (I posted how to use it and a screenshot a few mails ago).

 

Wellp, almost there, I think but game is still failing to launch.  This is what I was able to derive following your instructions and updating to v0.76.

 

    "b8ba691b4837f4e6538c845fdf95b9f7510905ea": {
        "comment": "Skyrim 1.4.15 (VR), RaceMenu VR v0.5",
        "offset_GetNodeOverrideInt": 709360,
        "offset_GetNodeOverrideFloat": 709152,
        "offset_GetNodeOverrideString": 709776,
        "offset_AddNodeOverrideInt": 707520,
        "offset_AddNodeOverrideFloat": 706880,
        "offset_AddNodeOverrideString": 708096,
        "offset_HasNodeOverride": 648848,
        "offset_RemoveNodeOverride": 650000,
        "offset_ApplyNodeOverrides": 648768,
        "offset_AddOverlays": 647296,
        "offset_HasOverlays": 647328,
        "offset_RemoveOverlays": 647360

 

 

CertUtil.png

SlaveTatsNG.log

Posted
4 hours ago, kamithemoon said:

Wellp, almost there, I think but game is still failing to launch.  This is what I was able to derive following your instructions and updating to v0.76.

 

    "b8ba691b4837f4e6538c845fdf95b9f7510905ea": {
        "comment": "Skyrim 1.4.15 (VR), RaceMenu VR v0.5",
        "offset_GetNodeOverrideInt": 709360,
        "offset_GetNodeOverrideFloat": 709152,
        "offset_GetNodeOverrideString": 709776,
        "offset_AddNodeOverrideInt": 707520,
        "offset_AddNodeOverrideFloat": 706880,
        "offset_AddNodeOverrideString": 708096,
        "offset_HasNodeOverride": 648848,
        "offset_RemoveNodeOverride": 650000,
        "offset_ApplyNodeOverrides": 648768,
        "offset_AddOverlays": 647296,
        "offset_HasOverlays": 647328,
        "offset_RemoveOverlays": 647360

 

 

CertUtil.png

SlaveTatsNG.log 145.6 kB · 0 downloads

 

Ah, I see what's wrong, you calculated the wrong hash-code, SHA1 instead of MD5. You must run: "certutil -hashfile skeevr.dll MD5".

Posted
2 hours ago, nopse0 said:

 

Ah, I see what's wrong, you calculated the wrong hash-code, SHA1 instead of MD5. You must run: "certutil -hashfile skeevr.dll MD5".

Huzzah!  It works now!

 

Thank you for including this feature and for walking me through the process of getting it to work.  And thank you to the other team for getting facial overlays working in VR too!

    "da3096f40df18ce12b343dd4e2821a6a": {
        "comment": "Skyrim 1.4.15 (VR), RaceMenu VR v0.5",
        "offset_GetNodeOverrideInt": 709360,
        "offset_GetNodeOverrideFloat": 709152,
        "offset_GetNodeOverrideString": 709776,
        "offset_AddNodeOverrideInt": 707520,
        "offset_AddNodeOverrideFloat": 706880,
        "offset_AddNodeOverrideString": 708096,
        "offset_HasNodeOverride": 648848,
        "offset_RemoveNodeOverride": 650000,
        "offset_ApplyNodeOverrides": 648768,
        "offset_AddOverlays": 647296,
        "offset_HasOverlays": 647328,
        "offset_RemoveOverlays": 647360

Posted
On 8/17/2025 at 12:55 PM, kamithemoon said:

Huzzah!  It works now!

 

Thank you for including this feature and for walking me through the process of getting it to work.  And thank you to the other team for getting facial overlays working in VR too!

    "da3096f40df18ce12b343dd4e2821a6a": {
        "comment": "Skyrim 1.4.15 (VR), RaceMenu VR v0.5",
        "offset_GetNodeOverrideInt": 709360,
        "offset_GetNodeOverrideFloat": 709152,
        "offset_GetNodeOverrideString": 709776,
        "offset_AddNodeOverrideInt": 707520,
        "offset_AddNodeOverrideFloat": 706880,
        "offset_AddNodeOverrideString": 708096,
        "offset_HasNodeOverride": 648848,
        "offset_RemoveNodeOverride": 650000,
        "offset_ApplyNodeOverrides": 648768,
        "offset_AddOverlays": 647296,
        "offset_HasOverlays": 647328,
        "offset_RemoveOverlays": 647360

Will this work for others using the new RaceMenu or I need to generate it myself?

Posted
1 hour ago, erosennin1611 said:

Will this work for others using the new RaceMenu or I need to generate it myself?

This will work for others. All dll's with the same hash-code are the same file.

Posted

Hey, no clue why, but the latest version of Slavetats NG (0.7.6) causes CTD on startup on Skyrim VR. Crashlogger doesn't even generate a log for it; I found it was this mod through trial and error. The version before that, however (0.7.4,) doesn't CTD on startup.

Posted (edited)
9 hours ago, bruhfrman said:

Hey, no clue why, but the latest version of Slavetats NG (0.7.6) causes CTD on startup on Skyrim VR. Crashlogger doesn't even generate a log for it; I found it was this mod through trial and error. The version before that, however (0.7.4,) doesn't CTD on startup.

Are you using the new skeevr.dll (RaceMenu), which supports face tattoos ? See above, the new dll has different addresses. 0.7.6 reads the address tables from a file, while in 0.7.4 the addresses were hardcoded. So, 0.7.6 doesn't ctd, it exits Skyrim (in a controlled way, it calls "abort()", the log file, SlaveTatsNG.log, will show this), because it doesn't have the addresses for that dll version. 0.7.4 doesn't do this, but it will CTD when the first NiOverride calls are made, because the hardcoded addresses are wrong. Add the addresses @kamithemoon posted to skee_addresses.json.   

Edited by nopse0
Posted (edited)

This is so cool, I cannot resist, I have to show this to someone :)  This is a screenshot of the upcoming "Doctor SlaveTatsNG", sort of a "MCM" with ImGui and CatMenu as window manager.  When this is ready, the old Papyrus SlaveTats MCM is not needed anymore, can be deinstalled. I am planning to add glow tattoos soon, but since I have to add additional attributes to SlaveTats tattoos for this, I wanted a tool for debugging, with which I can check, what attributes tattoos have, and be able to edit them.

489830_20250904195851_1.png

Edited by nopse0
  • 2 weeks later...
Posted
On 9/5/2025 at 2:08 AM, nopse0 said:

This is so cool, I cannot resist, I have to show this to someone :)  This is a screenshot of the upcoming "Doctor SlaveTatsNG", sort of a "MCM" with ImGui and CatMenu as window manager.  When this is ready, the old Papyrus SlaveTats MCM is not needed anymore, can be deinstalled. I am planning to add glow tattoos soon, but since I have to add additional attributes to SlaveTats tattoos for this, I wanted a tool for debugging, with which I can check, what attributes tattoos have, and be able to edit them.

489830_20250904195851_1.png

it's looks great, but how to view this gui

Posted (edited)
51 minutes ago, vevan said:

it's looks great, but how to view this gui

 

You need "CatMenu" https://www.nexusmods.com/skyrimspecialedition/mods/65958  (don't forget to copy  imgui.dll manually to the Skyrim folder (where the .exe is), MO2 doesn't do this for you, imgui is not a SKSE plugin) .

And you definitely need "Alt-Tab Stuck Key Fix NG" https://www.nexusmods.com/skyrimspecialedition/mods/148466 , otherwise ImGui thinks the TAB key is permanently pressed, if you are ALT-TABbing between Windows and Skyrim (misses the Key-Up event).

 

Edit: You get the CatMenu menu bar by pressing "F6", but you can configure this (I am using F10, because F6 collides with my SkyUI hotkeys). CatMenu is like a Window-Manager in Linux/X-Windows, with docking and everything, really good!

 

Edited by nopse0

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...