ItemVestAsset — Vest Clothing Definition
Overview
ItemVestAsset defines a wearable vest/body armor item in Unturned. It inherits from ItemBagAsset (storage dimensions), which inherits from ItemClothingAsset (armor, proof system, movement speed), which inherits from ItemAsset. Vests are one of the most functionally important clothing items: they are one of four slot types eligible for armor damage reduction, they support inventory storage, they load a 3D prefab, and they have a unique fallback shirt system.
The fallback shirt system is a vest-specific feature that addresses a visual problem: some vest models leave the player's chest exposed when no shirt is equipped. When Has_Fallback_Shirt is true, the game automatically equips a referenced shirt asset as a visual-only underlayer, ensuring the player's chest isn't bare under the vest.
Vests occupy the EItemType.VEST slot. The wear audio defaults to a zipper sound (shared with backpacks), distinguishing vests from sleeve-rustle clothing.
Source code location: Unturned/Bundles/ItemVestAsset.cs (45 lines), inheriting from ItemBagAsset.cs (52 lines), ItemClothingAsset.cs (304 lines), and ItemAsset.cs (base).
Inheritance Chain
ItemAsset
└─ ItemClothingAsset (abstract) — armor, proof, movement speed, visuals
└─ ItemBagAsset (abstract) — storage dimensions (Width, Height)
└─ ItemVestAsset — vest prefab, fallback shirt systemClass Definition
csharp
public class ItemVestAsset : ItemBagAsset
{
protected GameObject _vest;
public GameObject vest => _vest;
internal bool hasFallbackShirt;
internal CachingAssetRef fallbackShirt;
public override void PopulateAsset(in PopulateAssetParameters p) { ... }
internal override GameObject ClothingPrefab => vest;
}Vest Prefab Loading
csharp
if (!Dedicator.IsDedicatedServer)
{
_vest = loadRequiredAsset<GameObject>(p.bundle, "Vest");
if (Assets.shouldValidateAssets)
{
AssetValidation.ValidateLayersEqual(this, _vest, LayerMasks.ENEMY);
AssetValidation.ValidateClothComponents(this, _vest);
}
hasFallbackShirt = p.data.ParseBool("Has_Fallback_Shirt");
if (hasFallbackShirt)
{
fallbackShirt = p.data.ParseAssetRef("Fallback_Shirt");
}
}| Aspect | Detail |
|---|---|
| Load key | "Vest" GameObject from master bundle |
| Required | Yes — loadRequiredAsset |
| Server skip | Dedicated server skips prefab |
| Layer validation | ENEMY layer check |
| Cloth validation | Cloth component warnings |
| Fallback shirt parsing | Only on client, inside the !DedicatedServer block |
The ClothingPrefab override returns the vest:
csharp
internal override GameObject ClothingPrefab => vest;Fallback Shirt System
The fallback shirt system is vest-specific and solves a visual layering problem.
The Problem
Vest models are 3D objects that sit on top of the character's torso. Many vest models (especially "oversize vest" and "zip-up vest" types) completely cover the torso area. When a player equips one of these vests without a shirt, the player's bare torso mesh is visible through gaps in the vest model — an unintended visual result.
The Solution
The fallback shirt system automatically equips a visual-only shirt under the vest when no real shirt is present:
csharp
hasFallbackShirt = p.data.ParseBool("Has_Fallback_Shirt");
if (hasFallbackShirt)
{
fallbackShirt = p.data.ParseAssetRef("Fallback_Shirt");
}| .dat Key | Type | Default | Purpose |
|---|---|---|---|
Has_Fallback_Shirt | bool | false | Enables fallback shirt system |
Fallback_Shirt | AssetRef | null | GUID reference to the shirt asset to use as underlayer |
Runtime Behavior
When the vest is equipped:
- The game checks
hasFallbackShirt - If true and the player has no shirt in the shirt slot, the
fallbackShirtasset is resolved - The referenced shirt asset is equipped as a visual-only item — it provides no armor, no storage, and is not interactable
- The shirt appears under the vest, filling gaps and preventing skin exposure
The fallback shirt is purely visual:
- It does not occupy the shirt slot (the slot remains empty for gameplay)
- It provides no armor values (the vest handles armor)
- It provides no storage (the vest's
ItemBagAssetstorage handles inventory) - It cannot be unequipped separately from the vest
Limitations
The fallback system only loads on the client:
csharp
if (!Dedicator.IsDedicatedServer)
{
// fallback shirt parsing inside this block
}The server does not need fallback shirt data — it's purely a client-side visual feature.
Storage Dimensions (Inherited from ItemBagAsset)
Vests inherit the same storage system as shirts and pants:
| .dat Key | Type | Default | Range |
|---|---|---|---|
Width | byte | 0 | 0–255 |
Height | byte | 0 | 0–255 |
PRO items have storage forced to 0. When both dimensions are non-zero, the tooltip displays Storage: W × H.
Inherited Behavior: ItemClothingAsset
Armor System (Vests Are Eligible)
Vests are one of four slot types eligible for armor. Along with hats, shirts, and pants, vests are the only clothing that actually applies damage reduction.
The BuildDescription check for armor display:
csharp
if (type == EItemType.HAT || type == EItemType.SHIRT || type == EItemType.PANTS || type == EItemType.VEST)Wear Audio — Zipper Sound
Vests use the zipper sound (not sleeve rustle). The base ItemClothingAsset selects audio based on slot type:
csharp
if (type == EItemType.BACKPACK || type == EItemType.VEST)
{
wearAudio = new AudioReference("core.masterbundle", "Sounds/Zipper.mp3");
}
else
{
wearAudio = new AudioReference("core.masterbundle", "Sounds/Sleeve.mp3");
}The zipper audio is shared between vests and backpacks because both are worn over other clothing and secured with zippers/buckles in real life. Override with the WearAudio field.
Proof System and Movement Speed
All proof flags and movement speed modifiers apply identically to other clothing types.
Cosmetic Priority
Vests use the default cosmetic priority (GetDefaultTakesPriorityOverCosmetic returns false). vests have no special override for cosmetic priority.
PRO vs Non-PRO Behavior
| Feature | Non-PRO Vest | PRO Vest |
|---|---|---|
| Armor values | Parsed from .dat | Forced to 1.0 |
| Storage dimensions | Parsed from .dat | Forced to 0 |
| Prefab loading | Normal | Normal + CosmeticPreviewOverride |
| Fallback shirt | Normal | Normal |
PopulateAsset Call Chain
ItemAsset.PopulateAsset
└─ ItemClothingAsset.PopulateAsset — armor, proof, movement, visuals, wear audio (zipper)
└─ ItemBagAsset.PopulateAsset — Width, Height
└─ ItemVestAsset.PopulateAsset
├─ Load "Vest" prefab (client only)
├─ Layer + cloth validation (if validateAssets)
├─ Parse Has_Fallback_Shirt
└─ Parse Fallback_Shirt asset reference (if hasFallbackShirt)BuildCargoData — Wiki Export
Vests contribute to two Cargo tables:
Clothing table (from ItemClothingAsset)
GUID, Armor, Armor_Explosion, Falling_Damage_Multiplier, Proof_Water, Proof_Fire, Proof_Radiation, Prevents_Falling_Broken_Bones, Movement_Speed_Multiplier, Mirror_Left_Handed_Model, Priority_Over_Cosmetic.
Bag table (from ItemBagAsset)
GUID, Width, Height.
No dedicated Vest Cargo table exists — vests use Clothing and Bag tables only. The fallback shirt fields are internal (internal) and not exported to Cargo.
.dat File Reference — Vest-Specific
| .dat Key | Type | Default | Category |
|---|---|---|---|
Armor | float | 1.0 | Damage mitigation (VEST slot applies) |
Armor_Explosion | float | equals Armor | Explosion-specific armor |
Falling_Damage_Multiplier | float | 1.0 | Fall damage |
Proof_Water | flag | — | Water breathing |
Proof_Fire | flag | — | Fire immunity |
Proof_Radiation | flag | — | Radiation immunity |
Prevents_Falling_Broken_Bones | bool | false | No fall bone breaks |
Movement_Speed_Multiplier | float | 1.0 | Movement speed modifier |
Hair_Visible | bool | true | Hair visibility |
Beard_Visible | bool | true | Beard visibility |
Visible_On_Ragdoll | bool | true | Visible on death |
Mirror_Left_Handed_Model | bool | true | Mirror model |
WearAudio | AudioReference | Sounds/Zipper.mp3 | Equip sound (zipper default) |
Destroy_Clothing_Colliders | bool | true | Remove colliders |
Priority_Over_Cosmetic | bool | false | Override cosmetic |
Skin_Override | string | — | Child mesh for skin material |
Width | byte | 0 | Storage columns |
Height | byte | 0 | Storage rows |
Has_Fallback_Shirt | bool | false | Enable fallback shirt |
Fallback_Shirt | AssetRef | — | GUID of fallback shirt asset |
Master Bundle Asset Requirements
| Bundle Key | Type | Required | Purpose |
|---|---|---|---|
"Vest" | GameObject | Required | 3D vest prefab with SkinnedMeshRenderer |
"CosmeticPreviewOverride" | GameObject | Optional (PRO) | PRO cosmetic preview model |
Modding Example — Basic Vest .dat
ini
GUID a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
Type Vest
Rarity Uncommon
Size_X 3
Size_Y 2
Armor 0.85
Width 2
Height 2Creates a standard vest with:
- 15% damage reduction
- 2×2 storage grid (4 slots)
- Uncommon rarity
Modding Example — Heavy Vest with Fallback Shirt .dat
ini
GUID f1e2d3c4b5a69788796a5b4c3d2e1f0a
Type Vest
Rarity Epic
Size_X 4
Size_Y 3
Armor 0.70
Armor_Explosion 0.60
Movement_Speed_Multiplier 0.90
Width 3
Height 2
Has_Fallback_Shirt true
Fallback_Shirt aabbccdd11223344556677889900aabb
Proof_ExplosionCreates a heavy armored vest with:
- 30% general damage reduction
- 40% explosive damage reduction
- 10% movement speed penalty
- 3×2 storage grid (6 slots)
- Fallback shirt (GUID
aabbccdd...) when no shirt equipped - Explosion immunity via
Proof_Explosion
Modding Example — Light Tactical Vest .dat
ini
GUID d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9
Type Vest
Rarity Rare
Size_X 2
Size_Y 2
Armor 0.90
Width 4
Height 3
Movement_Speed_Multiplier 1.05Creates a lightweight tactical vest with:
- 10% damage reduction
- Large 4×3 storage grid (12 slots — same as a medium backpack)
- 5% movement speed bonus (lightweight materials)
- No fallback shirt needed (vest sits over the shirt area)
Comparison: Vest vs Backpack
| Feature | ItemVestAsset | ItemBackpackAsset |
|---|---|---|
| Slot type | EItemType.VEST | EItemType.BACKPACK |
| Armor eligible | Yes | No |
| Storage dimensions | Width/Height (ItemBagAsset) | Width/Height (ItemBagAsset) |
| Wear audio | Zipper (default) | Zipper (default) |
| 3D prefab | "Vest" | "Backpack" |
| Fallback shirt | Yes | No |
| Inventory audio | Cloth-based (ItemClothingAsset) | Metal-based (overridden) |
Common Issues
Bare chest under vest: Use the fallback shirt system. Set
Has_Fallback_Shirt trueand provide aFallback_ShirtGUID pointing to a simple undershirt asset. The fallback shirt will automatically appear when no real shirt is equipped.Fallback shirt not appearing: The
Fallback_Shirtmust reference a validItemShirtAssetGUID. If the GUID is wrong or the asset doesn't exist, the fallback silently fails.Fallback shirt on server: The fallback shirt is client-side only. If a mod needs fallback shirt behavior to sync to other players, ensure the referenced shirt asset is available to all clients.
Armor stacking: Armor from a vest multiplies with armor from other eligible slots. A shirt with
Armor 0.8and vest withArmor 0.8gives0.8 × 0.8 = 0.64(36% reduction).Storage size vs backpack: Vests generally provide smaller storage than backpacks. A typical vest storage is 2×2 to 3×2, while backpacks range from 4×3 to 6×5. This reflects the physical size difference: vests sit close to the body, backpacks are larger external containers.
Document history
| Version | Date | Author | Notes |
|---|---|---|---|
| 1.0 | 2026-07-28 | 57 Studios | Initial publication. Full vest asset documentation including fallback shirt system, storage, armor, and modding examples. |
