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

Metin2-bonussen bewerken: attr-tabellen en apply-types

Die groene regels die een speler ziet bij het zweven over een item — "Max HP +500", "Aanvalssnelheid +8" — zijn de ziel van een server. Metin2-bonussen bewerken is het ambacht van bepalen welke bonus op welk item kan vallen, met welke kans en met welke waarde. Dat alles leeft in twee tabellen in de player-database en in de apply-types van de game-core. In deze gids loop ik door de tabellogica, het kanssysteem en het toevoegen van een gloednieuwe bonus, met dezelfde opzet als mijn eigen server, Runa2.

Twee tabellen: item_attr en item_attr_rare

De bonuspool zit in twee tabellen in de player-database:

  • item_attr — de pool waaruit de normale (1e–4e) bonusregels vallen.
  • item_attr_rare — een aparte pool voor de 5e/6e (zeldzame) regel, meestal toegevoegd door een speciaal item.

Elke rij bevat een apply-type, een prob (kansgewicht), waardestappen lv1lv5, en aan/uit-kolommen die aangeven op welke itemtypes hij kan vallen:

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

De slotkolommen zijn doorgaans weapon, body, wrist, foots, neck, head, shield en ear. Een 1 betekent dat de bonus op dat itemtype kan verschijnen; een 0 dat dat niet kan.

Hoe prob werkt: gewicht, geen percentage

Een veelvoorkomend misverstand: prob is geen percentage. Wanneer de core een bonus aan een item geeft, telt hij de prob-waarden op van alle rijen die voor dat slot zijn aangevinkt (bijv. weapon=1) en trekt binnen dat totaal. De kans van een rij is dus zijn eigen prob / de som van alle prob's voor dat slot. Gevolg:

  • Wil je een bonus vaker zien, verhoog dan zijn prob.
  • Alle waarden proportioneel opschalen verandert de relatieve kansen niet — alleen het totaal groeit.
  • Om een bonus volledig uit een slot te halen, is de slotkolom op 0 zetten veiliger dan de rij verwijderen.

lv1–lv5: de waardestappen

Wanneer een bonus aan een item wordt toegevoegd, komt de getrokken waarde uit de kolommen lv1lv5, met lv1 als zwakste en lv5 als sterkste stap. Bijvoorbeeld om de HP-steal-bonus op wapens te versterken:

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

Let op: de apply-kolom bewaart het type zonder het "APPLY_"-voorvoegsel — dus MAX_HP, ATT_SPEED, STEAL_HP. Deze namen moeten overeenkomen met de tabel in de game-core.

Apply-types: waar komen de namen vandaan?

Elk apply-type is gekoppeld aan een nummer en een point-type (statistiek) in de game-core. Die koppeling zit in de 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 },
    // ...
};

De eerste kolom ("MAX_HP") is precies de apply-waarde in de DB. De tweede is de APPLY_-enum uit length.h, en de derde is het POINT_-type dat aangeeft op welke statistiek de waarde wordt geschreven. Voor een bestaande bonus heb je alleen een DB-rij nodig — zijn naam is al in deze tabel gedefinieerd.

Een bestaande bonus openstellen voor een nieuw itemtype

Stel dat je wilt dat de HP-steal-bonus ook op armbanden valt. Je hoeft alleen de slotkolom op die rij bij te werken:

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

Een nieuwe bonus aan de pool toevoegen is gewoon een 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);

Een echt NIEUWE bonus (apply) toevoegen

Wil je een gloednieuw effect definiëren dat nog niet in de pool zit, dan is de DB niet genoeg; je moet zowel de server- als de clientsource aanpassen. De volgorde is:

  • length.h — voeg het nieuwe type toe aan de APPLY_-enum en werk MAX_APPLY_NUM bij.
  • constants.cpp — voeg de rij { "NAAM", APPLY_NAAM, POINT_NAAM } toe aan aApplyInfo.
  • char.cpp / char_battle.cpp — implementeer de PointChange- / effecttoepassingslogica voor het nieuwe POINT_-type (als het een nieuw point-type is).
  • Client — de apply-nummers in item_length.h moeten identiek zijn aan de server; anders toont de tooltip de verkeerde bonus. Voeg daarna de nieuwe tekst toe aan het apply-namenwoordenboek in root/uiToolTip.py en aan de locale-bestanden.

Als de nummers tussen server en client uiteenlopen, verschijnt een bonus die de server "+5 STR" noemt in-game als "+5 iets anders" — daarom is het synchroon houden van beide kanten cruciaal.

De wijziging uitrollen

De item_attr-tabellen worden door de DB-core bij het opstarten gelezen en naar de game-core gestuurd; alleen de SQL wijzigen heeft dus geen direct effect. De gebruikelijke flow: voer de wijziging door en herstart de db- en game-cores. Heb je de source aangeraakt (nieuw apply-type), dan moet je ook hercompileren en de nieuwe binary uitrollen. Ververs vóór livegang altijd een paar items op een testserver om te bevestigen dat de bonussen correct vallen.

Veelgestelde vragen

Garandeert een hogere prob dat de bonus valt?

Nee. prob is een gewicht; de kans is de prob van jouw rij gedeeld door de som van alle prob's voor dat slot. Voor een garantie zou je de prob van de andere rijen moeten verlagen of de opties op dat slot moeten beperken.

Ik heb de SQL gewijzigd maar in-game verandert niets, waarom?

Omdat de attr-tabellen tijdens het draaien niet opnieuw worden gelezen. Je moet de db- en game-cores herstarten; pas daarna gebruiken nieuw toegekende bonussen de bijgewerkte pool.

Wat is het verschil tussen item_attr en item_attr_rare?

item_attr is voor de normale 1e–4e bonusregels, terwijl item_attr_rare een aparte pool is voor de zeldzame 5e/6e regel. Ze worden door verschillende items/acties getriggerd.

Wil je een gebalanceerd bonussysteem voor je server? Van attr-tabellen tot nieuwe apply-types, ik ontwerp en balanceer je bonussysteem vanaf nul — neem contact op.

Bu kategorideki tüm yazılar →

Devamı için