Skip to content

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 system

Class 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");
    }
}
AspectDetail
Load key"Vest" GameObject from master bundle
RequiredYes — loadRequiredAsset
Server skipDedicated server skips prefab
Layer validationENEMY layer check
Cloth validationCloth component warnings
Fallback shirt parsingOnly 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 KeyTypeDefaultPurpose
Has_Fallback_ShirtboolfalseEnables fallback shirt system
Fallback_ShirtAssetRefnullGUID reference to the shirt asset to use as underlayer

Runtime Behavior

When the vest is equipped:

  1. The game checks hasFallbackShirt
  2. If true and the player has no shirt in the shirt slot, the fallbackShirt asset is resolved
  3. The referenced shirt asset is equipped as a visual-only item — it provides no armor, no storage, and is not interactable
  4. 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 ItemBagAsset storage 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 KeyTypeDefaultRange
Widthbyte00–255
Heightbyte00–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

FeatureNon-PRO VestPRO Vest
Armor valuesParsed from .datForced to 1.0
Storage dimensionsParsed from .datForced to 0
Prefab loadingNormalNormal + CosmeticPreviewOverride
Fallback shirtNormalNormal

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 KeyTypeDefaultCategory
Armorfloat1.0Damage mitigation (VEST slot applies)
Armor_Explosionfloatequals ArmorExplosion-specific armor
Falling_Damage_Multiplierfloat1.0Fall damage
Proof_WaterflagWater breathing
Proof_FireflagFire immunity
Proof_RadiationflagRadiation immunity
Prevents_Falling_Broken_BonesboolfalseNo fall bone breaks
Movement_Speed_Multiplierfloat1.0Movement speed modifier
Hair_VisiblebooltrueHair visibility
Beard_VisiblebooltrueBeard visibility
Visible_On_RagdollbooltrueVisible on death
Mirror_Left_Handed_ModelbooltrueMirror model
WearAudioAudioReferenceSounds/Zipper.mp3Equip sound (zipper default)
Destroy_Clothing_CollidersbooltrueRemove colliders
Priority_Over_CosmeticboolfalseOverride cosmetic
Skin_OverridestringChild mesh for skin material
Widthbyte0Storage columns
Heightbyte0Storage rows
Has_Fallback_ShirtboolfalseEnable fallback shirt
Fallback_ShirtAssetRefGUID of fallback shirt asset

Master Bundle Asset Requirements

Bundle KeyTypeRequiredPurpose
"Vest"GameObjectRequired3D vest prefab with SkinnedMeshRenderer
"CosmeticPreviewOverride"GameObjectOptional (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 2

Creates 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_Explosion

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

Creates 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

FeatureItemVestAssetItemBackpackAsset
Slot typeEItemType.VESTEItemType.BACKPACK
Armor eligibleYesNo
Storage dimensionsWidth/Height (ItemBagAsset)Width/Height (ItemBagAsset)
Wear audioZipper (default)Zipper (default)
3D prefab"Vest""Backpack"
Fallback shirtYesNo
Inventory audioCloth-based (ItemClothingAsset)Metal-based (overridden)

Common Issues

  1. Bare chest under vest: Use the fallback shirt system. Set Has_Fallback_Shirt true and provide a Fallback_Shirt GUID pointing to a simple undershirt asset. The fallback shirt will automatically appear when no real shirt is equipped.

  2. Fallback shirt not appearing: The Fallback_Shirt must reference a valid ItemShirtAsset GUID. If the GUID is wrong or the asset doesn't exist, the fallback silently fails.

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

  4. Armor stacking: Armor from a vest multiplies with armor from other eligible slots. A shirt with Armor 0.8 and vest with Armor 0.8 gives 0.8 × 0.8 = 0.64 (36% reduction).

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

VersionDateAuthorNotes
1.02026-07-2857 StudiosInitial publication. Full vest asset documentation including fallback shirt system, storage, armor, and modding examples.