Das Metin2 Biologen-System ist ein klassischer Kreislauf, bei dem ein NPC dem Spieler tägliche Sammelmissionen erteilt und im Austausch für die abgegebenen Materialien gestufte Belohnungen ausschüttet. Der Biologe (in manchen Versionen "Gelehrter" genannt) verlangt vom Spieler ein bestimmtes Jagdmaterial in einer bestimmten Menge; sobald der Spieler es gesammelt und abgegeben hat, erhält er seine Belohnung und steigt in die nächste Stufe auf. In dieser Anleitung zeige ich dir Schritt für Schritt, wie du das System von Grund auf mit der Quest-Engine (Lua) baust: die Belohnungsstufen, den täglichen Reset und ein missbrauchssicheres Design.
Wie funktioniert das Biologen-System?
Die Logik ist im Wesentlichen ein einfacher Sammeln–Abgeben–Aufsteigen-Kreislauf. Das System besteht aus drei Hauptteilen:
- Der NPC — der Biologe, mit dem der Spieler spricht. Er hat einen
vnum, und die Quest hängt sich an diechat- undclick-Ereignisse dieses vnum. - Das verlangte Material — meist ein
item_proto-Eintrag, der von Monstern gedroppt wird (zum Beispiel ein Organ, eine Pflanze oder eine Probe). Jede Stufe kann ein anderes Material und eine andere Menge verlangen. - Fortschrittsdaten — auf welcher Stufe der Spieler ist und ob er seine heutige Abgabe genutzt hat. Das hältst du in Quest-Flags (
pc.setqf/pc.getqf).
Wenn der Spieler mit dem NPC spricht, prüft die Quest, wie viel des Materials er im Inventar hat. Reicht es, entfernt sie das Material, vergibt die Belohnung und erhöht die Stufe um eins. Reicht es nicht, sagt sie dem Spieler, wie viele ihm noch fehlen. Der gesamte Ablauf kann in einer einzigen Lua-Datei liegen.
Grundlegendes Quest-Gerüst
Unten siehst du ein funktionierendes, einstufiges Biologen-Quest-Gerüst. 9001 sei der NPC-vnum und 30301 der vnum des verlangten Materials. Wir verlangen vom Spieler 20 Einheiten des Materials:
quest biolog begin
state start begin
when 9001.chat."Biologe" begin
say_title("Biologe:")
say("Bring mir 20 Proben,")
say("und ich belohne dich dafuer.")
say("")
local have = pc.count_item(30301)
say("Proben im Besitz: "..have.."/20")
local s = select("Abgeben", "Abbrechen")
if s == 2 then return end
if pc.count_item(30301) < 20 then
say_title("Biologe:")
say("Du hast noch nicht genug Proben.")
return
end
pc.remove_item(30301, 20)
pc.give_item2(50300, 5) -- Belohnung: 5 Traenke
say_title("Biologe:")
say("Danke! Hier ist deine Belohnung.")
end
end
end
Hier zählt pc.count_item die Menge im Inventar, pc.remove_item löscht das abgegebene Material und pc.give_item2 vergibt die Belohnung. say/select steuern den Dialogablauf. Dieses Gerüst funktioniert für eine einzelne Mission; was ein echtes Biologen-System reizvoll macht, ist die Anbindung an Stufen und einen täglichen Kreislauf.
Belohnungsstufen
In echten Biologen-Systemen wachsen das verlangte Material und die Belohnung nach jeder Abgabe. Am saubersten gestaltest du das datengetrieben mit einer Lua-Tabelle. Die Stufe hältst du in einem Quest-Flag und erhöhst sie bei jeder Abgabe:
local STUFEN = {
-- {verlangt_vnum, menge, belohnung_vnum, belohnung_menge}
{30301, 20, 50300, 5},
{30302, 30, 50301, 8},
{30303, 40, 71001, 1}, -- seltene Belohnung auf der letzten Stufe
}
quest biolog begin
state start begin
when 9001.chat."Biologe" begin
local step = pc.getqf("biolog_step")
if step == 0 then step = 1 end
if step > table.getn(STUFEN) then
say("Du hast alle Stufen abgeschlossen!")
return
end
local s2 = STUFEN[step]
local vnum, need = s2[1], s2[2]
local have = pc.count_item(vnum)
say_title("Biologe:")
say("Stufe "..step..": "..have.."/"..need)
local s = select("Abgeben", "Abbrechen")
if s == 2 then return end
if pc.count_item(vnum) < need then
say("Du hast noch nicht genug Material.")
return
end
pc.remove_item(vnum, need)
pc.give_item2(s2[3], s2[4])
pc.setqf("biolog_step", step + 1)
say("Du bist in die naechste Stufe aufgestiegen!")
end
end
end
Diese Struktur skaliert: Um eine neue Stufe hinzuzufügen, fügst du nur eine einzige Zeile zur STUFEN-Tabelle hinzu. Die Logik einmal zu schreiben und die Daten aus einer Tabelle zu speisen ist für die Wartung weitaus gesünder, als Code zu duplizieren.
Täglicher Reset
Der Teil, der dem Biologen-System seinen "Tagesquest"-Charakter gibt, ist der Reset. Ziel ist, dass der Spieler einmal pro Tag abgeben kann. Dazu speicherst du den Tag der letzten Abgabe in einem Flag und vergleichst ihn bei jedem Besuch mit dem aktuellen Tag. Den Tag kannst du aus get_global_time() ableiten (teile den Zeitstempel in Sekunden durch 86400, um eine Tagesnummer zu erhalten):
local function heute()
return math.floor(get_global_time() / 86400)
end
-- innerhalb des NPC-Ablaufs, vor der Abgabe:
if pc.getqf("biolog_tag") == heute() then
say_title("Biologe:")
say("Du hast heute bereits abgegeben.")
say("Komm morgen wieder.")
return
end
-- ... nach einer erfolgreichen Abgabe:
pc.setqf("biolog_tag", heute())
Dieser Ansatz bleibt konsistent, selbst wenn der Server neu startet, weil er das Datum im eigenen Flag des Spielers speichert. Bei Bedarf kannst du die "Tag"-Berechnung um einen Stunden-Offset verschieben, um zur Zeitzone deines Servers zu passen (zum Beispiel ein Reset um 06:00 statt um Mitternacht).
Missbrauchssicheres Design
Sammel-Belohnungs-Systeme sind anfällig für Missbrauch, wenn sie nicht sorgfältig gebaut werden. Achte auf diese Punkte:
- Erst prüfen, dann löschen: Zähle die Menge immer erneut, bevor du das Material mit
pc.remove_itemlöschst. Imselect-Fenster kann der Spieler das Item aus einem anderen Fenster herausziehen. - Atomarer Ablauf: Führe die Schritte Löschen und Vergeben unmittelbar nacheinander aus, ohne Dialog dazwischen. Sonst kann der Spieler das Item fallen lassen, während er im Dialog wartet.
- Inventar-Überlauf: Prüfe auf freien Platz, bevor du die Belohnung vergibst; ist es voll, warne den Spieler und mache die Abgabe rückgängig, sonst geht die Belohnung verloren.
- Tages-Flag zuletzt schreiben: Speichere den Tag erst, nachdem die Abgabe erfolgreich war, damit der Anspruch bei einem Fehler nicht verfällt.
Dieses System zu protokollieren ist ebenfalls eine gute Idee: Welcher Spieler, auf welcher Stufe, hat wann abgegeben? Ungewöhnlich häufige Abgaben zu erkennen hilft dir, Dupe-Bugs früh zu bemerken.
Häufige Fragen
Kann ich das Biologen-System bauen, ohne die Server-Source anzufassen?
Ja. Der gesamte Ablauf wird von der Quest-Engine (Lua) verwaltet; die einzigen "neuen" Definitionen, die du brauchst, sind der NPC-vnum und die item_proto-Einträge. Du kannst einen funktionierenden Biologen allein mit einer Quest-Datei und Proto-Anpassungen bauen, ohne die Source neu zu kompilieren.
Wie lege ich fest, welches Material verlangt wird?
Das Material ist ein gewöhnliches item_proto-Item. Es wird meist als Drop an bestimmte Monster gebunden (mob_drop_item / Drop-Tabellen). So sammelt der Spieler das Material durch Jagen, was das System in den Farm-Kreislauf einbindet.
Kann der Spieler sehen, wie weit er fortgeschritten ist?
Ja, du kannst den Wert pc.getqf("biolog_step") im NPC-Dialog anzeigen. Viele Server zeigen außerdem die verbleibende Menge und die nächste Belohnung über eine Quest-UI oder eine einfache say-Zusammenfassung an.
Möchtest du ein gestuftes, täglich zurücksetzendes und missbrauchssicheres Biologen-System für deinen Server? Ich kann die Quest-Logik, die Belohnungstabellen und den täglichen Kreislauf von Anfang bis Ende bauen und testen. Nimm Kontakt auf, um über dein Projekt zu sprechen.