Jump to content

Recommended Posts

Posted
10 hours ago, arbiter said:
In SlaveTats SPID Distributor: https://www.nexusmods.com/skyrimspecialedition/mods/157498?tab=description

The author highlights a problem applying tats via SPID to non-unique actors such as bandits that was fixed.

I believe it fixes this by adjusting SlaveTats.psc, from GetActorBase() to GetLeveledActorBase() like so:

ActorBase target_base
= target.GetLeveledActorBase()

It does this in the external_slots and synchronize_tattoos functions. It also makes some other change in that script that I don't understand.

It's possible the changes in this file are unrelated to that specific fix and it does this for some other reason.

Obviously this change isn't compatible with SlaveTatsNG due to overwriting the script, but for all I know you already fixed this problem, or it isn't a problem in your mod, or etc.

Just FYI!

Enjoying the mod, much faster and doesn't glitch out for some tats. Great job.

Thanks, I had a look at his changes when he brought out his mod, and saw this GetLeveledActorBase thing. But I think this is only a Papyrus problem, RE::Actor in commonlibsse-ng has no such function.

Posted (edited)

Would be cool if the tattoo changes immediately as soon as we select it in the dropdown menu, without needing to click apply tattoo, then click sync visuals again in the GUI. 

 

Just way too many clicks for my lazy ass.

 

Anyway, kudos for making a GUI thats easier to use than the old MCM.

Edited by emiliamajitenshi
Posted (edited)

About these GetActorBase()/GetLeveledActorBase() again, I had a look at Actor.psc from SKSE.

 

GetActorBase() is the same as the native GetBaseObject() in ObjectReference.psc

; In Actor.psc:

;returns the ActorBase
ActorBase function GetActorBase()
	return GetBaseObject() as ActorBase
endFunction

; In ObjectReference.psc:

; Returns the base object this reference represents
Form Function GetBaseObject() native

 

While GetLeveledActorBase() is a native function in Actor.psc:

; Obtains a leveled actor's "fake" base (the one generated by the game when the
; actor is leveled. This differs from GetActorBase which will return the editor base
; object)
ActorBase Function GetLeveledActorBase() native

 

So, I think the function GetActorBase() in the RE::Actor class is the same as GetLeveledActorBase, because in Actor.h: 

 

image.png.0586a0867fda1d677568a4f35cf299a3.png

 

and in TESObjectREFR.h  (a RE::Actor is also TESObjectREFR (inherits)):

 

image.png.8f4cd5b63fa79699733b1d55287e907a.png

 

So the return types are different, GetBaseObject() returns a TESBoundObject, while GetActorBase() returns a TESNPC, and I am using a TESNPC* in my code:

 

image.png.376a50244c4d391283a08ae2caf89568.png

 

 

Edited by nopse0
  • 3 weeks later...
Posted (edited)

Based on the description I am just a little confused:

When you say no mod sends events do you mean all mods need to be updated to support SlaveTatsNG?
That's how I interpret, but I'm mostly a bit confused because I haven't seen any explicit patches for SlaveTatsNG from other users which seems a bit surprising.

Edited by MEyahMegusta
Posted (edited)
23 hours ago, MEyahMegusta said:

Based on the description I am just a little confused:

When you say no mod sends events do you mean all mods need to be updated to support SlaveTatsNG?
That's how I interpret, but I'm mostly a bit confused because I haven't seen any explicit patches for SlaveTatsNG from other users which seems a bit surprising.

I know no mods which use the SlaveTats mod events, so I think this isn't really a problem. And, the way the mod events are implemented in SlaveTatsSE, far more events are triggered than one would expect, I have the fear this would choke the VM.

Edited by nopse0
Posted

Wonder how does "gloss" works. Never got it to look properly as it makes tattoos to look matted. I do know that it supposed to go off the alpha channel, but it just makes them look muted, so I was wondering if i have a patch missing or maybe ENB settings making it look odd?

Posted (edited)
On 12/1/2025 at 9:32 AM, nopse0 said:

About these GetActorBase()/GetLeveledActorBase() again, I had a look at Actor.psc from SKSE.

 

GetActorBase() is the same as the native GetBaseObject() in ObjectReference.psc

; In Actor.psc:

;returns the ActorBase
ActorBase function GetActorBase()
	return GetBaseObject() as ActorBase
endFunction

; In ObjectReference.psc:

; Returns the base object this reference represents
Form Function GetBaseObject() native

 

While GetLeveledActorBase() is a native function in Actor.psc:

; Obtains a leveled actor's "fake" base (the one generated by the game when the
; actor is leveled. This differs from GetActorBase which will return the editor base
; object)
ActorBase Function GetLeveledActorBase() native

 

So, I think the function GetActorBase() in the RE::Actor class is the same as GetLeveledActorBase, because in Actor.h: 

 

image.png.0586a0867fda1d677568a4f35cf299a3.png

 

and in TESObjectREFR.h  (a RE::Actor is also TESObjectREFR (inherits)):

 

image.png.8f4cd5b63fa79699733b1d55287e907a.png

 

So the return types are different, GetBaseObject() returns a TESBoundObject, while GetActorBase() returns a TESNPC, and I am using a TESNPC* in my code:

 

image.png.376a50244c4d391283a08ae2caf89568.png

 

 

Could just do:

auto actorBase = a_target->GetTemplateActorBase();
Now: actorBase ? actorBase : a_target->GetActorBase();


To be sure. Although I use GetActorBase() too for gender/etc and never saw any problems

Edited by asdt123123
  • 2 weeks later...
Posted

Slavetats menu (MCM) is showing empty pages, no options on any of the pages (face, body, hands, feet).

Spoiler

image.png.c4304fbc3eecf25d6f6d15ed4f61e71d.png

Obviously I've screwed something up, but I'm not sure what. Help?

Posted
3 hours ago, MysticDaedra said:

Slavetats menu (MCM) is showing empty pages, no options on any of the pages (face, body, hands, feet).

  Hide contents

image.png.c4304fbc3eecf25d6f6d15ed4f61e71d.png

Obviously I've screwed something up, but I'm not sure what. Help?

 

Just checked it, for me the MCM works, must be something with your setup. Do you have RaceMenu installed, and is it working ? Does Papyrus SlaveTats alone without SlaveTatsNG work ? And what are the log files saying, SlaveTatsNG.log and skse64.log, is the SlaveTatsNG DLL loaded at all ?

Posted
17 hours ago, nopse0 said:

 

Just checked it, for me the MCM works, must be something with your setup. Do you have RaceMenu installed, and is it working ? Does Papyrus SlaveTats alone without SlaveTatsNG work ? And what are the log files saying, SlaveTatsNG.log and skse64.log, is the SlaveTatsNG DLL loaded at all ?

I feel embarrassed, it turns out the .dll was hidden in MO2 for some reason. Perhaps I was trying to find an incompatible dll or something? I can't remember, but I found it hidden in MO2, and when I un-hid it and loaded the game back up, SlavetatsNG was working. Whoops!

Posted

I'm not sure if I'm the only one with this issue, or if it is merely working as intended, or I am stupid and just missing something, but while the tats do render in when I load the game, the colors/glows applied to them instead don't and have a grey color until I manually go in and re-synchronize the visuals.

Posted (edited)
5 hours ago, argagagargaarga said:

I'm not sure if I'm the only one with this issue, or if it is merely working as intended, or I am stupid and just missing something, but while the tats do render in when I load the game, the colors/glows applied to them instead don't and have a grey color until I manually go in and re-synchronize the visuals.

 

I think the reason for this problem is, that when editing fields in the field editor, only the value in the JContainer data structure of the applied tattoo is changed, for example the integer field editor does this:

       if (ImGui::Button("OK", ImVec2(120, 0))) {
           JMap::setInt(tattoo_id, field_key, _int_new);
           // Check if this was successful
           bool result = JMap::hasKey(tattoo_id, field_key) && JMap::getInt(tattoo_id, field_key) == _int_new;
           if (result)
               ImGui::OpenPopup("Success");
           else
               ImGui::OpenPopup("Error");
       }

 

But this isn't enough for a change to become visible, the 'synchronize_tattoos' function only does something if the ".SlaveTats.updated" flag of the actor is true, otherwise it thinks nothing has changed. That's why I am doing the following in the "Synchronize visuals" button: 

    if (ImGui::Button("Synchronize visuals")) {
        if (actor_selector.actor) {
            // If manipulating the JContainer data directly, the '.updated' flag must be set before calling 'synchronize_tattoos' !!!
            JFormDB::setInt(actor_selector.actor, ".SlaveTats.updated", 1);
            slavetats::synchronize_tattoos(actor_selector.actor);
        }
    }

 

Currently, this cannot be done in the editors for the 3 different types (int,float,string), because they don't have the context information, they only know the tattoo_id, field name and the old value of the field (if there was one), they don't even know the actor this tattoo is applied on, so, currently, this can only be done in the parent window, which has all context information  (actor selector, etc.). This is an achitectural problem, I don't use a model/view concept, didn't seem neccessary when I wrote this (the model is "JContainers"), this has the disadvantage that only simple things can be done in simple controls.

 

Edited by nopse0
Posted
6 hours ago, mcdyn said:

works compatible with UBE body?

I think so. A user found out the NiOverride function addresses of the UBE skee64.dll, and I added them to the address tables file, the comment says they are for "Skyrim 1.5.97, UBE 2.0 U.0.7"

Posted (edited)

I have some weird issues with this mod. When using CatMenu the tattoo won't get applied for some reason, even though the pop-up message said that "operation was successful" or something like that. It once appeared randomly after a solo sex animation.

 

So I tried going the "Original SlaveTats Papyrus" route, but with that I'm not sure what I should copy or cut. Is it the .pex and .psc files? Because I then copied them into the SlaveTatsNG folder, overrode 8 files, but the MCM menu still doesn't show up.

 

So then I decided to go back to SlaveTatsSE, but it's now buggy as hell and runs every time I load a save and asks me to wait until SlaveTats is done with my character. I'm not sure if this is an AE issue or because I changed mid game, since this is my first time playing with AE.

 

EDIT: Okay, now it's working through SlaveTats MCM, but CatMenu is still not working. It's interesting that in the MCM it shows that I applied the tattoo, but it only shows on the body if I enter the MCM, then exit. Or is that the intended purpose?

Edited by terratorrent
  • 2 weeks later...
Posted
On 1/21/2026 at 8:54 AM, terratorrent said:

I have some weird issues with this mod. When using CatMenu the tattoo won't get applied for some reason, even though the pop-up message said that "operation was successful" or something like that. It once appeared randomly after a solo sex animation.

 

So I tried going the "Original SlaveTats Papyrus" route, but with that I'm not sure what I should copy or cut. Is it the .pex and .psc files? Because I then copied them into the SlaveTatsNG folder, overrode 8 files, but the MCM menu still doesn't show up.

 

So then I decided to go back to SlaveTatsSE, but it's now buggy as hell and runs every time I load a save and asks me to wait until SlaveTats is done with my character. I'm not sure if this is an AE issue or because I changed mid game, since this is my first time playing with AE.

 

EDIT: Okay, now it's working through SlaveTats MCM, but CatMenu is still not working. It's interesting that in the MCM it shows that I applied the tattoo, but it only shows on the body if I enter the MCM, then exit. Or is that the intended purpose?

 

In the CatMenu gui you must press "Synchronize visuals" for the graphics to show up (sorry, difficult to keep multiple controls in sync, I only know the actor the tattoo has to be applied to in the parent window; maybe some day I restructure the code, but it works, so not very interested in doing so)

Posted

so when i have this mod enabled and start a new game in racemenu all the overlay tabs are completely empty and as soon as i exit racemenu the game crashes. if i disable it so i just have the old slavetats active it works fine.

  • 2 weeks later...
Posted (edited)
10 hours ago, fuchs11 said:

Ok I figured cat menu but I get blue body with it. I reverted to old mcm menu, no speed improvement

 

Ah, good! But blue body (texture not found => texture name wrong => maybe a character encoding problem, are you asian?) is strange, never had this.  Under the hood cat menu gui  is doing the same as the MCM. Speed was not the reason I wrote this. I wanted to see what's going on, i.e. what SlaveTats fields are stored in JContainers and what the NiOverride overlays actually  contain (internal (SlaveTats) and external overlays).

Edited by nopse0
Posted (edited)

I have same problem. Using YPS.

 

Every time if something changes in character - full part of body become blue, or bright blue. For example makeup, or nails color.

 

Spoiler

photo_2026-02-16_23-52-30.jpg

Edited by Strateg
image to spiler, and added more info
Posted
On 2/16/2026 at 6:53 PM, Strateg said:

I have same problem. Using YPS.

 

Every time if something changes in character - full part of body become blue, or bright blue. For example makeup, or nails color.

 

 

I think it's best, when you are adding/removing tattoos, to pause the game first, before opening the SlaveTats GUI (e.g. by opening the console before pressing 'F6'), so that no mod can add/remove overlays or SlaveTats tattoos, while the GUI is running.

 

I am currently adding some proper models to the gui, so the controls (combo boxes, etc.) of the gui itself are synchronized with each other, but this doesn't help against external changes made while the gui is running (though I re-read the NiOverride and SlaveTats data once per second, so at least the shown data shouldn't be totally outdated). 

Posted

Quick question cause I wasn't sure...


I am currently running SlaveTatsNG 0.8.1 and I see that the recent update is titled "GUI 0.2.0". Is this mod needed "in addition" to the 0.8.1 version or is it a replacement? Its confusing to me cause the install name is different from "SlaveTatsNG". I looked around for upgrade instructions but I found none (I easily could have missed something).

Thanks in advance and thanks for all your work!

Posted (edited)
15 hours ago, HintHelmetxX said:

Quick question cause I wasn't sure...


I am currently running SlaveTatsNG 0.8.1 and I see that the recent update is titled "GUI 0.2.0". Is this mod needed "in addition" to the 0.8.1 version or is it a replacement? Its confusing to me cause the install name is different from "SlaveTatsNG". I looked around for upgrade instructions but I found none (I easily could have missed something).

Thanks in advance and thanks for all your work!

 

No, it's just a gui (like the MCM), completely optional. If you want to try it, you also need CatMenu from NexusMods (Ps: Easy to overlook, but it's written somewhere on the Catmenu site, you have to copy it's 'imgui.dll' into the Skyrim folder, otherwise game crashes on start).

Edited by nopse0
Posted (edited)

Can you upload GUI version 0.1.1 again on the site? The mod is needed for some modlist to be installed

Edited by SIKguy

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