İçeriğe geç

Metin2 item Tablosu: window, pos, socket ve attr Sütunları

Hazırlayan: Metin2VIP Editörleri Yayın: 7 dk okuma

Kısaca: item tablosu her eşyanın satırıdır: owner_id sahibi, window penceresi (INVENTORY, EQUIPMENT, SAFEBOX, MALL, DRAGON_SOUL_INVENTORY, BELT_INVENTORY), pos kutu numarasıdır. Envanterde pos = sayfa × 45 + satır × 5 + sütun, ekipmanda yuva numarası, depoda owner_id hesap numarasıdır. socket0-2 taş yuvalarını (0 kapalı, 1 gümüş, 2 altın, taşın vnum'u) ya da süreli eşyada bitiş zamanını tutar; attrtype0-4 normal efsunlar, attrtype5-6 6. ve 7. efsundur.
İçindekiler
  1. item tablosunun sütunları
  2. window: eşya hangi pencerede?
  3. pos: envanter kutuları nasıl numaralanır?
  4. EQUIPMENT: ekipman yuvaları
  5. Kemer, simya, depo ve Nesne Marketi Deposu
  6. Taş yuvaları: socket0, socket1, socket2
  7. Efsunlar: attrtype ve attrvalue
  8. Örnek satır
  9. Eşya verirken sık yapılan hatalar
  10. İlgili kod yerleri

player.item tablosu sunucudaki her eşyanın satırıdır: kime ait olduğu (owner_id), hangi pencerede ve kaçıncı kutuda durduğu (window, pos), adedi (count), ne olduğu (vnum), takılı taşlar ya da süre gibi ek değerleri (socket0-socket2) ve efsunları (attrtype, attrvalue çiftleri). db çekirdeği karakterin envanter, ekipman, simya ve kemer eşyalarını girişte bir kez okuyup önbellekte tutar; depo ve Nesne Marketi Deposu eşyaları ise depo açıldığında hesap numarasıyla okunur.

Pencere ve yuva numaraları derlemeye bağlıdır. Aşağıda orijinal yapının değerleriyle birlikte envanteri dört sayfaya çıkaran, kostüm ve kuşak yuvaları eklenmiş yaygın topluluk derlemesinin değerleri verildi; kendi derlemen için common/length.h dosyasına bakmak gerekir. Tablonun yeri ve diğer tablolar Metin2 veritabanları yazısında.

item tablosunun sütunları

Sütun Tür Anlamı
id int, otomatik Eşyanın benzersiz kimliği; günlüklerde eşyanın izini sürmeye yarar
owner_id int Envanterde ve ekipmanda karakter numarası, depoda hesap numarası
window ENUM Eşyanın penceresi
pos smallint Penceredeki kutu ya da yuva numarası
count tinyint (0-255) Adet
vnum int Eşyanın item_proto numarası; artı seviyesi vnum'dadır (Kılıç+0 10, Kılıç+9 19)
socket0-socket2 int Taş yuvaları ya da eşyaya göre süre, beceri numarası gibi değerler
socket3-socket5 int Şemada var, kullanılmaz
attrtype0-attrtype4, attrvalue0-attrvalue4 tinyint, smallint Beş normal efsun
attrtype5-attrtype6, attrvalue5-attrvalue6 tinyint, smallint 6. ve 7. efsun

window: eşya hangi pencerede?

window Numara owner_id Ne zaman okunur
INVENTORY 1 Karakter Girişte
EQUIPMENT 2 Karakter Girişte, eşya giydirilerek
SAFEBOX 3 Hesap Depo açılınca
MALL 4 Hesap Nesne Marketi Deposu açılınca
DRAGON_SOUL_INVENTORY 5 Karakter Girişte (simya taşları)
BELT_INVENTORY 6 Karakter Girişte (kemer envanteri)
GROUND 7 Yok Okunmaz

db window sütununu okurken ve yazarken ENUM'un sıra numarasını kullanır; bu numara oyunun kendi pencere numaralarıyla birebir aynıdır. ENUM'a yeni bir pencere eklenecekse sona eklenmeli, araya değer sokulmamalıdır; yoksa bütün eşyalar başka bir pencereye kayar. GROUND sonradan bir güncellemeyle eklenir: yere atılan eşyanın satırı kayıtta silinir, biri eşyayı alınca aynı kimlikle yeni sahibinin adına yeniden yazılır.

pos: envanter kutuları nasıl numaralanır?

Bir envanter sayfası 5 sütun ve 9 satır, yani 45 kutudur. Kutular soldan sağa, yukarıdan aşağı numaralanır.

Orijinal yapıda envanter 2 sayfadır, pos 0-89 arasıdır. Envanteri 4 sayfaya çıkaran derlemelerde (ENABLE_EXTEND_INVEN_SYSTEM) pos 0-179 arasıdır; istemcinin de 4 sayfayı desteklemesi gerekir.

Büyük eşyalar alt alta birden çok kutu kaplar. item_proto'daki boyutu 2 olan bir Kılıç pos ve pos + 5 kutularını, boyutu 3 olan bir eşya ayrıca pos + 10'u kullanır. SQL ile satır eklerken bu kutuların boş olması ve eşyanın sayfanın altından taşmaması gerekir; oyun yüklerken yalnız başlangıç kutusunun dolu olup olmadığına bakar. Boyutun ve diğer eşya alanlarının anlamı item_proto yazısında.

EQUIPMENT: ekipman yuvaları

Giyilen eşyalarda pos yuva numarasıdır. Oyun içinde bu yuvalar envanterin son kutusundan sonra gelir, ama db'ye yuva numarası olarak yazılır:

pos Yuva
0 Zırh
1 Kask
2 Ayakkabı
3 Bilezik
4 Silah
5 Kolye
6 Küpe
7, 8 Özel eşya (takı) yuvaları
9 Ok
10 Kalkan
11-18 Kullanılmayan eski yuvalar
19 Kostüm
20 Kostüm saç
21 Binek kostümü (ENABLE_MOUNT_COSTUME_SYSTEM)
22 Kuşak (ENABLE_ACCE_SYSTEM)
23 Kemer
24 Silah kostümü (ENABLE_WEAPON_COSTUME_SYSTEM)

21, 22 ve 24 numaralı yuvalar ilgili özellik kapalıysa yoktur ve sonraki numaralar kayar; bu yüzden numarayı kendi derlemendeki EWearPositions sırasından doğrula. Takılı simya taşları da ekipman penceresinde, son yuvadan sonraki numaralarda durur.

Ekipmandaki eşya girişte karaktere giydirilir. Karakterin seviyesi eşyanın şartını tutmuyorsa ya da yuva doluysa eşya envanterin ilk boş kutusuna konur. Envanter de doluysa karakterin yanına yere düşer: 3 dakika yalnız o karakter alabilir, 5 dakika sonra yok olur.

Kemer, simya, depo ve Nesne Marketi Deposu

  • BELT_INVENTORY: kemer envanteri 4 × 4 = 16 kutudur, pos 0-15; kaç kutunun açık olduğunu kemerin seviyesi belirler (kemer ve envanter). Eski kurulumlarda bu eşyalar envanter penceresinde, ekipman yuvalarından sonraki numaralarda tutulur; yaygın paketlerin sql/updates/post klasöründeki dosyalar onları kemer penceresine taşır.
  • DRAGON_SOUL_INVENTORY: simya taşlarının envanteri.
  • SAFEBOX: owner_id hesap numarasıdır; aynı hesabın bütün karakterleri aynı depoyu görür. Depo sayfası da 5 × 9 = 45 kutudur, sayfa sayısını safebox.size belirler. Hesabın safebox_expire süresi devam ediyorsa ya da karakter büyük depo eşyasını takıyorsa depo 3 sayfa açılır. Geçersiz konumdaki ya da başka eşyayla çakışan depo eşyası gösterilmez ama satırı silinmez. Oyuncu tarafı depo yazısında.
  • MALL: Nesne Marketi Deposu. owner_id hesap numarasıdır; oyunda 3 sayfa (135 kutu) açılır, ama db item_award eşyalarını yalnız ilk sayfanın 45 kutusuna yerleştirir.

Taş yuvaları: socket0, socket1, socket2

Silah ve zırhta üç soket taş yuvasıdır:

Değer Anlamı
0 Yuva yok
1 Açık, boş gümüş yuva
2 Açık, boş altın yuva; altın yuva isteyen taşlar yalnız buraya girer
Taşın vnum'u, ör. 28030 Takılı taş, burada Kavrama Taşı+0
28960 Kırılmış Taş Parçası: taş takılırken kırılmıştır

Yeni yaratılan bir eşyanın kaç açık yuvayla geleceğini item_proto belirler, ama SQL ile yazılan yuva sayısını oyun yüklerken denetlemez. Taş takmanın kuralları taş takma yazısında.

Bazı eşyalarda aynı sütunlar taş yerine başka bir değer tutar:

Eşya Soket
Gerçek zamanlı süreli eşyalar socket0 bitiş zamanıdır (UNIX saniyesi)
Beceri Kitabı socket0 öğreteceği becerinin numarasıdır
Dönüşüm Küresi socket0 dönüşülecek canavarın numarasıdır
Özel eşya (ITEM_UNIQUE) takıları socket2 kalan süre ya da bitiş zamanıdır

socket3, socket4 ve socket5 şemada bulunur ama db onları ne okur ne yazar. Eşyayı her kaydedişte satırı REPLACE ile baştan yazdığı için bu sütunlara elle konan değer ilk kayıtta sıfırlanır.

Efsunlar: attrtype ve attrvalue

Yedi efsun çifti vardır. İlk beşi (attrtype0-attrtype4) normal efsunlar, son ikisi (attrtype5, attrtype6) 6. ve 7. efsun yuvalarıdır. attrtype efsunun türünü APPLY numarasıyla, attrvalue değerini tutar; boş bir çift 0, 0'dır.

attrtype Efsun
1 Max. HP
2 Max. SP
3 Canlılık
4 Zeka
5 Güç
6 Çeviklik
7 Saldırı Hızı
8 Hareket Hızı
9 Büyü Hızı
15 Kritik Vuruş Şansı
16 Delici Vuruş şansı
17 Yarı insanlara karşı güçlü
18-22 Hayvanlara, orklara, mistiklere, ölümsüzlere, şeytanlara karşı güçlü
27 Yakın dövüş saldırılarını bloklama şansı
28 Oklardan korunma şansı
29-34 Kılıç, çift el, bıçak, çan, yelpaze ve ok savunması
63 Canavarlara karşı güçlü

Bütün numaralar efsun listesi sayfasında. Değerler oyunun efsun tablosundaki beş seviyeden gelir; varsayılan tabloda silahtaki yarı insan efsunu en çok %10'dur. Oyun yüklerken değeri denetlemez, bu yüzden tablonun dışında bir değer yazmak mümkündür ama ekonominin dengesini bozar. attrtype işaretli tinyint olduğundan en büyük efsun numarası 127'dir.

Örnek satır

Envanterin ilk kutusunda, bir açık gümüş yuvalı ve iki efsunlu bir Kılıç+9:

id owner_id window pos count vnum socket0 attrtype0 attrvalue0 attrtype1 attrvalue1
otomatik 1234 INVENTORY 0 1 19 1 17 10 15 10

Kılıç'ın boyutu 2 olduğu için 0 ve 5 numaralı kutular boş olmalıdır. Bu satırı ekleyen sorgu ve öncesinde yapılacaklar MySQL ile sık yapılan işlemler yazısında.

Eşya verirken sık yapılan hatalar

  1. Sunucu açıkken item tablosuna satır eklemek. Oyundaki karakter yeni satırı görmez; eşya ancak karakter çıkıp önbellek boşaldıktan sonraki girişte gelir ve kutu o arada dolmuşsa başka yere taşınır. Daha sinsi sorun kimliktir. Her oyun çekirdeği açılışta db'den 10 milyonluk bir kimlik bloğu alır ve yeni eşyalara oradan sırayla numara verir; db bu blokları açılışta tablodaki en büyük kimliğe bakarak kurar. Sunucu açıkken otomatik numarayla eklenen satır, bir çekirdeğin birazdan kendi eşyasına vereceği kimliği alabilir; o eşya kaydedildiğinde REPLACE senin satırını ezer. Sunucu açıkken eşya item_award ile, doğrudan item tablosuna ise sunucu kapalıyken verilir.
  2. Depo eşyasına karakter numarası yazmak. SAFEBOX ve MALL'da owner_id hesap numarasıdır.
  3. Dolu kutuya eşya koymak. Başlangıç kutusu doluysa oyun eşyayı ilk boş kutuya taşır, envanter doluysa yere atar. Büyük eşyanın alt kutuları denetlenmediği için üst üste binen eşyalar envanteri bozar.
  4. Süreli eşyada socket0'ı boş bırakmak. Gerçek zamanlı süreli bir eşyanın socket0'ı 0 ya da geçmiş bir zamansa eşya, oyuncu girer girmez REAL_TIME_EXPIRE kaydıyla silinir. socket0'a UNIX_TIMESTAMP() + süre yazılır; item_award bu alanı kendisi doldurur (süreli eşyalar).
  5. Adet sınırını aşmak. Yığılmayan bir eşyada count her zaman 1 sayılır, yığılan eşyada en çok CONFIG'deki ITEM_COUNT_LIMIT kadardır (varsayılan 200).
  6. Olmayan bir vnum yazmak. item_proto'da bulunmayan bir eşya oluşturulamaz; satır tabloda kalır ama oyunda görünmez, syserr'e "cannot create item by vnum" yazılır.
  7. socket3-5'e değer yazmak. Kullanılmaz, ilk kayıtta sıfırlanır.
  8. item_award'dan efsunlu eşya beklemek. item_award yalnız socket0-socket2 taşır; efsunlu eşya sunucu kapalıyken doğrudan item tablosuna eklenir.

İlgili kod yerleri

  • db'nin okuması ve sütun sırası: db/src/ClientManagerPlayer.cpp, CreateItemTableFromRes ve karakter yükleme sorgusu.
  • db'nin yazması: db/src/Cache.cpp, CItemCache::OnFlush (REPLACE ve socket0-socket2).
  • Oyunun kaydettiği konum: game/src/item_manager.cpp, SaveSingleItem (ekipmanda yuva numarası, kemerde 0-15, depoda hesap numarası).
  • Girişte yerleştirme: game/src/input_db.cpp, CInputDB::ItemLoad.
  • Kimlik blokları: db/src/ItemIDRangeManager.cpp.

Sık sorulan sorular

Metin2 item tablosunda pos nasıl hesaplanır?
Envanterde bir sayfa 5 sütun ve 9 satırdır, kutular soldan sağa, yukarıdan aşağı numaralanır: pos = sayfa × 45 + satır × 5 + sütun, hepsi 0'dan başlar. 2. sayfanın ilk kutusu 45'tir. Ekipmanda pos yuva numarasıdır (0 zırh, 4 silah gibi), depoda ise depo sayfalarındaki kutu numarasıdır.
item tablosunda socket0 değeri 1 ne demek?
Silah ve zırhta 1 açık ve boş bir gümüş taş yuvası demektir; 2 açık altın yuva, 0 yuva yok, büyük bir sayı ise takılı taşın vnum'udur. Süreli eşyalarda ise socket0 eşyanın bitiş zamanını UNIX saniyesi olarak tutar.
SQL ile eklediğim eşya oyunda görünmüyor, neden?
En sık sebepler: karakter o sırada db önbelleğindeydi, depo eşyasına hesap yerine karakter numarası yazıldı, window yanlış seçildi, vnum item_proto'da yok ya da süreli eşyanın socket0'ı boş bırakıldığı için eşya girişte silindi.
6. ve 7. efsun item tablosunda hangi sütunlarda?
attrtype5-attrvalue5 ve attrtype6-attrvalue6 çiftlerinde. İlk beş çift (attrtype0-attrtype4) normal efsunlardır.

İlgili sayfalar

Kategori: Server Kurma Server Kurulumu efsun mysql envanter item tablosu taş yuvası

Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.