elitepvpers

elitepvpers (https://www.elitepvpers.com/forum/)
-   Metin2 Private Server (https://www.elitepvpers.com/forum/metin2-private-server/)
-   -   Vnum.kill - quests überlagern sich - keine drops (https://www.elitepvpers.com/forum/metin2-private-server/3725138-vnum-kill-quests-berlagern-sich-keine-drops.html)

.Philipp 05/23/2015 11:11

Vnum.kill - quests überlagern sich - keine drops
 
Hey,
der Post war schon in der Questkontrolle, allerdings war er dort im Nachhinein von mir falsch positioniert, weil es nicht um die Quest an sich geht, sondern um die Interaktion mehrerer Quests (vermutlich). Ich benutze die Daroo 2011er Serverfiles, falls es jemanden interessiert.

Entweder macht euch die Mühe und lest und antwortet dann oder lasst es ganz. Halbherzige Antworten, die nicht mal auf das Kernproblem gerichtet sind, brauch ich nicht :)

Als ich die Dropps anpassen wollte und in die mob_drop_item.txt geschaut habe, kam mir das schon zeimlich verwirrend vor und selbst als ich bei Drops 100% angegeben habe, kamen die nicht durchgängig. Habe dann alle Drops aus den Dateien entfernt und habe mich dran gesetzt, alle Drops per Quest zu veranlassen (siehe Spoiler). Die Quests funktioniert weitestgehend perfekt (muss nicht auf Programmierfehler untersucht werden, sollte alles zumindest funktionell passen)
Spoiler:
PHP Code:

quest drop begin

    state start begin
        

                
        when login 
or levelup begin
            pc
.setqf("lvl",pc.get_level())
            
pc.setqf("job",pc.get_job())
            
            
pc.setqf("normal",1)        -- Drops aus (0) / an (1)
            
pc.setqf("alternativ",1)
        
        
end
        
        when kill with not npc
.is_pc() begin
                
            local input_normal 
={                                                                        -- Normaldrop-Liste
            
            
--   1Mob2Item3: %,  4Anzahl5Dropart*, 6Mindestlevel7Maxlevel
            
-- *(1Drop mit Name2Drop ins Inventar)
            
            {
8001,30100,100,1,1,1,20},      --    5    er Metin
            
{8002,30100,100,1,1,1,25},      --    10    er Metin
            
{8003,30100,100,1,1,1,30},      --    15    er Metin
            
{8004,30100,100,1,1,1,35},      --    20    er Metin
            
{8005,30100,100,1,1,1,40},      --    25    er Metin
            
{8006,30100,100,1,1,1,45},      --    30    er Metin
            
{8007,30100,100,1,1,1,50},      --    35    er Metin
            
{8008,30100,100,1,1,1,55},      --    40    er Metin
            
{8009,30100,100,1,1,1,60},      --    45    er Metin
            
{8010,30100,100,1,1,1,65},      --    50    er Metin
            
{8011,30100,100,1,1,1,70},      --    55    er Metin
            
{8012,30100,100,1,1,1,75},      --    60    er Metin
            
{8013,30100,100,1,1,1,80},      --    65    er Metin
            
{8014,30100,100,1,1,1,85},      --    70    er Metin
            
{8024,30100,100,1,1,1,90},      --    75    er Metin
            
{8025,30100,100,1,1,1,95},      --    80    er Metin
            
{8026,30100,100,1,1,1,100},   --    85    er Metin
            
{8027,30100,100,1,1,1,105},      --    90    er Metin ///// verbuggt?! 8027
            
{1093,50082,100,1,1,1,99},
        }
        
        
            
local input_alternativ ={                                                                    -- Alternativdrops-Liste
            
            
--  1Item2: %, 3Anzahl4Dropart*, 5Mindestlevel6Maxlevel
            
-- *(1Drop mit Name2Drop ins Inventar)
            
            
        }
        
        
            if 
pc.getqf("normal") == 1 then                                                                -- normale Drops
            
                
for 1,(table.getn(input_normal)),do                                                    
                
                    if [
B]npc.get_race()[/B] == input_normal[i][1then                                                

                        
if (pc.getqf("lvl") >= input_normal[i][6] and pc.getqf("lvl") <= input_normal[i][7]) then
                        
                            local r 
number(1,100000)
                            
                            if 
<= (input_normal[i][3]*1000then
                            
                                
if input_normal[i][5] == 1 then
                                    game
.drop_item_with_ownership(input_normal[i][2], input_normal[i][4])
                                elseif 
input_normal[i][5] == 2 then
                                    pc
.give_item2(input_normal[i][2], input_normal[i][4])
                                
end
                            
                            end
                        end
                    end
                    
                end 
-- end for
            
            
end
            
            
            
if pc.getqf("alternativ") == 1 then                                                            -- alternative Drops
            
                
for 1,(table.getn(input_alternativ)),do                                                    
                
                                                                

                        if (
pc.getqf("lvl") >= input_alternativ[n][5] and pc.getqf("lvl") <= input_alternativ[n][6]) then
                        
                        local r 
number(1,100000)
                        
                        if 
<= (input_alternativ[n][2]*1000then
                            
                            
if input_alternativ[n][4] == 1 then
                                game
.drop_item_with_ownership(input_alternativ[n][1], input_alternativ[n][3])
                            elseif 
input_alternativ[n][4] == 2 then
                                pc
.give_item2(input_alternativ[n][1], input_alternativ[n][3])
                            
end
                            
                        end
                    end
                    
                    
                end 
-- end for
            
            
end
            
        end 
-- when kill
    
    end 
-- state drop
    
end 


Die Quest soll aktuell eben bei allen Metins ein bestimmtes Item droppen und beim Sensenmann die Sensenmanntruhe.
Bei Metin 5-85 geht das einwandfrei, der 90er wird aber einfach nicht erkannt (mit npc.get_race()). Mit dem Sensenmann ist mir dann das gleiche passiert. Nach Benutzen der Suchfunktion bin ich auf ähnliche Probleme gestoßen, dass dies durch mehrere Quest hervorgerufen wird, die alle den Kill eines Mobs abfragen (z. B.: [Only registered and activated users can see links. Click Here To Register...]). Dort wird allerdings vorgeschlagen, mit verschiedener Syntax vorzugehen (z. B. vnum.kill, kill with npc.get_race() oder when kill ... if npc.get_race==vnum then), was in meinem Fall allerdings auch nicht weitergeholfen hat. Hab dann zum Test mal die DT quest rausgenommen, in dem der Tod des Sensenmanns mit when 1093.kill with pc.in_dungeon() ... abgefragt wird, dann gings beim Sensenmann. Quest mit 90er Metins hab ich keine gefunden.

Zusammengefasst:
1. Liegt es nun also daran, dass mehrere Quests das selbe Event abfragen?
2. Kann man das theoretisch durch wechseln der Befehle/Bedingungen beheben? Wenn ja, wie?
3. Ist es generell ratsam, alle Drops durch eine Quest zu regeln? Der Server muss bei jdedem gekillten Mob die Quest starten.
4. Wie kann ich die Quest optimieren, um ressourcenschonender zu werden? (Bei erfolgreichem If kann return eingefügt werden beispielsweise, stand schon auf meiner To Do-Liste :D) Schickt mir bitte keine fertigen Quests, sondern erklärt oder macht Beispiele, will ja keine Quest sondern was dabei lernen.

Außerdem droppen Metins gelegentlich, trotz leerer mob_drop_item und leerer common_drop_item (in diesem Fall eher belanglos), immer noch Geiststeine. Woran liegt das und wie kann man das fixen?

Danke schon mal im Voraus!

€: die DT-Quest war ein Release von epvp für die Daroo files, weil diese buggy war. In der war auch der 90er Metin mit "8027.kill" enthalten, wenn ich diese entferne gehen beide. Liegt also an der Quest bzw. am doppelten Aufrufen.

rollback 05/23/2015 11:14

Code:

when kill with npc.get_race() == npcvnum begin
nutzen

.Philipp 05/23/2015 12:23

Werde ich testen, danke schon mal :)
Rein aus Interesse trotzdem:
Was ist für das Programm der Unterschied zwischen when kill with npc.get_race()==vnum begin und when kill begin ... If npc.get_race() then ... ?
Weil mir fällt auf die schnelle nicht ein, wie ich die Bedingung mit der vnum (with npc.get_race) in den Kopf hinters when bekomme, ohne die Grundidee der Quest (Eingabe der einzelnen Mobs + Drops) zu verändern :)

KΛIƬӨ 05/23/2015 12:36

Quote:

Originally Posted by .Philipp (Post 31964462)
Werde ich testen, danke schon mal :)
Rein aus Interesse trotzdem:
Was ist für das Programm der Unterschied zwischen when kill with npc.get_race()==vnum begin und when kill begin ... If npc.get_race() then ... ?
Weil mir fällt auf die schnelle nicht ein, wie ich die Bedingung mit der vnum (with npc.get_race) in den Kopf hinters when bekomme, ohne die Grundidee der Quest (Eingabe der einzelnen Mobs + Drops) zu verändern :)

ob du es mit nem if machst oder einfach an den when trigger zusammenmachst mit nem with kommt das dabei raus. nur könntest du wenn du es mit nem if machst noch irgendwas hinzufügen. beispiel :

Code:

if npc.get_race() == vnum then
        pc.setqf("test",pc.getqf("test")+1)
else
        say("falsches mob")
end


rollback 05/23/2015 13:03

Quote:

Originally Posted by DYSKaito (Post 31964597)
ob du es mit nem if machst oder einfach an den when trigger zusammenmachst mit nem with kommt das dabei raus.

es kommt nicht das gleiche bei raus, wenn man es mit in den trigger-block schreibt wird die quest garnicht erst getriggert, siehe when xxx.chat."Text" with ... begin

Da sieht man deutlich, wenn man die Bedingung nicht erfüllt erscheint die Auswahl garnicht erst. Wenn man es in einen extra if-block darunter schreibt sieht man vorher die Auswahl aber erst beim Anklicken gehts nicht weiter.

KΛIƬӨ 05/23/2015 13:09

Quote:

Originally Posted by usr.setVnum(1093) (Post 31964852)
es kommt nicht das gleiche bei raus, wenn man es mit in den trigger-block schreibt wird die quest garnicht erst getriggert, siehe when xxx.chat."Text" with ... begin

Da sieht man deutlich, wenn man die Bedingung nicht erfüllt erscheint die Auswahl garnicht erst. Wenn man es in einen extra if-block darunter schreibt sieht man vorher die Auswahl aber erst beim Anklicken gehts nicht weiter.

wenn man es in nem if einpackt wird bei jedem kill abgefragt ob es die vnum ist. und dann kommt das gleiche dabei aus.

rollback 05/23/2015 13:23

Quote:

Originally Posted by DYSKaito (Post 31964898)
wenn man es in nem if einpackt wird bei jedem kill abgefragt ob es die vnum ist. und dann kommt das gleiche dabei aus.

Das für den Spieler sichtbare Ergebnis ist in dem Fall zwar das gleiche, allerdings wird bei jedem Mobkill eine Abfrage gemacht, was natürlich nicht so schön ist.

.Philipp 05/23/2015 14:28

Wie kann es denn überhaupt sein, wenn es von der Funktionsweise her gleich ist, die beiden Quests sich im Weg stehen?
Sprich sobald ich beide Quests drin hab, drop ich mit meiner drop-Quest nichts mehr, weil der kill vom sensi (oder in meinem Fall auch von den 90er metins) schon in der dt-Quest abgefragt wird.
Kann man einen kill eines bestimmten mobs nur in einer einzigen Quest abfragen? Wär ja bisschen komisch.
Jedenfalls wenn ich die dt-Quest rausnehme, funktioniert die Drop-Quest für den sensi oder 90er-metin und ich droppe wie geplant, sonst nicht :/
Muss ich vielleicht beide in kill with npc.get_race()==vnum ändern? Aktuell eines 1093.kill und eines eben mit get_race...

rollback 05/23/2015 14:52

Du schreibst einfach anstatt:
Code:

when 1093.kill begin
immer
Code:

when kill with npc.get_race() == 1093 begin
oder wenn du schon einen with teil drin hast anstatt dem hier:
Code:

when 1093.kill with DEINE_EINSCHRAENKUNG == 0 begin
immer
Code:

when kill with DEINE_EINSCHRAENKUNG == 0 and npc.get_race() == 1093 begin

.Philipp 05/23/2015 15:40

Aaach gut, jetzt sind wir beim Punkt:

Zwischen 1093.kill und kill with npc.get_race besteht der Unterschied?

Und 1093.kill darf unter allen Quests nur einmal bestehen, sonst gehen die anderen nicht mehr?
Wenn ja, warum ist das so?


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

Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.