FiveM zanaat sistemi: ox_inventory tezgahları ve özel zanaat

FiveM üzerinde zanaat oluşturun: data/crafting.lua'daki ox_inventory zanaat tezgahları malzemeler ve bölgelerle, sunucu kontrollü tarif ve anti-dupe ipuçları.

Zanaat, oyuncunun bazı öğeleri başka bir öğeye dönüştürülmesi anlamına gelir. ox_inventory'de yerleşik zanaat tezgahlarını kullanabilir veya bir betikte kendi tarifini yazabilirsiniz. Bu makale her ikisini gösterir, ardından oyuncuları öğeleri çoğaltmaktan koruyan kontrolleri.

ox_inventory zanaat tezgahları

ox_inventory/data/crafting.lua açın. Tezgahların listesini döndürür. Her tezgahın yapılabilir öğelerin bir listesi ve dünyadaki bir yeri vardır:

lua
return {
    {
        items = {
            {
                name = 'lockpick',
                ingredients = {
                    scrap_metal = 5,
                    plastic = 2,
                },
                duration = 5000,
                count = 1,
            },
            {
                name = 'bandage',
                ingredients = {
                    cloth = 2,
                },
                duration = 3000,
            },
        },
        points = {
            vec3(1087.3, -3099.4, -39.0),
        },
    },
}

Her alanın yaptığı şey:

Alan Anlam
name Üretilen öğe
ingredients Öğe adları ve her biri için ihtiyaç duyulan sayı
duration Milisaniye cinsinden zanaat süresi
count Her zanaat başına sonucun kaçını alırsınız
points Tezgahın kullanılabileceği koordinatlar
zones ox_target için kutu bölgeleri, points alternatifi olarak

name veya ingredients içinde adlandırılan her şey data/items.lua içinde var olmalıdır. Bkz. ox_inventory'ye öğeler nasıl eklenir. Dosyayı düzenledikten sonra ox_inventory yeniden başlatın.

İpucu: 1'in altında bir malzeme değeri öğeyi tüketmez, dayanıklılığının o fraksiyonunu kullanır. 0.1 değeri dayanıklılığa sahip bir araç yüzde on onu kullanır.

Noktalar yerine bölgeler

Bölge oyuncunun hedefleyebileceği bir kutudur:

lua
zones = {
    {
        coords = vec3(1087.3, -3099.4, -39.0),
        size = vec3(1.5, 1.0, 1.0),
        distance = 1.5,
        rotation = 45.0,
    },
},

Bölgelerin ox_target çalışması gerekir. Biçim sürümler arasında değiştiği için data/crafting.lua kopyası örneklerine bakın. Tezgahı bir işe kısıtlamak için ox_inventory ayrıca tezgah üzerinde groups okur, ox_inventory gizli depoları ile aynı fikir.

Sunucu kontrolleriyle özel tarif

Bir beceri seviyesi, maliyet veya kendi ilerleme çubuğu gibi kendi kurallarınız istiyorsanız, tarifini betiğinizde yazın ve ox_inventory'nin sadece öğeleri işlemesine izin verin. Önemli kısım sunucu her şeyi yapar:

lua
-- server.lua
local crafting = {}

local recipe = {
    result = 'lockpick',
    ingredients = { scrap_metal = 5, plastic = 2 },
}

lib.callback.register('my_script:craft', function(source)
    if crafting[source] then return false end
    crafting[source] = true

    local ok = false

    -- 1. check every ingredient
    local hasAll = true
    for item, count in pairs(recipe.ingredients) do
        if exports.ox_inventory:Search(source, 'count', item) < count then
            hasAll = false
            break
        end
    end

    -- 2. check the player can carry the result
    if hasAll and exports.ox_inventory:CanCarryItem(source, recipe.result, 1) then
        -- 3. remove, then add
        local removed = {}
        local allRemoved = true
        for item, count in pairs(recipe.ingredients) do
            if exports.ox_inventory:RemoveItem(source, item, count) then
                removed[item] = count
            else
                allRemoved = false
                break
            end
        end

        if allRemoved and exports.ox_inventory:AddItem(source, recipe.result, 1) then
            ok = true
        else
            -- give back what was removed
            for item, count in pairs(removed) do
                exports.ox_inventory:AddItem(source, item, count)
            end
        end
    end

    crafting[source] = nil
    return ok
end)

İstemci sorar, ilerleme çubuğunu oynatır ve sadece cevabı okur:

lua
-- client.lua
if lib.progressBar({ duration = 5000, label = 'Crafting' }) then
    local ok = lib.callback.await('my_script:craft', false)
    lib.notify({ description = ok and 'Crafted' or 'Missing items', type = ok and 'success' or 'error' })
end

Geri çağırma ve bildirim işlevleri için bkz. ESX, QBCore ve ox_lib'deki sunucu geri çağırıları.

Anti-dupe ipuçları

Zanaat öğelerin kaldırıldığı ve iki adımda eklendiği klasik bir yineleme yeridir. Bu kuralları tutun:

  • Sadece sunucu. Sunucu malzemeleri kontrol eder ve sonucu verir. İstemci "Tarif X'i zanaat yapmak istiyorum" der, asla oluşturduğu sayıları veya öğe adlarını göndermez.
  • Kontrol edin, ardından kaldırın, ardından ekleyin. Hiçbir zaman kaldırılması başarılı olmadan önce sonuç eklemeyin. Ekleme başarısız olursa malzemeleri geri verin.
  • Bir defada bir zanaat. crafting[source] gibi oyuncu başına bir bayrak, spammed olay tarifini paralel olarak birkaç kez çalıştırmayı engeller.
  • Önce CanCarryItem kontrol edin. Dolu envanter AddItem başarısız olmasının genellikle nedenidir ve oyuncu malzemeleri kaybeder.
  • Mesafeyi kontrol edin. Tarif tezgahına aitse oyuncunun koordinatlarını sunucuda tezgahla karşılaştırın.
  • Duruşu düşüşte temizleyin. Oyuncu ayrıldığında bayrağı sıfırlayın, bu nedenle ortasındaki bir bağlantı kesilmesi tarifi kilitlemez.
lua
AddEventHandler('playerDropped', function()
    crafting[source] = nil
end)

Olayları koruma hakkında daha fazla için bkz. sunucu olaylarını güvenli hale getirme.

Kontrol Listesi

Belirtisi Düzeltme
Tezgah görünmüyor data/crafting.lua düzenleyin, ox_inventory yeniden başlatın
Başlangıçta tarif hatası name veya ingredients içindeki öğe data/items.lua içinde eksik
Bölge hiçbir şey yapmıyor ox_target çalışıyor olmalı, bölge alanları sürümünüzle eşleşmeli
Malzeme kayboldu, sonuç yok Önce CanCarryItem kontrol edin ve AddItem başarısız olduğunda geri ödeme yapın
Öğeler çoğaltıldı Tüm tarifi sunucuya taşıyın, birer birer bayrak ekleyin
Zanaat uzaktan çalışır Oyuncunun mesafesini sunucuda tezgaha kontrol edin

Kısa yanıtlar

ox_inventory'ye nasıl zanaat tezgahı eklerim?

ox_inventory/data/crafting.lua içine items (her biri ingredients ve duration ile) ve tezgahın nerede durduğu için points veya zones ile bir giriş ekleyin. ox_inventory'yi yeniden başlatın.

Tarif öğenin dayanıklılığının bir kısmını kullanabilir mi?

Evet. 1'in altında bir malzeme değeri, öğe buna sahipse, öğeyi tüketmek yerine dayanıklılığın o fraksiyonunu kullanır.

Oyuncuların zanaat sırasında öğeleri çoğaltmasını nasıl engeller?

Bütün tarifi sunucuda yapın: malzemeleri kontrol edin, kaldırın, ardından sonucu ekleyin ve o oyuncu için bir zanaat çalışıyor iken ikinci bir zanaat başlamasını reddedin.

Bu sorunu yaşatmayan scriptler

Item Creator V2Animasyonlar, proplar, efektler ve daha fazlasıyla kullanılabilir eşyalar oluşturun — kod yazmadan.Scripti gör →Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →Quest CreatorGörevler ve NPC diyalogları için oyun içinde düğüm düğüm kurulan görsel editör.Scripti gör →

Okumaya devam edin