[Tutorial] Questing #1

04/02/2013 02:45 Lord iRemix#1
Nabend,

Da ich sehe, dass immer öfter einige Leute Probleme mit den (einfachsten) Quests haben, habe ich mich mal entschlossen, ein kleines Tutorial zu machen, in dem ich mal einfachere Sachen erkläre.
Hab mich dafür mal für eine Jagdquest entschieden.

Ich werde alle Zwischenschritte auch in einem Spoiler posten, falls es Unklarheiten o.ä geben sollte.

P.S: Ist mein erstes Tutorial mit Erklärung.. Kann also sein, dass es nicht allzu rosig ist. Verbesserungsvorschläge/Kritik sind immer erwünscht.

Zum Tutorial:

Man fängt grundsätzlich jede Quest in etwa so an:
Code:
quest jagdquest begin
Das quest und begin muss sein, aber den Namen kann man beliebig ändern.

Für Anfänger empfehle ich auch gleich ein end am Ende hinzusetzen, da sowas gerne mal vergessen wird.

Falls durch eine andere Quest kein anderer State eingeleitet wurde, sieht der nächste Schritt so aus:
Code:
state start begin
Hier ist es wieder, wie bei'm Anfang: state und begin muss geschrieben werden.
Den Namen kann man sich in der Regel am Anfang nicht aussuchen; nur, wenn ein neuer State eingeleitet wird.
Der State 'start' ist der State, den man am Anfang jeder Quest automatisch hat.

Der nächste Schritt sieht, wie folgt, aus:
Code:
when login or levelup with pc.get_level() >= 30 begin
Durch das when kann ein Ereignis (In diesem Fall: Login/Levelup), was an eine Bedingung (Level = oder größer als 30) geknüpft werden kann.

In dem folgenden Block wird dann geschrieben, was bei dem Ereignis mit der Erfüllung der Bedingung passieren soll.

Bei mir wäre es dann:
Code:
send_letter('Ein neuer Auftrag')
Es wird halt ein Brief (Questrolle) an den ausgewählten Spieler gesendet.

Nach dem end für das Ereignis wird dann der Block für den Brief festgelegt.
Das sieht dann so aus:
Code:
when button or info begin
Dadurch wird der Block für den Brief eingeleitet.

Dieser Block kann zwar alle möglichen Sachen oder Befehle enthalten, ich will aber mal einen kleinen Infotext machen.
Für die Textausgabe werden meistens nur drei Befehle benutzt (say_title(), say() und say_reward() )
Es gibt zwar noch Textausgaben, die farblich gestaltet werden können, das ist aber eigtl. (überflüssiger) Schnick Schnack.

Den Text dafür könnt ihr selbst bestimmen. Ich hab um diese Uhrzeit keinen Nerv mehr, mir dafür einen Text einfallen zu lassen.

Bei solchen Befehlen muss in die Klammern ein String gesetzt werden, welchen man mit " oder ' anfängt und auch beendet.
Beispiel: say("Text") / say('Text')
Achtung:Für eine Textausgabe muss kein end gesetzt werden.
Für diese Beispielquest nehme ich mal 10 Orks.

pc.setqf(): Setzt eine Questflag ein, welche generell sehr nützlich sein kann. Mit einer Questflag kann man alle Möglichen Werte abspeichern.
Aufbau: pc.setqf(name(als string), wert) - Der Name ist dabei völlig egal.

set_state(): Leitet einen neuen State ein.
Aufbau: set_state(name) - Der Name kann auch hier beliebig gewählt werden.

Für Zählungen kann zwar auch der Questcounter genutzt werden, ich habe es mir aber angewöhnt, es mit Questflags zu machen.


Den neuen State beginnt man dann nach dem end für den State 'start'.

Danach lasse ich mal gleich einen neuen Brief senden, in dem ausgegeben wird, wieviele Orks man schon getötet hat.

Dazu benutze ich:
Code:
when login begin
Da wird der Block beim nächsten Login und bei jedem darauffolgenden login eingeleitet.

Als nächstes wird wieder die Textausgabe des Briefes eingeleitet.

Dazu benutze ich wieder:
Code:
when button or info begin

Nun erklär ich euch, wie ihr ausgeben könnt, wieviele Orks schon getötet wurden.

Dies mache ich mit mit der say()-Funktion.
Variablen/Questflags oder auch Befehle, die einen String/eine Zahl aufrufen gibt man so aus:
Code:
"..pc.getqf('count').."
Das würde dann so aussehen:
Code:
say('Es wurden "..pc.getqf('count').." Schwarze Orks getötet.')

Mit pc.setqf() setzt man eine Questflag; mit
pc.getqf()
ruft man diese auf.

Den nächsten Schritt gestalte ich mal in der einfachsten Form; und das sieht, wie folgt, aus:
Code:
when kill begin
Dadurch wird das "Killereignis" sozusagen abgefragt.

Und mit folgendem Befehl kann man die Vnum von dem abfragen:
Code:
npc.get_race()
Das sieht dann so aus:
Code:
if npc.get_race() == 636 then
So wird abgefragt, ob die Vnum 636 (Schwarzer Ork) beträgt.
Falls dies der Fall ist, wird der if-Block eingeleitet.
Achtung: if-Abfragen müssen mit einem end abgeschlossen werden.

In diesem rechne ich die Kills auf die Questflag drauf.
Das mache ich so:
Code:
pc.setqf('count', pc.getqf('count')+1)

Als nächstes kommt die Abfrage, welchen Wert die Questflag besitzt bzw. ob die Questflag genau den Wert hat, den ich haben will.
Diese Abfrage wird bei jedem Killereignis gestellt.

Code:
if pc.getqf('count') == 10 then
Diese if-Abfrage wird mit einem end von der anderen Abfrage getrennt, da sie im Grunde nichts miteinander zu tun haben.

Nun kommt der Block, der eingeleitet wird, wenn die Questflag den Wert 10 hat.
Dies kann sich beliebig variieren; ich mach es mal so:
Code:
say('Glückwunsch, du hast es geschafft!')
	pc.give_item2(19, 1)
	set_state(__COMPLETE__)
Ich gebe halt aus, dass man fertig ist und gebe als Belohnung ein Schwert+9

pc.give_item(): Gibt dem ausgewählen Spieler ein Item
Aufbau: pc.give_item(vnum, anzahl)
Achtung: Sollte mehrere Items gegeben werden muss der Befehl pc.give_item2() benutzt werden, sonst bekommt man nur ein Yangstück im Inventar.

Durch das set_state(__COMPLETE__) leite ich einen State ein, in dem nichts mehr geschieht.

Fertige Quest:
Code:
quest jagdquest begin
	state start begin
		when login or levelup with pc.get_level() >= 30 begin
			send_letter('Ein neuer Auftrag')
		end
		when button or info begin
			say_title('Überschrift')
			say('Text')
			say_reward('Töte 10 Schwarze Orks!')
			pc.setqf('count',0)
			set_state(auftrag)
		end
	end
	state auftrag begin
		when login begin
			send_letter('Töte Orks')
		end
		when button or info begin
			say_title('Titel')
			say('Es wurden "..pc.getqf('count').." Schwarze Orks getötet.')
		end
		when kill begin
			if npc.get_race() == 636 then
				pc.setqf('count', pc.getqf('count')+1)
			end
			if pc.getqf('count') == 10 then
				say('Glückwunsch, du hast es geschafft!')
				pc.give_item2(19, 1)
				set_state(__COMPLETE__)
			end
		end
	end
	state __COMPLETE__ begin
	end
end

Ich hoffe, ich konnte euch in Sachen Questing etwas weiterhelfen.

Falls ich etwas schlecht gemacht/erklärt hab, schreibt es bitte.. Ist halt mein erstes Tutorial.
Und wenn ihr noch mehr Tutorials zu irgendwelchen Möglichkeiten/Befehlen wollt, lasst es mich wissen.


MfG .Remix
04/02/2013 02:49 CrystalPrime#2
Joa das ist nützlich.


.Remix.
Wieso hatest du nen bann :O
04/02/2013 02:52 Stαgє6#3
Nicht schlecht für die anfänger ^^
04/02/2013 03:01 Lord iRemix#4
Quote:
Originally Posted by CrystalPrime View Post
Joa das ist nützlich.


.Remix.
Wieso hatest du nen bann :O
Das 4. Mal 3 Infras.
Eigtl kriegt man beim 2. Mal schon perm. Bann.
Bin aber was Besonderes :awesome:


Falls ihr Verbesserungsvorschläge habt, teilt sie mir mit.
04/02/2013 03:24 .Chaos™#5
Sehr gut, war ja von dir nicht anderst zu erwarten.

Kind Retards Chaos
04/02/2013 03:28 .Onlyx3#6
Gibts sowas nicht schon geschätzt 4 mal?
04/02/2013 03:43 .Alessa#7
Quote:
Originally Posted by .Remix. View Post
Kenne nur die von Alessa, die werden aber sofort gelöscht, weil er/sie/es nur auf Thx aus ist.
[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]
04/02/2013 03:47 Lord iRemix#8
Okok, das kannte ich noch nicht.
04/02/2013 03:52 .Alessa#9
Aber erst beleidigen. Naja, egal.

Das Tutorial ist an für sich eine gute Idee, aber leider nicht ganz ausgereift. Nehmen wir an wir haben hier jemanden, der frisch Lua lernen will... Glaubst du im Ernst, er wird es durch deine Guides verstanden haben? Er wird wissen "ja, da kommen halt quest, state und when... Warum? Tja, weiß ich nich, ist halt so".. Es ist wichtig, dass du nicht nur darauf eingehst, wie was gemacht wird, sondern dass du erklärst, warum es so getan wird. Die Leute sollten verstehen und nicht abkopieren können.
04/02/2013 03:59 DAS IST VEGAAZ#10
Ich finde die Idee gut jedoch die Umsetzung nicht ganz so gut.
Begriffe wie "state" o.ä. sind mir Fremd, weshalb ich nicht wusste was du meinst.
Trotzdem danke für das Tutorial.

Mfg,
Vegaaz
04/02/2013 04:06 Stαgє6#11
Quote:
Originally Posted by Vegaaz View Post
Ich finde die Idee gut jedoch die Umsetzung nicht ganz so gut.
Begriffe wie "state" o.ä. sind mir Fremd, weshalb ich nicht wusste was du meinst.
Trotzdem danke für das Tutorial.

Mfg,
Vegaaz
Jo deiner meinung aber state gibts ^^ es gibt verschieden begriffe gibt auch neue ^^
04/02/2013 05:15 DAS IST VEGAAZ#12
Ich meinte damit das man solche Begriffe erklären sollte. :)

Mfg,
Vegaaz
04/02/2013 07:53 Nick#13
Netter Guide - ..für's Erste!

Allerdings gefällt mir von der Erklärungsmethodik & vom Aufbau her Alessa's Guide besser, da dieser eher für absolute Neulinge geeignet ist.

Geh' mehr auf die Commands ein! (kleiner Tipp, den ich dir für's Nächste mal auf den Weg mitgeben möchte)

@.Onlyx3™, von mir aus gibt's das auch 5 mal, Guides gelangen durch Releases in der Sektion eher in den Hintergrund - lieber 5 Guides, welche sich unterscheiden können, als 5 Releases, wo die Methodik dieselbe ist. ;)


Kind regards,
.JαyZoN
04/02/2013 11:46 .CHHorny#14
Und wer hat dich auf die Idee gebracht? :awesome:

Sehr schön und auch ausführlich geschrieben, gefällt mir.

Achja 2x Bann = Permanenter Bann? Nur noch eine Infra dann habe ich's auch :pimp:
04/02/2013 12:06 .Risan.#15
Nene... Geht schöner und sauberer

PHP Code:
quest jagdquest begin
    state start begin
        when login 
or levelup with pc.get_level() >= 30 begin
            send_letter
("Ein neuer Auftrag")
        
end
        when button 
or info begin
            say_title
("Überschrift")
            
say("Text")
            
say_reward("Töte 10 Schwarze Orks!")
            
set_state(_auftrag_)
        
end
    end
    state _auftrag_ begin
        when enter begin
            pc
.setqf("count",0)
        
end
        when letter begin
            send_letter
("Töte Orks")
        
end
        when button 
or info begin
            say_title
("Titel")
            
say("Es wurden "..pc.getqf("count").." Schwarze Orks getötet.")
        
end
        when kill begin
            
if npc.get_race() == 636 then
                local count 
pc.getqf("count") + 1
                pc
.setqf("count"count)
                if 
count >= 10 then
                    say
("Glückwunsch, du hast es geschafft!")
                    
pc.give_item2(191)
                    
set_state(__COMPLETE__)
                
end
            end
        end
        when leave begin
            pc
.delqf("count")
        
end
    end
    state __COMPLETE__ begin
    end
end 
mfg Risan

ps. Wir haben mehr als genug Anleitungen...

EDIT:
Obwohl ich zugeben muss das pc.setqf("count",0) auch unnötigt ist, wenn keine gesetzt wird bekommt man automatisch den return wert 0 .. Naja egal ^^