Register for your free account! | Forgot your password?

You last visited: Today at 20:06

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

Advertisement



[Guide] Questen für Anfänger

Discussion on [Guide] Questen für Anfänger within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1

 
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
[Guide] Questen für Anfänger

Vorwort

Auch wenn die Pros hier bestimmt gleich viel zu meckern haben denke ich, dass ich in der Lage bin, den Anfängern unter uns etwas beizubringen. Mir ist bewusst, dass es schon gute Guides gibt ( , ) allerdings fehlt mir da die eine oder andere Sache. Ich hoffe, dass ich einigen mit diesem Guide weiterhelfen kann und verbessert mich bitte, falls ich hier etwas falsches schreibe.


Einleitung

Die Quests in Metin2 basieren auf der Programmier-/Skriptsprache LUA ( Lua ? Wikipedia ). Man kann also (fast) alle LUA-Funktionen problemlos in Quests anwenden. Ein paar Ausnahmen gibt es (z.B. mag der Questcompiler modulo (%) überhaupt nicht, weshalb ich auch eine Questfunktion dafür geschrieben und veröffentlicht habe.


Nice to know / FAQ

Was ist der Unterschied zwischen "pc.give_item()" und pc.give_item2()
Hierzu können wir einen kurzen Blick in den Sourcecode werfen:
Code:
{ "give_item2",		pc_give_or_drop_item	},
Ich denke, dass das schon alles sagt. Das Item wird also, falls der Spieler keinen Platz im Inventar hat, auf dem Boden gedroppt (mit dem Spielernamen!)

Muss eine Quest immer die Dateiendung .quest haben?
Nein! Man kann eine Quest auch mit der Dateiendung .roflxd abspeichern und problemlos benutzen. Solange man die Dateiendung auch in der quest_list / locale_list einträgt ist es vollkommen egal, welche Dateiendung man wählt.

Was macht der Questcompiler?
Der Questcompiler (meistens "qc" / "qc_64") wandelt die von Euch geschriebenen Quests in reinen LUA Code um.

Mehrere Quests in einer Datei?
Es ist kein Problem mehrere Quests in einer Datei zu speichern. Ob das Sinn ergibt ist eine andere Sache, das muss jeder für sich entscheiden.

Gibt es eine Liste mit allen Questfunktionen?
Ja, die gibt es. Alle "aktivierten" Questfunktionen findet ihr in Eurer quest_functions-Datei im Questordner, allerdings kann es auch mal vorkommen, dass eine Questfunktion in der Game existiert und nicht in den quest_functions eingetragen ist.
Hier die quest_functions aus den aktuellen Viruz-Files:

Welche Questfunktionen benutzt du am häufigsten?

Wie füge ich neue Questfunktionen ein?
Einfach in die questlib.lua gehen und die Funktion dort einfügen, anschließend in der quest_functions-Datei den Funktionsnamen (ohne "()") eintragen. Zum reloaden der Questfunktionen reicht es, Ingame "reload q" einzugeben!


Die Quest-Trigger und wann sie auslösen
  • enter
  • login
  • logout
  • levelup
  • servertimer
  • timer
  • click
  • chat
  • kill
  • use
  • take
  • button
  • info

Code:
enter -> wenn die State betreten wird
login -> wenn der Spieler sich einloggt
logout -> wenn der Spieler sich ausloggt
levelup -> wenn der Spieler ein Level aufsteigt
servertimer -> (name.servertimer) wenn der Servertimer "name" ausgelöst wird
timer -> (name.timer) wenn der Timer "name" ausgelöst wird
click -> (npcvnum.click) wenn der NPC "npcvnum" angeklickt wird
chat -> (npcvnum.chat."Text") wenn die Auswahl "Text" bei dem NPC "npcvnum" ausgewählt wird
kill -> wenn der Spieler ein Monster oder einen Spieler tötet
use -> (vnum.use) wenn der Spieler "vnum" benutzt (muss Type 18 sein!)
take -> (npcvnum.take) wenn der Spieler ein Item auf "npcvnum" zieht
button -> Questbutton (Links an der Seite)
info -> Questbutton (Im Questreiter des Charakterfensters)

Die erste Quest

Jetzt fangen wir also an, unsere erste Quest zu schreiben. Eine Quest fängt immer wie folgt an:
Code:
quest questname begin
dabei muss der questname nicht der gleiche sein, wie die Datei heisst!

Danach kommt die state, man fängt immer mit state start an. Das ist die state in der jede Quest startet
Code:
quest questname begin
	state start begin
Und dann der Quest-Trigger
Code:
quest questname begin
	state start begin
		when login begin
Man kann auch mehrere Quest-Trigger ein einem Block benutzen.
Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use begin
Dann könnten wir auch schon mit unserer Quest starten, allerdings gibt es noch eine Sache, die man wissen sollte.
Man kann hinter dem Questtrigger auch noch eine Bedingung schreiben, ohne diese Bedingung oder auch mehrere Bedingungen wird der Code nicht ausgeführt.
Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
Wie ich oben schon geschrieben habe, gibt "pc.get_level()" das Level des Spielers zurück. Der Code wird also nur ausgeführt, wenn der Spieler mindestens Level 10 ist.

Bei folgendem Code wird also in einem Questfenster "Hallo" geschrieben, wenn der Spieler sich einloggt, ein Level aufsteigt oder das Item mit der Vnum 70007 benutzt und gleichzeitig mindestens Level 10 ist:
Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
			say("Hallo")
So würde das ganze aber noch nicht funktionieren, wir haben die end's vergessen. Unsere Quest würde so schon beim compilen versagen.
Ends müssen an folgenden stellen gesetzt werden:
  • quest ... begin
  • state ... begin
  • when ... begin
  • if ... then
  • for ... do
  • while ... do

Hierbei muss beachtet werden, dass man jedes "if" mit einem "end" beenden muss. Folgt auf das "if" noch ein "else" oder mehrere "elseif"s muss man das "end" erst am Ende aller Abfragen setzen!

Unsere Quest sollte also nun so aussehen:
Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
			say("Hallo")
		end
	end
end
Das würde so auch problemlos funktionieren. Aber hier sind wir noch lange nicht fertig. Wir fügen jetzt einfach mal die im Beispiel stehenden If-Abfragen in unsere Quest ein.

Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
			if pc.get_level() == 25 then
				say("Hallo, du bist genau Level 25")
			elseif pc.get_level() == 15 then
				say("Hallo, du bist genau Level 15")
			else
				say("Hallo, du bist weder Level 25 noch Level 15 aber mindestens Level 10")
			end
		end
	end
end
Jetzt möchten wir aber nicht, dass die Quest immer wieder losgeht, dafür haben wir den "set_state()"-Befehl. Mit dem können wir den Spieler innerhalb der Quest in eine andere State schicken.
Wenn wir das ganze nur ein mal pro Spieler anzeigen lassen möchten setzen wir ihn einfach in eine leere State. Man könnte es z.B. so machen:

-- Achtung schlechter Code
Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
			if pc.get_level() == 25 then
				say("Hallo, du bist genau Level 25")
				set_state(_COMPLETE_)
			elseif pc.get_level() == 15 then
				say("Hallo, du bist genau Level 15")
				set_state(_COMPLETE_)
			else
				say("Hallo, du bist weder Level 25 noch Level 15 aber mindestens Level 10")
				set_state(_COMPLETE_)
			end
		end
	end
	state _COMPLETE_ begin
	end
end
Allerdings ist das keine schöne Lösung, man ist ja Faul und möchte das ganze nicht 3x schreiben. Man muss sich also vorstellen, wie die Quest abläuft. Wir gehen einmal von einem Spieler mit Level 15 aus.
Code:
	-> Spieler loggt sich sein
	-> Spieler ist mindestens Level 10
		-> Spieler ist nicht Level 25
		-> Spieler ist Level 15
			-> Spieler bekommt die Nachricht "Hallo, du bist genau Level 15"
			-> Spieler wird in dieser Quest in die State _COMPLETE_ gesetzt
		-> If-Block wird beendet
	-> When-Block wird beendet
-> State-Block wird beendet
-> Spieler ist in State _COMPLETE_
wir sehen also, dass auch unter dem If-Block noch etwas gemacht werden kann. Und das wird ausgeführt, egal welcher If-Teil zuvor ausgeführt wurde. Also setzen wir die State einfach an der Stelle, an der es von jedem If-Teil betroffen ist.

Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
			if pc.get_level() == 25 then
				say("Hallo, du bist genau Level 25")
			elseif pc.get_level() == 15 then
				say("Hallo, du bist genau Level 15")
			else
				say("Hallo, du bist weder Level 25 noch Level 15 aber mindestens Level 10")
			end
			set_state(_COMPLETE_)
		end
	end
	state _COMPLETE_ begin
	end
end
Jetzt sieht der Ablauf also so aus:

Code:
	-> Spieler loggt sich sein
	-> Spieler ist mindestens Level 10
		-> Spieler ist nicht Level 25
		-> Spieler ist Level 15
			-> Spieler bekommt die Nachricht "Hallo, du bist genau Level 15"
		-> If-Block wird beendet
		-> Spieler wird in dieser Quest in die State _COMPLETE_ gesetzt
	-> When-Block wird beendet
-> State-Block wird beendet
-> Spieler ist in State _COMPLETE_
Damit haben wir uns schon etwas gespart und es ist auch etwas lesbarer.
Unsere Erste Quest haben wir jetzt geschrieben, bevor wir weitermachen müssen wir aber noch ein paar Sachen kennenlernen.


Lokale und Globale Variablen

Euch ist vielleicht schon aufgefallen, dass viele in ihren Quests "local" vor den Variablen stehen haben. Das heisst einfach, dass die Variable nur in dem Block zugreifbar ist, in dem sie deklariert wurde. Eine globale Variable ist Blockübergreifend gültig. Wenn man also folgendes macht:

Code:
local str = "hi"
say(str)
klappt es ohne Probleme.
Folgendes geht auch:

Code:
local str = "hi"
if pc.get_level() >= 10 then
	say(str)
end
Aber in diesem Beispiel würde es nicht mehr gehen, weil der Block in dem die Variable deklariert wurde beendet wurde:

Code:
if pc.get_level() >= 10 then
	local str = "hi"
end
say(str)
Hier müssen wir also eine globale Variable setzen. Das geht einfach, indem man das "local" weglässt.

Code:
if pc.get_level() >= 10 then
	str = "hi"
end
say(str)
Sobald man eine Variable deklariert nimmt diese den Wert an. Hat man also z.B. eine Query als Variable gespeichert, wird diese bei Deklaration und NICHT beim Aufruf ausgeführt!

Selects sind z.B. auch Dinge, die einen Wert annehmen. Der Wert eines selects ist immer der ausgewählte Punkt. Man kann also bei einem select auch ohne Variable einen Wert abfragen:

Code:
if select("Weiter", "Abbrechen") == 2 then return end

Break und Return

Ein Break beendet die aktuelle Schleife sofort, ein return bricht den kompletten Code ab. In Funktionen gibt man mit einem return auch den Rückgabewert an.


Tables

(mehr Infos zu Tables findet ihr hier: )

Wir haben in LUA natürlich auch Tables. Sie sind vergleichbar mit Arrays, eigentlich sogar das gleiche. Aber wie wird ein Table erstellt? Das ist ganz simpel:

Code:
{}
damit haben wir einen leeren Table, wir können ihn nicht aufrufen.

Code:
local mytbl = {}
damit haben wir also einen Table, den wir über die Variable "mytbl" aufrufen können

Jetzt packen wir doch mal ein paar Sachen in unseren Table:

Code:
local mytbl = {"genau Level 25", "genau Level 15", "weder Level 25 noch Level 15 aber mindestens Level 10"}
ein paar von Euch erkennen vielleicht schon, was ich jetzt vor habe. Aber zuerst schauen wir uns mal an, wie wir aus einem Table Daten abrufen.

Code:
mytbl[1] --gibt den ersten Eintrag im Table zurück
mytbl[2] --gibt den zweiten Eintrag im Table zurück
...
Das kann man aber natürlich noch erweitern. Man kann z.B. Tables in einen Table legen:

Code:
local mytbl = {
	{"Hallo 10", "Hallo 11"},
	{"Hallo 20", "Hallo 21"},
	{"Hallo 30", "Hallo 31"}
}
Diese ruft man dann wie folgt auf:
Code:
mytbl[1][1] -> "Hallo 10"
mytbl[1][2] -> "Hallo 11"
mytbl[3][1] -> "Hallo 30"
Aber auch das ist noch nicht alles, was man machen kann. Man kann z.B. auch Variablen innerhalb eines Tables deklarieren (aber keine lokalen Variablen, die währen nicht zugreifbar!)

Code:
local mytbl = {
	eins = {"Hallo 10", "Hallo 11"},
	zwei = {"Hallo 20", "Hallo 21"},
	drei = {"Hallo 30", "Hallo 31"}
}
diese können wir wie folgt aufrufen:

Code:
mytbl.eins[1] -> "Hallo 10"
mytbl.eins[2] -> "Hallo 11"
mytbl.drei[2] -> "Hallo 31"
Und auch das ist noch nicht das Ende von diesem Kapitel. Es gibt noch eine weitere Möglichkeit, auf Daten in Tables zuzugreifen:

Code:
local mytbl = {
	[1] = {"Hallo 10", "Hallo 11"},
	["zwei"] = {"Hallo 20", "Hallo 21"},
	[31] = {"Hallo 30", "Hallo 31"}
}
Auf diese Tables können wir so zugreifen:

Code:
mytbl[1][1] -> "Hallo 10"
mytbl["zwei"][2] -> "Hallo 21"
mytbl[31][1] -> "Hallo 30"
Und das ganze kann man auch in Kurzform machen, ohne, dass man den Table in eine Variable legt:

Code:
({"Hallo", "Tschüss"})[1] -> "Hallo"
({"Hallo", "Tschüss"})[2] -> "Tschüss"
Nun aber zurück zu unserer Quest.


Nutzen von Tables innerhalb von Quests

Wir haben also unsere Quest von oben:

Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
			if pc.get_level() == 25 then
				say("Hallo, du bist genau Level 25")
			elseif pc.get_level() == 15 then
				say("Hallo, du bist genau Level 15")
			else
				say("Hallo, du bist weder Level 25 noch Level 15 aber mindestens Level 10")
			end
			set_state(_COMPLETE_)
		end
	end
	state _COMPLETE_ begin
	end
end
und ich habe im letzten Kapitel schon etwas dazu angedeutet. Hierzu muss ich sagen, dass kürzer nicht immer besser ist. Man muss natürlich immer schauen, dass die Quest lesbar bleibt. Ich komme damit aber sehr gut klar, also zeige ich jetzt einmal, wie man das ganze noch etwas kürzen kann:

Code:
quest questname begin
	state start begin
		when login or levelup or 70007.use with pc.get_level() >= 10 begin
			local str = ({
				[25] = "genau Level 25",
				[15] = "genau Level 15"
			})[pc.get_level()] or "weder Level 25 noch Level 15 aber mindestens Level 10"
			say("Hallo, du bist "..str)
			set_state(_COMPLETE_)
		end
	end
	state _COMPLETE_ begin
	end
end
Aber hey, was ist das denn jetzt? Die 3. Option ist doch garnicht definiert?
Richtig! Aber dafür haben wir das "or". Wir deklarieren hier die Variable str sofort, wie auch schon im vorherigen Kapitel besprochen, und fragen nach dem Spieler Level ab. Aber eine Sache ist neu: Das or. Das or macht an der Stelle eine wichtige Sache: Wenn der Table nil ist, also wenn unter dem Spielerlevel kein Eintrag gefunden wurde, trifft das or zu. Die Variable "str" ist dann also "weder Level 25 noch Level 15 aber mindestens Level 10".


Wenn ihr es bis hier hin geschafft habt könnt ihr schon viele Sachen machen, die schon von einem Anfänger entfernt sind. Mit Tables und den Abfragen die ich Euch gezeigt habe gibt es viele Dinge, die man mit Quests machen kann. Jetzt habe ich noch einen Punkt, den ich abhaken möchte:


"Endlos"-Menüs

Wenn ihr aktiv auf Epvp seid und vielleicht meine Releases verfolgt habt, solltet ihr gemerkt habe, dass ich immer häufiger ein für Metin-Quests untypisches "Endloses"-Menü in meinen Quests verwende. Wie genau man das macht ist eigentlich sehr simpel.
Es gibt 2 Möglichkeiten:

1. Möglichkeit: Dauerschleife
Das ist die Variante, die ich in meinen Quests verwende. Ich setze um das Hauptmenü eine Dauerschleife:

Code:
quest questname begin
	state start begin
		when 11001.chat."Endlos-Menü" begin
			repeat
			until false
		end
	end
end
Man kann auch eine while-Schleife benutzen, allerdings mag ich die repeat-Schleife lieber.

Hier mal eine Quest mit einem "Endlosen" Menü:

Code:
quest questname begin
	state start begin
		when 11001.chat."Endlos-Menü" begin
			repeat
				say("Was möchtest du machen?")
				local s = select("Item geben", "Monster spawnen", "Abbrechen")
				if s == 1 then
					repeat
						say("Welches Item?")
						vnum = tonumber(input())
						if vnum then
							if item_name(vnum) != "" then
								say("Möchtest du wirklich "..item_name(vnum).." haben?")
								local s = select(item_name(vnum).." nehmen", "andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
								if s == 1 then
									pc.give_item2(vnum, 1)
									return
								elseif s == 3 then
									break
								elseif s == 4 then
									return
								end
							else
								say("Dieses Item gibt es nicht!")
								local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
								if s == 2 then
									break
								elseif s == 3 then
									return
								end
							end
						else
							say("Du kannst nur Zahlen eingeben!")
							local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
							if s == 2 then
								break
							elseif s == 3 then
								return
							end
						end
					until false
				elseif s == 2 then
					repeat
						say("Welches Monster?")
						vnum = tonumber(input())
						if vnum then
							if mob_name(vnum) != "" then
								say("Möchtest du wirklich "..mob_name(vnum).." spawnen?")
								local s = select(mob_name(vnum).." spawnen", "andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
								if s == 1 then
									mob.spawn(vnum, pc.get_local_x(), pc.get_local_y(), 1)
									return
								elseif s == 3 then
									break
								elseif s == 4 then
									return
								end
							else
								say("Dieses Monster gibt es nicht!")
								local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
								if s == 2 then
									break
								elseif s == 3 then
									return
								end
							end
						else
							say("Du kannst nur Zahlen eingeben!")
							local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
							if s == 2 then
								break
							elseif s == 3 then
								return
							end
						end
					until false
				else
					return
				end
			until false
		end
	end
end
Wie man hier sehen kann, habe ich bei den selects für die Option "andere VNUM eingeben" keine Aktion festgelegt. Und das ist auch gewollt so. Denn dadurch wird die Schleife (until false) wiederholt.
Bei dem Punkt "zum Hauptmenü" breche ich mit einem "break" aus der aktuellen Schleife (der Schleife in der man die VNUM eingibt) aus und werde von der Hauptmenü Schleife gefangen.

2. Möglichkeit: Eine Funktion für jeden Menüpunkt

Diese Möglichkeit mag ich nicht so gerne, allerdings funktioniert sie auch.

Code:
quest questname begin
	state start begin
		when 11001.chat."Endlos-Menü" begin
			main_menu()
		end
	end
end

function main_menu()
	say("Was möchtest du machen?")
	local s = select("Item geben", "Monster spawnen", "Abbrechen")
	if s == 1 then
		item_geben()
	elseif s == 2 then
		monster_spawnen()
	else
		return
	end
end

function item_geben()
	say("Welches Item?")
	local vnum = tonumber(input())
	if vnum then
		if item_name(vnum) != "" then
			say("Möchtest du wirklich "..item_name(vnum).." haben?")
			local s = select(item_name(vnum).." nehmen", "andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
			if s == 1 then
				pc.give_item2(vnum, 1)
				return
			elseif s == 2 then
				item_geben()
			elseif s == 3 then
				main_menu()
			elseif s == 4 then
				return
			end
		else
			say("Dieses Item gibt es nicht!")
			local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
			if s == 1 then
				item_geben()
			elseif s == 2 then
				main_menu()
			elseif s == 3 then
				return
			end
		end
	else
		say("Du kannst nur Zahlen eingeben!")
		local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
		if s == 1 then
			item_geben()
		elseif s == 2 then
			main_menu()
		elseif s == 3 then
			return
		end
	end
end

function monster_spawnen()
	say("Welches Monster?")
	local vnum = tonumber(input())
	if vnum then
		if item_name(vnum) != "" then
			say("Möchtest du wirklich "..mob_name(vnum).." spawnen?")
			local s = select(mob_name(vnum).." spawnen", "andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
			if s == 1 then
				mob.spawn(vnum, pc.get_local_x(), pc.get_local_y(), 1)
				return
			elseif s == 2 then
				monster_spawnen()
			elseif s == 3 then
				main_menu()
			elseif s == 4 then
				return
			end
		else
			say("Dieses Item gibt es nicht!")
			local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
			if s == 1 then
				monster_spawnen()
			elseif s == 2 then
				main_menu()
			elseif s == 3 then
				return
			end
		end
	else
		say("Du kannst nur Zahlen eingeben!")
		local s = select("andere VNUM eingeben", "zum Hauptmenü", "Abbrechen")
		if s == 1 then
			monster_spawnen()
		elseif s == 2 then
			main_menu()
		elseif s == 3 then
			return
		end
	end
end
Der Nachteil an dieser Variante ist, dass man den Funktionen alle Variablen mitgeben muss, die in einem vorherigen Menüpunkt bestimmt worden sind.




Special Thanks
  • .Xilent
  • Poccix
  • Yiv
  • Luki
  • Akkelos
  • Kilroy




Ich hoffe, dass ich mit diesem Thread dem ein oder anderen helfen kann. Falls ihr Fehler findet meldet euch bitte direkt hier im Thread!
rollback is offline  
Thanks
45 Users
Old 03/28/2015, 14:35   #2
 
DasSchwarzeT's Avatar
 
elite*gold: 399
Join Date: Sep 2011
Posts: 5,323
Received Thanks: 3,938
Sehr gutes Tutorial, viel besser als alle, die es bis jetzt gab. Danke
DasSchwarzeT is offline  
Thanks
2 Users
Old 03/28/2015, 14:38   #3
 
.Risan.'s Avatar
 
elite*gold: 30
Join Date: Jul 2010
Posts: 1,627
Received Thanks: 1,450
disconectet gibs nicht... is Logout..

du hast noch paar vergessen..

.Risan. is offline  
Thanks
1 User
Old 03/28/2015, 14:40   #4
 
Tuora's Avatar
 
elite*gold: 0
Join Date: Jun 2014
Posts: 1,045
Received Thanks: 954
Nice das mal etwas für mich danke dir
Tuora is offline  
Thanks
1 User
Old 03/28/2015, 14:44   #5
 
elite*gold: 0
Join Date: Mar 2015
Posts: 14
Received Thanks: 5
Also ich denke, du solltest dich nun an C, D oder C++ (D ist ein guter Einstieg für C++) ranwagen, du verschwendest sonst dein "Talent", wenn du weiter so Lua, Autoit oder etc. lernst. Aber zum Release, sieht ziemlich gut aus.
KingAxanius is offline  
Thanks
1 User
Old 03/28/2015, 14:58   #6
 
i<3house's Avatar
 
elite*gold: 0
Join Date: Jan 2012
Posts: 168
Received Thanks: 142
Ganz starkes Release. Vielen dank
i<3house is offline  
Thanks
1 User
Old 03/28/2015, 15:07   #7

 
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
Quote:
Originally Posted by .Risan. View Post
disconectet gibs nicht... is Logout..

du hast noch paar vergessen..

Kannste mir kurz sagen wann die folgenden auslösen? :

PHP Code:
m_mapEventName.insert(TEventNameMap::value_type("in"QUEST_ATTR_IN_EVENT));        // ¸ÊÀǠƯÁ¤ ¼Ó¼º¿¡ µé¾î°¨
        
m_mapEventName.insert(TEventNameMap::value_type("out"QUEST_ATTR_OUT_EVENT));        // ¸ÊÀǠƯÁ¤ ¼Ó¼º¿¡¼* ³ª¿È
        
m_mapEventName.insert(TEventNameMap::value_type("target"QUEST_TARGET_EVENT));        // Å¸°Ù
        
m_mapEventName.insert(TEventNameMap::value_type("unmount"QUEST_UNMOUNT_EVENT));
        
m_mapEventName.insert(TEventNameMap::value_type("pick"QUEST_ITEM_PICK_EVENT));    // ¶³¾îÁ®Àִ ¾ÆÀÌÅÛÀ» ½ÀµæÇÔ.
        
m_mapEventName.insert(TEventNameMap::value_type("sig_use"QUEST_SIG_USE_EVENT));        // Special item group¿¡ ¼ÓÇÑ ¾ÆÀÌÅÛÀ» »ç¿ëÇÔ.
        
m_mapEventName.insert(TEventNameMap::value_type("item_informer"QUEST_ITEM_INFORMER_EVENT));    // µ¶Àϼ±¹°±â´ÉÅ×½ºÆ®
        
m_mapEventName.insert(TEventNameMap::value_type("questpacket"QUEST_PACKET));
        
m_mapEventName.insert(TEventNameMap::value_type("pet_remove"QUEST_PET_REMOVE));
        
m_mapEventName.insert(TEventNameMap::value_type("upgrade"QUEST_UPGRADE_EVENT)); 
rollback is offline  
Old 03/28/2015, 15:25   #8
 
.Risan.'s Avatar
 
elite*gold: 30
Join Date: Jul 2010
Posts: 1,627
Received Thanks: 1,450
jo...

in: Wenn die Server_attr eingetreten bist (genauen sinn dahiner verstehe ich auch nicht
out: das selbe nur beim austreten

Speziell im Dungeon beide!

target: is das wenn NPC pfeil auf dem kopf hat und du in anklickst..
unmount: Wenn vom Mount absteigst (ka ob es beim Pferd selbe gilt)
pick: Wenn du VNUM aufhebst.
sig_use: Wenn item anklickst das verbunden is mit der Special_itemgroup.txt
item_informer: Wenn dir jemand ein Geschenk gemacht hat (Geschenk unten links über dem Energie Balken)

Quest ist bei anderen nicht vorhanden...
.Risan. is offline  
Thanks
1 User
Old 03/28/2015, 15:31   #9
 
DasSchwarzeT's Avatar
 
elite*gold: 399
Join Date: Sep 2011
Posts: 5,323
Received Thanks: 3,938
m_mapEventName.insert(TEventNameMap::value_type("u pgrade", QUEST_UPGRADE_EVENT));
würde ich jetzt einfach mal raten wird getriggert wenn man einen Gegenstand uppt.

EDIT:
Habs getestet, upgrade ist nicht fürs Uppen von Gegenständen
DasSchwarzeT is offline  
Old 03/28/2015, 15:59   #10
 
Zaturix's Avatar
 
elite*gold: 0
Join Date: Oct 2014
Posts: 408
Received Thanks: 208
Ich finde es sehr gut gerade für mich!!


Vielen Dank



Mit freundlichen Grüßen
Zaturix is offline  
Thanks
1 User
Old 03/28/2015, 16:04   #11

 
.yorliK's Avatar
 
elite*gold: 0
Join Date: Nov 2011
Posts: 1,448
Received Thanks: 1,258
Es gibt auch noch den Trigger leave -> wenn man den state verlässt

Ich finde, auch wenn du die Tabellen gut erklärt hast, gibt es diesen Thread hier: den solltest du verlinken, da wie ich finde, man dort am meisten über Tabellen erfährt. Kannst ja n paar Sachen noch erwähnen die dir evtl in diesem Tut fehlen.
.yorliK is offline  
Thanks
1 User
Old 03/28/2015, 17:13   #12
 
elite*gold: 1
Join Date: May 2012
Posts: 672
Received Thanks: 88
Ist das nicht der Sensenmann?
Nice TuT Braa.

MfG Joza
byte Joza is offline  
Thanks
1 User
Old 03/28/2015, 17:35   #13
 
.Various's Avatar
 
elite*gold: 35
Join Date: Aug 2014
Posts: 336
Received Thanks: 267
Schickes Guide
kannst du ja noch weiter ausbauen, ich finde du erklärst das alles echt gut, perfekt für Anfänger.

.Various is offline  
Thanks
1 User
Old 03/28/2015, 18:49   #14
 
Ekrem2's Avatar
 
elite*gold: 4
Join Date: Aug 2011
Posts: 236
Received Thanks: 141
i love you man

the guide is awesome thanks
Ekrem2 is offline  
Thanks
1 User
Old 03/28/2015, 19:25   #15
 
elite*gold: 54
Join Date: Jan 2013
Posts: 518
Received Thanks: 354
Ich fände eine Erklärung für "for ... do" und "while ... do" noch ultra.
Vielen vielen Dank für diese Release, habe sogar mal wieder Lust darauf. :O
Rextrus is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
[P-Server]=Questen lohnt sich!!!=LvL + Yang Guide
12/07/2009 - Metin2 PServer Guides & Strategies - 24 Replies
Hey Com, hab hier mal was gutes für P-server. Alsa ihr könnt schon bei quest für lvl 2 anfangen lvl 2 Brief vom Stadtwächter töte 9 normale wildhunde kehre dann zum Wächter zurück. du bekommst hier noch kein item allerdings wirst du mit dieser quest sofort auf lvl 15 kommen lvl 3 Nachricht vom Stadtwächter



All times are GMT +2. The time now is 20:06.


Powered by vBulletin®
Copyright ©2000 - 2024, 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 ©2024 elitepvpers All Rights Reserved.