Uzun süre sonra elvedaya yetecek kadar yeniden merhaba.
Başlık ne kadar iddialı, itici ve ukala görünse de bir o kadar nacizane fikirlerimin derlemesidir. Masumdur.
Vakti zamanında belkide terbiyesizlik olarak görülebilecek davranışlarımdan biride, çoğu ele avuca gelir kodlarımı paylaşmamamdır. Tası tarağı toplayıp eleğimi duvara astığım şu sıralarda, artık siz değerli üyelerin bu kodlardan yararlanmasını istiyorum. Uzun lafın kısası ( U.L. (: )
açıklama, kod ve olabildiğince anlaşılır anlatmaya çalışacağım
Açıklama
For döngüsünü kalkıp burada anlatmayacağım tabiki. Bahsetmek istediğim ince nokta şunlardan ibaret. Listeleme;
1) Listelemeleri ya yukarıdan aşağı ve sonrasında sağ tarafa kayacak şekilde sütunlayarak, ya da
2) Sol dan sağa ve sonrasında aşağı ya aktarılacak şekilde satırlayarak yaparız.
0 dan 39 a 40 değer var sayalım, örneklemizin basitleştirilmesi için bu değerleri sabit değer yani <dlocal._for> sayı ile göstereceğim.
Yukarıdan aşağı for
Bu 40 değeri yukarıdan aşşağı 5 er 5 er sütun halinde sıralamak icap etti varsayıyoruz bir kodumuzda, kaldı ki çoğu listelemeleri bu şekilde yaparız.

Bu listelemeyi ben dahil çoğumuz;
if <dlocal._for> > 9
sağsol değere +120
endif
gibi veyahutta ayrı bir for yaparak listeletiyorduk.
Yine nacizane düşüncemle, şahsen geliştirdiğim bir matematiksel hesap ile bunu daha basit yapabiliyoruz.
İşte hepsi bu kadar. Dilerseniz döndürülen değer 40 değilde 140 olsun, 5 kere aşağı bir sütun döndürdükten sonra yan tarafa atlayan diğer 5 kerelik döngünün kodu bundan ibaret.
Kod açıklaması
Resimde görmüş olduğunuz A B ve C değerleri mevcut.
Döngüdeki kodları A B ve C değerleri ile eşleştirerek açıklamayı en basite indirmeye çalışacağım.
<eval ((<dlocal._for>/5)*120)+45>
/5 = aşşağı doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*120 = C yani sütunların birbirine olan uzaklığı
+45 = A yani ilk sütunun dialogun sol tarafına olan başlama uzaklığı
<eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40>
*20 = değerlerin (0 1 2...) satır arası boşluk mesafesi
/5 = aşşağı doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*100 = *20 ve /5 deki rakamların çarpımını yazıyoruz 20*5 = 100 eder. Örn: satır arası boşluk 30 yapmak isterseniz bu değer 150 olmalıdır.
+40 = B yani dialogun üst tarafından bahsedilen boşluk miktarı
10 arlı listelenmiş başka bir örnek

Soldan sağa for
Buda kulladıklarımızın arasında yer alan listeleme türüdür.

Kod açıklaması
<eval ((<dlocal._for>*100)-((<dlocal._for>/5)*500))+45>
*100 = soldan sağa doğru giden değerlerin birbirine olan uzaklığı
/5 = sağa doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*500 = *100 ve /5 deki rakamların çarpımını yazıyoruz 100*5 = 500 eder
+45 = dialogun sol tarafından başlanan ilk boşluğu belirlemek için
<eval ((<dlocal._for>/5)*20)+50>
/5 = sağa doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*20 = satır arası boşluk mesafesi
+50 = dialogun üst tarafındaki boşluğu belirlemek için
3 erli sağa doğru listelenmiş başka bir örnek

Sonuç
İşinize yarayacağını umduğum for döngüsünü neredeyse çoğu sisteminizde kullanabilirsiniz. Guild, aile, ev, runebook vs. gibi uzayıp giden satırlara son verebilirsiniz.
Tek satırlık kodun 4 günümü yediğinide söylemeden edemeyeceğim (:
Açıklama
Yine aile sistemi, ev sistem ya da başka sistemlerimizde sıkça kullandığımız sayfalatma ve neticesinde aklımıza gelen sonsuz sayfalatma gafı.
"Her yiğidin bir yoğurt yeme tarzı" vardır derler bakalım benim kullandığıma sıcak bakacakmısınız.
Basit bir sonsuz sayfalama örneği
Kod açıklaması
for <eval <argv[0]>*10> <eval (<argv[0]>*10)+9>
argv0 = dialog açarkenki yazdığımız 2. terim yani 0,1,2... diye giden sayı
*10 = sayfada göstermek istediğimiz değer sayısı
<eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40>
*20 = satır arası boşluk
/10 = sayfada göstermek istediğimiz değer sayısı
*200 = *20 ve /10 daki rakamların çarpımını yazıyoruz 20*10 = 200 eder
Kullanımı ise çok basit .dialog d_deneme olarak örnekliyorum
.dialog d_deneme,1,0 0 dan 9 a
.dialog d_deneme,1,1 10 dan 19 a
.dialog d_deneme,1,2 20 den 29 a
... gibi sonsuz bir sayfalama yapabilirsiniz.
Kısıtlanmış sonsuz sayfa desteği
100 tane değer var ver bunları 8 tanesini bir sayfada göstermek sureti ile 100/8 12(+1) yani 12 tam sayfa 13. sayfaya da 4 adet değer gelecekmiş gibi kısıtlayarak sayfalatmak istiyorum.
Yine anlaşılabilirlik bakımından değerleri sabit göstereceğim.
Basit açıklamalarla adım adım ilerleyeceğim.
Bu 100 değer bir eve üye diyelim.
8 erli olarak sayfalatıcaz.
Her üye bir referanstır ve üyeleri ayrıntıya girmeden eve şu şekilde kaydettiğimizi varsayıyorum
tag.uye_0 01b2
tag.uye_1 012a
tag.uye_2 0456
...
.dialog d_deneme,1,12 yazdığımızda son sayfada kalan 4 üyeyi görebiliriz.
Kullanımı bu kadar basit ve anlaşılır.
Sayfalatma sistemine ileri/geri sayfaya gitme butonu eklemek
Tabiki .dialog d_deneme,1,12 şeklinde sayfaları açtırmak çılgınlık olurdu. Hemen butonlarımızı eklemeyi görelim.
Kod açıklaması
.dialog d_deneme,1,0 komutundan gelen 0*8 > 0 ise geri butonunu göster
Yani ilk sayfamız 0 ile başladığından 0*8 = 0. 0 = 0 olduğundan geri butonunu göstermez.
İkinci sayfamız 1 ile başladığından 1*8 = 8. 8 > 0 olduğundan geri butonunu gösterir
.dialog d_deneme,1,0 komutundan gelen 100(yani toplam değer) > (0*8)+8 ise ileri butonunu göster
Yani örnek olarak 3. sayfayı .dialog d_deneme,1,2 olarak açıyorsak, 100 > (2*8)+8 ileri butonunu gösterir
Son 13. sayfaya geldiğimizde ise 12 ile açtığımızdan 12*8 = 96 + 8 = 104 buda 100 den büyük olduğu için ileri butonunu göstermez.
Butonların karşılığını vermek
3001 ve 4001, bize 1000 sayfalık bir değer verir, buda aklınızda "sonsuz değilmiş o zaman" demenize neden olabilir. Tabi rakamlarla oynamakta bunu düşünmek kadar basit.
Sonuç
Yine sıkça kullandığımız sistemlerde yer alan bir kodlama. İşinize yarayacağını umuyorum.
Php kodlayanlarında bildiği gibi OOP kod çeşidi, nesne yönelimli programlama veya kodlama türüdür.
detay: http://www.jettem.tk/2010/php/php-oop-nedir.html
Sıkça kullandığım komutları, tekrar tekrar yazmak yerine tek bir yere toplayarak derliyor ve onun üzerinden devam ediyorum. Tam anlamıyla bunu yapıyorum denmesede, UODEV de de daha önce paylaştığım şu kod buna örnek olabilir.
DBUTTON
dbutton
Kullanımı oldukça basit bir kod, ama işinizi bir hayli kolaylaştırabilir.
dbutton 20 110 0 0 1,Deneme
Kod açıklaması
Sıkça kullandığınız bir buton tipini bu fonksiyon altında belirleyip
sağ sol - yukarı aşağı - aktif pasif - sayfa - id şeklinde kullanabilirsiniz.
Bu şekilde buton ile alakalı olarak yazdığınız yazıların, hangi butona ait olduğunu kodların arasından tek tek aramakla kurtulabilir, ayrıca bu 2 satırlık kodu yazarak her kullandığınızda 1 satır kar edebilirsiniz. Bahse konu satırlardan kar etmek değil elbette, anlaşılabilirlik.
STRCALC
Yine kullanımı zevkli ufak bir kod.
Çoğumuz bir zaman dilimini göstermek için tekrar tekrar hesap yapar. serv.time farklıdır, account.time farklıdır ve normal decay time farklıdır.
Bu şirin komut sayesinde bunları göstermek en basite indi. Tıpkı PHP deki gibi 2 ayrı format türleri ekledim. Şöyle ki;
1) zaman dilimi türü
sec = saniye
min = dakika
sip = salise
Bu 3 zaman dilimi türünede ihtiyaç duyduğum için ekledim çünkü serv.timeup veya item.decay saniye, account.totalconnecttime dakika, serv.time salise olarak işliyor.
2) yansıtmak istediğimiz zaman türü
d = gün
h = saat
m = dakika
s = saniye
Basit örnekler
[FUNCTION deneme]
src.sysmessage Sunucu açık kalma süresi <strcalc sec dhms <serv.timeup>>
src.sysmessage Toplam çevrim içi süreniz <strcalc min dhm <account.totalconnecttime>>
src.sysmessage Karakter yaşınız <strcalc sec dhms <age>>
Bir başka örnekte saliseyi kullananmayı öğrenelim.
Karakterime, serv.time + 1 saatlik süre dilimi içeren tag veriyorum.
tag.zaman <eval <serv.time>+36000>
Aradan 5-10 dk geçtikten sonra bu 1 saatlik dilimden ne kadar kaldığını öğrenmek istiyorum.
[FUNCTION deneme]
src.sysmessage Kalan süre <strcalc sip ms <eval <dtag.zaman>-<serv.time>>>
Ostard EGG sisteminde kullanılabilir
Kod açıklaması
Bize dönen değer örnek olarak 4gn 5sa 16dk 5sn gibidir. Basit ve işinize yarayacağını umduğum bir koddur.
TIMERFC (geri sayım)
Sıkça kullandığımız basit bir geri sayım kodu.
.timerfc 60 yazarak deneyebilirsiniz.
PAY (altın alma)
Softcoded alışveriş işlemlerinde kullanabileceğiniz altın alma komutu
.pay 3000 yazarak deneyebilirsiniz.
STRTOUPPERFIRST (ilk harfi büyütmek)
İsim düzeltme veya gereken yerlerde kullanabileceğimiz ilk harfi büyültme komutu
Kullanım örneği
[FUNCTION deneme]
say <strtoupperfirst caos>
ISNUMBER
Değerin rakam olup olmadığını sorgulatmak için basit bir sorgu
CLEAREVENTS
cleartags özentisi olduğu kadar oldukça yararlı bir komut
PMESSAGE (AOS Damage)
Sphere.ini ye bağlı kalmadan, AOS Damage style türünü yani tepenizde yükselen bir rakam efekti yapmanıza yarar.
.pmessage 5
PSOUND
Sesi karaterin çevresindekilere duyurmaması için kişisel ses
.psound 54
TARGONCANCEL
Açılmış target'i iptal etmeye yarayan yararlı bakteri denebilir.
LOGOUT
Şayet sendpacket ile logout etmek isterseniz
Açıklama
Bu kodu da diğerlerinden biriymiş gibi varsayabilirsiniz. Ayrı yazmamdaki gaye, yaklaşık 2 hafta süremi yemiş olmasıdır (: Daha önce UODEV e de 2 ayrı versiyonunu yazmıştım.
Son haliyle budur. Kullanım kolaylığı minumuma indirilmiş, anlaşılır ve benim vazgeçilmezimdir.
Kod bütünü
Affınıza sığınarak kodun açıklamasını es geçiyorum. Bu yazı bütünü kadar daha sürer çünkü. Kullanımına gelince oldukça basittir.
Spherede zaten var olan strsub komutu ile aynı mantıkla çalışır. Tek farkı strsub HARF HARF alırken, yazdığımı bu komut virgül(,) ile ayırdıklarımızı kelime kelime alır.
Kullanım örnekleri
tag.deneme selam,naber,iyiyim,senden,naber
[FUNCTION deneme]
say <strarray 0 1 <tag.deneme>>
Dönen değer selam olacaktır.
say <strarray 0 2 <tag.deneme>> = selam,naber
say <strarray 0 4 <tag.deneme>> = selam,naber,iyiyim,senden
say <strarray 1 2 <tag.deneme>> = naber
say <strarray 1 3 <tag.deneme>> = naber,iyiyim
STRSUB mantığı ile çalıştığından fixlere ihtiyaç duydum. Şöyleki;
say <strarray 0 5 <tag.deneme>> = selam,naber,iyiyim,senden
say <strarray 0 4654 <tag.deneme>> = selam,naber,iyiyim,senden
Yani 2. değer toplam kelime sayısını aşıyorsa, ilk değerden sonraki tüm kelimeleri gösterir. Ayrıca,
say <strarray 0 0 <tag.deneme>> = selam,naber,iyiyim,senden
say <strarray 1 0 <tag.deneme>> = naber,iyiyim,senden
say <strarray 2 0 <tag.deneme>> = iyiyim,senden
Yani 2. değer 0 ise, ilk değerden sonra tüm kelimeleri gösterir.
Düz mantık olarak şöyle ifade edilebilir.
selam = 0
naber = 1
iyiyim = 2
senden = 3
naber = 4
0 1 değeri, 0 ile 1. yi vermez.
İkinci değer olan 1, kendisini ifade eder. Yani "SELAM"
2 1 değeri sadece "İYİYİM" değerini verir.
Yani 2. değer, kaç toplamda kaç değer istediğimizi belirtir.
eksi(-) değerler de entegre edildi
strsub ta yer alan -1 2 gibi terse sorgu, yazdığım komutta da mevcut.
say <strarray -2 0 <tag.deneme>> = senden,naber
say <strarray -3 0 <tag.deneme>> = iyiyim,senden,naber
say <strarray -5 1 <tag.deneme>> = selam
say <strarray -5 2 <tag.deneme>> = selam,naber
say <strarray -5 0 <tag.deneme>> = selam,naber,iyiyim,senden,naber
Sonuç
STRSUB ı tam anlamıyla kulanabilen arkadaşlar zaten kavramıştır. Diğerleri için de elimden geldiği kadarıyla anlaşılır olmaya çalıştım. İyisimi virgülle ayrılmış bir bütün yazıyı, bu başlık altından gönderip almak istediği değeri sorup, cevabını almak ve kendisini geliştirmek.
Uzun süremi alan bu kodu paylaşmaktan da ayrıca kıvanç duyuyorum.
Başlık ne kadar iddialı, itici ve ukala görünse de bir o kadar nacizane fikirlerimin derlemesidir. Masumdur.
Vakti zamanında belkide terbiyesizlik olarak görülebilecek davranışlarımdan biride, çoğu ele avuca gelir kodlarımı paylaşmamamdır. Tası tarağı toplayıp eleğimi duvara astığım şu sıralarda, artık siz değerli üyelerin bu kodlardan yararlanmasını istiyorum. Uzun lafın kısası ( U.L. (: )
açıklama, kod ve olabildiğince anlaşılır anlatmaya çalışacağım
For döngüsü teknikleri
Açıklama
For döngüsünü kalkıp burada anlatmayacağım tabiki. Bahsetmek istediğim ince nokta şunlardan ibaret. Listeleme;
1) Listelemeleri ya yukarıdan aşağı ve sonrasında sağ tarafa kayacak şekilde sütunlayarak, ya da
2) Sol dan sağa ve sonrasında aşağı ya aktarılacak şekilde satırlayarak yaparız.
0 dan 39 a 40 değer var sayalım, örneklemizin basitleştirilmesi için bu değerleri sabit değer yani <dlocal._for> sayı ile göstereceğim.
Yukarıdan aşağı for
Bu 40 değeri yukarıdan aşşağı 5 er 5 er sütun halinde sıralamak icap etti varsayıyoruz bir kodumuzda, kaldı ki çoğu listelemeleri bu şekilde yaparız.

Bu listelemeyi ben dahil çoğumuz;
if <dlocal._for> > 9
sağsol değere +120
endif
gibi veyahutta ayrı bir for yaparak listeletiyorduk.
Yine nacizane düşüncemle, şahsen geliştirdiğim bir matematiksel hesap ile bunu daha basit yapabiliyoruz.
Kod:
for 0 19
dhtmlgump <eval ((<dlocal._for>/5)*120)+45> <eval ((<dlocal._for>*20)-((<dlocal._for>/5)*100))+40> 100 20 0 0 <dlocal._for>
endfor
dhtmlgump <eval ((<dlocal._for>/5)*120)+45> <eval ((<dlocal._for>*20)-((<dlocal._for>/5)*100))+40> 100 20 0 0 <dlocal._for>
endfor
İşte hepsi bu kadar. Dilerseniz döndürülen değer 40 değilde 140 olsun, 5 kere aşağı bir sütun döndürdükten sonra yan tarafa atlayan diğer 5 kerelik döngünün kodu bundan ibaret.
Kod açıklaması
Resimde görmüş olduğunuz A B ve C değerleri mevcut.
Döngüdeki kodları A B ve C değerleri ile eşleştirerek açıklamayı en basite indirmeye çalışacağım.
<eval ((<dlocal._for>/5)*120)+45>
/5 = aşşağı doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*120 = C yani sütunların birbirine olan uzaklığı
+45 = A yani ilk sütunun dialogun sol tarafına olan başlama uzaklığı
<eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40>
*20 = değerlerin (0 1 2...) satır arası boşluk mesafesi
/5 = aşşağı doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*100 = *20 ve /5 deki rakamların çarpımını yazıyoruz 20*5 = 100 eder. Örn: satır arası boşluk 30 yapmak isterseniz bu değer 150 olmalıdır.
+40 = B yani dialogun üst tarafından bahsedilen boşluk miktarı
10 arlı listelenmiş başka bir örnek

Kod:
for 0 19
dhtmlgump <eval ((<dlocal._for>/10)*120)+45> <eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40> 100 20 0 0 <dlocal._for>
endfor
dhtmlgump <eval ((<dlocal._for>/10)*120)+45> <eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40> 100 20 0 0 <dlocal._for>
endfor
Soldan sağa for
Buda kulladıklarımızın arasında yer alan listeleme türüdür.

Kod:
for 0 19
dhtmlgump <eval ((<dlocal._for>*100)-((<dlocal._for>/5)*500))+45> <eval ((<dlocal._for>/5)*20)+50> 100 20 0 0 <dlocal._for>
endfor
dhtmlgump <eval ((<dlocal._for>*100)-((<dlocal._for>/5)*500))+45> <eval ((<dlocal._for>/5)*20)+50> 100 20 0 0 <dlocal._for>
endfor
Kod açıklaması
<eval ((<dlocal._for>*100)-((<dlocal._for>/5)*500))+45>
*100 = soldan sağa doğru giden değerlerin birbirine olan uzaklığı
/5 = sağa doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*500 = *100 ve /5 deki rakamların çarpımını yazıyoruz 100*5 = 500 eder
+45 = dialogun sol tarafından başlanan ilk boşluğu belirlemek için
<eval ((<dlocal._for>/5)*20)+50>
/5 = sağa doğru kaç değer döndüreceksek onu yazıyoruz. (*)
*20 = satır arası boşluk mesafesi
+50 = dialogun üst tarafındaki boşluğu belirlemek için
3 erli sağa doğru listelenmiş başka bir örnek

Kod:
for 0 19
dhtmlgump <eval ((<dlocal._for>*100)-((<dlocal._for>/3)*300))+45> <eval ((<dlocal._for>/3)*20)+50> 100 20 0 0 <dlocal._for>
endfor
dhtmlgump <eval ((<dlocal._for>*100)-((<dlocal._for>/3)*300))+45> <eval ((<dlocal._for>/3)*20)+50> 100 20 0 0 <dlocal._for>
endfor
Sonuç
İşinize yarayacağını umduğum for döngüsünü neredeyse çoğu sisteminizde kullanabilirsiniz. Guild, aile, ev, runebook vs. gibi uzayıp giden satırlara son verebilirsiniz.
Tek satırlık kodun 4 günümü yediğinide söylemeden edemeyeceğim (:
Sayfalatma teknikleri
Açıklama
Yine aile sistemi, ev sistem ya da başka sistemlerimizde sıkça kullandığımız sayfalatma ve neticesinde aklımıza gelen sonsuz sayfalatma gafı.
"Her yiğidin bir yoğurt yeme tarzı" vardır derler bakalım benim kullandığıma sıcak bakacakmısınız.
Basit bir sonsuz sayfalama örneği
Kod:
for <eval <argv[0]>*10> <eval (<argv[0]>*10)+9>
dhtmlgump 45 <eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40> 100 20 0 0 <dlocal._for>
endfor
dhtmlgump 45 <eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40> 100 20 0 0 <dlocal._for>
endfor
Kod açıklaması
for <eval <argv[0]>*10> <eval (<argv[0]>*10)+9>
argv0 = dialog açarkenki yazdığımız 2. terim yani 0,1,2... diye giden sayı
*10 = sayfada göstermek istediğimiz değer sayısı
<eval ((<dlocal._for>*20)-((<dlocal._for>/10)*200))+40>
*20 = satır arası boşluk
/10 = sayfada göstermek istediğimiz değer sayısı
*200 = *20 ve /10 daki rakamların çarpımını yazıyoruz 20*10 = 200 eder
Kullanımı ise çok basit .dialog d_deneme olarak örnekliyorum
.dialog d_deneme,1,0 0 dan 9 a
.dialog d_deneme,1,1 10 dan 19 a
.dialog d_deneme,1,2 20 den 29 a
... gibi sonsuz bir sayfalama yapabilirsiniz.
Kısıtlanmış sonsuz sayfa desteği
100 tane değer var ver bunları 8 tanesini bir sayfada göstermek sureti ile 100/8 12(+1) yani 12 tam sayfa 13. sayfaya da 4 adet değer gelecekmiş gibi kısıtlayarak sayfalatmak istiyorum.
Yine anlaşılabilirlik bakımından değerleri sabit göstereceğim.
Basit açıklamalarla adım adım ilerleyeceğim.
Bu 100 değer bir eve üye diyelim.
8 erli olarak sayfalatıcaz.
Her üye bir referanstır ve üyeleri ayrıntıya girmeden eve şu şekilde kaydettiğimizi varsayıyorum
tag.uye_0 01b2
tag.uye_1 012a
tag.uye_2 0456
...
Kod:
for <eval <argv[0]>*8> <eval (<argv[0]>*8)+7>
ref1 = <tag.uye_<dlocal._for>
if (<ref1>)
dhtmlgump 45 <eval ((<dlocal._for>*20)-((<dlocal._for>/8)*160))+40> 100 20 0 0 <dlocal._for> <ref1.name>
endif
endfor
ref1 = <tag.uye_<dlocal._for>
if (<ref1>)
dhtmlgump 45 <eval ((<dlocal._for>*20)-((<dlocal._for>/8)*160))+40> 100 20 0 0 <dlocal._for> <ref1.name>
endif
endfor
.dialog d_deneme,1,12 yazdığımızda son sayfada kalan 4 üyeyi görebiliriz.
Kullanımı bu kadar basit ve anlaşılır.
Sayfalatma sistemine ileri/geri sayfaya gitme butonu eklemek
Tabiki .dialog d_deneme,1,12 şeklinde sayfaları açtırmak çılgınlık olurdu. Hemen butonlarımızı eklemeyi görelim.
Kod:
if (<eval (<argv[0]>*8)> > 0)
button 30 250 5603 5607 1 0 <eval <argv[1]>+3001>
endif
if (100 > <eval (<argv[0]>*8)+8>)
button 60 250 5601 5605 1 0 <eval <argv[1]>+4001>
endif
button 30 250 5603 5607 1 0 <eval <argv[1]>+3001>
endif
if (100 > <eval (<argv[0]>*8)+8>)
button 60 250 5601 5605 1 0 <eval <argv[1]>+4001>
endif
Kod açıklaması
.dialog d_deneme,1,0 komutundan gelen 0*8 > 0 ise geri butonunu göster
Yani ilk sayfamız 0 ile başladığından 0*8 = 0. 0 = 0 olduğundan geri butonunu göstermez.
İkinci sayfamız 1 ile başladığından 1*8 = 8. 8 > 0 olduğundan geri butonunu gösterir
.dialog d_deneme,1,0 komutundan gelen 100(yani toplam değer) > (0*8)+8 ise ileri butonunu göster
Yani örnek olarak 3. sayfayı .dialog d_deneme,1,2 olarak açıyorsak, 100 > (2*8)+8 ileri butonunu gösterir
Son 13. sayfaya geldiğimizde ise 12 ile açtığımızdan 12*8 = 96 + 8 = 104 buda 100 den büyük olduğu için ileri butonunu göstermez.
Butonların karşılığını vermek
Kod:
[dialog d_deneme button]
ON=3001,4000 //geri
sdialog d_deneme,1,<eval (<argn>-3001)-1>
ON=4001,5000 //ileri
sdialog d_deneme,1,<eval (<argn>-4001)+1>
ON=3001,4000 //geri
sdialog d_deneme,1,<eval (<argn>-3001)-1>
ON=4001,5000 //ileri
sdialog d_deneme,1,<eval (<argn>-4001)+1>
3001 ve 4001, bize 1000 sayfalık bir değer verir, buda aklınızda "sonsuz değilmiş o zaman" demenize neden olabilir. Tabi rakamlarla oynamakta bunu düşünmek kadar basit.
Sonuç
Yine sıkça kullandığımız sistemlerde yer alan bir kodlama. İşinize yarayacağını umuyorum.
OOC Object Oriented Code
Php kodlayanlarında bildiği gibi OOP kod çeşidi, nesne yönelimli programlama veya kodlama türüdür.
detay: http://www.jettem.tk/2010/php/php-oop-nedir.html
Sıkça kullandığım komutları, tekrar tekrar yazmak yerine tek bir yere toplayarak derliyor ve onun üzerinden devam ediyorum. Tam anlamıyla bunu yapıyorum denmesede, UODEV de de daha önce paylaştığım şu kod buna örnek olabilir.
DBUTTON
dbutton
Kullanımı oldukça basit bir kod, ama işinizi bir hayli kolaylaştırabilir.
dbutton 20 110 0 0 1,Deneme
Kod:
[FUNCTION dbutton]
button <strarg <argv[0]>> <strarg <streat <argv[0]>>> 0845 0846 <streat <streat <argv[0]>>>
dtext <eval <strarg <argv[0]>>+20> <eval <strarg <streat <argv[0]>>>> 0480 <argv[1]>
button <strarg <argv[0]>> <strarg <streat <argv[0]>>> 0845 0846 <streat <streat <argv[0]>>>
dtext <eval <strarg <argv[0]>>+20> <eval <strarg <streat <argv[0]>>>> 0480 <argv[1]>
Kod açıklaması
Sıkça kullandığınız bir buton tipini bu fonksiyon altında belirleyip
sağ sol - yukarı aşağı - aktif pasif - sayfa - id şeklinde kullanabilirsiniz.
Bu şekilde buton ile alakalı olarak yazdığınız yazıların, hangi butona ait olduğunu kodların arasından tek tek aramakla kurtulabilir, ayrıca bu 2 satırlık kodu yazarak her kullandığınızda 1 satır kar edebilirsiniz. Bahse konu satırlardan kar etmek değil elbette, anlaşılabilirlik.
STRCALC
Yine kullanımı zevkli ufak bir kod.
Kod:
[FUNCTION strcalc] //<strcalc sec dhms <time>>
local.type <strarg <args>> //min,sec,sip
local.filter <strarg <streat <args>>> //(d)ay,(h)our,(m)inute,(s)econd
if strmatch(min,<local.type>)
local.value 1440
elseif strmatch(sec,<local.type>)
local.value 86400
elseif strmatch(sip,<local.type>)
local.value 864000
endif
args <streat <streat <args>>>,<dlocal.value>,<eval <dlocal.value>/24>,<eval (<dlocal.value>/24)/60>
if strregex(d,<local.filter>)
local.x <eval <argv[0]>/<argv[1]>>
local.return .= " <qval (<dlocal.x>)?<dlocal.x>gn:>"
endif
if strregex(h,<local.filter>)
local.x <eval (<argv[0]>%<argv[1]>)/<argv[2]>>
local.return .= " <qval (<dlocal.x>)?<dlocal.x>sa:>"
endif
if strregex(m,<local.filter>)
local.x <eval ((<argv[0]>%<argv[1]>)%<argv[2]>)/<argv[3]>>
local.return .= " <qval (<dlocal.x>)?<dlocal.x>dk:>"
endif
if strregex(s,<local.filter>)
if strmatch(sip,<local.type>)
local.return .= " <feval <fval ((<argv[0]>%<argv[1]>)%<argv[2]>)%<argv[3]>>>sn"
else
local.return .= " <eval ((<argv[0]>%<argv[1]>)%<argv[2]>)%<argv[3]>>sn"
endif
endif
return <streat <local.return>>
local.type <strarg <args>> //min,sec,sip
local.filter <strarg <streat <args>>> //(d)ay,(h)our,(m)inute,(s)econd
if strmatch(min,<local.type>)
local.value 1440
elseif strmatch(sec,<local.type>)
local.value 86400
elseif strmatch(sip,<local.type>)
local.value 864000
endif
args <streat <streat <args>>>,<dlocal.value>,<eval <dlocal.value>/24>,<eval (<dlocal.value>/24)/60>
if strregex(d,<local.filter>)
local.x <eval <argv[0]>/<argv[1]>>
local.return .= " <qval (<dlocal.x>)?<dlocal.x>gn:>"
endif
if strregex(h,<local.filter>)
local.x <eval (<argv[0]>%<argv[1]>)/<argv[2]>>
local.return .= " <qval (<dlocal.x>)?<dlocal.x>sa:>"
endif
if strregex(m,<local.filter>)
local.x <eval ((<argv[0]>%<argv[1]>)%<argv[2]>)/<argv[3]>>
local.return .= " <qval (<dlocal.x>)?<dlocal.x>dk:>"
endif
if strregex(s,<local.filter>)
if strmatch(sip,<local.type>)
local.return .= " <feval <fval ((<argv[0]>%<argv[1]>)%<argv[2]>)%<argv[3]>>>sn"
else
local.return .= " <eval ((<argv[0]>%<argv[1]>)%<argv[2]>)%<argv[3]>>sn"
endif
endif
return <streat <local.return>>
Çoğumuz bir zaman dilimini göstermek için tekrar tekrar hesap yapar. serv.time farklıdır, account.time farklıdır ve normal decay time farklıdır.
Bu şirin komut sayesinde bunları göstermek en basite indi. Tıpkı PHP deki gibi 2 ayrı format türleri ekledim. Şöyle ki;
1) zaman dilimi türü
sec = saniye
min = dakika
sip = salise
Bu 3 zaman dilimi türünede ihtiyaç duyduğum için ekledim çünkü serv.timeup veya item.decay saniye, account.totalconnecttime dakika, serv.time salise olarak işliyor.
2) yansıtmak istediğimiz zaman türü
d = gün
h = saat
m = dakika
s = saniye
Basit örnekler
[FUNCTION deneme]
src.sysmessage Sunucu açık kalma süresi <strcalc sec dhms <serv.timeup>>
src.sysmessage Toplam çevrim içi süreniz <strcalc min dhm <account.totalconnecttime>>
src.sysmessage Karakter yaşınız <strcalc sec dhms <age>>
Bir başka örnekte saliseyi kullananmayı öğrenelim.
Karakterime, serv.time + 1 saatlik süre dilimi içeren tag veriyorum.
tag.zaman <eval <serv.time>+36000>
Aradan 5-10 dk geçtikten sonra bu 1 saatlik dilimden ne kadar kaldığını öğrenmek istiyorum.
[FUNCTION deneme]
src.sysmessage Kalan süre <strcalc sip ms <eval <dtag.zaman>-<serv.time>>>
Ostard EGG sisteminde kullanılabilir
Kod:
ON=@Click
message <strcalc sec dhms <timer>>
return 1
message <strcalc sec dhms <timer>>
return 1
Kod açıklaması
Bize dönen değer örnek olarak 4gn 5sa 16dk 5sn gibidir. Basit ve işinize yarayacağını umduğum bir koddur.
TIMERFC (geri sayım)
Sıkça kullandığımız basit bir geri sayım kodu.
.timerfc 60 yazarak deneyebilirsiniz.
Kod:
[FUNCTION timerfc]
if (<argv[0]>>0)
message <dargv[0]>
timerf 1, timerfc <eval <argv[0]>-1>, <argv[1]>
else
try <argv[1]>
endif
if (<argv[0]>>0)
message <dargv[0]>
timerf 1, timerfc <eval <argv[0]>-1>, <argv[1]>
else
try <argv[1]>
endif
PAY (altın alma)
Softcoded alışveriş işlemlerinde kullanabileceğiniz altın alma komutu
.pay 3000 yazarak deneyebilirsiniz.
Kod:
[FUNCTION pay]
if (<src.gold> >= <args>)
src.gold -= <args>
src.updatex
return 1
endif
src.sysmessage @,,1 Bu işlem için <args> gp gerekli.
return 0
if (<src.gold> >= <args>)
src.gold -= <args>
src.updatex
return 1
endif
src.sysmessage @,,1 Bu işlem için <args> gp gerekli.
return 0
STRTOUPPERFIRST (ilk harfi büyütmek)
İsim düzeltme veya gereken yerlerde kullanabileceğimiz ilk harfi büyültme komutu
Kod:
[FUNCTION strtoupperfirst]
return <strtoupper <strsub 0 1 <args>>><strtolower <strsub 1 0 <args>>>
return <strtoupper <strsub 0 1 <args>>><strtolower <strsub 1 0 <args>>>
Kullanım örneği
[FUNCTION deneme]
say <strtoupperfirst caos>
ISNUMBER
Değerin rakam olup olmadığını sorgulatmak için basit bir sorgu
Kod:
[FUNCTION isnumber]
if strregex(^[0-9]+$,<args>)
return 1
endif
return 0
if strregex(^[0-9]+$,<args>)
return 1
endif
return 0
CLEAREVENTS
cleartags özentisi olduğu kadar oldukça yararlı bir komut
Kod:
[FUNCTION clearevents]
args <events>
while <argv[<dlocal._while>]>
events -<argv[<dlocal._while>]>
endwhile
args <events>
while <argv[<dlocal._while>]>
events -<argv[<dlocal._while>]>
endwhile
PMESSAGE (AOS Damage)
Sphere.ini ye bağlı kalmadan, AOS Damage style türünü yani tepenizde yükselen bir rakam efekti yapmanıza yarar.
.pmessage 5
Kod:
[FUNCTION pmessage]
src.sendpacket 0bf W11 W022 01 D<uid> <args>
src.sendpacket 0bf W11 W022 01 D<uid> <args>
PSOUND
Sesi karaterin çevresindekilere duyurmaması için kişisel ses
.psound 54
Kod:
[FUNCTION psound]
sendpacket 054 01 w<argv0> w<argv1> w<eval <p.x>> w<p.y> w<p.z>
sendpacket 054 01 w<argv0> w<argv1> w<eval <p.x>> w<p.y> w<p.z>
TARGONCANCEL
Açılmış target'i iptal etmeye yarayan yararlı bakteri denebilir.
Kod:
[FUNCTION targoncancel]
sendpacket 06c 00 D(00) 03 D(00) W(00) W(00) 00 00 W(00)
sendpacket 06c 00 D(00) 03 D(00) W(00) W(00) 00 00 W(00)
LOGOUT
Şayet sendpacket ile logout etmek isterseniz
Kod:
[FUNCTION logout]
sendpacket 0d1 01
sendpacket 0d1 01
STRARRAY
Açıklama
Bu kodu da diğerlerinden biriymiş gibi varsayabilirsiniz. Ayrı yazmamdaki gaye, yaklaşık 2 hafta süremi yemiş olmasıdır (: Daha önce UODEV e de 2 ayrı versiyonunu yazmıştım.
Son haliyle budur. Kullanım kolaylığı minumuma indirilmiş, anlaşılır ve benim vazgeçilmezimdir.
Kod bütünü
Kod:
[FUNCTION strarray]
local.array <argn1>
local.endar <eval (<argn1>+<argn2>)-1>
if (<argn1> >= <argv>)
local.array 0
local.endar <eval <argn2>-1>
endif
if (<argn1> < 0)
local.array <eval <argv>+<argn1>>
local.endar <eval (<local.array>+<argn2>)-1>
endif
if (<argn2> == 0) || (<local.endar> >= <argv>)
local.endar <eval <argv>-1>
endif
for <local.array> <local.endar>
local.return .= ,<argv[<local._for>]>
endfor
if (<local.array> == 0)
local.return <streat <streat <streat <local.return>>>>
else
local.return <streat <local.return>>
endif
return <local.return>
local.array <argn1>
local.endar <eval (<argn1>+<argn2>)-1>
if (<argn1> >= <argv>)
local.array 0
local.endar <eval <argn2>-1>
endif
if (<argn1> < 0)
local.array <eval <argv>+<argn1>>
local.endar <eval (<local.array>+<argn2>)-1>
endif
if (<argn2> == 0) || (<local.endar> >= <argv>)
local.endar <eval <argv>-1>
endif
for <local.array> <local.endar>
local.return .= ,<argv[<local._for>]>
endfor
if (<local.array> == 0)
local.return <streat <streat <streat <local.return>>>>
else
local.return <streat <local.return>>
endif
return <local.return>
Affınıza sığınarak kodun açıklamasını es geçiyorum. Bu yazı bütünü kadar daha sürer çünkü. Kullanımına gelince oldukça basittir.
Spherede zaten var olan strsub komutu ile aynı mantıkla çalışır. Tek farkı strsub HARF HARF alırken, yazdığımı bu komut virgül(,) ile ayırdıklarımızı kelime kelime alır.
Kullanım örnekleri
tag.deneme selam,naber,iyiyim,senden,naber
[FUNCTION deneme]
say <strarray 0 1 <tag.deneme>>
Dönen değer selam olacaktır.
say <strarray 0 2 <tag.deneme>> = selam,naber
say <strarray 0 4 <tag.deneme>> = selam,naber,iyiyim,senden
say <strarray 1 2 <tag.deneme>> = naber
say <strarray 1 3 <tag.deneme>> = naber,iyiyim
STRSUB mantığı ile çalıştığından fixlere ihtiyaç duydum. Şöyleki;
say <strarray 0 5 <tag.deneme>> = selam,naber,iyiyim,senden
say <strarray 0 4654 <tag.deneme>> = selam,naber,iyiyim,senden
Yani 2. değer toplam kelime sayısını aşıyorsa, ilk değerden sonraki tüm kelimeleri gösterir. Ayrıca,
say <strarray 0 0 <tag.deneme>> = selam,naber,iyiyim,senden
say <strarray 1 0 <tag.deneme>> = naber,iyiyim,senden
say <strarray 2 0 <tag.deneme>> = iyiyim,senden
Yani 2. değer 0 ise, ilk değerden sonra tüm kelimeleri gösterir.
Düz mantık olarak şöyle ifade edilebilir.
selam = 0
naber = 1
iyiyim = 2
senden = 3
naber = 4
0 1 değeri, 0 ile 1. yi vermez.
İkinci değer olan 1, kendisini ifade eder. Yani "SELAM"
2 1 değeri sadece "İYİYİM" değerini verir.
Yani 2. değer, kaç toplamda kaç değer istediğimizi belirtir.
eksi(-) değerler de entegre edildi
strsub ta yer alan -1 2 gibi terse sorgu, yazdığım komutta da mevcut.
say <strarray -2 0 <tag.deneme>> = senden,naber
say <strarray -3 0 <tag.deneme>> = iyiyim,senden,naber
say <strarray -5 1 <tag.deneme>> = selam
say <strarray -5 2 <tag.deneme>> = selam,naber
say <strarray -5 0 <tag.deneme>> = selam,naber,iyiyim,senden,naber
Sonuç
STRSUB ı tam anlamıyla kulanabilen arkadaşlar zaten kavramıştır. Diğerleri için de elimden geldiği kadarıyla anlaşılır olmaya çalıştım. İyisimi virgülle ayrılmış bir bütün yazıyı, bu başlık altından gönderip almak istediği değeri sorup, cevabını almak ve kendisini geliştirmek.
Uzun süremi alan bu kodu paylaşmaktan da ayrıca kıvanç duyuyorum.
Yorumlar |
OylamalarOylama :![]()
Üyelerin oylama ortalaması (10 dışında) : 5.50
![]() Oylar: 2 den itibaren 19-09-2011 04:13 |
Benzer Sayfalar
| Sayfalar | Yorumlar | Gönderen | Tarih |








