Kullanıcıları genel sunucular arasında teleport etmenin yanı sıra, TeleportService özel sunuculara teleport etmeyi de destekler; bu sunucular belirli oyunculara kısıtlıdır. Teleport edebileceğiniz iki tür özel sunucu vardır:
- Rezerve edilmiş sunucular: Geliştirici tarafından oluşturulan ve geliştirici tarafından sağlanan bir ID ile erişilen sunucular. Özel maçlar, işbirliği oturumları veya katılımcıları kontrol ettiğiniz herhangi bir senaryo için kullanışlıdır.
- VIP sunucular: Oyuncuların satın aldığı özel sunucular. Oyuncuları satın aldıkları VIP sunucusuna yönlendirmek için TeleportOptions.VipServerId kullanın.
Rezerve edilmiş bir sunucuya teleport et
Rezerve edilmiş sunucular talep üzerine oluşturulur: yeni bir ReservedServerId ile yapılan ilk teleport sunucuyu oluşturur ve aynı ID'yi yeniden kullanmak, sonraki teleportları o aynı sunucuya yönlendirir. ID'yi HttpService:GenerateGUID(false) ile oluşturun:
local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local TARGET_PLACE_ID = 12345678901234
-- Teleport edilecek kullanıcılar (örneğin Players:GetPlayers() veya bir eşleştirme grubundan)
local player1, player2 = Players:GetPlayers()[1], Players:GetPlayers()[2]
-- Rezerve edilmiş sunucu için benzersiz bir ID oluştur
local reservedServerId = HttpService:GenerateGUID(false)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = reservedServerId
-- İlk teleport sunucuyu oluşturur
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player1, player2}, teleportOptions)Rezerve edilmiş bir sunucu ID'sini yeniden kullanma
Diğer oyuncuların daha sonra aynı rezerve edilmiş sunucuya katılabilmesi için, rezerve edilmiş sunucu ID'sini bir DataStoreService veri deposu ile kalıcı hale getirin, böylece oturumlar ve sunucular arasında hayatta kalır.
Rezerve edilmiş sunucuyu oluşturan sunucuda, ilk teleport için ID'yi oluşturun ve ardından bunu oturumu tanımlayan bir anahtar ile kaydedin (örneğin bir lobinin ID'si veya parti ID'si):
local DataStoreService = game:GetService("DataStoreService")
local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")
local reservedServersStore = DataStoreService:GetDataStore("ReservedServers")
-- Sunucular arasında paylaşılan oturumu tanımlayan anahtar
local sessionKey = "lobby-123"
-- Yeni bir ID, varış noktasına ulaşıldığında rezerve edilmiş sunucuyu oluşturur
local reservedServerId = HttpService:GenerateGUID(false)
reservedServersStore:SetAsync(sessionKey, reservedServerId)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = reservedServerId
TeleportService:TeleportAsync(TARGET_PLACE_ID, { player }, teleportOptions)Aynı rezerve edilmiş sunucuya oyuncuları göndermesi gereken herhangi bir diğer sunucuda, ID'yi aynı oturum anahtarı ile arayın ve bunu teleportun TeleportOptions.ReservedServerId olarak ayarlayın:
local DataStoreService = game:GetService("DataStoreService")
local TeleportService = game:GetService("TeleportService")
local reservedServersStore = DataStoreService:GetDataStore("ReservedServers")
local sessionKey = "lobby-123"
local existingId = reservedServersStore:GetAsync(sessionKey)
if existingId then
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = existingId
TeleportService:TeleportAsync(TARGET_PLACE_ID, { player }, teleportOptions)
endBir VIP sunucusunda, VIP sunucu ID'sini varış noktasındaki sunucuda veri deposu olmadan erişilebilir hale getirmek için, her oyuncuya TeleportOptions:SetTeleportData() ile ekleyin:
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.VipServerId = game.PrivateServerId
teleportOptions:SetTeleportData({ vipServerId = game.PrivateServerId })
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)Varışta, bunu oyuncunun katılma verilerinden geri okuyun. Daha fazla bilgi için Teleportlarla birlikte kullanıcı verisi gönderin sayfasına bakın.
Varışta rezerve edilmiş bir sunucuyu tanımlama
Varış noktasındaki sunucuda, mevcut sunucunun rezerve edilmiş bir sunucu olup olmadığını kontrol edin:
local isReserved = game.PrivateServerId ~= "" and game.PrivateServerOwnerId == 0DataModel.PrivateServerId, sağladığınız ReservedServerId ile eşleşir ve o rezerve edilmiş sunucu için tüm sunucu örnekleri arasında sabit kalır. DataModel.JobId, her çalışan örnek için benzersizdir ve sunucu yeniden başlatıldığında değişir.
VIP sunucusuna teleport et
VIP sunucular, oyuncuların oyunun sayfasından satın alabileceği özel sunuculardır. Bir oyuncuyu VIP sunucusuna teleport etmek için, TeleportOptions.VipServerId'yi hedef VIP sunucusunun DataModel.PrivateServerId'sine ayarlayın.
local TeleportService = game:GetService("TeleportService")
local TARGET_PLACE_ID = 12345678901234
-- Hedef VIP sunucusunun PrivateServerId'si, örneğin oyuncunun
-- teleport verisinde taşınan veya bir veri deposundan okunan
local vipServerId = player:GetJoinData().TeleportData.vipServerId
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.VipServerId = vipServerId
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)TeleportOptions.VipServerId, TeleportOptions.ReservedServerId'den farklıdır. Geliştirici tarafından oluşturulan rezerve edilmiş sunucular için ReservedServerId ve oyuncular tarafından satın alınan VIP sunucular için VipServerId kullanın.
Bir VIP sunucu ID'si, VIP sunucusunu sahip olan deneyime özgüdür: bunu o deneyimdeki herhangi bir yerin yer ID'si ile kullanabilirsiniz, ancak başka bir deneyimin yer ID'si ile kullanamazsınız.
Bir yönlendirme alanını ayarlamadığınızda, motor varış sunucusunu seçer. Hiçbir özel sunucu yönlendirme alanı ayarlanmadan yapılan bir teleport, bir genel sunucuya veya oyuncunun o deneyimin VIP sunucusuna yakın zamanda katıldığı takdirde o VIP sunucusuna inebilir.
Bu desenin yaygın bir kullanım durumu, bir oyuncuyu rezerve edilmiş bir sunucudan deneyimin kök yerinin VIP sunucusuna geri döndürmektir. Bir rezerve edilmiş sunucunun game.PrivateServerId'si, kendi rezerve ID'sidir, köken VIP sunucusunun değil; VIP sunucusunun ID'sini rezerve edilmiş sunucuya taşımak için, örneğin, çıkış teleportunda teleportData içinde geçerek veya Rezerve edilmiş bir sunucu ID'sini yeniden kullanma bölümünde gösterildiği gibi bir veri deposunda saklayarak ayarlayın, ardından bunu dönüş teleportunun TeleportOptions.VipServerId'si olarak ayarlayın.
Oyun boyunca yerler arasında oyuncuları aynı VIP sunucusunda tutmak için her teleportta aynı TeleportOptions.VipServerId'yi ayarlayın.
VIP sunucu erişim kontrolleri
Bir oyuncu, sunucunun Arkadaşlar İzin Verildi ayarı, izin listesi veya bir bağlantı kodu, teleport anında onlara erişim veriyorsa VIP sunucusuna katılabilir. VIP sunucu sahipleri bu ayarları her zaman değiştirebilir, bu nedenle daha önce erişimi olan bir oyuncu bunu kaybedebilir.
Bir oyuncunun katılmasına izin verilmezse, TeleportService.TeleportInitFailed tetiklenir ve oyuncu sunucunun kısıtlı olduğunu belirten bir hata mesajı görür. Bir grubu VIP sunucusuna teleport etmek için, aynı TeleportOptions.VipServerId ile birden fazla oyuncu geçirin. Motor, her oyuncuyu bağlantı zamanında bağımsız olarak kontrol eder, bu nedenle erişimi olmayan oyuncular bireysel olarak başarısız olurken diğerleri normal bir şekilde teleport olur. VIP teleportları için her zaman TeleportService.TeleportInitFailed'i ele alın, çünkü oyuncular VIP sunucuyu kapatmış veya farklı birine geçmiş olabilir.
Sunucu ID'lerini saklayın ve paylaşın
TeleportAsyncResult nesnesi, TeleportService:TeleportAsync() tarafından döndürülen, varış yeri hakkında bilgi içerir:
- TeleportAsyncResult.PrivateServerId - Varış sunucusunun özel sunucu ID'si. Varışta DataModel.PrivateServerId ile eşleşir.
- TeleportAsyncResult.ReservedServerAccessCode - Sadece eski erişim kodu teleportları için doldurulur. ReservedServerId veya VipServerId kullanıldığında doldurulmaz.
local result = TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)
if result then
print("Varış Yeri PrivateServerId:", result.PrivateServerId)
endEski erişim kodlarından geçiş yapma
Eğer oyununuz, kullanımdan kaldırılmış TeleportOptions.ReservedServerAccessCode veya TeleportOptions.ShouldReserveServer kullanıyorsa, erişim kodu akışını bir GUID tabanlı akış ile değiştirerek ReservedServerId'ye geçin:
- Değiştirin ReserveServerAsync() ve ReservedServerAccessCode'yi HttpService:GenerateGUID(false) ve ReservedServerId ile.
- Saklayın oluşturulan GUID'yi, böylece aynı sunucuya sonraki teleportlar için yeniden kullanabilirsiniz.
- Güncelleyin tüm TeleportOptions kullanımlarını ReservedServerAccessCode veya ShouldReserveServer yerine ReservedServerId ayarlamak için.
Önce (kullanımdan kaldırılmış)
-- Kullanımdan kaldırılmış: ReserveServerAsync + ReservedServerAccessCode
local accessCode, privateServerId = TeleportService:ReserveServerAsync(TARGET_PLACE_ID)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = accessCode
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)Sonra (güncel)
local HttpService = game:GetService("HttpService")
local TeleportService = game:GetService("TeleportService")
-- Güncel: GenerateGUID + ReservedServerId
local reservedServerId = HttpService:GenerateGUID(false)
local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerId = reservedServerId
TeleportService:TeleportAsync(TARGET_PLACE_ID, {player}, teleportOptions)Kullanımdan kaldırılmış ReserveServerAsync() ve ReservedServerAccessCode, geriye dönük uyumluluk için mevcut kalmaya devam eder, ancak yeni çalışmalar için önerilmez. ReserveServerAsync() aslında bir sunucuyu önceden rezerve etmez, sadece rastgele bir GUID oluşturur. Erişim kodları ile oluşturulan mevcut rezerve edilmiş sunucular çalışmaya devam eder.
Başarısız teleportları ele alma
Özel sunuculara yapılan teleportlar, herhangi bir ağ çağrısı gibi başarısız olabilir. Bunları pcall içinde sarın ve gerektiğinde yeniden deneyin. Bir teleport başlatıldığında ancak son anda başarısız olursa, TeleportService.TeleportInitFailed tetiklenir ve orijinal TeleportOptions ile birlikte yeniden denemek için aynı varış noktasını kullanabilirsiniz.
Tam bir yeniden deneme uygulaması için ana teleport kılavuzundaki Başarısız teleportları ele alın sayfasına bakın.
Motor, basit bir teleportu bir VIP sunucusuna yönlendirdiğinde, VIP'ye özgü katılma hataları, dolu veya taşan bir sunucu gibi, TeleportService.TeleportInitFailed'i tetiklemek yerine genel bir katılma ile geri döner. Sadece açık bir TeleportOptions.VipServerId ile yapılan teleportlar, bu hataları yeniden deneme işleyicinize iletir.
En iyi uygulamalar
- ID'leri sunucuda oluşturun. Her zaman HttpService:GenerateGUID(false) çağrısını bir sunucu Script'inden yapın, böylece istemcilerin rezerve edilmiş sunucu ID'lerini tahmin etmesini veya kontrol etmesini önleyin.
- Rezerve edilmiş sunucu ID'lerini kalıcı hale getirin. Oyuncuların oturumlar arasında aynı rezerve edilmiş sunucuya yeniden katılmaları gerekiyorsa, GUID'yi bir veri deposunda saklayın.
- Doğru alanı kullanın. Geliştirici tarafından oluşturulan rezerve edilmiş sunucular için ReservedServerId, oyuncular tarafından satın alınan VIP sunucular için VipServerId kullanın. Aynı TeleportOptions örneğinde her ikisini de ayarlamayın.
- Yönlendirme alanlarını karıştırmayın. Aynı anda yalnızca ReservedServerId, VipServerId veya ServerInstanceId'den birini ayarlayabilirsiniz. Birden fazla ayarlamak bir hata oluşturur.