Merhaba 2 Haftadır Çözmeye Çalıştığım Bir Sorunu Paylaşmak İstedim. Belki Aynı Sorunu Yaşayan Arkadaşlarımız Olur, Onlar İçin Çözümü Sunacağım
"EĞER GEREKSİZ BİR KONU OLARAK GÖRÜLÜRSE KAPATILABİLİR!"
SORUN: Karakterler arası duello başladıktan sonra xx karakter x karakteri kesince aralarındaki Savaş Son Bulmuyordu. ("xx karakter x karakter karşısındaki duelloyu kazandı") gibi..
ÇÖZÜM-1: Kullandığım quest içerisinde karaktere duello yollama fonksiyonunu kaldırdım yani ("Saniyeden Sonra Otomatik Olarak Duello Başlatıyordu, bunu iki kez farklı bir kodla yapıyordu. Bende 2 kere duello yollamaması için quest içerisinde bulunan duello yollama satırını sildim")
QUEST İÇERİSİNDE KALDIRDIGIM FONKSİYON : "timer("fight_start_countdown_shutdown", 1)"
NOT: QUEST ALINTIDIR.
state start begin
when 20087.chat."GM
vP 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(6585800,6585800)
end
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.warp(344000,502500)
end
when 20087.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() == 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: Sınıf Seçimi " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil begin
say("")
say("Turnuva sınıfını seç.")
say("")
local sinif = select("Savaşçı ", "Ninja ", "Sura ", "Şaman ", "Karışık ", "Vazgeç ")
if sinif == 1 then
game.set_event_flag("pvp_sinif",1)
say("Savaşçı sınıfı seçildi.")
elseif sinif == 2 then
game.set_event_flag("pvp_sinif",2)
say("Ninja sınıfı seçildi.")
elseif sinif == 3 then
game.set_event_flag("pvp_sinif",3)
say("Sura sınıfı seçildi.")
elseif sinif == 4 then
game.set_event_flag("pvp_sinif",4)
say("Şaman sınıfı seçildi.")
elseif sinif == 5 then
game.set_event_flag("pvp_sinif",5)
say("Karışık seçildi.")
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:")
if game.get_event_flag("pvp_sinif") == 0 then
say("Önce sınıf seçimi yap.")
return
end
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(20087).."'e gidin.")
local sinif = game.get_event_flag("pvp_sinif")
local siniff = ""
if sinif == 1 then
siniff = "Savaşçı "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 2 then
siniff = "Ninja "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 3 then
siniff = "Sura "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 4 then
siniff = "Şaman "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 5 then
siniff = "Karışık "
notice_all("Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
end
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)..":")
local sinif = game.get_event_flag("pvp_sinif")
if sinif == 1 then
if pc.get_job() != 0 then
if pc.get_job() != 4 then
say("Sadece savaşçılar girebilir.")
return
end
end
elseif sinif == 2 then
if pc.get_job() != 1 then
if pc.get_job() != 5 then
say("Sadece ninjalar girebilir.")
return
end
end
elseif sinif == 3 then
if pc.get_job() != 2 then
if pc.get_job() != 6 then
say("Sadece suralar girebilir.")
return
end
end
elseif sinif == 4 then
if pc.get_job() != 3 then
if pc.get_job() != 7 then
say("Sadece şamanlar girebilir.")
return
end
end
end
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_item_vnum(50027)
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
if pc.count_item(50027) < 1 then
say("Giriş itemin olmadan giremezsin.")
say_item_vnum(50027)
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)
pc.remove_item(50027,1)
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 = {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 = {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[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] = 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())
else
pc.select(partner_vid)
if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
if tostring(arena[pvp_manager.get_arena()][5]) == "30" then
local f = "pvp"
pc.setf(f,"item_block",0)
if pc.get_job() == 2 or pc.get_job() == 6 then
pc.setf(f,"block_cozme",1)
end
syschat("İtemlerini değiştirmek için 15 saniyen var.")
syschat("15 saniye sonunda item değiştiremeyeceksin.")
elseif tostring(arena[pvp_manager.get_arena()][5]) == "15" then
local f = "pvp"
pc.setf(f,"item_block",1)
if pc.get_job() == 2 or pc.get_job() == 6 then
pc.setf(f,"block_cozme",0)
end
syschat("İtem değiştirme süresi sona erdi.")
end
syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
end
affect.add(apply.MOV_SPEED, -10000, 2)
pc.select(my_vid)
if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
if tostring(arena[pvp_manager.get_arena()][5]) == "30" then
local f = "pvp"
pc.setf(f,"item_block",0)
syschat("İtemlerini değiştirmek için 15 saniyen var.")
syschat("15 saniye sonunda item değiştiremeyeceksin.")
elseif tostring(arena[pvp_manager.get_arena()][5]) == "15" then
local f = "pvp"
pc.setf(f,"item_block",1)
syschat("İtem değiştirme süresi sona erdi.")
end
syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
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
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
when login with pc.get_map_index() != 28 begin
local f = "pvp"
pc.setf(f,"item_block",0)
if pc.get_job() == 2 or pc.get_job() == 6 then
pc.setf(f,"block_cozme",0)
end
end
when login with pc.get_map_index() == 28 begin
if pc.get_job() == 2 or pc.get_job() == 6 then
local f = "pvp"
pc.setf(f,"block_cozme",0)
end
if party.is_party() then
local krallik = pc.get_empire()
if krallik == 1 then
pc.warp(469300, 964200)
elseif krallik == 2 then
pc.warp(55700, 157900)
elseif krallik == 3 then
pc.warp(969600, 278400)
end
end
end
function local_pc_warp(name, x, y)
local target = find_pc_by_name(name)
local t = pc.select(target)
if x == 126 and y == 40 then
local f = "pvp"
pc.setf(f,"item_block",0)
end
pc.warp_local(pc.get_map_index(), x*100, y*100)
pc.select(t)
if x == 126 and y == 40 then
local f = "pvp"
pc.setf(f,"item_block",0)
end
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 ÇÖZÜM-2 : Duello da HP-SP Görme sistemini kaldırdım.
<a href="
Umarım Benle Aynı Sorunu Yaşayacak Olan Arkadaşlarıma Yardımcı Olurum.
Yapamayan veya anlatımımdan dolayı kafası karışan arkadaşım olursa özel mesaj yoluyla da yardımcı olabilirim.
İyi Forumlar.
Metin2 PVP Turnuva Sorunu Çözüm
Metin2 oyununda PVP turnuvalarında karşılaşılan sorunlar, özellikle sunucu tarafında özel scriptlerin (özellikle quest sistemlerinin) etkin olduğu durumlarda sıkça görülen problemlerdir. Bu sorunlar genellikle oyun içindeki turnuva sistemlerinin çakışması, quest scriptlerindeki hatalar veya quest trigger mekanizmalarının doğru çalışmaması nedeniyle ortaya çıkar. Bu yazıda, Metin2 PVP turnuva sorunlarının temel nedenlerine odaklanarak çözüm yollarını detaylı şekilde ele alacağız.
Metin2 PVP Turnuva Sistemi Nedir?
Metin2, oyuncuların birbirleriyle rekabet edebilmeleri için birçok PVP modu sunar. Bu modlar arasında turnuva sistemleri de yer alır. Turnuva sistemleri, genellikle belirli kurallar çerçevesinde düzenlenen turnuvalardır. Oyuncular belirli seviyelere göre gruplanır, turnuvalar düzenlenir ve kazananlara özel ödüller verilir. Ancak bu sistemlerin doğru çalışabilmesi için sunucu tarafında aktif olan quest sistemlerinin de bu turnuvalarla uyumlu olması gerekir.
Sorunların Kaynağı: Quest Sistemleri ve PVP Çakışmaları
Metin2 sunucularında quest sistemleri, Lua dili ile yazılmış scriptlerle çalışır. Quest sistemleri, oyuncuların belirli görevleri yapmasını sağlarken aynı zamanda oyun içi etkileşimleri yönetir. Ancak bazı özel quest sistemleri, PVP sistemleriyle çakışabilir. Özellikle turnuva sırasında oyuncuların belirli quest komutlarını tetiklemesi (quest trigger), turnuvanın iptal edilmesine veya hatalı sonuçlanmasına neden olabilir.
Örnek Hata: Turnuva esnasında quest başlatıldığında turnuva iptal ediliyor.
Bu hata genellikle quest scriptlerindeki 'begin' veya 'end' komutlarının PVP durumunu kontrol etmemesinden kaynaklanır. Örneğin bir quest, oyuncu turnuvada iken başlatıldığında, oyun o anki PVP durumunu sıfırlayabilir veya oyuncuyu turnuvadan atabilir. Bu durumda turnuva iptal edilir ve oyuncular haksızca diskalifiye edilebilir.
Quest Timer ve Flag Kullanımı
Quest sistemlerinde 'timer' ve 'flag' yapıları, oyuncunun durumu izlemek için kullanılır. Ancak turnuva sırasında bu yapılar yanlış kullanıldığında, oyuncuların turnuvaya katılamamasına veya turnuva esnasında sistemsel sorunlar yaşanmasına yol açabilir. Örneğin bir quest timer'ı, turnuva süresiyle çakıştığında sistem karışıklığı oluşabilir. Quest flag'leri ise turnuva sırasında değiştirildiğinde oyuncu turnuvadan atılabilir.
Metin2 Quest Debug ve Hata Ayıklama
Turnuva sorunlarını çözmek için ilk adım, mevcut quest scriptlerinde hata ayıklama yapmaktır. Quest debug işlemleri, quest scriptlerindeki mantık hatalarını tespit etmek için yapılır. Özellikle turnuva esnasında çalışan quest komutlarını incelemek önemlidir. Hata mesajları, log dosyaları ve quest state takibi bu süreçte yardımcı olur.
PVP Sistemleriyle Uyumlu Quest Geliştirme
Oyuncuların turnuva esnasında quest yapabilmesi için, quest sistemlerinin PVP durumunu kontrol etmesi gerekir. Bu işlem, quest scriptlerine özel kontroller eklenerek yapılır. Örneğin, turnuva başladıktan sonra quest başlatılmaması için 'is_in_duel' veya benzeri kontroller yapılmalıdır. Ayrıca, turnuva sırasında quest timer'ların pasif kalması sağlanmalıdır.
Quest Reward ve Item Verme Mekanizması
Turnuva esnasında quest ödülleri verilmesi, oyuncuların oyun içi avantaj elde etmesine neden olabilir. Bu durum hem haksız rekabete yol açar hem de turnuva sisteminin güvenilirliğini düşürür. Bu nedenle turnuva sırasında quest reward'ların verilmemesi veya özel kontrollerle engellenmesi gerekir.
Sonuç ve Öneriler
Metin2 PVP turnuva sorunları, quest sistemlerinin eksik veya hatalı yapılandırılması sonucu ortaya çıkar. Bu sorunları çözmek için quest scriptlerinde PVP uyumlu kodlama yapılması, quest debug işlemleri yapılması ve turnuva sistemlerinin detaylı test edilmesi gerekir. Oyuncuların adil bir ortamda turnuva yapabilmesi için quest sistemlerinin turnuva süresince pasif kalması veya özel kontrollerle yönetilmesi önemlidir. Daha stabil ve keyifli bir oyun deneyimi için Metin2 sunucularında quest sistemleri ile PVP sistemlerinin uyumlu çalışması şarttır.
Metin2 PVP Tournament Issue Solution
Issues encountered in PVP tournaments in Metin2 are frequently observed problems, especially in cases where custom scripts (particularly quest systems) are active on the server side. These issues typically arise from conflicts between the in-game tournament systems, errors in quest scripts, or improper functioning of quest triggers. In this article, we will examine the fundamental causes of Metin2 PVP tournament issues and provide detailed solution methods.
What is the Metin2 PVP Tournament System?
Metin2 offers several PVP modes that allow players to compete against each other. Among these modes are tournament systems. Tournament systems are usually organized events with specific rules. Players are grouped according to certain levels, tournaments are held, and special rewards are given to winners. However, for these systems to function correctly, the active quest systems on the server must also be compatible with these tournaments.
Root Cause of Issues: Quest Systems and PVP Conflicts
In Metin2 servers, quest systems operate through scripts written in the Lua language. Quest systems manage interactions within the game while requiring players to complete certain tasks. However, some custom quest systems may conflict with PVP systems. Specifically, triggering quests during tournaments can cause the tournament to be canceled or result in errors. For example, if a quest is initiated while a player is in a tournament, the game might reset the current PVP status or remove the player from the tournament.
Example Error: Tournament gets canceled when a quest starts during the tournament.
This error usually stems from 'begin' or 'end' commands in quest scripts not checking the PVP status. For instance, if a quest starts while a player is in a tournament, the game may reset the PVP state or eject the player from the event, resulting in unfair disqualification.
Quest Timer and Flag Usage
In quest systems, 'timer' and 'flag' structures are used to track a player's status. However, incorrect usage of these during tournaments can prevent players from joining or cause system issues. For example, if a quest timer overlaps with a tournament, confusion in the system can occur. Changing quest flags during tournaments can also lead to players being removed from the event.
Metin2 Quest Debugging and Error Detection
To resolve tournament issues, the first step is debugging existing quest scripts. Quest debugging identifies logical errors in quest scripts. It's important to review quest commands that run during tournaments. Error messages, log files, and tracking quest states assist in this process.
Developing PVP-Compatible Quests
For players to participate in quests during tournaments, quest systems must check the PVP status. This is achieved by adding special checks into the quest scripts. For example, to prevent quests from starting after a tournament begins, checks like 'is_in_duel' should be implemented. Additionally, quest timers should remain inactive during tournaments.
Quest Reward and Item Distribution Mechanisms
Awarding quest rewards during tournaments can give players in-game advantages. This leads to unfair competition and undermines the integrity of the tournament system. Therefore, quest rewards should either not be distributed during tournaments or be blocked via special checks.
Conclusion and Recommendations
Metin2 PVP tournament issues arise from incomplete or incorrect configuration of quest systems. To resolve these issues, PVP-compatible coding must be applied in quest scripts, debugging processes must be carried out, and tournament systems must be thoroughly tested. Ensuring that quest systems remain passive or managed through special checks during tournaments is essential for a fair gaming environment. For a more stable and enjoyable gaming experience, compatibility between quest systems and PVP systems is crucial on Metin2 servers.
"EĞER GEREKSİZ BİR KONU OLARAK GÖRÜLÜRSE KAPATILABİLİR!"
SORUN: Karakterler arası duello başladıktan sonra xx karakter x karakteri kesince aralarındaki Savaş Son Bulmuyordu. ("xx karakter x karakter karşısındaki duelloyu kazandı") gibi..
ÇÖZÜM-1: Kullandığım quest içerisinde karaktere duello yollama fonksiyonunu kaldırdım yani ("Saniyeden Sonra Otomatik Olarak Duello Başlatıyordu, bunu iki kez farklı bir kodla yapıyordu. Bende 2 kere duello yollamaması için quest içerisinde bulunan duello yollama satırını sildim")
QUEST İÇERİSİNDE KALDIRDIGIM FONKSİYON : "timer("fight_start_countdown_shutdown", 1)"
NOT: QUEST ALINTIDIR.
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
quest pvp_manager beginstate start begin
when 20087.chat."GM
say("Haritaya gitmek istiyor musun?")
say("")
local a = select(locale.yes,locale.no)
if a == 1 then
pc.warp(6585800,6585800)
end
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.warp(344000,502500)
end
when 20087.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() == 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: Sınıf Seçimi " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil begin
say("")
say("Turnuva sınıfını seç.")
say("")
local sinif = select("Savaşçı ", "Ninja ", "Sura ", "Şaman ", "Karışık ", "Vazgeç ")
if sinif == 1 then
game.set_event_flag("pvp_sinif",1)
say("Savaşçı sınıfı seçildi.")
elseif sinif == 2 then
game.set_event_flag("pvp_sinif",2)
say("Ninja sınıfı seçildi.")
elseif sinif == 3 then
game.set_event_flag("pvp_sinif",3)
say("Sura sınıfı seçildi.")
elseif sinif == 4 then
game.set_event_flag("pvp_sinif",4)
say("Şaman sınıfı seçildi.")
elseif sinif == 5 then
game.set_event_flag("pvp_sinif",5)
say("Karışık seçildi.")
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:")
if game.get_event_flag("pvp_sinif") == 0 then
say("Önce sınıf seçimi yap.")
return
end
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(20087).."'e gidin.")
local sinif = game.get_event_flag("pvp_sinif")
local siniff = ""
if sinif == 1 then
siniff = "Savaşçı "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 2 then
siniff = "Ninja "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 3 then
siniff = "Sura "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 4 then
siniff = "Şaman "
notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
elseif sinif == 5 then
siniff = "Karışık "
notice_all("Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")
end
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)..":")
local sinif = game.get_event_flag("pvp_sinif")
if sinif == 1 then
if pc.get_job() != 0 then
if pc.get_job() != 4 then
say("Sadece savaşçılar girebilir.")
return
end
end
elseif sinif == 2 then
if pc.get_job() != 1 then
if pc.get_job() != 5 then
say("Sadece ninjalar girebilir.")
return
end
end
elseif sinif == 3 then
if pc.get_job() != 2 then
if pc.get_job() != 6 then
say("Sadece suralar girebilir.")
return
end
end
elseif sinif == 4 then
if pc.get_job() != 3 then
if pc.get_job() != 7 then
say("Sadece şamanlar girebilir.")
return
end
end
end
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_item_vnum(50027)
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
if pc.count_item(50027) < 1 then
say("Giriş itemin olmadan giremezsin.")
say_item_vnum(50027)
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)
pc.remove_item(50027,1)
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 = {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 = {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[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] = 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())
else
pc.select(partner_vid)
if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
if tostring(arena[pvp_manager.get_arena()][5]) == "30" then
local f = "pvp"
pc.setf(f,"item_block",0)
if pc.get_job() == 2 or pc.get_job() == 6 then
pc.setf(f,"block_cozme",1)
end
syschat("İtemlerini değiştirmek için 15 saniyen var.")
syschat("15 saniye sonunda item değiştiremeyeceksin.")
elseif tostring(arena[pvp_manager.get_arena()][5]) == "15" then
local f = "pvp"
pc.setf(f,"item_block",1)
if pc.get_job() == 2 or pc.get_job() == 6 then
pc.setf(f,"block_cozme",0)
end
syschat("İtem değiştirme süresi sona erdi.")
end
syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
end
affect.add(apply.MOV_SPEED, -10000, 2)
pc.select(my_vid)
if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 then
if tostring(arena[pvp_manager.get_arena()][5]) == "30" then
local f = "pvp"
pc.setf(f,"item_block",0)
syschat("İtemlerini değiştirmek için 15 saniyen var.")
syschat("15 saniye sonunda item değiştiremeyeceksin.")
elseif tostring(arena[pvp_manager.get_arena()][5]) == "15" then
local f = "pvp"
pc.setf(f,"item_block",1)
syschat("İtem değiştirme süresi sona erdi.")
end
syschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")
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
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
when login with pc.get_map_index() != 28 begin
local f = "pvp"
pc.setf(f,"item_block",0)
if pc.get_job() == 2 or pc.get_job() == 6 then
pc.setf(f,"block_cozme",0)
end
end
when login with pc.get_map_index() == 28 begin
if pc.get_job() == 2 or pc.get_job() == 6 then
local f = "pvp"
pc.setf(f,"block_cozme",0)
end
if party.is_party() then
local krallik = pc.get_empire()
if krallik == 1 then
pc.warp(469300, 964200)
elseif krallik == 2 then
pc.warp(55700, 157900)
elseif krallik == 3 then
pc.warp(969600, 278400)
end
end
end
function local_pc_warp(name, x, y)
local target = find_pc_by_name(name)
local t = pc.select(target)
if x == 126 and y == 40 then
local f = "pvp"
pc.setf(f,"item_block",0)
end
pc.warp_local(pc.get_map_index(), x*100, y*100)
pc.select(t)
if x == 126 and y == 40 then
local f = "pvp"
pc.setf(f,"item_block",0)
end
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 ÇÖZÜM-2 : Duello da HP-SP Görme sistemini kaldırdım.
<a href="
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
" class="link link--internal" target="" rel="" data-proxy-href="/proxy.php?link=https%3A%2F%2Fforum.turkmmo.com%2Findir%2Fduelloda-hp-sp-gorme-onaysiz-saltanat-tarzi-python-quest.802%2F&hash=cf06e4a06eff92573c84722d215b739b">
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
</a> Bu konudan yararlanarak Sistemi Kaldırabilirsiniz.Umarım Benle Aynı Sorunu Yaşayacak Olan Arkadaşlarıma Yardımcı Olurum.
Yapamayan veya anlatımımdan dolayı kafası karışan arkadaşım olursa özel mesaj yoluyla da yardımcı olabilirim.
İyi Forumlar.
Metin2 PVP Turnuva Sorunu Çözüm
Metin2 oyununda PVP turnuvalarında karşılaşılan sorunlar, özellikle sunucu tarafında özel scriptlerin (özellikle quest sistemlerinin) etkin olduğu durumlarda sıkça görülen problemlerdir. Bu sorunlar genellikle oyun içindeki turnuva sistemlerinin çakışması, quest scriptlerindeki hatalar veya quest trigger mekanizmalarının doğru çalışmaması nedeniyle ortaya çıkar. Bu yazıda, Metin2 PVP turnuva sorunlarının temel nedenlerine odaklanarak çözüm yollarını detaylı şekilde ele alacağız.
Metin2 PVP Turnuva Sistemi Nedir?
Metin2, oyuncuların birbirleriyle rekabet edebilmeleri için birçok PVP modu sunar. Bu modlar arasında turnuva sistemleri de yer alır. Turnuva sistemleri, genellikle belirli kurallar çerçevesinde düzenlenen turnuvalardır. Oyuncular belirli seviyelere göre gruplanır, turnuvalar düzenlenir ve kazananlara özel ödüller verilir. Ancak bu sistemlerin doğru çalışabilmesi için sunucu tarafında aktif olan quest sistemlerinin de bu turnuvalarla uyumlu olması gerekir.
Sorunların Kaynağı: Quest Sistemleri ve PVP Çakışmaları
Metin2 sunucularında quest sistemleri, Lua dili ile yazılmış scriptlerle çalışır. Quest sistemleri, oyuncuların belirli görevleri yapmasını sağlarken aynı zamanda oyun içi etkileşimleri yönetir. Ancak bazı özel quest sistemleri, PVP sistemleriyle çakışabilir. Özellikle turnuva sırasında oyuncuların belirli quest komutlarını tetiklemesi (quest trigger), turnuvanın iptal edilmesine veya hatalı sonuçlanmasına neden olabilir.
Örnek Hata: Turnuva esnasında quest başlatıldığında turnuva iptal ediliyor.
Bu hata genellikle quest scriptlerindeki 'begin' veya 'end' komutlarının PVP durumunu kontrol etmemesinden kaynaklanır. Örneğin bir quest, oyuncu turnuvada iken başlatıldığında, oyun o anki PVP durumunu sıfırlayabilir veya oyuncuyu turnuvadan atabilir. Bu durumda turnuva iptal edilir ve oyuncular haksızca diskalifiye edilebilir.
Quest Timer ve Flag Kullanımı
Quest sistemlerinde 'timer' ve 'flag' yapıları, oyuncunun durumu izlemek için kullanılır. Ancak turnuva sırasında bu yapılar yanlış kullanıldığında, oyuncuların turnuvaya katılamamasına veya turnuva esnasında sistemsel sorunlar yaşanmasına yol açabilir. Örneğin bir quest timer'ı, turnuva süresiyle çakıştığında sistem karışıklığı oluşabilir. Quest flag'leri ise turnuva sırasında değiştirildiğinde oyuncu turnuvadan atılabilir.
Metin2 Quest Debug ve Hata Ayıklama
Turnuva sorunlarını çözmek için ilk adım, mevcut quest scriptlerinde hata ayıklama yapmaktır. Quest debug işlemleri, quest scriptlerindeki mantık hatalarını tespit etmek için yapılır. Özellikle turnuva esnasında çalışan quest komutlarını incelemek önemlidir. Hata mesajları, log dosyaları ve quest state takibi bu süreçte yardımcı olur.
PVP Sistemleriyle Uyumlu Quest Geliştirme
Oyuncuların turnuva esnasında quest yapabilmesi için, quest sistemlerinin PVP durumunu kontrol etmesi gerekir. Bu işlem, quest scriptlerine özel kontroller eklenerek yapılır. Örneğin, turnuva başladıktan sonra quest başlatılmaması için 'is_in_duel' veya benzeri kontroller yapılmalıdır. Ayrıca, turnuva sırasında quest timer'ların pasif kalması sağlanmalıdır.
Quest Reward ve Item Verme Mekanizması
Turnuva esnasında quest ödülleri verilmesi, oyuncuların oyun içi avantaj elde etmesine neden olabilir. Bu durum hem haksız rekabete yol açar hem de turnuva sisteminin güvenilirliğini düşürür. Bu nedenle turnuva sırasında quest reward'ların verilmemesi veya özel kontrollerle engellenmesi gerekir.
Sonuç ve Öneriler
Metin2 PVP turnuva sorunları, quest sistemlerinin eksik veya hatalı yapılandırılması sonucu ortaya çıkar. Bu sorunları çözmek için quest scriptlerinde PVP uyumlu kodlama yapılması, quest debug işlemleri yapılması ve turnuva sistemlerinin detaylı test edilmesi gerekir. Oyuncuların adil bir ortamda turnuva yapabilmesi için quest sistemlerinin turnuva süresince pasif kalması veya özel kontrollerle yönetilmesi önemlidir. Daha stabil ve keyifli bir oyun deneyimi için Metin2 sunucularında quest sistemleri ile PVP sistemlerinin uyumlu çalışması şarttır.
Metin2 PVP Tournament Issue Solution
Issues encountered in PVP tournaments in Metin2 are frequently observed problems, especially in cases where custom scripts (particularly quest systems) are active on the server side. These issues typically arise from conflicts between the in-game tournament systems, errors in quest scripts, or improper functioning of quest triggers. In this article, we will examine the fundamental causes of Metin2 PVP tournament issues and provide detailed solution methods.
What is the Metin2 PVP Tournament System?
Metin2 offers several PVP modes that allow players to compete against each other. Among these modes are tournament systems. Tournament systems are usually organized events with specific rules. Players are grouped according to certain levels, tournaments are held, and special rewards are given to winners. However, for these systems to function correctly, the active quest systems on the server must also be compatible with these tournaments.
Root Cause of Issues: Quest Systems and PVP Conflicts
In Metin2 servers, quest systems operate through scripts written in the Lua language. Quest systems manage interactions within the game while requiring players to complete certain tasks. However, some custom quest systems may conflict with PVP systems. Specifically, triggering quests during tournaments can cause the tournament to be canceled or result in errors. For example, if a quest is initiated while a player is in a tournament, the game might reset the current PVP status or remove the player from the tournament.
Example Error: Tournament gets canceled when a quest starts during the tournament.
This error usually stems from 'begin' or 'end' commands in quest scripts not checking the PVP status. For instance, if a quest starts while a player is in a tournament, the game may reset the PVP state or eject the player from the event, resulting in unfair disqualification.
Quest Timer and Flag Usage
In quest systems, 'timer' and 'flag' structures are used to track a player's status. However, incorrect usage of these during tournaments can prevent players from joining or cause system issues. For example, if a quest timer overlaps with a tournament, confusion in the system can occur. Changing quest flags during tournaments can also lead to players being removed from the event.
Metin2 Quest Debugging and Error Detection
To resolve tournament issues, the first step is debugging existing quest scripts. Quest debugging identifies logical errors in quest scripts. It's important to review quest commands that run during tournaments. Error messages, log files, and tracking quest states assist in this process.
Developing PVP-Compatible Quests
For players to participate in quests during tournaments, quest systems must check the PVP status. This is achieved by adding special checks into the quest scripts. For example, to prevent quests from starting after a tournament begins, checks like 'is_in_duel' should be implemented. Additionally, quest timers should remain inactive during tournaments.
Quest Reward and Item Distribution Mechanisms
Awarding quest rewards during tournaments can give players in-game advantages. This leads to unfair competition and undermines the integrity of the tournament system. Therefore, quest rewards should either not be distributed during tournaments or be blocked via special checks.
Conclusion and Recommendations
Metin2 PVP tournament issues arise from incomplete or incorrect configuration of quest systems. To resolve these issues, PVP-compatible coding must be applied in quest scripts, debugging processes must be carried out, and tournament systems must be thoroughly tested. Ensuring that quest systems remain passive or managed through special checks during tournaments is essential for a fair gaming environment. For a more stable and enjoyable gaming experience, compatibility between quest systems and PVP systems is crucial on Metin2 servers.
