Vroeg of laat wil je bij het draaien van een private server je eigen wezens toevoegen, en in het hart van die klus staat het metin2 mob proto bestand. De mob proto is de "identiteitskaart" van elk monster, elke NPC en elke boss op de server: een grote tabel die niveau, levenspunten, schade, ras, weerstanden en gedropte items op één plek bewaart. In deze gids leggen we de velden in gewone taal uit en bouwen we daarna ons eigen monster op een vrije VNUM, correct geregistreerd op zowel server als client.
Wat is de mob proto en waar staat hij?
In officiële en oudere 40k-gebaseerde serverfiles worden monstergegevens op twee manieren opgeslagen. De klassieke methode gebruikt een leesbaar mob_proto.txt bestand; moderne opstellingen bewaren dezelfde gegevens in de MySQL-tabel player.mob_proto, en de tool dump_proto genereert daaruit het versleutelde mob_proto bestand dat de client kan lezen. Welk systeem je ook gebruikt, de logica is identiek: elke rij is één monster, en elke kolom is een van zijn eigenschappen.
Onthoud dat er twee kanten zijn. De server leest de proto voor de gevechtsberekeningen (leven, schade, weerstanden, AI). De client heeft een eigen kopie nodig om de naam, het model en de map van het monster te kennen. Als beide kanten niet dezelfde VNUM herkennen, is het monster onzichtbaar of crasht de client.
De belangrijkste velden
Een proto-rij heeft tientallen kolommen, maar een handvol bepaalt het karakter van een monster:
- VNUM — De unieke identificatie. Het hele systeem communiceert via dit nummer; het mag nooit botsen.
- NAME / LOCALE_NAME — De naam die de speler ziet. Voor lokalisatie wordt ook
mob_names.txtgebruikt. - RANK —
PAWN,S_PAWN,KNIGHT,S_KNIGHT,BOSS,KING. Bepaalt of het een gewoon monster of een boss is. - TYPE —
MONSTER,NPC,STONE(metin-steen),WARP,DOOR, enzovoort. Voor een wezen gebruik jeMONSTER. - BATTLE_TYPE — Aanvalsstijl zoals
MELEE,RANGEofMAGIC. - LEVEL, MAX_HP, ST/DX/HT/IQ, DAMAGE_MIN/MAX, DEF — De kerngevechtsstatistieken.
- AI_FLAG — Gedragsvlaggen zoals
AGGRESSIVE,COWARD(vlucht) enNOMOVE(blijft staan). - RACE_FLAG — Ras zoals
ANIMAL,UNDEAD,DEVILofORC. Sommige items en vaardigheden doen bonusschade op basis hiervan. - IMMUNE_FLAG — Immuniteiten zoals
STUN,SLOWenPOISON. - RESIST_* / ENCHANT_* — Weerstand tegen wapentypes en magie, plus effecten die aan zijn aanvallen worden toegevoegd (gif, verdoving, kritiek).
- EXP, GOLD_MIN/MAX, DROP_ITEM — Beloningen en de koppeling naar zijn dropgroep.
- FOLDER — De naam van de modelmap op de client. Is dit fout, dan vindt de client het model niet.
Kies een vrije VNUM voor je nieuwe monster
De eerste regel is botsingen vermijden. Een bestaande VNUM overschrijven breekt elke regen en quest die aan dat monster hangt. Het bereik vanaf 20000 is meestal vrij voor eigen content. Bevestig dat het nummer echt leeg is in de huidige tabel:
-- Op een MySQL-gebaseerde opstelling
SELECT vnum, locale_name FROM player.mob_proto WHERE vnum = 20801;
Is het resultaat leeg, dan is dat nummer van jou. Werk je met het tekstbestand, zoek dan in mob_proto.txt naar dezelfde VNUM om zeker te zijn dat hij niet bezet is.
Bouw de rij
Een praktische aanpak is de rij van een bestaand, vergelijkbaar monster kopiëren en aanpassen, zodat je niet elke kolom vanaf nul invult. Laten we bijvoorbeeld een opgewaardeerde "Schaduwwolf" baseren op een gewone wolf. In het tekstbestand is de rij gescheiden door TAB en moet hij exact de volgorde van de kopregel volgen:
# VNUM NAME RANK TYPE BATTLE_TYPE LEVEL ... MAX_HP ... EXP GOLD_MIN GOLD_MAX ...
20801 Shadow_Wolf KNIGHT MONSTER MELEE 42 ... 18500 ... 9200 500 1400 ...
Omdat het aantal en de volgorde van kolommen per serverfiles-versie verschillen, leid de echte rij altijd af van een ander monster in hetzelfde bestand; verzin geen kolommen. Aan de MySQL-kant doe je hetzelfde met een INSERT:
INSERT INTO player.mob_proto (vnum, name, locale_name, rank, type, battle_type, level, max_hp, exp, gold_min, gold_max)
VALUES (20801, 'Shadow_Wolf', 'Schaduwwolf', 'KNIGHT', 'MONSTER', 'MELEE', 42, 18500, 9200, 500, 1400);
-- de overige kolommen vallen terug op de standaardwaarden van de tabel; pas ze aan met UPDATE indien nodig
Voeg voor de lokalisatie van de naam ook de VNUM en weergavenaam toe aan mob_names.txt. Definieer zijn drops door de VNUM te koppelen in mob_drop_item.txt / common_drop_item.txt of via een quest.
Vergeet de clientkant niet
Zelfs als de server het monster kent, moet de client dezelfde VNUM herkennen om het op het scherm van de speler te tonen. Daarvoor genereer je met dump_proto een nieuwe client-mob_proto en verspreid je die naar de spelersclient. De modelmap die in het veld FOLDER staat, moet ook echt in de clientpacks bestaan (meestal het .gr2 model en de textures). Voeg je geen gloednieuw model toe, dan is verwijzen naar de map van een bestaand wolfmodel de veiligste weg.
Laden en testen
Zodra de wijzigingen klaar zijn, herstart de betreffende cores (de db- en game/ch-lagen) zodat de proto vers wordt ingelezen op de server. Test daarna in het spel met een GM-account:
// Het monster naast je laten verschijnen met een GM-commando (afhankelijk van de serverfiles)
/m 20801
Verschijnt het monster met de juiste naam, het juiste model en redelijke stats, dan is de proto-kant klaar. Om het permanent op een map te laten verschijnen, voeg je een spawn-regel toe aan de regen.txt van de mapserver (of boss.txt voor bosses). Twee fouten komen vaak voor tijdens het testen: het monster verschijnt niet op de client (verkeerde FOLDER of verouderde client-proto) en de server crasht bij het opstarten (het aantal kolommen van de rij komt niet overeen met de kop).
Veelgestelde vragen
Moet ik mob_proto.txt of MySQL gebruiken?
Dat hangt af van welk systeem jouw serverfiles lezen. Nieuwere bestanden steunen meestal op de tabel player.mob_proto en bouwen de client-proto met dump_proto. Bij opstellingen die beide gebruiken, moet de bron altijd dezelfde zijn, anders zien server en client verschillende gegevens en ontstaat er een conflict.
Mijn nieuwe monster verschijnt maar dropt niets — waarom?
De mob proto bevat de item-drops niet rechtstreeks; drops worden gedefinieerd in aparte bestanden zoals mob_drop_item.txt en common_drop_item.txt, of in quests. Heb je de nieuwe VNUM niet aan een van die systemen gekoppeld, dan dropt het monster niets.
Waarom crasht de server bij het opstarten?
De meest voorkomende oorzaak is dat het aantal kolommen van je nieuwe rij, of het type van een veld (bijvoorbeeld tekst waar een getal wordt verwacht), niet overeenkomt met de kopregel. Begin altijd door de rij van een bestaand monster te kopiëren en verstoor de tab-uitlijning niet.
Wil je eigen monsters, bosses of een gebalanceerde mob-economie voor je eigen server? Heb je hulp nodig met Metin2 proto-, quest- en systeemaanpassingen, neem dan contact met me op — samen zetten we je project op een stevige basis.