> For the complete documentation index, see [llms.txt](https://sebun1.gitbook.io/skins/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sebun1.gitbook.io/skins/editor/creating-skin-groups.md).

# Creating Skin Groups

{% hint style="success" icon="arrows-rotate" %}
This page is up to date with editor version `v1.2.7`\
Features in future versions might not be mentioned here.
{% endhint %}

## It starts with a folder

Each Skin Group needs to live inside a folder, this folder will eventually end up in someone's skin library folder and be used.

In the editor, click on the <kbd>Add Project</kbd> button. This will bring up a folder selection window — navigate to which folder you want the this Skin Group to live and confirm.

<figure><img src="/files/weafJ4n5LPaxAGEK8LjX" alt="" width="369"><figcaption></figcaption></figure>

{% hint style="info" icon="folder-tree" %}
I usually create a new folder inside my [global skins folder](/skins/schema/skin-group.md#folder-structure) for my Skin Group so I can make changes and reload it immediately in game.
{% endhint %}

{% hint style="info" icon="input-text" %}
It is also preferable to use the GUID you have in mind for the folder name, so when the the games performs a load of your skin group, the folder name will not shift due to normalization. This is not a necessity, you can always relocate your Skin Group folder in the editor.
{% endhint %}

After selecting the folder for your Skin Group, you should see it show up in the sidebar. It should display the same name as your folder name. Here, I named my folder `food.MyNewSkin`. Click on the entry to open it.

<figure><img src="/files/A5EwrbDQ7fVsot8mUKxz" alt=""><figcaption></figcaption></figure>

## Identity

It is now time to given this Skin Group an identity. Fill in the name and author and optionally the description for this Skin Group under Identity.

The GUID [should be auto-filled to the folder name](#user-content-fn-1)[^1]. If not, or if the folder name is not what you want for the GUID, change it to your desired GUID.

Click <kbd>Save</kbd> or hit <kbd>⌘/Ctrl</kbd> + <kbd>S</kbd> and save your changes.

<figure><img src="/files/NGcNYShI8sWzOvwDrChn" alt=""><figcaption></figcaption></figure>

### Localization

You can choose to localize the information to different languages. This allows users to see different languages based on their in-game language settings when selecting this Skin Group.

<figure><img src="/files/0z3idK6AOnCzk34jMRiZ" alt="" width="563"><figcaption></figcaption></figure>

Do note that the first entry is the primary locale. That is to say, it is used when the game language set by a user does not have a localization version defined in the Skin Group. Say the user's game language is Russian, then they would see "My New Skin!" as the name for the Skin Group in their skin selection screen.

## Filters

Arguably the most important part of the Skin Group manifest — without it, this Skin Group won't show up anywhere.

At the time of writing, there are two types of filters:

1. `OfflineGearPersistentID` — This targets a specific [OfflineGear](https://gtfo-modding.gitbook.io/wiki/reference/datablocks/main/playerofflinegear) (in short these are things the player can equip); it is the primary means of specifying that a Skin Group applies to a particular weapon.
2. `RundownName` — This filters a specific name of a Rundown. This exists because custom gears in some rundowns might have a different PersistentID. If you want to fine tune your filter to accurately target some rundowns, you can utilize this filter type.

Additional filters might be added in the future, refer to [Skin Group](/skins/schema/skin-group.md#filter-types) for any additional filters.

### Filter Organization

The skin group is available/matched when any of the filter groups match. A filter group is represented here as a block with the title "ALL OF" which means all of the conditions within the group must be satisfied for the group to match. You can also see that the groups are separated by an OR bar to indicate the relation that only one of the groups needs to be satisfied for the filter to match.

The following filters will match either "Omenco LRG" (HEL Rifle) or "Attroc Titanium" (Bat).

<figure><img src="/files/hN3fFUuPdX8hYtOf0sgE" alt="" width="563"><figcaption></figcaption></figure>

In a more technical sense, the filters are a [DNF](https://en.wikipedia.org/wiki/Disjunctive_normal_form) — this was chosen over CNF to provide a more natural way of expression where each group would represent a scenario instead of a requirement. For more details on this, refer to [Skin Group](/skins/schema/skin-group.md#filters).

### `OfflineGearPersistentID`

Finding the Persistent ID requires either looking at the `PlayerOfflineGear` datablock or looking at the `GearIDRange` object in-game. Luckily, the editor provides a easy way to locate these IDs — the data is from a dump that is generated at game startup so it's guaranteed to be accurate.

{% hint style="info" %}
The dump also includes gear from modded rundowns, so if you launch the game with a modded rundown and the Skins mod, gear information for that rundown will also be dumped for use in the editor.
{% endhint %}

First click on the <i class="fa-magnifying-glass">:magnifying-glass:</i> button next to the value field, this will open up a selection window.

<figure><img src="/files/I3fFaqOzfNbcSclmN7ap" alt="" width="563"><figcaption></figcaption></figure>

Now search for the name of the gun you want to target. In my case I want to modify the HEL Rifle with the [name Omneco LRG](#user-content-fn-2)[^2], so I search for that, simply select the entry.

<div align="center"><figure><img src="/files/Qy32ONtKvU3HuznMAQQA" alt="" width="375"><figcaption></figcaption></figure></div>

The ID for the gear will be filled into the value field, with the name of the ID displayed on the right side of the value field.

<figure><img src="/files/yNpTLzgI7j9bJSg5CDTJ" alt="" width="563"><figcaption></figcaption></figure>

Now, this filter successfully includes HEL Rifle ("Omneco LRG") as a gear that our Skin Group targets.

### `RundownName`

As mentioned before, we can use RundownName to customize behavior for specific rundowns. This is possibly rarely useful. There are, however, a few realistic scenarios.

{% hint style="info" %}
The `RundownName` is taken from the folder name of the datablocks folder loaded by MTFO — this depends entirely on how the rundown dev structured their folders and how the mod folder is named/created. Regardless, Skins obtains the RundownName via

```cs
RundownName = Path.GetFileName(MTFO.API.MTFOPathAPI.RundownPath);
```

{% endhint %}

***

If you know a particular rundown differs from vanilla, you can exclude them when selecting gear with a particular OfflineGearPersistentID. In the following case, say the Rundown `weirdo1-RundownA` and `weirdo2-RundownB` have gear of id 42 heavily differ from the gear you have in mind to customize, they are excluded from being matched.

<figure><img src="/files/cDol23xo1FTgVAnbP9qk" alt="" width="563"><figcaption></figcaption></figure>

***

If you know for sure you only want vanilla clients to see this Skin Group with a gear you could click the <i class="fa-rotate-right">:rotate-right:</i> button next to the value field to set it to the internal vanilla rundown name, which is `__vanilla__`.&#x20;

<figure><img src="/files/fnVfvuczvjSjnOj7U23M" alt="" width="563"><figcaption></figcaption></figure>

***

You could also use the `RundownName` filter by itself, but I haven't figured out a scenario where that is useful. All in all, use the tools as you will. The filters can be combined flexibly so you have the freedom.

This is, however, a complicated filter. It can sometimes do more harm than good, since users can just gauge whether a skin is displaying well or not (perhaps they would even want to keep it partly incomplete in some cases rather than having nothing). Know that the user can always turn it off easily if they want.

[^1]: This behavior is only present in editor versions ≥ 1.2.7, before which, a randomly generated UUID is filled instead. This is almost always undesirable, as it says nothing about your Skin Group.

[^2]: If you can't remember the name of a gun in vanilla, you can search it up in the gtfo wiki.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sebun1.gitbook.io/skins/editor/creating-skin-groups.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
