Register for your free account! | Forgot your password?

Go Back   elitepvpers > Popular Games > Metin2 > Metin2 Private Server
You last visited: Today at 03:03

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

Advertisement



[Quest]pet.summon() Problem

Discussion on [Quest]pet.summon() Problem within the Metin2 Private Server forum part of the Metin2 category.

Reply
 
Old   #1


 
Benhero's Avatar
 
elite*gold: 964
Join Date: Mar 2008
Posts: 2,629
Received Thanks: 1,636
[Quest]pet.summon() Problem

Hey

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:


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
Benhero is offline  
Old 11/17/2014, 02:47   #2

 
elite*gold: 1
Join Date: Apr 2014
Posts: 586
Received Thanks: 144
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
~> Thalion ッ <~ is offline  
Old 11/17/2014, 11:57   #3
 
elite*gold: 2
Join Date: Jun 2013
Posts: 1,063
Received Thanks: 1,725
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.
ProfessorEnte is offline  
Thanks
1 User
Old 11/17/2014, 12:37   #4
 
killa673's Avatar
 
elite*gold: 0
Join Date: Mar 2010
Posts: 296
Received Thanks: 86
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
killa673 is offline  
Old 11/17/2014, 13:13   #5


 
Benhero's Avatar
 
elite*gold: 964
Join Date: Mar 2008
Posts: 2,629
Received Thanks: 1,636
@#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 ***.take begin" event. auch dieses weißt ein aktuelles Item zu.
Benhero is offline  
Old 11/17/2014, 13:59   #6
 
killa673's Avatar
 
elite*gold: 0
Join Date: Mar 2010
Posts: 296
Received Thanks: 86
kannst dafür doch pc.select_item() nehmen, also funktionieren würde es rein theoretisch.
killa673 is offline  
Old 11/17/2014, 14:22   #7

 
elite*gold: 0
Join Date: Mar 2013
Posts: 2,449
Received Thanks: 6,448
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.
Lord iRemix is offline  
Old 11/18/2014, 09:29   #8
 
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
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
Lefloyd is offline  
Old 11/18/2014, 15:14   #9
 
iYoshix3's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 1,264
Received Thanks: 2,019
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
iYoshix3 is offline  
Old 11/18/2014, 15:21   #10
 
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
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
Lefloyd is offline  
Old 11/18/2014, 15:34   #11
 
iYoshix3's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 1,264
Received Thanks: 2,019
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
iYoshix3 is offline  
Old 11/18/2014, 15:42   #12
 
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
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: (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
Lefloyd is offline  
Old 11/18/2014, 16:08   #13
 
iYoshix3's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 1,264
Received Thanks: 2,019
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: (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
iYoshix3 is offline  
Reply


Similar Threads Similar Threads
[Problem]Why i cant summon new pets?
03/06/2013 - EO PServer Hosting - 3 Replies
after finish adding new pets(Lama Mounts) i cant summon it using /awarditem 729435..after hatch it i cant summon it...why? Notes* I already use the SQL that provide with client side
[Problem]Pet summon & unsummon
02/28/2013 - Metin2 Private Server - 0 Replies
Hi i have a question. Do you know how to do it so as not resorted pet immediately after it recalled? A revered only by pressing the,, Cell,,? Sorry for Google Translator ;x when 53001.use or 53002.use or 53003.use or 53005.use or 53006.use or 53007.use or 53008.use or 53009.use begin if not PetSystem.IsActive() and item.select_cell(97) then local PetNumber = {=1,=2,=3,=4,=5,=6,=7,=8} local petIndex = PetNumber if horse.is_dead() then say_title("Informacja:")...
Hilfe Horse Summon Problem
11/05/2011 - Metin2 Private Server - 0 Replies
So ich habe mein Horse_System mal erweiter (; alles funktionier bloß bei der Summon quest aber finde das problem nicht wenn ich sie benutze stürtzt die Core ab >.< wo liegt der fehler bitte um hilfe quest lion_summon begin state start begin when 71121.use with horse.get_level()==22 begin if pc.getsp()>=200 then
metin2 quest summon animal mounts
07/23/2011 - Metin2 - 1 Replies
hi epvp , i have added to my server some new mounts but i am searching for a quest to summon them ... please your responses in english :D
No CP summon/ranged and longbow summon hack
07/15/2008 - General Gaming Discussion - 11 Replies
- no cp and nak (2 in 1): combine No CP summon and longbow summon hack - no ranged: like b4



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


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.