Ich release hier ein bisschen Code, der hauptsächlich aus Langeweile entstanden ist.
Normale Quest:
Code:
quest test begin
state start begin
when login begin
notice_all("Wir begrüßen " .. pc.get_name() .. " auf Sample2")
set_state("__COMPLETE__")
end
end
state __COMPLETE__ begin
end
end
Mit Questbuilder:
Code:
quest("test")
:state("start")
:on(LOGIN)
:call(function()
notice_all("Wir begrüßen " .. pc.get_name() .. " auf Sample2")
set_state("__COMPLETE__")
end)
:state("__COMPLETE__")
:build()
Normale Quest:
Code:
quest test begin
state start begin
when letter begin
send_letter("Questbrief")
end
when button or info begin
say("Text")
end
end
end
Mit Questbuilder:
Code:
quest("test")
:state("start")
:on(LETTER)
:call(function()
send_letter("Questbrief")
end)
:on(BUTTON)
:on(INFO)
:call(function()
say("Text")
end)
:build()
Normale Quest:
Code:
quest test begin
state start begin
when kill with npc.get_race() == 1093 begin
notice_all(pc.get_name() .. " hat den Sensenmann getötet!")
end
end
end
Mit Questbuilder (Möglichkeit 1):
Code:
quest("test")
:state("start")
:on(KILL)
:with(function() return npc.get_race() == 1093 end)
:call(function()
notice_all(pc.get_name() .. " hat den Sensenmann getötet!")
end)
:build()
Mit Questbuilder (Möglichkeit 2):
Code:
quest("test")
:state("start")
:on(KILL)
:with(evalAtRuntime("npc.get_race() == 1093"))
:call(function()
notice_all(pc.get_name() .. " hat den Sensenmann getötet!")
end)
:build()
Normale Quest:
Code:
quest test begin
state start begin
when 9001.chat."Hello World" begin
say("Test")
end
end
end
Mit Questbuilder:
Code:
quest("test")
:state("start")
:on(9001, CHAT, "Hello World")
:call(function()
say("Test")
end)
:build()
Mit Questbuilder Funktionsaufruf als Wert (ohne Anpassung am normalen qc nicht möglich):
Code:
quest("test")
:state("start")
:on(9001, CHAT, function() return pc.get_name() end)
:call(function()
say("Test")
end)
:build()
Oder auch hier:
Code:
quest("test")
:state("start")
:on(9001, CHAT, evalAtRuntime("pc.get_name()")
:call(function()
say("Test")
end)
:build()
Normale Quest:
Code:
quest test begin
state start begin
when SOMETARGET.target.arrive begin
syschat("Ziel erreicht")
end
end
end
Mit Questbuilder:
Code:
quest("test")
:state("start")
:on("SOMETARGET", TARGET, ARRIVE)
:call(function()
syschat("Ziel erreicht")
end)
:build()
Jeder with- und call-Function wird als erstes Argument das event mitgegeben, welches ausgelöst wurde. Beispiel:
Code:
quest("test")
:state("start")
:on(LOGIN)
:on(KILL)
:call(function(event)
-- event = "login" / "kill"
end)
:build()
Wenn das Event mit einem Target und / oder Wert definiert wurde, werden auch diese mitgegeben:
Code:
quest("test")
:state("start")
:on(LOGIN)
:on(1093, KILL)
:on(9001, CHAT, "Hello World")
:call(function(event, target, value)
-- event = "login" / "kill" / "chat"
-- target = nil / 1093 / 9001
-- value = nil / nil / "Hello World"
end)
:build()
Vorteile:
- Wird in nativem Lua ausgeführt
- Sollten Fehler zur Laufzeit auftreten, steht im log die korrekte Zeile und der Dateiname in der der Fehler aufgetreten ist
- Prüft doppelte Questdefinitionen, Statedefinitionen und gibt aussagekräftige Fehlermeldungen
Neutral:
- Der Questbuilder läuft nicht in der Umgebung vom Gamecore (Variablen, Funktionen usw. die der Gamecore mitbringt können nicht im Questbuilder referenziert werden -> nur über evalAtRuntime oder innerhalb eines function-Blocks)
Nachteile:
- Etwas langsamer beim Übersetzen als der Standard qc
Einrichtung:
- luaobject.lua, lua5.0_support.lua, qc.lua, questbuilder.lua und qc_start.lua im Questordner ablegen
- Ggf. Pfad zum object-Ordner in qc_start.lua anpassen (muss der absolute Pfad sein!)
- (Übersetzte / im neuen Format geschriebene Quest) in die questFiles-Liste (qc_start.lua) einpflegen
- Lua5.0 auf dem Server installieren
- Folgenden Code in die questlib.lua hinzufügen:
Code:
questbuilder = {}
questbuilder.functionCache = {}
function questbuilder.loadCached(path)
if not questbuilder.functionCache[path] then
questbuilder.functionCache[path] = loadfile(path, "b")
end
return questbuilder.functionCache[path]
end
Ausführen:
Jetzt wird einfach qc_start.lua ausgeführt:
Im Anhang ist noch ein Python-Skript "translator.py"
Ist nicht ganz geil geschrieben aber funktioniert.
Das Übersetzt vorhandene Quests im normalen Format in das Questbuilder Format.
Ausführung mit Python3:
Code:
python translator.py <PFAD_ZUR_LOCALE_LIST> <BASISPFAD_QUESTORDNER> <TARGETFOLDER>