[Quest]pet.summon() Problem

11/16/2014 22:22 Benhero#1
Hey :D

Habe folgendes Problem.

Über die benutzung eines items.
PHP Code:
when 123.use begin 
kann ich den Befehl 'pet.summon()' benutzen.

Jedoch sobald ich es versuche die Funktion nach z.B. den Trigger
PHP Code:
when button or info begin 
aufzurufen wird kein Pet beschworen, es wird aber auch kein direkter fehler ausgegeben..

Jemand eine Ahnung woran es liegt?

Quote:
#Edit...
Fehler sollte wohl dieser hier sein:
[Only registered and activated users can see links. Click Here To Register...]

Gibt es irgendwie die möglichkeit ein "Fake Item" zu erstellen bzw. die variabelen zu erzeugen um auch über die anderen trigger ein pet zu beschwören?
Grüße Benhero
11/17/2014 02:47 ~> Thalion ッ <~#2
kannst ja mal hier rein schauen, vielleicht ist das drin was du brauchst, dass war meine pet system quest, für Ilosia damals.

Code:
quest pet_system begin
	state start begin
		when letter begin
			cmdchat("petguihideshow "..q.getcurrentquestindex())
		end
		function givebonus(x)
			local y,boni = {10,54,1},pet_system.bonusliste()
			table.foreach(boni[x],function(i,l)  cmdchat("HaustierBonus"..i.." "..l.."") affect.add_collect(y[i],l,60*60*24*365*60) end )
			cmdchat("HaustierLevel "..pc.getqf('petlevel').."")
			cmdchat("HaustierName "..pc.get_name().."")
			pc.setqf("petruf",1)
			pc.setqf("petguishow",1)
		end
		
		function bonusliste()
			return { 
				[1] = {20,10,500},
				[2] = {30,20,1000},
				[3] = {40,30,1500},
				[4] = {50,45,2000},
				[5] = {65,60,3000},
			}
		end
		
		function removebonus(x) 
			local y,boni = {10,54,1},pet_system.bonusliste() 
			table.foreach(boni[x],function(i,l) affect.remove_collect(y[i],l,60*60*24*365*60) end ) 
			pc.setqf("petruf",0) 
			cmdchat("HidePetGui") 
			pc.setqf("petguishow",0)
			cleartimer("bugcheck") 
		end
		
		function get_pet_info(itemVnum)
			pet_info_map = {
			--  [ITEM VNUM] MOB_VNUM, DEFAULT NAME, buff_idx, spawn_effect_idx
				[53002]     = { 34002, "'s Rentier", 1, "rentier"},
				[53003]     = { 34003, "'s Eisphönix", 1, "icephoenix"},
				[53004]     = { 34004, "'s Azrael", 1, "azrael"},
				[53005]     = { 34009, "'s Gold-Azrael", 1, "azrael"},
				[53010]     = { 34008, "'s Leonidas", 1, "leonidas"},
				[53011]     = { 34007, "'s Khan", 1, "khan"},
				[53012]     = { 34005, "'s Porkie", 1, "porky"},
				[53013]     = { 34006, "'s Rufus", 1, "rufus"},
				[53014]     = { 34011, "'s Knuud", 1},
				[53015]     = { 34012, "'s Bao Bao", 1, "baobao"},
				[53007]     = { 34010, "'s Bambi", 1, "rentier"},
				[53017]     = { 34016, "'s Jadephönix", 1},
				[53018]     = { 34013, "'s Henkerchen", 1},
				[53019]     = { 34014, "'s Gold-Henkerchen", 1},
				[53016]     = { 34015, "'s Boney", 1},
			}

			itemVnum = tonumber(itemVnum)

			return pet_info_map[itemVnum]
		end
		function get_spawn_effect_file(idx)
			effect_table = {
				[0] = nil,
				[1] = "d:\\\\ymir work\\\\effect\\\\etc\\\\appear_die\\\\monster_appear.mse",
			}
			return effect_table [idx]
		end
		when 53007.use or 53013.use or 53012.use or 53011.use or 53010.use or 53005.use or 53004.use or 53003.use or 53002.use or 53001.use or 53014.use or 53015.use or 53017.use or 53018.use or 53019.use or 53016.use begin
			local pet_info = pet_system.get_pet_info(item.vnum)

			if null != pet_info then

				local mobVnum = pet_info[1]
				local petName = pet_info[2]
				local spawn_effect_file_name = pet_system.get_spawn_effect_file(pet_info[3])

				if true == pet.is_summon(mobVnum) then
					if spawn_effect_file_name != nil then
						pet.spawn_effect (mobVnum, spawn_effect_file_name)
					end
					pet.unsummon(mobVnum)
					pet_system.removebonus(pc.getqf('petlevel')) 
					syschat("Dein Haustier wurde weggeschickt")
				else
					if pet.count_summoned() < 1 then
						pet.summon(mobVnum, petName, false)
						if pet_info[4] ~= nil then
						cmdchat(pet_info[4])
						end
						if pc.getqf('petlevel') == 0 then
						pc.setqf('petlevel',1)
						end
						syschat("Dein Haustier wurde gerufen.") 
						pet_system.givebonus(pc.getqf('petlevel')) 
						local expprocent1 = {20, 80, 160, 350, 400} 
						cmdchat("PetProcentExp "..(pc.getqf("exp")/expprocent1[pc.getqf("petlevel")]).."")                 
						cmdchat("ShowPetGui") 
						loop_timer("bugcheck", 0.2) 
					else
						syschat("Du hast bereits ein Haustier gerufen!")
					end
					if spawn_effect_file_name != nil then
						pet.spawn_effect(mobVnum, spawn_effect_file_name)
					end
				end -- if pet.is_summon
			end  -- if null != pet_info
		end -- when
		when kill with not npc.is_pc() begin 
			if pc.getqf("petlevel") == 5 then 
				return 
			end
			if pc.getqf("petruf")==1 then
			intervall = 10
			if pc.get_level() <= mob.get_level(npc.get_race())+ intervall then -- du darfst nur max 10 lvl über das monster sein
			pc.setqf("exp",pc.getqf("exp")+1)
					local exp2up = {2000, 8000, 16000, 35000, 40000} 
					local expprocent = {20, 80, 160, 350, 400} 
					cmdchat("PetProcentExp "..(pc.getqf("exp")/expprocent[pc.getqf("petlevel")]).."") 
					if pc.getqf("exp") == exp2up[pc.getqf("petlevel")] then 
						if pc.getqf("petlevel") == 4 then 
							say_title("Herzlichen Glückwunsch") 
							say("Dein Haustier erreicht Level "..(pc.getqf("petlevel")+1).."") 
							say_reward("Dies war das letzte Level!") 
						end 
						say_title("Herzlichen Glückwunsch") 
						say("Dein Haustier erreicht Level "..(pc.getqf("petlevel")+1).."") 
						say("Rufe dein Pet bitte erneut!") 
						pc.setqf("petlevel",pc.getqf("petlevel")+1) 
						pc.setqf("exp",0) 
						pet_system.removebonus(pc.getqf('petlevel')) 
					end 
				end -- if not...
			end -- if pc.get...
		end -- when
		
				-- Bugschutz 
		 
		when bugcheck.timer begin 
			if pc.is_dead() then 
				pet_system.removebonus(pc.getqf('petlevel')) 
			end
		end 
		 
		when login or logout or disconnect with pc.getqf("petruf") == 1 begin 
			pet_system.removebonus(pc.getqf('petlevel')) 
			chat("Dein Haustier ist nicht mitgekommen...") 
			chat("Rufe es erneut!")
		end
		when button or info begin
			if pc.getqf("petruf") == 1 and pc.getqf("petguishow") == 1 then
				cmdchat("HidePetGui")
				pc.setqf("petguishow",0)
				syschat("Dein Haustierfenster wurde geschlossen, du kannst es über den Button im Inventar erneut öffnen!")
			elseif pc.getqf("petruf") == 1 and pc.getqf("petguishow") == 0 then
				cmdchat("ShowPetGui")
				local expprocent1 = {20, 80, 160, 350, 400} 
				cmdchat("PetProcentExp "..(pc.getqf("exp")/expprocent1[pc.getqf("petlevel")]).."")  
				pc.setqf("petguishow",1)
				syschat("Dein Haustierfenster wurde geöffnet, du kannst es über den Button im Inventar wieder schließen!")
			elseif pc.getqf("petruf") == 0 then
				syschat("Du hast kein Haustier gerufen!")
			end
		end
			
	end -- state
end -- quest
11/17/2014 11:57 ProfessorEnte#3
Bloede Loesung: Koenntest den itemclick ja per client simulieren, indem du den slot wo das petitem sich aktuell befindet, benutzt.


Sag bescheid, fals du ne andere Loesung findest. Ich werd denke demnaechst aufs selbe Problem stoßen.
11/17/2014 12:37 killa673#4
Machs dir einfacher:

when when button or info begin
timer("usetimer", 1)
end
when usetimer.timer begin
rest der quest.

funktioniert auch wenn man nach dem login eine questflag
abfragen lassen will per input oder sonstigem, stört sich ja auch mit dem
login event, hiermit funktioniert es.

mfg, [SA]Tears
11/17/2014 13:13 Benhero#5
@#M2Back2Roots
Danke, so eine ähnliche Quest benutze ich auch, jedoch funktioniert es leider nicht.

@ProfessorEnte
Werde ich machen ^^ auch wenn ich vermute das es nur über eine DIF möglich sein wird indem man die Funtkion ausnopt. Das mit dem Itemclick ist ja an sich keine Schlechte Idee. Jedoch möchte ich, das dies aus Funtkioniert wenn man kein Item anklickt. Zumal ich Pets habe die Ohne Items ausgeliefert werden.

@killa673
Sehr unwahrscheinlich das es dannach Funktioniert. Da selbst wenn man einen Timer oder eine game- /questflag benutzt immernoch kein Item ausgewählt wird. Und es somit leider nicht möglich ist.

------------

Was mir aufgefallen ist, sobald man Windschuhe o.ä. Items trägt, bei dennen Zeit läuft funktioniert es einwandfrei. Ebenso wenn man vorher ein Pet per Item gerufen hat oder allgemein ein Item benutzt. Dazu zählen ebenso das
"when xxx.take begin" event. auch dieses weißt ein aktuelles Item zu.
11/17/2014 13:59 killa673#6
kannst dafür doch pc.select_item() nehmen, also funktionieren würde es rein theoretisch.
11/17/2014 14:22 Lord iRemix#7
Bisschen die Petfunktionen umschreiben, dass du in der CPetSystem::Summon direkt die Vnum statt der Item Instanz nimmst und eine zweite CPetActor::SetSummonItem Function einfügen, an die dann auch nur die Vnum übergeben wird.
Kann sein, dass noch ein paar andere Sachen geändert werden muss hab's nur grob überflogen.
11/18/2014 09:29 Lefloyd#8
Ja, das kann nicht nur sein, das ist auch so.^^ Das Petsystem überprüft ebenfalls, ob das Item vorhanden ist oder nicht und schickt ggf. das Pet wieder automatisch weg. Man müsste einiges umschreiben, damit es ohne Item funktioniert - mit Kenntnissen ist das kein Problem, ohne Kenntnisse macht man ziemlich sicher Fehler rein. Lösung gibt es dafür keine wirklich schöne, zumindest wenn du es komplett ohne Pet-Item machen möchtest. Ansonsten wie schon vorgeschlagen einfach bei ieiner Aktion im Client direkt das Item im Inventar suchen & ein ItemUse-Packet senden - das wäre eine einzig schöne Möglichkeit um ohne Sourceänderung ein Pet zu rufen ohne auf das Item zu klicken.^^

Kind Regards
11/18/2014 15:14 iYoshix3#9
Ich sehe dabei eigentlich garkeine Probleme.
Man müsste nur in der
DWORD CPetActor::Summon(...)
das item entfernen und bei der Unsummon bzw der Update funktion das
Code:
NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())
		|| ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner()
entfernen.

Das Item wird lediglich für den Bonus benötigt, in diesem Fall nun wird es dann 0 sein, was auch keine weiteren Fehler hervorbringt, sondern lediglich keinen Bonus hinzufügt (Da Itemvnum = 0).

Mfg,
Yoshix3
11/18/2014 15:21 Lefloyd#10
Yoshi, ich ziehe solche Lösungen nicht in Betracht, da sie schrecklich sind - mach 10 davon und du wirst nix mehr ändern können, da sofort etwas anderes mit Fehlern behaftet wird. Ich hasse unsauberes arbeiten und werde niemandem empfehlen, sowas zu tun. Lieber würde ich mir die Arbeit machen & ein Tutorial dazu schreiben, wie man das Item entfernt, als so eine Lösung aufzuzeigen. Ich möchte damit dich keineswegs angreifen - aber solche Lösungen sind einfach das unsauberste was man tun kann.. >.<

Naja, so far - Lefloyd.

Kind Regards
11/18/2014 15:34 iYoshix3#11
Quote:
Originally Posted by Lefloyd View Post
Yoshi, ich ziehe solche Lösungen nicht in Betracht, da sie schrecklich sind - mach 10 davon und du wirst nix mehr ändern können, da sofort etwas anderes mit Fehlern behaftet wird. Ich hasse unsauberes arbeiten und werde niemandem empfehlen, sowas zu tun. Lieber würde ich mir die Arbeit machen & ein Tutorial dazu schreiben, wie man das Item entfernt, als so eine Lösung aufzuzeigen. Ich möchte damit dich keineswegs angreifen - aber solche Lösungen sind einfach das unsauberste was man tun kann.. >.<

Naja, so far - Lefloyd.

Kind Regards
Das trifft vielleicht bei anderen Dingen zu, aber nicht bei diesem Pet System.
Wenn man es sich nur ein wenig genauer anschaut, sieht man, dass das Item Hauptsächlich zur vergabe des Bonuses genutzt wird (anhand der item_proto einträgen). Ist das Item gleich Null, so returned er die Funktionen ganz schlicht. Und mit unsauber hat das auch nichts im inferntesten zu tun, da man lediglich die Funktion des Items/Bonus entfernt.

Mfg,
Yoshix3
11/18/2014 15:42 Lefloyd#12
Es hat nichts mit unsauber zu tun, dass ich eine Abfrage in meinem Source habe wo eine Variable die nie gesetzt wird durch eine Liste durchrattern lasse und danach auf NULL überprüfe wobei ich bereits beim Coden weiß, dass 100% immer NULL rauskommt? xD Das kannst du mir nicht erzählen; wenn - dann nimmt man diese Abfrage raus und baut es korrekt aus, das wäre nicht unsauber. Ist natürlich auch etwas mehr Arbeit - und nein, es trifft nicht nur bei anderen Dingen zu; meiner Meinung nach sollte man bei 100% des Codes sauber arbeiten und nicht nur bei den wichtigen Dingen, da man sonst verdammt schnell den Überblick verliert. Ich weiß, dass es funktioniert, was du geschrieben hast, aber das heißt noch lange nicht, dass es eine schöne Lösung ist.
Hierfür habe ich einen schönen Blog für dich: [Only registered and activated users can see links. Click Here To Register...] (ich finde den Blogeintrag einfach extrem gut geschrieben und er passt exakt zu diesem Beispiel)
Wie gesagt, es ist kein Schlechtreden von mir o.ä., aber ich kann es einfach nicht sehen, so einen Code an Leute publiziert sehen zu bekommen, die ihn schlicht und einfach einbauen und damit die Qualität ihres Codes heruntersetzen.

Kind Regards
11/18/2014 16:08 iYoshix3#13
Quote:
Originally Posted by Lefloyd View Post
Es hat nichts mit unsauber zu tun, dass ich eine Abfrage in meinem Source habe wo eine Variable die nie gesetzt wird durch eine Liste durchrattern lasse und danach auf NULL überprüfe wobei ich bereits beim Coden weiß, dass 100% immer NULL rauskommt? xD Das kannst du mir nicht erzählen; wenn - dann nimmt man diese Abfrage raus und baut es korrekt aus, das wäre nicht unsauber. Ist natürlich auch etwas mehr Arbeit - und nein, es trifft nicht nur bei anderen Dingen zu; meiner Meinung nach sollte man bei 100% des Codes sauber arbeiten und nicht nur bei den wichtigen Dingen, da man sonst verdammt schnell den Überblick verliert. Ich weiß, dass es funktioniert, was du geschrieben hast, aber das heißt noch lange nicht, dass es eine schöne Lösung ist.
Hierfür habe ich einen schönen Blog für dich: [Only registered and activated users can see links. Click Here To Register...] (ich finde den Blogeintrag einfach extrem gut geschrieben und er passt exakt zu diesem Beispiel)
Wie gesagt, es ist kein Schlechtreden von mir o.ä., aber ich kann es einfach nicht sehen, so einen Code an Leute publiziert sehen zu bekommen, die ihn schlicht und einfach einbauen und damit die Qualität ihres Codes heruntersetzen.

Kind Regards
Natürlich hast du da Recht, dass es nicht das beste wäre den Restcode der Funktionen stehen zu lassen, allerdings weist du auch nicht ob derjenige seine Pets nicht auch durch Items rufbar machen will. Hierfür wäre die Funktion dann immernoch sehr nützlich im Bezug auf den Bonus der Items.
Außerdem wollte ich mit meinem Beitrag hier nur Tipps zur Lösung geben und hier keinen Quellcode oder sonstiges verbreiten, da dies hier stets noch untersagt wird.
Aber bevor er das mit Python und sonstigem gestückel löst, versuche ich wenigstens hier sinnvolle Lösungsvorschläge zu übergeben.

Sollte auch kein Angriff auf dich sein, aber ich bin mal hier raus, da diese Diskussion sowieso zu nichts führt.

Mfg,
Yoshix3