Ada İçi Alışveriş İşlemleri Verse cihazı, ada içi alışveriş işlemleri için bir şablon içerir. Verse API’sindeki Marketplace modülünün temel unsurlarına yönelik tüm uygulamalara sahiptir. Buna eşyalar, teklifler, paket teklifleri ve varsayılan vitrin kullanıcı arayüzü kullanılarak satın alımların yönetilmesi dahildir. Bu kodu, vitrinini hızlı bir şekilde kurmak için bir kılavuz olarak kullanabilirsin.
Cihaza erişmek için:
Verse Gezgini’ne git.
Proje adına sağ tıkla.
Projeye Yeni Verse Dosyası Ekle kısmını seç.
Ada İçi Alışveriş İşlemleri Cihazı’nı seç.
Eşya Oluşturma
Verse’te eşyalar, “haklar” (entitlement) olarak tanımlanır ve şu iki kategoriden birine dahil olur: Kullanım sonrasında oyuncu çantasından kaldırılan tek kullanımlık eşyalar ve oyuncunun, çantasından kaldırılmadan kullanmaya devam edebileceği dayanıklı eşyalar.
EntitlementInfo Modulü
Modüller, birden fazla dosyada kullanılmak üzere yeniden dağıtılabilecek atomik kod birimleridir. Modüller, bir modülün halihazırda kullanılmış olduğu dosyalardaki bağımlılıklar bozulmadan zaman içinde değiştirilebilir. Hak tanımları gibi uzun veya tekrarlayan kod birimlerini farklı bir dosyaya ayırabilir ve ardından bunları “using” ifadesiyle içe aktarabilirsin.
EntitlementInfo modülü şablondaki tüm hakların adlarını, açıklamalarını ve kısa açıklamalarını toplar. Bu modülü, aynı ürün için adı ve diğer değişkenleri art arda yeniden tanımlamaya gerek kalmadan, hakları tanımlamaya ihtiyaç duyduğun herhangi bir dosyaya dahil et. Böylece, hak bilgilerinde değişiklik yapmak ve haklarındaki hataları ayıklamak daha kolay hale gelir.
# Setup your entitlements and offers data, in this case that's your Names, Descriptions & Short Descriptions as well as any other data you want to be constant
EntitlementInfo<public> := module:
Potion<public> := module:
Name<public><localizes>:message = "Potion"
Description<public><localizes>:message = "Adds +10 health when used. Green so you know its healthy!"
Hakların Tanımlanması
Verse’te tanımlanan her hak, aşağıdaki özelliklere sahiptir:
Ad: En fazla 50 karakterden oluşan hak adı.
Açıklama: Hak ile birlikte görüntülenen, en fazla 500 karakterden oluşan uzun açıklama.
Kısa Açıklama: En fazla 100 karakterle hakkı özetleyen kısa açıklama.
Simge: Hakkın görseli.
Eğer hakkın bir ücretli rastgele eşya ise, açıklamada oyuncunun alabileceği şeylerin doğru sayısal olasılığını belirtmen gerekir. Daha fazla bilgi için
Bir Verse ürünü (hakkı) aşağıdaki isteğe bağlı özelliklere de sahip olabilir:
MaxCount (Maksimum Sayı): Bir hakkın, oyuncunun bir defada sahip olabileceği maksimum miktarı.
Consumable (Tek Kullanımlık): Bu değer true olarak ayarlanırsa hak
ConsumeEntitlementile tüketilebilir ve bu da kullanıcının Epic sistemlerindeki toplam tüketilmiş hak sayısını azaltır. False olarak ayarlanırsa, hak kalıcı bir eşyadır ve kullanıldığında tüketilmez.PaidArea (Ücretli Alan): Bu değer true olarak ayarlanırsa hak ödeme duvarının arkasındaki bir alana erişim sağlar.
PaidRandomItem (Ücretli Rastgele Eşya): Bu değer true olarak ayarlanırsa bu haklar rastgele bir ödül elde etmek için satın alınır veya içerik karşılığında alınır.
ConsequentialToGameplay (Oynanış Üzerinde Etkili): Bu değer true olarak ayarlanırsa bu eşya adanda anlamlı bir avantaj sağlar. Daha ayrıntılı bilgi için Oynanış Üzerinde Etkili kısmına bakabilirsin.
Aşağıdaki kod parçacığında, haklarının tanımlarını oluşturmak için daha önce tanımlanmış EntitlementInfo modülünü kullanacaksın. Tek kullanımlık bir hak tanımlamak için Consumable değeri true olarak ayarlanmalıdır.
Haklarını tanımlamadan önce, deneyimindeki haklar için kullanılacak temel bir hak sınıfı oluşturman gerekiyor.
Bu da bu durumda feature_example_entitlement şeklindedir.
Ayrıca her hak tanımı için bir simge dokusuna giden bir dosya yolu tanımlaman gerekir. Aksi takdirde hak tanımın doğrulamadan geçemez.
Entitlements<public> := module:
using {EntitlementInfo}
# The base entitlement you should define for ALL your entitlements in your experience
feature_example_entitlement<public> := class<abstract><castable>(entitlement){}
basic_sword<public> := class<concrete>(feature_example_entitlement):
var Name<override>:message = Sword.Name
Eşyalar varsayılan durumda tek kullanımlık değildir ve MaxCount değerleri 1’dir. Eşya; ücretli bir alansa, bir ücretli rastgele eşyaysa veya oynanış üzerinde etkili ve anlamlı bir avantaj sağlıyorsa ilgili alanları kodunda tanımlaman gerekir.
Hak Teklifleri
Bir teklif; bir eşya veya öğe için V-Papel cinsinden bir fiyat belirtir. Her teklifin, hak özelliklerinden ayrı olarak kendi adı, açıklaması ve simgesi vardır. Teklifler Verse’te tanımlanır.
Bir hakkı satabilmek için ona karşılık gelen bir teklif sunman gerekir.
Her teklif aşağıdaki özelliklere sahiptir:
Ad: Teklifin adı.
Açıklama: Teklifin yanında gösterilen uzun açıklama.
Kısa Açıklama: Teklifi daha küçük iletişim kutularında özetlemek için kullanacağın kısa açıklama.
Simge: Teklifin görseli.
EntitlementType: Teklife dahil edilen hakkın beyanı.
Fiyat: V-Papel cinsinden fiyat. Fiyat, 50 V-Papel’den az ve 5.000 V-Papel’den fazla olmamalıdır. 50’nin katları olarak belirlenmelidir.
Bu kod parçacığı, temel hak teklifi bilgileri için mevcut EntitlementInfo modülünü kullanarak hak tekliflerinin nasıl tanımlanacağını gösterir. Ayrıca bir simge, teklifin ait olduğu yetkilendirmeyi tanımlayan EntitlementType
ve V-Papel cinsinden bir fiyat belirlemen gerekir. Ayrıca bir teklif için sabit bir değere ya da ülke koduna bağlı olarak isteğe bağlı bir minimum satın alma yaşı belirleyebilir, platform ailesine göre teklife erişimi kısıtlayabilir ya da bunların bir kombinasyonunu kullanabilirsin. Bunun bazı örnekleri aşağıdaki kod parçacığında gösterilmektedir.
Alt bölge kodları şu anda desteklenmemektedir ve gelecekteki bir sürümde kullanıma sunulacaktır.
ExampleOffers<public> := module:
using {EntitlementInfo}
basic_sword<public> := class(entitlement_offer):
var Name<override>:message = EntitlementInfo.Sword.Name
var Description<override>:message = EntitlementInfo.Sword.Description
var ShortDescription<override>:message = EntitlementInfo.Sword.ShortDescription
V-Papel cinsinden fiyat 50’nin katları olmalı ve 50 ila 5.000 V-Papel arasında olmalıdır.
Ücretli rastgele eşyalarda, oyuncuların her bir ücretli rastgele eşyanın elde edilebilme olasılığını teklif ayrıntılarında sayısal olarak doğru bir şekilde görebilmesini sağlamalısın. Bunu yapmaman durumunda Fortnite Geliştirici Kuralları’nı ihlal etmiş sayılırsın ve hem sen hem de adan uygun yaptırımlara tabi tutulur.
Daha fazla bilgi için Ada İçi Alışveriş İşlemleri Kısıtlamaları sayfasına göz at.
Paket Teklifler
Paketler Verse’te tanımlanır ve farklı tekliflerin bir bileşimini, aynı teklifin yığınlarını veya bu ikisinin karışımını içerebilir. Basit teklifler gibi, paket teklifler de kendi fiyatlarını, adlarını ve açıklamalarını içerir; haklar ve tekliflerden farklı bir simgeye sahiptir. Teklifleri, bir paket teklif içine paketler ekleyerek iç içe de yerleştirebilirsin. Buna örnek olarak, bir kürek ve mısır tohumu paketlerinden oluşan bir paket içeren sınırlı süreli bir paket verilebilir. Bu sayede, daha büyük, birleştirilmiş paketlerin yapı taşları olarak daha küçük paketler kullanabilirsin.
Standart paket türleri şunlardır:
Yığınlı paket: Genellikle indirimli bir fiyat karşılığında aynı hakka yönelik birden fazla teklif içeren bir paket.
Çoklu teklif paketi: Birden fazla hakka dair teklifleri bir araya getiren paket. Yığınlı tekliflerle normal tekliflerin bir karışımını da içerebilir.
Bir paket, tanımlanmış teklifi ve teklif sayısını belirten tamsayı değerini içeren bir teklif dizisi demeti içerir.
İç içe geçmiş tekliflerin derinliği 5’i geçemez, aksi takdirde işlem başarısız olur. İç içe geçmiş teklifleri mümkün olduğunca sınırlamaya çalış.
Aşağıdaki kod parçacığında bir iksir paketinin nasıl yapıldığı gösterilmektedir. Teklif bilgileri, PotionCount değişkeniyle birlikte EntitlementInfo modülü içinde tanımlanmıştır.
ExampleOffers<public> := module:
using {EntitlementInfo}
<# --- other offer definitions above --- #>
potion_pack<public> := class(bundle_offer) :
var Name<override>:message = EntitlementInfo.PotionPack.Name
Satın Alma Kısıtlamaları
Tatil dönemlerine özel sınırlı süreli eşyalar, promosyon veya sezon teklifleri ve bölgeye özgü içerikler oluşturmak için hak satın alma işlemlerini kısıtlayabilirsin.
GetMinPurchaseAge
Belirli bir entitlement_offer’a özel bir satın alma kısıtlaması tanımlamak için GetMinPurchaseAge kullan. Satın alma doğrulamasının bir parçası olarak otomatik olarak çağrılır, bu yüzden sadece tanımlamayı gerektirir. Belirli bir tamsayı değeri, bir ülke kodu veya platform ailesi tanımlayabilirsin.
Alt bölge kodları şu anda desteklenmemektedir ve gelecekteki bir sürümde kullanıma sunulacaktır.
Aşağıda GetMinPurchaseAge fonksiyonuna bazı örnekler yer almaktadır.
# Optional overrideable function you can use to inform Epic systems what the minimum age a player needs to be to purchase this offer
GetMinPurchaseAge<override>(CountryCode:string, SubdivisionCode:string, PlatformFamily:string)<decides><computes>:int =
# A Hypothetical example where you only want to sell swords to people who don't live in Antarctica
CountryCode <> CountryCodes.Antarctica
return 0
Oyuncu Hakkı Doğrulaması
Oyuncu haklarının doğrulanması, oyuncular tarafından satın alınan hakların oturumlar arasında devam ettiğinden emin olmak için gerekli bir adımdır. Hakların gerektiği gibi doğrulanamaması; hakların çoğaltılması veya kaybedilmesi gibi sorunlara yol açabilir.
Önceki Satın Alımları Doğrulama
Aşağıdaki kod parçacığı, bir oyuncu bir oturuma katıldığında gerçekleştirilen basit bir hak doğrulamasını göstermektedir. Bu kod parçacığı öncelikle, gelen oyuncunun OnPurchasesChanged olayına abone olup olmadığını kontrol eder. Sonrasında, gelen oyuncu henüz abone olmamışsa abone yapılır. Son olarak ValidatePreviousPurchases kullanılarak o oyuncu için satın alınan tüm hakların kaydı alınır.
Bu aşamada oyuncu hakları için doğrulama denetimleri yapmak da önerilir. Bu sayede, deneyimde kaydedilen tüm verilerin Marketplace API’sinin sahip olduğunu belirttikleriyle ve oyuncu çantasıyla eşleştiğinden emin olunabilir.
OnPlayerJoin(InPlayer:player):void =
Subscription := GetEntitlementsChangedEvent(InPlayer, Entitlements.feature_example_entitlement).Subscribe(OnPurchasesChanged)
if (set EntitlementChangeSubscription[InPlayer] = option{Subscription}):
Print("Adding entitlement Change Subscription player subscription")
# On players joining you are likely going to want to run some validation checks to make sure that any data you save
Satın Alımları Yönetme
Hak satın alma işlemlerini gerçekleştirmek için kullanılan iki ana fonksiyon BuyOffer ve OnPurchasesChanged’dir. İlk fonksiyon, oyuncuya bir teklif sunma ve satın alma işlemini doğrulama mantığını üstlenir. İkinci fonksiyon ise başarılı bir işlemin veya geri ödemenin mantığını üstlenir. Aşağıdaki kod parçacıkları bu iki fonksiyonu göstermektedir.
# Base Implementation of how to present players with an offer to purchase in your experience
TryBuyOffer(Player:player, Offer:entitlement_offer)<suspends>:void =
Result := BuyOffer(Player, Offer)
if (Result?):
# do nothing it should respond in the purchase subscription, see OnPurchasesChanged for details
Tek Kullanımlık Eşyaların İşlenmesi
Tek kullanımlık bir hakkı kullanmak için Marketplace Verse API’sindeki ConsumeEntitlement fonksiyonunu kullanman gerekir. Tüketim başarılı olduğunda, tüketimden sonra oluşturulan efektin mantığını işlemen gerekir. Oyuncunun sahip olduğu hakkın Count (sayı) değeri, fonksiyonda tüketilen Count kadar azaltılır.
Aşağıdaki kod parçacığı, belirli bir oyuncunun belirli bir hakkı nasıl kullandığını göstermektedir.
# Base Implementation of how to flag a consumable in your experience as being consumed
TryConsumeEntitlement(Player:player, Entitlement:concrete_subtype(entitlement), NumberConsuming:int)<suspends>:void =
Result := ConsumeEntitlement(Player, Entitlement, ?Count := NumberConsuming)
if (Result?):
Print("Successfully consumed entitlement!")
Dayanıklı bir hak tüketilmez. Bunu yapmaya çalışırsan ConsumeEntitlement başarısız olur.
Hak Verme
V-Papel gerektiren bir hak satın alma işleminin aksine, oyunculara GrantEntitlement metoduyla da haklar verebilirsin.
Hak verme metodunun kullanılacağı yerlere; promosyon eşyaları, ücretsiz tek kullanımlık eşya örnekleri ve hatalardan dolayı kaybolan eşyaların yerine konması gibi örnekler verilebilir.
Bu kod parçacığı, oyuncularına hak verme metodunu gösterir.
# Base Implementation of how to give players a entitlement in your experience without them purchasing it
TryGrantEntitlement(Player:player, Entitlement:concrete_subtype(entitlement), NumberToGrant:int)<suspends>:void =
Result := GrantEntitlement(Player, Entitlement, ?Count := NumberToGrant)
if (Result?):
Print("Successfully granted a player your entitlement!")
Bir hakkın azami sayısından fazla veya dayanıklı bir haktan 1’den fazla vermeye çalışmak, hak verme işleminin başarısız olmasına neden olur.
Oyunculara Hak Tekliflerini Göster
Marketplace module, adalarında ShowOffersDialog fonksiyonuyla birlikte kullanabileceğin yerleşik bir vitrin kullanıcı arayüzü sağlar. Aşağıdaki kod parçacığı, belirli bir oyuncu için teklifleri ortaya koyan bir vitrinin nasıl görüntüleneceğini göstermektedir.
# Base Implementation of how to show an array of offers to the player that are available for purchase
ShowArrayOfOffers(Player:player)<suspends>:void =
ShowOffersDialog(Player, array{ExampleOffers.basic_sword{}, ExampleOffers.potion{}, ExampleOffers.potion_pack{}, ExampleOffers.potion_thanksgiving{}, ExampleOffers.potion_gib{}})Tam Kod
using { /Fortnite.com/Devices }
using { /Fortnite.com/Marketplace }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Assets }
using { /Verse.org/Simulation }