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çıklamaFor 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.
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.
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İş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ı
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>
endforfor 0 19
dhtmlgump <eval ((<dlocal._for>*100)-((<dlocal._for>/5)*500))+45> <eval ((<dlocal._for>/5)*20)+50> 100 20 0 0 <dlocal._for>
endforKod 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
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İş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çıklamaYine 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.
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>
endforKod 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.
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
...
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.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.
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>
endifKod 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
[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>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.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
[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]>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.
Yine kullanımı zevkli ufak bir 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>>Ç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
ON=@Click
message <strcalc sec dhms <timer>>
return 1Kod açıklamasıBize dönen değer örnek olarak 4gn 5sa 16dk 5sn gibidir. Basit ve işinize yarayacağını umduğum bir koddur.
Sıkça kullandığımız basit bir geri sayım kodu.
.timerfc 60 yazarak deneyebilirsiniz.
[FUNCTION timerfc]
if (<argv[0]>>0)
message <dargv[0]>
timerf 1, timerfc <eval <argv[0]>-1>, <argv[1]>
else
try <argv[1]>
endifSoftcoded alışveriş işlemlerinde kullanabileceğiniz altın alma komutu
.pay 3000 yazarak deneyebilirsiniz.
[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İsim düzeltme veya gereken yerlerde kullanabileceğimiz ilk harfi büyültme komutu
[FUNCTION strtoupperfirst]
return <strtoupper <strsub 0 1 <args>>><strtolower <strsub 1 0 <args>>>Kullanım örneği[FUNCTION deneme]
say <strtoupperfirst caos>
Değerin rakam olup olmadığını sorgulatmak için basit bir sorgu
[FUNCTION isnumber]
if strregex(^[0-9]+$,<args>)
return 1
endif
return 0cleartags özentisi olduğu kadar oldukça yararlı bir komut
[FUNCTION clearevents]
args <events>
while <argv[<dlocal._while>]>
events -<argv[<dlocal._while>]>
endwhileSphere.ini ye bağlı kalmadan, AOS Damage style türünü yani tepenizde yükselen bir rakam efekti yapmanıza yarar.
.pmessage 5
[FUNCTION pmessage]
src.sendpacket 0bf W11 W022 01 D<uid> <args>Sesi karaterin çevresindekilere duyurmaması için kişisel ses
.psound 54
[FUNCTION psound]
sendpacket 054 01 w<argv0> w<argv1> w<eval <p.x>> w<p.y> w<p.z>Açılmış target'i iptal etmeye yarayan yararlı bakteri denebilir.
[FUNCTION targoncancel]
sendpacket 06c 00 D(00) 03 D(00) W(00) W(00) 00 00 W(00)Şayet sendpacket ile logout etmek isterseniz
[FUNCTION logout]
sendpacket 0d1 01STRARRAY
AçıklamaBu 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.
[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>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
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.

