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
.tgaicon file - A
.gr2hair model file + Granny Viewer - One or more
.dds/.tgatexture files
Part I — Client Side
Step 1 — Unpack the Required Packs
Unpack these packs:
locale_xxiconitem(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:
| File | Character |
|---|---|
warrior_m.msm | Warrior (Male) |
warrior_w.msm | Warrior (Female) |
assassin_m.msm | Ninja (Male) |
assassin_w.msm | Ninja (Female) |
sura_m.msm | Sura (Male) |
sura_w.msm | Sura (Female) |
shaman_m.msm | Shaman (Male) |
shaman_w.msm | Shaman (Female) |
wolf_m.msm | Wolfman / 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
value3in 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.
| Column | Old-style hair | Costume hair |
|---|---|---|
ITEM_TYPE (type) | ITEM_HAIR | ITEM_COSTUME |
SUB_TYPE (subtype) | ITEM_NONE | COSTUME_HAIR (1) |
ITEM_WEAR (wearflag) | WEAR_HAIR | WEAR_COSTUME_HAIR |
value3 | HairIndex | HairIndex |
Other important columns:
| Column | Value | Notes |
|---|---|---|
ITEM (vnum) | 74001 | Must be < 65536 |
ITEM_NAME(KR) | CustomHair01 | Internal name |
SIZE (size) | 1 | 1 inventory square |
value3 | 5 | HairIndex — must match .msm HairData block |
SPECULAR | 50 | Model brightness; set >0 if model uses alpha channel |
LIMIT_TYPE0 | LEVEL | Optional level requirement |
LIMIT_VALUE0 | 0 | 0 = no requirement |
You can also add stat bonuses via ADDON_TYPE0/ADDON_VALUE0 — hairstyles with bonuses are valid.
Step 3 — Test In-Game
- Restart server (or reload item_proto)
- Deploy updated .msm files and model/texture assets to the client packs
- Spawn the hair item:
/i 74001 - Equip it — verify the hairstyle changes on screen
- Test on each race whose .msm you updated
Common Errors
- Hair equips but no visual change — HairIndex in item_proto
value3does 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
Related Tools
- 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