Ich möchte keine fertige Lösung hinschreiben weil du dabei ja auch was lernen sollst und hoffentlich willst. Also hier mal die Bausteine:
Vorerst: Quests in Metin werden in Lua geschrieben (zumindest alles innerhalb der Trigger-Blöcke ("when ... begin" [...] "end").
Wenn du allgemeine Fragen hast (wie funktionieren Schleifen, Datenstrukturen, Funktionen, ...) informiere dich einfach über Lua, das ist erstmal unabhängig von Metin.
Metin benutzt soweit ich mich richtig erinnere Lua 5.1 (in Lua 5.2 gabs es teils größere Änderungen, also immer nach Lua 5.1 suchen).
Gut, mit der Info können wir jetzt weitermachen. Ich habe die Frage, die du dir Stellen solltest, mal voran geschrieben und die Lösung dann jeweils im Spoiler.
1. (Metin-Spezifisch) Wie finde ich heraus, wie oft der Spieler ein Item im Inventar hat?:
Code:
pc.count_item(<vnum>)
2. (Lua) Wie funktioniert ein if in Lua?
Code:
if <bedingung> then <block> end
3. (Lua) Welche Container-Typen (Arrays, Listen, ...) gibt es in Lua?
In Lua gibt es nur einen Container-Typen (Tables). Das Reicht aber auch aus.
Ein Table literal siegt wie folgt aus:
4. (Lua) Wie füge ich einen Wert in diesen Container hinzu?
Code:
table.insert(<table>, <value>)
5. (Metin-Spezifisch) Mit welcher Funktion kann ich alle Werte eines Lua-Table in einer Auswahl anzeigen?
Code:
select_table(<table>)
Mit diesen 5 Fragen (und evtl. noch ein paar einfachen wie z.B. "wie mache ich eine Schleife?") solltest du ans Ziel kommen.
Wenn du wirklich wirklich wirklich nicht weiter kommst, dann hier die komplette Lösung:
Code:
-- alles von hier
quest blabla begin
state start begin
when 12345.chat."Itemtausch" begin-- bis hier ist metin-spezifisch
-- alles von hier ist reines Lua (v5.1)
-- du kannst hier also alle Lua-Funktionen und die volle Lua-Syntax verwenden
-- zuerst haben wir ein table mit allen tauschbaren items
local exchangable_items = {
-- {vnum, count, vnum, count}
{10, 1, 100, 1},
{20, 1, 200, 1},
{30, 1, 300, 1},
}
local select_options = {}-- in diesen table legen wir gleich alle tauschbaren items hinein
local select_option_strings = {}-- und in diesen table die entsprechenden strings, also die texte die der spieler in der auswahl sehen soll
-- eine schleife über alle eintauschbaren items
for _, exchangable_item in ipairs(exchangable_items) do
-- in der variable "exchangable_item" haben wir hier mit jedem schleifendurchgang eins der eintauschbaren items zur verfügung
local required_vnum = exchangable_item[1]
local required_count = exchangable_item[2]
local result_vnum = exchangable_item[3]
local result_count = exchangable_item[4]
-- prüfen ob der spieler das item in der entsprechenden menge im inventar hat
if pc.count_item(required_vnum) >= required_count then
-- und wenn ja fügen wir den entsprechenden auswahl-text und das item in die beiden tables ein
table.insert(select_options, exchangable_item)
table.insert(select_option_strings, string.format("%dx %s", result_count, item_name(result_vnum)))
end
end
-- wir machen nur weiter wenn der spieler min. 1 item eintauschen kann (also wenn die liste nicht leer ist)
if table.getn(select_options) >= 1 then
-- es wird noch die "Abbrechen"-Option zur Auswahl hinzugefügt
table.insert(select_option_strings, "Abbrechen")
-- select_table gibt die nummer der angeklickten option zurück
-- in select_options haben wir vorher (in der schleife) die verfügbaren items hinzugefügt. Für die letzte Option ("Abbrechen") gibt es keinen Eintrag in "select_options" - da würden wir also "nil" (undefiniert, null, nichts) zurückbekommen
local selected_exchange = select_options[select_table(select_option_strings)]
-- wenn irgendwas außer "Abbrechen" ausgewählt wurde (die variable also nicht "nil" ist)
if selected_exchange then
local required_vnum = selected_exchange[1]
local required_count = selected_exchange[2]
local result_vnum = selected_exchange[3]
local result_count = selected_exchange[4]
-- nochmal prüfen ob der Spieler das benötigte Item im Inventar hat -> das muss IMMER geprüft werden wenn eine Funktion ausgeführt wurde die auf Spielerinput wartet (wait(), select(), select_table(), ...)
-- der Spieler könnte das Item sonst in der Zwischenzeit verloren / gehandelt / sonstwas haben
if pc.count_item(required_vnum) >= required_count then
-- und schlussendlich der tausch der items
pc.remove_item(required_vnum, required_count)
pc.give_item2(result_vnum, result_count)
end
end
else
say("Du kannst aktuell nichts eintauschen")
end
-- hier endet der "reine" Lua part
end
end
end