İçeriğe geç

Metin2 NPC Marketi Nasıl Eklenir? shop ve shop_item Tabloları

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

Kısaca: Bir NPC marketi üç parçadan oluşur: player veritabanındaki shop tablosuna market numarası ve NPC numarası, shop_item tablosuna satılacak eşyalar ve adetleri yazılır; NPC mob_proto'da NPC türünde ve ON_CLICK 1 olmalıdır; haritanın npc.txt dosyasındaki bir m satırı NPC'yi oyuna koyar. Fiyat tablolarda yoktur, item_proto'daki Gold değeri ile adetin çarpımıdır. Marketler yalnız çekirdek açılırken yüklenir; /reload p onları yenilemez.
İçindekiler
  1. shop ve shop_item tabloları
  2. db çekirdeği marketleri nasıl okur?
  3. Fiyat nereden gelir?
  4. Vitrin düzeni: 5 × 8 pencere
  5. NPC'yi hazırlamak
  6. NPC'yi haritaya koymak
  7. Quest ile market açmak
  8. Adım adım örnek: Satıcı'ya ikinci market
  9. Başka krallık ve tarafsız harita
  10. Sekmeli market: shop_table_ex.txt
  11. Sık yapılan hatalar

Metin2'de bir NPC marketi üç parçadan oluşur: player veritabanındaki shop ve shop_item tabloları marketi ve sattığı eşyaları tanımlar, mob_proto'daki NPC satırı tıklamada marketin açılıp açılmayacağını belirler, haritanın npc.txt dosyası da NPC'yi oyuna koyar. Fiyat tablolarda yoktur; eşyanın item_proto'daki Gold değeri ile satırdaki adetin çarpımıdır. Marketler yalnız çekirdek açılırken yüklenir, /reload p onları yenilemez.

Aşağıdaki kurallar db ve game çekirdeklerinin kaynak kodundan, örnekler incelenen sunucunun market tablolarından alındı. Oyuncu gözünden hangi NPC'nin ne sattığı NPC marketleri yazısında.

shop ve shop_item tabloları

Şema player veritabanındadır:

CREATE TABLE `shop` (
  `vnum` int(11) NOT NULL DEFAULT '0',
  `name` varchar(32) NOT NULL DEFAULT 'Noname',
  `npc_vnum` smallint(6) NOT NULL DEFAULT '0',
  PRIMARY KEY (`vnum`)
);

CREATE TABLE `shop_item` (
  `shop_vnum` int(11) NOT NULL DEFAULT '0',
  `item_vnum` int(11) NOT NULL DEFAULT '0',
  `count` tinyint(4) unsigned NOT NULL DEFAULT '1',
  UNIQUE KEY `vnum_unique` (`shop_vnum`,`item_vnum`,`count`)
);
Sütun Anlamı Sınır ve not
shop.vnum Market numarası Benzersiz
shop.name Market adı Oyunda hiç okunmaz, yalnız senin için
shop.npc_vnum Marketi tıklamayla açan NPC İşaretli smallint: en fazla 32.767; 0 ise market yalnız questle açılır
shop_item.shop_vnum Satırın ait olduğu market shop'ta karşılığı yoksa satır yok sayılır
shop_item.item_vnum Satılan eşya item_proto'da bulunmalı
shop_item.count Bir alımda verilen adet 1-255

Benzersizlik anahtarı üç sütunun birlikte tekrarlanmasını engeller, yani aynı eşya farklı adetle iki satır olabilir. Satıcı marketinde Kırmızı İksir (K) 20 ve 200 adetlik iki ayrı satırla satılır.

db çekirdeği marketleri nasıl okur?

db çekirdeği açılışta tek bir sorgu çalıştırır: shop tablosunu shop_item'a sol birleştirmeyle bağlar ve sonucu önce market numarasına, sonra eşya numarasına göre sıralar. Bundan dört pratik sonuç çıkar:

  • Vitrin sırası eklediğin sıra değil, eşya numarası sırasıdır. Bir eşyayı öne almak için sıra değiştirilemez; numarası küçük olan önde durur.
  • shop tablosunda satırı olmayan shop_item satırları yok sayılır. İncelenen veride 11 numaralı marketin üç eşyası böyle boşta duruyor.
  • Sorgu hiç satır döndürmezse db "Table count is zero" der ve açılmaz. Tabloda en az bir market bulunmalı.
  • Bir market en fazla 40 satır alır. db bu sınırı kendisi denetlemez; fazlasını yazmamak senin sorumluluğundadır.

Tablolar her zaman veritabanından okunur; protoları txt'den okutan ayarlar marketleri etkilemez. Veritabanlarının geneli veritabanları yazısında.

Fiyat nereden gelir?

shop_item'da fiyat sütunu yoktur. Fiyat eşyanın item_proto'daki Gold değerinden hesaplanır:

  • Normal eşyada fiyat = Gold × adet.
  • COUNT_PER_1GOLD bayraklı eşyada fiyat = adet ÷ Gold; bu bayrakta Gold, 1 Yang'a kaç adet verileceğini gösterir. Gold 0 ise adet kadar Yang alınır.
  • Gold 0 olan normal eşya bedavadır. İncelenen veride Satıcı'nın sattığı İçgörü Küresi ve saç marketlerindeki saç modelleri böyle tanımlı.

Oyuncunun NPC'ye sattığı eşyanın fiyatı ise ShopBuyPrice sütunundan gelir: ShopBuyPrice × adet ÷ 5, ardından %3 vergi düşülür ve vergi krallık hazinesine gider. Market kurarken her eşyanın alış fiyatının bu satış değerinden yüksek olduğunu kontrol et; tersi, markette alınıp NPC'ye satılarak Yang üreten bir döngü açar.

Adet sütununda iki tuzak var. Yığılabilen eşya oluşturulurken adet 200'e kırpılır (bu sınır bazı kaynaklarda CONFIG'deki ITEM_COUNT_LIMIT satırıyla değiştirilebilir), yığılamayan eşya ise her zaman 1 adet oluşur. Fiyat ise tablodaki adetle hesaplanır. 250 adetlik bir iksir satırında oyuncu 250 adetin parasını öder ama 200 alır; bir kılıç satırına 5 adet yazarsan beş kılıcın parasını ödeyip tek kılıç alır. Yığılamayan eşyalarda adeti 1, yığılanlarda sınırın altında tut. Gold, ShopBuyPrice ve Size sütunlarının geneli item_proto yazısında.

Vitrin düzeni: 5 × 8 pencere

İstemcinin market penceresi 5 sütun ve 8 satırdır, yani 40 hücre. Eşyalar eşya numarası sırasıyla alınır ve her biri item_proto'daki Size değerine göre (1-3 hücre boy) yukarıdan aşağı, soldan sağa ilk boş yere oturur. Silah ve zırhlar 2-3 hücre kapladığı için 40 hücreye 40 eşya sığmaz; incelenen verinin en dolu marketi olan Silah Satıcısı 23 eşyayla 40 hücrenin 39'unu dolduruyor.

Yerleşimde dikkat isteyen bir davranış var: bir eşya yerleştirilemediğinde (item_proto'da yoksa ya da pencerede yeri kalmadıysa) sunucu sonraki eşyalara geçmez, o satırdan sonra gelen eşyaların hiçbiri vitrine girmez. Günlükte "Shop: no item table by item vnum" ya da "not enough shop window" görürsen sorun o eşyadadır. Eşyaların toplam boyu 40 hücreyi aşmasın; 8. satırdan taşan eşya istemcide görünmez.

NPC'yi hazırlamak

Marketi tıklamayla açacak NPC'nin mob_proto satırında TYPE NPC, ON_CLICK 1 olmalıdır. ON_CLICK 2 (konuşma) tıklamada hiçbir şey yapmaz, 3 ve üstü bir değer ise NPC doğduğu anda çekirdeği "invalid OnClick value" hatasıyla durdurur. Varsayılan veride 9001-9004, 9007-9009 ve 20042 numaralı NPC'ler 1; Depocu ve Hong-Hae gibi NPC'ler 2'dir, bu yüzden onlara bağlı marketler tıklamayla açılmaz.

NPC'nin istemcide görünmesi için iki şey daha gerekir: istemcinin mob_proto dosyasında NPC'nin satırı (ad ve tıklama işareti oradan gelir) ve root/npclist.txt dosyasında vnum<TAB>model klasörü satırı, örneğin 9003 goods. Bu dosyada ayıraç sekme olmalıdır; boşlukla yazılan satır istemciyi açılışta durdurur. mob_proto sütunlarının ayrıntısı mob_proto yazısında.

NPC'yi haritaya koymak

NPC, haritanın npc.txt dosyasına sıfır yarıçaplı bir m satırıyla konur. Satıcı Yongan Bölgesi'nde böyle durur:

m	678	565	0	0	0	8	1m	100	1	9003

Sütunlar sırasıyla tür, x, y (yerel metre), iki yarıçap, z, yön (1-8), kontrol süresi, okunmayan yüzde, adet ve NPC numarasıdır. NPC'ler güvenli bölgeye ve yürünemez hücreye de konabilir; canavarlara uygulanan yer kontrolü onlara uygulanmaz. Satır biçiminin tamamı regen dosyaları yazısında. Oyuncu marketi NPC'ye 10 metreden yakınken açabilir; alım ve satım 20 metreye kadar sürer. Depo, ticaret, kişisel pazar ya da küp (cube) penceresi açıkken market açılmaz.

Quest ile market açmak

NPC'ye tıklandığında önce quest sistemi denenir. O NPC için gösterilecek bir chat seçeneği ya da click olayı varsa menü açılır ve market açılmaz, ON_CLICK 1 olsa bile. Bu durumda menüye marketi açan bir seçenek eklenir. Balıkçı'nın questi böyledir:

quest fisher begin
    state start begin
        when 9009.chat."Marketi aç " begin
            npc.open_shop()
            setskin(NOWINDOW)
        end
    end
end
  • npc.open_shop() konuşulan NPC'nin numarasına bağlı marketi açar.
  • npc.open_shop(1005) numarası verilen marketi açar; marketin npc_vnum değerine bakılmaz. npc_vnum'u 0 olan marketler yalnız bu yolla açılır.

Aynı npc_vnum'a birden çok market bağlanırsa tıklama en küçük numaralı marketi açar, diğerleri ancak quest içinden numarasıyla açılır; varsayılan veride 2000-2003 numaralı saç marketleri aynı NPC'ye bağlıdır. Var olmayan bir numara verilirse pencere açılmaz, yalnız günlüğe "SHOP: NO SHOP" düşer. İncelenen sunucudaki simya marketi questi 51 numaralı marketi çağırıyor, ama tabloda böyle bir market yok. Quest dosyasının yazılması ve derlenmesi quest yazma yazısında.

Adım adım örnek: Satıcı'ya ikinci market

Satıcı'nın (9003) mevcut marketine dokunmadan ona yükseltme kâğıtları satan ikinci bir market eklemek için önce tablolara satırları yaz. SQL'i çalıştırmadan önce player veritabanının yedeğini al; veritabanı portunu internete açık bırakma, düzenlemeyi sunucunun kendisinden ya da güvenli bir tünel üzerinden yap.

INSERT INTO shop (vnum, name, npc_vnum) VALUES (3001, 'satici_kagitlar', 9003);
INSERT INTO shop_item (shop_vnum, item_vnum, count) VALUES
  (3001, 25040, 1),
  (3001, 25041, 1),
  (3001, 25100, 1);

Satıcı'nın 3 numaralı marketi daha küçük numaralı olduğu için tıklama yine onu açar; 3001'e quest ile ulaşılır. Satıcı'ya chat seçeneği eklenince tıklama artık doğrudan market değil menü açacağından, eski marketi de menüye koymak gerekir:

quest satici_menu begin
    state start begin
        when 9003.chat."Marketi aç " begin
            setskin(NOWINDOW)
            npc.open_shop()
        end
        when 9003.chat."Yükseltme kâğıtları " begin
            setskin(NOWINDOW)
            npc.open_shop(3001)
        end
    end
end

Questi derleyip listeye ekledikten sonra db ve oyun çekirdeklerini yeniden başlat. Fiyatlar item_proto'dan gelir: Kutsama Kağıdı ve Büyülü Metal 5.000, Zihin Taşı Kağıdı 10.000 Yang.

Başka krallık ve tarafsız harita

Oyuncu ile NPC'nin krallığı farklıysa market listesi üç katı fiyatla gösterilir. NPC'nin krallığı mob_proto'daki EMPIRE sütunundan gelir; 0 ise NPC krallık haritasındaysa (1-60) o haritanın krallığını alır. Tahsilat market türüne göre değişir: incelenen kaynaktaki klasik markette üç katı alan satır devre dışı bırakılmış, oyuncu listedeki değil normal fiyatı öder; sekmeli markette ise üç katı tahsil edilir. CONFIG'deki DISABLE_SHOP_PRICE_3X satırı (ya da SHOP_PRICE_3X_TAX: 0) yalnız listedeki gösterimi kapatır, sekmeli marketin tahsilatını değiştirmez. Bu CONFIG satırı sonradan eklenmiş bir ayardır, her sunucu kaynağında bulunmaz.

Tarafsız haritada bunun bir yan etkisi var. 1-60 dışındaki bir haritaya konan ve EMPIRE'i 0 olan market NPC'sinin krallığı 0 kalır ve bütün oyuncular ona göre "başka krallık" sayılır: klasik markette herkes listeyi üç katı görür, sekmeli markette herkes üç katı öder. Klasik markette CONFIG satırı gösterimi düzeltir. Sekmeli marketi tarafsız haritaya koyacaksan bu kuralı kaynak kodda değiştirmen gerekir; NPC'ye krallık vermek yalnız o krallığın oyuncularını kurtarır.

Sekmeli market: shop_table_ex.txt

Bir NPC'ye en fazla üç sekmeli ve her satırı ayrı fiyatlı bir market vermek için share/locale/turkey/shop_table_ex.txt dosyası kullanılır. Dosya yoksa sorun olmaz; incelenen sunucuda da yok.

Group ShopNPC
{
	#--#	npc	group
	1	9006	sac_market
}
Group sac_market
{
	Vnum	5001
	Name	Saclar
	CoinType	Gold
	Sort	None
	Group items
	{
		#--#	vnum	count	price
		1	73001	1	50000
		2	73002	1	50000
	}
}
  • ShopNPC grubunda her satır bir NPC'yi bir market grubuna bağlar; aynı NPC üç gruba kadar bağlanabilir, her grup bir sekme olur.
  • Her market grubunda Vnum (shop tablosundaki numaralarla çakışmamalı), Name (sekme adı; tek kelime ve 32 karakterden kısa, boşluktan sonrası okunmaz), CoinType (Gold ya da SecondaryCoin), Sort (Asc, Desc ya da None) ve items alt grubu bulunur. Sort None iken satırlar ilk sütundaki anahtarın yazı sırasıyla dizilir: 1, 10, 11, 2 ...
  • items en fazla 39 satır alır ve her satıra ayrı fiyat yazılır; fiyatı 0 olan satır satın alınamaz. Toplam boy yine 40 hücreyi geçmemeli.
  • Aynı NPC'nin hem shop tablosunda hem bu dosyada marketi olamaz. Bu ya da dosyadaki başka bir hata, oyun çekirdeğini açılışta "shop table Initialize error" ile kapatır.

Örnekteki 9006 (Yaşlı Kadın) shop tablosunda marketi olmayan bir NPC'dir; ON_CLICK değeri 2 olduğu için sekmeli marketi quest içinden npc.open_shop() açar.

Sık yapılan hatalar

  • Marketi değiştirip yalnız /reload p yapmak: oyun çekirdekleri eski marketi göstermeye devam eder.
  • shop_item'a item_proto'da olmayan bir numara yazmak: o eşyadan sonra gelen eşyalar da vitrinden kaybolur.
  • Vitrini 40 hücreden fazla doldurmak: taşan eşyalar görünmez, yerleşmeyen eşyadan sonrakiler de kaybolur.
  • Yığılamayan eşyaya 1'den büyük, yığılana yığın sınırından (200) büyük adet yazmak: oyuncu fazla öder, eksik alır.
  • Gold değeri 0 olan eşyayı markete koymak: eşya bedava dağıtılır.
  • NPC'nin ON_CLICK değerini 1 yapıp aynı NPC'ye chat olayı tanımlayan bir quest bırakmak: tıklama menüyü açar, market açılmaz.
  • npclist.txt'ye satırı boşlukla yazmak: istemci açılmaz.
  • Tarafsız haritaya krallıksız market NPC'si koyup üç kat fiyatı hesaba katmamak.

Sık sorulan sorular

Markete eşya ekledim ama oyunda görünmüyor. Neden?
Marketler yalnız çekirdek açılırken yüklenir; /reload p onları yenilemez. Değişiklikten sonra db ve oyun çekirdeklerini yeniden başlat. Yine görünmüyorsa eşya item_proto'da olmayabilir ya da pencereye sığmamış olabilir; bu iki durumda o eşyadan sonra gelen eşyalar da vitrine girmez.
Market fiyatı nereden ayarlanır?
shop_item tablosunda fiyat sütunu yoktur. Fiyat item_proto'daki Gold değeri ile satırdaki adetin çarpımıdır; fiyatı değiştirmek için eşyanın Gold değerini değiştirmek gerekir. Satır başına ayrı fiyat istiyorsan shop_table_ex.txt ile sekmeli market kurabilirsin.
NPC'ye tıklayınca market yerine konuşma menüsü açılıyor. Neden?
Tıklamada önce quest sistemi denenir. O NPC için gösterilecek bir chat seçeneği ya da click olayı varsa menü açılır ve market açılmaz. Menüye npc.open_shop() çağıran bir seçenek eklemek gerekir; Balıkçı'nın 'Marketi aç' seçeneği böyle çalışır.
Aynı NPC'ye iki market bağlayabilir miyim?
Bağlayabilirsin, ama tıklama yalnız en küçük numaralı marketi açar. Diğerleri quest içinden npc.open_shop(market_numarası) ile açılır.

İlgili sayfalar

Kategori: Server Kurma Proto ve Veri Dosyaları veritabanı npc market shop shop_item npc.txt

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.