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:
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.1değ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:
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:
-- 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:
-- 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' })
endGeri ç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
CanCarryItemkontrol edin. Dolu envanterAddItembaş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.
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 →