Tek Katlı Solo Dungeon Quest -

  • Konuyu açan Konuyu açan Raviel
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 5
  • Gösterim Gösterim 193

Raviel

Premium Üye
Premium Üye
MT Üye
Mesaj
182
Çözümler
3
Beğeni
149
Puan
764
Ticaret Puanı
0
Merhaba arkadaşlar,
Geçenlerde @CagiBoi adlı arkadaşımızın yardım konusu üzerine baya oturdum merak ettiğim ve yapay zekanın hünerlerini test etmek için giriştim bu olaya. Sanırım paylaşılan questler hep farklı ve işlevi olmayan questlerdi. Bu yaptığım Quest tamamen solo oyuncular için, direkt olarak boss odasına ışınlayan ve dungeonı başlatan sadece Boss'u kestiğiniz mob olmayan bir versiyonu. Razador Questi üzerinden örnek alarak yapay zekaya yazdırdım. Baya bir uğraştırdı insanın gerçekten bilgisi olmayınca aşırı zor oluyor....



Ayrıca quest'i eklerken core dumped vermemesi için kullandığım kodlarda bunlar:
bash:
Genişlet Daralt Kopyala
sed -i '' -e 's/\r$//' pre_qc/flame_dungeon_solo.quest
cd /usr/home/main/share/locale/europe/quest
./qc pre_qc/flame_dungeon_solo.quest


flame_dungeon_solo:
Genişlet Daralt Kopyala
------------------------------------------------------------------
--  Flame Dungeon – Tek Kat (Solo)           v1.0
--  • NPC 20394  • Bilet 71095  • Harita 351
--  • Cool-down YOK   • Süre 15 dk   • Boss vnum 6091
------------------------------------------------------------------
quest flame_dungeon_solo begin
    state start begin
    --------------------------------------------------------------
        -- ► NPC diyaloğu / bilet kontrolü / giriş
        when 20394.chat."Alev Zindanı (Solo)" begin
            if party.is_party() then
                say("Grup lideri zindana tek başına girmelidir.")
                return
            end
            if not pc.can_warp() then
                say("Şu anda ışınlanamazsın.")
                return
            end
            if pc.get_level() < 100 or pc.get_level() > 120 then
                 say("Bu zindana girebilmek için seviyen 100 ile 120 arasında olmalıdır.")
                 return
            end
            if pc.count_item(71095) < 1 then
                say("Giriş için gerekli olan Alev Geçidi Biletin yok.")
                return
            end

            say_title("Zindan Bilgilendirmesi:")
            say("Zindanda sadece boss bulunur ve 15 dakikan var.")
            say("Girmek istiyor musun?")
            local s = select("Evet", "Hayır")
            if s == 2 then return end

            pc.remove_item(71095, 1)
            -- d.new_jump(map, x*100, y*100) ile solo instance oluştur ve ışınla
            d.new_jump(351, 8109 * 100, 6867 * 100)
            -- pc.get_id() kullanımı kaldırıldı
            -- 2 saniye sonra zindanı başlat (zindan map index'i ile)
            server_timer("fds_init", 2, d.get_map_index())
        end
    --------------------------------------------------------------
        -- ► Zindan başlangıcı: Boss doğurma ve süre başlatma
        when fds_init.server_timer begin
            local map_idx = get_server_timer_arg()
            -- Zindan map indexi geçerli mi kontrol et
            if map_idx >= 3510000 then
                -- Zindan örneğini seç
                if d.select(map_idx) then
                     -- Yaratık regenini kapat
                     d.set_regen_file("")

                    -- Boss'u (Razador) belirtilen koordinatlarda doğur (dungeon context)
                    d.spawn_mob(6091, 686, 637)

                    -- Bitiş zamanını zindan flag'ı olarak ayarla
                    d.setf("end_time", get_global_time() + 900)
                    notice_all("[Alev Zindanı] Boss ortaya çıktı! Onu yenmek için 15 dakikan var.")
                    -- Periyodik uyarı/kontrol zamanlayıcısını başlat (zindan map index'i ile)
                    server_loop_timer("fds_warn_check", 300, map_idx)
                else
                    -- d.select(map_idx) başarısız olursa logla
                    syschat("Solo Alev Zindanı: Zindan örneği seçilemedi (fds_init): "..map_idx)
                     -- Oyuncuyu bulmak zor olabilir, bu yüzden genel bir çıkış denenir
                     -- Belki bu durumda oyuncuyu direkt ışınlamak daha güvenli olabilir?
                     -- Şimdilik d.select hatasını loglamakla yetinelim.
                end
            else
                -- Geçici map indexi alınamadıysa logla
                syschat("Solo Alev Zindanı: Geçici map indexi alınamadı (fds_init): "..map_idx)
                -- Hata durumunda oyuncuyu manuel bulup ışınlamak gerekebilir, ama pc.get_id olmadığı için zor.
            end
             -- pc.select(pid) mantığı kaldırıldı
        end
    --------------------------------------------------------------
        -- ► Süre uyarıları ve zaman aşımı kontrolü
        when fds_warn_check.server_timer begin
            local map_idx = get_server_timer_arg()
            -- Zindan örneğini seç
            if not d.select(map_idx) then
                clear_server_timer("fds_warn_check", map_idx)
                return
            end

            -- Bitiş zamanını zindan flag'ından al
            local end_time = d.getf("end_time")
            if end_time == 0 then return end -- Bitiş süresi yoksa çık
            local remain_time = end_time - get_global_time()

            if remain_time <= 0 then
                -- Süre doldu
                clear_server_timer("fds_warn_check", map_idx) -- Uyarı timer'ını temizle
                notice_all("[Alev Zindanı] Süren doldu! Zindandan çıkarılıyorsun.")
                -- 10 saniye sonra çıkarma işlemini başlat (zindan map index'i ile)
                server_timer("fds_kick_timeout", 10, map_idx)
            elseif remain_time <= 60 then
                notice_all("[Alev Zindanı] Son 1 dakika!")
            elseif remain_time <= 300 then
                notice_all("[Alev Zindanı] Son 5 dakika!")
            end
        end
    --------------------------------------------------------------
        -- ► Süre dolunca oyuncuyu dışarı ışınla
        when fds_kick_timeout.server_timer begin
            local map_idx = get_server_timer_arg()
            -- Zindan örneğini seç
            if d.select(map_idx) then
                -- Çıkış yerini ayarla (Map Index 62)
                d.set_warp_location(62, 6142, 7068)
                -- Zindandaki herkesi (bu durumda tek oyuncu) ayarlanmış yere ışınla
                d.exit_all()
                -- pc.warp ve bayrak kontrolü kaldırıldı
            end
        end
    --------------------------------------------------------------
        -- ► Boss yenildiğinde
        when 6091.kill begin
             -- Boss'un kesildiği zindan örneğini al
             local map_idx = d.get_map_index()
             -- Zindan map index'i geçerli mi kontrol et (emin olmak için)
             if map_idx >= 3510000 then -- Geçici map indexleri genellikle ana index * 10000 ile başlar
                 clear_server_timer("fds_warn_check", map_idx) -- Uyarı timer'ını temizle
                 notice_all("[Alev Zindanı] Tebrikler! Boss'u yendin. 60 saniye sonra dışarı çıkarılacaksın.")
                 -- 60 saniye sonra çıkış işlemini başlat (zindan map index'i ile)
                 server_timer("fds_exit_success", 60, map_idx)
                 -- Ödül verme işlemleri buraya eklenebilir (d.spawn_item vb.)
            end
             -- Oyuncu bayrak kontrolü kaldırıldı
        end

        -- ► Boss yenildikten sonra oyuncuyu dışarı ışınla
        when fds_exit_success.server_timer begin
             local map_idx = get_server_timer_arg()
             -- Zindan örneğini seç
            if d.select(map_idx) then
                -- Çıkış yerini ayarla (Map Index 62)
                d.set_warp_location(62, 6142, 7068)
                -- Zindandaki herkesi (bu durumda tek oyuncu) ayarlanmış yere ışınla
                d.exit_all()
                -- pc.warp ve bayrak kontrolü kaldırıldı
            end
        end
    --------------------------------------------------------------
    end -- state start end
end -- quest end
Başka Zindana Uyarlama (Kısaca):
  • Giriş: d.new_jump(YENI_MAP, GIRIS_X * 100, GIRIS_Y * 100)
  • Map Index Kontrolü: if map_idx >= YENI_MAP * 10000 then
  • Boss/Moblar: d.spawn_mob(YENI_VNUM, BOSS_X, BOSS_Y) ve when YENI_VNUM.kill
  • Çıkış: d.set_warp_location(CIKIS_MAP, CIKIS_X, CIKIS_Y) (Burada koordinatları çarpmayın!)
  • Diğer: NPC, Bilet, Seviye, Süre, Metinler, Zamanlayıcı isimleri.
Önemli: Zindan işlemlerini (d.select, d.spawn_mob vb.) server_timer içinde yapmak, d.new_jump sonrası zindan örneğinin hazır olmasını beklemek için daha güvenlidir.Umarım işinize yarar!
 
Son düzenleme:
test edildi soğuma süresinde sıkıntılar olabilir süre aktifken içeri alıyor akşam pcye geçince bende bakarım ama senin de haberin olsun
 
test edildi soğuma süresinde sıkıntılar olabilir süre aktifken içeri alıyor akşam pcye geçince bende bakarım ama senin de haberin olsun
Geribildirim için teşekkür ederim. Süreyle hiç test etmedim. Bilgisayara geçtiğimde süreyle alakalıda testler yapıcam gerekirse konuya eklryeyim. Şu an ki halinde cooldown yok.
 
test edildi soğuma süresinde sıkıntılar olabilir süre aktifken içeri alıyor akşam pcye geçince bende bakarım ama senin de haberin olsun
1745944036685.webp


Yeni Cooldown ekli versiyon ancak henüz Türkçe karakter sorunlarını çözemedim. Orasıda size kalmış :) Ayrıca şunu belirtmeliyim ki Cooldown oyuncu bossu kestiği an başlar, oyuncu zindan süresini bitiremediğinde ve dışarı atıldığında başlar, oyuncu logout olduğunda cooldown süresi başlar. Logout kontrolünü değiştirip sadece zindan bittiğinde cooldown'a sokabiliriz ancak henüz o konuda kafamda tam nasıl yapacağım konusu oturmadı. Ayrıca bunlara bakarken "Kaldığın yerden devam et" sisteminide ekleyecektim ama maalesef internette bulduğum şeylerin çoğu ve Metin2'nin kendi quest fonksiyonları mevcut zindanı solo oyuncu için kaydetmeme ve bundan devam etmesine izin vermiyor. Bütün kodlar hep solo oyuncu için yeni bir dungeon oluşturmak üzerine mevcuttan devam etme üzerine değil. Buda oyuncunun sürekli sıfırdan başlaması anlamına gelir. Yalnızca party_member fonksiyonları bir dungeon instance'ını alıyor ve devam ettiriyor. Buda zaten fonksiyonlarla destekleniyor.


Cooldown flame_dungeon_solo tek kat:
Genişlet Daralt Kopyala
-- Tanımlar quest bloğunun dışına, en başa taşındı.
-- Bekleme süresi (saniye cinsinden)
-- COOLDOWN_DURATION = 1800 -- 30 dakika - Kaldırıldı, yerine 1800 kullanılacak

-- Kalan süreyi dakika cinsinden hesaplayan yardımcı fonksiyon
-- function get_remaining_cooldown_minutes(flag_name) ... - Kaldırıldı, fonksiyon state içine taşınacak

------------------------------------------------------------------
--  Flame Dungeon – Tek Kat (Solo)           v1.1 (Cooldown Eklendi)
--  • NPC 20394  • Bilet 71095  • Harita 351
--  • Cool-down 30 dk • Süre 15 dk   • Boss vnum 6091
------------------------------------------------------------------
quest flame_dungeon_solo begin
    state start begin
        -- Kalan süreyi dakika cinsinden hesaplayan yardımcı fonksiyon - State başına taşındı
        function get_remaining_cooldown_minutes(flag_name)
            local cooldown_end_time = pc.getqf(flag_name)
            if cooldown_end_time == 0 then return 0 end -- Cooldown yoksa 0 döndür
            local remaining_seconds = cooldown_end_time - get_global_time()
            if remaining_seconds <= 0 then return 0 end -- Süre dolmuşsa 0 döndür
            return math.ceil(remaining_seconds / 60) -- Kalan dakikayı yukarı yuvarla
        end

        -- COOLDOWN_DURATION sabiti kaldırıldı, yerine 1800 kullanılacak.

    --------------------------------------------------------------
        -- ► NPC diyaloğu / bilet kontrolü / giriş
        when 20394.chat."Alev Zindanı (Solo)" begin
            -- Cooldown kontrolü (flag ismi: "quest_adı.exit_time")
            local remain_cd = flame_dungeon_solo.get_remaining_cooldown_minutes("flame_dungeon_solo.exit_time")
            if remain_cd > 0 then
                say_title("Bekleme Süresi")
                say("Bu zindana tekrar girebilmek için henüz erken.")
                say_reward(string.format("Kalan süre: %d dakika", remain_cd))
                return
            end

            if party.is_party() then
                say("Grup lideri zindana tek başına girmelidir.")
                return
            end
            if not pc.can_warp() then
                say("Şu anda ışınlanamazsın.")
                return
            end
            if pc.get_level() < 100 or pc.get_level() > 120 then
                 say("Bu zindana girebilmek için seviyen 100 ile 120 arasında olmalıdır.")
                 return
            end
            if pc.count_item(71095) < 1 then
                say("Giriş için gerekli olan Alev Geçidi Biletin yok.")
                return
            end

            say_title("Zindan Bilgilendirmesi:")
            say("Zindanda sadece boss bulunur ve 15 dakikan var.")
            say("Girmek istiyor musun?")
            local s = select("Evet", "Hayır")
            if s == 2 then return end

            pc.remove_item(71095, 1)
            -- d.new_jump(map, x*100, y*100) ile solo instance oluştur ve ışınla
            d.new_jump(351, 8109 * 100, 6867 * 100)
            -- pc.get_id() kullanımı kaldırıldı
            -- 2 saniye sonra zindanı başlat (zindan map index'i ile)
            server_timer("fds_init", 2, d.get_map_index())
        end
    --------------------------------------------------------------
        -- ► Zindan başlangıcı: Boss doğurma ve süre başlatma
        when fds_init.server_timer begin
            local map_idx = get_server_timer_arg()
            -- Zindan map indexi geçerli mi kontrol et
            if map_idx >= 3510000 then
                -- Zindan örneğini seç
                if d.select(map_idx) then
                     -- Yaratık regenini kapat
                     d.set_regen_file("")

                    -- Boss'u (Razador) belirtilen koordinatlarda doğur (dungeon context)
                    d.spawn_mob(6091, 686, 637)

                    -- Bitiş zamanını zindan flag'ı olarak ayarla
                    d.setf("end_time", get_global_time() + 900)
                    notice_all("[Alev Zindanı] Boss ortaya çıktı! Onu yenmek için 15 dakikan var.")
                    -- Periyodik uyarı/kontrol zamanlayıcısını başlat (zindan map index'i ile)
                    server_loop_timer("fds_warn_check", 300, map_idx)
                else
                    -- d.select(map_idx) başarısız olursa logla
                    syschat("Solo Alev Zindanı: Zindan örneği seçilemedi (fds_init): "..map_idx)
                     -- Oyuncuyu bulmak zor olabilir, bu yüzden genel bir çıkış denenir
                     -- Belki bu durumda oyuncuyu direkt ışınlamak daha güvenli olabilir?
                     -- Şimdilik d.select hatasını loglamakla yetinelim.
                end
            else
                -- Geçici map indexi alınamadıysa logla
                syschat("Solo Alev Zindanı: Geçici map indexi alınamadı (fds_init): "..map_idx)
                -- Hata durumunda oyuncuyu manuel bulup ışınlamak gerekebilir, ama pc.get_id olmadığı için zor.
            end
             -- pc.select(pid) mantığı kaldırıldı
        end
    --------------------------------------------------------------
        -- ► Süre uyarıları ve zaman aşımı kontrolü
        when fds_warn_check.server_timer begin
            local map_idx = get_server_timer_arg()
            -- Zindan örneğini seç
            if not d.select(map_idx) then
                clear_server_timer("fds_warn_check", map_idx)
                return
            end

            -- Bitiş zamanını zindan flag'ından al
            local end_time = d.getf("end_time")
            if end_time == 0 then return end -- Bitiş süresi yoksa çık
            local remain_time = end_time - get_global_time()

            if remain_time <= 0 then
                -- Süre doldu
                clear_server_timer("fds_warn_check", map_idx) -- Uyarı timer'ını temizle
                notice_all("[Alev Zindanı] Süren doldu! Zindandan çıkarılıyorsun.")
                -- 10 saniye sonra çıkarma işlemini başlat (zindan map index'i ile)
                server_timer("fds_kick_timeout", 10, map_idx)
            elseif remain_time <= 60 then
                notice_all("[Alev Zindanı] Son 1 dakika!")
            elseif remain_time <= 300 then
                notice_all("[Alev Zindanı] Son 5 dakika!")
            end
        end
    --------------------------------------------------------------
        -- ► Süre dolunca oyuncuyu dışarı ışınla
        when fds_kick_timeout.server_timer begin
            local map_idx = get_server_timer_arg()
            if d.select(map_idx) then
                -- Cooldown'u doğrudan ayarla
                pc.setqf("flame_dungeon_solo.exit_time", get_global_time() + 1800)

                d.set_warp_location(62, 6142, 7068)
                d.exit_all()
            end
        end
    --------------------------------------------------------------
        -- ► Boss yenildiğinde (Cooldown hemen başlar!)
        when 6091.kill begin
             local map_idx = d.get_map_index()
             if map_idx >= 3510000 then
                 -- Cooldown'u HEMEN ayarla (Oyuncu bağlamında olduğumuz için pc.setqf)
                 pc.setqf("flame_dungeon_solo.exit_time", get_global_time() + 1800) -- COOLDOWN_DURATION yerine 1800

                 clear_server_timer("fds_warn_check", map_idx) -- Uyarı timer'ını temizle
                 notice_all("[Alev Zindanı] Tebrikler! Boss'u yendin. 60 saniye sonra dışarı çıkarılacaksın.")
                 server_timer("fds_exit_success", 60, map_idx)
            end
             -- Ödül verme vs. buraya eklenebilir
        end

        -- ► Boss yenildikten sonra oyuncuyu dışarı ışınla
        when fds_exit_success.server_timer begin
             local map_idx = get_server_timer_arg()
            if d.select(map_idx) then
                -- Cooldown burada AYARLANMAZ
                d.set_warp_location(62, 6142, 7068)
                d.exit_all()
            end
        end
    --------------------------------------------------------------
        -- ► Oyuncu oyundan çıktığında (Cooldown HEMEN başlar)
        when logout begin
            local map_idx = pc.get_map_index()
            if map_idx >= 3510000 then
                -- Cooldown bitiş zamanını HEMEN ayarla
                pc.setqf("flame_dungeon_solo.exit_time", get_global_time() + 1800)
            end
        end

    --------------------------------------------------------------
    end -- state start end
end -- quest end
 
Son düzenleme:
23178 eklentisini görüntüle

Yeni Cooldown ekli versiyon ancak henüz Türkçe karakter sorunlarını çözemedim. Orasıda size kalmış :) Ayrıca şunu belirtmeliyim ki Cooldown oyuncu bossu kestiği an başlar, oyuncu zindan süresini bitiremediğinde ve dışarı atıldığında başlar, oyuncu logout olduğunda cooldown süresi başlar. Logout kontrolünü değiştirip sadece zindan bittiğinde cooldown'a sokabiliriz ancak henüz o konuda kafamda tam nasıl yapacağım konusu oturmadı. Ayrıca bunlara bakarken "Kaldığın yerden devam et" sisteminide ekleyecektim ama maalesef internette bulduğum şeylerin çoğu ve Metin2'nin kendi quest fonksiyonları mevcut zindanı solo oyuncu için kaydetmeme ve bundan devam etmesine izin vermiyor. Bütün kodlar hep solo oyuncu için yeni bir dungeon oluşturmak üzerine mevcuttan devam etme üzerine değil. Buda oyuncunun sürekli sıfırdan başlaması anlamına gelir. Yalnızca party_member fonksiyonları bir dungeon instance'ını alıyor ve devam ettiriyor. Buda zaten fonksiyonlarla destekleniyor.


Cooldown flame_dungeon_solo tek kat:
Genişlet Daralt Kopyala
-- Tanımlar quest bloğunun dışına, en başa taşındı.
-- Bekleme süresi (saniye cinsinden)
-- COOLDOWN_DURATION = 1800 -- 30 dakika - Kaldırıldı, yerine 1800 kullanılacak

-- Kalan süreyi dakika cinsinden hesaplayan yardımcı fonksiyon
-- function get_remaining_cooldown_minutes(flag_name) ... - Kaldırıldı, fonksiyon state içine taşınacak

------------------------------------------------------------------
--  Flame Dungeon – Tek Kat (Solo)           v1.1 (Cooldown Eklendi)
--  • NPC 20394  • Bilet 71095  • Harita 351
--  • Cool-down 30 dk • Süre 15 dk   • Boss vnum 6091
------------------------------------------------------------------
quest flame_dungeon_solo begin
    state start begin
        -- Kalan süreyi dakika cinsinden hesaplayan yardımcı fonksiyon - State başına taşındı
        function get_remaining_cooldown_minutes(flag_name)
            local cooldown_end_time = pc.getqf(flag_name)
            if cooldown_end_time == 0 then return 0 end -- Cooldown yoksa 0 döndür
            local remaining_seconds = cooldown_end_time - get_global_time()
            if remaining_seconds <= 0 then return 0 end -- Süre dolmuşsa 0 döndür
            return math.ceil(remaining_seconds / 60) -- Kalan dakikayı yukarı yuvarla
        end

        -- COOLDOWN_DURATION sabiti kaldırıldı, yerine 1800 kullanılacak.

    --------------------------------------------------------------
        -- ► NPC diyaloğu / bilet kontrolü / giriş
        when 20394.chat."Alev Zindanı (Solo)" begin
            -- Cooldown kontrolü (flag ismi: "quest_adı.exit_time")
            local remain_cd = flame_dungeon_solo.get_remaining_cooldown_minutes("flame_dungeon_solo.exit_time")
            if remain_cd > 0 then
                say_title("Bekleme Süresi")
                say("Bu zindana tekrar girebilmek için henüz erken.")
                say_reward(string.format("Kalan süre: %d dakika", remain_cd))
                return
            end

            if party.is_party() then
                say("Grup lideri zindana tek başına girmelidir.")
                return
            end
            if not pc.can_warp() then
                say("Şu anda ışınlanamazsın.")
                return
            end
            if pc.get_level() < 100 or pc.get_level() > 120 then
                 say("Bu zindana girebilmek için seviyen 100 ile 120 arasında olmalıdır.")
                 return
            end
            if pc.count_item(71095) < 1 then
                say("Giriş için gerekli olan Alev Geçidi Biletin yok.")
                return
            end

            say_title("Zindan Bilgilendirmesi:")
            say("Zindanda sadece boss bulunur ve 15 dakikan var.")
            say("Girmek istiyor musun?")
            local s = select("Evet", "Hayır")
            if s == 2 then return end

            pc.remove_item(71095, 1)
            -- d.new_jump(map, x*100, y*100) ile solo instance oluştur ve ışınla
            d.new_jump(351, 8109 * 100, 6867 * 100)
            -- pc.get_id() kullanımı kaldırıldı
            -- 2 saniye sonra zindanı başlat (zindan map index'i ile)
            server_timer("fds_init", 2, d.get_map_index())
        end
    --------------------------------------------------------------
        -- ► Zindan başlangıcı: Boss doğurma ve süre başlatma
        when fds_init.server_timer begin
            local map_idx = get_server_timer_arg()
            -- Zindan map indexi geçerli mi kontrol et
            if map_idx >= 3510000 then
                -- Zindan örneğini seç
                if d.select(map_idx) then
                     -- Yaratık regenini kapat
                     d.set_regen_file("")

                    -- Boss'u (Razador) belirtilen koordinatlarda doğur (dungeon context)
                    d.spawn_mob(6091, 686, 637)

                    -- Bitiş zamanını zindan flag'ı olarak ayarla
                    d.setf("end_time", get_global_time() + 900)
                    notice_all("[Alev Zindanı] Boss ortaya çıktı! Onu yenmek için 15 dakikan var.")
                    -- Periyodik uyarı/kontrol zamanlayıcısını başlat (zindan map index'i ile)
                    server_loop_timer("fds_warn_check", 300, map_idx)
                else
                    -- d.select(map_idx) başarısız olursa logla
                    syschat("Solo Alev Zindanı: Zindan örneği seçilemedi (fds_init): "..map_idx)
                     -- Oyuncuyu bulmak zor olabilir, bu yüzden genel bir çıkış denenir
                     -- Belki bu durumda oyuncuyu direkt ışınlamak daha güvenli olabilir?
                     -- Şimdilik d.select hatasını loglamakla yetinelim.
                end
            else
                -- Geçici map indexi alınamadıysa logla
                syschat("Solo Alev Zindanı: Geçici map indexi alınamadı (fds_init): "..map_idx)
                -- Hata durumunda oyuncuyu manuel bulup ışınlamak gerekebilir, ama pc.get_id olmadığı için zor.
            end
             -- pc.select(pid) mantığı kaldırıldı
        end
    --------------------------------------------------------------
        -- ► Süre uyarıları ve zaman aşımı kontrolü
        when fds_warn_check.server_timer begin
            local map_idx = get_server_timer_arg()
            -- Zindan örneğini seç
            if not d.select(map_idx) then
                clear_server_timer("fds_warn_check", map_idx)
                return
            end

            -- Bitiş zamanını zindan flag'ından al
            local end_time = d.getf("end_time")
            if end_time == 0 then return end -- Bitiş süresi yoksa çık
            local remain_time = end_time - get_global_time()

            if remain_time <= 0 then
                -- Süre doldu
                clear_server_timer("fds_warn_check", map_idx) -- Uyarı timer'ını temizle
                notice_all("[Alev Zindanı] Süren doldu! Zindandan çıkarılıyorsun.")
                -- 10 saniye sonra çıkarma işlemini başlat (zindan map index'i ile)
                server_timer("fds_kick_timeout", 10, map_idx)
            elseif remain_time <= 60 then
                notice_all("[Alev Zindanı] Son 1 dakika!")
            elseif remain_time <= 300 then
                notice_all("[Alev Zindanı] Son 5 dakika!")
            end
        end
    --------------------------------------------------------------
        -- ► Süre dolunca oyuncuyu dışarı ışınla
        when fds_kick_timeout.server_timer begin
            local map_idx = get_server_timer_arg()
            if d.select(map_idx) then
                -- Cooldown'u doğrudan ayarla
                pc.setqf("flame_dungeon_solo.exit_time", get_global_time() + 1800)

                d.set_warp_location(62, 6142, 7068)
                d.exit_all()
            end
        end
    --------------------------------------------------------------
        -- ► Boss yenildiğinde (Cooldown hemen başlar!)
        when 6091.kill begin
             local map_idx = d.get_map_index()
             if map_idx >= 3510000 then
                 -- Cooldown'u HEMEN ayarla (Oyuncu bağlamında olduğumuz için pc.setqf)
                 pc.setqf("flame_dungeon_solo.exit_time", get_global_time() + 1800) -- COOLDOWN_DURATION yerine 1800

                 clear_server_timer("fds_warn_check", map_idx) -- Uyarı timer'ını temizle
                 notice_all("[Alev Zindanı] Tebrikler! Boss'u yendin. 60 saniye sonra dışarı çıkarılacaksın.")
                 server_timer("fds_exit_success", 60, map_idx)
            end
             -- Ödül verme vs. buraya eklenebilir
        end

        -- ► Boss yenildikten sonra oyuncuyu dışarı ışınla
        when fds_exit_success.server_timer begin
             local map_idx = get_server_timer_arg()
            if d.select(map_idx) then
                -- Cooldown burada AYARLANMAZ
                d.set_warp_location(62, 6142, 7068)
                d.exit_all()
            end
        end
    --------------------------------------------------------------
        -- ► Oyuncu oyundan çıktığında (Cooldown HEMEN başlar)
        when logout begin
            local map_idx = pc.get_map_index()
            if map_idx >= 3510000 then
                -- Cooldown bitiş zamanını HEMEN ayarla
                pc.setqf("flame_dungeon_solo.exit_time", get_global_time() + 1800)
            end
        end

    --------------------------------------------------------------
    end -- state start end
end -- quest end
denendi çalışıyor. nemeresini bekliyoruz eline sağlık.
 
Geri
Üst