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).

lua
-- 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:

lua
-- server
exports.ox_inventory:RegisterStash('house_' .. houseId, 'House storage', 50, 100000, ownerId)

Ardından istemci üzerinde aynı kimlikle açın:

lua
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:

sql
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 →

Okumaya devam edin