|
You last visited: Today at 01:29
Advertisement
[quest]partyquests; when party_kill
Discussion on [quest]partyquests; when party_kill within the Metin2 Private Server forum part of the Metin2 category.
11/17/2014, 19:56
|
#1
|
elite*gold: 0
Join Date: Sep 2009
Posts: 665
Received Thanks: 444
|
[quest]partyquests; when party_kill
Hello there,
Versuche grade 'ne Spambare allgemein-Quest zu machen, welche als Gruppe funktionieren soll, bei der die Gruppenspieler x Monster töten, und bei jedem Kill des bestimmten Monsters bekommt jeder Spieler der Gruppe: x - 1.
Aus alten Quests, die ich von vor Jahren bei der Questerstellung in Auftrag gab', hab' ich das when-event "when party_kill begin".
Leider musste ich eben feststellen, dass bei diesem Event nur der Partyleader die noch-zu-tötenden mobs gesenkt bekommt.
Quest:
PHP Code:
quest comission begin state start begin when 20352.chat. "CQ Lv.1 - Oger der Prärie" begin say_title("Oger der Prärie") say("") say("'Die Oger auf unserer Prärie wurden in") say("letzter Zeit sehr Zahlreich..") say("Sie würden es sicher nicht wagen, unsere") say("Stadt direkt anzugreifen, aber für die") say("Händler stellt die Prärie die einzige") say("Handelsroute dar. Es wäre mir recht, wenn") say("du sie in ihrer Zahl etwas einschränkst.'") wait() say_title("Informationen zum Auftrag:") say("") say_reward("Auftragsgeber: Marrec") say("") say_reward("Mission:") say_reward("Schlachte alleine oder in einer") say_reward("Gruppe 40 Oger ab.") say_reward("Belohnung: x Exp, y Gegenstand.") say("") say("Möchtest du den Auftrag annehmen?") local s = select("Auf geht's!", "Lass mich überlegen..") if s == 1 then pc.setqf("Ogerkill", 40) set_state(CQ1_kill) end end end state CQ1_kill begin when letter begin send_letter("Oger der Prärie") end when button or info begin say_title("Oger der Prärie") say("") say("Dämme die Zahl der Oger vor dem") say("Stadt-Tor ein!") say("") say_reward("Du musst noch ".. pc.getqf("Ogerkill") .." Oger töten!") end when 1601.party_kill begin pc.setqf("Ogerkill", pc.getqf("Ogerkill") -1) if pc.getqf("Ogerkill") <= 0 then set_state(CQ1complete) end end end state CQ1complete begin when enter begin say_title("Auftrag Abgeschlossen!") say("") say("Das sollte reichen. Es sind deutlich") say("weniger Oger zu sehen.") say("") say_reward("Ich sollte zum Commission Center") say_reward("zurückkehren.") end when 20352.chat. "Oger der Prärie - Abgeschlossen!" begin say_title("Oger der Prärie") say("") say("In ihrer Zahl eingeschränkt wirken") say("sie garnichtmehr so bedrohlich..") say("") say_reward("Belohnung:") say_reward("x Exp") say_reward("y Item") set_state(start) end end end
Dazu meine Frage:
ich wollte das ganze jetzt via party.setf("Variable", Zahl) regeln, aber hierbei öffnet sich ein Bug - wenn der Spieler die Gruppe verlässt ist party.getf automatisch auf 0.
Das ganze f u c k t mich schonwieder so dermaßen ab, die Dungeon- und Party-Befehle bieten 0 Oberfläche für ein Vorteilhaftes Zusammenspielen der Spieler, daher ->
Wie würdet ihr das ganze realisieren?
Das ganze soll möglichst mobil funktionieren - dass man ohne Party an der selben stelle weitermachen kann wie mit party, beim Gruppen-verlassen sollte sich nichts ändern, blablabla ...
|
|
|
11/17/2014, 20:25
|
#2
|
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
|
Du kannst es per normale QuestFlag machen & beim "kill"-Trigger abfragen ob man in der Party ist & falls ja: gebe allen Spielern in der Gruppe +1.
Beispiel:
Code:
when kill begin
local c = pc.getqf("kill") + 1
pc.setqf("kill", c)
if party.is_party() then
local vid = pc.get_vid()
local pids = {party.get_member_pids()}
for i = 1, table.getn(pids) do
if pc.select(pids[i]) != 0 then
local oc = pc.getf("MEIN_QUEST_NAME", "kill") + 1
pc.setf("MEIN_QUEST_NAME", "kill", oc)
end
end
pc.select(vid)
end
end
Alternativ im Source den "party"-Trigger umschreiben, aber das wäre die aufwendigere Variante
€dit: PS: Du musst bei der Selektierung von anderen PC's darauf achten, dass du "pc.setf" und nicht "pc.setqf" nimmst (und dabei eben deinen Questnamen angibst), da beim anderen Spieler die Quest gerade nicht aktiv ist.
Kind Regards
|
|
|
11/17/2014, 20:33
|
#3
|
elite*gold: 0
Join Date: Sep 2009
Posts: 665
Received Thanks: 444
|
Quote:
Originally Posted by Lefloyd
Du kannst es per normale QuestFlag machen & beim "kill"-Trigger abfragen ob man in der Party ist & falls ja: gebe allen Spielern in der Gruppe +1.
Beispiel:
Code:
when kill begin
local c = pc.getqf("kill") + 1
pc.setqf("kill", c)
if party.is_party() then
local vid = pc.get_vid()
local pids = {party.get_member_pids()}
for i = 1, table.getn(pids) do
if pc.select(pids[i]) != 0 then
local oc = pc.getf("MEIN_QUEST_NAME", "kill") + 1
pc.setf("MEIN_QUEST_NAME", "kill", oc)
end
end
pc.select(vid)
end
end
Alternativ im Source den "party"-Trigger umschreiben, aber das wäre die aufwendigere Variante
€dit: PS: Du musst bei der Selektierung von anderen PC's darauf achten, dass du "pc.setf" und nicht "pc.setqf" nimmst (und dabei eben deinen Questnamen angibst), da beim anderen Spieler die Quest gerade nicht aktiv ist.
Kind Regards
|
Jetzt hab' ich nur noch mehr Fragen
Was sind die Rückgabewerte von:
pc.get_vid()
party.get_member_pids()
pc.select()
? Also wofür genau sind die?
dann ->
Zu "getqf"/"getf"/"setqf"/"setf" hätte ich noch 'ne Frage:
Worin genau liegt der unterschied dabei?
die "setf/getf" scheinen je nach party/pc unabhängig voneinander zu sein,
während "setqf/getqf" egal ob mit party. oder pc. davor - auf den selben Wert zugreiffen.
___________________________
Ich bin jetzt soweit - dass kills für Partymember gezählt werden, mittels party.setqf() und pc.getqf() außerdem - man kann beim verlassen der Gruppe weitermachen, aber -> beim Joinen einer Gruppe wird pc.getqf() auf den niedrigsten vorhandenen Wert innerhalb der Gruppe bzw. auf den Wert des Gruppenleaders gesetzt (hab' beim experimentieren nicht genau aufgepasst), und ich könnte mir immernoch vorstellen, dass die Spieler sich 'nen Chara machen, den sie bis z.B. 5 kills runterkloppen, und dann immer mit einem Chara joinen, leaven, 4 oger töten, joinen, leaven, 3 oger töten, blablabla, um damit ihre Quests schneller zu haben.
|
|
|
11/17/2014, 20:47
|
#4
|
elite*gold: 964
Join Date: Mar 2008
Posts: 2,629
Received Thanks: 1,636
|
pc.get_vid() -> Virtuele Spieler ID ausgeben (z.B. "30042" Diese wird zufällig erstellt beim einlogen.)
party.get_member_pids() -> Viruele Spieler IDs der Gruppe. Dies dient damit man die Spieler einer Gruppe durchlaufen kann.
pc.select() -> damit kann man andere spieler auswählen und aktionen ausführen. z.B. das Spieler Teleportiert werden. Sie Items erhalten. Quest Flags zu setzen. Etc etc.
Grüße Benhero
|
|
|
11/17/2014, 20:47
|
#5
|
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
|
Ehhm, was genau ging bei der Quest die ich geschickt habe nicht? Kann schwer ein Problem lösen, wenn ich den Source dazu nicht habe (die Quest)^^
Zu deinen Fragen:
pc.get_vid: Gibt die "virtuelle ID" des Spielers aus, diese wird beim Einloggen generiert & beim Ausloggen "zerstört" -> ist einzigartig solang der Spieler online ist, daher auch quasi ein Zeiger auf den Spieler
party.get_memper_pids: gibt alle Spieler-IDs in der Gruppe zurück, das sind nicht die virtuellen IDs sondern die IDs, die auch in der player-Tabelle stehen
pc.select: selektiert eine "virtuelle ID" (so dass sich alle Befehle wie "pc.get_name()" etc. auf diesen Spieler auswirken)
-> Dabei merke ich, ich habe einen bzw. zwei Fehler in der Schnelle gemacht. Es muss folgendermaßen sein:
Code:
when kill begin
local c = pc.getqf("kill") + 1
pc.setqf("kill", c)
if party.is_party() then
local vid = pc.get_vid()
local pids = {party.get_member_pids()}
for i = 1, table.getn(pids) do
if pc.select_pid(pids[i]) != 0 then
if pc.get_vid() != vid then
local oc = pc.getf("MEIN_QUEST_NAME", "kill") + 1
pc.setf("MEIN_QUEST_NAME", "kill", oc)
end
end
end
pc.select(vid)
end
end
Da sonst a) die falsche "Art" von ID selektiert wird und b) der Spieler die Tötung doppelt gezählt bekommen würde.
Hierbei steht "pc.select_pid" für "selektiere ID" (das gleiche wie pc.select nur dass es die reale ID (von der player-Tabelle) und nicht die "virtuelle ID" selektiert).
€dit: Ach ja, der Unterschied zwischen pc.setqf bzw. pc.setf. Hierbei steht dieser Command quasi für "pc.set_quest_flag" bzw. "pc.set_flag" -> beim ersten wählt er automatisch die aktuell laufende Quest aus um die jeweilige Flag zu setzen & beim 2. kann man selbst die Quest angeben, für die er es setzen soll. Da bei anderen Spielern keine Quest gesetzt ist, würde pc.setqf fehlschlagen.
Kind Regards
|
|
|
11/17/2014, 20:53
|
#6
|
elite*gold: 0
Join Date: Sep 2009
Posts: 665
Received Thanks: 444
|
Quote:
Originally Posted by Lefloyd
Ehhm, was genau ging bei der Quest die ich geschickt habe nicht? Kann schwer ein Problem lösen, wenn ich den Source dazu nicht habe (die Quest)^^
Kind Regards
|
Ich bin mir fast sicher, dass deine Quest funktioniert, bloß will ich kein Script verwenden, welches ich selbst nicht verstehe :P
Jedenfalls - vielen dank für die Antworten, damit kann ich wirklich verdammt viel anfangen, und damit lassen sich viele meiner Ideen einfacher realisieren
|
|
|
All times are GMT +2. The time now is 01:29.
|
|