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

Een nieuwe Metin2-klasse toevoegen: kan het en hoe?

Een nieuwe Metin2-klasse toevoegen is iets waar bijna elke servereigenaar op een gegeven moment van droomt, meestal zonder te beseffen hoe diep die klus eigenlijk gaat. Sinds de lancering is het spel gebouwd op vier kernklassen: Warrior, Sura, Ninja en Shaman; aan de officiële kant bracht de later toegevoegde Wolfman (Lycan) dat aantal op vijf. Een vijfde of zesde klasse helemaal vanaf nul binnenhalen is iets heel anders dan een nieuw model of een nieuwe map toevoegen: de klasse-identiteit zit tegelijk verankerd in de client-, de server- én de databaselaag. In dit artikel leg ik uit wat echt mogelijk is, wat in de praktijk bijna onmogelijk is, en de realistische benaderingen daartussenin.

Waarom het geen simpele "nieuw model"-klus is

In Metin2 wordt de klasse van een personage voorgesteld door één enkel getal, de job index. In de server-source zijn deze waarden als constanten gedefinieerd: JOB_WARRIOR = 0, JOB_ASSASSIN = 1, JOB_SURA = 2, JOB_SHAMAN = 3, en op Wolfman-builds JOB_WOLFMAN = 4. De "race"-waarde van een personage in het spel volgt ruwweg uit deze job gecombineerd met geslacht — elke klasse beslaat dus een aparte slot voor de mannelijke en de vrouwelijke variant. Dat getal is niet zomaar een label; het wordt overal in het spel als array-index gebruikt. Statberekening, levens- en manaformules, beginpunten, de skillboom, item-draagrechten en veel meer raadplegen tabellen via deze index. Op het moment dat je een nieuwe index toevoegt, moet je ook elk van die tabellen uitbreiden.

Serverkant: onmogelijk zonder de source

Dit is het meest kritieke deel. Een nieuwe job index definiëren dwingt je om de game source (de C++-spelkern) te bewerken en opnieuw te compileren, want het aantal klassen wordt op veel plekken als vast beschouwd. De plekken die je doorgaans moet aanraken zijn:

  • Constanten — De headerbestanden waar de jobnummers en het totale aantal klassen (iets als JOB_MAX_NUM) gedefinieerd staan.
  • Punt- en stattabellen — De arrays met de leven, mana en beginstats per niveau van elke klasse (de job-info-arrays rond constants.cpp). Voeg je geen rij toe voor de nieuwe klasse, dan crasht het spel of spawnt het personage met nul stats.
  • Het skillsysteem — De structuren die klassespecifieke skill-ID's aan een job koppelen.
  • Itembeperkingen — Welke klassen een item mogen dragen wordt opgeslagen als een bitmask (Warrior 1, Sura 2, Ninja 4, Shaman 8). Een vijfde klasse gebruikt de volgende bit, en de kern moet die herkennen.

De adder onder het gras: de meeste "server files"-pakketten die rondgaan komen als gecompileerde binaries, wat betekent dat je geen C++-source hebt. Zonder de source kun je deze constanten niet wijzigen — het enige wat je kunt doen is leven met de bestaande vier (of vijf) klassen. Heb je echt een compileerbare source, dan is het werk zwaar maar haalbaar; heb je die niet, dan is een "echte" nieuwe klasse simpelweg van de baan.

De databaselaag

De klasse van een personage wordt opgeslagen in een job-kolom in de player-tabel. Een nieuwe job-waarde vereist niet per se een schemawijziging (de kolom is al numeriek), maar de skill- en item-protodata moeten de nieuwe klasse herkennen. Zo definieert skill_proto voor welke jobs elke skill openstaat; je moet de skills van je nieuwe klasse daar toevoegen. Net zo moet je aan de item_proto-kant het klassenbeperkingsmasker van draagbare items bijwerken, zodat je nieuwe klasse niet met lege uitrustingsslots rondloopt.

Clientkant: karaktercreatie en modellen

Zelfs als de server de nieuwe klasse herkent, heeft het geen zin als de speler haar niet kan zien. De clientkant vormt zijn eigen lijst:

  • Karaktercreatiescherm — De Python-interface in het root-pakket (de karakterselectie- en creatiemodules) leest de kiesbare races uit een vaste lijst. Je moet de nieuwe klasse aan die lijst toevoegen en haar een icoon, een naam en een previewmodel geven.
  • Spelermodellen — Elke klasse heeft aparte .gr2-modellen, skeletten en complete motionsets voor man en vrouw. Je moet ze allemaal voorbereiden en in de juiste mappenstructuur plaatsen.
  • Motionlijsten (.msa) en state machines — Lopen, rennen, aanvallen en skillanimaties worden via deze bestanden gekoppeld. Een ontbrekende motion bevriest die klasse tijdens die actie.
  • Skillinterface — Localebestanden en skilldefinities worden bijgewerkt zodat de skillvensters de boom van de nieuwe klasse tonen met de juiste iconen en beschrijvingen.

Het kernpunt: de race-index aan de clientkant en de job index aan de serverkant moeten exact overeenkomen. Gebruiken de twee kanten verschillende nummers, dan spawnt het personage met het verkeerde model, blijven de skills niet hangen, of crasht de client meteen bij het inloggen.

Realistische benaderingen

Een volwaardige vijfde klasse is voor de meeste projecten overkill. In de praktijk zijn drie routes veel gangbaarder:

  • Een bestaande klasse opnieuw thematiseren (reskin) — Bijvoorbeeld de Shaman presenteren als een "nieuwe klasse" met volledig nieuwe modellen, effecten en skillbeelden. Omdat de job index hetzelfde blijft, raak je de source nooit aan; je verandert alleen de visuele en skillinhoud. Dit is de minst risicovolle en meest gebruikte methode.
  • Wolfman (Lycan)-integratie — De officieel bestaande vijfde klasse met haar kant-en-klare bestanden naar je project halen. Dit is minder "nieuwe klasse" en meer "een ontbrekende klasse aanvullen"; toch kost het serieus werk aan skills, balans en itembeperkingen.
  • Een echte nieuwe klasse op sourceniveau — Heb je de volledige source, dan alle bovenstaande lagen uitbreiden om een vijfde of zesde job te definiëren. De meest flexibele maar langste weg; vereist degelijke kennis van C++ en balans.

Een praktische routekaart

Ga je echt de sourceroute, dan is de verstandige volgorde: breid eerst de jobconstanten en alle stat-/skill-/itemtabellen in de server-source uit, compileer, en maak de klasse onzichtbaar (zonder model) aan in de DB om te bevestigen dat de kern haar accepteert. Voeg daarna de skill- en item-protodata toe. Ga pas op het einde naar de client: bereid de modellen voor, voeg de klasse toe aan de karaktercreatie en lijn de race-indexen uit met de server. Lees bij elke stap de syserr-logs — klassegerelateerde array-overflows (out of range) worden hier het vaakst betrapt. Haast je je en doe je alles tegelijk, dan wordt achterhalen uit welke laag de fout komt bijna onmogelijk.

Veelgestelde vragen

Kan een nieuwe klasse zonder de source worden toegevoegd?

Niet in de "echte" zin. De job index en de afhankelijke stat-/skill-/itemtabellen liggen vast in de spelkern en kunnen alleen door hercompilatie van de source worden uitgebreid. Zonder die source kun je alleen een bestaande klasse opnieuw thematiseren (reskin).

Telt het toevoegen van Wolfman als een nieuwe klasse?

Half en half. Wolfman is de officieel gedefinieerde vijfde klasse; haar toevoegen is geen klasse vanaf nul maken, maar er een integreren die bestaat maar in jouw project ontbreekt. Toch is het aanzienlijk werk op het vlak van skills, balans en itembeperkingen.

Wat is het verschil tussen een reskin en een echte nieuwe klasse?

Bij een reskin verandert de job index niet; het spel ziet dat personage nog steeds als de oude klasse, alleen de beelden en skillinhoud verschillen. Bij een echte nieuwe klasse wordt op kernniveau een volledig nieuwe job gedefinieerd, met eigen statformules, eigen itembeperkingen en een onafhankelijke skillboom.

Wil je een echt nieuwe klasse, of een slimme reskin? Ik kan de sourcesituatie van je project bekijken en de route plannen die met het minste risico de meeste impact oplevert. Neem contact met me op en laten we bespreken wat jouw server nodig heeft.

Bu kategorideki tüm yazılar →

Devamı için