12 Aralık 2013 Perşembe

List Kullanımı

Kullanım alanı, öğrediğinizde bir hayli çoğalacak olan List için öncelikle söylemem gerek ki 2009 tarihinden bu yana bizlerle.

Sphere revision dosyasını açtığımızda da göreceğimiz gibi değerler, fonksiyonlar ve alt elementler aşağıdaki gibidir.

01-02-2009, Shadow Dragon
- Added: Basic LIST support.

LIST.xxx to show elements in list. Also, can be used like LIST.xxx=value to clear list and add a value
LIST.xxx.ADD to add new element to list, can be number or string
LIST.xxx.CLEAR to clear list
LIST.xxx.index to read/write value on element in list
LIST.xxx.COUNT to get count of elements in list
LIST.xxx.index.REMOVE to remove element at specified index in list
LIST.xxx.index.INSERT to insert element at specified index in list
LIST.xxx.FINDELEM search_value returns index of first found element in list. Search starting from begin
LIST.xxx.index.FINDELEM search_value returns index of first found element in list. Search starting from index
SERV.PRINTLISTS to print all lists and their elements
SERV.CLEARLISTS to clear all lists. If used with mask parameter, then clear all lists, which name countains specified mask

Peki tam anlamıyla nedir bu List? Nerelerde kullanabiliriz ve ne işimize yarar? Bize ne gibi kolaylıklar sağlar?
Yazımızın devamında bunu görelim


LIST.xxx Listedeki elementleri gösterir, LIST.xxx değer şeklinde kullanıldığında her defasında listeyi sıfırlar ve değer i ekler
LIST.xxx.ADD Listeye yeni bir element ekler
LIST.xxx.CLEAR Listeyi temizler ve siler
LIST.xxx.index index = Elementin sırasıdır. index elementinin değerini verir. LIST.xxx.1 (1 temsilidir) şeklinde kullanılır. LIST her zaman 0(sıfırdan başlar)
LIST.xxx.COUNT Liste de kaç elemen olduğunun sayısını verir. 0(sıfırdan başlar ve sayılır) 0-6 arası = 7
LIST.xxx.index.REMOVE LIST.xxx.1.REMOVE (1 temsilidir) şeklinde kullanılır. 1 e karşılık gelen elementi siler.
LIST.xxx.index.INSERT LIST.xxx.1.INSER (1 temsilidir) şeklinde kullanılır. 1 e karşılık gelen element e yeni değer verir.
LIST.xxx.FINDELEM LIST.xxx.FINDELEM aranan şeklinde kullanılır. Arananın liste elementleri içinde olup olmadığını, varsa kaçıncı element olduğunu gösterir. 0.(sıfırıncı) element 1 olarak gösterilir.
LIST.xxx.index.FINDELEM Kullanışsızdır.
SERV.PRINTLISTS Tüm listeleri gösterir.
SERV.CLEARLISTS Tüm listeleri siler

List, bir dizi elementlerin düzenli olarak sıralanmasından ibarettir. Şöyle ki;

tag.friend_0 ile tag.friend_6 arasında toplam 7(yedi) adet tag var diyelim ve bunların bir ev sisteminde kullandığımızı varsayalım.
Ev sisteminde bir target ile yeni bir oyuncuyu seçeriz ve oyuncuyu dost olarak eklemek için oyuncunun serial yani <uid> ini tag.friend_0 <uid>, tag.friend_1 <uid>diye ardışık olarak evin tablesına veya kendi serial ine veya region a (nereye kaydettiğimiz bahse konu değildir) kaydederiz. Ayrıca toplam eklenen kişi kadar sayısını elde etmemiz gerekiyor ki, bir sonraki ardışık sayıyı bulabilelim. Bunun için de bir tag atamamız gerekecek. tag0.friend_count ++ şeklinde onuda yapalım.
Bir kişi ekleme işimiz oldukça uzamaya başladı :(

Target ile gelen oyuncunun referans ını targ olarak varsayıyorum.
Tagları evin kendisine atadığınızı varsayıyorum.
tag.friend_count ++
tag.friend_<tag.friend_count> <src.targ>

diye sürekli farklı kişileri ekleyerek elde edeceğimiz sonuç;

<uid> ler temsilidir
tag.friend_0 015c7
tag.friend_1 02f35
tag.friend_2 01d45
tag.friend_3 0feb
tag.friend_4 04bbc
tag.friend_5 0460
tag.friend_6 0676d

Çoğumuz bu şekilde yaparız ve sorgula işlemlerimizi oldukça zorlar.

Alternatif yol : tag.friend_<uid> 1
Alternatif yol hakkında bu yazımda bahsetmeyeceğim

Buraya kadar herhangi bir problemimiz yok. İş bundan sonra başlıyor ve devamında bizi şunlar bekliyor.
  • Eve dost eklenen tekrar eklenmemeli (uyarı verdirmeli)
  • Eve dost olan evden atılmamalı
  • Ev sahibi bütün kasaları açabilmeli fakat dostlar bunu yapamamalı
  • Eve dost olanlar eşyaları sabitleyememeli veya hareket ettirememeli (yetkiler)
  • Ev sahibiyle birlikte sadece ortaklar yeni bir dost ekleyebilmeli

gibi sisteminizin işleyişine göre koşul maddelerini çoğaltabiliriz.

Tag.friend_x ile ardışık yazılmış bir bir sistemde sorgular for döngüsü ile yapılmalıdır. Aksi çılgınlık olur. (55i :))
Kendimize basit bir sorgu yapalım ve (yukarıdaki <uid> lerin var olduğunu sayarak), zaten yukarıdaki <uid> ler arasında olan bir oyuncuyu tekrar ekleyelim ve bizi uyarmasını sağlayalım.

Target ile gelen oyuncunun referans ını targ olarak varsayıyorum.

while !(<isempty <tag.friend_<dlocal._while>>>)
endwhile

veya

for 0 <eval <tag0.friend_count>-1>
   if (<src.targ> == <tag0.friend_<dlocal._for>>)
      src.sysmessage Bu oyuncu zaten ekli.
      return 1
   endif
endfor

Kodlamamız bu ve sadece tag.friend_x ardışıklarının arasında olup-olmadığını kontrol etmek için. Diğer sorgularda ne kadar uzadığını tahmin edebilirsiniz.

List ile neler yapılabilirdi?
Hatırlarsanız tag.friend_x leri evin bir parçasına, kendisine veya bulunduğu region a atamıştık.
Evin kendisine atadığınızı varsayıyorum.
Eğer tag ile değil de list ile yapsaydık kodlarımız şöyle olurdu.

Target ile gelen oyuncunun referans ını targ olarak varsayıyorum.
list.<uid>.add <src.targ>

İşte hepsi bu kadar..

List ile yukarıda saydığımız koşul maddeleri nasıl sorgulanır?
if (<list.<uid>.findelem <src.targ>>)
    src.sysmessage Bu oyuncu zaten ekli.
    return 1
endif

Özet olarak list kullanımı
1) list.(liste_ismi).add (değer)
(liste_ismi) adına yeni bir elemen ekler
list.(liste_ismi).add lorem
list.(liste_ismi).add ipsum
list.(liste_ismi).add dolor
list.(liste_ismi).add sit
list.(liste_ismi).add amet

2) list.(liste_ismi).0.remove
(liste_ismi) listesinde bulunan 0.(sıfırıncı) değeri siler. Sıfırıncı değer ilk sıradakidir. Silme işlemi bu komutla en üstten başlar.
0.lorem
1.ipsum
2.dolor
3.sit
4.amet

Listesine list.(liste_ismi).0.remove uygulanırsa, ilkinde şu hale dönecektir;
0.ipsum
1.dolor
2.sit
3.amet

İkincisinde;
0.dolor
1.sit
2.amet

Listenin en üstten silme kavramını sanırım anladınız..

3) list.(liste_ismi).2.remove
listedeki 2(iki) ye karşılık değeri (dolor) siler
0.lorem
1.ipsum
2.sit
3.amet

4) list.(liste_ismi).count
listede kaç elemen olduğunu gösterir
0.lorem
1.ipsum
2.dolor
3.sit
4.amet

Gösterilen sonuç: 5 olacaktır. 0-4 arası = 5

5) list.(liste_ismi).clear
tüm listeyi temiz ve siler

List kullanımında dikkat etmeniz gereken şeyler nelerdir?
Listeye element eklerken, listemiz bunu iki farklı türde algılar.
1.String
2.Numeric ve hexadecimal

String değerlere örnek
Bu bir string örnektir (düz yazı stringtir)
Bu 1 string örnektir (içinde rakam olan yazı string tir)
123 456 (boşluk olan yazı stringtir)

Numeric ve hexadecimal değerlere örnek
123123 (numeric)
123456 (numeric)
01d45 (hexadecimal)
040001feb (hexadecimal)

String veya numeric, hexadecimal değer ekleme konusu, FINDELEM ile bulacağımız elementlerde sıkıntı yaşamamanız için fazlasıyla mühimdir.
String veya numeric, hexadecimal değerler listemizin yer aldığı spheredata.scp de şöyle görünür.
[LIST liste_ismi]
ELEM="lorem"
ELEM="ipsum"
ELEM=123123
ELEM=01d45
ELEM=040001feb

Görüldüğü gibi tırnak içinde yer alan değerler STRING değerlerdir. Bunları FINDELEM ile bulmak istersek şöyle yapmalıyız.
list.<uid>.findelem "lorem"

Fakat numeric ve hexadecimal değerler için tırnak koymamıza gerek yok.
list.<uid>.findelem 123123

Sonuç olarak List komutu ve işlevi
Mantığı hepsinin aynı olmakla beraber, bir kaç uzun işlemden bizi kurtaran kullanışlı bir kavramdır. Temel olarak öğrenmeniz gereken herşeyi bu yazıda yazmış bulunmaktayım.
Oyun içinde "list.doit.add uotools" yazdıktan sonra SAVE alıp listenizin son halini spheredata.scp de görebilirsiniz.
Unutmamanız gereken kavramlar;
list.(liste_ismi).add değer element ekler
list.(liste_ismi).0.remove sıfıra karşılık gelen değeri siler
list.(liste_ismi).findelem değer değer listedeki varlığını sorgular, varsa kaçıncı sırada olduğunu söyler

4 yorum:

  1. On numara anlatım olmuş.List ile ilgili düzgün bir Türkçe döküman görememiştim bu bayağı anlaşılır olmuş.

    YanıtlaSil
  2. Malesef :) 56c ile yeni özellikler de geldi LIST e, ORDER ve SORT olayı. Sıralama ve düzenli sıralama yani.

    YanıtlaSil