How to Add a Custom Costume or Armor to Your Metin2 Private Server
Costumes and armors in Metin2 require changes on both the client (model files, textures, .msm ShapeData blocks, item_proto client) and the server (item_proto.txt, item_names.txt). The most common source of errors is the ShapeIndex — a number that must match between item_proto value3 and the .msm file.
Use the MSM Extractor to inspect existing ShapeData blocks in your .msm files before writing new entries.
What You Need
- WinSCP access to your server
- A client unpacker: EterManager, Eternexus, or EterPack Archiver
- A
.tgaicon file - A
.gr2model file + Granny Viewer - One or more
.dds/.tgatexture files
Part I — Client Side
Step 1 — Unpack the Required Packs
Unpack these client packs:
locale_xxiconroot(contains the .msm files)pc,pc2, andpc3(pc3 is for Lycan)
Step 2 — Place the Item Icon
Copy your icon in .tga format into icon/item/.
Step 3 — Place the .gr2 Model
Place the costume/armor model under the appropriate character pack. For a body costume, the path typically follows:
d:/ymir work/pc/warrior/costume/dragon_body.gr2
d:/ymir work/pc/assassin/costume/dragon_body.gr2
You need a separate model (or the same shared one) referenced from each race's .msm file.
Step 4 — Find and Place Textures
Open the .gr2 in Granny Viewer → TextureList. Place your texture file at exactly the path shown — same folder, same filename. For armors and costumes, the texture files are typically inside the pc / pc2 / pc3 packs.
Step 5 — Edit the .msm Files (ShapeData)
This step is required for all armors, costumes, and hairstyles. The .msm files are in the root pack. Each file corresponds to a 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 |
Upload your .msm files to the MSM Extractor to view existing ShapeData entries and pick a free ShapeIndex. Then add your new block to each race file:
Group ShapeData
{
ShapeDataCount 2
Group ShapeData0
{
ShapeIndex 1
Model "d:/ymir work/pc/warrior/costume/dragon_body.gr2"
SourceSkin "d:/ymir work/pc/warrior/body/warrior_body_d.dds"
TargetSkin "d:/ymir work/pc/warrior/costume/dragon_body_d.dds"
}
Group ShapeData1
{
ShapeIndex 2
...
}
}
Key rules:
- ShapeIndex must match
value3in item_proto — this is the link between item and visual - ShapeDataCount must equal the total number of ShapeDataN groups (existing + new)
- Group numbering must be sequential:
ShapeData0,ShapeData1, ... — no gaps - Repeat for every race file the costume supports
Step 6 — Regenerate Client item_proto
Run Dump Proto on your updated server item_proto.txt + item_names.txt and place the output in locale_xx. Do this after completing Part II.
Step 7 — Update item_list.txt
Add a line in item_list.txt (in locale_xx). For armor/costume, leave the .gr2 path empty — the model is driven by the .msm ShapeData, not item_list.txt:
COSTUME[TAB]icon/item/dragon_costume.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)
85001[TAB]Dragon Costume
Step 2 — Configure item_proto.txt
Add a row for your costume. Critical columns:
| Column | Value | Notes |
|---|---|---|
ITEM (vnum) | 85001 | Must be < 65536 |
ITEM_NAME(KR) | DragonCostume | Internal name |
ITEM_TYPE (type) | ITEM_COSTUME | Must be ITEM_COSTUME |
SUB_TYPE (subtype) | COSTUME_BODY | See subtype table below |
ITEM_WEAR (wearflag) | WEAR_COSTUME_BODY | Must match subtype |
value3 | 1 | ShapeIndex — must match .msm block |
LIMIT_TYPE0 | LEVEL | Optional level requirement |
LIMIT_VALUE0 | 0 | 0 = no level requirement |
SPECULAR | 50 | Model brightness |
Costume Subtypes and Wearflags
| SUB_TYPE | ITEM_WEAR (wearflag) | Description |
|---|---|---|
COSTUME_BODY (0) | WEAR_COSTUME_BODY | Armor skin costume |
COSTUME_HAIR (1) | WEAR_COSTUME_HAIR | Hairstyle costume |
COSTUME_WEAPON (2) | WEAR_COSTUME_WEAPON | Weapon skin costume |
COSTUME_ACCE (3) | WEAR_COSTUME_ACCE | Sash / Acce |
COSTUME_MOUNT (4) | WEAR_COSTUME_MOUNT | Mount costume |
For regular (non-costume) armor, use ITEM_ARMOR as the type and ARMOR_BODY as subtype with WEAR_BODY as wearflag. The value3/ShapeIndex still applies.
Armor Value Fields
| Field | Meaning |
|---|---|
value1 | Defense (final defense = value1 + value5 × 2) |
value3 | ShapeIndex — links item to .msm ShapeData block |
value5 | Defense bonus (added to value1 formula) |
Step 3 — Test In-Game
- Restart server (or reload item_proto)
- Deploy updated .msm files and model/texture assets to the client pack
- Spawn the costume:
/i 85001 - Equip it and verify the visual model changes correctly on each race you added ShapeData for
Common Errors
- Costume equips but no visual change — ShapeIndex in item_proto
value3does not match the .msm ShapeData block - Works on one race, invisible on others — .msm not updated for all race files
- Client crash on equip — .gr2 path in ShapeData block wrong or file missing from pack
- ShapeDataCount wrong — must equal the total number of ShapeDataN groups after your addition
- Numbering gap — ShapeData0 + ShapeData2 with no ShapeData1 causes the parser to stop early
- Left .gr2 path in item_list.txt — for armor/costume, leave the .gr2 column empty; the model comes from .msm
Related Tools
- MSM Extractor — upload .msm files, view all ShapeData blocks, find a free ShapeIndex, download per-character
- Item Proto Editor — edit item_proto in a spreadsheet view, export TXT or SQL
- TXT ↔ SQL Converter — convert item_proto between TXT and SQL formats