Home › Mods › Skyrim › Adult Mods › SlaveTats

SlaveTats

SlaveTats

 

A toolkit for tattoos in Skyrim

Latest update (2022-09-08): Version 1.3.9 SE uploaded (please note: SlaveTats is now ESL-flagged)

Features:
With SlaveTats, you can:

  • Pick tattoos for your player character
  • Pick tattoos for NPCs (named NPCs work best)
  • Set the color of your tattoos
  • Give tattoos a glow-in-the-dark effect
  • Use either a matte or glossy finish
  • Use magical tattoos, such as those in the Dibellan Defender tattoo pack
  • Install or remove tattoo packs without touching the SlaveTats source code or compiling anything.
  • As a mod author, lock tattoos onto characters so only a mod can remove them.
  • Adjust the overlay count in nioverride.ini, and SlaveTats will adjust its available tattoo slots to match.


For users:
Here’s how to get started.

  1. Check that you have the required mods:

    1. Legendary Edition: JContainers, RaceMenu (or NetImmerse Override), SkyUI, and SKSE.
    2. Special Edition: JContainers, RaceMenu, SkyUI, and SKSE SE
  2. Download SlaveTats and extract it into Skyrim’s data folder. I’d recommend Mod Organizer or Nexus Mod Manager to make installation easier, though opening the archive with 7-Zip works too.
  3. Launch Skyrim and look for SlaveTats in SkyUI’s Mod Configuration Menu.
  4. Open the Setup tab and choose the character who will wear the tattoos.
  5. Select a tattoo section, then pick a tattoo from it.

    1. Adjust the color, glow, and gloss to taste, or stick with the defaults.
  6. In version 1.3.5 and later, click the add/remove button in the setup section of the SlaveTats MCM whenever you add or remove tattoo packs. This lets SlaveTats rebuild its index of installed tattoos.

[*]Close the SlaveTats menu and give it a moment. Your tattoos will appear shortly.


The bundled tattoo selection is quite small. To expand it, grab some tattoo packs from the download page—there are plenty to choose from. Install whichever ones you like the same way you installed SlaveTats, and they’ll add more tattoos to your selection.

These tattoo packs are available in the download section:

 
  • Rutah-art: 49 artistic, non-sexual tattoos made by Rutah. Original available at http://www.nexusmods.com/skyrim/mods/49979/?
  • Rutah-nordic: A Nordic-themed, non-sexual tattoo set from Rutah. Original available at http://www.nexusmods.com/skyrim/mods/49853/?
  • Joomla-Slutty tats: Joomla’s tattoos celebrating sexual availability—just what the name suggests.
  • ElfMeetOrc: Elf- and orc-themed tattoos made by Androol.
  • AndroolSub: More submissive-themed tattoos from Androol.
  • AndroolSlut: Extra slut marks made by Androol.
  • AndroolPetPlay: More pet play tattoos from Androol, with special cow spots for several races.
  • DocClox-civilwar: Cheek tattoos featuring Imperial and Stormcloak logos.
  • Tattoo Pack_CN: Tattoos in Chinese, prepared by silentdark.
  • Slavetats-preg: Pregnancy-themed tattoos made by Trojice.
  • Doomsman-Denial: Tattoos that pair well with a chastity belt.
  • B3lisario-stockings: A selection of pantyhose and body stockings.
  • NYINEGY-makeup: Makeup including lipstick, eye shadow, nail paint, and beauty marks; mostly intended for CBBE.
  • SlaveTats-anal: Anal sex-themed tattoos.
  • SlaveTats-brat: Marks a brat might earn—or enjoy wearing. It’s a small pack at the moment, and contributions are welcome.
  • SlaveTats-criminal: Marks identifying the wearer as a criminal.
  • SlaveTats-dominant: Dom-themed tattoos.
  • SlaveTats-draconic: Tattoos written in the dragon language.
  • SlaveTats-makeup: Makeup options including nail paint and running mascara.
  • SlaveTats-petplay: Cat, cow, and similar pet play tattoos. This pack is small too, and could use contributions.
  • SlaveTats-property: Marks showing that the wearer is owned.
  • SlaveTats-scrawl: Humiliating tattoos for the wearer.
  • SlaveTats-slut: Marks that advertise or celebrate sluttishness (updated 2015-02-11).
  • SlaveTats-sm: S&M-themed tattoos.
  • SlaveTats-submissive: Marks that advertise or celebrate submissiveness.
  • SlaveTats-symbols: Tattoos without text.
  • SlaveTats-whore: Marks offering sex with the wearer for a price.
  • SlaveTats-zoo: Animal-related tattoos.
  • vampy_tats: DocClox’s vampire-themed tattoos.

 

You can find more tattoo packs on these external pages:

 

 

Translations:

Files with names ending in _CN contain the Chinese translation. Don’t install these files unless you speak Chinese.
感谢silentdark提供汉化。下载页面上以_CN结尾的文件就是中文版。

For artists:
Putting together your own tattoo pack is straightforward.

 

(Thanks to oli3d for this handy guide on avoiding UV distortion while making tattoos)

  1. Start with a UV map. In practice, you need the skin texture from the body mod you want to use. I use the UNP UV map myself.
  2. Open a copy of that skin texture in an image editor with layer support, such as Photoshop or GIMP.
  3. Set your drawing color to #444544. When the tattoo is applied, this color is replaced with the user’s selected color. Any other colors stay as they are.
  4. Draw the tattoo on a separate layer above the skin texture, keeping the background of that layer transparent.
  5. Export only the tattoo layer as a DDS file with transparency. Do NOT include the skin texture.
  6. Make a folder named TexturesActorsCharacterslavetatsyourthing somewhere convenient, such as your desktop. Don’t put it in Skyrim’s Data folder yet.
  7. Copy the DDS file into TexturesActorsCharacterslavetatsyourthing
  8. Make a text file named TexturesActorsCharacterslavetatsyourthing.json and put a tattoo registry for your DDS file in it. More on registries below.
  9. Package the Textures folder in a .zip or .7z archive.


Your texture pack is ready to install or share. A pack can contain multiple tattoos: put the extra files in the yourthing folder and give each one an entry in yourthing.json.

A tattoo registry tells SlaveTats the tattoo’s name, where to list it in the menus, and which general body area it belongs on. An example makes this clearer. Here’s anal.json from the SlaveTats-anal tattoo pack:

[    {"name": "Fist Hole (ass)", "section":"Anal", "texture":"anal\ass_fist_hole.dds", "area":"Body"},    {"name": "Anal Slut", "section":"Anal", "texture":"anal\butt_anal_slut_raz.dds", "area":"Body", "credit":"Raziel_br"},    {"name": "Butt Slut", "section":"Anal", "texture":"anal\butt_butt_slut_zqzqz.dds", "area":"Body", "credit":"zqzqz"},    {"name": "This Anus Open...", "section":"Anal", "texture":"anal\this_anus_open.dds", "area":"Body"}]


Each tattoo description must include “name”, “section”, “texture”, and “area”. The “area” value must be “Body”, “Face”, “Hands”, or “Feet”. Beyond those required entries, you can add as many entries to a description as you need, and a registry can hold as many tattoo descriptions as you like.

 


Made a tattoo pack and want it included in the SlaveTats download section? Send me a private message.

For modders:
SlaveTats now has an API for adding, removing, and searching for tattoos. It handles the overlays for you, with support for tattoo packs and enchanted tattoos built in. You’ll find both the documentation and implementation in SlaveTats.psc. Feel free to PM murfk if you’d like to talk about it.

The high-level API covers plenty of use cases with very little setup.

 


Use this to add one tattoo to the player:

SlaveTats.simple_add_tattoo(Game.GetPlayer(), "Slave Marks", "Slave (pubic)")


To take that tattoo off:

SlaveTats.simple_remove_tattoo(Game.GetPlayer(), "Slave Marks", "Slave (pubic)")


To set the tattoo’s color, pass its numeric color value as the fourth parameter of simple_add_tattoo. The default is 0, or black.

 

Need finer control? This example shows the low-level SlaveTats API in use:

 
Actor target = Game.GetPlayer()int matches = 0int template = 0int tattoo = 0matches = JValue.addToPool(JArray.object(), "SlaveTatsDemo")template = JValue.addToPool(JValue.objectFromPrototype("{"name": "Slave (pubic)", "section":"Slave Marks"}"), "SlaveTatsDemo")if SlaveTats.query_available_tattoos(template, matches)	Debug.Notification("Query 1 Failed")	JValue.cleanPool("SlaveTatsDemo")	returnendiftattoo = JArray.getObj(matches, 0)    if SlaveTats.add_tattoo(target, tattoo)	Debug.Notification("Add 1 failed")	JValue.cleanPool("SlaveTatsDemo")	returnendifmatches = JValue.addToPool(JArray.object(), "SlaveTatsDemo")template = JValue.addToPool(JValue.objectFromPrototype("{"name": "Slave (left breast)", "section":"Slave Marks"}"), "SlaveTatsDemo")if SlaveTats.query_available_tattoos(template, matches)	Debug.Notification("Query 2 Failed")	JValue.cleanPool("SlaveTatsDemo")	returnendiftattoo = JArray.getObj(matches, 0)JMap.setInt(tattoo, "color", 11536724)if SlaveTats.add_tattoo(target, tattoo)	Debug.Notification("Add 2 failed")	JValue.cleanPool("SlaveTatsDemo")	returnendif    if SlaveTats.synchronize_tattoos(target)	Debug.Notification("Synchronization failed")	JValue.cleanPool("SlaveTatsDemo")	returnendif    JValue.cleanPool("SlaveTatsDemo")