Als je verder wilt gaan dan gewone paarden en je spelers gevechtsmounts wilt aanbieden, heb je echte controle nodig over het metin2 mount-systeem. De klassieke rijmechaniek zit kant-en-klaar in de meeste clients; het echte werk is mounts als items definiëren, aan elke mount een model en bonussen toewijzen, gevechtsmounts scheiden van decoratieve, en dat alles balanceren zonder de economie van je server te slopen. In deze gids loop ik de volledige pijplijn door, van item_proto tot servercode en quest-functies, stap voor stap.
Hoe het mount-systeem werkt
In Metin2 is een mount visueel gezien een mob-model waar het personage op zit. Dat betekent dat elke mount eigenlijk een record in mob_proto is met een eigen vnum; het personage "rijdt" op die vnum en de server voegt een RIDING-vlag toe aan zijn status. Wat dit alles in gang zet, is het mount-item in de inventaris. De flow verloopt zo:
- De speler gebruikt een mount-item (dubbelklik).
- De server leest de mob-vnum die aan dat item is gekoppeld en zet het personage op dat model.
- Zolang de mount actief is, worden bonus-affects op het personage toegepast (HP, bewegingssnelheid, aanvalswaarde, enz.).
- Wanneer de duur afloopt of de speler afstijgt, worden de mount en zijn bonussen verwijderd.
Deze scheiding is belangrijk: het visuele (mob-model), de trigger (inventaris-item) en het effect (bonus-affects) zijn drie aparte lagen. Verkeerd aan elkaar geknoopt eindig je met een onzichtbare mount of een item waarvan de bonus nooit afgaat.
item_proto: het mount-item definiëren
Voor elke mount maak je een record in de tabel item_proto. Mount-items zijn bruikbare (USE) items die het personage bij gebruik op de mount zetten. Het kritieke veld is dat wat aangeeft op welk mount-model het item verwijst — een van de value-velden bevat dus de mob_proto-vnum van de mount. Een typisch voorbeeld:
vnum | name | type | subtype | value0 | value1
---------+-------------------+-----------+-------------+--------+-------
71114 | Strijdros (Rood) | ITEM_USE | USE_MOUNT | 20114 | 0
Hier is value0 de mob-vnum van de mount (voorbeeld: 20114) en kan value1 dienen voor duurcontrole (in seconden; 0 = onbeperkt). Veldnamen en -volgorde verschillen per sourceversie, dus gebruik je eigen item_proto-sjabloon als referentie en verzin geen waarden. Vergeet na de wijziging niet item_proto ook aan de clientzijde door te voeren (meestal de bestanden item_proto en item_names); anders verschijnt het item niet, of toont het "leeg", in de client.
Het model en de bonussen van de mount
De mount zelf wordt gedefinieerd in mob_proto. De belangrijkste onderdelen hier zijn het modelbestand (de .gr2 / motion-pack van de mount) en het correct instellen van het type van de mount. Mount-bonussen zijn affects die activeren wanneer de speler opstijgt, en ze worden meestal op een van twee manieren toegekend:
- Vaste bonussen: ingebakken in de mount, identiek bij elke rit (bijv. +20% bewegingssnelheid).
- Quest-gebaseerde bonussen: toegevoegd via questlogica wanneer de speler opstijgt — getimed of voorwaardelijk.
De tweede methode is veel flexibeler, omdat je de bonus kunt wijzigen zonder code te hercompileren, gewoon door een questbestand bij te werken. Wil je de serversource liever niet compileren, dan is alle balanstuning aan de questzijde houden de slimme keuze.
Gevechtsmounts en quest-functies
Metin2 kent twee soorten mounts: de gewone mount, puur decoratief of voor snelheid, en de gevechtsmount, waarmee je kunt aanvallen terwijl je rijdt. Een gevechtsmount laat je je wapen gebruiken terwijl je in het zadel zit en speciale bereden vaardigheden activeren (zoals een charge-aanval). Dit gedrag wordt in servercode bepaald op basis van het mount-type.
Om mounts vanuit een quest te beheren gebruik je de ingebouwde pc-functies van Metin2. De meest gebruikte:
-- Zet de speler 60 seconden op mount 20114
pc.mount(20114, 60)
-- Zit de speler momenteel op een mount?
if pc.is_mount() then
say("Je zit al op een mount.")
end
-- Afstijgen
pc.unmount()
-- Pas een getimede bonus toe bij het opstijgen
-- (apply-type, waarde, duur[sec])
pc.mount_bonus(apply.MOV_SPEED, 20, 60)
Wil je een mount-item aan een quest koppelen, dan vang je het itemgebruik op en roep je daar pc.mount aan:
quest mount_strijdros begin
state start begin
when 71114.use begin
if pc.is_mount() then
pc.unmount()
else
pc.mount(20114, 0) -- onbeperkt rijden
pc.mount_bonus(apply.MAX_HP, 3000, 0)
pc.mount_bonus(apply.ATT_GRADE_BONUS, 50, 0)
end
end
end
end
Hier verzorgt hetzelfde item zowel het opstijgen als het afstijgen: zit de speler al op de mount dan stijgt hij af, anders stijgt hij op. Bonussen toekennen met pc.mount_bonus laat je alle balanstuning in één questbestand bundelen. Belangrijk: zorg dat de apply-constanten die je gebruikt exact overeenkomen met de definities in je serversource; een verkeerd apply-type doet stilletjes niets, of geeft een onverwachte bonus.
Balanceren: bonussen onder controle houden
Mount-bonussen zijn een van de snelste manieren om de PvP- en economiebalans van een server te slopen. Een krachtige mount die voor iedereen bereikbaar is wordt een permanente stat-buff en dwingt spelers om "te moeten rijden". Een paar praktische regels:
- Houd bonussen bescheiden. Bewegingssnelheid is een natuurlijke mount-bonus; maar aanvals-/verdedigingsstats opblazen sloopt je hele balanstabel. Begin klein en verhoog op basis van spelersfeedback.
- Zet gevechtsmounts op een aparte laag. Een gevechtsmount is een sterk voordeel; maak er geen goedkoop item van dat iedereen eindeloos kan gebruiken. Getimed houden (event of cash shop) bewaart de balans.
- Beperk ze op PvP-maps. Mount-bonussen, of het opstijgen zelf, uitschakelen in guild wars of arena's voorkomt dat skill verliest van een item.
- Denk duur en kosten samen. Een gratis permanente mount heeft geen waarde; getimede, redelijk geprijsde mounts houden zowel de economie als de doelen in het spel levend.
Controleer na elke wijziging de syserr-logs: een verkeerde vnum of een ontbrekend model kan een stille crash of een onzichtbare-mount-bug veroorzaken wanneer de speler opstijgt.
Testen en live gaan
Voor je een mount live zet, loop je deze checklist door met een GM-account: verschijnt de mount wanneer het item wordt gebruikt, worden de bonussen toegepast (open de personage-info en verifieer de stats), stijgt hij netjes af wanneer de tijd verstrijkt of via pc.unmount(), en blijft de mount niet vastzitten in randgevallen als teleport, dood of guild war. Zorg dat de item_proto van client en server gesynchroniseerd zijn; de meest voorkomende bug is een mount die op de server bestaat maar niet naar de client is doorgevoerd, zodat hij voor spelers nooit verschijnt.
Veelgestelde vragen
Wat is het verschil tussen een mount en een pet?
Een pet is een aparte entiteit die naast het personage loopt, zelf bonussen geeft en meestal gevoerd moet worden. Een mount is een model waar het personage op zit en geeft alleen een bonus zolang je rijdt. Onder de motorkap rusten beide op een mob-model, maar ze worden met verschillende vlaggen en mechanieken beheerd.
Kan ik bonussen wijzigen zonder code te compileren?
Ja. Ken je bonussen toe via pc.mount_bonus vanuit een questbestand, dan hoef je de serversource niet te hercompileren; werk gewoon de quest bij en trigger een quest reload van de map quest. Dat versnelt balanstests enorm.
Mijn mount is onzichtbaar als ik rijd, waarom?
Bijna altijd een client-server-mismatch: het mob_proto-record van de mount bestaat op de server, maar de mob_proto van de client of de model-pack (.gr2/motion) ontbreekt. Controleer eerst of de vnums overeenkomen, daarna of het modelbestand in de client-pack aanwezig is; syserr en de client-log wijzen meestal het ontbrekende bestand aan.
Stel je een gebalanceerd mount-systeem op je server in? Van gevechtsmounts tot bonusbalans, we kunnen samen werken aan Metin2 serversource, quests en item-editing. Neem contact met me op om je project te bespreken.