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 .tga icon file
  • A .gr2 model file + Granny Viewer
  • One or more .dds / .tga texture files

Part I — Client Side

Step 1 — Unpack the Required Packs

Unpack these client packs:

  • locale_xx
  • icon
  • root (contains the .msm files)
  • pc, pc2, and pc3 (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:

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

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 value3 in 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:

ColumnValueNotes
ITEM (vnum)85001Must be < 65536
ITEM_NAME(KR)DragonCostumeInternal name
ITEM_TYPE (type)ITEM_COSTUMEMust be ITEM_COSTUME
SUB_TYPE (subtype)COSTUME_BODYSee subtype table below
ITEM_WEAR (wearflag)WEAR_COSTUME_BODYMust match subtype
value31ShapeIndex — must match .msm block
LIMIT_TYPE0LEVELOptional level requirement
LIMIT_VALUE000 = no level requirement
SPECULAR50Model brightness

Costume Subtypes and Wearflags

SUB_TYPEITEM_WEAR (wearflag)Description
COSTUME_BODY (0)WEAR_COSTUME_BODYArmor skin costume
COSTUME_HAIR (1)WEAR_COSTUME_HAIRHairstyle costume
COSTUME_WEAPON (2)WEAR_COSTUME_WEAPONWeapon skin costume
COSTUME_ACCE (3)WEAR_COSTUME_ACCESash / Acce
COSTUME_MOUNT (4)WEAR_COSTUME_MOUNTMount 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

FieldMeaning
value1Defense (final defense = value1 + value5 × 2)
value3ShapeIndex — links item to .msm ShapeData block
value5Defense bonus (added to value1 formula)

Step 3 — Test In-Game

  1. Restart server (or reload item_proto)
  2. Deploy updated .msm files and model/texture assets to the client pack
  3. Spawn the costume: /i 85001
  4. 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 value3 does 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
  • 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