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

Metin2 Neuen Skill Hinzufügen: Source und Client

Einen neuen Skill in Metin2 hinzufügen sieht auf den ersten Blick aus wie das Einfügen einer einzigen Zeile in eine Datei, erfordert aber in Wahrheit, dass zwei getrennte Welten synchron bleiben: Die Source-Seite (Server) definiert die Mathematik und Regeln der Fähigkeit, während die Client-Seite dem Spieler das Icon, die Beschreibung und den Effekt zeigt. Stimmt der vnum auf beiden Seiten nicht überein, erscheint der Skill nie oder löst mit dem falschen Effekt aus. In dieser Anleitung bauen wir einen Skill von Grund auf, von der Planung bis zum Test.

Zuerst planen: vnum, Typ und Zielgruppe

Jeder Skill wird durch einen eindeutigen vnum identifiziert. Bevor du eine neue Fähigkeit hinzufügst, entscheide, zu welcher Klasse sie gehört (Krieger, Ninja, Sura, Schamane), ob sie aktiv oder passiv ist und was ihr Ziel ist. Die Zieltypen von Metin2-Skills sind grob:

  • SKILL_TARGET_TYPE_SELF — Buff / Selbstverstärkung.
  • SKILL_TARGET_TYPE_TARGET — Schaden oder Effekt auf ein einzelnes Ziel.
  • SKILL_TARGET_TYPE_AROUND — Flächeneffekt auf nahe Gegner.

Einen ungenutzten vnum zu wählen ist entscheidend. Um den bestehenden Skillbereich ohne Kollisionen zu sehen, prüfe die Tabelle in der Spieler-Datenbank:

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

Source-Seite: skill_proto und Konstanten

Der Server liest die Skilldaten beim Start aus der Tabelle player.skill_proto. Beim Hinzufügen der neuen Zeile musst du mindestens diese Felder ausfüllen: dwVnum, szName, bType (Klasse/Typ), bMaxLevel, bLevelStep sowie die SP/HP-Kosten und die cooldown-Spalten. Schadens- oder Heilformeln stehen meist in Polynom- (Formel-) String-Spalten wie szPointPoly und szDurationPoly; diese werden im Spiel aus k (dem Skill-Level-Koeffizienten) und den Werten des Charakters berechnet.

Eine typische Formelspalte folgt dieser Logik:

-- szPointPoly Beispiel (Schadensformel)
1.5 * atk + 3.0 * k * lv

Hier ist atk die Angriffskraft, lv der Charakterlevel und k ein Verhältnis von 0–1, das an den Skilllevel gebunden ist. Die wichtigste Regel ist, die Formeln im Gleichgewicht zu bestehenden Skills zu halten, statt sie zu übersteigern; sonst bricht die PvP-Balance.

Zusätzliche C++-Änderungen in der Source sind in der Regel nur nötig, wenn der Skill eine spezielle Mechanik erfordert (zum Beispiel einen neuen Affect-Typ oder einen zusätzlichen Effekt pro Treffer). Für Standard-Schaden-/Buffskills genügt der bestehende ComputeSkill-Ablauf in char_skill.cpp. Verwendest du einen neuen Affect, denke daran, deine Konstante in length.h / affect.h zu definieren und serverproto und syncproto mit dem Client konsistent zu halten.

An den Skillbaum und Lernbedingungen binden

Damit der Skill dem Spieler erscheint, muss er an einen Lernpfad gebunden werden. Auf den meisten Servern geschieht das über den Skill-Master-NPC auf der Questseite oder über ein Skillbuch-System. Den neuen vnum zur Skillliste im Quest-Lua hinzuzufügen sieht typischerweise so aus:

when 20309.chat."Neue Fähigkeit lernen" begin
    if pc.get_level() < 40 then
        say("Du musst Level 40 sein, um diese Fähigkeit zu lernen.")
        return
    end
    pc.give_skillbook(141)  -- neuer Skill-vnum
end

Hier kannst du Regeln wie eine Levelprüfung, eine Seelenpunkt-Bedingung oder Item-Verbrauch hinzufügen. Nutzt du das Skillbuch-System, musst du das Buch auch auf der item_proto-Seite definieren.

Client-Seite: skilltable, Beschreibung und Icon

Selbst wenn der Server den Skill kennt, sieht der Spieler ein leeres Feld, solange der Client nicht weiß, wie er ihn zeichnen soll. Es gibt drei Kernpunkte, die auf der Client-Seite zu bearbeiten sind:

  • locale/<Sprache>/skilltable.txt — ordnet vnum, Name, Typ des Skills und die genutzten motiongraph/Effekt-Referenzen zu.
  • locale/<Sprache>/skilldesc.txt — der Beschreibungstext, den der Spieler beim Überfahren sieht.
  • icon/skill/ — das .tga-Icon des Skills; der Pfad in skilltable.txt muss auf diese Datei zeigen.

skilltable.txt besteht aus durch Tabulatoren getrennten Spalten; bricht die Spaltenreihenfolge, lädt der Skill nicht. Stelle beim Hinzufügen der neuen Zeile sicher, dass der vnum exakt derselbe ist wie auf der Source-Seite. Den Icon-Pfad gibst du ebenfalls hier an:

icon/skill/warrior/new_skill.tga

Effekt und Motion binden

Der visuelle Effekt ist die Partikel-/Animationsdatei, die abgespielt wird, wenn der Skill benutzt wird. In Metin2 werden diese Effekte meist über .mse-Dateien (Effekt) und für die Charakteranimation über .msa/motiongraph gebunden. Die betreffende Spalte in skilltable.txt gibt an, welche Motion und welcher Effekt ausgelöst werden. Achte beim Hinzufügen einer neuen Effektdatei zum Projekt auf zwei Dinge:

  • Die Effektdatei muss in der Pack/Index-Struktur des Clients tatsächlich vorhanden sein (zum Beispiel im effect-Pack); sonst spielt stillschweigend nichts ab.
  • Die Animation muss einem in der motiongraph der jeweiligen Rasse definierten Motion-Index entsprechen. Eine nicht existierende Motion aufzurufen kann den Charakter in einer T-Pose einfrieren.

Einen vorhandenen Effekt wiederzuverwenden (die .mse eines bestehenden Skills zu referenzieren) ist der sicherste Weg für den ersten Test; sobald du bestätigt hast, dass alles verdrahtet ist, kannst du deinen eigenen Effekt einsetzen.

Testen und Debuggen

Teste nach dem Anwenden der Änderungen in dieser Reihenfolge: Starte zuerst den Server neu und prüfe die Boot-Logs auf einen skill_proto-Lesefehler, packe danach den Client, lerne den Skill und benutze ihn. Häufige Probleme:

  • Leeres Skill-Icon → falscher Pfad in skilltable.txt oder die .tga fehlt im Pack.
  • Skill lässt sich nicht lernen → eine Questbedingung blockiert, oder das Buch-Item ist nicht definiert.
  • Effekt spielt nicht ab → falsche .mse-Referenz oder Motion-Index.
  • Schaden ist 0 → ein Tippfehler im Formel-String; prüfe die syserr-Logs.

Halte syserr.txt immer offen; die meisten Metin2-Skillfehler werden dort stillschweigend protokolliert und zeigen kein Symptom im Spiel.

Häufig gestellte Fragen

Muss ich für einen neuen Skill immer die Source kompilieren?

Nein. Standard-Schaden- oder Buffskills lassen sich mit nur skill_proto und den Client-Dateien hinzufügen. Eine Source-Kompilierung ist nur nötig, wenn du ein Verhalten willst, das das bestehende System nicht hat, etwa einen neuen Affect-Typ oder eine eigene Mechanik pro Treffer.

Was passiert, wenn der Client- und Source-vnum sich unterscheiden?

Der Skill erscheint nie oder wird dem falschen Icon/Effekt zugeordnet. Den vnum auf beiden Seiten identisch zu halten ist die kritischste Regel; das ist die Ursache der meisten "der Skill funktioniert nicht"-Probleme.

Wenn der Effekt nicht abspielt, wo sollte ich zuerst nachsehen?

Bestätige zuerst, dass die .mse-Effektdatei wirklich im Client-Pack existiert, und danach, dass der aufgerufene Motion-Index in der motiongraph der jeweiligen Rasse definiert ist. Fehlt eines von beiden, wird der Effekt stillschweigend übersprungen.

Baust du ein eigenes Skillsystem auf deinem eigenen Server? Wenn du Hilfe bei Metin2-Skillarbeit brauchst, vom Mechanikdesign auf der Source-Seite bis zur Effekt-/Icon-Integration auf der Client-Seite, nimm Kontakt mit mir auf.

Bu kategorideki tüm yazılar →

Devamı için