[quest]partyquests; when party_kill

11/17/2014 19:56 Dyshaxo#1
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:

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 Lefloyd#2
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 Dyshaxo#3
Quote:
Originally Posted by Lefloyd View Post
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:
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 :D
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 Benhero#4
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 Lefloyd#5
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 Dyshaxo#6
Quote:
Originally Posted by Lefloyd View Post
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 :)