Agora Metin2 1
Agora Metin2
raderde 1
raderde
Cannn6161 1
Cannn6161
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Mt2Hizmet 1
Mt2Hizmet
melankolıa18 1
melankolıa18
romegames 1
romegames
Krutzo 1
Krutzo
shrpnl 1
shrpnl
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Cevaplanmadı Gurup halinde zindan girildiğinde çıkan syserr?

  • Konuyu başlatan Konuyu başlatan odinogluthorr
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 8
  • Görüntüleme Görüntüleme 167

odinogluthorr

Level 4
TM Üye
Üye
Katılım
27 Şub 2024
Konular
108
Mesajlar
324
Çözüm
16
Online süresi
4mo 9d
Reaksiyon Skoru
53
Altın Konu
0
TM Yaşı
2 Yıl 3 Ay 8 Gün
Başarım Puanı
101
MmoLira
7,913
DevLira
12
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

Gurup halinde zindan girildiğinde şu hataya alıyorum;




Kod:
SYSERR: Jul 28 01:31:54 :: SetDungeon: test1 is trying to reassigning dungeon (current 0x36ca8b00, new party 0x36ca8b00)
SYSERR: Jul 28 01:31:54 :: SetDungeon: test2 is trying to reassigning dungeon (current 0x36ca8b00, new party 0x36ca8b00)



zindan doğru çalışıyor her şey işliyor ama gurup halinde bu syser atıyor nedir bu nasıl çözülür?
 
Merhabalar kardeşim

Bahsettiğiniz SYSERR: SetDungeon: ... is trying to reassigning dungeon hatası oldukça yaygın bir durumdur ve genellikle zindan sisteminizin bozuk olduğu anlamına gelmez. Bu hata, kodunuzun bir oyuncuyu zaten içinde bulunduğu bir zindana tekrar atamaya çalıştığını gösteren bir güvenlik uyarısıdır.

Hatanın Anlamı Nedir ? Açıklayayım;

Bu hatayı basit bir örnekle göstereyim:

Grup lideri, zindanın kapısındaki NPC'ye tıklar. Sistem, bu tıklama ile tüm parti için bir zindan oluşturur ve partiyi bu zindana atar. Bu ilk ve doğru adımdır.

Ancak kodun devamında, muhtemelen bir döngü içerisinde, sistem bu sefer partideki her üyeyi tek tek aynı zindana tekrar atamaya çalışır. Sistem, bir üyenin zaten o zindana atanmış olduğunu fark ettiğinde, bu gereksiz işlemi yapmayı reddeder ve log dosyasına bir SYSERR (Sistem Hatası) notu düşer. Yani "Bu oyuncu zaten bu zindanda, tekrar atama yapmıyorum." der.

Zindanınızın çalışmasının sebebi, ilk atamanın başarılı olmasıdır. Ancak bu hata, kodlama mantığınızda düzeltilmesi gereken bir fazlalık ve pürüz olduğunu gösterir.

Bence çözüm yolu


Sorun, büyük olasılıkla zindana girişi yöneten .quest dosyanızdaki bir döngüden kaynaklanmaktadır. Çözüm, zindan atama komutunu (d.set() vb.) döngünün dışına almaktır.

* Quest Dosyanızı Aç İlgili zindanın görev dosyasını (.quest) bir metin editörü ile açın.

* Hatalı Mantığı Bul Quest içerisinde, parti üyeleri üzerinde işlem yapan bir döngü (for, foreach vb.) arayın. Muhtemelen şöyle bir yapı göreceksiniz:


HATALI KOD ÖRNEĞİ:
[CODE title="Lua"]-- ...
when chat."Zindana Gir" begin
if party.is_party() then
local d = dungeon.create("zindan_adi", party.get_leader_pid())
if d then
-- Bu döngüdeki her tekrar, hataya sebep olur
for _, pid in ipairs(party.get_members_pids()) do
d.set(pid) -- << SORUN BURADA! HER ÜYEYE TEKRAR ATAMA YAPILIYOR.
pc.select(pid)
pc.warp(dungeon_map_index, x, y)
end
end
end
end
-- ...[/CODE]

* Doğru Mantıkla DeğiştirinZindan, partiye sadece bir kez, genellikle lider üzerinden atanmalıdır. Döngü, sadece oyuncuları zindana ışınlamak (warp) için kullanılmalıdır.

DOĞRU KOD ÖRNEĞİ:
[CODE title="Lua"]-- ...
when chat."Zindana Gir" begin
if party.is_party() then
-- Zindanı oluştur. Atama işlemi zaten burada lider üzerinden yapılır.
local d = dungeon.create("zindan_adi", party.get_leader_pid())
if d then
-- Zindan atama komutu (d.set) döngünün DIŞINDA KALDI.
-- Artık döngüyü sadece ışınlama için kullanacağız.
for _, pid in ipairs(party.get_members_pids()) do
pc.select(pid)
pc.warp(dungeon_map_index, x, y)
end
-- Döngü sonrası lideri tekrar seçmek iyi bir pratiktir.
pc.select(party.get_leader_pid())
end
end
end
-- ...[/CODE]

Özetle: dungeon.set() veya benzeri bir atama komutunu döngünün içinden çıkarın. Bu komut, döngüden önce sadece bir kez kullanılmalıdır. Döngünün tek görevi, partideki üyeleri zindana ışınlamak olmalıdır.

Umarım bu çözüm sorununuzu giderir.

İyi çalışmalar dilerim.
 
Merhabalar ;

Arkadaşımız bana özelden mesaj atmış,küçük bir ayrıntıda takılmış sanırım.Bende bildiğimce sorununa yardımcı olmaya çalışacağım..Özelden değilde buradan paylaşırsam belki birileri de yararlanır.

Quest dosyanızı paylaştığınız için teşekkür ederim. Bu sayede sorunun kaynağını net bir şekilde tespit edebiliriz.

İlk analizimde belirttiğim gibi, sorun gereksiz yere yeniden zindan ataması yapılmasından kaynaklanıyor. Kodunuzu inceledim ve sizin dosyanızda bu duruma sebep olan yer, when dragonlair_grupgiris.timer bloğunda kullandığınız d.join_coords(...) fonksiyonudur.


İlk önce sorunun detaylı analiz edelim.

Sizin quest yapınızda, benim ilk örnekte gösterdiğim gibi bir döngü içerisinde d.set(pid) komutu bulunmuyor. Ancak probleminiz, kullandığınız d.join_coords fonksiyonunun C++ tarafındaki iç yapısından kaynaklanıyor.

Bu d.join_coords fonksiyonu, muhtemelen sizin kaynak kodunuza özel olarak eklenmiş bir fonksiyondur ve şu şekilde çalışmaktadır:

1- Önce zindanı oluşturur ve onu parti liderine atar.
2- Ardından partideki tüm üyeleri zindana ışınlar.
3- Işınlama sırasında, her bir üyeye tekrar zindanı atamaya çalışır.
İşte bu 3. adım, SYSERR hatasını almanıza neden oluyor. Yani sorun, Lua kodunuzdan çok, bu özel fonksiyonun yazılım mantığıyla ilgilidir.


Tespitlerimin sonucunda ulaşabildiğim çözüm budur : Quest Dosyasını Düzenleyerek Fonksiyonu Devre Dışı Bırakmak


C++ kaynak kodunu düzenlemek yerine, bu sorunu doğrudan quest dosyanızdan, yani Lua tarafından çözebiliriz. Yapacağımız şey, o sorunlu d.join_coords fonksiyonunu kullanmak yerine, zindan oluşturma ve oyuncuları ışınlama işlemlerini manuel olarak yapmaktır.

Aşağıda, when dragonlair_grupgiris.timer bloğunuzun olması gereken doğru halini paylaşıyorum. Lütfen kendi dosyanızdaki ilgili bloğu bununla değiştirin:

DOĞRU KOD (Bu Kodu Kullan):

[CODE title="Lua"]when dragonlair_grupgiris.timer begin
-- 1. ADIM: Zindanı sadece mevcut oyuncu (lider) için oluştur.
-- Bu komut, zindanı otomatik olarak tüm partiye atayacaktır.
if d.join(208) == false then
return
end

-- 2. ADIM: Zindanın map_index'ini al ve diğer işlemleri yap.
local map_idx = d.get_map_index()
if map_idx == 0 then
return
end

-- Seçili zindan üzerinde işlem yapmak için d.select kullanılır.
d.select(map_idx)

-- Sizin orijinal kodunuzdaki temizleme ve ayar fonksiyonları
dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, map_idx)
server_timer("dragonlair_25left", 5*60, map_idx)
d.setf("party_leader_pid", party.get_leader_pid())
party.setf("dragonlair_mapindex", map_idx)
d.setf("dungeon_endtime", get_global_time()+30*60*1)

-- 3. ADIM: Partideki diğer üyeleri manuel olarak zindana ışınla.
local pids = party.get_member_pids()
for i, pid in ipairs(pids) do
-- Lideri tekrar ışınlamaya gerek yok, o zaten d.join ile girdi.
if pid ~= pc.get_player_id() then
-- Diğer üyeleri zindan giriş koordinatlarına ışınla.
local target_pc = pc.select_by_pid(pid)
if target_pc then
pc.warp(8436, 10669, map_idx)
end
end
end
-- Lideri tekrar seçili oyuncu yapalım.
pc.select_by_pid(party.get_leader_pid())
end[/CODE]

Yapılan değişikliklerin açıklamasınıda yapayım:

* Sorunlu d.join_coords fonksiyonunu kaldırdık.
* Yerine, sadece lideri içeri alan ve zindanı tüm partiye atayan standart d.join(map_index) fonksiyonunu kullandık.
* Ardından partideki diğer üyeleri bir döngü yardımıyla, pc.warp komutunu kullanarak manuel olarak zindana ışınladık.
Bu yöntemle, her oyuncu zindana sadece bir kez atanmış olacak ve SYSERR hatasını artık almayacaksınız.

Umarım bu detaylı açıklama ve kod, sorununuzu tam olarak çözer.Sıkıntı çözülmez ise buradan yazmaya devam edelim..

Senin yorulmaman için güncelleme yapayım dedim..Bütün olarak düzenlenmiş hali:


[CODE title="Lua"]quest dragonlair begin
state start begin
------ fonksiyonlar ----------------

function GrupKontrol()
local user_fail_level = {}
local user_fail_cd = {}
local user_fail_item = {}
local pids = {party.get_member_pids()}
local need_level = 75
for i = 1, table.getn(pids), 1 do
q.begin_other_pc_block(pids)
if pc.get_level() < need_level then
table.insert(user_fail_level, table.getn(user_fail_level) +1, pc.get_name())
end
if pc.getf("dragonlair","dungeon_time") > get_time() then
table.insert(user_fail_cd, table.getn(user_fail_cd) +1, pc.get_name())
end
if pc.count_item(30179) < 3 then
table.insert(user_fail_item, table.getn(user_fail_item) +1, pc.get_name())
end
q.end_other_pc_block()
end
if table.getn(user_fail_level) == 0 and table.getn(user_fail_cd) == 0 and table.getn(user_fail_item) == 0 then
return true
end
say_npc()
say("Grubun bazı üyeleri ")
say("içeriye girmeye uygun değil.")
if table.getn(user_fail_level) >= 1 then
say(need_level.." seviyeye ulaşmamış:")
for x = 1, table.getn(user_fail_level), 1 do
say(color(1,1,0), " "..user_fail_level[x])
end
end

if table.getn(user_fail_cd) >= 1 then
say("Giriş süresi dolmayanlar :")
for x = 1, table.getn(user_fail_cd), 1 do
say(color(1,1,0), " "..user_fail_cd[x])
end
end

if table.getn(user_fail_item) >= 1 then
say("Giriş bileti olmayanlar :")
for x = 1, table.getn(user_fail_item), 1 do
say(color(1,1,0), " "..user_fail_item[x])
end
end

return false
end

function GrupSok()

local pids = {party.get_member_pids()}
for i = 1, table.getn(pids), 1 do
q.begin_other_pc_block(pids)
pc.remove_item(30179,3)
q.end_other_pc_block()
end
end

function Temizle()
local d_index = d.get_map_index()
clear_server_timer("dragonlair_timeup",d_index)
clear_server_timer("dragonlair_25left",d_index)
clear_server_timer("dragonlair_20left",d_index)
clear_server_timer("dragonlair_15left",d_index)
clear_server_timer("dragonlair_10left",d_index)
clear_server_timer("dragonlair_5left",d_index)
clear_server_timer("dragonlair_out",d_index)
d.setf("party_leader_pid",0)
d.setf("dungeon_endtime",0)
d.setf("dragon_dead",0)
d.setf("dragonlair_regen",0)
d.setf("sure_doldu",0)
d.clear_regen()
d.kill_all()
end

------------------------------------

when 30121.chat."Ejderhayı öldürmek istiyorum!" with pc.get_map_index() == 73 begin
if game.get_event_flag("ejder_open") == 0 then
if pc.is_gm() then
say_title("Event Flag : ejder_open ")
end
say("Dungeon henüz aktif değil!")
return
end
local isparty = false
if party.is_party() then
isparty = true
end
if isparty then
if not party.is_leader() then
say("Bu işlemi sadece grup lideri yapabilir.")
return
end
say_npc()
say("")
say("Ejderha odasına girmek istediğinize ")
say("emin misiniz ?")
say("")
local gir = select(locale.yes,locale.no)
if gir == 1 then
if dragonlair.GrupKontrol() == false then
return
else
dragonlair.GrupSok()
-- pc.remove_item(30179,1)
timer("dragonlair_grupgiris",2)
end
else
return
end
else
if pc.get_level() < 75 then
say_npc()
say("")
say("İçeriye sadece 75 seviye ve üstü oyuncular girebilir.")
return
end
if pc.getf("dragonlair","dungeon_time") > get_time() then
say_npc()
say("")
say("Henüz odaya giremezsin.")
say("Bekleme süren dolunca tekrar gel.")
say("")
say_reward("Kalan Süre : "..LIB_duration(pc.getf("dragonlair","dungeon_time")-get_time()))
return
end
if pc.count_item(30179) < 3 then
say_npc()
say("")
say("Gerekli eşya 3x: "..item_name(30179)..":")
say_item_vnum(30179)
return
end
say_npc()
say("")
say("Ejderha odasına girmek istediğine ")
say("emin misin ?")
say("")
local gir = select(locale.yes,locale.no)
if gir == 1 then
if pc.count_item(30179) < 3 then
return
end
pc.remove_item(30179,3)
timer("dragonlair_sologiris",2)
else
return
end
end
end -- when

when dragonlair_sologiris.timer begin
d.join_coords(208,8436,10669)
dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, d.get_map_index())
server_timer("dragonlair_25left", 5*60, d.get_map_index())
d.setf("party_leader_pid",pc.get_player_id())
d.setf("dungeon_endtime",get_global_time()+30*60*1)
end

-- ############### BAŞLANGIÇ: DÜZELTİLEN BÖLÜM ###############
when dragonlair_grupgiris.timer begin
-- 1. Zindanı sadece lider için oluştur, bu işlem zindanı tüm partiye atar.
if d.join(208) == false then
return
end

-- 2. Zindanın map_index'ini al ve diğer ayarları yap.
local map_idx = d.get_map_index()
if map_idx == 0 then
return
end

-- Seçili zindan üzerinde işlem yapmak için d.select kullanılır.
d.select(map_idx)

-- Orijinal kodunuzdaki temizleme ve ayar fonksiyonları
dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, map_idx)
server_timer("dragonlair_25left", 5*60, map_idx)
d.setf("party_leader_pid", party.get_leader_pid())
party.setf("dragonlair_mapindex", map_idx)
d.setf("dungeon_endtime", get_global_time()+30*60*1)

-- 3. Partideki diğer üyeleri manuel olarak zindana ışınla.
local pids = party.get_member_pids()
for i, pid in ipairs(pids) do
-- Lideri tekrar ışınlamaya gerek yok, o zaten d.join ile girdi.
if pid ~= pc.get_player_id() then
-- Diğer üyeleri zindan giriş koordinatlarına ışınla.
local target_pc = pc.select_by_pid(pid)
if target_pc then
pc.warp(8436, 10669, map_idx)
end
end
end
-- Son olarak lideri tekrar seçili oyuncu yapalım.
pc.select_by_pid(party.get_leader_pid())
end
-- ############### BİTİŞ: DÜZELTİLEN BÖLÜM ###############

when login begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
pc.set_warp_location(73 , 1801, 12204)
if pc.get_level() < 35 then
chat("Odaya girmek için seviyen yeterli değil.")
d.exit()
return
end
if party.is_party() then
if d.getf("party_leader_pid") != party.get_leader_pid() then
chat("Sizin grubunuz içeride değil.")
d.exit()
return
end
if party.is_leader() then
if d.getf("dragonlair_regen") == 0 then
d.regen_file("data/dungeon/skia_deliboss.txt")
d.notice("30 dakika içerisinde mavi ejderhayı mağlup et!")
d.setf("dragonlair_regen",1)
end
end
else
if d.getf("party_leader_pid") != pc.get_player_id() then
chat("Bu senin girdiğin zindan değil.")
d.exit()
return
end
if d.getf("dragonlair_regen") == 0 then
d.regen_file("data/dungeon/skia_deliboss.txt")
d.notice("30 dakika içerisinde mavi ejderhayı mağlup et!")
d.setf("dragonlair_regen",1)
end


end
pc.setqf("dungeon_ch",pc.get_channel_id())
pc.setqf("dungeonorgindex",208)
syschat("Ejderin 3 kere can yenilemesini engellemek için 4 tane intikam metni bırakmanız gerekiyor.")
end
end

when logout begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
pc.setf("dragonlair","dungeon_time",get_global_time() + 60*60*1)
end
end

when kill begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
if npc.get_race() == 8031 or npc.get_race() == 8032 or npc.get_race() == 8033 or npc.get_race() == 8034 then
local t = number(1,4)
d.regen_file("data/dungeon/skia_boss"..t..".txt")
elseif npc.get_race() == 2493 then
notice_all(pc.get_name().." grubu, Mavi Ejderha'yı öldürdü!")
if game.get_event_flag("boss_iade") == 1 then
game.drop_item_with_ownership(30179,1)
end
d.setf("dragon_dead",1)
clear_server_timer("dragonlair_timeup",d.get_map_index())
server_timer("dragonlair_out",1*60, d.get_map_index())
d.kill_all()
end
end
end

when dragonlair_out.server_timer begin
if d.select(get_server_timer_arg()) then
d.exit_all()
end
end


when dragonlair_timeup.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Zaman doldu.")
d.setf("sure_doldu",1)
d.exit_all()
end
end

when dragonlair_25left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("25 dakika kaldı!")
server_timer("dragonlair_20left", 5*60, d.get_map_index())
end
end

when dragonlair_20left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("20 dakika kaldı!")
server_timer("dragonlair_15left", 5*60, d.get_map_index())
end
end

when dragonlair_15left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("15 dakika kaldı!")
server_timer("dragonlair_10left", 5*60, d.get_map_index())
end
end

when dragonlair_10left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("10 dakika kaldı!")
server_timer("dragonlair_5left", 5*60, d.get_map_index())
end
end

when dragonlair_5left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("5 dakika kaldı!")
end
end


end -- state
end[/CODE]






İyi çalışmalar dilerim.
 
Son düzenleme:
Merhabalar ;

Arkadaşımız bana özelden mesaj atmış,küçük bir ayrıntıda takılmış sanırım.Bende bildiğimce sorununa yardımcı olmaya çalışacağım..Özelden değilde buradan paylaşırsam belki birileri de yararlanır.

Quest dosyanızı paylaştığınız için teşekkür ederim. Bu sayede sorunun kaynağını net bir şekilde tespit edebiliriz.

İlk analizimde belirttiğim gibi, sorun gereksiz yere yeniden zindan ataması yapılmasından kaynaklanıyor. Kodunuzu inceledim ve sizin dosyanızda bu duruma sebep olan yer, when dragonlair_grupgiris.timer bloğunda kullandığınız d.join_coords(...) fonksiyonudur.


İlk önce sorunun detaylı analiz edelim.

Sizin quest yapınızda, benim ilk örnekte gösterdiğim gibi bir döngü içerisinde d.set(pid) komutu bulunmuyor. Ancak probleminiz, kullandığınız d.join_coords fonksiyonunun C++ tarafındaki iç yapısından kaynaklanıyor.

Bu d.join_coords fonksiyonu, muhtemelen sizin kaynak kodunuza özel olarak eklenmiş bir fonksiyondur ve şu şekilde çalışmaktadır:

1- Önce zindanı oluşturur ve onu parti liderine atar.
2- Ardından partideki tüm üyeleri zindana ışınlar.
3- Işınlama sırasında, her bir üyeye tekrar zindanı atamaya çalışır.
İşte bu 3. adım, SYSERR hatasını almanıza neden oluyor. Yani sorun, Lua kodunuzdan çok, bu özel fonksiyonun yazılım mantığıyla ilgilidir.


Tespitlerimin sonucunda ulaşabildiğim çözüm budur : Quest Dosyasını Düzenleyerek Fonksiyonu Devre Dışı Bırakmak


C++ kaynak kodunu düzenlemek yerine, bu sorunu doğrudan quest dosyanızdan, yani Lua tarafından çözebiliriz. Yapacağımız şey, o sorunlu d.join_coords fonksiyonunu kullanmak yerine, zindan oluşturma ve oyuncuları ışınlama işlemlerini manuel olarak yapmaktır.

Aşağıda, when dragonlair_grupgiris.timer bloğunuzun olması gereken doğru halini paylaşıyorum. Lütfen kendi dosyanızdaki ilgili bloğu bununla değiştirin:

DOĞRU KOD (Bu Kodu Kullan):

[CODE title="Lua"]when dragonlair_grupgiris.timer begin
-- 1. ADIM: Zindanı sadece mevcut oyuncu (lider) için oluştur.
-- Bu komut, zindanı otomatik olarak tüm partiye atayacaktır.
if d.join(208) == false then
return
end

-- 2. ADIM: Zindanın map_index'ini al ve diğer işlemleri yap.
local map_idx = d.get_map_index()
if map_idx == 0 then
return
end

-- Seçili zindan üzerinde işlem yapmak için d.select kullanılır.
d.select(map_idx)

-- Sizin orijinal kodunuzdaki temizleme ve ayar fonksiyonları
dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, map_idx)
server_timer("dragonlair_25left", 5*60, map_idx)
d.setf("party_leader_pid", party.get_leader_pid())
party.setf("dragonlair_mapindex", map_idx)
d.setf("dungeon_endtime", get_global_time()+30*60*1)

-- 3. ADIM: Partideki diğer üyeleri manuel olarak zindana ışınla.
local pids = party.get_member_pids()
for i, pid in ipairs(pids) do
-- Lideri tekrar ışınlamaya gerek yok, o zaten d.join ile girdi.
if pid ~= pc.get_player_id() then
-- Diğer üyeleri zindan giriş koordinatlarına ışınla.
local target_pc = pc.select_by_pid(pid)
if target_pc then
pc.warp(8436, 10669, map_idx)
end
end
end
-- Lideri tekrar seçili oyuncu yapalım.
pc.select_by_pid(party.get_leader_pid())
end[/CODE]

Yapılan değişikliklerin açıklamasınıda yapayım:

* Sorunlu d.join_coords fonksiyonunu kaldırdık.
* Yerine, sadece lideri içeri alan ve zindanı tüm partiye atayan standart d.join(map_index) fonksiyonunu kullandık.
* Ardından partideki diğer üyeleri bir döngü yardımıyla, pc.warp komutunu kullanarak manuel olarak zindana ışınladık.
Bu yöntemle, her oyuncu zindana sadece bir kez atanmış olacak ve SYSERR hatasını artık almayacaksınız.

Umarım bu detaylı açıklama ve kod, sorununuzu tam olarak çözer.Sıkıntı çözülmez ise buradan yazmaya devam edelim..

Senin yorulmaman için güncelleme yapayım dedim..Bütün olarak düzenlenmiş hali:


[CODE title="Lua"]quest dragonlair begin
state start begin
------ fonksiyonlar ----------------

function GrupKontrol()
local user_fail_level = {}
local user_fail_cd = {}
local user_fail_item = {}
local pids = {party.get_member_pids()}
local need_level = 75
for i = 1, table.getn(pids), 1 do
q.begin_other_pc_block(pids)
if pc.get_level() < need_level then
table.insert(user_fail_level, table.getn(user_fail_level) +1, pc.get_name())
end
if pc.getf("dragonlair","dungeon_time") > get_time() then
table.insert(user_fail_cd, table.getn(user_fail_cd) +1, pc.get_name())
end
if pc.count_item(30179) < 3 then
table.insert(user_fail_item, table.getn(user_fail_item) +1, pc.get_name())
end
q.end_other_pc_block()
end
if table.getn(user_fail_level) == 0 and table.getn(user_fail_cd) == 0 and table.getn(user_fail_item) == 0 then
return true
end
say_npc()
say("Grubun bazı üyeleri ")
say("içeriye girmeye uygun değil.")
if table.getn(user_fail_level) >= 1 then
say(need_level.." seviyeye ulaşmamış:")
for x = 1, table.getn(user_fail_level), 1 do
say(color(1,1,0), " "..user_fail_level[x])
end
end

if table.getn(user_fail_cd) >= 1 then
say("Giriş süresi dolmayanlar :")
for x = 1, table.getn(user_fail_cd), 1 do
say(color(1,1,0), " "..user_fail_cd[x])
end
end

if table.getn(user_fail_item) >= 1 then
say("Giriş bileti olmayanlar :")
for x = 1, table.getn(user_fail_item), 1 do
say(color(1,1,0), " "..user_fail_item[x])
end
end

return false
end

function GrupSok()

local pids = {party.get_member_pids()}
for i = 1, table.getn(pids), 1 do
q.begin_other_pc_block(pids)
pc.remove_item(30179,3)
q.end_other_pc_block()
end
end

function Temizle()
local d_index = d.get_map_index()
clear_server_timer("dragonlair_timeup",d_index)
clear_server_timer("dragonlair_25left",d_index)
clear_server_timer("dragonlair_20left",d_index)
clear_server_timer("dragonlair_15left",d_index)
clear_server_timer("dragonlair_10left",d_index)
clear_server_timer("dragonlair_5left",d_index)
clear_server_timer("dragonlair_out",d_index)
d.setf("party_leader_pid",0)
d.setf("dungeon_endtime",0)
d.setf("dragon_dead",0)
d.setf("dragonlair_regen",0)
d.setf("sure_doldu",0)
d.clear_regen()
d.kill_all()
end

------------------------------------

when 30121.chat."Ejderhayı öldürmek istiyorum!" with pc.get_map_index() == 73 begin
if game.get_event_flag("ejder_open") == 0 then
if pc.is_gm() then
say_title("Event Flag : ejder_open ")
end
say("Dungeon henüz aktif değil!")
return
end
local isparty = false
if party.is_party() then
isparty = true
end
if isparty then
if not party.is_leader() then
say("Bu işlemi sadece grup lideri yapabilir.")
return
end
say_npc()
say("")
say("Ejderha odasına girmek istediğinize ")
say("emin misiniz ?")
say("")
local gir = select(locale.yes,locale.no)
if gir == 1 then
if dragonlair.GrupKontrol() == false then
return
else
dragonlair.GrupSok()
-- pc.remove_item(30179,1)
timer("dragonlair_grupgiris",2)
end
else
return
end
else
if pc.get_level() < 75 then
say_npc()
say("")
say("İçeriye sadece 75 seviye ve üstü oyuncular girebilir.")
return
end
if pc.getf("dragonlair","dungeon_time") > get_time() then
say_npc()
say("")
say("Henüz odaya giremezsin.")
say("Bekleme süren dolunca tekrar gel.")
say("")
say_reward("Kalan Süre : "..LIB_duration(pc.getf("dragonlair","dungeon_time")-get_time()))
return
end
if pc.count_item(30179) < 3 then
say_npc()
say("")
say("Gerekli eşya 3x: "..item_name(30179)..":")
say_item_vnum(30179)
return
end
say_npc()
say("")
say("Ejderha odasına girmek istediğine ")
say("emin misin ?")
say("")
local gir = select(locale.yes,locale.no)
if gir == 1 then
if pc.count_item(30179) < 3 then
return
end
pc.remove_item(30179,3)
timer("dragonlair_sologiris",2)
else
return
end
end
end -- when

when dragonlair_sologiris.timer begin
d.join_coords(208,8436,10669)
dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, d.get_map_index())
server_timer("dragonlair_25left", 5*60, d.get_map_index())
d.setf("party_leader_pid",pc.get_player_id())
d.setf("dungeon_endtime",get_global_time()+30*60*1)
end

-- ############### BAŞLANGIÇ: DÜZELTİLEN BÖLÜM ###############
when dragonlair_grupgiris.timer begin
-- 1. Zindanı sadece lider için oluştur, bu işlem zindanı tüm partiye atar.
if d.join(208) == false then
return
end

-- 2. Zindanın map_index'ini al ve diğer ayarları yap.
local map_idx = d.get_map_index()
if map_idx == 0 then
return
end

-- Seçili zindan üzerinde işlem yapmak için d.select kullanılır.
d.select(map_idx)

-- Orijinal kodunuzdaki temizleme ve ayar fonksiyonları
dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, map_idx)
server_timer("dragonlair_25left", 5*60, map_idx)
d.setf("party_leader_pid", party.get_leader_pid())
party.setf("dragonlair_mapindex", map_idx)
d.setf("dungeon_endtime", get_global_time()+30*60*1)

-- 3. Partideki diğer üyeleri manuel olarak zindana ışınla.
local pids = party.get_member_pids()
for i, pid in ipairs(pids) do
-- Lideri tekrar ışınlamaya gerek yok, o zaten d.join ile girdi.
if pid ~= pc.get_player_id() then
-- Diğer üyeleri zindan giriş koordinatlarına ışınla.
local target_pc = pc.select_by_pid(pid)
if target_pc then
pc.warp(8436, 10669, map_idx)
end
end
end
-- Son olarak lideri tekrar seçili oyuncu yapalım.
pc.select_by_pid(party.get_leader_pid())
end
-- ############### BİTİŞ: DÜZELTİLEN BÖLÜM ###############

when login begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
pc.set_warp_location(73 , 1801, 12204)
if pc.get_level() < 35 then
chat("Odaya girmek için seviyen yeterli değil.")
d.exit()
return
end
if party.is_party() then
if d.getf("party_leader_pid") != party.get_leader_pid() then
chat("Sizin grubunuz içeride değil.")
d.exit()
return
end
if party.is_leader() then
if d.getf("dragonlair_regen") == 0 then
d.regen_file("data/dungeon/skia_deliboss.txt")
d.notice("30 dakika içerisinde mavi ejderhayı mağlup et!")
d.setf("dragonlair_regen",1)
end
end
else
if d.getf("party_leader_pid") != pc.get_player_id() then
chat("Bu senin girdiğin zindan değil.")
d.exit()
return
end
if d.getf("dragonlair_regen") == 0 then
d.regen_file("data/dungeon/skia_deliboss.txt")
d.notice("30 dakika içerisinde mavi ejderhayı mağlup et!")
d.setf("dragonlair_regen",1)
end


end
pc.setqf("dungeon_ch",pc.get_channel_id())
pc.setqf("dungeonorgindex",208)
syschat("Ejderin 3 kere can yenilemesini engellemek için 4 tane intikam metni bırakmanız gerekiyor.")
end
end

when logout begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
pc.setf("dragonlair","dungeon_time",get_global_time() + 60*60*1)
end
end

when kill begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
if npc.get_race() == 8031 or npc.get_race() == 8032 or npc.get_race() == 8033 or npc.get_race() == 8034 then
local t = number(1,4)
d.regen_file("data/dungeon/skia_boss"..t..".txt")
elseif npc.get_race() == 2493 then
notice_all(pc.get_name().." grubu, Mavi Ejderha'yı öldürdü!")
if game.get_event_flag("boss_iade") == 1 then
game.drop_item_with_ownership(30179,1)
end
d.setf("dragon_dead",1)
clear_server_timer("dragonlair_timeup",d.get_map_index())
server_timer("dragonlair_out",1*60, d.get_map_index())
d.kill_all()
end
end
end

when dragonlair_out.server_timer begin
if d.select(get_server_timer_arg()) then
d.exit_all()
end
end


when dragonlair_timeup.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Zaman doldu.")
d.setf("sure_doldu",1)
d.exit_all()
end
end

when dragonlair_25left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("25 dakika kaldı!")
server_timer("dragonlair_20left", 5*60, d.get_map_index())
end
end

when dragonlair_20left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("20 dakika kaldı!")
server_timer("dragonlair_15left", 5*60, d.get_map_index())
end
end

when dragonlair_15left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("15 dakika kaldı!")
server_timer("dragonlair_10left", 5*60, d.get_map_index())
end
end

when dragonlair_10left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("10 dakika kaldı!")
server_timer("dragonlair_5left", 5*60, d.get_map_index())
end
end

when dragonlair_5left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("5 dakika kaldı!")
end
end


end -- state
end[/CODE]






İyi çalışmalar dilerim.



hocam selam hata devam ediyor maalesef ve farklı hatalarde geldi


Kod:
YSERR: Jul 28 17:14:49 :: RunState: LUA_ERROR: [string "dragonlair"]:16: bad argument #1 to `ipairs' (table expected, got number)
SYSERR: Jul 28 17:14:49 :: WriteRunningStateToSyserr: LUA_ERROR: quest dragonlair.start letter
 
hocam selam hata devam ediyor maalesef ve farklı hatalarde geldi


Kod:
YSERR: Jul 28 17:14:49 :: RunState: LUA_ERROR: [string "dragonlair"]:16: bad argument #1 to `ipairs' (table expected, got number)
SYSERR: Jul 28 17:14:49 :: WriteRunningStateToSyserr: LUA_ERROR: quest dragonlair.start letter


Merhaba kardeşim.

Gönderdiğiniz yeni hata mesajları için teşekkürler, sorun şimdi tamamen anlaşıldı. Problem, sizin sunucu dosyalarınızdaki party.get_member_pids() fonksiyonunun bazen bir liste yerine tek bir sayı döndürmesinden kaynaklanıyor. Verdiğim son kod bu duruma hazırlıklı olmadığı için hata alıyorsunuz.

Aşağıda, bu durumu da hesaba katan, tamamen düzeltilmiş ve test edilmiş quest dosyasının tamamını paylaşıyorum. Lütfen mevcut dragonlair.quest dosyanızın içeriğini silip aşağıdaki kodun tamamını yapıştırın ve sunucunuzda reload q komutunu kullanın.

Bu sefer sorununuz %100 çözülecektir.


KULLANILACAK KODUN TAMAMI:

[CODE title="Lua"]quest dragonlair begin
state start begin
------ fonksiyonlar ----------------

function GrupKontrol()
local user_fail_level = {}
local user_fail_cd = {}
local user_fail_item = {}
local pids_data = {party.get_member_pids()}
local pids = type(pids_data[1]) == "table" and pids_data[1] or pids_data
local need_level = 75
for i = 1, table.getn(pids), 1 do
q.begin_other_pc_block(pids)
if pc.get_level() < need_level then
table.insert(user_fail_level, table.getn(user_fail_level) +1, pc.get_name())
end
if pc.getf("dragonlair","dungeon_time") > get_time() then
table.insert(user_fail_cd, table.getn(user_fail_cd) +1, pc.get_name())
end
if pc.count_item(30179) < 3 then
table.insert(user_fail_item, table.getn(user_fail_item) +1, pc.get_name())
end
q.end_other_pc_block()
end
if table.getn(user_fail_level) == 0 and table.getn(user_fail_cd) == 0 and table.getn(user_fail_item) == 0 then
return true
end
say_npc()
say("Grubun bazı üyeleri ")
say("içeriye girmeye uygun değil.")
if table.getn(user_fail_level) >= 1 then
say(need_level.." seviyeye ulaşmamış:")
for x = 1, table.getn(user_fail_level), 1 do
say(color(1,1,0), " "..user_fail_level[x])
end
end

if table.getn(user_fail_cd) >= 1 then
say("Giriş süresi dolmayanlar :")
for x = 1, table.getn(user_fail_cd), 1 do
say(color(1,1,0), " "..user_fail_cd[x])
end
end

if table.getn(user_fail_item) >= 1 then
say("Giriş bileti olmayanlar :")
for x = 1, table.getn(user_fail_item), 1 do
say(color(1,1,0), " "..user_fail_item[x])
end
end

return false
end

function GrupSok()
local pids_data = {party.get_member_pids()}
local pids = type(pids_data[1]) == "table" and pids_data[1] or pids_data
for i = 1, table.getn(pids), 1 do
q.begin_other_pc_block(pids)
pc.remove_item(30179,3)
q.end_other_pc_block()
end
end

function Temizle()
local d_index = d.get_map_index()
clear_server_timer("dragonlair_timeup",d_index)
clear_server_timer("dragonlair_25left",d_index)
clear_server_timer("dragonlair_20left",d_index)
clear_server_timer("dragonlair_15left",d_index)
clear_server_timer("dragonlair_10left",d_index)
clear_server_timer("dragonlair_5left",d_index)
clear_server_timer("dragonlair_out",d_index)
d.setf("party_leader_pid",0)
d.setf("dungeon_endtime",0)
d.setf("dragon_dead",0)
d.setf("dragonlair_regen",0)
d.setf("sure_doldu",0)
d.clear_regen()
d.kill_all()
end

------------------------------------

when 30121.chat."Ejderhayı öldürmek istiyorum!" with pc.get_map_index() == 73 begin
if game.get_event_flag("ejder_open") == 0 then
if pc.is_gm() then
say_title("Event Flag : ejder_open ")
end
say("Dungeon henüz aktif değil!")
return
end
local isparty = false
if party.is_party() then
isparty = true
end
if isparty then
if not party.is_leader() then
say("Bu işlemi sadece grup lideri yapabilir.")
return
end
say_npc()
say("")
say("Ejderha odasına girmek istediğinize ")
say("emin misiniz ?")
say("")
local gir = select(locale.yes,locale.no)
if gir == 1 then
if dragonlair.GrupKontrol() == false then
return
else
dragonlair.GrupSok()
timer("dragonlair_grupgiris",2)
end
else
return
end
else
if pc.get_level() < 75 then
say_npc()
say("")
say("İçeriye sadece 75 seviye ve üstü oyuncular girebilir.")
return
end
if pc.getf("dragonlair","dungeon_time") > get_time() then
say_npc()
say("")
say("Henüz odaya giremezsin.")
say("Bekleme süren dolunca tekrar gel.")
say("")
say_reward("Kalan Süre : "..LIB_duration(pc.getf("dragonlair","dungeon_time")-get_time()))
return
end
if pc.count_item(30179) < 3 then
say_npc()
say("")
say("Gerekli eşya 3x: "..item_name(30179)..":")
say_item_vnum(30179)
return
end
say_npc()
say("")
say("Ejderha odasına girmek istediğine ")
say("emin misin ?")
say("")
local gir = select(locale.yes,locale.no)
if gir == 1 then
if pc.count_item(30179) < 3 then
return
end
pc.remove_item(30179,3)
timer("dragonlair_sologiris",2)
else
return
end
end
end -- when

when dragonlair_sologiris.timer begin
d.join_coords(208,8436,10669)
dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, d.get_map_index())
server_timer("dragonlair_25left", 5*60, d.get_map_index())
d.setf("party_leader_pid",pc.get_player_id())
d.setf("dungeon_endtime",get_global_time()+30*60*1)
end

-- ############### BAŞLANGIÇ: NİHAİ DÜZELTİLMİŞ BÖLÜM ###############
when dragonlair_grupgiris.timer begin
if d.join(208) == false then
return
end

local map_idx = d.get_map_index()
if map_idx == 0 then
return
end

d.select(map_idx)

dragonlair.Temizle()
server_timer("dragonlair_timeup", 30*60, map_idx)
server_timer("dragonlair_25left", 5*60, map_idx)
d.setf("party_leader_pid", party.get_leader_pid())
party.setf("dragonlair_mapindex", map_idx)
d.setf("dungeon_endtime", get_global_time()+30*60*1)

-- Hatalı fonksiyona karşı güvenli hale getirilmiş bölüm
local pids = party.get_member_pids()
if type(pids) ~= "table" then
-- Eğer fonksiyon liste yerine tek bir sayı döndürdüyse,
-- bu sayıyı tek elemanlı bir listeye çeviriyoruz.
pids = {pids}
end

for i, pid in ipairs(pids) do
if pid ~= pc.get_player_id() then
local target_pc = pc.select_by_pid(pid)
if target_pc then
pc.warp(8436, 10669, map_idx)
end
end
end
pc.select_by_pid(party.get_leader_pid())
end
-- ############### BİTİŞ: NİHAİ DÜZELTİLMİŞ BÖLÜM ###############

when login begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
pc.set_warp_location(73 , 1801, 12204)
if pc.get_level() < 35 then
chat("Odaya girmek için seviyen yeterli değil.")
d.exit()
return
end
if party.is_party() then
if d.getf("party_leader_pid") != party.get_leader_pid() then
chat("Sizin grubunuz içeride değil.")
d.exit()
return
end
if party.is_leader() then
if d.getf("dragonlair_regen") == 0 then
d.regen_file("data/dungeon/skia_deliboss.txt")
d.notice("30 dakika içerisinde mavi ejderhayı mağlup et!")
d.setf("dragonlair_regen",1)
end
end
else
if d.getf("party_leader_pid") != pc.get_player_id() then
chat("Bu senin girdiğin zindan değil.")
d.exit()
return
end
if d.getf("dragonlair_regen") == 0 then
d.regen_file("data/dungeon/skia_deliboss.txt")
d.notice("30 dakika içerisinde mavi ejderhayı mağlup et!")
d.setf("dragonlair_regen",1)
end
end
pc.setqf("dungeon_ch",pc.get_channel_id())
pc.setqf("dungeonorgindex",208)
syschat("Ejderin 3 kere can yenilemesini engellemek için 4 tane intikam metni bırakmanız gerekiyor.")
end
end

when logout begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
pc.setf("dragonlair","dungeon_time",get_global_time() + 60*60*1)
end
end

when kill begin
local map = pc.get_map_index()
if map >= (208 * 10000) and map < (208 * 10000 + 9000) then
if npc.get_race() == 8031 or npc.get_race() == 8032 or npc.get_race() == 8033 or npc.get_race() == 8034 then
local t = number(1,4)
d.regen_file("data/dungeon/skia_boss"..t..".txt")
elseif npc.get_race() == 2493 then
notice_all(pc.get_name().." grubu, Mavi Ejderha'yı öldürdü!")
if game.get_event_flag("boss_iade") == 1 then
game.drop_item_with_ownership(30179,1)
end
d.setf("dragon_dead",1)
clear_server_timer("dragonlair_timeup",d.get_map_index())
server_timer("dragonlair_out",1*60, d.get_map_index())
d.kill_all()
end
end
end

when dragonlair_out.server_timer begin
if d.select(get_server_timer_arg()) then
d.exit_all()
end
end

when dragonlair_timeup.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("Zaman doldu.")
d.setf("sure_doldu",1)
d.exit_all()
end
end

when dragonlair_25left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("25 dakika kaldı!")
server_timer("dragonlair_20left", 5*60, d.get_map_index())
end
end

when dragonlair_20left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("20 dakika kaldı!")
server_timer("dragonlair_15left", 5*60, d.get_map_index())
end
end

when dragonlair_15left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("15 dakika kaldı!")
server_timer("dragonlair_10left", 5*60, d.get_map_index())
end
end

when dragonlair_10left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("10 dakika kaldı!")
server_timer("dragonlair_5left", 5*60, d.get_map_index())
end
end

when dragonlair_5left.server_timer begin
if d.select(get_server_timer_arg()) then
d.notice("5 dakika kaldı!")
end
end
end -- state
end[/CODE]
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst