Metin2 skills bewerken is een van de taken die het meest direct bepalen hoe de balans van een server aanvoelt: hoeveel schade een vaardigheid doet, hoeveel seconden het effect duurt, en hoe lang je wacht voordat je hem weer kunt gebruiken. Niets daarvan leeft in een magische editor — het wordt geregeld door polynoom-expressies (formules) die zijn opgeslagen in de server-side tabel skill_proto en de client-side data skill_table. In deze gids loop ik beide structuren door, de variabelen erin, en hoe je schade en duur afstemt zonder de curve te breken.
Het verschil tussen skill_proto en skill_table
De twee bronnen verwarren is de meest gemaakte fout, dus laten we eerst hun rollen scheiden:
- skill_proto: een MySQL-tabel in de
player-database. Hier staat het werkelijke gedrag van de vaardigheid — schadeformule, duur, SP-kosten, cooldown, vereiste skill, maximumniveau. De berekening gebeurt server-side op basis van deze tabel. - skill_table (client): het vaardigheidsdefinitiebestand in de client. Het draagt visuele/gedragsmatige metadata zoals icoon, naam, animatie en doeltype. Het bepaalt geen schade; het vertelt de speler alleen wat er getoond moet worden.
De regel is simpel: balans (schade, duur, cooldown) leeft in skill_proto; uiterlijk leeft in skill_table. Zijn de twee inconsistent, dan toont de client iets anders dan de server berekent, en klagen spelers dat "de schade verkeerd is".
De skill_proto-kolommen leren kennen
De tabel is breed, maar bij het afstemmen raak je steeds dezelfde handvol kolommen aan. De meest kritieke:
dwVnum— het unieke nummer van de vaardigheid (bv. Drievoudige Slag, Geestpijl, enz.).bMaxLevelenbLevelStep— in hoeveel stappen de skill stijgt en welk plafond hij bereikt.szPointOn+szPointPoly— waarop het effect wordt toegepast (bv.HP) en de hoofdformule voor schade/effect.szSPCostPoly— de manakosten per gebruik.szDurationPoly— voor effecten met tijdsduur (gif, verdoving, buff), de duur in seconden.szCooldownPoly— de cooldown in seconden.szMasterBonusPolyPoint— de bonus die wordt toegevoegd op Master- / Grand Master-rangen.
De meeste vaardigheden hebben ook kolommen szPointOn2/szPointPoly2 en szPointOn3/szPointPoly3 voor een tweede en derde effect — bijvoorbeeld een aanval die zowel schade als een vertraging toepast.
Polynoomvariabelen: wat laat de formules schalen?
De waarden in deze kolommen zijn geen gewone getallen maar korte wiskundige expressies die de server tijdens runtime oplost. Een waarde wijzigen zonder de gedefinieerde variabelen te kennen is blind varen. De meest gebruikte:
k— de niveaucoëfficiënt van de skill; een ratio die groeit naarmate de skill stijgt. De hoofdvermenigvuldiger die schade met de rang laat schalen.lv— het niveau van het personage dat de spreuk werpt.iq,str,dex,con— de kernstats van het personage; welke stat per klasse dominant is, wordt hier bepaald.atk— de aanvalswaarde (wapen + bonussen).
Een voorbeeld van een schadeformule ziet er zo uit:
szPointPoly = 1.5 * k + 2.0 * atk + 0.5 * str
Hier versterkt het verhogen van k de vaardigheid naarmate hij in niveau stijgt; het verhogen van de atk-vermenigvuldiger verhoogt de gear-afhankelijke burst; en de str-vermenigvuldiger beloont de statverdeling. Wil je een waarde grofweg halveren, halveer dan de vermenigvuldiger — voeg geen vast plafond toe, want plafonds breken het spel op hoog niveau.
Schade, duur en cooldown balanceren
In de praktijk beïnvloeden de drie assen elkaar. Verhoog niet alleen de schade, maar denk aan het drietal samen:
- Schade (
szPointPoly): op PvP-gerichte servers maken zelfs kleine veranderingen in de vermenigvuldiger een groot verschil. Verschuif dek-vermenigvuldiger met 10% en test; verdubbel hem niet zomaar. - Duur (
szDurationPoly): voor controle-effecten zoals stun/slaap is duur verlengen sterker dan schade. In PvP weegt een stun van 3 seconden zwaar op tegen 20% meer schade. - Cooldown (
szCooldownPoly): is een vaardigheid te sterk, dan is de cooldown verlengen vaak een nettere oplossing dan schade verlagen; het behoudt de burst en voorkomt spam.
Een voorbeeldformule voor een effect met tijdsduur:
szDurationPoly = 2.0 + 1.0 * k -- seconden
szCooldownPoly = 16.0 - 4.0 * k -- kortere wachttijd op hogere rang
Een expressie gebruiken die met het niveau afneemt op de cooldown (een negatieve coëfficiënt) laat de vaardigheid op hoge rang soepeler aanvoelen; zorg er alleen voor dat de waarde nooit onder nul zakt.
Wijzigingen veilig toepassen en testen
skill_proto wordt bij het opstarten van de server door de game core in het geheugen geladen. Dus zelfs als je de tabel live bewerkt, heeft de wijziging niet meteen effect. Een veilige werkwijze:
- Maak altijd eerst een back-up:
mysqldump player skill_proto > skill_proto_backup.sql - Voer de wijziging uit met een UPDATE en maak duidelijk welke vaardigheid je aanraakt:
UPDATE skill_proto
SET szPointPoly = '1.3 * k + 2.0 * atk + 0.5 * str'
WHERE dwVnum = 1;
- Herstart de core (of gebruik het skill-reload-mechanisme van je server) zodat de nieuwe waarden in het geheugen geladen worden.
- Meet op een testpersonage schade en duur bij elke rang (1, M1, P, G); werken op één rang betekent niet dat de hele curve in balans is.
Veranderde aan de clientkant een icoon of naam, vergeet dan niet ook skill_table bij te werken en de client opnieuw in te pakken; anders zien spelers de oude info. Eén vaardigheidswijziging op een gesloten testserver proberen voordat je live gaat, voorkomt het scenario "iedereen huilde na de balanspatch".
Veelgemaakte fouten
- De formule vervangen door een vast getal: schrijf je
500, dan slaat de vaardigheid op elke rang even hard; de niveaucurve verdwijnt. - Een variabelenaam verkeerd spellen: een ongedefinieerde variabele zet de formule op nul; de vaardigheid doet "0 schade".
- skill_proto vergeten en alleen de client bewerken: het beeld verandert, de schade niet.
- Zonder back-up werken: één foute UPDATE kan een hele klasse onbruikbaar maken.
Veelgestelde vragen
Moet ik de server herstarten voor een schadewijziging?
Meestal wel. Omdat skill_proto bij het opstarten in het geheugen wordt geladen, verschijnen UPDATEs niet in het spel zonder de core te herstarten (of een skill-reload-commando te gebruiken, als je build dat heeft).
Wat stelt de variabele k precies voor?
k is een coëfficiënt gekoppeld aan het huidige niveau van de vaardigheid; hij groeit naarmate de skill stijgt en laat schade/duur met de rang schalen. Stem stats af voor vaste kracht, en de k-vermenigvuldiger voor kracht die met het niveau groeit.
Ik wil een vaardigheid in PvP verzwakken — wat moet ik veranderen?
Probeer eerst de cooldown te verlengen (szCooldownPoly); dit behoudt de burst en snijdt de spam weg. Is dat niet genoeg, verlaag dan de k-vermenigvuldiger in kleine stappen en meet na elke wijziging.
Skillbalans kan je server zowel maken als breken. Wil je een opzet die skill_proto-formules veilig bewerkt, PvP-balans test en wijzigingen tussen versies bijhoudt, neem dan contact met me op — laten we samen een schoon balansplan op maat van jouw server bouwen.