M.CANILIK :
Yürübea orkun kim tutar seni
njumi1
Kod:
On=@Dclick
if (<distance> > 3)
src.sysmessage @0481,,1 Yeterince yakin degilsiniz.
elseif (<src.findid i_rune_poison>)
src.sysmessage @0481,,1 Uzerinizde Zehir Varken Moongate'leri Kullanamazsiniz.
elseif (<src.hits> < <src.str>)
src.sysmessage @0481,,1 Yaraliyken Moongate'leri Kullanamazsiniz.
****elseif (<distance> < 3)
src.sdialog d_moongate
RETURN 1
endif****
Şöyle açıklayayım ; * ile işaretlediğim kısımdaki hata return 1'in endif den önce geliyor olması. Yani sorgu bitmeden işlem bitiriliyor orada "You Can't think of a way to use that item." hatasını bu yüzden alıyorsun. Ayrıca distance ilk sorguda check edilmiş olmasına rağmen son sorguda tekrar check ettirmişsin gereksiz olmuş, "elseif (<src.hits> < <src.str>" sorgusundan sonra "else" vererek direkt dialogu verip endif return 1 çakarak bütün külfetten kendini kurtarabilirsin. Yada LSD- nin vermiş olduğu kodu direkt ekleyebilirsin ben biraz bilgilendirmek istedim Kolay gelsin.
Yukarda söylediğiniz "You can't think..." hatası işlemin erken bitmesinden kaynaklanan bir hata değil, aksine bitmemesinden kaynaklanan bir hatadır. Herhangi bir işlem olmayan eşyalarda atıyorum i_blabla eşyasına çift tıkladığınızda bu hatayı alırsınız çünkü herhangi bir işlevi yoktur.
Oradaki hatayı almasının sebebi return 1 olan kısımın devreye girmesi değil, sorgunun durdurulmamasıdır. Yani eğer tüm if sorgularının altına ve else yazıp onunda altına RETURN 1 ekleseydi, işlem duracağı için, hataya kadar işlem devam etmeyecekti.
Bu nedenledir ki bu tarz çoklu if sorgularında RETURN 1'i 10 kere yazmak yerine her if altında işlemin devam etmesine izin verip ENDIF altında sorguyu durdurup hataya sebep olmasını engelliyoruz. Eğer hata sorgu bitmeden RETURN 1 kullanmaktan kaynaklı olsaydı, bu durumda tüm eşyaların hata vermesi gerekirdi çünkü bir trigger zaten if sorgularının bütünleşmiş halidir ve biz nereye yazarsak yazalım hep o IF sorgusunun içinde kalırdık. RETURN 1 in buradaki görevi, sorgudan sonra gelecek işlemleri önlemektir.
Kod:
Misal vermem gerekirse;
On=@Click
message <name>
return 1
buradaki RETURN 1 in işlevi, sonrasında gelecek işlemleri engellemektir. Buda nedir, hiç On=@Click yazmadığımız durumda itemin adının message olarak geliyor olmasıdır. Eğer burada RETURN 1 yapıp sorguyu kesmeseydik durum;
Asd
Asd
şeklinde olacaktı. Fakat 2 tane aynı isim yerine biz sorguyu kesip sadece bizim istediklerimizi yapmasını sağladık. Yani sadece Asd olarak dönmesini.
Peki neden bunu anlattım, çünkü bu önemli bir konu. Mesela bir müzik aletine bir şey eklemek istiyorsunuz ancak orjinal halini engellemek istemiyorsanız, tüm if sorgularının altında (ENDIF içerisinde) Return 1 yapmanız ve devam ettireceğiniz işlemde RETURN 1 yapmamanız gerekir.
Örnek vereyim.
Kod:
[Typedef t_musical]
On=@Dclick
if (<topobj> != <src>)
src.sysmessage @,,1 Üzerinizde değil.
return 1
else
src.musicianship +=1
endif
Burada +1 musicianship skilli verdim ve müziği çalmasını devam ettirdim, bu nedenle RETURN 1 kullanamazdım, eğer böyle bir şey yapsaydım;
Kod:
[Typedef t_musical]
On=@Dclick
if (<topobj> != <src>)
src.sysmessage @,,1 Üzerinizde değil.
return 1
else
src.musicianship +=1
return 1
endif
Kod:
[Typedef t_musical]
On=@Dclick
if (<topobj> != <src>)
src.sysmessage @,,1 Üzerinizde değil.
else
src.musicianship +=1
endif
return 1
Bu işlemler sadece +1 verecek yada hatayı verecek ve sorguyu bitirecekti, yani müzik çalmayacak ve işlem devam etmeyecekti.
Yukardaki sorunada ufaktan bir değinmek gerekirse, Dialog açıldığında RETURN 1 yaptığı için hata almazken, dialogun açılmayacağı durumlarda yani hata ve orada sorgulanmayan diğer durumlarda RETURN 1 olmadığı için işlemin devam etmesi ve hatayı almasına sebep olmasıdır.
Umarım açıklayıcı olmuştur.
İyi forumlar dilerim.