Als je een Metin2-server beheert, wil je vroeg of laat een nieuw wapen, harnas of kostuum toevoegen, en de kern daarvan is de metin2 item proto-data. De item proto is de tabel die de identiteit, het type, de schade, de verdediging, de draagvoorwaarden en de bonussen van elk item bevat. Een item correct toevoegen betekent deze data consistent bijwerken aan zowel de server- als de clientzijde. In deze gids voegen we een gloednieuw item van begin tot eind toe: het kiezen van een vnum, het serverrecord, de clientbestanden, icoon en model, en daarna testen.
Wat is de item proto en waar staat hij?
De item proto bestaat op twee aparte plekken, en die twee moeten exact overeenkomen:
- Serverzijde: de game core leest de itemdefinities. Afhankelijk van je source-versie komt deze data ofwel uit de
item_proto-tabel in de MySQL-databaseplayer, ofwel uit eenitem_prototekst-/binair bestand. De core laadt het bij het opstarten in het geheugen. - Clientzijde: de
pack-map van de client bevat een versleuteld/gepacktitem_proto-bestand. De client leest de visuele en gameplay-data van het item daaruit. Onderlocalestaan ookitem_names.txt(weergavenamen),item_list.txt(icoon- en modelpaden) enitemdesc.txt(beschrijvingen).
Als een item alleen op de server is gedefinieerd, kan de client het niet tekenen (het lijkt te ontbreken of is kapot); als het alleen op de client bestaat, kan de server het niet spawnen. Beide kanten moeten dezelfde vnum en compatibele waarden dragen.
Voor je begint: back-ups en een vnum kiezen
Eerste regel: maak een back-up. Bewaar een dump van de MySQL-tabel item_proto en kopieën van elk .txt/pack-bestand dat je gaat aanpassen. Eén kapotte regel kan voorkomen dat de core items laadt.
De volgende stap is het kiezen van een vnum (itemnummer). Elk item heeft een unieke vnum. Kies een ongebruikt bereik om botsingen te voorkomen. Standaardwapens zitten meestal in de band 0–8000; voor custom items vermindert een hoog, leeg bereik (bijvoorbeeld 30000+) het risico op conflicten. Om in MySQL een vrije vnum te vinden:
SELECT vnum FROM player.item_proto WHERE vnum BETWEEN 30000 AND 30100 ORDER BY vnum;
Als er in dat bereik geen rijen terugkomen, kun je het veilig gebruiken.
Serverzijde: een nieuw item aan de item proto toevoegen
In plaats van een item vanaf nul te definiëren, is de meest betrouwbare methode om een bestaand item van hetzelfde type als sjabloon te kopiëren. Voeg je een zwaard toe, neem dan de rij van een bestaand zwaard, verander de vnum en de naam, en bewerk alleen de velden die anders moeten zijn (schade, draagniveau, bonussen). De reden: de betekenis van de velden value0–value5 verschilt per itemtype, dus starten vanaf een correct voorbeeld haalt de meeste fouten weg.
Belangrijke kolommen:
vnum: uniek nummer.name/locale_name: naam binnen de server.typeensubtype: bijv. voor een wapenITEM_WEAPON+WEAPON_SWORD; voor een harnasITEM_ARMOR+ARMOR_BODY.antiflags: welke klassen/geslachten het niet kunnen gebruiken (bijv.ANTI_WARRIOR).wearflags: waar het item wordt gedragen (WEAR_WEAPON,WEAR_BODY, enz.).limittype0/limitvalue0: de draagvoorwaarde, meestalLIMIT_LEVELplus een levelwaarde.applytype0..2 / applyvalue0..2: de bonussen die het item geeft (bijv.APPLY_ATT_SPEED,APPLY_MAX_HP).value0..value5: typespecifieke waarden. Een gangbare toewijzing voor wapens:value3= minimale fysieke schade,value4= maximale fysieke schade,value5= magische/extra aanval; bij harnassen draagtvalue1de verdediging. Kopieer toch vanuit een correct item van hetzelfde type en vergelijk.price,refined_vnum(upgradeketen),socket0..2(sloten),addon_type.
In MySQL is het snelst om een bestaand zwaard te dupliceren:
INSERT INTO player.item_proto
SELECT * FROM player.item_proto WHERE vnum = 19; -- een voorbeeldzwaard
-- bewerk daarna de nieuwe rij:
UPDATE player.item_proto
SET vnum = 30001, name = 'Nieuw Zwaard', value3 = 60, value4 = 90
WHERE vnum = 19; -- zorg dat je de juiste rij raakt
In de praktijk is het netter om de bestaande rij te exporteren, te bewerken en als nieuwe rij met vnum = 30001 terug in te voegen. Leest je source uit een tekstbestand, dan open je de item_proto-txt met een converter, voeg je de nieuwe tab-gescheiden regel toe en pack je opnieuw. Om de wijziging te laten doorwerken, herstart je de core; de proto wordt bij het opstarten in het geheugen geladen.
Clientzijde: item proto, item_names en item_list
Voor de clientbestanden gebruik je een proto-conversietool (communitytools zetten de gepackte item_proto om naar bewerkbare .txt en packen die weer terug). De flow:
item_proto(client) → converteer naar tab-gescheiden txt, voeg de nieuwe regel toe met dezelfde vnum en waarden als de server, pack opnieuw en plaats het inpack.locale/<taal>/item_names.txt→ regelindelingvnum[TAB]Weergavenaam. Voeg de nieuwe vnum en de in het spel zichtbare naam toe. Houd dit bestand in de juiste codering (meestal die van de servertaal).locale/<taal>/item_list.txt→ koppelt elke vnum aan een icoon- en modelpad:vnum[TAB]ITEM[TAB]icon/item/xxxx.tga[TAB]d:/ymir work/item/.../xxxx.gr2. Definieer hier de icoon- en modelpaden van je nieuwe item.locale/<taal>/itemdesc.txt→ optionele beschrijvingstekst.
Het icoon en model toevoegen
Om het item in de hand en in de inventaris te laten verschijnen, heb je twee assets nodig: een icoon (.tga, meestal 32×32, getoond in het inventarisvak) en een 3D-model (op de hand/het lichaam van het personage). Zet het icoon in het pad icon/item/ van de client en verwijs ernaar in item_list.txt. Heb je nog geen nieuwe artwork gemaakt, dan kun je om te beginnen de icoon- en modelpaden van een vergelijkbaar item hergebruiken — het item werkt, het toont alleen bestaande artwork. Heb je een uniek model nodig, plaats dan het .gr2-bestand in de juiste map en verwijs naar het pad in item_list.txt. Een verkeerd icoonpad toont een leeg/rood vak in de inventaris; dat is het meest voorkomende teken dat je het pad moet corrigeren.
Testen, herladen en veelgemaakte fouten
Log na het herstarten van de server in met een GM-account en spawn het item:
/item 30001
# of op naam (als item_names klopt):
/item Nieuw_Zwaard
Valt het item in de inventaris, toont het de juiste naam en het juiste icoon, en komen bij het uitrusten de schade/verdediging en bonussen overeen met de tabel, dan ben je klaar. Veelgemaakte fouten:
- Vnum-mismatch tussen server en client: het meest voorkomende probleem. Beide kanten moeten dezelfde vnum dragen.
- Core start niet op: een kapotte regel in de proto (ontbrekende kolom, verkeerde typenaam). Bekijk de syserr-logs.
- Item onzichtbaar/leeg vak: een verkeerd icoon-/modelpad in
item_list.txt. - Naam leeg of getoond als een sleutel: ontbrekende regel in
item_names.txtof kapotte codering.
Veelgestelde vragen
Moet ik de item proto vanuit MySQL of vanuit een txt-bestand bewerken?
Dat hangt van je source af. Moderne sources lezen meestal de MySQL-tabel player.item_proto; in dat geval bewerk je de tabel direct en herstart je de core. Sommige versies lezen een txt-/binair bestand. Weet je niet zeker welke je gebruikt, controleer dan de opstartconfiguratie van de core en de syserr-uitvoer. De clientzijde is in alle gevallen een gepackt bestand.
Moet ik de server echt herstarten voor de wijziging?
Omdat de item proto bij het opstarten in het geheugen wordt geladen, vereist een nieuwe itemdefinitie in de praktijk een core-herstart om te verschijnen. Sommige opstellingen hebben commando's voor gedeeltelijk herladen, maar de gegarandeerde, schone weg is de game core herstarten. Voor clientwijzigingen moeten spelers de bijgewerkte pack-/locale-bestanden ontvangen.
Waarom zou ik een nieuw item starten door een bestaand item te kopiëren?
Omdat de betekenis van velden als value0–value5, wearflags en antiflags per itemtype verschilt. Een werkend item van hetzelfde type als sjabloon nemen geeft je een geldige structuur om mee te beginnen; je verandert alleen de velden die anders moeten zijn, en je voorkomt grotendeels stille fouten.
Wil je custom items, sets of een heel nieuw systeem aan je eigen server toevoegen? Van item proto bewerken tot quest- en systeemontwikkeling, ik help graag met Metin2-serverwerk. Neem contact op om me over je project te vertellen.