Jump to content

Recommended Posts

Posted
3 hours ago, muhavaux33 said:

Can you please list in the mod's description page what game version this was made for? Thank you

I did:

"Uses CommonLibSSE-NG, so it should run on all major Skyrim versions + Gog (I tested myself on 1.6.1170 and 1.5.97)"

 

First it didn't work on VR, and GOG 1.6.1179, but with some help from the community it does now (at least I heard no complaints anymore)

Posted

i have a little of the same question.  Do we keep the OG Slavetats mod installed and overwrite with this one, or delete the Slavetats mod and install just this one?

Posted
7 hours ago, WCSC said:

i have a little of the same question.  Do we keep the OG Slavetats mod installed and overwrite with this one, or delete the Slavetats mod and install just this one?

Was asked multiple times, will put it in the mods description, so this is clearer.

The regular SlaveTats is required for the MCM (.esp + SlaveTatsMCMMenu.psc)

Posted
On 9/23/2024 at 6:35 PM, nopse0 said:

Edit: Remove the double entries in the MCM (which don't start with "STA_"), then it works Ok.

 

I think the reason for the problem is, that I renamed the pattern names, so that they are the same as the texture names (I thought this is less confusing, because SlaveTats identifies what tattoos you have on your body by the texture names, not the pattern names). Didn't think on, that the entries with the old names still stay in the JContainer database.

Thank you for your detailed explanations (and the mod of course 🙂 )! Removing the double entries in the MCM seems to have solved the issue so far!

 

Regarding these Spank That Ass overlay settings (intensity), should they still be working with your SlaveTats/SpankThatAss patch?

image.png.b32a42d9695dd1a1157bd6cd4712347c.png

Posted
On 9/24/2024 at 10:15 AM, nopse0 said:

No, normally it shouldn't cause any freezes, I have fade tattoos and rape tattoos installed, too, and have no problems. Also the number of tattoos doesn't matter with SlaveTats-NG, I have 120 overlay slots, and no problems, I think, the number of tattoos is only limited by how many textures your graphics card can render. I think your problem is cum overlays, I had the same problems, if you enter a new cell, and it tries to apply persistent cum overlays to npc's which aren't completely loaded yet, it crashes or freezes. It also crashes, if it applies cum overlays in sex scenes initiated by RandomSex-NG, and it often makes actors invisible after sex scenes, it must have a timing/concurrency problem, and now with the increased speed of SlaveTats, it also has a problem with SlaveTats. I would deinstall it (the SexLab cum textures doesn't look that bad, I find). But I fear you have to start a new game after deinstalling cum overlays, at least I didn't manage to continue my savegame after that. But at least for me this solved all stability problems, and with the increased speed of SlaveTats-NG, my Skyrim is as solid as a rock, didn't have a ctd/freeze for a month, or so

Thanks very much, I think you were completely right about cum overlays. I'm not getting any crashes or freezes on cell change anymore. That being said, now I have a different problem--opening the SlaveTats MCM crashes my game immediately. Any ideas for an obvious solution to that problem where I've done something stupid to cause it?

Posted (edited)
On 9/26/2024 at 1:43 AM, superbongo330 said:

Thanks very much, I think you were completely right about cum overlays. I'm not getting any crashes or freezes on cell change anymore. That being said, now I have a different problem--opening the SlaveTats MCM crashes my game immediately. Any ideas for an obvious solution to that problem where I've done something stupid to cause it?

Immediate crash, hmm, this sounds as if something is wrong with the native functions addresses. Are you on VR and not using the latest 0.6 version ? I had miscalculated the address of one function (GetNodeOverrideString, used the address of the AddNodeOverrideString function for that, so the program crashed in the MCM when trying to evaluate what "GetNodeOverrideString" returns).

 

Edit: Anyway, you get this crash, when the NiOverride function addresses are wrong. Which version of Skyrim and RaceMenu are you using ? Can you post SlaveTatsNG.log ? (in your home directory in "Documents\My Games\Skyrim Special Edition\SKSE")  

Edited by nopse0
Posted (edited)
On 9/25/2024 at 9:31 AM, Gudulba said:

Regarding these Spank That Ass overlay settings (intensity), should they still be working with your SlaveTats/SpankThatAss patch?

 

Yes, they should, the intensity is calculated  by S.T.A., and then it calls the UpdateAlpha() function with a changed alpha (opaqueness) value.  I only changed the UpdateAlpha() function to apply SlaveTats tattoos with these alpha values instead of manipulating NiOverride overlays, this should have no effect on the intensity calculations of STA.

Edited by nopse0
Posted
On 9/21/2024 at 11:21 PM, Arcane Wanderer said:

If you need a listener to fire events, I'd think one listener would be enough.   Maybe driven by a modevent or .PO3's RegisterForMagicEffectApplyEx() which seems very efficient...

About these mod events, I played around a bit and found a way. I put the event data (section, texture name and actor form) into a JMap, and send the id of the JMap as a simple mod event. Simple mod events have a string and a number field, but the number field is a float field, so it cannot be used for 32 bit int's, so I put the id into the string, you have to use powerofthrees PapyrusExtender StringToInt function to get the id again. This looks like this:

Scriptname ModEventTest_PlayerRefScript extends ReferenceAlias  

Event OnPlayerLoadGame()
	Debug.Trace("OnPlayerLoadGame called.")
	Debug.Trace("Registering mod event handlers.")
	RegisterForModEvent("SlaveTatsNG-added", "OnTattooAdded")
	RegisterForModEvent("SlaveTatsNG-removed", "OnTattooRemoved")
	Debug.Trace("Finished mod event handler registration.")
EndEvent

Event OnTattooAdded(String eventName, String stringArg, Float numberArg, Form formArg)
	Debug.Trace("OnTattooAdded started")
	Int eventId = PO3_SKSEFunctions.StringToInt(stringArg)
	String section = JMap.getStr(eventId, "section")
	String name = JMap.getStr(eventId, "name")
	Form aForm = JMap.getForm(eventId, "form")
	Debug.Trace("OnTattoAdded: eventId = " + eventId + ", eventName = " + eventName + ", section = " + section + ", name = " + name + ", form = " + aForm)
EndEvent

Event OnTattooRemoved(String eventName, String stringArg, Float numberArg, Form formArg)
	Debug.Trace("OnTattooRemoved started.")
	Int eventId = PO3_SKSEFunctions.StringToInt(stringArg)
	String section = JMap.getStr(eventId, "section")
	String name = JMap.getStr(eventId, "name")
	Form aForm = JMap.getForm(eventId, "form")
	Debug.Trace("OnTattoRemoved: eventId = " + eventId + ", eventName = " + eventName + ", section = " + section + ", name = " + name + ", form = " + aForm)
EndEvent

 

To prevent that the JMap's get garbage collected before they are processed, I put them into some sort of cache (JArray with a fixed size).

 

But I don't know, if these mod events are really useful, because you get a lot of them, e.g. if you are using 100 overlay slots for tattoos, each synchronize_tattoos call produces 100 events (Slavetats-added/SlaveTats-removed), that's a lot, especially if tattoos are often reapplied with different alpha values.

 

 

Posted (edited)
On 9/27/2024 at 12:17 PM, nopse0 said:

About these mod events, I played around a bit and found a way. I put the event data (section, texture name and actor form) into a JMap, and send the id of the JMap as a simple mod event. Simple mod events have a string and a number field, but the number field is a float field, so it cannot be used for 32 bit int's, so I put the id into the string, you have to use powerofthrees PapyrusExtender StringToInt function to get the id again.  [ ... ]

 

 

 

 

Sure, floats cannot accurately represent all integers.   I'm not sure if Skyrim uses 32 bit floats or 64 bit floats.  However, the first integer that *cannot* be represented by even a 32 bit float is 16,777,217 (224 + 1).   Nobody has *that* many tats!  So, you'd be save in converting your integers to floats and it will be more efficient for the papyrus consumers.

 

EDIT:  I have a *very* vague memory that mod events can use integers?  Maybe the language is sloppy enough with types that it "just works" as long as both the producer and consumer treat the argument as an integer?

Edited by Arcane Wanderer
Posted
On 9/27/2024 at 12:17 PM, nopse0 said:

[ ... ]

But I don't know, if these mod events are really useful, because you get a lot of them, e.g. if you are using 100 overlay slots for tattoos, each synchronize_tattoos call produces 100 events (Slavetats-added/SlaveTats-removed), that's a lot, especially if tattoos are often reapplied with different alpha values.

 

 

 

I would say that It's a pity the original SlaveTats was designed for one modevent per tat, but it probably made sense at the time.

 

I guess you could add some new mod events that better represent what mods need.  I'm not sure what exactly it is that mods might be able to use instead.  Maybe just a notification when a body area changes to/from any tattoos to no tattoos?  Maybe an event only for a specific tat?  But, even if you went to the effort of examining the various mods that use events and designed something less intense, you'd probably have to do the updates to those mods yourself.   Maybe an idea to keep on the back burner in the event anyone actually ever experiences performance problems with too many tats combined with mods that listen for events...

Posted (edited)
3 hours ago, Arcane Wanderer said:

 

Sure, floats cannot accurately represent all integers.   I'm not sure if Skyrim uses 32 bit floats or 64 bit floats.  However, the first integer that *cannot* be represented by even a 32 bit float is 16,777,217 (224 + 1).   Nobody has *that* many tats!  So, you'd be save in converting your integers to floats and it will be more efficient for the papyrus consumers.

 

EDIT:  I have a *very* vague memory that mod events can use integers?  Maybe the language is sloppy enough with types that it "just works" as long as both the producer and consumer treat the argument as an integer?

I tried it, if you declare the event handler as "OnTattooAdded(String eventName, String stringArg, Int numberArg, Form formArg)", the Papyrus compiler throws an error, something like "wrong parameter type" or so (because the event handler prototype is already defined in Actor.psc (or so), the Papyrus compiler knows that "Int" is the wrong type for a mod event handler), so a simple reinterpation as an Int is not possible. Btw., in c++ you can simply reinterpret a memory location as something else of the same size with "bit_cast" (since C++20), so in c++ this would be no problem:

float f = std::bit_cast<float>(a_int);
int i = std::bit_cast<int>(a_float);

And if I put the bits of an int into the float parameter, the Papyrus script often crashes at runtime with an "invalid float number" (or so) exception, if I do a:

Int i = numberArg as Int

 because a lot of valid int's, especially the low ones,  are no valid floats if their bits are reinterpreted as a float (and even if they are valid, the value of the float is different).   So, the parameter really has to be a float, no other way.

And Papyrus uses single precision floats (1 sign bit, 23 mantissa bits, 8 exponent bits). And SlaveTats and other mods often store data temporarily in JContainers, so the JMap, JArray, etc. id's go up quickly, 23 bits isn't enough to represent these id's.

Edit: If thinking about this, I wonder how JContainers manages, which id's are used and which id's are unused, because when the 32 bit integers overflows, and the id's start with 1 again, this question becomes relevant. I guess, it uses some sort of range tree, like the one used in the memory  heap management of the C runtime.

Edited by nopse0
  • 4 weeks later...
Posted

Just wanted to express my appreciation that you were able to get this to work in VR.  I've been using it for a bit and it is instantaneous!  That's amazing!  Well done good ser, you are a gentleman and a scholar!

Posted

This works pretty well. I just want to comment that I can see a measurable difference while playing with my Licenses mod.

 

With Licenses' cursed collar, I attach an enchantment directly to a Devious Device collar that applies and removes tattoos with OnEffect events. With vanilla SlaveTats, due to the lag in which Devious Devices tries to re-equip an inventory device for the message box event, the ST tattoos disappear but reappear with some parts missing - possible due to overlap of the removal's OnEffectEnd and the following re-equip's OnEffectStart events. With SlaveTatsNG, the tattoos are always re-applied correctly.

Posted
On 10/23/2024 at 8:30 AM, kamithemoon said:

Just wanted to express my appreciation that you were able to get this to work in VR.  I've been using it for a bit and it is instantaneous!  That's amazing!  Well done good ser, you are a gentleman and a scholar!

Thank you, glad to hear that it works. I just wanted to say, it's really incredible how fast modern computers and how highly optimizing modern compilers are. I noticed this when I was bug hunting and debugged through the SlaveTats code. There happens a lot in synchronize_tattoos (with 100-200 tattoos), SlaveTats itself, JContainers, NiOveride, SpeedLog, etc., but for the machine and the compiler, this is nothing, hardly needs a millisecond for that. If you have e.g. a machine with ~5 gigahertz, it can execute about 1 billion (10^9) machine instructions per seconds, and this on 16-32 cores! That's an enormous computation power, still not enough for artificial intelligence, but we are getting closer. 

  • 2 weeks later...
Posted

Small issue: I had my tattoos applied to my character through an item's attached oneffectstart. When loading a previous save without said item, the tattoos aren't removed. To resolve this issue, I have to return to main menu before loading this previous save. Is there any fix that can be implemented into SlaveTatsNG?

 

Not too high of a priority, I imagine, since loading previous saves isn't the healthiest thing anyway.

Posted

No, even though I like to pretend I do, I know almost nothing about the internals of Skyrim :)

You mean the NiOverride overlay is still applied after loading the previous save, it appears as an external overlay in the MCM then, right ? I think that's a bug in Skyrim, it doesn't reset everything when save games are loaded. Sometimes even exiting to the main menu doesn't help, because, I think, some data is stored in the compiled shaders, and you have to restart Skyrim. And sometimes even restarting Skyrim isn't enough, and you have to restart MO2 as well, because MO2 has it's quirks, too (the VFS, perhaps?), until everything gets properly updated.

Posted

If the patch turns the spanking overlays to SlaveTats, won't that mean RapeTats will have very little chance of adding a tattoo over it? Can't see the benefit, unless it's pure performance.

Posted
On 11/6/2024 at 3:12 AM, OmniCaptor said:

If the patch turns the spanking overlays to SlaveTats, won't that mean RapeTats will have very little chance of adding a tattoo over it? Can't see the benefit, unless it's pure performance.

No, the tattoos are visible, even if they are all applied on top of each other, the spanking tattoos are transparent, you can see what's below them. I am using Rape Tattoos Continued, Fade Tattoos Continued, Bathing in Skyrim and Apropos2 (did I forgot something?) and everything is visible. In the screenshot below you can see the spank tattoo, a rape tattoo ("Fuck Me", already very faded), and a lot of dirt from Bathing in Skyrim

489830_20241107043613_1.png

Posted
22 hours ago, nopse0 said:

No, the tattoos are visible, even if they are all applied on top of each other, the spanking tattoos are transparent, you can see what's below them. I am using Rape Tattoos Continued, Fade Tattoos Continued, Bathing in Skyrim and Apropos2 (did I forgot something?) and everything is visible. In the screenshot below you can see the spank tattoo, a rape tattoo ("Fuck Me", already very faded), and a lot of dirt from Bathing in Skyrim

489830_20241107043613_1.png

 

Yes, they are visible but you mistunderstand me. In my experience(and I recall reading about it) it's less likely that RapeTats place a Tattoo in areas that already have a tattoo in SlaveTats. It scans your body slots and tends to picks one that is empty, if it can find one. Otherwise it places tattoos on top of eachother, but it can happen anyway. It's just a bit random really. Seeing that you are not the author of RapeTats, I don't expect you to know how it works.

Posted

just switched to this mod after I got tired of all the 'warning access to non-existing object' alerts in the console, maybe caused by Fast_Tats, and I'm very glad this mod got rid of it

 

BUT there is a little problem when using Bimbos of Skyrim, when PC turns into a bimbo she is supposed to get tattoos but they never appear, that was never an issue with Fast_Tats so I'm wondering if this mod is missing something that makes it compatible or if its on BoS's side of things

Posted (edited)
14 hours ago, kjergaard said:

just switched to this mod after I got tired of all the 'warning access to non-existing object' alerts in the console, maybe caused by Fast_Tats, and I'm very glad this mod got rid of it

 

BUT there is a little problem when using Bimbos of Skyrim, when PC turns into a bimbo she is supposed to get tattoos but they never appear, that was never an issue with Fast_Tats so I'm wondering if this mod is missing something that makes it compatible or if its on BoS's side of things

 

The only thing which is missing is, that mod events are send when tattoos are added/removed, and that magic effects can be added/removed via tattoos (but only a few old mods are using this,  Deviously Enslaved Continued, and State of Dress as I heard). I downloaded BoS and had a look at the source scripts ("findstr -in slavetats *.psc"), and only see the 3 standard function calls, simple_add_tattoo, simple_remove_tattoo and synchronize_tattoos, nothing with mod events.

 

Are you sure you did a "Add/remove tattoos" in the SlaveTats MCM after you installed BoS (forgetting this is a common mistake after having installed a new tattoo pack) ? Otherwise SlaveTats doesn't know about the tattoos, and applying them fails. Or maybe your JContainers is screwed up, if you have used FastTats before. Can you test if it works with a new game ? 

  

Edited by nopse0
Posted
18 hours ago, nopse0 said:

 

The only thing which is missing is, that mod events are send when tattoos are added/removed, and that magic effects can be added/removed via tattoos (but only a few old mods are using this,  Deviously Enslaved Continued, and State of Dress as I heard). I downloaded BoS and had a look at the source scripts ("findstr -in slavetats *.psc"), and only see the 3 standard function calls, simple_add_tattoo, simple_remove_tattoo and synchronize_tattoos, nothing with mod events.

 

Are you sure you did a "Add/remove tattoos" in the SlaveTats MCM after you installed BoS (forgetting this is a common mistake after having installed a new tattoo pack) ? Otherwise SlaveTats doesn't know about the tattoos, and applying them fails. Or maybe your JContainers is screwed up, if you have used FastTats before. Can you test if it works with a new game ? 

  

thx for the response

I have the latest version of JContainers and I'm pretty sure I made a new game after installing your mod as I try to make a habit of doing so when installing new mods but I'll try again to be sure
Do I still need to "Add/remove tattoos" in the SlaveTats MCM when making a new game? I haven't needed to before

Posted (edited)
1 hour ago, kjergaard said:

thx for the response

I have the latest version of JContainers and I'm pretty sure I made a new game after installing your mod as I try to make a habit of doing so when installing new mods but I'll try again to be sure
Do I still need to "Add/remove tattoos" in the SlaveTats MCM when making a new game? I haven't needed to before

 

No, doing "Add/remove tattoos" once after having installed/deinstalled a tattoo pack is enough, then the file "Data/slavetats_cache.json" gets updated and contains all installed tattoo packs (hasn't to be done per player). Do you see the BoS tattoos in the SlaveTats MCM, and what happens if you apply them from the MCM ?

 

(CC_Tats.json from BoS looks like this:

[
 {
   "name": "CC Bimbo Fingernails",
   "section": "CC Tats",
   "texture": "CC_Tats\\CC_Fingernails.dds",
   "area": "Hands"
 },
 {
   "name": "CC Bimbo Toenails",
   "section": "CC Tats",
   "texture": "CC_Tats\\CC_Toenails.dds",
   "area": "Feet"
 },
 {
   "name": "CC Bimbo Eyeshadow",
   "section": "CC Tats",
   "texture": "CC_Tats\\CC_Eyeshadow.dds",
   "area": "Face"
 },
 {
   "name":

)

 

Screenshot 2024-09-08 074153.png

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
×
×
  • Create New...