Angesichts der Tatsache, dass der Questkontroll-Thread voller sehr unnützer Fehler ist, schreibe ich mal einen kleinen Thread wie man Fehler in Quests findet und worauf man achten sollte.
1. Einrücken, einrücken? Was ist Einrücken?
Einrücken ist quasi eine Art wie man Quests oder Code im allgemeinen so optisch formatiert, dass man Syntax-Fehler leicht aus dem Weg räumen kann.
Es gibt keine festen Regeln wie man richtig einrückt, jedoch sollte man bitte eine Logik dahinter haben, die vilt. auch andere Leute außer einem selbst verstehen, damit falls man doch Hilfe benötigt auch jemand die Syntax deiner Quest verstehen kann.
1.1 - Wie rücke ich sinnvoll ein?
Sinnvolles Einrücken wäre dann, wenn man jedes mal einrückt wenn ein Codestück "ein Anfang und ein Ende hat", sprich jede Kondition und Abfrage die auf ein "end" endet.
Dazu gehören:
- quest [name] begin
- state [name] begin
- when [kondition] begin
- if [kondition] then
Das jeweilige end zu den Konditionen kommt immer auf die Ebene, auf der sich auch der dazu beziehende Konditionspart steht.
d.h.
Nach quest: tab
Nach state: tab
Nach when: tab
Nach if: tab
Nach local: KEIN tab (siehe unten)
Nach Ausgaben wie say(""), Funktionen wie pc.give_exp2(value) oder sonstigem Code auf der letzten Ebene: Einen tab löschen
Und jedes end auf den quest,state,when oder if auf den es sich bezieht.
Häufige Fehler: local, auch wenn es genauso von Notepad++ blau eingefärbt wird wie if etc. wird NICHT eingerückt. local ist eine sogenannte "lokale" Variable die für den Bereich (state, when oder if-kondition) in der sie steht definiert ist.
Beispiel:
Code:
quest einruecken begin
state ich_rücke_ein begin
when 20011.chat."Einrücken" begin
local einruecken = "positiv"
if pc.get_level() > 0 and einruecken == "positiv" then
say("Hey Uriel, ich kann einrücken!")
end
end
end
end
Gibt allem, was ihr einen Namen gebt, einen sinnvollen Namen.
Eine lokale Variable, die speichert ob z. b. der Drachenraum geöffnet oder geschlossen ist nennt ihr z. B. vielleicht:
Und weist ihm entweder den Wert 0 oder 1 zu (boolean-wert für "wahr" (1) oder "falsch" (0))Quote:
local drachenraum_offen
Wieso? Weil es common sense ist und so auch andere verstehen können wenn du Hilfe brauchst.
Des weiteren kommen in Questnamen keine Leerzeichen!
3. Nutzt das, was euch zu Verfügung steht!Quote:
quest hier komme ich begin = nicht gut!
quest hier_komme_ich begin = gut!
Wenn ihr schon soweit seid, dass ihr in epvp nach Hilfe fragt und packt das ganze in eine php oder codebox, nutzt die Vorschau ehe ihr postet!
Oft kommt es vor, dass der code z. B. in einem NPC Dialog plötzlich die Farbreihenfolge wechselt, von Funktion rot und Text grün zu Text rot und Funktion grün - das bedeutet, dass ihr wahrscheinlich in einer say("text") Ausgabe ein " vergessen habt und das an der Stelle wo der Farbbruch stattfindet. So kann man sich das posten und auf eine Antwort warten ersparen.
4. Gibt Funktionen auch das, was sie brauchen!
Die Funktionen die es gibt, sind gängig, doch was für Werte sie brauchen um zu funktionieren sind manchmal nicht so ganz klar.
Beispiel:
warp_all_to_village() benötigt als Werte die Map auf der sich die Spieler, die zur Stadt gewarpt werden sollen, befinden als auch die Zeit bis der warp stattfinden soll.
z. B.
kill_all_in_map() hingehen braucht nur den Mapindex da es ein Instant-Effekt ist:Quote:
warp_all_to_village(mapindex,warptime in seconds)
warp_all_to_village(21,10)
mob.spawn hingegen braucht:Quote:
kill_all_in_map(21)
Vnum, Local_X, Local_Y, Local_Dif, und noch zwei Zahlen an deren Sinn ich mich nicht erinnere.
z. B.
mob.spawn(101,300,300,1,0,1) (letzten zwei Zahlen einfach mal 0 und 1 lassen das passt glaube ich so ziemlich immer, sollte da jemand mehr wissen als ich schreibts als Antwort ich passe das hier dann an, danke.)
5. Nutze das, was dir das Spiel gibt!
Wenn du dir unsicher bist, ob ein Questcode bis zu einem bestimmten Punkt ausgeführt wird. Dann füge an den Ende der Funktion, Dialog, Spawn oder ähnlichem eine visuelle Ausgabe an um das zu überprüfen.
z. B.
Code:
function blabla(mapindex)
if mapindex == 1 then
return 1;
end
end
when 20011.chat."Auf welchem Mapindex befinde ich mich?" begin
say( tostring(questname.blabla(pc.get_map_index())) )
syschat("Die Funktion wurde ausgefüht.")
end
Code:
local 1bis50 = number(1,50)
syschat(""..1bis50.."")
Kurz und knapp: Gibt gut acht darauf, dass ihr jede Klammer die ihr öffnet auch richtig schließt.
Man kann eigentlich da kaum etwas falsch machen, außer sie zu vergessen.
Vielleicht sollte man beachten eine runde Klammer "(" auch mit einer runden Klammer ")" zu schießen und nicht mit "}" o.ä.
Acht geben sollte man bei verschachtelten Klammern, da kann man sich behelfen, dass LUA zwischen Code Leerzeichen und tab ignoriert.
Das nun bitte nicht falsch verstehen!
pc . get_ level ( ) -- Das ist damit nicht gemeint! Funktionen etc. müssen natürlich zusammen bleiben.
Aber: say( "Dein Level beträgt: "..pc.get_level().."" )
oder: say("Ich heiße: " ..tostring( name ) )
Würden kein Problem darstellen. (Obs in den Beispielen sinnvoll ist, sei dahingestellt)
7. Abfragen oder abspeichern richtig gemacht
Wichtig ist zu wissen, wann man welche Zeichen zum Abfragen oder Abspeichern von Werten benutzt:
Definieren einer Variable: IMMER =
Gleichstellen zweier Werte in einer Kondition mit if: IMMER ==Quote:
local bla = 1
local blabla = "Hi"
Definitionsbereiche von mathematischen Vergleichszeichen:Quote:
if answer == "Yes" then
if pc.get_level() == 42 then
if 1oder2 == 1 then
">" - 'größer als' - alle Zahlen die größer sind als die Vergleichszahl, die Vergleichszahl selbst ist ausgeschlossen.
>= - 'größer gleich' - alle Zahlen die größer sind als die Vergleichszahl, die Vergleichszahl selbst ist in der Definitionsmenge inbegriffen.Quote:
x > 8 -- Das ist wahr, wenn x 9, 10, 11, 12 oder höher ist.
x > -2 -- Das ist wahr wenn x -1, 0, 1, 2, oder höher ist
"<" - 'kleiner als' - alle Zahlen die kleiner sind als die Vergleichzszahl, die Vergleichszahl selbst ist ausgeschlossen.Quote:
y >= 10 -- Das ist wahr, wenn y 10, 11, 12... oder höher ist.
"<=" - 'kleiner gleich' - alle Zahlen die kleiner sind als die Vergleichszahl, die Vergleichszahl selbst ist in der Definitionsmenge inbegriffen.Quote:
z < 10 -- Das ist wahr, wenn z 9, 8, 7 oder kleiner ist.
8. SchlusswortQuote:
a <= 1 -- Das ist wahr wenn a 1, 0, -1, -2 oder kleiner ist.
Wenn ihr die gängigsten Fehlerquellen abgearbeitet habt und es funktioniert immernoch nicht, dann sollte es vilt. Zeit sein die Quest der Questkontrolle in die Hände zu geben. Gönnt dem Thread aber etwas Ruhe wenn ihr lediglich ein end vergisst denn sowas findet ihr mit den oben genannten Tipps ziemlich einfach.
Sollte jemand noch häufige Fehler in Quests kennen (das sind jedenfalls die häufigsten Fehler die ich zu Beginn des Scriptens immer gemacht hatte), kann er diese ruhig hier posten, wenns geht auch mit einer Lösung dazu falls nicht kann ich die denke ich in den meisten Fällen ergänzen.
Mit freundlichem Gruß,
Jay







