Yardım Metin2 kilitlenme sorunu

  • Konuyu açan Konuyu açan dato
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 1
  • Gösterim Gösterim 34
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

dato

Üye
Üye
Mesaj
14
Beğeni
4
Puan
405
Ticaret Puanı
0
Kod bloklarını kod editörüne ekleyiniz.
arkdaşlar herekse selam hızlı şekilde soruna geçicem yardımıcı olursanız sevinirim sorun ise zindan bekçisini kendi mapından hariç başka yere çagırsam çalişmiyor nasıl çalişmiyor derseniz ise zindana almıyor beni npc kısmı açılıyor fakat zindana almıyor sorunu bulamadım questi atıyorum bir zindan deyil bir kaç zindanda bu sorun var questin içinde düzenlemem gereken yerei bana derseniz sevirim yapay zekaylan yapmaya çaliştim fakat halen aynı
Lua (Quest):
Genişlet Daralt Kopyala
quest alastor_dungeon begin
state start begin

----------------------------------------------------------------
-- AYARLAR
----------------------------------------------------------------
function settings()
return {
["index"] = 175,
["warp"] = {12288, 12032},
["index_out"] = 170,
["out_pos"] = {11520, 12032},

["level_check"] = { ["min"] = 100, ["max"] = 120 },

["pass"] = 20600,
["Items"] = {30751, 20600, 30753},

["main_npc"] = 20602,
["main_npc_pos"] = {134, 148, 5},

["alastor"] = 20600,
["alastor_pos"] = {134, 101, 5},

["regen_wave1"] = "data/dungeon/alastor_dungeon/regen_1a.txt",
["regen_monuments"] = "data/dungeon/alastor_dungeon/regen_2a.txt",
["regen_slots2"] = "data/dungeon/alastor_dungeon/regen_2b.txt",

["slots2_total"] = 1, -- regen_2b.txt içeriğine göre
}
end

----------------------------------------------------------------
-- YARDIMCI FONKSİYONLAR
----------------------------------------------------------------
function party_get_member_pids()
local pids = { party.get_member_pids() }
return pids
end

function is_inside()
local s = alastor_dungeon.settings()
local mi = pc.get_map_index()
return pc.in_dungeon() and mi >= s["index"]*10000 and mi < (s["index"]+1)*10000
end

function clear_all()
d.clear_regen()
d.kill_all()
end

function clear_timers()
clear_server_timer("alastor_20min", get_server_timer_arg())
clear_server_timer("alastor_10min", get_server_timer_arg())
clear_server_timer("alastor_5min", get_server_timer_arg())
clear_server_timer("alastor_1min", get_server_timer_arg())
clear_server_timer("alastor_0min", get_server_timer_arg())
clear_server_timer("alastor_final", get_server_timer_arg())
clear_server_timer("alastor_spawn_countdown", get_server_timer_arg())
end

----------------------------------------------------------------
-- GİRİŞ KONTROLÜ (SOLO + PARTİ) — COOLDOWN PARTİYE DE ENGEL
----------------------------------------------------------------
function check_enter()
local s = alastor_dungeon.settings()

addimage(25, 10, "alastor_bg_01.tga")
addimage(225, 150, "alastor_npc.tga")
say(" ")
say_title(mob_name(20601) .. " ")

-- Solo cooldown kontrolü (partideyken de kişiye uygulanır)
if (get_global_time() - pc.getf("alastor_dungeon","exit_alastor_dungeon_time")) < 60*60 then
local remaining = pc.getf("alastor_dungeon","exit_alastor_dungeon_time") - get_global_time() + 60*60
local dk = math.max(0, math.floor(remaining / 60))
say("Tekrar zindana girebilmek için beklemelisin. ")
say_reward("Kalan süre: "..dk.." dakika. ")
return false
end

-- Parti ise toplu kontroller
if party.is_party() then
if not party.is_leader() then
say_reward("Yalnızca grup lideri giriş başlatabilir. ")
return false
end
if party.get_near_count() < 2 then
say_reward("Grubundaki oyuncular yakında olmalı (min. 2 kişi). ")
say ("Eğer grubundaki oyuncular yanındaysa tekrar dene! ")
return false
end

local pids = alastor_dungeon.party_get_member_pids()
local MemberLow, MemberHigh, MemberNoPass, MemberCooldown = {}, {}, {}, {}
local level_ok, pass_ok, cd_ok = true, true, true

for i, pid in next, pids do
q.begin_other_pc_block(pid)
local name = pc.get_name()
local last_exit = pc.getf("alastor_dungeon","exit_alastor_dungeon_time")
local diff = get_global_time() - last_exit

if diff < 60*60 then
local kalan = math.max(0, 60 - math.floor(diff/60))
table.insert(MemberCooldown, { name = name, minutes = kalan })
cd_ok = false
end
if pc.get_level() < s["level_check"]["min"] then table.insert(MemberLow, name) level_ok = false end
if pc.get_level() > s["level_check"]["max"] then table.insert(MemberHigh, name) level_ok = false end
if pc.count_item(s["pass"]) < 1 then table.insert(MemberNoPass, name) pass_ok = false end
q.end_other_pc_block()
end

if not cd_ok then
say_reward("Üzgünüm, grubundaki bazı oyuncuların soğuma süresi devam ediyor: ")
for i, data in next, MemberCooldown do
say(string.format("- %s (%d dk) ", data.name, data.minutes))
end
return false
end
if not level_ok then
say_reward("Bazı grup üyeleri seviye şartını sağlamıyor: ")
for i, n in next, MemberLow do say_title("- "..n.." ") end
for i, n in next, MemberHigh do say_title("- "..n.." ") end
return false
end
if not pass_ok then
say_reward("Bazı üyelerde giriş eşyası eksik: ")
say_item("Alastor Sihirli Taşı ", s["pass"], " ")
for i, n in next, MemberNoPass do say_title("- "..n.." ") end
return false
end
return true
end

-- Solo ise seviye ve item kontrol
if pc.get_level() < s["level_check"]["min"] then
say("En az "..s["level_check"]["min"].." seviye olmalısın. ")
return false
end
if pc.get_level() > s["level_check"]["max"] then
say("En fazla "..s["level_check"]["max"].." seviye ile girebilirsin. ")
return false
end
if pc.count_item(s["pass"]) < 1 then
say_item("Donmuş Anahtar ", s["pass"], " ")
say("Eşya eksik! ")
return false
end

return true
end

----------------------------------------------------------------
-- DUNGEON OLUŞTURMA + COOLDOWN DAĞITIMI (LİDER DAHİL)
---------------------------------------------------------------->
function create_dungeon()
local s = alastor_dungeon.settings()

if party.is_party() then
local leader_pid = party.get_leader_pid()

-- Lider (aktif pc)
pc.remove_item(s["pass"], 1)
pc.setf("alastor_dungeon","exit_alastor_dungeon_time", get_global_time())
pc.setqf("alastor_dungeon", get_time() + 3600)

-- Diğer üyeler
local pids = alastor_dungeon.party_get_member_pids()
for i, pid in next, pids do
if pid ~= leader_pid then
q.begin_other_pc_block(pid)
pc.remove_item(s["pass"], 1)
pc.setf("alastor_dungeon","exit_alastor_dungeon_time", get_global_time())
pc.setqf("alastor_dungeon", get_time() + 3600)
q.end_other_pc_block()
end
end

d.new_jump_party(s["index"], s["warp"][1], s["warp"][2])
else
-- Solo
pc.remove_item(s["pass"], 1)
d.new_jump(s["index"], s["warp"][1]*100, s["warp"][2]*100)
pc.setf("alastor_dungeon","exit_alastor_dungeon_time", get_global_time())
pc.setqf("alastor_dungeon", get_time() + 3600)
end

d.spawn_mob_dir(s["main_npc"], s["main_npc_pos"][1], s["main_npc_pos"][2], s["main_npc_pos"][3])
d.setf("level", 1)
server_timer("alastor_20min", 5*60, d.get_map_index())
end

----------------------------------------------------------------
-- GİRİŞ DİYALOĞU
----------------------------------------------------------------
when 20601.chat."Kuzey Rüzgarı Derinlikleri (Kolay) " with not alastor_dungeon.is_inside() begin
addimage(25, 10, "alastor_bg_01.tga")
addimage(225, 150, "alastor_npc.tga")
say(" ")
say_title(mob_name(20601) .. " ")
say("Zindana girmek ister misin? ")
if alastor_dungeon.check_enter() then
say_reward("Hazırlan, zindana giriş yapılıyor... ")
wait()
alastor_dungeon.create_dungeon()
end
end

----------------------------------------------------------------
-- LOGIN (DIŞARI WARP KONUMU)
----------------------------------------------------------------
when login with alastor_dungeon.is_inside() begin
local s = alastor_dungeon.settings()
d.set_warp_location(s["index_out"], s["out_pos"][1], s["out_pos"][2])
end

----------------------------------------------------------------
-- GM RESET
----------------------------------------------------------------
when 20601.chat."GM: Zaman sıfırlama (Kolay) " with pc.is_gm() and not alastor_dungeon.is_inside() begin
addimage(25, 10, "alastor_bg_01.tga")
say_title(mob_name(20601) .. " ")
if select("Zamanı sıfırla ","Kapat ") == 1 then
pc.setf("alastor_dungeon","exit_alastor_dungeon_time", 0)
say("Zaman sıfırlandı. ")
end
end

----------------------------------------------------------------
-- 1. AŞAMA: Yumurtadan başlat
----------------------------------------------------------------
when 20602.chat."Çabuk olmalısın! " with alastor_dungeon.is_inside() and d.getf("level")==1 begin
addimage(25, 10, "alastor_bg_02.tga")
addimage(225, 150, "alastor_npc.tga")
say(" ")
say_title("Beyaz Ejderha Yumurtası ")
say("Zindanı başlatmak istiyor musun? ")
if select("Evet ","Hayır ") == 1 then
npc.purge()
d.setf("level", 2)
d.setf("wave1_kill", 0)
d.notice("Alastor Zindanı: İlk dalga başladı! ")
d.notice("Tüm yaratıkları öldür! ")
d.regen_file(alastor_dungeon.settings()["regen_wave1"])
end
end

----------------------------------------------------------------
-- KILL LOGİĞİ
----------------------------------------------------------------
when kill with alastor_dungeon.is_inside() and not npc.is_pc() begin
local s = alastor_dungeon.settings()
local race = npc.get_race()

-- 1. DALGA: 40 yaratık
if d.getf("level") == 2 then
if race == 20604 or race == 20605 or race == 20606 or race == 20607 then
d.setf("wave1_kill", d.getf("wave1_kill") + 1)
local remain = 70 - d.getf("wave1_kill")
if remain > 0 then
d.notice("Kalan yaratık: " .. remain .. " / 70 ")
else
d.setf("level", 3)
d.setf("slots2_kill", 0)
d.setf("slots2_drop_done", 0)
d.setf("monuments", 0)
alastor_dungeon.clear_all()
d.regen_file(s["regen_monuments"])
d.regen_file(s["regen_slots2"])
d.notice("Tüm slotları öldürdün! ")
d.notice("Kuzey Rüzgarı Kristali ortaya çıktı ve Zula Savaş Reisi geldi! ")
d.notice("Zula Savaşı Reisi'ni Yok et ve Donmuş Anahtarı elde et! ")
end
end
return
end

-- 2. DALGA: Anıt koruyucuları (109)
if d.getf("level") == 3 then
if race == 20611 then
d.setf("slots2_kill", d.getf("slots2_kill") + 1)
local k = d.getf("slots2_kill")
if k >= s["slots2_total"] and d.getf("slots2_drop_done") == 0 then
game.drop_item(s["Items"][2], 1)
d.setf("slots2_drop_done", 1)
d.notice("Tüm koruyucular yok edildi! Donmuş Anahtar düştü! ")
say ("Zula Savaş Reisi'ni katlettin! ")
say ("Düşürdüğün donmuş anahtarı Kuzey Rüzgarı Kristaline sürükle. ")
else
d.notice(string.format("Anıt koruyucusu öldürüldü (%d / %d) ", k, s["slots2_total"]))
end
end
return
end

-- BOSS öldürülürse
if d.getf("level") == 4 and race == s["alastor"] then
d.notice("Tebrikler! Alastor'u yendin! ")
d.notice("2 dakika içinde dışarı ışınlanacaksın. ")
alastor_dungeon.clear_all()
alastor_dungeon.clear_timers()
d.setf("level", 5)
server_timer("alastor_final", 120, d.get_map_index())
return
end
end

----------------------------------------------------------------
-- ANIT: 20612 üzerine 20600 bırak
----------------------------------------------------------------
when 20612.take with item.get_vnum()==20600 and alastor_dungeon.is_inside() and d.getf("level")==3 begin
pc.remove_item(20600, 1)
npc.kill()
d.notice("Kristal yok edildi! ")
d.notice("Alastor gelmesine 10 saniye kaldı! ")
d.setf("level", 4)
d.setf("alastor_timer", 10)
server_loop_timer("alastor_spawn_countdown", 1, d.get_map_index())
end

----------------------------------------------------------------
-- GERİ SAYIM + BOSS SPAWN
----------------------------------------------------------------
when alastor_spawn_countdown.server_timer begin
local s = alastor_dungeon.settings()
if not d.select(get_server_timer_arg()) then return end
local t = d.getf("alastor_timer")
if t > 1 then
t = t - 1
d.setf("alastor_timer", t)
d.notice(string.format("Alastor gelmesine son %d saniye. ", t))
else
clear_server_timer("alastor_spawn_countdown", get_server_timer_arg())
d.kill_all()
d.clear_regen()
d.spawn_mob_dir(s["alastor"], s["alastor_pos"][1], s["alastor_pos"][2], s["alastor_pos"][3])
d.notice("Lord Alastor ortaya çıktı! ")
end
end

----------------------------------------------------------------
-- ZAMAN UYARILARI
----------------------------------------------------------------
when alastor_20min.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Alastor Zindanı: 15 dakika kaldı! ")
server_timer("alastor_10min", 5*60, d.get_map_index())
end
end
when alastor_10min.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Alastor Zindanı: 10 dakika kaldı! ")
server_timer("alastor_5min", 5*60, d.get_map_index())
end
end
when alastor_5min.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Alastor Zindanı: 5 dakika kaldı! ")
server_timer("alastor_1min", 4*60, d.get_map_index())
end
end
when alastor_1min.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Alastor Zindanı: 1 dakika kaldı! ")
server_timer("alastor_0min", 60, d.get_map_index())
end
end
when alastor_0min.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Süre doldu, dışarı ışınlanıyorsun. ")
server_timer("alastor_final", 5, d.get_map_index())
end
end
when alastor_final.server_timer begin
if d.select(get_server_timer_arg()) then
d.exit_all()
end
end
end
end

buda questin iç kısmı yardımcı olanlar şimdiden teşekürler
 
En son bir moderatör tarafından düzenlenmiş:
Selamlar, yaşadığın sorunun 2 temel nedeni var:

1. Temel Neden: Server Core / MAP_ALLOW Eksikliği (En Önemlisi)
Zindan oluşturma fonksiyonu (d.new_jump), zindanın harita şablonunu (Map 175) o an NPC ile konuştuğun haritanın çalıştığı Core'un belleğinden (MAP_ALLOW) oluşturur.
- Eğer zindan haritan (175) sunucunda game99 veya başka bir core üzerinde açıksa, fakat bekçi NPC'sini 1. Köy'e (Core 1) çağırdıysan; Core 1'in CONFIG dosyasında 175 olmadığı için sunucu zindanı oluşturamaz (syserr.txt'ye cannot create dungeon 175 yazar) ve seni içeri çekmez.
- Çözüm: Bekçi NPC'sini hangi haritaya koyduysan, o haritanın çalıştığı kanal/core klasöründeki CONFIG dosyasını açıp MAP_ALLOW satırına zindanın indexi olan 175 numarasını ekle ve sunucuyu yeniden başlat (reboot).

2. Temel Neden: Quest Koordinat Hatası (* 100 Çift Çarpımı)
Questinin create_dungeon() fonksiyonundaki solo giriş kısmında d.new_jump(s["index"], s["warp"][1]*100, s["warp"][2]*100) yazılmış.
- Ayarlar kısmında ["warp"] = {12288, 12032} zaten x100'e bölünmüş global koordinattır.
- C++ tarafında d.new_jump fonksiyonu gelen sayıyı kendisi otomatik * 100 ile çarpar. Quest içinde tekrar * 100 yapıldığı için koordinat 122.880.000 gibi harita dışı geçersiz bir yere gider ve oyun ışınlanmayı iptal eder.

Aşağıda tüm düzeltmeleri yapılmış tam quest dosyası yer alıyor. Bunu kaydedip ./qc ile derlemen yeterlidir bi denersin sorun devam ederse müsait zamanda yardımcı olurum konuda bilgilendirirsin..

Lua (Quest):
Genişlet Daralt Kopyala
quest alastor_dungeon begin
    state start begin

        ----------------------------------------------------------------
        -- AYARLAR
        ----------------------------------------------------------------
        function settings()
            return {
                ["index"] = 175,
                ["warp"] = {12288, 12032},
                ["index_out"] = 170,
                ["out_pos"] = {11520, 12032},

                ["level_check"] = { ["min"] = 100, ["max"] = 120 },

                ["pass"] = 20600,
                ["Items"] = {30751, 20600, 30753},

                ["main_npc"] = 20602,
                ["main_npc_pos"] = {134, 148, 5},

                ["alastor"] = 20600,
                ["alastor_pos"] = {134, 101, 5},

                ["regen_wave1"] = "data/dungeon/alastor_dungeon/regen_1a.txt",
                ["regen_monuments"] = "data/dungeon/alastor_dungeon/regen_2a.txt",
                ["regen_slots2"] = "data/dungeon/alastor_dungeon/regen_2b.txt",

                ["slots2_total"] = 1, -- regen_2b.txt içeriğine göre
            }
        end

        ----------------------------------------------------------------
        -- YARDIMCI FONKSİYONLAR
        ----------------------------------------------------------------
        function party_get_member_pids()
            local pids = { party.get_member_pids() }
            return pids
        end

        function is_inside()
            local s = alastor_dungeon.settings()
            local mi = pc.get_map_index()
            return pc.in_dungeon() and mi >= s["index"]*10000 and mi < (s["index"]+1)*10000
        end

        function clear_all()
            d.clear_regen()
            d.kill_all()
        end

        function clear_timers()
            clear_server_timer("alastor_20min", get_server_timer_arg())
            clear_server_timer("alastor_10min", get_server_timer_arg())
            clear_server_timer("alastor_5min", get_server_timer_arg())
            clear_server_timer("alastor_1min", get_server_timer_arg())
            clear_server_timer("alastor_0min", get_server_timer_arg())
            clear_server_timer("alastor_final", get_server_timer_arg())
            clear_server_timer("alastor_spawn_countdown", get_server_timer_arg())
        end

        ----------------------------------------------------------------
        -- GİRİŞ KONTROLÜ (SOLO + PARTİ)
        ----------------------------------------------------------------
        function check_enter()
            local s = alastor_dungeon.settings()

            addimage(25, 10, "alastor_bg_01.tga")
            addimage(225, 150, "alastor_npc.tga")
            say(" ")
            say_title(mob_name(20601) .. " ")

            -- Solo cooldown kontrolü (partideyken de kişiye uygulanır)
            if (get_global_time() - pc.getf("alastor_dungeon","exit_alastor_dungeon_time")) < 60*60 then
                local remaining = pc.getf("alastor_dungeon","exit_alastor_dungeon_time") - get_global_time() + 60*60
                local dk = math.max(0, math.floor(remaining / 60))
                say("Tekrar zindana girebilmek için beklemelisin. ")
                say_reward("Kalan süre: "..dk.." dakika. ")
                return false
            end

            -- Parti ise toplu kontroller
            if party.is_party() then
                if not party.is_leader() then
                    say_reward("Yalnızca grup lideri giriş başlatabilir. ")
                    return false
                end
                if party.get_near_count() < 2 then
                    say_reward("Grubundaki oyuncular yakında olmalı (min. 2 kişi). ")
                    say("Eğer grubundaki oyuncular yanındaysa tekrar dene! ")
                    return false
                end

                local pids = alastor_dungeon.party_get_member_pids()
                local MemberLow, MemberHigh, MemberNoPass, MemberCooldown = {}, {}, {}, {}
                local level_ok, pass_ok, cd_ok = true, true, true

                for i, pid in next, pids do
                    q.begin_other_pc_block(pid)
                    local name = pc.get_name()
                    local last_exit = pc.getf("alastor_dungeon","exit_alastor_dungeon_time")
                    local diff = get_global_time() - last_exit

                    if diff < 60*60 then
                        local kalan = math.max(0, 60 - math.floor(diff/60))
                        table.insert(MemberCooldown, { name = name, minutes = kalan })
                        cd_ok = false
                    end
                    if pc.get_level() < s["level_check"]["min"] then table.insert(MemberLow, name) level_ok = false end
                    if pc.get_level() > s["level_check"]["max"] then table.insert(MemberHigh, name) level_ok = false end
                    if pc.count_item(s["pass"]) < 1 then table.insert(MemberNoPass, name) pass_ok = false end
                    q.end_other_pc_block()
                end

                if not cd_ok then
                    say_reward("Üzgünüm, grubundaki bazı oyuncuların soğuma süresi devam ediyor: ")
                    for i, data in next, MemberCooldown do
                        say(string.format("- %s (%d dk) ", data.name, data.minutes))
                    end
                    return false
                end
                if not level_ok then
                    say_reward("Bazı grup üyeleri seviye şartını sağlamıyor: ")
                    for i, n in next, MemberLow do say_title("- "..n.." ") end
                    for i, n in next, MemberHigh do say_title("- "..n.." ") end
                    return false
                end
                if not pass_ok then
                    say_reward("Bazı üyelerde giriş eşyası eksik: ")
                    say_item("Alastor Sihirli Taşı ", s["pass"], " ")
                    for i, n in next, MemberNoPass do say_title("- "..n.." ") end
                    return false
                end
                return true
            end

            -- Solo ise seviye ve item kontrol
            if pc.get_level() < s["level_check"]["min"] then
                say("En az "..s["level_check"]["min"].." seviye olmalısın. ")
                return false
            end
            if pc.get_level() > s["level_check"]["max"] then
                say("En fazla "..s["level_check"]["max"].." seviye ile girebilirsin. ")
                return false
            end
            if pc.count_item(s["pass"]) < 1 then
                say_item("Donmuş Anahtar ", s["pass"], " ")
                say("Eşya eksik! ")
                return false
            end

            return true
        end

        ----------------------------------------------------------------
        -- DUNGEON OLUŞTURMA + COOLDOWN DAĞITIMI (LİDER DAHİL)
        ----------------------------------------------------------------
        function create_dungeon()
            local s = alastor_dungeon.settings()

            if party.is_party() then
                local leader_pid = party.get_leader_pid()

                -- Lider (aktif pc)
                pc.remove_item(s["pass"], 1)
                pc.setf("alastor_dungeon","exit_alastor_dungeon_time", get_global_time())
                pc.setqf("alastor_dungeon", get_time() + 3600)

                -- Diğer üyeler
                local pids = alastor_dungeon.party_get_member_pids()
                for i, pid in next, pids do
                    if pid ~= leader_pid then
                        q.begin_other_pc_block(pid)
                        pc.remove_item(s["pass"], 1)
                        pc.setf("alastor_dungeon","exit_alastor_dungeon_time", get_global_time())
                        pc.setqf("alastor_dungeon", get_time() + 3600)
                        q.end_other_pc_block()
                    end
                end

                d.new_jump_party(s["index"], s["warp"][1], s["warp"][2])
            else
                -- Solo (Düzeltildi: *100 kaldırıldı)
                pc.remove_item(s["pass"], 1)
                d.new_jump(s["index"], s["warp"][1], s["warp"][2])
                pc.setf("alastor_dungeon","exit_alastor_dungeon_time", get_global_time())
                pc.setqf("alastor_dungeon", get_time() + 3600)
            end

            d.spawn_mob_dir(s["main_npc"], s["main_npc_pos"][1], s["main_npc_pos"][2], s["main_npc_pos"][3])
            d.setf("level", 1)
            server_timer("alastor_20min", 5*60, d.get_map_index())
        end

        ----------------------------------------------------------------
        -- GİRİŞ DİYALOĞU
        ----------------------------------------------------------------
        when 20601.chat."Kuzey Rüzgarı Derinlikleri (Kolay) " with not alastor_dungeon.is_inside() begin
            addimage(25, 10, "alastor_bg_01.tga")
            addimage(225, 150, "alastor_npc.tga")
            say(" ")
            say_title(mob_name(20601) .. " ")
            say("Zindana girmek ister misin? ")
            if alastor_dungeon.check_enter() then
                say_reward("Hazırlan, zindana giriş yapılıyor... ")
                wait()
                alastor_dungeon.create_dungeon()
            end
        end

        ----------------------------------------------------------------
        -- LOGIN (DIŞARI WARP KONUMU)
        ----------------------------------------------------------------
        when login with alastor_dungeon.is_inside() begin
            local s = alastor_dungeon.settings()
            d.set_warp_location(s["index_out"], s["out_pos"][1], s["out_pos"][2])
        end

        ----------------------------------------------------------------
        -- GM RESET
        ----------------------------------------------------------------
        when 20601.chat."GM: Zaman sıfırlama (Kolay) " with pc.is_gm() and not alastor_dungeon.is_inside() begin
            addimage(25, 10, "alastor_bg_01.tga")
            say_title(mob_name(20601) .. " ")
            if select("Zamanı sıfırla ","Kapat ") == 1 then
                pc.setf("alastor_dungeon","exit_alastor_dungeon_time", 0)
                say("Zaman sıfırlandı. ")
            end
        end

        ----------------------------------------------------------------
        -- 1. AŞAMA: Yumurtadan başlat
        ----------------------------------------------------------------
        when 20602.chat."Çabuk olmalısın! " with alastor_dungeon.is_inside() and d.getf("level")==1 begin
            addimage(25, 10, "alastor_bg_02.tga")
            addimage(225, 150, "alastor_npc.tga")
            say(" ")
            say_title("Beyaz Ejderha Yumurtası ")
            say("Zindanı başlatmak istiyor musun? ")
            if select("Evet ","Hayır ") == 1 then
                npc.purge()
                d.setf("level", 2)
                d.setf("wave1_kill", 0)
                d.notice("Alastor Zindanı: İlk dalga başladı! ")
                d.notice("Tüm yaratıkları öldür! ")
                d.regen_file(alastor_dungeon.settings()["regen_wave1"])
            end
        end

        ----------------------------------------------------------------
        -- KILL LOGİĞİ
        ----------------------------------------------------------------
        when kill with alastor_dungeon.is_inside() and not npc.is_pc() begin
            local s = alastor_dungeon.settings()
            local race = npc.get_race()

            -- 1. DALGA: 40 yaratık
            if d.getf("level") == 2 then
                if race == 20604 or race == 20605 or race == 20606 or race == 20607 then
                    d.setf("wave1_kill", d.getf("wave1_kill") + 1)
                    local remain = 70 - d.getf("wave1_kill")
                    if remain > 0 then
                        d.notice("Kalan yaratık: " .. remain .. " / 70 ")
                    else
                        d.setf("level", 3)
                        d.setf("slots2_kill", 0)
                        d.setf("slots2_drop_done", 0)
                        d.setf("monuments", 0)
                        alastor_dungeon.clear_all()
                        d.regen_file(s["regen_monuments"])
                        d.regen_file(s["regen_slots2"])
                        d.notice("Tüm slotları öldürdün! ")
                        d.notice("Kuzey Rüzgarı Kristali ortaya çıktı ve Zula Savaş Reisi geldi! ")
                        d.notice("Zula Savaşı Reisi'ni Yok et ve Donmuş Anahtarı elde et! ")
                    end
                end
                return
            end

            -- 2. DALGA: Anıt koruyucuları (109)
            if d.getf("level") == 3 then
                if race == 20611 then
                    d.setf("slots2_kill", d.getf("slots2_kill") + 1)
                    local k = d.getf("slots2_kill")
                    if k >= s["slots2_total"] and d.getf("slots2_drop_done") == 0 then
                        game.drop_item(s["Items"][2], 1)
                        d.setf("slots2_drop_done", 1)
                        d.notice("Tüm koruyucular yok edildi! Donmuş Anahtar düştü! ")
                        say("Zula Savaş Reisi'ni katlettin! ")
                        say("Düşürdüğün donmuş anahtarı Kuzey Rüzgarı Kristaline sürükle. ")
                    else
                        d.notice(string.format("Anıt koruyucusu öldürüldü (%d / %d) ", k, s["slots2_total"]))
                    end
                end
                return
            end

            -- BOSS öldürülürse
            if d.getf("level") == 4 and race == s["alastor"] then
                d.notice("Tebrikler! Alastor'u yendin! ")
                d.notice("2 dakika içinde dışarı ışınlanacaksın. ")
                alastor_dungeon.clear_all()
                alastor_dungeon.clear_timers()
                d.setf("level", 5)
                server_timer("alastor_final", 120, d.get_map_index())
                return
            end
        end

        ----------------------------------------------------------------
        -- ANIT: 20612 üzerine 20600 bırak
        ----------------------------------------------------------------
        when 20612.take with item.get_vnum()==20600 and alastor_dungeon.is_inside() and d.getf("level")==3 begin
            pc.remove_item(20600, 1)
            npc.kill()
            d.notice("Kristal yok edildi! ")
            d.notice("Alastor gelmesine 10 saniye kaldı! ")
            d.setf("level", 4)
            d.setf("alastor_timer", 10)
            server_loop_timer("alastor_spawn_countdown", 1, d.get_map_index())
        end

        ----------------------------------------------------------------
        -- GERİ SAYIM + BOSS SPAWN
        ----------------------------------------------------------------
        when alastor_spawn_countdown.server_timer begin
            local s = alastor_dungeon.settings()
            if not d.select(get_server_timer_arg()) then return end
            local t = d.getf("alastor_timer")
            if t > 1 then
                t = t - 1
                d.setf("alastor_timer", t)
                d.notice(string.format("Alastor gelmesine son %d saniye. ", t))
            else
                clear_server_timer("alastor_spawn_countdown", get_server_timer_arg())
                d.kill_all()
                d.clear_regen()
                d.spawn_mob_dir(s["alastor"], s["alastor_pos"][1], s["alastor_pos"][2], s["alastor_pos"][3])
                d.notice("Lord Alastor ortaya çıktı! ")
            end
        end

        ----------------------------------------------------------------
        -- ZAMAN UYARILARI
        ----------------------------------------------------------------
        when alastor_20min.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("Alastor Zindanı: 15 dakika kaldı! ")
                server_timer("alastor_10min", 5*60, d.get_map_index())
            end
        end
        when alastor_10min.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("Alastor Zindanı: 10 dakika kaldı! ")
                server_timer("alastor_5min", 5*60, d.get_map_index())
            end
        end
        when alastor_5min.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("Alastor Zindanı: 5 dakika kaldı! ")
                server_timer("alastor_1min", 4*60, d.get_map_index())
            end
        end
        when alastor_1min.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("Alastor Zindanı: 1 dakika kaldı! ")
                server_timer("alastor_0min", 60, d.get_map_index())
            end
        end
        when alastor_0min.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("Süre doldu, dışarı ışınlanıyorsun. ")
                server_timer("alastor_final", 5, d.get_map_index())
            end
        end
        when alastor_final.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.exit_all()
            end
        end
    end
end
 
Geri
Üst