FiveM konut sistemi: kabuğu, örnekler, depo ve anahtarlar
Bir FiveM konut sistemi nasıl çalışır: kabuk ve MLO iç mekanlar, yönlendirme kovaları ile örnekleme, konut başına bir depo, anahtarlar ve izinler, ve sahipliği veritabanında kaydetme.
Belirti: iki oyuncu iki farklı daireye giriyorsa birbirlerini görebilir, depo her ev arasında paylaşılır, ya da sahiplik sunucu yeniden başlatıldığında kaybolur.
Bir konut sistemi, beraber çalışan dört şeydir: bir iç mekan, oyuncuları ayırmanın bir yolu, öğeleri depolamanın bir yeri ve kimin girmesine izin verildiğinin kaydı. Bu makale her bir parçayı ve bunların birbirine nasıl bağlandığını açıklar.
Kabuk veya MLO iç mekan
Bir evin içini sağlamanın iki yolu vardır:
| Tür | Nasıl çalışır | İçin uygun |
|---|---|---|
| Kabuk | Koordinatlarda oluşturulan, çıkışta kaldırılan sahne nesnesi | Daireler, birçok özdeş ev |
| MLO | Harita üzerinde kalıcı iç mekan | Benzersiz evler ve konaklar |
Kabuk, yüklediğiniz, sabit bir konuma yerleştirdiğiniz (genellikle gökyüzünde yüksek veya haritadan uzakta, haritanın altında) ve oyuncu ayrıldığında silen bir modeldir. Aynı kabuk, herhangi bir sayıda ev için oluşturulabilir olduğundan, kabullar apartman binalarının nasıl yapıldığıdır. MLO haritada kalır, bu nedenle bir yere sınırlıdır. Birini yüklemek için bkz. bir MLO yükleme, ve etrafındaki haritayı bozarsa, MLO harita çatışmaları.
Yönlendirme kovaları ile örnekleme
Her apartman aynı kabuğu aynı koordinatlarda kullanıyorsa, giren herkes aynı odada durur. Çözüm, her eve kendi yönlendirme kovasını vermektir; sunucuda dünyanın izole edilmiş bir kopyası. Farklı kovaları içindeki oyuncular birbirlerini veya birbirlerinin varlıklarını göremezler. Fikir bir cümlede: ev numarası 12, kova 12'yi kullanır (artı diğer kullanımlarla asla çarpışmaması için bir uzaklık).
-- server
local HOUSE_BUCKET_OFFSET = 1000
RegisterNetEvent('housing:enter', function(houseId)
local src = source
if not canEnter(src, houseId) then return end -- ownership or key check
SetPlayerRoutingBucket(src, HOUSE_BUCKET_OFFSET + houseId)
TriggerClientEvent('housing:spawnShell', src, houseId)
end)
RegisterNetEvent('housing:leave', function()
local src = source
SetPlayerRoutingBucket(src, 0)
TriggerClientEvent('housing:removeShell', src)
end)Bu eve ziyaret eden herkesin aynı kovaya konulması gerekir ve her çıkışın kovayı 0 olarak ayarlaması gerekir. Bağlantıyı kes ve komut dosyası yeniden başlatmaları da işleyin, böylece hiçbir oyuncu başka kimsenin ulaşabileceği bir kovada kalmaz. Tüm tanıtım özellikleri yönlendirme kovaları içinde açıklanmıştır.
İpucu: Kabuk nesnesi istemci üzerinde oluşturursanız, yalnızca o oyuncu onu görür. Ziyaretçilerin de görebildiği bir kabuk için, her ziyaretçi kendileri için oluşturur, veya sunucu aynı kovada oluşturur.
Her ev için bir depo
Her evin kendi depolaması olması gerekir. ox_inventory ile, ev kimliğini içeren bir kimliğe sahip, ev başına bir depo kaydedin:
-- server
exports.ox_inventory:RegisterStash('house_' .. houseId, 'House storage', 50, 100000, ownerId)Ardından istemci üzerinde aynı kimlikle açın:
exports.ox_inventory:openInventory('stash', 'house_' .. houseId)Kimlik her ev için aynıysa, her ev bir depoyu paylaşır; bu, bu makalenin başındaki belirtidir. Her depo açılmadan önce sunucu üzerinde izin kontrolünü ekleyin ve ox_inventory depoları adresinden yuvalar, ağırlık ve kimin açabileceği hakkında bilgi edinin.
Anahtarlar ve izinler
Sahiplik, içeri girmek için tek yol değildir. Bu durumlar için plan yapın:
- Sahip: her zaman girer, evi satabilir ve anahtarları verebilir.
- Anahtar sahipleri: eve girebilecek ve depoyu kullanabilecek, ancak satamazlar.
- Misafirler: sahip içinde olduğunda ve onları içeri aldığında ziyaret eder (bir kapı zili).
- Polis: baskın veya resmi giriş, sunucunuzda varsa.
Anahtarları bırakabileceğiniz bir öğe yerine veri olarak tutun: ev başına karakter tanımlayıcılarının bir listesi. Birisi girmek veya depoyu açmak istediğinde listeyi sunucu tarafından her zaman kontrol edin.
Veritabanında sahiplik kaydı
Yeniden başlatmayı kaldırması gereken her şey veritabanına gider. Basit bir yapı, evler için bir tablo ve anahtarlar için bir tablodur:
CREATE TABLE IF NOT EXISTS houses (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64) NOT NULL,
owner VARCHAR(64) DEFAULT NULL,
price INT NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS house_keys (
house_id INT NOT NULL,
holder VARCHAR(64) NOT NULL,
PRIMARY KEY (house_id, holder)
);Çerçevenizin karakterler için kullandığı karakter tanımlayıcısını depolayın (örneğin oyuncu lisansı yerine karakterin tanımlayıcısı), böylece sahiplik karakteri takip eder. Kaynak başladığında verileri yükleyin ve hızlı kontroller için sunucu tablosunda bir kopyasını tutun, her değişiklikte veritabanına geri yazın. Lua'dan sorgular oxmysql sorguları içindedir.
Para akışları da önemlidir: satın alma, kira ve satış geri ödeme, sunucu üzerinde işlenmelidir ve sunucu ekonominizi dengelemede açıklandığı gibi bir para havuzu görevi görür.
Yaygın hatalar
- Çıkışta, ölümde, bağlantı kesilmede veya yeniden başlatmada kovayı sıfırlamama.
- Tüm evler için aynı depo kimliği.
- Sahipliği yalnızca istemci üzerinde kontrol etme.
- Sahiplik bellek içinde tutulması ve yeniden başlatmada kaybolması.
- Oyuncu hızlı bir şekilde yeniden girdiğinde kabuk nesnesi birden fazla kez oluşturulması, yinelenen nesneler bırakılması.
Kontrol listesi
| Belirti | Çözüm |
|---|---|
| Farklı evlerdeki oyuncular birbirlerini görür | Her eve kendi yönlendirme kovasını verin |
| Oyuncu boş bir dünyada takılı kalır | Çıkışta, ölümde ve bağlantı kesilmede kovayı 0 olarak sıfırlayın |
| Her ev bir depoyu paylaşır | Ev kimliğini içeren bir depo kimliği kullanın |
| Sahiplik yeniden başlatmada kaybolur | Veritabanında kaydedin |
| Herkes giriş yapabilir | Sunucu üzerinde sahibi veya anahtarı kontrol edin |
| Yinelenen kabuk nesneleri | Kabuğu çıkışta silin ve çift oluşturmalara karşı koruma sağlayın |
Kısa yanıtlar
Kabuk ile MLO iç mekan arasındaki fark nedir?
MLO, harita üzerinde sabit koordinatlara yerleştirilen gerçek bir iç mekan. Kabuk ise, genellikle haritadan uzakta tarafta talep üzerine oluşturulan ve oyuncu ayrıldığında kaldırılan bir sahne nesnesidir.
Oyuncular neden birbirlerinin evlerini görebilir?
Her ev iç mekanı aynı koordinatları kullanır, bu nedenle farklı evlerdeki oyuncular aynı alanda durur. Her evi kendi yönlendirme kovasına yerleştirerek ayırın.
Ev sahipliği nerede kaydedilmelidir?
Veritabanında, ev kimliği ve sahibinin karakter tanımlayıcısı ile birlikte, ve anahtar tutan kişiler için ayrı bir tablo veya sütun. Sahipliği asla yalnızca bellek içinde tutmayın.
Bu sorunu yaşatmayan scriptler
CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →
Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →
Item Creator V2Animasyonlar, proplar, efektler ve daha fazlasıyla kullanılabilir eşyalar oluşturun — kod yazmadan.Scripti gör →