Master
59.2997
Bir arkadaşıma (buxiun) verdiğim söz ve önceden yayımladığım mysql tabanlı aile sisteminin genel olarak kullanılamaması üzerine klasik olarak işleyen ve eski clientler taban alınarak kodladığım bir aile sistemini sizlerle paylaşıyorum. Scriptin comment kısmında kullanımını detaylıca açıkladığım için tekrar açıklamama gerek yok. Sistem temel fonksiyonları ile kodlandığı için chat ve benzeri eklentiler mevcut değil. İstek olursa ekleyip yayınlayabilirim buradan. Sistemi her ne kadar lokal olarak test etmiş olsam da 3-5 kişilik bir test ile tek kişinin yapacağı test bir değildir, bu yüzden sistemi kullanmadan önce tüm fonksiyonlarını en az ikişer defa test ediniz. Çıkan bir sorun olursa (çıkacağını düşünmüyorum ama gene de garantiye almak amaçlı) buradan bildirmeniz yeterli.

[comment aile_sistemi]
yazan: Slothere
tarih: 29/07/2009
version: 056b+
-------------------------
Kullanımı:
- Sistemin kullanımda ihtiyaç duyduğu tek ve en önemli şey karakterlerin başlangıçta bir soy ismi olmamasıdır. Bunu engellemek için "f_onchar_create" altında kullanmanız amaçlı f_isim_duzenle isimli fonksiyon da size sistem ile birlikte verilmiştir.
- def.maxuye bölümünden ailenin alacağı max. üye sayısını belirleyebilirsiniz.
- sistem aile isimlerini tesciller. tekrar alınan soy ismi bir daha alınamaz.
- şu an default olarak üye alım ücreti 50.000gp olarak belirlendi. scriptte ilgili kısımlar değiştirilecek güncellenebilir.
-------------------------


[defname aile_sistemi]
maxuye 50 // ailenin alabilecegi max. üye sayısı.

// * fonksiyonlar

[function f_isim_duzenle]
local.isim = <strarg <strtoupper(<strsub 0 1 <src.name>>)><strtolower(<strsub 1 15 <src.name>>)>>
src.name <local.isim>
src.sysmessage @1153 isminiz <local.isim> olarak tekrar duzenlendi.

[function f_isim_kontrolu]
local.num = 0
for 0 <eval (strlen(<args>)) -1>
  if !strmatch('[abcdefghijklmnoprstuvyz']','<strsub <dlocal._for> 1 <args>>')
     local.num ++
  endif
endfor
return <local.num>

[function f_soyadi_kontrolu]
for 0 <eval (<serv.accounts>) -1>
  if (<serv.account.<dlocal._for>>)
    for x 0 <eval (<serv.account.<dlocal._for>.chars>) -1>
      local.soyad = <streat <serv.account.<dlocal._for>.char.<dlocal.x>.name>>
      if !strcmpi('<local.soyad>','<args>')
        local.return ++
      endif
    endfor
  endif
endfor
return <dlocal.return>

[function f_yeniuye]
ref1 = <args>
if (<argo> == <src>)
  src.sysmessage @1153 kendinizi secemezsiniz.
elif !(<argo.isplayer>) || (<argo.isgm>) || (<argo.isitem>)
  src.sysmessage @1153 sadece oyunculari secebilirsiniz.
elif strcmpi('<argo.tag.soyad>','')
  src.sysmessage @1153 <argo.name>, <argo.tag0.soyad> ailesine kayitli
elif (<argo.isdialogopen d_uye_kayidi>)
  src.sysmessage @1153 <argo.name> baska bir aile teklifi almis.
elif (<argo.gold> < 50000)
  src.sysmessage @1153 <argo.name>'in uzerinde yeterli altin bulunmuyor (50.000gp)
elif (<eval <ref1.f_uyesayisi_kontrolu>> < 1)
  src.sysmessage @1153 ailenizde bos yer kalmamis.
else
  trysrc <argo> sdialog d_uye_kayidi,0,<args>,<src>
  src.sysmessage @1153 teklif yapildi, cevap bekleniyor.
endif
return 1

[function f_uyesayisi_kontrolu]
for <eval <def.maxuye>> 0
  if !strcmpi('<tag.uye<dlocal._for>>','')
    local.bos = <dlocal._for>
  endif
endif
return <dlocal.bos>

// * //


// * eşyalar

[itemdef i_aile_belgesi]
id = i_deed
type = t_script
value = 52356
name = aile belgesi
weight = 2

on=@create
color = 0455
attr = attr_newbie

on=@dclick
if (<topobj> != <src>)
  src.sysmessage @1153 bunu sadece uzerinizdeyken kullanabilirsiniz.
elif strcmpi('<src.tag.soyad>','')
  src.sysmessage @1153 <src.tag0.soyad> ailesine kayitlisiniz.
elif (<src.isdialogopen d_aile_kurulum>)
  src.sysmessage @1153 aktif islemi bitirmeden kullanamazsiniz.
else
  sdialog d_aile_kurulum
endif
return 1

[dialog d_aile_kurulum]
0,0
nomove

resizepic 50 50 5054 300 150
dtext 132 75 1152 Aile Kurulum Menusu
resizepic 100 110 3000 200 22
dtextentry 110 110 170 20 1152 0 <var.blank>
button 100 150 4005 4007 1 0 1
dtext 132 150 1152 Tamam

[dialog d_aile_kurulum button]
on = 1
if strlen(<argtxt[0]>) < 3 || strlen(<argtxt[0]>) > 15
  src.sysmessage @1153 soy ismi en az 3, en fazla 15 karakterden olusmalidir.
elif (<f_isim_kontrolu <argtxt[0]>> > 0)
  src.sysmessage @1153 soy isminizde gecersiz karakterler bulunuyor.
elif (<f_soyadi_kontrolu <argtxt[0]>> > 0)
  src.sysmessage @1153 <argtxt[0]> ailesi kayitli durumda.
else
  local.isim <strarg <src.name>>
  local.soyisim <strtoupper(<strsub 0 1 <argtxt[0]>>)><strtolower(<strsub 1 15 <argtxt[0]>>)>
  src.name <local.isim> <local.soyisim>
  src.tag.soyad <argtxt[0]>
  serv.newitem i_reis_kolyesi,1,<src>
  new.link <src>
  new.tag.uye0 <src>
  new.tag.uyeler 1
  src.equip <new>
  src.tag.kolye = <new>
  serv.b @1153,1,1 <local.soyisim> ailesi, <local.isim> tarafindan kuruldu.
  remove
endif
return 1
  
[itemdef i_reis_kolyesi]
id = i_necklace_gold
type = t_jewelry
value = 0
weight = 0
name = aile kolyesi

on=@create
color = 1153
attr = attr_newbie

on=@click
message @1153 [<link.tag0.soyad> Aile Reisi]
message @1153 <link.name>
return 1

on=@dclick
if (<link> == <src>) && (<topobj> == <src>)
  sdialog d_aile_kontrolu,0,0
endif

[itemdef i_uye_kolyesi]
id = i_necklace_gold
type = t_jewelry
value = 0
weight = 0
name = aile kolyesi

on=@create
color = 1153
attr = attr_newbie

on=@click
message @1153 [<link.tag0.soyad> Aile Uyesi]
message @1153 <link.name>
return 1

on=@dclick
if (<link> == <src>) && (<topobj> == <src>)
  ref1 = <more1>
  ref1.sdialog d_uye_menusu,0,0
endif

// * //

[dialog d_uye_menusu]
0,0

src.ctag.siralama = <argv[0]>
resizepic 20 50 5054 250 300
resizepic 30 60 3000 230 280
button 240 315 015e1 015e5 1 0 1
button 210 315 015e3 015e7 1 0 2
resizepic 20 350 5054 250 70
resizepic 30 360 3000 230 50
button 65 375 4005 4007 1 0 3
dtext 100 375 1000 Aileden Ayril
dorigin 60 60
for <eval (<src.ctag0.siralama>)> <eval (<src.ctag0.siralama> + 10)>
  if strcmpi('<tag.uye<dlocal._for>>','')
    ref2 = <tag.uye<dlocal._for>>
    dtext +0 *20 <qval (<ref2.isonline>) ? 040 : 025> <ref2.name>
  endif
endfor

[dialog d_uye_menusu button]
on = 0
src.ctag0.siralama =

on = 1 2
ref1 = <uid>
if <dargn> == 1
  src.ctag.siralama +=10
else
  if (<src.dctag0.siralama> > 0)
    src.ctag.siralama -=10
  endif
endif
ref1.sdialog d_uye_menusu,0,<src.dctag0.siralama>,<src.ctag0.aile>
return 1

on = 3
ref1 = <uid>
ref1.sdialog d_cikart,3,0
return 1

[dialog d_aile_kontrolu]
0,0
nomove

src.ctag.siralama = <dargv[0]>
page 0
resizepic 20 50 5054 250 170
resizepic 30 60 3000 230 150
dhtmlgump 50 70 200 20 0 0 <link.tag0.soyad> Aile Menusu (<dtag0.uyeler>/<eval <def.maxuye>> uye)
button 65 100 4005 4007 0 2 0
dtext 105 100 1000 Uyeleri Yonet
button 65 120 4005 4006 1 0 902
dtext 105 120 1000 Yeni Uye Al
button 65 140 4005 4006 1 0 904
dtext 105 140 1000 Aileyi Dagit

page 2
resizepic 20 220 5054 250 300
resizepic 30 230 3000 230 280
button 240 490 015e1 015e5 1 0 900
button 210 490 015e3 015e7 1 0 901
dorigin 100 220
for <eval (<src.ctag0.siralama>)> <eval (<src.ctag0.siralama> + 10)>
  if strcmpi('<tag.uye<dlocal._for>>','')
    ref1 = <tag.uye<dlocal._for>>
    dtext +0 *20 <qval (<ref1.isonline>) ? 040 : 025> <ref1.name>
	button -35 *0 0FA2 0FA4 1 0 <eval <local._for> + 1>
  endif
endfor

[dialog d_aile_kontrolu button]
on = 0
src.ctag.siralama =

on = 1 899
ref1 = <uid>
if (<tag.uye<eval <argn> -1>> == <src>)
  src.sysmessage @1153 kendi kendinizi aileden cikartamazsiniz.
else
  ref1.sdialog d_cikart,1,<eval <argn> -1>
endif
return 1

on = 900 901
ref1 = <uid>
if <dargn> == 900
  src.ctag.siralama +=10
else
  if (<src.dctag0.siralama> > 0)
    src.ctag.siralama -=10
  endif
endif
ref1.sdialog d_aile_kontrolu,2,<src.dctag0.siralama>
return 1

on = 902
if !((<src.flags> & statf_dead) || (<src.flags> & statf_freeze))
  src.targetf f_yeniuye <uid>
endif
return 1

on = 904
ref1 = <uid>
ref1.sdialog d_cikart,2,0
return 1


[dialog d_cikart]
0,0
nomove

resizepic 50 50 5054 300 150
resizepic 60 60 3000 280 130

page 1
src.ctag.uye = <tag.uye<dargv[0]>>
src.ctag.numara = <dargv[0]>
ref1 = <src.ctag0.uye>
dhtmlgump 95 70 230 50 0 0 <ref1.name> isimli aile uyesini aileden cikartmak istediginize emin misiniz?
button 90 150 4005 4007 1 0 1
dtext 125 150 1000 Evet

page 2
dhtmlgump 95 70 230 50 0 0 <src.tag0.soyad> isimli ailenizi dagitmak istediginize emin misiniz?
button 90 150 4005 4007 1 0 2
dtext 125 150 1000 Evet

page 3
dhtmlgump 95 70 230 50 0 0 <link.tag0.soyad> isimli ailenizden ayrilmak istediğinize emin misiniz?
button 90 150 4005 4007 1 0 3
dtext 125 150 1000 Evet

[dialog d_cikart button]
on = 0
src.ctag.uye =

on = 1
ref1 = <src.ctag0.uye>
ref1.tag.soyad = 
ref1.name <strarg <ref1.name>>
try uid.<ref1.tag0.kolye>.remove
ref1.tag.kolye =
tag.uye<src.dctag0.numara> =
tag.uyeler --
src.sysmessage @1153 <ref1.name> isimli kisiyi ailenizden cikarttiniz.
if (<ref1.isonline>)
  ref1.sysmessage @1153 Ailenizden cikartildiniz.
endif
src.ctag.uye =
src.ctag.numara =
return 1

on = 2
for <eval <def.maxuye>> 1
  if strcmpi('<tag.uye<dlocal._for>>','') && (<tag.uye<dlocal._for>> != <src>)
    ref6 = <tag.uye<dlocal._for>>
	ref6.name <strarg <ref6.name>>
    ref6.tag.soyad =
	try uid.<ref6.tag0.kolye>.remove
	ref6.tag.kolye =
	tag.uye<dlocal._for>> =
  endif
endfor
src.name <strarg <src.name>>
serv.b @1153,1,1 <src.tag0.soyad> ailesi, <src.name> tarafından dagitildi.
src.tag.soyad =
try uid.<src.tag0.kolye>.remove
src.tag.kolye =
return 1

on = 3
src.name <strarg <src.name>>
src.tag.soyad =
try uid.<tag0.kolye>.remove
src.tag.kolye =
for <eval <def.maxuye>> 1
  if strcmpi('<tag.uye<dlocal._for>>','') && (<tag0.uye<dlocal._for>> == <src>)
    tag0.uye<dlocal._for> =
	tag0.uyeler --
  endif
endfor
ref1 = <link>
ref1.sysmessage @1153 <src.name> isimli uye ailenizden ayrildi.
src.sysmessage @1153 Ailenizden ayrildiniz.
return 1


[dialog d_uye_kayidi]
0,0
nomove

src.ctag0.aile = <argv[0]>
src.ctag0.reis = <argv[1]>
resizepic 50 50 5054 320 150
resizepic 60 60 3000 300 130
dhtmlgump 100 75 250 60 0 0 <uid.<argv[1]>.name> sizi, <uid.<argv[1]>.tag0.soyad> ailesine davet ediyor. Kabul ediyor musunuz? (Giris 50.000gp)
button 90 150 4005 4007 1 0 1
dtext 125 150 1000 Evet
button 250 150 4005 4007 1 0 2
dtext 285 150 1000 Hayir

[dialog d_uye_kayidi button]
on = 0
ref1 = <src.ctag0.reis>
ref1.sysmessage @1153 <src.name> teklifinizi red etti.
src.ctag0.aile =
src.ctag0.reis =

on = 1
ref1 = <src.ctag0.aile>
ref2 = <src.ctag0.reis>
local.bos = <eval <ref1.f_uyesayisi_kontrolu>>
if !(<dlocal.bos>)
  src.sysmessage @1153 <ref2.tag0.soyad> ailesinde bos yer kalmamis.
  ref2.sysmessage @1153 ailenizde bos yer kalmamis.
elif (<src.gold> < 50000)
  src.sysmessage @1153 Karakterinizde yeterli altin bulunmuyor (50.000gp)
  ref2.sysmessage @1153 <src.name> uzerinde yeterli altin bulunmuyor (50.000gp)
else
  local.isim <strarg <src.name>>
  src.name <local.isim> <ref2.tag0.soyad>
  src.tag.soyad <ref2.tag0.soyad>
  ref1.tag.uyeler ++
  ref1.tag.uye<dlocal.bos> = <src>
  serv.newitem i_uye_kolyesi,1,<src>
  new.link <src>
  new.more1 = <ref1>
  src.equip <new>
  src.tag.kolye = <new>
  src.gold -=50000
  src.sysmessage <ref2.tag0.soyad> ailesine katildiniz.
  for <eval <def.maxuye>> 0
    if strcmpi('<ref1.tag.uye<dlocal._for>>','')
	  ref3 = <ref1.tag.uye<dlocal._for>>
	  if (<ref3> != <src>)
	    ref3.sysmessage @1153 <src.name> ailenize katildi.
	  endif
	endif
  endfor
  src.ctag0.aile =
  src.ctag0.reis =
endif
return 1

on = 2
ref1 = <src.ctag0.reis>
ref1.sysmessage @1153 <src.name> teklifinizi red etti.
src.ctag0.aile =
src.ctag0.reis =

[eof]
Sistem 5 oyuncuyla test edilmiştir ve hiç bir fonksiyonda sorun oluşmamıştır.

Gökberkciğime yeni eklenti önerileri sunacağım
:)
Teşekkürler Gökberk.Yine çok klas bir sistem.
Master
59.2997
Evet, varsa eklenti isteklerini alabilirim.
Silindi
Master
59.2997
Aile chat ve Aile üyelerinin nerde oldugnu göstermesi && bu sistem içinde teşşekürler
Bu arada sistemde bir hata var Player Nick Diyelim Hüseyin Aile kuruyor Hüseyin Asddd diger bir player Hüseyin diye char aça biliyor

Bu konu kadirs tarafından düzenlendi(2009-07-29 19:06, 14 yıl önce)
Master
59.2997
@Kadirs

Sistem sadece soy isimlerini tesciller. Yani asd diye alınan bir aile bir daha alınamaz. Sanırım senin demek istediğin oyuncu isimleri. Soy isimleri ayrı olduktan sonra pek bir şey farketmez o aslında. Ayrıca söylediğin eklentileri eklicem en kısa sürede, aklımda var onlar.
Silindi
Master
59.2997
Normalde öle bir sorun yok Player Hasan diye isimle oyuna girdimi bir digeri hasan diye isim açamıyor fakat aile'ye girince Hasan Asd başka bir oyuncu Hasan diye isim açabiliyor sorun bu
Master
59.2997
şu tarz bir formül olabilir ona girişte kontrol ederken mesela sistemde <src.name> olarak kontrol ediliyorsa aşağıdaki ufak eklentiyi yaptırıp local.isim'i kontrol ettirirsen soyad'ı olmadan yalın haldeki ismi inceleyecektir.

local.isim <strarg <src.name>>
bu arada bilgi verelim

strarg kontrol ettiği şeyin ilk kelimesiyle işlem yapar...

// ilk boşluktan önceki kelimeyle ;)

Bu konu Slothere tarafından düzenlendi(2009-07-29 21:43, 14 yıl önce)
Silindi
Expert
4
Dedigini yaptım fakat olmadı işte bu isim o düzeni gören scp bu scp'de sana ait zaten :D

[function isimduzenle]
local.ilkharf=<strsub 0 1 <name>>
local.gerisi=<strsub 1 15 <name>>
local.1=<strtoupper(<local.ilkharf>)>
local.2=<strtolower(<local.gerisi>)>
name <local.1><local.2>
local.isim <strarg <src.name>>///Burası
update

[function isimsorgu]
obj=<uid>
forplayers 6144
if (<obj.uid> != <uid>)
if (strmatch('<obj.name>', '<uid.<uid>.name>'))
obj.name HataliNick
obj.f_isimdegis
obj.stone 1
return 1
endif
endif
endfor

[function f_isimdegis]
src.dialog d_isimdegis
return 1

[dialog d_isimdegis]
20,20
nomove
//noclose
nodispose
resizepic 0 0 5170 450 400

//dtext 25 5 0 <serv.name> Nick Menüsü
dhtmlgump 20 50 420 200 0 0 <def.bfont_red>"<src.name>" <def.bfont_black>nickinden sunucuda bulunmaktadir. Lutfen nickinizi degistiriniz. <def.br><def.br><def.bfont_red>Nickinizi degistirirken dikkat etmeniz gerekenler; <def.br><def.br><def.bfont_black>* Staff nickleri kullanmak yasaktir. <def.br>* Nickinizde "@'^!" turu simgeler kullanmak yasaktir. <def.br>* Kufur içerikli nick kullanmak yasaktir. <def.br>* Baskasinin nickini degistirip kullanmak yasaktir.<def.br>* Nickinizde boşluk bırakmanız yasaktır.

dhtmlgump 20 260 420 25 0 0 <def.bfont_red>Isminizi asagidaki kutucuga yazip onaylayin.

resizepic 100 307 3000 250 25
dtextentry 110 310 200 20 0 1 <src.name>

dhtmlgump 140 353 100 20 0 0 Tamam
button 100 350 4005 4006 1 0 1

[dialog d_isimdegis button]
on=0
src.sysmessage @025,1,1 Nickinizi degistirmeniz gereklidir..
src.dialog d_isimdegis
return 1

on=1
if (strmatch('<argtxt[1]>','')
src.sysmessage @025,1,1 Lutfen bir nick giriniz
src.sdialog d_isimdegis
return 1
endif

for 0 <eval strlen(<argtxt[1]>) -1>
if !strmatch('[a-z]','<strsub <eval <local._for>> 1 <argtxt[1]>>')
src.sysmessage @025,1,1 Hatali kullanim.
src.sdialog d_isimdegis
return 1
endif
endfor

obj=<uid>
forplayers 6144
if (<obj.uid> != <uid>
if (strmatch('<obj.name>', '<argtxt[1]>')
src.dialog d_isimdegis
src.sysmessage @025,1,1 Bu nickden sunucuda bulunmaktadir.
return 1
endif
endif
endfor

if ((strlen(<argtxt[1]>) > 12) || ((strlen(<argtxt[1]>) < 4)
src.dialog d_isimdegis
src.sysmessage @025,1,1 Nickiniz en az 4, en fazla 12 karakter olmalidir.
return 1
endif

src.name <argtxt[1]>
src.tag.isim 1
src.isimduzenle
src.sysmessage @040,1,1 Nickiniz <argtxt[1]> olarak degistirilmistir.
src.stone 0
src.isimsorgu

[eof]
Master
59.2997
[function isimsorgu]
forplayers 6144
  if (<src> != <uid>)
   local.isim = <strarg <name>>
    if (strmatch('<src.name>', '<local.isim>'))
      src.name HataliNick
      src.f_isimdegis
      src.stone 1
      return 1
    endif
  endif
endfor

Gerçi pek sağlıklı bir kullanım değil ama eski kod sonuçta şu şekilde çalışması gerekli.

// edit: düzelttim.
Silindi
Master
59.2997
Peki tşkürler oldu peki saglıklı degil derken ne konuda?
Master
59.2997
Sistem için aile chat eklentisi, diğer eklentiler yarın artık.


[plevel 1]
ac

[function ac]
if !strcmpi('<src.tag.soyad>','')
  src.sysmessage @1153 bir aileniz yok?
else
  forclients 6144
    if (<isplayer>) && !(<isgm>) && !strcmpi('<src.tag.soyad>','<tag.soyad>')
      sysmessage @1153 [Aile Chat] <src.name>: <args>
    endif
  endfor
endif
[plevel 1]
ac

[function ac]
if !strcmpi('<src.tag.soyad>','')
  src.sysmessage @1153 bir aileniz yok?
else
 serv.allclients acThick <tag.soyad>,<args>
endif

[function acThick]
if  !(<isgm>) && !strcmpi('<argtxt[0]>','<tag.soyad>')
      sysmessage @1153 [Aile Chat] <src.name>: <argtxt[1]>
endif

Bence böyle daha sağlam oldu sistem boşuna her sferinde forclients ile döngüde dolaşmaz.
Master
59.2997
@ultio

Yaptığın şekilde maalesef sistem işlemez. Ayriyetten <argtxt[x]> argümanı orada, o şekilde kullanılmaz. Bir diğer oluşacak sorun ise yapmaya çalıştığın algoritmada eğer kişi virgüllü bir yazı yazarsa onu da ayrı bir array olarak görüp virgülden sonraki bölümü göstermeyecektir. O yüzden en sağlıklı kullanım döngü ile yapılandır. Argümanlar konusunu biraz araştırmanı tavsiye ediyorum.



Üye Ol veya Giriş Yap

Bu forum başlığına mesaj atmak istiyorsanız hemen üye olun veya giriş yapın.