UO-Dev Arama


Sayfalama, Listeleme ve 1 2 ufak kod

Yazar: Mf
Tarih: 25-07-2011 13:59


Paylaş : Paylaş

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

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.

http://img580.imageshack.us/img580/8824/ya01.jpg


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


İş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
http://img845.imageshack.us/img845/1074/ya02.jpg


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



Soldan sağa for

Buda kulladıklarımızın arasında yer alan listeleme türüdür.

http://img813.imageshack.us/img813/7342/ss01.jpg


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


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
http://img18.imageshack.us/img18/463/ss02n.jpg


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



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


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


.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


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>


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]>


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>>


Ç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


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



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



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>>>


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



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



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>



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>



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)



LOGOUT

Şayet sendpacket ile logout etmek isterseniz
Kod:
[FUNCTION logout]
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>


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

1.   Gönderen kargasa   09-08-2011 14:48    

teşekkürler, anlatım şahane olmuş.

Oylamalar

Oylama :
Üyelerin oylama ortalaması (10 dışında) : 5.50   
Oylar: 2 den itibaren 19-09-2011 04:13

Benzer Sayfalar

SayfalarYorumlarGönderenTarih

Keywords:

ultima online, RunUO, ultima online download, sphere scripting, role play, uo grafik, second age ultima, uo loop, macroman, pvp server, server kurulumu, sphere, multool, ml mulls, 56b 55r 55i, htmlgumps, client 4x, client edit, sphere release, osi, rp server, sunucular, ghost mouse, inside uo, kingdom reborn, stygian abyss, uo nasıl oynanır, mondain's legacy, age of shadows, world build, grandmaster, ultima online pvp, player dosyaları, ultima online indir, frp game, RunUO 1.0.0, razor, uo rice, hue editör, skill tools, ultima online patch, axis, world build, verdata, verdata patcher, map editör, gump editör, mul patcher, aos mulls, scriptler, anim edit, anim publish, hues mul, hosting vps, event dialog, account sistemi, skill gain, static yapımı,