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

Metin2-Bonus bearbeiten: Attr-Tabellen und Apply-Typen

Diese grünen Zeilen, die ein Spieler beim Überfahren eines Items sieht — „Max. TP +500", „Angriffstempo +8" — sind die Seele eines Servers. Metin2-Bonus bearbeiten ist die Kunst, festzulegen, welcher Bonus auf welchem Item mit welcher Wahrscheinlichkeit und mit welchem Wert auftauchen kann. All das steckt in zwei Tabellen der player-Datenbank und in den Apply-Typen des Spielkerns. In diesem Leitfaden gehe ich die Tabellenlogik, das Wahrscheinlichkeitssystem und das Hinzufügen eines völlig neuen Bonus durch — mit demselben Aufbau wie auf meinem eigenen Server, Runa2.

Zwei Tabellen: item_attr und item_attr_rare

Der Bonus-Pool liegt in zwei Tabellen der player-Datenbank:

  • item_attr — der Pool, aus dem die normalen (1.–4.) Bonuszeilen gezogen werden.
  • item_attr_rare — ein separater Pool für die 5./6. (seltene) Zeile, meist durch ein spezielles Item hinzugefügt.

Jede Zeile enthält einen apply-Typ, einen prob-Wert (Wahrscheinlichkeitsgewicht), Wertstufen lv1lv5 und Ein/Aus-Spalten, die angeben, auf welchen Item-Typen sie auftauchen kann:

SELECT apply, prob, lv1, lv2, lv3, lv4, lv5
FROM item_attr
WHERE weapon = 1
ORDER BY prob DESC;

Die Slot-Spalten sind typischerweise weapon, body, wrist, foots, neck, head, shield und ear. Eine 1 bedeutet, der Bonus kann auf diesem Item-Typ erscheinen; eine 0, dass er es nicht kann.

Wie prob funktioniert: Gewicht, kein Prozentsatz

Ein häufiges Missverständnis: prob ist kein Prozentsatz. Wenn der Kern einem Item einen Bonus gibt, summiert er die prob-Werte aller für diesen Slot markierten Zeilen (z. B. weapon=1) und würfelt innerhalb dieser Summe. Die Chance einer Zeile ist also ihr eigener prob / die Summe aller prob dieses Slots. Daraus folgt:

  • Um einen Bonus häufiger zu sehen, erhöhe seinen prob.
  • Alle Werte proportional zu skalieren ändert die relativen Chancen nicht — nur die Summe wächst.
  • Um einen Bonus ganz aus einem Slot zu entfernen, ist das Setzen seiner Slot-Spalte auf 0 sicherer als das Löschen der Zeile.

lv1–lv5: die Wertstufen

Wird einem Item ein Bonus hinzugefügt, stammt der gewürfelte Wert aus den Spalten lv1lv5, wobei lv1 die schwächste und lv5 die stärkste Stufe ist. Zum Beispiel, um den TP-Raub-Bonus auf Waffen zu verstärken:

UPDATE item_attr
SET lv1 = 1, lv2 = 2, lv3 = 3, lv4 = 4, lv5 = 6
WHERE apply = 'STEAL_HP';

Achtung: Die Spalte apply speichert den Typ ohne das Präfix „APPLY_" — also MAX_HP, ATT_SPEED, STEAL_HP. Diese Namen müssen mit der Tabelle im Spielkern übereinstimmen.

Apply-Typen: Woher kommen die Namen?

Jeder Apply-Typ ist im Spielkern an eine Zahl und einen Point-Typ (Statuswert) gebunden. Diese Zuordnung steht im Array aApplyInfo in srcs/game/src/constants.cpp:

const TValueName aApplyInfo[MAX_APPLY_NUM] =
{
    { "NONE",       APPLY_NONE,       POINT_NONE },
    { "MAX_HP",     APPLY_MAX_HP,     POINT_MAX_HP },
    { "STR",        APPLY_STR,        POINT_ST },
    { "ATT_SPEED",  APPLY_ATT_SPEED,  POINT_ATT_SPEED },
    { "STEAL_HP",   APPLY_STEAL_HP,   POINT_STEAL_HP },
    // ...
};

Die erste Spalte ("MAX_HP") ist exakt der apply-Wert in der DB. Die zweite ist die APPLY_-Enum aus length.h, die dritte der POINT_-Typ, der angibt, auf welchen Statuswert der Wert geschrieben wird. Um einen vorhandenen Bonus hinzuzufügen, brauchst du nur eine DB-Zeile — sein Name ist in dieser Tabelle bereits definiert.

Einen vorhandenen Bonus für einen neuen Item-Typ öffnen

Angenommen, der TP-Raub-Bonus soll auch auf Armbändern erscheinen. Du musst nur die Slot-Spalte dieser Zeile aktualisieren:

UPDATE item_attr
SET wrist = 1
WHERE apply = 'STEAL_HP';

Einen neuen Bonus zum Pool hinzuzufügen, ist nur ein INSERT:

INSERT INTO item_attr
  (apply, prob, lv1, lv2, lv3, lv4, lv5,
   weapon, body, wrist, foots, neck, head, shield, ear)
VALUES
  ('CRITICAL_PCT', 250, 1, 2, 3, 4, 5,
   1, 0, 0, 0, 0, 0, 0, 0);

Einen wirklich NEUEN Bonus (Apply) hinzufügen

Willst du einen völlig neuen Effekt definieren, der nicht im Pool existiert, reicht die DB nicht; du musst sowohl den Server- als auch den Client-Quellcode anfassen. Die Reihenfolge ist:

  • length.h — füge den neuen Typ zur APPLY_-Enum hinzu und aktualisiere MAX_APPLY_NUM.
  • constants.cpp — füge die Zeile { "NAME", APPLY_NAME, POINT_NAME } zu aApplyInfo hinzu.
  • char.cpp / char_battle.cpp — implementiere die PointChange-/Effekt-Anwendungslogik für den neuen POINT_-Typ (falls es ein neuer Point-Typ ist).
  • Client — die Apply-Nummern in item_length.h müssen identisch zum Server sein; sonst zeigt der Tooltip den falschen Bonus. Füge dann den neuen Text zum Apply-Namen-Wörterbuch in root/uiToolTip.py und zu den locale-Dateien hinzu.

Wenn die Nummern zwischen Server und Client auseinanderdriften, erscheint ein Bonus, den der Server „+5 STR" nennt, im Spiel als „+5 etwas anderes" — deshalb ist es entscheidend, beide Seiten synchron zu halten.

Die Änderung ausrollen

Die item_attr-Tabellen werden vom DB-Kern beim Start gelesen und an den Spielkern gesendet; nur das SQL zu ändern hat also keine sofortige Wirkung. Der übliche Ablauf: wende die Änderung an und starte den db- und game-Kern neu. Hast du den Quellcode angefasst (neuer Apply-Typ), musst du außerdem neu kompilieren und die neue Binary ausrollen. Aktualisiere vor dem Live-Gang immer ein paar Items auf einem Testserver und bestätige, dass die Boni korrekt auftauchen.

Häufige Fragen

Garantiert ein höherer prob, dass der Bonus auftaucht?

Nein. prob ist ein Gewicht; die Chance ist der prob deiner Zeile geteilt durch die Summe aller prob dieses Slots. Für eine Garantie müsstest du den prob der anderen Zeilen senken oder die Optionen dieses Slots reduzieren.

Ich habe das SQL geändert, aber im Spiel ändert sich nichts — warum?

Weil die attr-Tabellen im laufenden Betrieb nicht neu gelesen werden. Du musst den db- und game-Kern neu starten; erst danach nutzen neu vergebene Boni den aktualisierten Pool.

Was ist der Unterschied zwischen item_attr und item_attr_rare?

item_attr ist für die normalen 1.–4. Bonuszeilen, während item_attr_rare ein separater Pool für die seltene 5./6. Zeile ist. Sie werden durch unterschiedliche Items/Aktionen ausgelöst.

Willst du ein ausbalanciertes Bonussystem für deinen Server? Von attr-Tabellen bis zu neuen Apply-Typen entwerfe und balanciere ich dein Bonussystem von Grund auf — kontaktiere mich.

Bu kategorideki tüm yazılar →

Devamı için