Metin2 item Tablosu: window, pos, socket ve attr Sütunları
Hazırlayan: Metin2VIP Editörleri Yayın: 7 dk okuma
İçindekiler
- item tablosunun sütunları
- window: eşya hangi pencerede?
- pos: envanter kutuları nasıl numaralanır?
- EQUIPMENT: ekipman yuvaları
- Kemer, simya, depo ve Nesne Marketi Deposu
- Taş yuvaları: socket0, socket1, socket2
- Efsunlar: attrtype ve attrvalue
- Örnek satır
- Eşya verirken sık yapılan hatalar
- İ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 paketlerinsql/updates/postklasöründeki dosyalar onları kemer penceresine taşır.DRAGON_SOUL_INVENTORY: simya taşlarının envanteri.SAFEBOX:owner_idhesap 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.sizebelirler. Hesabınsafebox_expiresü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_idhesap numarasıdır; oyunda 3 sayfa (135 kutu) açılır, ama dbitem_awardeş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
- 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_awardile, doğrudanitemtablosuna ise sunucu kapalıyken verilir. - Depo eşyasına karakter numarası yazmak. SAFEBOX ve MALL'da
owner_idhesap numarasıdır. - 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.
- 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'aUNIX_TIMESTAMP() + süreyazılır;item_awardbu alanı kendisi doldurur (süreli eşyalar). - Adet sınırını aşmak. Yığılmayan bir eşyada
counther zaman 1 sayılır, yığılan eşyada en çok CONFIG'deki ITEM_COUNT_LIMIT kadardır (varsayılan 200). - 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.
- socket3-5'e değer yazmak. Kullanılmaz, ilk kayıtta sıfırlanır.
- item_award'dan efsunlu eşya beklemek.
item_awardyalnızsocket0-socket2taşır; efsunlu eşya sunucu kapalıyken doğrudanitemtablosuna eklenir.
İlgili kod yerleri
- db'nin okuması ve sütun sırası:
db/src/ClientManagerPlayer.cpp,CreateItemTableFromResve karakter yükleme sorgusu. - db'nin yazması:
db/src/Cache.cpp,CItemCache::OnFlush(REPLACE vesocket0-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
- Metin2 6. ve 7. Efsun: Nadir Efsunlar Nasıl Eklenir ve Ne İşe Yarar? (Wiki)
- Metin2 Depo Sistemi: Depo Boyutu, Şifre ve Nesne Market Deposu (Wiki)
- Metin2 item_proto Rehberi: Sütunlar, Türler ve Bayraklar (Server kurma)
- Metin2 Kemer ve Envanter: Kemer Envanteri Kaç Yuva Açar, Envanter Kaç Sayfa? (Wiki)
- Metin2 Süreli Eşyalar: Gerçek Zamanlı ve Kullanım Süreli Eşyalar Nasıl İşler? (Wiki)
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?