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

Metin2 Nieuwe Skill Toevoegen: Source en Client

Een nieuwe skill toevoegen in Metin2 lijkt op het eerste gezicht het invoegen van één regel in één bestand, maar in werkelijkheid moeten twee aparte werelden gesynchroniseerd blijven: de source-kant (server) definieert de wiskunde en regels van de vaardigheid, terwijl de client-kant de speler het icoon, de beschrijving en het effect toont. Als de vnum aan beide kanten niet overeenkomt, verschijnt de skill nooit of wordt hij met het verkeerde effect geactiveerd. In deze gids bouwen we een skill vanaf nul op, van planning tot testen.

Eerst plannen: vnum, type en doelgroep

Elke skill wordt geïdentificeerd door een unieke vnum. Beslis voordat je een nieuwe vaardigheid toevoegt tot welke klasse hij behoort (warrior, ninja, sura, shaman), of hij actief of passief is, en wat het doel is. De doeltypes van Metin2-skills zijn grofweg:

  • SKILL_TARGET_TYPE_SELF — buff / zelfversterking.
  • SKILL_TARGET_TYPE_TARGET — schade of effect op één doel.
  • SKILL_TARGET_TYPE_AROUND — gebiedseffect op nabije vijanden.

Een ongebruikte vnum kiezen is cruciaal. Bekijk de bestaande skillrange zonder botsingen door de tabel in de speler-database te controleren:

SELECT dwVnum, szName FROM player.skill_proto ORDER BY dwVnum;

Source-kant: skill_proto en constanten

De server leest skilldata bij het opstarten uit de tabel player.skill_proto. Bij het toevoegen van de nieuwe rij moet je minstens deze velden invullen: dwVnum, szName, bType (klasse/type), bMaxLevel, bLevelStep, plus de SP/HP-kosten en de cooldown-kolommen. Schade- of genezingsformules staan meestal in polynoom- (formule-) stringkolommen zoals szPointPoly en szDurationPoly; deze worden in het spel berekend uit k (de skillniveaucoëfficiënt) en de stats van het personage.

Een typische formulekolom volgt deze logica:

-- voorbeeld szPointPoly (schadeformule)
1.5 * atk + 3.0 * k * lv

Hier is atk de aanvalskracht, lv het personageniveau en k een verhouding van 0–1 gekoppeld aan het skillniveau. De belangrijkste regel is de formules in balans houden met bestaande skills in plaats van ze te overdrijven; anders raakt de PvP-balans verstoord.

Extra C++-wijzigingen in de source zijn meestal alleen nodig als de skill een speciale mechaniek vereist (bijvoorbeeld een nieuw affect-type, of een extra effect per treffer). Voor standaard schade-/buffskills volstaat de bestaande ComputeSkill-flow in char_skill.cpp. Gebruik je een nieuw affect, vergeet dan niet je constante te definiëren in length.h / affect.h en serverproto en syncproto consistent te houden met de client.

Koppelen aan de skilltree en leervoorwaarden

Om de skill aan de speler te tonen, moet hij gekoppeld worden aan een leerpad. Op de meeste servers gebeurt dit via de Skill Master-NPC aan de questkant of via een skillbook-systeem. De nieuwe vnum toevoegen aan de skilllijst in de quest-lua ziet er doorgaans zo uit:

when 20309.chat."Nieuwe vaardigheid leren" begin
    if pc.get_level() < 40 then
        say("Je moet level 40 zijn om deze vaardigheid te leren.")
        return
    end
    pc.give_skillbook(141)  -- nieuwe skill-vnum
end

Hier kun je regels toevoegen zoals een levelcheck, een soul-pointvoorwaarde of itemverbruik. Gebruik je het skillbook-systeem, dan moet je het boek ook aan de item_proto-kant definiëren.

Client-kant: skilltable, beschrijving en icoon

Zelfs als de server de skill kent, ziet de speler een leeg vakje zolang de client niet weet hoe hij hem moet tekenen. Er zijn drie kernpunten om aan de clientkant te bewerken:

  • locale/<taal>/skilltable.txt — koppelt de vnum, naam, het type van de skill en de motiongraph/effect-referenties die hij gebruikt.
  • locale/<taal>/skilldesc.txt — de beschrijvingstekst die de speler bij hover ziet.
  • icon/skill/ — het .tga-icoon van de skill; het pad in skilltable.txt moet naar dit bestand wijzen.

skilltable.txt bestaat uit kolommen gescheiden door tabs; als de kolomvolgorde breekt, laadt de skill niet. Zorg er bij het toevoegen van de nieuwe rij voor dat de vnum exact hetzelfde is als aan de sourcekant. Het iconpad geef je hier ook op:

icon/skill/warrior/new_skill.tga

Effect en motion koppelen

Het visuele effect is het deeltjes-/animatiebestand dat afspeelt wanneer de skill wordt gebruikt. In Metin2 worden deze effecten meestal gekoppeld via .mse-bestanden (effect) en, voor de personageanimatie, via .msa/motiongraph. De betreffende kolom in skilltable.txt bepaalt welke motion en welk effect worden geactiveerd. Let bij het toevoegen van een nieuw effectbestand op twee dingen:

  • Het effectbestand moet daadwerkelijk bestaan in de pack/index-structuur van de client (bijvoorbeeld in de effect-pack); anders speelt er stilletjes niets af.
  • De animatie moet overeenkomen met een motion-index die is gedefinieerd in de motiongraph van het betreffende ras. Een niet-bestaande motion aanroepen kan het personage in een T-pose laten bevriezen.

Een bestaand effect hergebruiken (de .mse van een bestaande skill refereren) is de veiligste route voor de eerste test; zodra je hebt bevestigd dat alles gekoppeld is, kun je je eigen effect inwisselen.

Testen en debuggen

Test na het doorvoeren van de wijzigingen in deze volgorde: herstart eerst de server en controleer de opstartlogs op een skill_proto-leesfout, pack daarna de client, leer de skill en gebruik hem. Veelvoorkomende problemen:

  • Leeg skillicoon → verkeerd pad in skilltable.txt of de .tga ontbreekt in de pack.
  • Skill kan niet geleerd worden → een questvoorwaarde blokkeert, of het boekitem is niet gedefinieerd.
  • Effect speelt niet af → verkeerde .mse-referentie of motion-index.
  • Schade is 0 → een typefout in de formulestring; controleer de syserr-logs.

Houd syserr.txt altijd open; de meeste Metin2-skillfouten worden daar stil weggeschreven en geven geen symptoom in het spel.

Veelgestelde vragen

Moet ik altijd de source compileren voor een nieuwe skill?

Nee. Standaard schade- of buffskills kun je toevoegen met alleen skill_proto en de clientbestanden. Een source-compilatie is alleen nodig als je gedrag wilt dat het bestaande systeem niet heeft, zoals een nieuw affect-type of een aangepaste mechaniek per treffer.

Wat gebeurt er als de client- en source-vnum verschillen?

De skill verschijnt nooit of koppelt aan het verkeerde icoon/effect. De vnum aan beide kanten identiek houden is de meest cruciale regel; het is de oorzaak van de meeste "de skill werkt niet"-problemen.

Als het effect niet afspeelt, waar moet ik eerst kijken?

Bevestig eerst dat het .mse-effectbestand echt in de clientpack bestaat, en daarna dat de aangeroepen motion-index is gedefinieerd in de motiongraph van het betreffende ras. Ontbreekt een van beide, dan wordt het effect stil overgeslagen.

Bouw je een aangepast skillsysteem op je eigen server? Heb je hulp nodig bij Metin2-skillwerk, van mechaniekontwerp aan de sourcekant tot effect-/iconintegratie aan de clientkant, neem dan contact met me op.

Bu kategorideki tüm yazılar →

Devamı için