Yardım Ws Turnuvası Sorunu

Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

kayıturku

Üye
Üye
Mesaj
157
Çözümler
4
Beğeni
45
Puan
109
Ticaret Puanı
0
Merhaba Ws turnuvasını aktif ettiğim zaman karakterleri eşleştirip düelloyu başlatıyor ama 2 karakter arasındaki ws bittikten sonra turnuva mapındaki ve o chdeki tüm karakterleri oyundan atıyor forumlarda çözümünü bulamadım yardımcı olabilırseniz sevinirim.
pvp_manager.lua:
quest pvp_manager begin
    state start begin
        when 9006.chat."GM:PvP Turnuvasına Işınlan " with pc.is_gm() begin
            say("Haritaya gitmek istiyor musun?")
            say("")
            local a = select(locale.yes,locale.no)
            if a == 1 then
                pc.warp(568100,561400)
            end
        end
        when login begin
            local saat = os.date("%H")
            if tonumber(saat) == 25 then
                if game.get_event_flag("vs_ac") == 0 then
                    game.set_event_flag("pvp_minlevel",40)
                    game.set_event_flag("pvp_maxlevel",105)
                    game.set_event_flag("pvp_price_count", 25)
                    game.set_event_flag("pvp_price_vnum", 50011)
                    pvp_manager.open_registrations()
                    game.set_event_flag("vs_ac",1)
                    server_timer("vs_kayit",10*60)
                    notice_all("Turnuva Kayıtları 10 Dakika Sonra Kapanacak.")
                end
            else
                game.set_event_flag("vs_ac",0)
            end
        end
        when vs_kayit.server_timer begin
            pvp_manager.close_registrations()
            notice_all("Turnuva Ödülü "..game.get_event_flag("pvp_price_count").."x "..item_name(game.get_event_flag("pvp_price_vnum")).." (vnum: "..game.get_event_flag("pvp_price_vnum")..")")
        end
             
        when login with pc.get_map_index() == 28 and (pvp_attenders == nil or pvp_attenders[pvp_manager.get_my_attender_id()] == nil or (pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 1 and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 2)) begin
            if pvp_attenders == nil then
                pvp_manager.guard_check_position()
                timer("pvp_guard_1", 10)
                return
            end
            if pvp_attenders[pvp_manager.get_my_attender_id()] == nil then
                pvp_manager.guard_check_position()
                timer("pvp_guard_1", 10)
                return
            end
            if pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 1 and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 2 then
                pvp_manager.guard_check_position()
                timer("pvp_guard_1", 10)
            end
        end
        when pvp_guard_1.timer begin
            if pc.get_map_index() != 26 then
                return
            end
            pvp_manager.guard_check_position()
            timer("pvp_guard_2", 10)
        end
        when pvp_guard_2.timer begin
            if pc.get_map_index() != 26 then
                return
            end
            pvp_manager.guard_check_position()
            timer("pvp_guard_1", 10)
        end
        function guard_check_position()
            if pc.get_local_x() >= 84 and pc.get_local_y() >= 84 and pc.get_local_x() <= 116 and pc.get_local_y() <= 116 then --arena 1
                pvp_manager.guard_reset()
            end
            if pc.get_local_x() >= 84 and pc.get_local_y() >= 136 and pc.get_local_x() <= 116 and pc.get_local_y() <= 168 then --arena 2
                pvp_manager.guard_reset()
            end
            if pc.get_local_x() >= 136 and pc.get_local_y() >= 84 and pc.get_local_x() <= 168 and pc.get_local_y() <= 116 then --arena 3
                pvp_manager.guard_reset()
            end
            if pc.get_local_x() >= 136 and pc.get_local_y() >= 136 and pc.get_local_x() <= 168 and pc.get_local_y() <= 168 then --arena 4
                pvp_manager.guard_reset()
            end
        end
     
        function guard_reset()
            notice_in_map(""..pc.get_name().." Arenadan uzaklaştırıldı!")
            pc . remove_item ( "40002" , 200 )
            pc.warp(344000,502500)
        end
     
        when 9006.chat."PvP Turnuvasına Katıl " with game.get_event_flag("pvp") == 1 begin
            say_title("PvP Turnuvasına Katıl:")
                say("Ne yapmak istiyorsun?")
                local s = select("PvP Arenasına Işınlan " , "Kapat " )
                if s == 1 then
                pc.warp(568100,561400)
                else return
            end
        end
     
        when 20078.chat."Şehre Dön " with pc.get_map_index() == 28 begin
            say_title("Savaş Ustası: ")
            say("")
            say("Arenadan ayrılıp şehre dönmek istiyormusun?")
            say("")
            local s = select("Evet ", "Hayır ")
            if s == 1 then
                warp_to_village()
            end
        end
        when 20078.chat."Turnuva Bölgesini Temizle " with pc.get_map_index() == 28 and pc.is_gm() begin
            say_title("PvP Turnuvası : ")
            say("")
            say("Bölgeyi temizlemek istiyor musun?")
            say("")
            local temizle = select(locale.yes,locale.no)
            if temizle == 1 then
                warp_all_to_village(28,10)
            end
        end
        when 20078.chat."GM: PvP Turnuvası İptal Et " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") != 0 begin
            say_title("GM: PvP Turnuvası İptal Et:")
            say("PvP Turnuvası iptal etmek istiyormusun?")
            say("")
            local s = select("Evet ", "Hayır ")
            if s == 1 then
                game.set_event_flag("pvp", 0)
                pvp_attenders = nil
                notice_all("Turnuva sona ermiştir!")
                say_title("PvP Turnuvası iptal edildi!")
                say("PvP Turnuvası iptal edildi!")
                say("")
                if pvp_manager_callback != nil then
                    pvp_manager_callback()
                end
            end
        end

        when 20078.chat."GM: PvP Turnuvasını başlat " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil begin
            say_title("PvP Turnuvasını başlat:")
            say("Lütfen minimum level sınırını gir (Min: 15):")
            local str_min_level = input()
            say_title("PvP Turnuvasını başlat:")
            local min_level = tonumber(str_min_level)
            if min_level == nil then
                say("Numara girilmedi.")
                say("")
                return
            end
            if tonumber(str_min_level) < 15 then
                min_level = 15
            end
            say("Minimum level : "..tostring(min_level)..".")
            say("lütfen maksimum level sınırını gir:")
            local str_max_level = input()
            say_title("PvP Turnuvasını başlat:")
            local max_level = tonumber(str_max_level)
            if max_level == nil then
                say("Numara girilmedi.")
                say("")
                return
            end
            if tonumber(str_max_level) < min_level then
                say("Maks level min levelden yüksek olmalı.")
                say("")
                return
            end
         
            game.set_event_flag("pvp_minlevel", min_level)
            game.set_event_flag("pvp_maxlevel", max_level)
         
            say("Minimum Level: "..tostring(min_level).." olarak ayarlandı.")
            say("Maksimum Level: "..tostring(max_level).." olarak ayarlandı.")
            say("")
            local s = select("Başlat ", "İptal et ")
            if s == 2 then
                return
            end
         
            say_title("PvP Turnuvasını başlat:")
            say("")
            say("PvP Turnuvası başladı.")
            say("")
            say_reward("Level Limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel"))
            pvp_manager.open_registrations()
        end
        function open_registrations()
            game.set_event_flag("pvp", 1)
            attender_count = 0
            game.set_event_flag("pvp_tournament", get_global_time())
            pvp_attenders = nil
            pvp_attenders = { }
         
            arena = {
                        -- arena 1
                        {
                            { 113, 100 },
                            { 88, 100 },
                            0,
                            "SLEEPING",
                            0,
                        },
                        -- arena 2
                        {
                            { 113, 152 },
                            { 88, 152 },
                            0,
                            "SLEEPING",
                            0,
                        },
                        -- arena 3
                        {
                            { 140, 152 },
                            { 164, 152 },
                            0,
                            "SLEEPING",
                            0,
                        },
                        -- arena 4
                        {
                            { 164, 100 },
                            { 140, 100 },
                            0,
                            "SLEEPING",
                            0,
                        },
                    }
         
            notice_all("PvP Turnuvası başlamıştır.")
            notice_all("Girişler için "..mob_name(9006).."'e gidin.")
            notice_all("Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
        end
        when 20078.chat."Turnuvaya Katıl " with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 1 begin
            say_title(mob_name(20078)..":")
            if game.get_event_flag("pvp_tournament") == pc.getqf("pvp_tournament") then
                say("Turnuvaya zaten kayıt yaptırdın.")
                say("")
                return
            end
            if pc.get_level() < 15 then
                say("Levelin çok düşük.")
                say("")
                return
            end
            if pc.get_level() < game.get_event_flag("pvp_minlevel") or pc.get_level() > game.get_event_flag("pvp_maxlevel") then
                say("Levelin  "..game.get_event_flag("pvp_minlevel").." ile "..game.get_event_flag("pvp_maxlevel").." arasında olması gerekli.")
                say("")
                return
            end
            say("Budokana hoşgeldin. Turnuvada senin gibi ")
            say("oyuncularla savaşacaksın.")
            say("")
            say("Karşına çıkan her oyuncuyu öldür.")
            say("")
            say("Bu turnuvaya katılmak istiyormusun?")
            say("")
            say_reward("Kayıt Ücreti : 15.000.000 Yang ")
            say("")
            local s = select("Evet, katılmak istiyorum ", "Hayır, ben bir korkağım ")
            say_title(mob_name(20078)..":")
            if s == 1 then
                if pc.get_gold() < 15000000 then
                    say_title("PvP Turnuvası ")
                    say("")
                    say(15000000-pc.get_gold().." yang eksiğin var.")
                    say("Paranı tamamlayınca turnuvaya girebilirsin.")
                    return
                end
                say("Turnuva başladığı zaman seni çağıracağım.")
                say("")
                say("İyi şanslar evlat!")
                say("")
             
                pvp_attenders[attender_count+1] = {name = pc.getname(), level = pc.get_level(), partner = nil, winner = true, fight_mode = 0, arena = 0}
                pc.setqf("attender_id", attender_count+1)
                pc.setqf("pvp_tournament", game.get_event_flag("pvp_tournament"))
                attender_count = attender_count + 1
                pc.change_gold(-15000000)
             
                if achievement_manager != nil then
                    achievement_manager.on_participatepvpevent()
                end
             
            elseif s == 2 then
                say("Çok zayıf gözüküyorsun evlat ")
                say("diğer oyunculara karşı hiç şansın olamaz.")
                say("")
            end
        end
        when 20078.chat." PvP Turnuvası için yapılmış kayıtlar " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") == 1 begin
            say_title(" PvP Turnuvası ")
            say("Şuana kadar "..tostring(attender_count).." oyuncu kayıt oldu.")
            if ae_pvp_tournament != nil then
                say("")
                return
            end
            say(" Kayıtları kapamak istiyormusun? ")
            say("")
            local s = select("Kayıtları kapat ", "Kayıt olmaya devam etsinler ")
            if s == 1 then
                say_title("Kayıtları Kapat:")
                say("Kayıtlar kapandı.")
                say("")
                pvp_manager.close_registrations()
            end
        end
     
        function close_registrations()
            if attender_count == 0 then
                notice_all("Girişler kapandı , kayıt yaptıramazsın.")
                game.set_event_flag("pvp", 0)
                pvp_attenders = nil
                if pvp_manager_callback != nil then
                    pvp_manager_callback()
                end
                return
            end
            game.set_event_flag("pvp", 2)
            pvp_manager.make_duel_list()
            duel_list_index = 0
            playerless_mode = false
            notice_all("PvP Turnuvası başlıyor!")
            pvp_manager.refresh_arenas()
        end
     
        when 20078.chat."Şimdi kiminle düello yapacağım?" with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 2 and game.get_event_flag("pvp_tournament") == pc.getqf("pvp_tournament") begin
            say_title(mob_name(20078)..":")
            if pvp_manager.get_duel_partner() == nil then
                say("Şuanda sana uygun aday yok.")
                say("")
                say("Eğer sana uygun aday bulamazsak bir sonraki ")
                say("rounda geçeceksin.")
                return
            end
            say("Düello yapacağın kişi:")
            say("")
            say_reward(""..pvp_manager.get_duel_partner().."")
        end
     

        function make_duel_list()
            duel_list = { }
            local i = 0
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].partner == nil and pvp_attenders[ai].winner == true then
                    local partner_id = pvp_manager.findpartner(tostring(pvp_attenders[ai].name), pvp_attenders[ai].level)
                    if partner_id != nil then
                        pvp_attenders[ai].partner = tostring(pvp_attenders[partner_id].name)
                        pvp_attenders[partner_id].partner = tostring(pvp_attenders[ai].name)
                        duel_list[i] = {fighter_id1 = ai, fighter_id2 = partner_id}
                        i = i + 1
                    end
                end
            end
         
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].partner == nil and pvp_attenders[ai].winner == true then
                    local partner_id = pvp_manager.findpartner_for_partnerless(tostring(pvp_attenders[ai].name), pvp_attenders[ai].level)
                    if partner_id != nil then
                        pvp_attenders[ai].partner = tostring(pvp_attenders[partner_id].name)
                        pvp_attenders[partner_id].partner = tostring(pvp_attenders[ai].name)
                        duel_list[i] = {fighter_id1 = ai, fighter_id2 = partner_id}
                        i = i + 1
                    end
                end
            end
        end
     
     
        function findpartner(name, level)
            local closest_level = nil
            local partner_id = nil
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true and tonumber(pvp_attenders[ai].level) <= level + 30 and tonumber(pvp_attenders[ai].level) >= level - 30 and tostring(pvp_attenders[ai].name) != name and pvp_attenders[ai].partner == nil and pvp_manager.is_player_in_map(tostring(pvp_attenders[ai].name)) == true then
                    if closest_level == nil then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(pvp_attenders[ai].level) == tonumber(level) then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) < tonumber(closest_level) and tonumber(pvp_attenders[ai].level) < tonumber(closest_level) then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) > tonumber(closest_level) and tonumber(pvp_attenders[ai].level) > tonumber(closest_level) then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    end
                end
            end
            return partner_id
        end
     
        function findpartner_for_partnerless(name, level)
            local closest_level = nil
            local partner_id = nil
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true and tostring(pvp_attenders[ai].name) != name and pvp_attenders[ai].partner == nil and pvp_manager.is_player_in_map(tostring(pvp_attenders[ai].name)) == true then
                    if closest_level == nil then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif pvp_attenders[ai].level == level then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) < tonumber(closest_level) and pvp_attenders[ai].level < closest_level then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) > tonumber(closest_level) and pvp_attenders[ai].level > closest_level then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    end
                end
            end
            return partner_id
        end
     
        function is_player_in_map(name)
            if pc.getname() == name then
                return true
            end
            local myname = pc.getname()
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            if pc.getname() == myname then
                pc.select(t)
                return false
            end
            pc.select(t)
            return true
        end
     
     
        when 20078.chat."GM: Arenayı Temizle" with pc.is_gm() and game.get_event_flag("pvp") == 2 begin
            for aArena = 1, 4, 1 do
                arena[aArena][3] = 0
                arena[aArena][4] = "SLEEPING"
            end
            pvp_manager.refresh_arenas()
        end
     
        -- not working
        --[[
        when 20078.chat."GM: Düelloyu bitir " with pc.is_gm() and game.get_event_flag("pvp") == 2 begin
            say_title("Düelloyu bitir:")
            say("Hangi arenadaki düelloyu bitireceksin?")
            local s = select("Arena 1", "Arena 2", "Arena 3", "Arena 4", "Kapat")
         
            if s == 5 then
                return
            end
         
            local fighter1 = nil
            local fighter2 = nil
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai].arena == s and pvp_attenders[ai].fight_mode != 0 then
                    if fighter1 == nil then
                        fighter1 = ai
                    else
                        fighter2 = ai
                    end
                end
            end
         
            if fighter1 == nil then
                say_title("Düelloyu bitir:")
                say("Bu arenada şuan düello yok.")
                say("")
                return
            end
         
            say_title(" Düelloyu bitir:")
            say("Düelloyu bitirirsen ")
            say(""..s..". Arenadaki düelloyu kim kazanacak?")
            local w = select(tostring(pvp_attenders[fighter1].name), tostring(pvp_attenders[fighter1].name), " Kapat ")
            if w == 3 then
                return
            end
         
            if w == 1 then
                pvp_attenders[fighter2].winner = false
                notice_in_map(tostring(pvp_attenders[fighter1].name).." , "..tostring(pvp_attenders[fighter2].name).." karşısındaki düelloyu kazandı!", pc.get_map_index())
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter1].name, 126, 40))
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter2].name, 126, 40))
            else
                pvp_attenders[fighter1].winner = false
                notice_in_map(tostring(pvp_attenders[fighter2].name).." , "..tostring(pvp_attenders[fighter1].name).." karşısındaki düelloyu kazandı!", pc.get_map_index())
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter1].name, 126, 40))
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter2].name, 126, 40))
            end
         
            pvp_attenders[fighter1].fight_mode = 0
            pvp_attenders[fighter2].fight_mode = 0
         
         
            arena[s][3] = 0
            pvp_manager.refresh_arenas()
         
            say_title(" Düelloyu bitir: ")
            say(" Düello bitti. ")
        end
        --]]
     
        when 20078.chat."GM: PvP Turnuva Ödülü " with pc.is_gm() begin
            say_title("Ödül:")
            say("Şuanki Ödül "..game.get_event_flag("pvp_price_count").."x "..item_name(game.get_event_flag("pvp_price_vnum")).." (vnum: "..game.get_event_flag("pvp_price_vnum")..")")
            say("")
            local s = select("Ödülü Değiştir " , "Kapat ")
            if s == 2 then
                return
            end
            say_title("Ödül:")
            say("Yeni ödülün kodunu gir:")
            say("")
            local vnum = input()
            say_title("Ödül:")
            say("Yeni ödülün adetini gir:")
            say("")
            local count = input()
            game.set_event_flag("pvp_price_count", count)
            game.set_event_flag("pvp_price_vnum", vnum)
            say_title("Ödül değiştirildi:")
            say("Ödül değiştirildi.")
            say("Yeni ödül : "..count.."x "..item_name(vnum).." (vnum: "..vnum..")")
        end
     
        function refresh_arenas()
            for aArena = 1, 4, 1 do
                if duel_list[duel_list_index] == nil then
                    if playerless_mode == true then
                        pvp_manager.init_next_round()
                    else
                        pvp_manager.fight_playerless()
                    end
                    return
                end
                if arena[aArena][3] == 0 then
                    arena[aArena][3] = 1
                    pvp_manager.fight_init(duel_list[duel_list_index].fighter_id1, duel_list[duel_list_index].fighter_id2, aArena)
                end
            end
        end
     

        function fight_init(pid1, pid2, arena_id)
            duel_list_index = duel_list_index + 1
            if pvp_manager.is_player_in_map(tostring(pvp_attenders[pid1].name)) == false then
                notice_in_map(""..tostring(pvp_attenders[pid1].name).." adlı oyuncu oyunda olmadığından diskalifiye edildi.", pc.get_map_index())
                pvp_attenders[pid1].winner = false
                pvp_attenders[pid2].partner = nil
                arena[arena_id][3] = 0
                pvp_manager.refresh_arenas()
                return
            end
            if pvp_manager.is_player_in_map(tostring(pvp_attenders[pid2].name)) == false then
                notice_in_map(""..tostring(pvp_attenders[pid2].name).." adlı oyuncu oyunda olmadığından diskalifiye edildi.", pc.get_map_index())
                pvp_attenders[pid2].winner = false
                pvp_attenders[pid1].partner = nil
                arena[arena_id][3] = 0
                pvp_manager.refresh_arenas()
                return
            end
         
            notice_in_map(tostring(pvp_attenders[pid1].name).." ve "..tostring(pvp_attenders[pid2].name).." 'nın düellosu birazdan başlayacak!", pc.get_map_index())
         
            --[[
            local f1_accept = ask_fight(tostring(pvp_attenders[pid1].name), tostring(pvp_attenders[pid2].name))
            if f1_accept != CONFIRM_OK then
                notice_in_map(" "..tostring(pvp_attenders[pid1].name).." has not took on the fight against "..tostring(pvp_attenders[pid2].name)..". ", pc.get_map_index())
                pvp_attenders[pid1] = nil
                pvp_attenders[pid2].partner = nil
                pvp_manager.refresh_arenas()
                return
            end
         
            local f2_accept = confirm(find_pc_by_name(tostring(pvp_attenders[pid2].name)), "Trittst du den Kampf gegen "..tostring(pvp_attenders[pid1].name).. " an?", 15)
            if f2_accept != CONFIRM_OK then
                notice_in_map(" "..tostring(pvp_attenders[pid2].name).." has not took on the fight against "..tostring(pvp_attenders[pid1].name)..". ", pc.get_map_index())
                pvp_attenders[pid2] = nil
                pvp_attenders[pid1].partner = nil
                pvp_manager.refresh_arenas()
                return
            end
            ]]
         
            pvp_attenders[pid1].fight_mode = 1
            pvp_attenders[pid2].fight_mode = 1
            pvp_attenders[pid1].arena = arena_id
            pvp_attenders[pid2].arena = arena_id
         
            pvp_manager.local_pc_warp(tostring(pvp_attenders[pid1].name), arena[arena_id][1][1], arena[arena_id][1][2])
            pvp_manager.local_pc_warp(tostring(pvp_attenders[pid2].name), arena[arena_id][2][1], arena[arena_id][2][2])

        end
     
        when login with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 1 begin
            affect.add(apply.MOV_SPEED, -10000, 2)
            affect.add_collect(apply.HP_REGEN, 5000, 30)
            affect.add_collect(apply.SP_REGEN, 5000, 30)
            pvp_manager.set_fight_mode(2)
            if arena[pvp_manager.get_arena()][3] == 2 then
                arena[pvp_manager.get_arena()][5] = 15
                loop_timer("fight_start_countdown", 1)
            else
                timer("partner_timeout", 40)
            end
            arena[pvp_manager.get_arena()][3] = 2
        end    
     
        when partner_timeout.timer begin
            if pvp_manager.is_player_in_map(pvp_manager.get_duel_partner()) == true or game.get_event_flag("pvp") != 2 or pvp_manager.get_fight_mode() != 2 then
                return
            end
            pvp_manager.set_fight_mode(3)
            if arena[pvp_manager.get_arena()][3] == 3 then
                return
            end
            arena[pvp_manager.get_arena()][3] = 3
            notice_in_map(pc.getname().." , "..pvp_manager.get_duel_partner().." karşısındaki düelloyu kaybetti!", pc.get_map_index())
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3
            pvp_attenders[pvp_manager.get_my_attender_id()].winner = true
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = false
            pc.warp_local(pc.get_map_index(), 12600, 4000)
        end

        when fight_start_countdown.timer begin
            if arena[pvp_manager.get_arena()][5] == -1 then
                return
            end
            local partner_vid = find_pc_by_name(pvp_manager.get_duel_partner())
            local my_vid = pc.get_vid()
            if arena[pvp_manager.get_arena()][5] == 0 then
                arena[pvp_manager.get_arena()][5] = -1
                pc.select(partner_vid)
                command("pvp "..my_vid)
                pc.select(my_vid)
                command("pvp "..partner_vid)
                notice_in_map(""..pc.getname().."  ile "..pvp_manager.get_duel_partner().."  arasındaki düello başladı!", pc.get_map_index())
                timer("fight_start_countdown_shutdown", 1)
            else
                pc.select(partner_vid)
                if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
                    syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
                    pc . remove_item ( "27003" , 20000000 )

                end
                affect.add(apply.MOV_SPEED, -10000, 2)
                pc.select(my_vid)
                if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
                    syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
                    pc . remove_item ( "27003" , 20000000 )

                end
                affect.add(apply.MOV_SPEED, -10000, 2)
                arena[pvp_manager.get_arena()][5] = arena[pvp_manager.get_arena()][5] - 1
            end
        end
     
        when fight_start_countdown_shutdown.timer begin
            cleartimer("fight_start_countdown")
        end
     
        when logout with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 28 and pvp_manager.get_fight_mode() == 2 begin
            pvp_manager.set_fight_mode(3)
            arena[pvp_manager.get_arena()][3] = 3
            notice_in_map(""..pvp_manager.get_duel_partner().." , "..pc.getname().." karşısındaki düelloyu kazandı!", pc.get_map_index())
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3
            pvp_attenders[pvp_manager.get_my_attender_id()].winner = false
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = true
         
            pc.warp_local(pc.get_map_index(), 12600, 4000)
            pvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), 126, 40)
        end
     
        when kill with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 28 and npc.is_pc() and pvp_manager.get_fight_mode() == 2 begin
            pvp_manager.set_fight_mode(3)
            if arena[pvp_manager.get_arena()][3] == 3 then
                return
            end
            arena[pvp_manager.get_arena()][3] = 3
            notice_in_map(""..pc.getname().." , "..pvp_manager.get_duel_partner().." karşısındaki düelloyu kazandı!", pc.get_map_index())
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3
            pvp_attenders[pvp_manager.get_my_attender_id()].winner = true
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = false
         
            timer("fight_end", 5)
        end
     
        when fight_end.timer begin
            pc.warp_local(pc.get_map_index(), 12600, 4000)
            pvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), 126, 40)
        end
     
        when letter with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 3 begin
            pvp_manager.set_fight_mode(0)
         
            if pvp_attenders[pvp_manager.get_my_attender_id()].winner == true then
                arena[pvp_manager.get_arena()][3] = 0
                pvp_manager.refresh_arenas()
            end
        end
     
        function fight_playerless()
            for aArena = 1, 4, 1 do
                if arena[aArena][3] != 0 then
                    return
                end
            end
            playerless_mode = true

         
            pvp_manager.make_duel_list()
            pvp_manager.refresh_arenas()
        end
     
        function init_next_round()
            for aArena = 1, 4, 1 do
                if arena[aArena][3] != 0 then
                    return
                end
            end
            playerless_mode = false
         
            local winner_count = 0
            --[[local]] winner_id = 0
            for ai = 1, attender_count, 1 do
                pvp_attenders[ai].partner = nil
                pvp_attenders[ai].fight_mode = 0
                if pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true then
                    winner_count = winner_count + 1
                    winner_id = ai
                end
            end
         
            if winner_count == 1 then
                notice_all(""..pvp_attenders[winner_id].name.." turnuvayı kazandı!")
                notice_all(""..pvp_attenders[winner_id].name.." ,"..game.get_event_flag("pvp_price_count").." tane "..item_name(game.get_event_flag("pvp_price_vnum")).." kazandı.")
                local target = find_pc_by_name(pvp_attenders[winner_id].name)
                local t = pc.select(target)
             
                if achievement_manager != nil then
                    achievement_manager.on_winpvpevent()
                end
             
                pc.give_item2(game.get_event_flag("pvp_price_vnum"), game.get_event_flag("pvp_price_count"))
                pc.select(t)
                notice_all("PvP Turnuvası bitti.")
                game.set_event_flag("pvp", 0)
                --pvp_attenders = nil
                if pvp_manager_callback != nil then
                    pvp_manager_callback()
                end
                return
            end
         
         
            pvp_manager.make_duel_list()
            duel_list_index = 0
            if winner_count == 2 then
                notice_all("Final roundu başlıyor.")
            elseif winner_count <= 4 then
                notice_all("Yarı final roundu başlıyor.")
            else
                notice_all("Round başlıyor.")
            end
            pvp_manager.refresh_arenas()
        end
     
        function local_pc_warp(name, x, y)
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            pc.warp_local(pc.get_map_index(), x*100, y*100)
            pc.select(t)
        end
     
        function setqf_by_name(name, flag, value)
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            pc.setqf(flag, value)
            pc.select(t)
        end
     
        function getqf_by_name(name, flag)
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            local rflag = pc.getqf(flag)
            pc.select(t)
            return rflag
        end
     
        function get_attender_id_by_name(name)
            for ai = 1, attender_count, 1 do
                if tostring(pvp_attenders[ai].name) == name then
                    return ai
                end
            end
            return 0
        end
     
        function get_my_attender_id()
            return pvp_manager.get_attender_id_by_name(pc.get_name())
        end
     
        function get_duel_partner()
            if pvp_attenders[pvp_manager.get_my_attender_id()] != nil and pvp_attenders[pvp_manager.get_my_attender_id()].partner != nil then
                return pvp_attenders[pvp_manager.get_my_attender_id()].partner
            else
                return nil
            end
        end
     
        function get_fight_mode()
            if pvp_attenders != nil and pvp_manager.get_my_attender_id() != 0 and pvp_attenders[pvp_manager.get_my_attender_id()] != nil and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != nil then
                return pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode
            else
                return 0
            end
        end
     
        function set_fight_mode(fmode)
            pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode = fmode
        end
     
        function get_arena()
            return pvp_attenders[pvp_manager.get_my_attender_id()].arena
        end
     
        function set_arena(id)
            pvp_attenders[pvp_manager.get_my_attender_id()].arena = id
        end
     
        function ask_fight(asker, target)
            return confirm(find_pc_by_name(target), "Trittst du den Kampf gegen "..asker.. " an?", 15)
        end
     
     
    end
end

syser:
SYSERR: Dec 21 13:56:59 :: Analyze: login phase does not handle this packet! header 66
SYSERR: Dec 21 13:57:00 :: Analyze: login phase does not handle this packet! header 66
SYSERR: Dec 21 13:58:07 :: pid_init:
Start of pid: 1194
 
En son bir moderatör tarafından düzenlenmiş:
Turnuva ödülünü vermeden mi atıyor mapden ?
Bu questi sizmi eklediniz, yoksa daha önceden varmıydı ?
 
Turnuva ödülünü vermeden mi atıyor mapden ?
Bu questi sizmi eklediniz, yoksa daha önceden varmıydı ?
Hayir daha ilk tur duellolari yapildiktan sonra elenen ve devam eden kişi oluyor arenadan disari isinlar isinlanamaz core veriyor. Hayir daha onceden vardi farkli quest ilede denedim yine ayni hata syserdan kaynakli oldugunu dusunuyorum
 
Core veriyorsa sorun çekirdekten kaynaklı olabilir. Core verdikten sonra gdb ile bakmanız gerekiyor
 
güncel pvp arenası:
quest pvp_manager begin
    state start begin
        when 9006.chat."GM:PvP Turnuvasına Işınlan " with pc.is_gm() begin
            say("Haritaya gitmek istiyor musun?")
            say("")
            local a = select(locale.yes,locale.no)
            if a == 1 then  
                pc.warp(6598300,6589800)
            end
        end
        when login begin
            local saat = os.date("%H")
            if tonumber(saat) == 25 then
                if game.get_event_flag("vs_ac") == 0 then
                    game.set_event_flag("pvp_minlevel",40)
                    game.set_event_flag("pvp_maxlevel",105)
                    game.set_event_flag("pvp_price_count", 25)
                    game.set_event_flag("pvp_price_vnum", 50011)
                    pvp_manager.open_registrations()
                    game.set_event_flag("vs_ac",1)
                    server_timer("vs_kayit",10*60)
                    notice_all("Turnuva Kayıtları 10 Dakika Sonra Kapanacak.")
                end
            else
                game.set_event_flag("vs_ac",0)
            end
        end
        when vs_kayit.server_timer begin
            pvp_manager.close_registrations()
            notice_all("Turnuva Ödülü "..game.get_event_flag("pvp_price_count").."x "..item_name(game.get_event_flag("pvp_price_vnum")).." (vnum: "..game.get_event_flag("pvp_price_vnum")..")")
        end
               
        when login with pc.get_map_index() == 500 and (pvp_attenders == nil or pvp_attenders[pvp_manager.get_my_attender_id()] == nil or (pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 1 and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 2)) begin
            if pvp_attenders == nil then
                pvp_manager.guard_check_position()
                timer("pvp_guard_1", 10)
                return
            end
            if pvp_attenders[pvp_manager.get_my_attender_id()] == nil then
                pvp_manager.guard_check_position()
                timer("pvp_guard_1", 10)
                return
            end
            if pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 1 and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 2 then
                pvp_manager.guard_check_position()
                timer("pvp_guard_1", 10)
            end
        end
        when pvp_guard_1.timer begin
            if pc.get_map_index() != 26 then
                return
            end
            pvp_manager.guard_check_position()
            timer("pvp_guard_2", 10)
        end
        when pvp_guard_2.timer begin
            if pc.get_map_index() != 26 then
                return
            end
            pvp_manager.guard_check_position()
            timer("pvp_guard_1", 10)
        end
        function guard_check_position()
            if pc.get_local_x() >= 84 and pc.get_local_y() >= 84 and pc.get_local_x() <= 116 and pc.get_local_y() <= 116 then --arena 1
                pvp_manager.guard_reset()
            end
            if pc.get_local_x() >= 84 and pc.get_local_y() >= 136 and pc.get_local_x() <= 116 and pc.get_local_y() <= 168 then --arena 2
                pvp_manager.guard_reset()
            end
            if pc.get_local_x() >= 136 and pc.get_local_y() >= 84 and pc.get_local_x() <= 168 and pc.get_local_y() <= 116 then --arena 3
                pvp_manager.guard_reset()
            end
            if pc.get_local_x() >= 136 and pc.get_local_y() >= 136 and pc.get_local_x() <= 168 and pc.get_local_y() <= 168 then --arena 4
                pvp_manager.guard_reset()
            end
        end
       
        function guard_reset()
            notice_in_map(""..pc.get_name().." Arenadan uzaklaştırıldı!")
            pc . remove_item ( "40002" , 200 )
            pc.warp(344000,502500)
        end
       
        when 9006.chat."PvP Turnuvasına Katıl " with game.get_event_flag("pvp") == 1 begin
            say_title("PvP Turnuvasına Katıl:")
                say("Ne yapmak istiyorsun?")
                local s = select("PvP Arenasına Işınlan " , "Kapat " )
                if s == 1 then
                pc.warp(6598400,6589800)
                else return
            end
        end
       
        when 20078.chat."Şehre Dön " with pc.get_map_index() == 500 begin
            say_title("Savaş Ustası: ")
            say("")
            say("Arenadan ayrılıp şehre dönmek istiyormusun?")
            say("")
            local s = select("Evet ", "Hayır ")
            if s == 1 then
                warp_to_village()
            end
        end
        when 20078.chat."Turnuva Bölgesini Temizle " with pc.get_map_index() == 500 and pc.is_gm() begin  
            say_title("PvP Turnuvası : ")
            say("")
            say("Bölgeyi temizlemek istiyor musun?")
            say("")
            local temizle = select(locale.yes,locale.no)
            if temizle == 1 then
                warp_all_to_village(500,10)
            end
        end
        when 20078.chat."GM: PvP Turnuvası İptal Et " with pc.get_map_index() == 500 and pc.is_gm() and game.get_event_flag("pvp") != 0 begin
            say_title("GM: PvP Turnuvası İptal Et:")
            say("PvP Turnuvası iptal etmek istiyormusun?")
            say("")
            local s = select("Evet ", "Hayır ")
            if s == 1 then
                game.set_event_flag("pvp", 0)
                pvp_attenders = nil
                notice_all("Turnuva sona ermiştir!")
                say_title("PvP Turnuvası iptal edildi!")
                say("PvP Turnuvası iptal edildi!")
                say("")
                if pvp_manager_callback != nil then
                    pvp_manager_callback()
                end
            end
        end

        when 20078.chat."GM: PvP Turnuvasını başlat " with pc.get_map_index() == 500 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil begin
            say_title("PvP Turnuvasını başlat:")
            say("Lütfen minimum level sınırını gir (Min: 15):")
            local str_min_level = input()
            say_title("PvP Turnuvasını başlat:")
            local min_level = tonumber(str_min_level)
            if min_level == nil then
                say("Numara girilmedi.")
                say("")
                return
            end
            if tonumber(str_min_level) < 15 then
                min_level = 15
            end
            say("Minimum level : "..tostring(min_level)..".")
            say("lütfen maksimum level sınırını gir:")
            local str_max_level = input()
            say_title("PvP Turnuvasını başlat:")
            local max_level = tonumber(str_max_level)
            if max_level == nil then
                say("Numara girilmedi.")
                say("")
                return
            end
            if tonumber(str_max_level) < min_level then
                say("Maks level min levelden yüksek olmalı.")
                say("")
                return
            end
           
            game.set_event_flag("pvp_minlevel", min_level)
            game.set_event_flag("pvp_maxlevel", max_level)
           
            say("Minimum Level: "..tostring(min_level).." olarak ayarlandı.")
            say("Maksimum Level: "..tostring(max_level).." olarak ayarlandı.")
            say("")
            local s = select("Başlat ", "İptal et ")
            if s == 2 then
                return
            end
           
            say_title("PvP Turnuvasını başlat:")
            say("")
            say("PvP Turnuvası başladı.")
            say("")
            say_reward("Level Limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel"))
            pvp_manager.open_registrations()
        end
        function open_registrations()
            game.set_event_flag("pvp", 1)
            attender_count = 0
            game.set_event_flag("pvp_tournament", get_global_time())
            pvp_attenders = nil
            pvp_attenders = { }
           
            arena = {
                        -- arena 1
                        {
                            { 113, 100 },
                            { 88, 100 },
                            0,
                            "SLEEPING",
                            0,
                        },
                        -- arena 2
                        {
                            { 113, 152 },
                            { 88, 152 },
                            0,
                            "SLEEPING",
                            0,
                        },
                        -- arena 3
                        {
                            { 140, 152 },
                            { 164, 152 },
                            0,
                            "SLEEPING",
                            0,
                        },
                        -- arena 4
                        {
                            { 164, 100 },
                            { 140, 100 },
                            0,
                            "SLEEPING",
                            0,
                        },
                    }
           
            notice_all("PvP Turnuvası başlamıştır.")
            notice_all("Girişler için "..mob_name(9006).."'e gidin.")
            notice_all("Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
        end
        when 20078.chat."Turnuvaya Katıl " with pc.get_map_index() == 500 and game.get_event_flag("pvp") == 1 begin
            say_title(mob_name(20078)..":")
            if game.get_event_flag("pvp_tournament") == pc.getqf("pvp_tournament") then
                say("Turnuvaya zaten kayıt yaptırdın.")
                say("")
                return
            end
            if pc.get_level() < 15 then
                say("Levelin çok düşük.")
                say("")
                return
            end
            if pc.get_level() < game.get_event_flag("pvp_minlevel") or pc.get_level() > game.get_event_flag("pvp_maxlevel") then
                say("Levelin  "..game.get_event_flag("pvp_minlevel").." ile "..game.get_event_flag("pvp_maxlevel").." arasında olması gerekli.")
                say("")
                return
            end
            say("Budokana hoşgeldin. Turnuvada senin gibi ")
            say("oyuncularla savaşacaksın.")
            say("")
            say("Karşına çıkan her oyuncuyu öldür.")
            say("")
            say("Bu turnuvaya katılmak istiyormusun?")
            say("")
            say_reward("Kayıt Ücreti : 15.000.000 Yang ")
            say("")
            local s = select("Evet, katılmak istiyorum ", "Hayır, ben bir korkağım ")
            say_title(mob_name(20078)..":")
            if s == 1 then
                if pc.get_gold() < 15000000 then  
                    say_title("PvP Turnuvası ")
                    say("")
                    say(15000000-pc.get_gold().." yang eksiğin var.")
                    say("Paranı tamamlayınca turnuvaya girebilirsin.")
                    return
                end
                say("Turnuva başladığı zaman seni çağıracağım.")
                say("")
                say("İyi şanslar evlat!")
                say("")
               
                pvp_attenders[attender_count+1] = {name = pc.getname(), level = pc.get_level(), partner = nil, winner = true, fight_mode = 0, arena = 0}
                pc.setqf("attender_id", attender_count+1)
                pc.setqf("pvp_tournament", game.get_event_flag("pvp_tournament"))
                attender_count = attender_count + 1
                pc.change_gold(-15000000)
               
                if achievement_manager != nil then
                    achievement_manager.on_participatepvpevent()
                end
               
            elseif s == 2 then
                say("Çok zayıf gözüküyorsun evlat ")
                say("diğer oyunculara karşı hiç şansın olamaz.")
                say("")
            end
        end
        when 20078.chat." PvP Turnuvası için yapılmış kayıtlar " with pc.get_map_index() == 500 and pc.is_gm() and game.get_event_flag("pvp") == 1 begin
            say_title(" PvP Turnuvası ")
            say("Şuana kadar "..tostring(attender_count).." oyuncu kayıt oldu.")
            if ae_pvp_tournament != nil then
                say("")
                return
            end
            say(" Kayıtları kapamak istiyormusun? ")
            say("")
            local s = select("Kayıtları kapat ", "Kayıt olmaya devam etsinler ")
            if s == 1 then
                say_title("Kayıtları Kapat:")
                say("Kayıtlar kapandı.")
                say("")
                pvp_manager.close_registrations()
            end
        end
       
        function close_registrations()
            if attender_count == 0 then
                notice_all("Girişler kapandı , kayıt yaptıramazsın.")
                game.set_event_flag("pvp", 0)
                pvp_attenders = nil
                if pvp_manager_callback != nil then
                    pvp_manager_callback()
                end
                return
            end
            game.set_event_flag("pvp", 2)
            pvp_manager.make_duel_list()
            duel_list_index = 0
            playerless_mode = false
            notice_all("PvP Turnuvası başlıyor!")
            pvp_manager.refresh_arenas()
        end
       
        when 20078.chat."Şimdi kiminle düello yapacağım?" with pc.get_map_index() == 500 and game.get_event_flag("pvp") == 2 and game.get_event_flag("pvp_tournament") == pc.getqf("pvp_tournament") begin
            say_title(mob_name(20078)..":")
            if pvp_manager.get_duel_partner() == nil then
                say("Şuanda sana uygun aday yok.")
                say("")
                say("Eğer sana uygun aday bulamazsak bir sonraki ")
                say("rounda geçeceksin.")
                return
            end
            say("Düello yapacağın kişi:")
            say("")
            say_reward(""..pvp_manager.get_duel_partner().."")
        end
       

        function make_duel_list()
            duel_list = { }
            local i = 0
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].partner == nil and pvp_attenders[ai].winner == true then
                    local partner_id = pvp_manager.findpartner(tostring(pvp_attenders[ai].name), pvp_attenders[ai].level)
                    if partner_id != nil then
                        pvp_attenders[ai].partner = tostring(pvp_attenders[partner_id].name)
                        pvp_attenders[partner_id].partner = tostring(pvp_attenders[ai].name)
                        duel_list[i] = {fighter_id1 = ai, fighter_id2 = partner_id}
                        i = i + 1
                    end
                end
            end
           
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].partner == nil and pvp_attenders[ai].winner == true then
                    local partner_id = pvp_manager.findpartner_for_partnerless(tostring(pvp_attenders[ai].name), pvp_attenders[ai].level)
                    if partner_id != nil then
                        pvp_attenders[ai].partner = tostring(pvp_attenders[partner_id].name)
                        pvp_attenders[partner_id].partner = tostring(pvp_attenders[ai].name)
                        duel_list[i] = {fighter_id1 = ai, fighter_id2 = partner_id}
                        i = i + 1
                    end
                end
            end
        end
       
       
        function findpartner(name, level)
            local closest_level = nil
            local partner_id = nil
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true and tonumber(pvp_attenders[ai].level) <= level + 30 and tonumber(pvp_attenders[ai].level) >= level - 30 and tostring(pvp_attenders[ai].name) != name and pvp_attenders[ai].partner == nil and pvp_manager.is_player_in_map(tostring(pvp_attenders[ai].name)) == true then
                    if closest_level == nil then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(pvp_attenders[ai].level) == tonumber(level) then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) < tonumber(closest_level) and tonumber(pvp_attenders[ai].level) < tonumber(closest_level) then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) > tonumber(closest_level) and tonumber(pvp_attenders[ai].level) > tonumber(closest_level) then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    end
                end
            end
            return partner_id
        end
       
        function findpartner_for_partnerless(name, level)
            local closest_level = nil
            local partner_id = nil
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true and tostring(pvp_attenders[ai].name) != name and pvp_attenders[ai].partner == nil and pvp_manager.is_player_in_map(tostring(pvp_attenders[ai].name)) == true then
                    if closest_level == nil then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif pvp_attenders[ai].level == level then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) < tonumber(closest_level) and pvp_attenders[ai].level < closest_level then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    elseif tonumber(level) > tonumber(closest_level) and pvp_attenders[ai].level > closest_level then
                        closest_level = pvp_attenders[ai].level
                        partner_id = ai
                    end
                end
            end
            return partner_id
        end
       
        function is_player_in_map(name)
            if pc.getname() == name then
                return true
            end
            local myname = pc.getname()
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            if pc.getname() == myname then
                pc.select(t)
                return false
            end
            pc.select(t)
            return true
        end
       
       
        when 20078.chat."GM: Arenayı Temizle" with pc.is_gm() and game.get_event_flag("pvp") == 2 begin
            for aArena = 1, 4, 1 do
                arena[aArena][3] = 0
                arena[aArena][4] = "SLEEPING"
            end
            pvp_manager.refresh_arenas()
        end
       
        -- not working
        --[[
        when 20078.chat."GM: Düelloyu bitir " with pc.is_gm() and game.get_event_flag("pvp") == 2 begin
            say_title("Düelloyu bitir:")
            say("Hangi arenadaki düelloyu bitireceksin?")
            local s = select("Arena 1", "Arena 2", "Arena 3", "Arena 4", "Kapat")
           
            if s == 5 then
                return
            end
           
            local fighter1 = nil
            local fighter2 = nil
            for ai = 1, attender_count, 1 do
                if pvp_attenders[ai].arena == s and pvp_attenders[ai].fight_mode != 0 then
                    if fighter1 == nil then
                        fighter1 = ai
                    else
                        fighter2 = ai
                    end
                end
            end
           
            if fighter1 == nil then
                say_title("Düelloyu bitir:")
                say("Bu arenada şuan düello yok.")
                say("")
                return
            end
           
            say_title(" Düelloyu bitir:")
            say("Düelloyu bitirirsen ")
            say(""..s..". Arenadaki düelloyu kim kazanacak?")
            local w = select(tostring(pvp_attenders[fighter1].name), tostring(pvp_attenders[fighter1].name), " Kapat ")
            if w == 3 then
                return
            end
           
            if w == 1 then
                pvp_attenders[fighter2].winner = false
                notice_in_map(tostring(pvp_attenders[fighter1].name).." , "..tostring(pvp_attenders[fighter2].name).." karşısındaki düelloyu kazandı!", pc.get_map_index())
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter1].name, 126, 40))
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter2].name, 126, 40))
            else
                pvp_attenders[fighter1].winner = false
                notice_in_map(tostring(pvp_attenders[fighter2].name).." , "..tostring(pvp_attenders[fighter1].name).." karşısındaki düelloyu kazandı!", pc.get_map_index())
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter1].name, 126, 40))
                pvp_manager.local_pc_warp(tostring(pvp_attenders[fighter2].name, 126, 40))
            end
           
            pvp_attenders[fighter1].fight_mode = 0
            pvp_attenders[fighter2].fight_mode = 0
           
           
            arena[s][3] = 0
            pvp_manager.refresh_arenas()
           
            say_title(" Düelloyu bitir: ")
            say(" Düello bitti. ")
        end
        --]]
       
        when 20078.chat."GM: PvP Turnuva Ödülü " with pc.is_gm() begin
            say_title("Ödül:")
            say("Şuanki Ödül "..game.get_event_flag("pvp_price_count").."x "..item_name(game.get_event_flag("pvp_price_vnum")).." (vnum: "..game.get_event_flag("pvp_price_vnum")..")")
            say("")
            local s = select("Ödülü Değiştir " , "Kapat ")
            if s == 2 then
                return
            end
            say_title("Ödül:")
            say("Yeni ödülün kodunu gir:")
            say("")
            local vnum = input()
            say_title("Ödül:")
            say("Yeni ödülün adetini gir:")
            say("")
            local count = input()
            game.set_event_flag("pvp_price_count", count)
            game.set_event_flag("pvp_price_vnum", vnum)
            say_title("Ödül değiştirildi:")
            say("Ödül değiştirildi.")
            say("Yeni ödül : "..count.."x "..item_name(vnum).." (vnum: "..vnum..")")
        end
       
        function refresh_arenas()
            for aArena = 1, 4, 1 do
                if duel_list[duel_list_index] == nil then
                    if playerless_mode == true then
                        pvp_manager.init_next_round()
                    else
                        pvp_manager.fight_playerless()
                    end
                    return
                end
                if arena[aArena][3] == 0 then
                    arena[aArena][3] = 1
                    pvp_manager.fight_init(duel_list[duel_list_index].fighter_id1, duel_list[duel_list_index].fighter_id2, aArena)
                end
            end
        end
       

        function fight_init(pid1, pid2, arena_id)
            duel_list_index = duel_list_index + 1
            if pvp_manager.is_player_in_map(tostring(pvp_attenders[pid1].name)) == false then
                notice_in_map(""..tostring(pvp_attenders[pid1].name).." adlı oyuncu oyunda olmadığından diskalifiye edildi.", pc.get_map_index())
                pvp_attenders[pid1].winner = false
                pvp_attenders[pid2].partner = nil
                arena[arena_id][3] = 0
                pvp_manager.refresh_arenas()
                return
            end
            if pvp_manager.is_player_in_map(tostring(pvp_attenders[pid2].name)) == false then
                notice_in_map(""..tostring(pvp_attenders[pid2].name).." adlı oyuncu oyunda olmadığından diskalifiye edildi.", pc.get_map_index())
                pvp_attenders[pid2].winner = false
                pvp_attenders[pid1].partner = nil
                arena[arena_id][3] = 0
                pvp_manager.refresh_arenas()
                return
            end
           
            notice_in_map(tostring(pvp_attenders[pid1].name).." ve "..tostring(pvp_attenders[pid2].name).." 'nın düellosu birazdan başlayacak!", pc.get_map_index())
           
            --[[
            local f1_accept = ask_fight(tostring(pvp_attenders[pid1].name), tostring(pvp_attenders[pid2].name))
            if f1_accept != CONFIRM_OK then
                notice_in_map(" "..tostring(pvp_attenders[pid1].name).." has not took on the fight against "..tostring(pvp_attenders[pid2].name)..". ", pc.get_map_index())
                pvp_attenders[pid1] = nil
                pvp_attenders[pid2].partner = nil
                pvp_manager.refresh_arenas()
                return
            end
           
            local f2_accept = confirm(find_pc_by_name(tostring(pvp_attenders[pid2].name)), "Trittst du den Kampf gegen "..tostring(pvp_attenders[pid1].name).. " an?", 15)
            if f2_accept != CONFIRM_OK then
                notice_in_map(" "..tostring(pvp_attenders[pid2].name).." has not took on the fight against "..tostring(pvp_attenders[pid1].name)..". ", pc.get_map_index())
                pvp_attenders[pid2] = nil
                pvp_attenders[pid1].partner = nil
                pvp_manager.refresh_arenas()
                return
            end
            ]]
           
            pvp_attenders[pid1].fight_mode = 1
            pvp_attenders[pid2].fight_mode = 1
            pvp_attenders[pid1].arena = arena_id
            pvp_attenders[pid2].arena = arena_id
           
            pvp_manager.local_pc_warp(tostring(pvp_attenders[pid1].name), arena[arena_id][1][1], arena[arena_id][1][2])
            pvp_manager.local_pc_warp(tostring(pvp_attenders[pid2].name), arena[arena_id][2][1], arena[arena_id][2][2])

        end
       
        when login with pc.get_map_index() == 500 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 1 begin
            affect.add(apply.MOV_SPEED, -10000, 2)
            affect.add_collect(apply.HP_REGEN, 5000, 30)
            affect.add_collect(apply.SP_REGEN, 5000, 30)
            pvp_manager.set_fight_mode(2)
            if arena[pvp_manager.get_arena()][3] == 2 then
                arena[pvp_manager.get_arena()][5] = 30
                loop_timer("fight_start_countdown", 1)
            else
                timer("partner_timeout", 40)
            end
            arena[pvp_manager.get_arena()][3] = 2
        end      
       
        when partner_timeout.timer begin
            if pvp_manager.is_player_in_map(pvp_manager.get_duel_partner()) == true or game.get_event_flag("pvp") != 2 or pvp_manager.get_fight_mode() != 2 then
                return
            end
            pvp_manager.set_fight_mode(3)
            if arena[pvp_manager.get_arena()][3] == 3 then
                return
            end
            arena[pvp_manager.get_arena()][3] = 3
            notice_in_map(pc.getname().." , "..pvp_manager.get_duel_partner().." karşısındaki düelloyu kaybetti!", pc.get_map_index())
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3
            pvp_attenders[pvp_manager.get_my_attender_id()].winner = true
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = false
            pc.warp_local(pc.get_map_index(), 12600, 4000)
        end

        when fight_start_countdown.timer begin
            if arena[pvp_manager.get_arena()][5] == -1 then
                return
            end
            local partner_vid = find_pc_by_name(pvp_manager.get_duel_partner())
            local my_vid = pc.get_vid()
            if arena[pvp_manager.get_arena()][5] == 0 then
                arena[pvp_manager.get_arena()][5] = -1
                pc.select(partner_vid)
                command("pvp "..my_vid)
                pc.select(my_vid)
                command("pvp "..partner_vid)
                notice_in_map(""..pc.getname().."  ile "..pvp_manager.get_duel_partner().."  arasındaki düello başladı!", pc.get_map_index())
                timer("fight_start_countdown_shutdown", 1)
            else
                pc.select(partner_vid)
                if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
                    syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
                    pc . remove_item ( "27003" , 20000000 )

                end
                affect.add(apply.MOV_SPEED, -10000, 2)
                pc.select(my_vid)
                if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
                    syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
                    pc . remove_item ( "27003" , 20000000 )

                end
                affect.add(apply.MOV_SPEED, -10000, 2)
                arena[pvp_manager.get_arena()][5] = arena[pvp_manager.get_arena()][5] - 1
            end
        end
       
        when fight_start_countdown_shutdown.timer begin
            cleartimer("fight_start_countdown")
        end
       
        when logout with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 500 and pvp_manager.get_fight_mode() == 2 begin
            pvp_manager.set_fight_mode(3)
            arena[pvp_manager.get_arena()][3] = 3
            notice_in_map(""..pvp_manager.get_duel_partner().." , "..pc.getname().." karşısındaki düelloyu kazandı!", pc.get_map_index())
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3
            pvp_attenders[pvp_manager.get_my_attender_id()].winner = false
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = true
           
            pvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), 126, 40)
        end
       
        when kill with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 500 and npc.is_pc() and pvp_manager.get_fight_mode() == 2 begin
            pvp_manager.set_fight_mode(3)
            if arena[pvp_manager.get_arena()][3] == 3 then
                return
            end
            arena[pvp_manager.get_arena()][3] = 3
            notice_in_map(""..pc.getname().." , "..pvp_manager.get_duel_partner().." karşısındaki düelloyu kazandı!", pc.get_map_index())
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3
            pvp_attenders[pvp_manager.get_my_attender_id()].winner = true
            pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = false
           
            timer("fight_end", 5)
        end
       
        when fight_end.timer begin
            pc.warp_local(pc.get_map_index(), 12600, 4000)
            pvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), 126, 40)
        end
       
        when letter with pc.get_map_index() == 500 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 3 begin
            pvp_manager.set_fight_mode(0)
           
            if pvp_attenders[pvp_manager.get_my_attender_id()].winner == true then
                arena[pvp_manager.get_arena()][3] = 0
                pvp_manager.refresh_arenas()
            end
        end
       
        function fight_playerless()
            for aArena = 1, 4, 1 do
                if arena[aArena][3] != 0 then
                    return
                end
            end
            playerless_mode = true

           
            pvp_manager.make_duel_list()
            pvp_manager.refresh_arenas()
        end
       
        function init_next_round()
            for aArena = 1, 4, 1 do
                if arena[aArena][3] != 0 then
                    return
                end
            end
            playerless_mode = false
           
            local winner_count = 0
            --[[local]] winner_id = 0
            for ai = 1, attender_count, 1 do
                pvp_attenders[ai].partner = nil
                pvp_attenders[ai].fight_mode = 0
                if pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true then
                    winner_count = winner_count + 1
                    winner_id = ai
                end
            end
           
            if winner_count == 1 then
                notice_all(""..pvp_attenders[winner_id].name.." turnuvayı kazandı!")
                notice_all(""..pvp_attenders[winner_id].name.." ,"..game.get_event_flag("pvp_price_count").." tane "..item_name(game.get_event_flag("pvp_price_vnum")).." kazandı.")
                local target = find_pc_by_name(pvp_attenders[winner_id].name)
                local t = pc.select(target)
               
                if achievement_manager != nil then
                    achievement_manager.on_winpvpevent()
                end
               
                pc.give_item2(game.get_event_flag("pvp_price_vnum"), game.get_event_flag("pvp_price_count"))
                pc.select(t)
                notice_all("PvP Turnuvası bitti.")
                game.set_event_flag("pvp", 0)
                --pvp_attenders = nil
                if pvp_manager_callback != nil then
                    pvp_manager_callback()
                end
                return
            end
           
           
            pvp_manager.make_duel_list()
            duel_list_index = 0
            if winner_count == 2 then
                notice_all("Final roundu başlıyor.")
            elseif winner_count <= 4 then
                notice_all("Yarı final roundu başlıyor.")
            else
                notice_all("Round başlıyor.")
            end
            pvp_manager.refresh_arenas()
        end
       
        function local_pc_warp(name, x, y)
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            pc.warp_local(pc.get_map_index(), x*100, y*100)
            pc.select(t)
        end
       
        function setqf_by_name(name, flag, value)
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            pc.setqf(flag, value)
            pc.select(t)
        end
       
        function getqf_by_name(name, flag)
            local target = find_pc_by_name(name)
            local t = pc.select(target)
            local rflag = pc.getqf(flag)
            pc.select(t)
            return rflag
        end
       
        function get_attender_id_by_name(name)
            for ai = 1, attender_count, 1 do
                if tostring(pvp_attenders[ai].name) == name then
                    return ai
                end
            end
            return 0
        end
       
        function get_my_attender_id()
            return pvp_manager.get_attender_id_by_name(pc.get_name())
        end
       
        function get_duel_partner()
            if pvp_attenders[pvp_manager.get_my_attender_id()] != nil and pvp_attenders[pvp_manager.get_my_attender_id()].partner != nil then
                return pvp_attenders[pvp_manager.get_my_attender_id()].partner
            else
                return nil
            end
        end
       
        function get_fight_mode()
            if pvp_attenders != nil and pvp_manager.get_my_attender_id() != 0 and pvp_attenders[pvp_manager.get_my_attender_id()] != nil and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != nil then
                return pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode
            else
                return 0
            end
        end
       
        function set_fight_mode(fmode)
            pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode = fmode
        end
       
        function get_arena()
            return pvp_attenders[pvp_manager.get_my_attender_id()].arena
        end
       
        function set_arena(id)
            pvp_attenders[pvp_manager.get_my_attender_id()].arena = id
        end
       
        function ask_fight(asker, target)
            return confirm(find_pc_by_name(target), "Trittst du den Kampf gegen "..asker.. " an?", 15)
        end
       
       
    end
end
Şunu kullanıp geri dönüş yaparmısınız kendim bizzat kullandım bir sorun yaşamadım
 
Core veriyorsa sorun çekirdekten kaynaklı olabilir. Core verdikten sonra gdb ile bakmanız gerekiyor
Gdb:
#0  CHARACTER::GetQuestFlag (this=0x0, flag=@0xbfbfa1fc) at char.cpp:8031
        pPC = <value optimized out>
        __FUNCTION__ = "GetQuestFlag"
#1  0x081c1f98 in pvp_check_disconnect (event=@0xbfbfa240, processing_time=25)
    at pvp.cpp:391
        betMoney = <value optimized out>
        buf = '\0' <repeats 21 times>, "▒▒▒▒", '\0' <repeats 12 times>, "ء▒▒\000\000\000\0002\000\000\000▒\001\000\000\\▒▒▒▒-\216(▒\001\000\000H▒▒▒L▒▒▒\000\000\000\000`▒▒_\000\000\000\000\020\016\000\000\024", '\0' <repeats 15 times>, "▒\036\001\000▒H\000\000\200\004▒\001\177\f\177\022\r\000\000\000@▒▒\a\000\000▒\a\000\000\224▒\221(H\035\223(\204\t\223(▒▒▒▒r0\216(\0004▒(\000\000\000\000\224▒\221(▒▒▒▒\r\000\000\000\002\000\000\000\224▒\221(\0004▒(\001\000\000\000▒▒▒▒▒N\216(\237\217\221(`▒▒_\033/\216(\001\000\000\000\000"...
        chA = 0x0
        chB = 0x0
        szTableStaticPvP = {0x84ea14f "pvp.BlockChangeItem",
  0x84ea163 "pvp.BlockBuff", 0x84ea171 "pvp.BlockPotion",
  0x84ea181 "pvp.BlockRide", 0x84ea18f "pvp.BlockPet",
  0x84ea19c "pvp.BlockPoly", 0x84ea1aa "pvp.BlockParty",
  0x84ea1b9 "pvp.BlockExchange", 0x84ea1cb "pvp.BetMoney",
  0x84ea1d8 "pvp.IsFight"}
#2  0x0813f2b1 in event_process (pulse=5077) at event.cpp:140
        pElem = <value optimized out>
---Type <return> to continue, or q <return> to quit---
Ustam gdb ile baktıgım zaman bu hatalar meydana cıktı
 
pvp.cpp kodlarını paylaşır mısınız? 391. satırda bir şeyler patlamış
 
pvp.cpp kodlarını paylaşır mısınız? 391. satırda bir şeyler patlamış
pvp.cpp:
#include "stdafx.h"
#include "constants.h"
#include "pvp.h"
#include "crc32.h"
#include "packet.h"
#include "desc.h"
#include "desc_manager.h"
#include "char.h"
#include "char_manager.h"
#include "config.h"
#include "sectree_manager.h"
#include "buffer_manager.h"
#ifdef TOURNAMENT_PVP_SYSTEM
    #include "tournament.h"
#endif
#if defined(WJ_COMBAT_ZONE) 
    #include "combat_zone.h"
#endif
#include "locale_service.h"

#ifdef ENABLE_PVP_ADVANCED
#ifdef ENABLE_GROWTH_PET_SYSTEM
    #include "New_PetSystem.h"
#endif
#ifdef ENABLE_SUPPORT_SYSTEM
    #include "SupportSystem.h"
#endif
    #include "PetSystem.h"
    #include "affect.h"
    #include "party.h"
    #include "guild.h"
    #include "skill.h"
#endif

using namespace std;

#ifdef ENABLE_PVP_ADVANCED

EVENTINFO(TPVPDuelEventInfo)
{
    DynamicCharacterPtr ch;
    DynamicCharacterPtr victim;
    CPVP * pvp;
    BYTE state;
  
    TPVPDuelEventInfo() : ch(), victim(), state(0) {}
};

EVENTINFO(TPVPCheckDisconnect)
{
    DynamicCharacterPtr ch;
    DynamicCharacterPtr victim;

    TPVPCheckDisconnect() : ch(), victim() {}
};

EVENTFUNC(pvp_duel_counter)
{
    if (event == NULL)
        return 0;
  
    if (event->info == NULL)
        return 0;
  
    TPVPDuelEventInfo* info = dynamic_cast<TPVPDuelEventInfo*>(event->info);
  
    if (info == NULL)
    {
       // sys_err("ready_to_start_event> <Factor> Null pointer");
        return 0;
    }
  
    LPCHARACTER chA = info->ch;
    LPCHARACTER chB = info->victim;
  
    if (chA == NULL)
    {
     //   sys_err("Duel: Duel start event info is null.");
        return 0;
    }
  
    if (chB == NULL)
    {
      //  sys_err("Duel: Duel start event info is null.");
        return 0;
    }
  
    switch (info->state)
    {
        case 0:
        {
            chA->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/3.mse");
            chB->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/3.mse");
          
            info->state++;
            return PASSES_PER_SEC(1); break;
        }
        case 1:
        {
            chA->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/2.mse");
            chB->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/2.mse");
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 2:
        {
            if ((chA->GetDuel("BlockParty")) && (chB->GetDuel("BlockParty"))) 
            { 
                LPPARTY chParty = chA->GetParty();
                LPPARTY victimParty = chB->GetParty();
              
                if (chA->GetParty())
                    chParty->Quit(chA->GetPlayerID());
              
                if (chB->GetParty())
                    victimParty->Quit(chB->GetPlayerID());
            }
          
            if ((chA->GetDuel("BlockPet")) && (chB->GetDuel("BlockPet")))
            { 
                CPetSystem* chPet = chA->GetPetSystem();
                CPetSystem* victimPet = chB->GetPetSystem();
              
                for (int petIndex = 34001; petIndex < 34150; petIndex++)
                {
                    CPetActor* chPetActor = chPet->GetByVnum(petIndex);
                    CPetActor* victimPetActor = victimPet->GetByVnum(petIndex); 
                  
                    if (chPetActor != NULL)
                        chPet->Unsummon(petIndex);   
                  
                    if (victimPetActor != NULL)
                        victimPet->Unsummon(petIndex);
#ifdef __NEWPET_SYSTEM__
                    CNewPetSystem* chPet = chA->GetNewPetSystem();
                    CNewPetSystem* victimNewPet = chB->GetNewPetSystem();
                  
                    CNewPetSystem* chNewPetActor = chPet->GetByVnum(petIndex);
                    CNewPetSystem* victimNewPetActor = victimNewPet->GetByVnum(petIndex); 
                  
                    if (chNewPetActor != NULL)
                        chPet->Unsummon(petIndex);   
                  
                    if (victimNewPetActor != NULL)
                        victimNewPet->Unsummon(petIndex);
#endif
                }
            }

#ifdef __SUPPORT_SYSTEM__
            if ((chA->GetDuel("BlockSupport")) && (chB->GetDuel("BlockSupport")))
            { 
                CSupportSystem* chPet = chA->GetSupportSystem();
                CSupportSystem* victimPet = chB->GetSupportSystem();
              
                for (int supportIndex = 34065; supportIndex < 34065; supportIndex++)
                {
                    CPetActor* chPetActor = chPet->GetByVnum(supportIndex);
                    CPetActor* victimPetActor = victimPet->GetByVnum(supportIndex); 
                  
                    if (chPetActor != NULL)
                        chSupport->Unsummon(supportIndex);   
                  
                    if (victimPetActor != NULL)
                        victimSupport->Unsummon(supportIndex);
            }
#endif

            if ((chA->GetDuel("BlockPoly")) && (chB->GetDuel("BlockPoly")))
            {
                if (chA->IsPolymorphed())
                    chA->SetPolymorph(0);
                    chA->RemoveAffect(AFFECT_POLYMORPH);
              
                if (chB->IsPolymorphed())
                    chB->SetPolymorph(0);
                    chB->RemoveAffect(AFFECT_POLYMORPH);
            } 
          
            if ((chA->GetDuel("BlockRide")) && (chB->GetDuel("BlockRide")))
            {
                if (chA->FindAffect(AFFECT_MOUNT))
                    chA->RemoveAffect(AFFECT_MOUNT);
                    chA->RemoveAffect(AFFECT_MOUNT_BONUS);
                    chA->MountVnum(0);
              
                if (chB->FindAffect(AFFECT_MOUNT))
                    chB->RemoveAffect(AFFECT_MOUNT);
                    chB->RemoveAffect(AFFECT_MOUNT_BONUS);
                    chB->MountVnum(0);
              
                if (chA->IsHorseRiding())
                    chA->StopRiding();
              
                if (chB->IsHorseRiding())
                    chB->StopRiding();
              
                if (chA->GetHorse())
                    chA->HorseSummon(false);
              
                if (chB->GetHorse())
                    chB->HorseSummon(false);
            }             
          
            int m_nTableSkill[] = {94, 95, 96, 109, 110, 111, 175}; 
          
            for (int j = 0; j < _countof(m_nTableSkill); j++)
            {
                if ((chA->GetDuel("BlockBuff")) && (chB->GetDuel("BlockBuff"))) {
                    if (chA->GetJob() != JOB_SHAMAN || chB->GetJob() != JOB_SHAMAN) {
                        chA->RemoveAffect(m_nTableSkill[j]);
                        chB->RemoveAffect(m_nTableSkill[j]);
                    }
                }
            }
          
            chA->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/1.mse");
            chB->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/1.mse");
          
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 3:
        { 
            chA->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/go.mse");
            chB->SpecificEffectPacket("D:/ymir work/ui/game/pvp_advanced/go.mse");
          
            info->state++;
            return PASSES_PER_SEC(1);
            break;
        }
        case 4:
        {
            const char* szTableStaticPvP[] = {BLOCK_CHANGEITEM, BLOCK_BUFF, BLOCK_POTION, BLOCK_RIDE, BLOCK_PET, BLOCK_POLY, BLOCK_PARTY, BLOCK_EXCHANGE_, BET_WINNER, CHECK_IS_FIGHT};

            const char* chA_Name = chA->GetName();
            const char* chB_Name = chB->GetName();
          
            int chA_Level = chA->GetLevel();
            int chB_Level = chB->GetLevel();
          
            DWORD chA_Race = chA->GetRaceNum();
            DWORD chB_Race = chB->GetRaceNum();
          
            int chA_[] = {(chA->GetQuestFlag(szTableStaticPvP[0])), (chA->GetQuestFlag(szTableStaticPvP[1])), (chA->GetQuestFlag(szTableStaticPvP[2])), (chA->GetQuestFlag(szTableStaticPvP[3])), (chA->GetQuestFlag(szTableStaticPvP[4])), (chA->GetQuestFlag(szTableStaticPvP[5])), (chA->GetQuestFlag(szTableStaticPvP[6])), (chA->GetQuestFlag(szTableStaticPvP[7])), (chA->GetQuestFlag(szTableStaticPvP[8]))};
            int chB_[] = {(chB->GetQuestFlag(szTableStaticPvP[0])), (chB->GetQuestFlag(szTableStaticPvP[1])), (chB->GetQuestFlag(szTableStaticPvP[2])), (chB->GetQuestFlag(szTableStaticPvP[3])), (chB->GetQuestFlag(szTableStaticPvP[4])), (chB->GetQuestFlag(szTableStaticPvP[5])), (chB->GetQuestFlag(szTableStaticPvP[6])), (chB->GetQuestFlag(szTableStaticPvP[7])), (chB->GetQuestFlag(szTableStaticPvP[8]))};
          
            char chA_buf[CHAT_MAX_LEN + 1], chB_buf[CHAT_MAX_LEN + 1];
          
            snprintf(chA_buf, sizeof(chA_buf), "BINARY_Duel_LiveInterface %s %d %d %d %d %d %d %d %d %d %d %d", chB_Name, chB_Level, chB_Race, chA_[0], chA_[1], chA_[2], chA_[3], chA_[4], chA_[5], chA_[6], chA_[7], chA_[8]);
            snprintf(chB_buf, sizeof(chB_buf), "BINARY_Duel_LiveInterface %s %d %d %d %d %d %d %d %d %d %d %d", chA_Name, chA_Level, chA_Race, chB_[0], chB_[1], chB_[2], chB_[3], chB_[4], chB_[5], chB_[6], chB_[7], chB_[8]);
          
            chA->ChatPacket(CHAT_TYPE_COMMAND, chA_buf);
            chB->ChatPacket(CHAT_TYPE_COMMAND, chB_buf);
          
            chA->SetHP(chA->GetMaxHP());
            chB->SetHP(chB->GetMaxHP());
          
            info->pvp->Packet();
            return 0;
            break;
        }
        default:
        {
            return 0;
            break;
        }
    }
}
#endif

CPVP::CPVP(DWORD dwPID1, DWORD dwPID2)
{
    if (dwPID1 > dwPID2)
    {
        m_players[0].dwPID = dwPID1;
        m_players[1].dwPID = dwPID2;
        m_players[0].bAgree = true;
    }
    else
    {
        m_players[0].dwPID = dwPID2;
        m_players[1].dwPID = dwPID1;
        m_players[1].bAgree = true;
    }

    DWORD adwID[2];
    adwID[0] = m_players[0].dwPID;
    adwID[1] = m_players[1].dwPID;
    m_dwCRC = GetFastHash((const char *) &adwID, 8);
    m_bRevenge = false;

    SetLastFightTime();
}

CPVP::CPVP(CPVP & k)
{
    m_players[0] = k.m_players[0];
    m_players[1] = k.m_players[1];

    m_dwCRC = k.m_dwCRC;
    m_bRevenge = k.m_bRevenge;

    SetLastFightTime();
}

CPVP::~CPVP()
{
}

void CPVP::Packet(bool bDelete)
{
    if (!m_players[0].dwVID || !m_players[1].dwVID)
    {
        if (bDelete)
        //    sys_err("null vid when removing %u %u", m_players[0].dwVID, m_players[0].dwVID);

        return;
    }

    TPacketGCPVP pack;

    pack.bHeader = HEADER_GC_PVP;

    if (bDelete)
    {
        pack.bMode = PVP_MODE_NONE;
        pack.dwVIDSrc = m_players[0].dwVID;
        pack.dwVIDDst = m_players[1].dwVID;
    }
    else if (IsFight())
    {
        pack.bMode = PVP_MODE_FIGHT;
        pack.dwVIDSrc = m_players[0].dwVID;
        pack.dwVIDDst = m_players[1].dwVID;
    }
    else
    {
        pack.bMode = m_bRevenge ? PVP_MODE_REVENGE : PVP_MODE_AGREE;

        if (m_players[0].bAgree)
        {
            pack.dwVIDSrc = m_players[0].dwVID;
            pack.dwVIDDst = m_players[1].dwVID;
        }
        else
        {
            pack.dwVIDSrc = m_players[1].dwVID;
            pack.dwVIDDst = m_players[0].dwVID;
        }
    }

    const DESC_MANAGER::DESC_SET & c_rSet = DESC_MANAGER::instance().GetClientSet();
    DESC_MANAGER::DESC_SET::const_iterator it = c_rSet.begin();

    while (it != c_rSet.end())
    {
        LPDESC d = *it++;

        if (d->IsPhase(PHASE_GAME) || d->IsPhase(PHASE_DEAD))
            d->Packet(&pack, sizeof(pack));
    }
}

static LPEVENT m_pCheckDisconnect = NULL;

EVENTFUNC(pvp_check_disconnect)
{
    if (event == NULL)
        return 0;
  
    if (event->info == NULL)
        return 0;
  
    TPVPCheckDisconnect* info = dynamic_cast<TPVPCheckDisconnect*>(event->info);
  
    if (info == NULL)
    {
        return 0;
    }
  
    LPCHARACTER chA = info->ch;
    LPCHARACTER chB = info->victim;
  
    const char* szTableStaticPvP[] = {BLOCK_CHANGEITEM, BLOCK_BUFF, BLOCK_POTION, BLOCK_RIDE, BLOCK_PET, BLOCK_POLY, BLOCK_PARTY, BLOCK_EXCHANGE_, BET_WINNER, CHECK_IS_FIGHT};
  
    if (chA == NULL)
    {
        int betMoney = chB->GetQuestFlag(szTableStaticPvP[8]);
      
        if (betMoney > 0)
        {
            chB->PointChange(POINT_GOLD, betMoney, true);
            chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("duel_victim_disconnect_receive_money"));
        }
      
        char buf[CHAT_MAX_LEN + 1];
        snprintf(buf, sizeof(buf), "BINARY_Duel_Delete");
        chB->ChatPacket(CHAT_TYPE_COMMAND, buf); 
      
        for (int i = 0; i < _countof(szTableStaticPvP); i++) {
            chB->SetQuestFlag(szTableStaticPvP[i], 0); 
        }
      
        chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("duel_victim_disconnect")); 
        //sys_err("pvp_check_disconnect: Victim chA was logout.");
        return 0;
    } 
  
    if (chB == NULL)
    {
        int betMoney = chA->GetQuestFlag(szTableStaticPvP[8]);
      
        if (betMoney > 0)
        {
            chA->PointChange(POINT_GOLD, betMoney, true);
            chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("duel_victim_disconnect_receive_money"));
        }
      
        char buf[CHAT_MAX_LEN + 1];
        snprintf(buf, sizeof(buf), "BINARY_Duel_Delete");
        chA->ChatPacket(CHAT_TYPE_COMMAND, buf); 
      
        for (int i = 0; i < _countof(szTableStaticPvP); i++) {
            chA->SetQuestFlag(szTableStaticPvP[i], 0); 
        }
      
        chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("duel_victim_disconnect")); 
     //   sys_err("pvp_check_disconnect: Victim chB was logout.");
        return 0;
    }
  
    return PASSES_PER_SEC(1);
}

bool CPVP::Agree(DWORD dwPID)
{
    m_players[m_players[0].dwPID != dwPID ? 1 : 0].bAgree = true; // dai compilare si ma duc sa mananc ceva

#ifdef ENABLE_PVP_ADVANCED
    if (IsFight())
    {
        if (m_pAdvancedDuelTimer != NULL)
        {
            event_cancel(&m_pAdvancedDuelTimer);
        }
      
        LPCHARACTER chA = CHARACTER_MANAGER::Instance().FindByPID(dwPID);
        LPCHARACTER chB = CHARACTER_MANAGER::Instance().FindByPID(m_players[m_players[0].dwPID != dwPID ? 0 : 1].dwPID);
      
        const char* szTableStaticPvP[] = {BLOCK_CHANGEITEM, BLOCK_BUFF, BLOCK_POTION, BLOCK_RIDE, BLOCK_PET, BLOCK_POLY, BLOCK_PARTY, BLOCK_EXCHANGE_, BET_WINNER, CHECK_IS_FIGHT};
      
        if (chA->GetQuestFlag(szTableStaticPvP[9]) != 1 && chB->GetQuestFlag(szTableStaticPvP[9]) != 1) {
            chA->SetDuel("IsFight", 1);
            chB->SetDuel("IsFight", 1);
        }
      
        {
            TPVPCheckDisconnect* info = AllocEventInfo<TPVPCheckDisconnect>();
            info->ch = chA;
            info->victim = chB;
          
            event_create(pvp_check_disconnect, info, 1);
        }

        {
            TPVPDuelEventInfo* info = AllocEventInfo<TPVPDuelEventInfo>();
            info->ch = chA;
            info->victim = chB;
            info->state = 0;
            info->pvp = this;
            m_pAdvancedDuelTimer = event_create(pvp_duel_counter, info, PASSES_PER_SEC(1));
        }
      
        return true;
    }
#else
    if (IsFight())
    {
        Packet();
        return true;
    }
#endif
    return false;
}

bool CPVP::IsFight()
{
    return (m_players[0].bAgree == m_players[1].bAgree) && m_players[0].bAgree;
}

void CPVP::Win(DWORD dwPID)
{
    int iSlot = m_players[0].dwPID != dwPID ? 1 : 0;

    m_bRevenge = true;

    m_players[iSlot].bAgree = true; // 자동으로 동의
    m_players[!iSlot].bCanRevenge = true;
    m_players[!iSlot].bAgree = false;

    Packet();
}

bool CPVP::CanRevenge(DWORD dwPID)
{
    return m_players[m_players[0].dwPID != dwPID ? 1 : 0].bCanRevenge;
}

void CPVP::SetVID(DWORD dwPID, DWORD dwVID)
{
    if (m_players[0].dwPID == dwPID)
        m_players[0].dwVID = dwVID;
    else
        m_players[1].dwVID = dwVID;
}

void CPVP::SetLastFightTime()
{
    m_dwLastFightTime = get_dword_time();
}

DWORD CPVP::GetLastFightTime()
{
    return m_dwLastFightTime;
}

CPVPManager::CPVPManager()
{
}

CPVPManager::~CPVPManager()
{
}

void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    if (pkChr->IsDead() || pkVictim->IsDead())
        return;

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

    CPVP * pkPVP;

    if ((pkPVP = Find(kPVP.m_dwCRC)))
    {
        // 복수할 수 있으면 바로 싸움!
        if (pkPVP->Agree(pkChr->GetPlayerID()))
        {
            pkVictim->ChatPacket(CHAT_TYPE_INFO, "%s", pkChr->GetName());
            pkChr->ChatPacket(CHAT_TYPE_INFO, "%s", pkVictim->GetName());
        }
        return;
    }

    pkPVP = M2_NEW CPVP(kPVP);

    pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
    pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

    m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

    m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
    m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

    pkPVP->Packet();

    char msg[CHAT_MAX_LEN + 1];
    snprintf(msg, sizeof(msg), "%s", pkChr->GetName());

    pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
    pkChr->ChatPacket(CHAT_TYPE_INFO, "%s", pkVictim->GetName());

    // NOTIFY_PVP_MESSAGE
    LPDESC pkVictimDesc = pkVictim->GetDesc();
#ifdef ENABLE_PVP_ADVANCED
   if (pkVictimDesc)
    {
        const char* szTableStaticPvP[] = {BLOCK_CHANGEITEM, BLOCK_BUFF, BLOCK_POTION, BLOCK_RIDE, BLOCK_PET, BLOCK_POLY, BLOCK_PARTY, BLOCK_EXCHANGE_, BET_WINNER, CHECK_IS_FIGHT};

        int mTable[] = {(pkChr->GetQuestFlag(szTableStaticPvP[0])), (pkChr->GetQuestFlag(szTableStaticPvP[1])), (pkChr->GetQuestFlag(szTableStaticPvP[2])), (pkChr->GetQuestFlag(szTableStaticPvP[3])), (pkChr->GetQuestFlag(szTableStaticPvP[4])), (pkChr->GetQuestFlag(szTableStaticPvP[5])), (pkChr->GetQuestFlag(szTableStaticPvP[6])), (pkChr->GetQuestFlag(szTableStaticPvP[7])), (pkChr->GetQuestFlag(szTableStaticPvP[8]))};
      
        CGuild * g = pkChr->GetGuild();

        const char* m_Name = pkChr->GetName();
        const char* m_GuildName = "-";
      
        int m_Vid = pkChr->GetVID(); 
        int m_Level = pkChr->GetLevel();
        int m_PlayTime = pkChr->GetRealPoint(POINT_PLAYTIME);
        int m_MaxHP = pkChr->GetMaxHP();
        int m_MaxSP = pkChr->GetMaxSP();
        int PVP_BLOCK_VIEW_EQUIPMENT = pkChr->GetQuestFlag(BLOCK_EQUIPMENT_);
      
        DWORD m_Race = pkChr->GetRaceNum(); 
      
        if (g)
        {
            pkVictim->ChatPacket(CHAT_TYPE_COMMAND, "BINARY_Duel_Request %d %s %s %d %d %d %d %d %d %d %d %d %d %d %d %d %d", m_Vid, m_Name, g->GetName(), m_Level, m_Race, m_PlayTime, m_MaxHP, m_MaxSP, mTable[0], mTable[1], mTable[2], mTable[3], mTable[4], mTable[5], mTable[6], mTable[7], mTable[8]);
          
            if (PVP_BLOCK_VIEW_EQUIPMENT < 1)
                pkChr->SendEquipment(pkVictim); 
        }
        else
            pkVictim->ChatPacket(CHAT_TYPE_COMMAND, "BINARY_Duel_Request %d %s %s %d %d %d %d %d %d %d %d %d %d %d %d %d %d", m_Vid, m_Name, m_GuildName, m_Level, m_Race, m_PlayTime, m_MaxHP, m_MaxSP, mTable[0], mTable[1], mTable[2], mTable[3], mTable[4], mTable[5], mTable[6], mTable[7], mTable[8]);
          
            if (PVP_BLOCK_VIEW_EQUIPMENT < 1)
                pkChr->SendEquipment(pkVictim);
    }
#else
    if (pkVictimDesc)
    {
        TPacketGCWhisper pack;
        int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);
        pack.bHeader = HEADER_GC_WHISPER;
        pack.wSize = sizeof(TPacketGCWhisper) + len;
        pack.bType = WHISPER_TYPE_SYSTEM;
        strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));
        TEMP_BUFFER buf;
        buf.write(&pack, sizeof(TPacketGCWhisper));
        buf.write(msg, len);
        pkVictimDesc->Packet(buf.read_peek(), buf.size());
    } 
#endif
}

void CPVPManager::ConnectEx(LPCHARACTER pkChr, bool bDisconnect)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return;

    DWORD dwVID = bDisconnect ? 0 : pkChr->GetVID();

    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;
        pkPVP->SetVID(pkChr->GetPlayerID(), dwVID);
    }
}

void CPVPManager::Connect(LPCHARACTER pkChr)
{
    ConnectEx(pkChr, false);
}

void CPVPManager::Disconnect(LPCHARACTER pkChr)
{
#ifdef ENABLE_PVP_ADVANCED
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());
  
    if (it == m_map_pkPVPSetByID.end())
        return;
  
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();
  
    while (it2 != it->second.end()) {
        CPVP * pkPVP = *it2++;
        pkPVP->Packet(true);
        Delete(pkPVP); 
    }
#endif
}

void CPVPManager::GiveUp(LPCHARACTER pkChr, DWORD dwKillerPID) // This method is calling from no where yet.
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID != dwKillerPID)
            continue;

        pkPVP->SetVID(pkChr->GetPlayerID(), 0);

        m_map_pkPVPSetByID.erase(dwCompanionPID);

        it->second.erase(pkPVP);

        if (it->second.empty())
            m_map_pkPVPSetByID.erase(it);

        m_map_pkPVP.erase(pkPVP->m_dwCRC);

        pkPVP->Packet(true);
        M2_DELETE(pkPVP);
        break;
    }
}

#ifdef ENABLE_PVP_ADVANCED//COMPILE
void CPVPManager::Decline(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());
  
    if (it == m_map_pkPVPSetByID.end())
        return;
  
    bool found = false;
  
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();
  
    while (it2 != it->second.end()) {
        CPVP * pkPVP = *it2++;
        DWORD dwCompanionPID;
      
        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;
      
        if (dwCompanionPID == pkVictim->GetPlayerID()) {
            if (pkPVP->IsFight()) {
                pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("duel_already_exist"));
                return;
            }
          
            pkPVP->Packet(true);
            Delete(pkPVP);
            pkPVP->SetLastFightTime();
            found = true;

            const char* szTableStaticPvP[] = {BLOCK_CHANGEITEM, BLOCK_BUFF, BLOCK_POTION, BLOCK_RIDE, BLOCK_PET, BLOCK_POLY, BLOCK_PARTY, BLOCK_EXCHANGE_, BET_WINNER, CHECK_IS_FIGHT};
          
            for (int i = 0; i < _countof(szTableStaticPvP); i++) {
                char pkChr_Buf[CHAT_MAX_LEN + 1], pkVictim_Buf[CHAT_MAX_LEN + 1];
              
                snprintf(pkChr_Buf, sizeof(pkChr_Buf), "BINARY_Duel_Delete");
                snprintf(pkVictim_Buf, sizeof(pkVictim_Buf), "BINARY_Duel_Delete");
              
                pkChr->ChatPacket(CHAT_TYPE_COMMAND, pkChr_Buf); 
                pkChr->SetQuestFlag(szTableStaticPvP[i], 0);
              
                pkVictim->ChatPacket(CHAT_TYPE_COMMAND, pkVictim_Buf); 
                pkVictim->SetQuestFlag(szTableStaticPvP[i], 0); 
            }
            pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("duel_rejected"), pkChr->GetName());
        }
    }
}
#endif

bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID)
{
    CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID());

    if (it == m_map_pkPVPSetByID.end())
        return false;

    bool found = false;

    sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID());
    TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin();

    while (it2 != it->second.end())
    {
        CPVP * pkPVP = *it2++;

        DWORD dwCompanionPID;

        if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID())
            dwCompanionPID = pkPVP->m_players[1].dwPID;
        else
            dwCompanionPID = pkPVP->m_players[0].dwPID;

        if (dwCompanionPID == dwKillerPID)
        {
            if (pkPVP->IsFight())
            {
                pkPVP->SetLastFightTime();
#ifdef ENABLE_PVP_ADVANCED
                pkPVP->Packet(true);
                Delete(pkPVP);
#else
                pkPVP->Win(dwKillerPID);
#endif
                found = true;
                break;
            }
            else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000)
            {
                found = true;
                break;
            }
        }
    }

    return found;
}

bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
    switch (pkVictim->GetCharType())
    {
        case CHAR_TYPE_NPC:
        case CHAR_TYPE_WARP:
        case CHAR_TYPE_GOTO:
            return false;
    }

    if (pkChr == pkVictim)  // 내가 날 칠라고 하네 -_-
        return false;

    if (pkVictim->IsNPC() && pkChr->IsNPC() && !pkChr->IsGuardNPC())
        return false;

#if defined(WJ_COMBAT_ZONE)
    if (CCombatZoneManager::Instance().IsCombatZoneMap(pkChr->GetMapIndex()) || CCombatZoneManager::Instance().IsCombatZoneMap(pkVictim->GetMapIndex()))
        return true;
#endif

    if( true == pkChr->IsHorseRiding() )
    {
        if( pkChr->GetHorseLevel() > 0 && 1 == pkChr->GetHorseGrade() )
            return false;
    }
    else
    {
        switch( pkChr->GetMountVnum() )
        {
            case 0:
            case 20030:
            case 20110:
            case 20111:
            case 20112:
            case 20113:
            case 20114:
            case 20115:
            case 20116:
            case 20117:
            case 20118:
                //신규 탈것 고급
            case 20205:
            case 20206:
            case 20207:
            case 20208:
            case 20209:
            case 20210:
            case 20211:
            case 20212:
            case 20119:        // 라마단 흑마
            case 20219:        // 라마단 흑마 클론 (할로윈용)
            case 20220:        // 크리스마스 탈것
            case 20221:        // 전갑 백웅
            case 20222:        // 전갑 팬더
            case 20120:
            case 20121:
            case 20122:
            case 20123:
            case 20124:
            case 20125:
            case 20214:        // 난폭한 전갑순순록 
            case 20215:        // 용맹한 전갑순순록 
            case 20217:        // 난폭한 전갑암순록 
            case 20218:        // 용맹한 전갑암순록
            case 20224:        // 난폭한 전갑석룡자
            case 20225:        // 용맹한 전갑석룡자
            case 20226:        //    유니콘
            case 20227:
            case 20229:
            case 20230:
            case 20231:
            case 20232:
            case 20233:
            case 20234:
            case 20235:
            case 20236:
            case 20237:
            case 20238:
            case 20239:
            case 20240:
            case 20241:
            case 20242:
            case 20243:
            case 20244:
            case 20245:
            case 20246:
            case 20247:
            case 20248:
            case 20249:
            case 20250:
            case 20251:
            case 20252:
            case 20253:
            case 20254:
            case 20255:
            case 20256:
            case 20257:
            case 20258:
            case 20259:
            case 20260:
            case 20261:
            case 20262:
            case 20263:
            case 20264:
            case 20265:
            case 20266:
            case 20267:
            case 20268:
            case 20269:
            case 20270:
            case 20271:
            case 20272:
            case 20273:
            case 20274:
            case 20275:
            case 20276:
            case 20277:
            case 20278:
            case 20279:
            case 20280:
                break;

            default:
                return false;
        }
    }

    if (pkVictim->IsNPC() || pkChr->IsNPC())
    {
        return true;
    }

    if (pkVictim->IsObserverMode() || pkChr->IsObserverMode())
        return false;

    {
        BYTE bMapEmpire = SECTREE_MANAGER::instance().GetEmpireFromMapIndex(pkChr->GetMapIndex());

        if ( pkChr->GetPKMode() == PK_MODE_PROTECT && pkChr->GetEmpire() == bMapEmpire ||
                pkVictim->GetPKMode() == PK_MODE_PROTECT && pkVictim->GetEmpire() == bMapEmpire )
        {
            return false;
        }
    }

    if (pkChr->GetEmpire() != pkVictim->GetEmpire())

    {
        if ( LC_IsYMIR() == true || LC_IsKorea() == true )
        {
            if ( pkChr->GetPKMode() == PK_MODE_PROTECT || pkVictim->GetPKMode() == PK_MODE_PROTECT )
            {
                return false;
            }
        }

        return true;
    }

    bool beKillerMode = false;

    if (pkVictim->GetParty() && pkVictim->GetParty() == pkChr->GetParty())
    {
        return false;
        // Cannot attack same party on any pvp model
    }
    else
    {
        if (pkVictim->IsKillerMode())
        {
            return true;
        }

        if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() >= 0)
        {
            if (g_protectNormalPlayer)
            {
            // 범법자는 평화모드인 착한사람을 공격할 수 없다.
            if (PK_MODE_PEACE == pkVictim->GetPKMode())
                return false;
            }
        }


        switch (pkChr->GetPKMode())
        {
            case PK_MODE_PEACE:
            case PK_MODE_REVENGE:
                // Cannot attack same guild
                if (pkVictim->GetGuild() && pkVictim->GetGuild() == pkChr->GetGuild())
                    break;

                if (pkChr->GetPKMode() == PK_MODE_REVENGE)
                {
                    //if (!g_iUseLocale)
                    if (1)
                    {
                        if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() >= 0)
                        {
                            pkChr->SetKillerMode(true);
                            return true;
                        }
                        else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() < 0)
                            return true;
                    }
                    else
                    {
                        if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0)
                            break;
                        else if (pkChr->GetAlignment() >= 0 && pkVictim->GetAlignment() >= 0)
                            break;

                        beKillerMode = true;
                    }
                }
                break;

            case PK_MODE_GUILD:
                // Same implementation from PK_MODE_FREE except for attacking same guild
                if (!pkChr->GetGuild() || (pkVictim->GetGuild() != pkChr->GetGuild()))
                {
                    if (1)
                    //if (!g_iUseLocale)
                    {
                        if (pkVictim->GetAlignment() >= 0)
                            pkChr->SetKillerMode(true);
                        else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0)
                            pkChr->SetKillerMode(true);

                        return true;
                    }
                    else
                        beKillerMode = true;
                }
                break;

            case PK_MODE_FREE:
                //if (!g_iUseLocale)
                if (1)
                {
                    if (pkVictim->GetAlignment() >= 0)
                        pkChr->SetKillerMode(true);
                    else if (pkChr->GetAlignment() < 0 && pkVictim->GetAlignment() < 0)
                        pkChr->SetKillerMode(true);

                    return true;
                }
                else
                    beKillerMode = true;
                break;
        }
    }

    CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());
    CPVP * pkPVP = Find(kPVP.m_dwCRC);

    if (!pkPVP || !pkPVP->IsFight())
    {
        if (beKillerMode)
            pkChr->SetKillerMode(true);

        return (beKillerMode);
    }

    pkPVP->SetLastFightTime();
    return true;
}

CPVP * CPVPManager::Find(DWORD dwCRC)
{
    map<DWORD, CPVP *>::iterator it = m_map_pkPVP.find(dwCRC);

    if (it == m_map_pkPVP.end())
        return NULL;

    return it->second;
}

void CPVPManager::Delete(CPVP * pkPVP)
{
    map<DWORD, CPVP *>::iterator it = m_map_pkPVP.find(pkPVP->m_dwCRC);

    if (it == m_map_pkPVP.end())
        return;

    m_map_pkPVP.erase(it);
    m_map_pkPVPSetByID[pkPVP->m_players[0].dwPID].erase(pkPVP);
    m_map_pkPVPSetByID[pkPVP->m_players[1].dwPID].erase(pkPVP);

    M2_DELETE(pkPVP);
}

void CPVPManager::SendList(LPDESC d)
{
    map<DWORD, CPVP *>::iterator it = m_map_pkPVP.begin();

    DWORD dwVID = d->GetCharacter()->GetVID();

    TPacketGCPVP pack;

    pack.bHeader = HEADER_GC_PVP;

    while (it != m_map_pkPVP.end())
    {
        CPVP * pkPVP = (it++)->second;

        if (!pkPVP->m_players[0].dwVID || !pkPVP->m_players[1].dwVID)
            continue;

        // VID가 둘다 있을 경우에만 보낸다.
        if (pkPVP->IsFight())
        {
            pack.bMode = PVP_MODE_FIGHT;
            pack.dwVIDSrc = pkPVP->m_players[0].dwVID;
            pack.dwVIDDst = pkPVP->m_players[1].dwVID;
        }
        else
        {
            pack.bMode = pkPVP->m_bRevenge ? PVP_MODE_REVENGE : PVP_MODE_AGREE;

            if (pkPVP->m_players[0].bAgree)
            {
                pack.dwVIDSrc = pkPVP->m_players[0].dwVID;
                pack.dwVIDDst = pkPVP->m_players[1].dwVID;
            }
            else
            {
                pack.dwVIDSrc = pkPVP->m_players[1].dwVID;
                pack.dwVIDDst = pkPVP->m_players[0].dwVID;
            }
        }

        d->Packet(&pack, sizeof(pack));
        sys_log(1, "PVPManager::SendList %d %d", pack.dwVIDSrc, pack.dwVIDDst);

        if (pkPVP->m_players[0].dwVID == dwVID)
        {
            LPCHARACTER ch = CHARACTER_MANAGER::instance().Find(pkPVP->m_players[1].dwVID);
            if (ch && ch->GetDesc())
            {
                LPDESC d = ch->GetDesc();
                d->Packet(&pack, sizeof(pack));
            }
        }
        else if (pkPVP->m_players[1].dwVID == dwVID)
        {
            LPCHARACTER ch = CHARACTER_MANAGER::instance().Find(pkPVP->m_players[0].dwVID);
            if (ch && ch->GetDesc())
            {
                LPDESC d = ch->GetDesc();
                d->Packet(&pack, sizeof(pack));
            }
        }
    }
}

void CPVPManager::Process()
{
    map<DWORD, CPVP *>::iterator it = m_map_pkPVP.begin();

    while (it != m_map_pkPVP.end())
    {
        CPVP * pvp = (it++)->second;

        if (get_dword_time() - pvp->GetLastFightTime() > 600000) // 10분 이상 싸움이 없었으면
        {
            pvp->Packet(true);
            Delete(pvp);
        }
    }
}
buyur ustam :)
 
Dosyada baya düzenleme yapılmış. Ancak şuradaki kodlar yüzünden core düşüyor
C++:
    const char* szTableStaticPvP[] = {BLOCK_CHANGEITEM, BLOCK_BUFF, BLOCK_POTION, BLOCK_RIDE, BLOCK_PET, BLOCK_POLY, BLOCK_PARTY, BLOCK_EXCHANGE_, BET_WINNER, CHECK_IS_FIGHT};

    if (chA == NULL)
    {
        int betMoney = chB->GetQuestFlag(szTableStaticPvP[8]);

Pvp yaparken item değiştirme, pot basma gibi eylemleri engellemek için eklenmiş bu kodlar. Tam olarak nasıl çözülebilir bilmiyorum ancak bu sistemle uyumlu ws turnuvası questi gerekiyor galiba.
Birde bu sistemi devredışı bırakmayı deneyin bi bakalım sonuç ne olacak.
 
Geri
Üst