|
You last visited: Today at 03:30
Advertisement
[SERVICE] Die Questkontrolle
Discussion on [SERVICE] Die Questkontrolle within the Metin2 Private Server forum part of the Metin2 category.
01/26/2015, 22:27
|
#10891
|
elite*gold: 13
Join Date: Sep 2014
Posts: 166
Received Thanks: 55
|
1. Quest aus diesem Tutorial ->
2. Die Probleme: Er nimmt erfolgreich das Passwort und nimmt die Gewundenen Schlüssel. Man wird aber nicht geportet
2.1 Wenn man den NPC dann nochmal anklickt kann man das Passwort eingeben, dann sagt er zwar, dass es korrekt ist, aber im nächsten Schritt will er wieder die 3 Gew. Schlüssel. danach wird man auch nicht geportet.
Das kann man in Dauerschleife machen, bis sich irgendwann der Zugang schließt
Habe den Mapindex angepasst und eigentlich alles gemacht wie in dem vorran geposteten Tutorial, habe allerdings nicht die Clientdateien eingefügt, weil die schon in meinem Client drin sind (also sowieso die normalen grottendateien patch2)
Ich denke der Fehler liegt jetzt in der Quest, könnte mir die einer so anpassen, dass man die Schlüssel nicht immer wieder abgeben muss und man geportet wird, wenn man den Code korrekt eingegeben hat? VBox spuckt keine Fehler aus, habe die Questfunktionen bereits der quest_functions hinzugefügt.
HTML Code:
----------------------------------------------------
--Tempel des Drachen
----------------------------------------------------
quest drachenraum begin
state start begin
when logout with pc.get_map_index() >= (82*10000) begin
pc.setqf("punishment", 1)
end
when login with pc.get_map_index() >= (82*10000) and pc.getqf("punishment") == 1 begin
pc.setqf("punishment", 0)
warp_to_village()
end
when 30121.chat."Ich will den Drachen töten" with pc.get_map_index() == 73 begin
pc.setqf("punishment", 0)
if game.get_event_flag("dragontemple_used") == 1 then
if game.get_event_flag("dragontemple_block") == 1 then
say_title(mob_name(30121))
say("")
say("Der Raum ist gesperrt, versuch es später noch ein mal.")
return;
end
say_title(mob_name(30121))
say("")
say("Tut mir Leid, der Raum ist reseviert.")
say("Wenn du ein Passwort hast für den Zugang")
say("gebe es jetzt bitte ein.")
local password = input()
if game.get_event_flag("dragontemple_password") == tonumber(password) then
say_title(mob_name(30121))
say("")
say("Das Passwort stimmt überein.")
say("Ich bringe dich in die Kammer")
wait()
say_title(mob_name(30121))
say("")
say("Wenn du willst kann ich dich sofort,")
say("in den Drachnraum bringen.")
say("Gib mir einfach 3 "..item_name(30179))
say("")
say_item_vnum(30179)
local s = select("Hier, nimm sie und bring mich rein", "Abbrechen")
if s == 1 then
if pc.count_item(30179) >= 3 then
pc.remove_item(30179, 3)
pc.warp(843600, 1066900, (82*10000))
else
say("Du hast nur "..pc.count_item(30179).." von 3 benötigten")
sammeln = 3 - pc.count_item(30179)
say("Sammle bitte noch "..sammeln.." "..item_name(30179))
say("")
say_item_vnum(30179)
end
else
return
end
else
say_title(mob_name(30121))
say("")
say("Das Passwort stimmt nicht überein.")
return
end
elseif pc.has_guild() and game.get_event_flag("dragontemple_used") == 0 then
say_title(mob_name(30121))
say("")
say("Du willst also den Drachen bekämpfen?")
say("Dann gib bitte erst ein Passwort(nur Zahlen) ein")
say("um den Raum zu schützen. Geb das Passwort")
say("einfach deinen Gruppenmitgliedern und sie")
say("können mit in den Raum")
say("Gib es bitte jetzt ein.")
local password = tonumber(input())
say_title(mob_name(30121))
say("")
say("Um jetzt in den Drachenraum zu kommen")
say("brauche ich 3 "..item_name(30179))
say("")
say_item_vnum(30179)
say("")
local s = select("Hier, nimm sie und bring mich rein", "Abbrechen")
if s == 1 then
if pc.count_item(30179) >= 3 then
pc.remove_item(30179, 3)
if game.get_event_flag("dragontemple_notfinished") == 0 then
local ret = DragonLair.startRaid(82)
else
pc.warp(843600, 1066900, (82*10000))
end
game.set_event_flag("dragontemple_used", 1)
game.set_event_flag("dragontemple_notfinished", 1)
game.set_event_flag("dragontemple_password", password)
timer("blockentry", 5*60)
timer("not_finished", 1800)
else
say("Du hast nur "..pc.count_item(30179).." von 3 benötigten")
sammeln = 3 - pc.count_item(30179)
say("Sammle bitte noch "..sammeln.." "..item_name(30179))
say("")
say_item_vnum(30179)
say("")
return
end
elseif s == 2 then
return
end
elseif not pc.has_guild() then
say_title(mob_name(30121))
say("")
say("Du benötigst eine starke Gilde")
say("um gegen den Drachen zu kämpfen.")
end
end
when 2493.kill with pc.get_map_index() >= (82*10000) begin
timer("set_unused", 30)
end
when not_finished.timer begin
game.set_event_flag("dragontemple_used", 0)
game.set_event_flag("dragontemple_block", 0)
warp_to_village()
end
when set_unused.timer begin
game.set_event_flag("dragontemple_used", 0)
game.set_event_flag("dragontemple_block", 0)
game.set_event_flag("dragontemple_notfinished", 0)
notice_all("Der Drache wurde von "..pc.get_name().." getötet!")
notice_all("Herzlichen Glückwunsch!")
DragonLair.endRaid(82*10000)
end
when blockentry.timer begin
game.set_event_flag("dragontemple_block", 1)
end
end
end
|
|
|
01/27/2015, 16:19
|
#10892
|
elite*gold: 0
Join Date: Jan 2013
Posts: 1,818
Received Thanks: 336
|
Es kommt ein Error, wenn ich die Quest lade:
PHP Code:
quest kill90 begin state start begin when login or levelup with pc.level >= 90 begin set_state(info) end end state info begin when letter begin send_letter("Dein Auftrag") end when button or info begin say_title("Dein Auftrag") say("Hey DU, Ja, genau DU!") say("Es wird Zeit, dass du nun eine vernünftige Rüstung und eine neue Waffe erhältst. Für diese sollst du nun nochmehr Kämpfen als vorher. Töte nun gleich die Anzahl der Monster, die du gleich erfahren wirst und du bekommst beim erfüllen dieser Aufgabe, je ein Upp-Item für deine neue Waffe und deine neue Rüstung.") say("Mach dich bereit und stelle dich den Kampf.") say_reward("Töte 5 Eishexen") set_state(killin) end end state killin begin when letter or login begin send_letter("Dein Auftrag") end when button or info begin say_title("Dein Auftrag") say("Du musst noch ".. (5 - pc.getf("kill90", "killed")) .." Eishexen töten") say() wait() send_letter("Dein Auftrag") end when kill with not npc.is_pc() and npc.get_race() == 1191 begin pc.setf("kill90", "killed", pc.getf("kill90", "killed") + 1) if pc.getf("kill90", "killed") == 5 then say("Du hast alle Eishexen getötet") say("Deine Belohnung: ".. item_name(19)) -- vnum anpassen pc.give_item2(19) -- vnum anpassen set_state(__COMPLETE__) end end end state __COMPLETE__ begin end end
|
|
|
01/27/2015, 17:02
|
#10893
|
elite*gold: 0
Join Date: Dec 2013
Posts: 111
Received Thanks: 20
|
[SPOILER]
PHP Code:
quest kill90 begin state start begin when login or levelup with pc.level >= 90 begin set_state(info) end end state info begin when letter begin send_letter("Dein Auftrag") end when button or info begin say_title("Dein Auftrag") say("Hey DU, Ja, genau DU!") say("Es wird Zeit, dass du nun eine vernünftige Rüstung und eine neue Waffe erhältst. Für diese sollst du nun nochmehr Kämpfen als vorher. Töte nun gleich die Anzahl der Monster, die du gleich erfahren wirst und du bekommst beim erfüllen dieser Aufgabe, je ein Upp-Item für deine neue Waffe und deine neue Rüstung.") say("Mach dich bereit und stelle dich den Kampf.") say_reward("Töte 5 Eishexen") set_state(killin) end end state killin begin when letter or login begin send_letter("Dein Auftrag") end when button or info begin say_title("Dein Auftrag") say("Du musst noch ".. (5 - pc.getf("kill90", "killed")) .." Eishexen töten") say() wait() send_letter("Dein Auftrag") end when kill with not npc.is_pc() and npc.get_race() == 1191 begin pc.setf("kill90", "killed", pc.getf("kill90", "killed") + 1) if pc.getf("kill90", "killed") == 5 then say("Du hast alle Eishexen getötet") say("Deine Belohnung: ".. item_name(19)) -- vnum anpassen pc.give_item2(19) -- vnum anpassen set_state(__COMPLETE__) end end end state __COMPLETE__ begin end end
[/quote]
PHP Code:
quest kill90 begin state start begin when login or levelup with pc.level >= 90 begin set_state(info) end end state info begin when letter begin send_letter("Dein Auftrag") end when button or info begin say_title("Dein Auftrag") say("Hey DU, Ja, genau DU!") say("Es wird Zeit, dass du nun eine vernünftige Rüstung") say("und eine neue Waffe erhälst.") say("Für diese sollst du nun nochmehr Kämpfen als ") say("Töte nun gleich die Anzahl der Monster,") say("die du gleich erfahren wirst und du bekommst beim") say("Erfüllen dieser Aufgabe, je ein Upp-Item für deine") say("neue Waffe und deine neue Rüstung.") say("Mach dich bereit und stelle dich den Kampf.") say_reward("Töte 5 Eishexen") set_state(killin) end end state killin begin when letter or login begin send_letter("Dein Auftrag") end when button or info begin say_title("Dein Auftrag") say("Du musst noch ".. (5 - pc.getf("kill90", "killed")) .." Eishexen töten") say() wait() send_letter("Dein Auftrag") end when kill with not npc.is_pc() and npc.get_race() == 1191 begin pc.setf("kill90", "killed", pc.getf("kill90", "killed") + 1) if pc.getf("kill90", "killed") == 5 then say("Du hast alle Eishexen getötet") say("Deine Belohnung: ".. item_name(19)) -- vnum anpassen pc.give_item2(19) -- vnum anpassen set_state(__COMPLETE__) end end end state __COMPLETE__ begin end end
Du musst alles in say("") setzen, auch wenn du eine neue Zeile anfängst, drückst einfach enter, tabst ggf. damit es bündig ist und schreibst dann say("[Text]") (Habs jetzt hier im Textfeld bearbeitet, deswegen stimmen die Tabs nicht, musst du selbst machen)
|
|
|
01/27/2015, 17:24
|
#10894
|
elite*gold: 0
Join Date: Nov 2014
Posts: 56
Received Thanks: 1
|
Ich hab mal so ne frage undzwar was bedeutet dieses pc.setqf oder pc.getqf? bzw wieso steht da z.B. pc.setqf(kill90) woher kommt diese kill90 in der klammer?
|
|
|
01/27/2015, 17:26
|
#10895
|
elite*gold: 0
Join Date: Jan 2015
Posts: 106
Received Thanks: 52
|
Quote:
Originally Posted by ~YPG~
Ich hab mal so ne frage undzwar was bedeutet dieses pc.setqf oder pc.getqf? bzw wieso steht da z.B. pc.setqf(kill90) woher kommt diese kill90 in der klammer?
|
Kann man frei wählen, wie man eine Flag nennt.
|
|
|
01/27/2015, 17:48
|
#10896
|
elite*gold: 0
Join Date: Nov 2014
Posts: 56
Received Thanks: 1
|
oke und dann noch ne frage 
ja ich weiß ist nervig aber bin gerade am alles lernen
was ist eine questflag wird oft von gesprochen was bewirkt sie ?
oder besser gesagt was ist eine questflag
|
|
|
01/27/2015, 17:51
|
#10897
|
elite*gold: 0
Join Date: Jan 2015
Posts: 106
Received Thanks: 52
|
Quote:
Originally Posted by DarkCry96
Das ist eine Flag, also quasi wie ein Auslöser
(set_state [Flag])
(state [Flag] begin)
|
Ein state ist keine Flag.
Quote:
Originally Posted by ~YPG~
oke und dann noch ne frage 
ja ich weiß ist nervig aber bin gerade am alles lernen
was ist eine questflag wird oft von gesprochen was bewirkt sie ?
oder besser gesagt was ist eine questflag
|
In einer Flag können Werte gespeichert werden und man kann sie auch in anderen Quests verwenden.
|
|
|
01/27/2015, 17:59
|
#10898
|
elite*gold: 0
Join Date: Nov 2014
Posts: 56
Received Thanks: 1
|
oke danke dir!
Es gibt ja eine When-Schleife.
Sprich wenn ich sage when .... levelup ....
und dann mit if anfange und sage
if ... = ... then
....
....
....
dann steht da bei manchen quests return.
was bewirkt dieses return also schließt es dann dieses questfenster oder kommt wieder zum anfang des questfensters?
danke euch
|
|
|
01/27/2015, 18:01
|
#10899
|
elite*gold: 0
Join Date: Jan 2015
Posts: 106
Received Thanks: 52
|
Quote:
Originally Posted by ~YPG~
oke danke dir!
Es gibt ja eine When-Schleife.
Sprich wenn ich sage when .... levelup ....
und dann mit if anfange und sage
if ... = ... then
....
....
....
dann steht da bei manchen quests return.
was bewirkt dieses return also schließt es dann dieses questfenster oder kommt wieder zum anfang des questfensters?
danke euch
|
Das return bewirkt normalerweise, dass der weitere Ablauf abgebrochen wird und ein Wert wiedergegeben wird. In manchen Sprachen (unter anderem Lua) kann man aber auch keinen Wert zurückgeben und trotzdem wird der Ablauf abgebrochen.
|
|
|
01/27/2015, 18:03
|
#10900
|
elite*gold: 0
Join Date: Nov 2014
Posts: 56
Received Thanks: 1
|
oke also muss ich dem return kein wert zuweisen.
sowie ich es jetzt verstanden habe wird das questfenster geschlossen?
Naja jetzt nerv ich mal nicht weiter und teste weiter aus 
Trotzdem danke euch!
|
|
|
01/27/2015, 18:54
|
#10901
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Habe in den großen Weiten des Internets folgende LUA Funktion gefunden:
PHP Code:
function SecondsToClock(sSeconds) local nSeconds = String.ToNumber(sSeconds) if nSeconds == 0 then return "00:00:00"; else nHours = string.format("%02.f", Math.Floor(nSeconds/3600)); nMins = string.format("%02.f", Math.Floor(nSeconds/60 - (nHours*60))); nSecs = string.format("%02.f", Math.Floor(nSeconds - nHours*3600 - nMins *60)); return nHours.." Stunden "..nMins.." Minuten und "..nSecs.." Sekunden" end end
und versuche gerade verzweifelt diese per Quest aufzurufen ... :
PHP Code:
say("Noch ".. SecondsToClock(11527) .."")
Klappt allerdings nicht (das Questfenster geht auf aber da, wo der Text stehen müsste kommt nichts weiter ...
Habe es dann nochmal so versucht:
PHP Code:
if SecondsToClock(11527) == "3 Stunden 12 Minuten und 7 Sekunden" then say("Jo isses") else say("nope") end
Kommt das gleiche ...
|
|
|
01/27/2015, 19:15
|
#10902
|
elite*gold: 0
Join Date: Dec 2013
Posts: 111
Received Thanks: 20
|
PHP Code:
quest bedrohung begin
state start begin
when login or levelup with pc.level >= 75 begin
set_state(information)
end
end
state information begin
when letter begin
send_letter("Die dunkle Bedrohung")
end
when info or button begin
say_title("Boss-Auftrag")
say("Hallo Spieler von Mhora2!")
say("Seit kurzem nimmt die Bedrohung durch die")
say("Dämonen zu.")
say("Um diese dunkle Macht zurückzuschlagen, muss ein")
say("Böser Dämon besiegt werden, welcher bisher von den")
say("wenigsten Kämpfern besiegt wurde..")
say("Es handelt sich um den Sensenmann im Dämonenturm")
say("Nur du kannst es schaffen")
say("diesem Monster die Stirn zu bieten.")
say("Bitte hilf uns:")
say_reward("Töte 2x den Sensenmann.")
say_reward("Du findest ihn im Dämonenturm.")
say_reward("Wenn du es geschafft hast bekommst du eine Belohnung!")
say_reward("")
say_reward("")
say("")
pc.setqf("state", 2)
q.set_counter("Sensenmann", 2)
set_state(kill)
end
end
state kill begin
when letter begin
send_letter("Die dunkle Bedrohung")
end
when info or button begin
say_title("Boss-Auftrag")
say("Du wurdest gebeten den Sensenmann")
say("zu töten. Um ihn endgültig")
say("zu besiegen musst du ihn 2x besiegen!")
say("Nur du kannst es schaffen,")
say("diesem Monster die Stirn zu bieten.")
say_reward("Töte 2x den Sensenmann.")
say_reward("Du findest ihn im Dämonenturm.")
say_reward("Wenn du es geschafft hast bekommst du eine Belohnung!")
say_reward("")
say_reward("")
say("")
end
when kill begin
if npc.get_race()== 1093 then
local count = pc.getqf("state") - 1
if count <= 2 then
pc.setqf("state", count)
q.set_counter("Anzahl Sensenmann", count)
end
if count == 0 then
say_title("Die dunkle Bedrohung")
say("Du hast dein Dorf von dem Unheil befreit!")
say("Du hast dir deine Belohnung verdient:")
say_reward("Du erhälst 4x Weiße Perle")
say_reward("Du erhälst 3x Blaue Perle")
say_reward("Du erhälst 2x Blutrote Perle")
pc.give_item2(27992, 4)
pc.give_item2(27993, 3)
pc.give_item2(27994, 2)
pc.get_money(2500000)
clear_letter()
set_state(__COMPLETE__)
end
end
end
end
state __COMPLETE__ begin
end
end
Würde gerne immernoch wissen, was an meiner Quest nicht stimmt.
Er zählt einfach die Kills nicht, also ich kann 200 Sensis killen ohne die Quest zu beenden..
Tymberks Frage wurde auch noch nicht geklärt (wir arbeiten am gleichen Server)
|
|
|
01/27/2015, 19:30
|
#10903
|
elite*gold: 0
Join Date: Nov 2011
Posts: 1,448
Received Thanks: 1,257
|
Quote:
Originally Posted by [Sensenmann]
Habe in den großen Weiten des Internets folgende LUA Funktion gefunden:
und versuche gerade verzweifelt diese per Quest aufzurufen ... :
Klappt allerdings nicht (das Questfenster geht auf aber da, wo der Text stehen müsste kommt nichts weiter ...
Habe es dann nochmal so versucht:
PHP Code:
if SecondsToClock(11527) == "3 Stunden 12 Minuten und 7 Sekunden" then
say("Jo isses")
else
say("nope")
end
Kommt das gleiche ...
|
Bei dieser Funktion sollte es funktionieren:
Code:
function SecondsToClock(int)
if tonumber(int) then
nHours = math.floor((int) / 60 / 60)
nMins = math.floor(((int) / 60 ) - nHours * 60)
nSecs = math.floor((int) - nHours * 60 * 60 - nMins * 60)
return nHours.." Stunden "..nMins.." Minuten und "..nSecs.." Sekunden"
else
return "00:00:00"
end
end
Quote:
Originally Posted by DarkCry96
Würde gerne immernoch wissen, was an meiner Quest nicht stimmt.
Er zählt einfach die Kills nicht, also ich kann 200 Sensis killen ohne die Quest zu beenden..
Tymberks Frage wurde auch noch nicht geklärt (wir arbeiten am gleichen Server)
|
Schau in anderen Quests mal ob dort irgendwo 1093.kill steht. Das könnte den Fehler auslösen. Das musst du in kill with npc.get_race()==1093 umschreiben.
Ich tippe mal auf die Dämonenturmquest^^
|
|
|
01/27/2015, 20:22
|
#10904
|
elite*gold: 83
Join Date: Nov 2013
Posts: 2,891
Received Thanks: 2,764
|
Funktioniert!
Danke^^
EDIT:
Wollte das noch etwas erweitern ... du kannst das bestimmt noch viel einfacher lösen aber bei mir klappts überhaupt nicht :x
PHP Code:
function SecondsToClock(int) if tonumber(int) then nHours = math.floor((int) / 60 / 60) nMins = math.floor(((int) / 60 ) - nHours * 60) nSecs = math.floor((int) - nHours * 60 * 60 - nMins * 60) if nHours > 1 then local txt_Hours = nHours.." Stunden " elseif nHours == 1 then local txt_Hours = nHours.." Stunde " elseif nHours == 0 then local txt_Hours = "" end if nMins > 1 then local txt_Mins = nMins.." Minuten " elseif nMins == 1 then local txt_Mins = nMins.." Minute " elseif nMins == 0 then local txt_Mins = "" end if nSecs > 1 then local txt_Secs = nSecs.." Sekunden " elseif nSecs == 1 then local txt_Secs = nSecs.." Sekunde " elseif nSecs == 0 then local txt_Secs = "" end return txt_Hours..txt_Mins..txt_Secs else return "00:00:00" end end
|
|
|
01/27/2015, 22:02
|
#10905
|
elite*gold: 12
Join Date: Jun 2012
Posts: 978
Received Thanks: 860
|
Quote:
Originally Posted by [Sensenmann]
[..]
|
Code:
function SecondsToClock(int)
if tonumber(int) then
nHours = math.floor((int) / 60 / 60)
nMins = math.floor(((int) / 60 ) - nHours * 60)
nSecs = math.floor((int) - nHours * 60 * 60 - nMins * 60)
return (nHours > 0 and (nHours..({" Stunde ","Stunden "})[nHours == 1 and 1 or 2]) or "")..(nMins > 0 and (nMins..({" Minute "," Minuten "})[nMins == 1 and 1 or 2]) or "")..(nSecs > 0 and (nSecs..({" Sekunde"," Sekunden"})[nSecs == 1 and 1 or 2]) or "")
else
return "00:00:00"
end
end
|
|
|
All times are GMT +1. The time now is 03:32.
|
|