Register for your free account! | Forgot your password?

Go Back   elitepvpers > Popular Games > Metin2 > Metin2 Private Server > Metin2 PServer Guides & Strategies
You last visited: Today at 16:49

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Tutorial] Wie erkenne ich Fehler in Quests?

Discussion on [Tutorial] Wie erkenne ich Fehler in Quests? within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1
 
Synfonia's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 1,064
Received Thanks: 905
[Tutorial] Wie erkenne ich Fehler in Quests?

Hallo Leute,

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
2. Die Namensgebung

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:

Quote:
local drachenraum_offen
Und weist ihm entweder den Wert 0 oder 1 zu (boolean-wert für "wahr" (1) oder "falsch" (0))

Wieso? Weil es common sense ist und so auch andere verstehen können wenn du Hilfe brauchst.

Des weiteren kommen in Questnamen keine Leerzeichen!

Quote:
quest hier komme ich begin = nicht gut!
quest hier_komme_ich begin = gut!
3. Nutzt das, was euch zu Verfügung steht!

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.
Quote:
warp_all_to_village(mapindex,warptime in seconds)
warp_all_to_village(21,10)
kill_all_in_map() hingehen braucht nur den Mapindex da es ein Instant-Effekt ist:
Quote:
kill_all_in_map(21)
mob.spawn hingegen braucht:
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
Oder wenn du dir unsicher bist ob die Variable das speichert was sie soll:
Code:
local 1bis50 = number(1,50)
syschat(""..1bis50.."")
6. Alles hat ein Ende, auch eine Klammer auf!

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 =
Quote:
local bla = 1
local blabla = "Hi"
Gleichstellen zweier Werte in einer Kondition mit if: IMMER ==

Quote:
if answer == "Yes" then
if pc.get_level() == 42 then
if 1oder2 == 1 then
Definitionsbereiche von mathematischen Vergleichszeichen:
">" - 'größer als' - alle Zahlen die größer sind als die Vergleichszahl, die Vergleichszahl selbst ist ausgeschlossen.

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
>= - 'größer gleich' - alle Zahlen die größer sind als die Vergleichszahl, die Vergleichszahl selbst ist in der Definitionsmenge inbegriffen.

Quote:
y >= 10 -- Das ist wahr, wenn y 10, 11, 12... oder höher ist.
"<" - 'kleiner als' - alle Zahlen die kleiner sind als die Vergleichzszahl, die Vergleichszahl selbst ist ausgeschlossen.

Quote:
z < 10 -- Das ist wahr, wenn z 9, 8, 7 oder kleiner ist.
"<=" - 'kleiner gleich' - alle Zahlen die kleiner sind als die Vergleichszahl, die Vergleichszahl selbst ist in der Definitionsmenge inbegriffen.

Quote:
a <= 1 -- Das ist wahr wenn a 1, 0, -1, -2 oder kleiner ist.
8. Schlusswort

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
Synfonia is offline  
Thanks
5 Users
Old 02/27/2012, 11:34   #2
 
Michael_X's Avatar
 
elite*gold: 4
Join Date: Feb 2011
Posts: 1,878
Received Thanks: 1,350
Find das hier persönlich nützlicher:



Hast für deine Mühe aber ein Thanks verdient, wird bestimmt ein paar Leuten weiterhelfen.

#Thanks given
Michael_X is offline  
Thanks
1 User
Old 02/27/2012, 11:35   #3
 
elite*gold: 32
Join Date: Dec 2010
Posts: 1,294
Received Thanks: 862
Ansich gute Idee, du hast aber selber Fehler in deinen Codeschnipseln drin

# Sogar nichtmal richtig eingerückt, wo du es oben so groß und breit erklärt hattest
√π. is offline  
Old 02/27/2012, 11:39   #4
 
Synfonia's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 1,064
Received Thanks: 905
Quote:
Originally Posted by √π. View Post
Ansich gute Idee, du hast aber selber Fehler in deinen Codeschnipseln drin

# Sogar nichtmal richtig eingerückt, wo du es oben so groß und breit erklärt hattest
1. Wo denn?

#: Doch hab ich, vergaß nur anzumerken, dass man die "end" auf die gleiche Ebene stellt wie die Kondition auf die sie sich bezieht, was ich nun noch dazuschreib.
Synfonia is offline  
Old 02/27/2012, 11:46   #5
 
elite*gold: 32
Join Date: Dec 2010
Posts: 1,294
Received Thanks: 862
Quote:
Originally Posted by Synfonia View Post
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
einruecken == "positiv", warum Level > 0
Code:
function blabla(mapindex)
if mapindex == 1 then
    return 1;
end

when 20011.chat."Auf welchem Mapindex befinde ich mich?" begin
    say( questname.blabla(pc.get_map_index()) )
    syschat("Die Funktion wurde ausgefüht.")
end
function brauch auch 'n end
Code:
local 1bis50 = number(1,50)
syschat(""..1bis50.."")
Kein Fehler, aber:
WARUM immer diese Gänsefüße wenn man sich nur eine Variable ausgeben lassen will?!
-
√π. is offline  
Old 02/27/2012, 11:53   #6
 
Synfonia's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 1,064
Received Thanks: 905
1. Ja stimmt, das = hab ich kurzerhand auch vergessen.
1.1. Warum nicht? Es ist ja keine akurate Quest sondern soll einfach nur das Einrücken demonstrieren. Ob ich > 0 oder >= 1 etc. schreibe ist irrelevant weil es ja das gleiche ausdrückt.

2. Stimmt auch.

3. Soweit ich weiß gibt syschat(1bis50) einem einen Fehler aus, wenn ich die Variable vorher nicht als string definiere.

4. Ich hätte den Kaffee trinken sollen, bevor ich den Thread schrieb.
Synfonia is offline  
Old 02/27/2012, 12:01   #7
 
elite*gold: 389
The Black Market: 114/0/0
Join Date: Jul 2010
Posts: 4,910
Received Thanks: 530
Fehler können ja mal sein, aber gefällt mir #1
Danke dir für das "Tutorial".
Lеlouch is offline  
Old 02/27/2012, 12:04   #8
 
Synfonia's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 1,064
Received Thanks: 905
Hab nun meine Fehler in den Beispielen genutzt und sie auch noch hinzugefügt.

War natürlich alles geplante Show und nicht meine Müdigkeit :P
Synfonia is offline  
Old 02/27/2012, 13:14   #9
 
Mijago's Avatar
 
elite*gold: 191
Join Date: May 2009
Posts: 1,214
Received Thanks: 2,597
Bring ihnen zum Einrücken doch einfach bei, dass jede Funktion einen neuen Block startet und jeder Block logischerweise eingerückt werden muss..
Mijago is offline  
Reply


Similar Threads Similar Threads
fehler meldung Quests
05/28/2011 - Metin2 Private Server - 1 Replies
Tach Also ich hab vollgenden Problem immer wenn ich einen Quest einfügen und ihn hochladen das heißt: Quest in Filezilla hochladen in Hongkong_list reinschreiben dann Free BSD befehl: cd /usr/rain/channel/share_data/locale/hongkong/quest eingeben dann befehl: chmod u+x make.sh eingeben und zum schluss: sh make.sh so dann ladet es den quest hoch so jetzt kommt diese meldung: must start with ´quest´ OX-Regeln.quest:1 Abort trap (core dumped) So warum kommt dies immer egal welchen quest...
Fehler beim ändern von Quests
06/09/2010 - Metin2 Private Server - 0 Replies
Hallo Community, ich habe ein Problem: Jedesmal wenn ich die make.sh ausführe weil ich die main_quest_lv1.gotoinfomation bearbeitet habe, setzt sie sich wieder auf den Standart zurück: send_letter ( "Willkommen bei ImbaMT2" ) Wie ihr vielleicht sehen könnt, verwende ich die Serverfiles von Profizocker94, aber auch mit denen von Rain, funktioniert es nicht.
Fehler wenn ich quests einfüge
12/06/2009 - Metin2 Private Server - 1 Replies
hallo erstmal nja also ich hab mir ein paar von den quests von dem thread geholt: http://www.elitepvpers.com/forum/metin2-pserver-gu ides-strategies/378120-bersetzt-deutsche-quests-t- glich-updated.html und ganz normal alles gemacht wies ja gesagt wurde ;) nur wenn ich jetzt reingeh und nen npc anklick passiert einfach nichts also ich kann z.b. nicht mehr mit dem stadtwächter reden und so i-wer hat gesagt des liegt am zeilenumbruch aber 1. kann ich keinen fehler finden wenn ich die quests...
[Tutorial] Quests erstellen! [How to]
04/19/2009 - WoW Private Server - 15 Replies
Huhu eine kurze Erklärung für alles beim Quest erstellen :) Anleitung: 1. Erklärung zu allen Spalten in quests 2. Quest erstellen 3. NPC die Quest zuteilen 4. Downloads *New*



All times are GMT +1. The time now is 16:49.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.