aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Een Metin2-model toevoegen: .gr2 Granny-bestanden en index

Metin2 model ekleme — een model toevoegen aan Metin2 — is iets waar iedereen die een nieuw monster, NPC of rijdier in het spel wil brengen vroeg of laat tegenaan loopt. In de kern staat één bestandsformaat: .gr2, het modelbestand van de Granny3D-engine van RAD Game Tools. Als je de modelmap niet correct voorbereidt en hem niet aan de juiste index koppelt, blijft zelfs de mooiste mesh onzichtbaar in het spel of laat hij de client meteen crashen. Deze gids loopt stap voor stap door de logica van het integreren van een nieuw 3D-model vanaf nul en het koppelen ervan aan een mob_proto-vnum.

Wat is .gr2 en hoe Granny zich verhoudt tot Metin2

De Metin2-client gebruikt de Granny3D-runtime (granny2.dll) om personage- en objectmodellen te renderen; daarom worden alle mesh-, skelet- en animatiegegevens opgeslagen met de extensie .gr2. Een enkel .gr2-bestand kan alleen een mesh bevatten, of ook een skelet en bewegingsgegevens. De gebruikelijke aanpak in Metin2 is deze: één bestand bevat de mesh plus het skelet, terwijl aparte bestanden elke animatie dragen (lopen, aanvallen, sterven). Om je model goed te laten functioneren in het spel moet dit trio — mesh, skelet, beweging — onderling compatibel zijn.

Wat er in een modelmap zit

In de client leeft elk monster of elke NPC in een eigen map; deze mappen zitten meestal in de pack-archieven onder monster2/ (monsters) of npc/. Een typische map bevat:

  • Mesh .gr2 — Het model zelf, samen met zijn skelet. De meeste mappen geven het een vaste naam (bijvoorbeeld model.gr2).
  • Beweging .gr2-bestanden — Elk bevat één animatie: stilstaan, rennen, aanvallen, schade oplopen, sterven.
  • Textuurbestanden — Meestal in .dds-formaat (DXT-gecomprimeerd). Ze moeten overeenkomen met de materiaalnaam van de mesh.
  • .msm-bestand — De "Monster State Module"; een tekstgebaseerde state machine die definieert welke beweging in welke staat speelt.

Je kunt dit alles openen en inspecteren met Granny Viewer, waarmee je ziet of de mesh, het skelet en de texturen correct laden zonder ooit het spel binnen te gaan.

Het model voorbereiden: skelet, rig en export

De veiligste manier om een nieuw model binnen te brengen is het te riggen op het standaard Metin2-skelet. Als je je model koppelt aan de skelethiërarchie van een bestaand monster (met identieke botnamen), kun je alle kant-en-klare animaties van dat monster hergebruiken — je hoeft geen enkele beweging te tekenen. Gebruik je een volledig nieuw skelet, dan moet je ook je eigen bewegingsbestanden maken voor elke staat (stilstaan, aanvallen, sterven).

Het standaard exporthulpmiddel is de Granny exporter-plugin die op oudere versies van 3ds Max wordt geïnstalleerd. De flow is meestal: lijn het model en skelet uit, bereid de texturen voor als .dds, exporteer dan de mesh en elke animatie afzonderlijk als .gr2. Let op de schaal tijdens het exporteren: Metin2-personages gebruiken een specifieke eenheidsschaal, en een model dat te groot of te klein is, ziet er absurd uit in het spel of krijgt een verkeerde hitbox.

.msm — de state machine koppelen

Zelfs met de mesh en animaties klaar leest de client het antwoord op "welk bestand speel ik af terwijl dit monster wacht?" uit het .msm-bestand. Dit tekstbestand koppelt spelstaten aan de bijbehorende beweging-.gr2-bestanden. De structuur ziet er grofweg zo uit:

MotionMode  GENERAL
{
    Group  WAIT
    {
        MotionCount  1
        Motion0  "wait.gr2"  1.0
    }
    Group  ATTACK
    {
        MotionCount  1
        Motion0  "attack.gr2"  1.0
    }
}

De logica is duidelijk: elke staatgroep wijst naar het af te spelen bewegingsbestand en het gewicht ervan. Een ontbrekende groep (bijvoorbeeld DEAD niet definiëren) zorgt ervoor dat het monster bij de dood bevriest of een fout geeft. Het meest praktische startpunt is het .msm van een vergelijkbaar bestaand monster als sjabloon nemen en de bestandsnamen verwisselen voor je eigen bewegingen.

Index koppelen: npclist.txt en mob_proto

Hier gebeurt het echte "koppelen". De client identificeert een monster aan zijn vnum (protonummer), maar leert uit npclist.txt in welke map het model zich bevindt. Dit bestand in de clientroot koppelt de vnum aan het mappad. Elke regel is met tabs gescheiden:

20101	monster2/nieuw_monster	Nieuw Monster

De kolommen zijn op volgorde: de vnum, het pad naar de modelmap en de weergegeven naam. De vnum hier moet exact hetzelfde zijn als de vnum van het mob_proto-record aan de serverkant. De server definieert het monster met zijn statistieken (HP, aanval, type, AI) in mob_proto en bekommert zich niet om het model. De client zoekt op zijn beurt die vnum op in npclist.txt, vindt de map en laadt het model. Gebruiken beide kanten verschillende vnums, dan verschijnt het monster met het verkeerde model of helemaal niet. Omdat NPC-dialogen en quests ook naar deze vnum verwijzen, kies het nummer vanaf het begin zorgvuldig.

Granny-versiecompatibiliteit en veelvoorkomende crashes

De meest irritante fout bij het toevoegen van een Metin2-model is dat een elders gevonden .gr2-bestand de client laat crashen bij het opstarten. De oorzaak is meestal een Granny-versiemismatch: verschillende clientversies gebruiken verschillende Granny-runtimes (bijvoorbeeld 2.4 versus 2.9), en een .gr2 die voor de ene versie is geschreven, kan niet door de granny2.dll van een andere versie worden gelezen. De oplossing is het model te converteren naar de Granny-versie van je eigen client, of het opnieuw te exporteren met die versie. Andere veelvoorkomende crashoorzaken:

  • Ontbrekende textuur — Zoekt de mesh een .dds die niet bestaat, dan zie je een wit/transparant model of een fout. Controleer de materiaalnamen en textuurpaden.
  • Verkeerd pad in npclist.txt — De mapnaam moet letter voor letter overeenkomen; een verkeerde hoofdletter/kleine letter of tab/spatie-verwarring maakt het model "niet gevonden".
  • Verkeerde plaatsing in de pack — Zolang de bestanden niet op het pad staan dat past bij de archief- (pack-)structuur van de client, kan het spel ze niet zien.

Loop je tegen een crash aan, dan versnelt het bekijken van de foutlogs aan clientzijde en de syserr-bestanden de diagnose.

Veelgestelde vragen

Is het model alleen aan de client toevoegen genoeg?

Het model toevoegen en in npclist.txt vermelden is genoeg om het beeld te laten verschijnen, maar om het monster echt in het spel te laten bestaan heb je ook een mob_proto-record met dezelfde vnum aan de serverkant nodig. Zonder beide krijg je ofwel een onzichtbaar monster, ofwel een vnum zonder model.

Moet ik nieuwe animaties tekenen?

Nee. Als je je model op een standaard Metin2-skelet riggt, kun je alle kant-en-klare bewegingen van dat skelet hergebruiken en gewoon de bestandsnamen in het .msm koppelen. Nieuwe animatie is alleen nodig als je originele bewegingen wilt.

De client crasht bij het opstarten — wat moet ik eerst controleren?

Controleer eerst de Granny-versiecompatibiliteit: is je .gr2 compatibel met de granny2.dll-versie van je client? Controleer daarna de textuurpaden en de mapnaam in de npclist.txt-regel. Deze drie verklaren de overgrote meerderheid van de crashes.

Wil je je nieuwe model netjes in het spel krijgen? Van Granny-export tot de .msm-state machine en npclist.txt-indexkoppeling kunnen we de hele integratie samen opzetten. Neem contact met me op en laten we over je project praten.

Bu kategorideki tüm yazılar →

Devamı için