How to Add a Custom Hairstyle to Your Metin2 Private Server

Adding a hairstyle works almost identically to adding a costume or armor — the difference is that you edit HairData blocks (instead of ShapeData) in the .msm files, and you use either the old ITEM_HAIR type or the newer ITEM_COSTUME / COSTUME_HAIR type in item_proto. The link between item and visual is always value3 = HairIndex.

Use the MSM Extractor to upload all your .msm files, search for existing HairIndex values, and find a free slot before writing new entries.


What You Need

  • WinSCP access to your server
  • A client unpacker: EterManager, Eternexus, or EterPack Archiver
  • A .tga icon file
  • A .gr2 hair model file + Granny Viewer
  • One or more .dds / .tga texture files

Part I — Client Side

Step 1 — Unpack the Required Packs

Unpack these packs:

  • locale_xx
  • icon
  • item (hair models go here for old-style hair)
  • root (contains the .msm files)
  • pc, pc2, pc3

Step 2 — Place the Item Icon

Copy your icon in .tga format into icon/item/.

Step 3 — Place the .gr2 Hair Model

Hair models typically go inside the character's pack under a hair subfolder:

d:/ymir work/pc/warrior/hair/custom_hair_01.gr2
d:/ymir work/pc/assassin/hair/custom_hair_01.gr2

You can use the same model file across races if the geometry is universal, and reference it from each race's .msm file.

Step 4 — Find and Place Textures

Open the .gr2 in Granny Viewer → TextureList. Place your texture at exactly the path shown. Hair textures are usually inside the pc / pc2 / pc3 packs alongside the model.

Step 5 — Edit the .msm HairData Blocks

The .msm files are in the root pack. You need to add a HairData block (not ShapeData) for hair. Each file covers one class + gender:

FileCharacter
warrior_m.msmWarrior (Male)
warrior_w.msmWarrior (Female)
assassin_m.msmNinja (Male)
assassin_w.msmNinja (Female)
sura_m.msmSura (Male)
sura_w.msmSura (Female)
shaman_m.msmShaman (Male)
shaman_w.msmShaman (Female)
wolf_m.msmWolfman / Lycan

First, upload your current .msm files to the MSM Extractor and search for "HairIndex" to see all existing values. Pick a free HairIndex number — note it down, as it must go into item_proto value3 as well.

Then add your new entry to the existing HairData group in each race file:

Group HairData
{
  HairDataCount 5

  Group HairData0
  {
    HairIndex    1
    Model        "d:/ymir work/pc/warrior/hair/hair_01.gr2"
    SourceSkin   "d:/ymir work/pc/warrior/hair/warrior_hair_d.dds"
    TargetSkin   "d:/ymir work/pc/warrior/hair/warrior_hair_d.dds"
  }

  ...

  Group HairData4
  {
    HairIndex    5
    Model        "d:/ymir work/pc/warrior/hair/custom_hair_01.gr2"
    SourceSkin   "d:/ymir work/pc/warrior/hair/warrior_hair_d.dds"
    TargetSkin   "d:/ymir work/pc/warrior/hair/custom_hair_01_d.dds"
  }
}

Key rules (same as ShapeData):

  • HairIndex must match value3 in item_proto — this is the only link between item and visual
  • HairDataCount must equal the total number of HairDataN groups after your addition
  • Group numbering must be sequential: HairData0, HairData1, ... — no gaps allowed
  • SourceSkin — the original texture being swapped out (can be any existing hair texture)
  • TargetSkin — your new custom hair texture
  • Repeat for every race file you want to support

Step 6 — Regenerate Client item_proto

Run Dump Proto on your updated server files after completing Part II, and place the output in locale_xx.

Step 7 — Update item_list.txt

Add a line in item_list.txt. Like armor/costume, leave the .gr2 column empty for hairstyles — the model is driven by the .msm HairData:

HAIR[TAB]icon/item/custom_hair_01.tga[TAB]

Step 8 — Repack

Repack locale_xx, icon, root, and all pc packs.


Part II — Server Side

Step 1 — Add Display Name (item_names.txt)

74001[TAB]Custom Hair Style

Step 2 — Configure item_proto.txt

There are two item types for hair — old-style (ITEM_HAIR) and costume hair (ITEM_COSTUME / COSTUME_HAIR). Use the Item Proto Editor to configure visually.

ColumnOld-style hairCostume hair
ITEM_TYPE (type)ITEM_HAIRITEM_COSTUME
SUB_TYPE (subtype)ITEM_NONECOSTUME_HAIR (1)
ITEM_WEAR (wearflag)WEAR_HAIRWEAR_COSTUME_HAIR
value3HairIndexHairIndex

Other important columns:

ColumnValueNotes
ITEM (vnum)74001Must be < 65536
ITEM_NAME(KR)CustomHair01Internal name
SIZE (size)11 inventory square
value35HairIndex — must match .msm HairData block
SPECULAR50Model brightness; set >0 if model uses alpha channel
LIMIT_TYPE0LEVELOptional level requirement
LIMIT_VALUE000 = no requirement

You can also add stat bonuses via ADDON_TYPE0/ADDON_VALUE0 — hairstyles with bonuses are valid.

Step 3 — Test In-Game

  1. Restart server (or reload item_proto)
  2. Deploy updated .msm files and model/texture assets to the client packs
  3. Spawn the hair item: /i 74001
  4. Equip it — verify the hairstyle changes on screen
  5. Test on each race whose .msm you updated

Common Errors

  • Hair equips but no visual change — HairIndex in item_proto value3 does not match the .msm HairData block
  • Default hair shows instead — .msm not updated for that character's race file
  • Client crash on equip — .gr2 path in HairData block wrong or file missing from pack
  • HairDataCount wrong — must equal the total HairDataN groups after your addition
  • Numbering gap — HairData0 + HairData2 with no HairData1 causes the parser to stop early
  • Left .gr2 path in item_list.txt — for hairstyles, leave the .gr2 column empty; the model comes from .msm
  • Specular = 0 on model with alpha — causes transparent/invisible parts; set specular > 0
  • MSM Extractor — upload .msm files, search HairData blocks, inspect all HairIndex values, download per-character
  • Item Proto Editor — edit item_proto columns in a spreadsheet view, export TXT or SQL
  • TXT ↔ SQL Converter — convert item_proto between TXT and SQL formats