|
You last visited: Today at 03:03
Advertisement
[Quest]pet.summon() Problem
Discussion on [Quest]pet.summon() Problem within the Metin2 Private Server forum part of the Metin2 category.
11/16/2014, 22:22
|
#1
|
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
|
|
|
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
|
|
|
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.
|
|
|
11/17/2014, 12:37
|
#4
|
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
|
|
|
11/17/2014, 13:13
|
#5
|
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.
|
|
|
11/17/2014, 13:59
|
#6
|
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.
|
|
|
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.
|
|
|
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
|
|
|
11/18/2014, 15:14
|
#9
|
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
|
|
|
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
|
|
|
11/18/2014, 15:34
|
#11
|
elite*gold: 0
Join Date: Jun 2010
Posts: 1,264
Received Thanks: 2,019
|
Quote:
Originally Posted by Lefloyd
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
|
#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
|
|
|
11/18/2014, 16:08
|
#13
|
elite*gold: 0
Join Date: Jun 2010
Posts: 1,264
Received Thanks: 2,019
|
Quote:
Originally Posted by Lefloyd
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
|
|
|
|
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.
|
|