ESX öğeleri: öğeler tablosu, RegisterUsableItem ve addInventoryItem

ESX'e bir öğe ekleyin: öğeler SQL tablosu, kullanılabilir yapmak için ESX.RegisterUsableItem, addInventoryItem, removeInventoryItem, getInventoryItem ve canCarryItem, artı ox_inventory notu.

ESX sunucunuzda yeni bir öğe istiyorsunuz: bir hamburger, bir telefon, bir kilit açıcı. ESX'te bir öğe veritabanındaki bir satır ve bir betik oyuncu nesnesi aracılığıyla bunu verir, kaldırır ve kullanır. Bu makale items tablosu, bir öğeyi kullanılabilir yapma, her gün kullandığınız xPlayer işlevleri ve sunucu ox_inventory çalıştırdığında neyin değiştiğini kapsamaktadır.

Öğeler tablosu

ESX öğelerini items tablosundan okur. Sütunları şunlardır:

Sütun Anlam
name Kodda kullanılan öğe adı. Küçük harf, boşluk yok
label Oyuncuların gördüğü ad
weight Bir öğenin ağırlığı
rare Eski kullanımlar için tutulmuştur, normalde 0
can_remove Oyuncular öğeyi düşürebilir veya kaldırabilirse 1

SQL ile bir öğe ekleyin:

sql
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`)
VALUES ('burger', 'Burger', 1, 0, 1);

Tabloyu yeniden yüklemesi için ESX'i veya tüm sunucuyu yeniden başlatın. Veritabanınız farklı bir sütun seti gösterirse, sürümler biraz farklı olduğundan bunun sahip olduğu sütunları izleyin. Bir sorguyu nasıl çalıştıracağınızdan emin değilseniz, oxmysql sorguları bölümüne bakın.

Dikkat: öğe adı anahtar olur. burger ve Burger farklıdır ve yanlış yazılan bir öğe çoğu betikte sessizce başarısız olur.

Bir öğeyi kullanılabilir yapın

Öğeyi sunucuda bir betikte kaydedin:

lua
ESX = exports['es_extended']:getSharedObject()

ESX.RegisterUsableItem('burger', function(source)
    local xPlayer = ESX.GetPlayerFromId(source)
    if not xPlayer then return end

    xPlayer.removeInventoryItem('burger', 1)
    TriggerClientEvent('my_script:eatBurger', source)
end)

Geri çağırı oyuncu öğeyi kullandığında sunucuda çalışır. Öğeyi kendi tarafından kaldırmaz, bu nedenle kendi tarafından kaldırırsınız. Sunucuda kaldırmayı yapın, ardından istemciye animasyonu oynatmasını söyleyin. Nesne nil ise, ESX nil: getSharedObject düzeltme bölümüne bakın.

İstemci tarafında olay yalnızca efekti oynatmalıdır:

lua
RegisterNetEvent('my_script:eatBurger', function()
    -- animation, progress bar, hunger update
end)

Öğeleri verin, kaldırın ve kontrol edin

Bunlar ihtiyaç duyduğunuz xPlayer işlevleridir:

lua
local xPlayer = ESX.GetPlayerFromId(source)

-- give
xPlayer.addInventoryItem('burger', 2)

-- remove
xPlayer.removeInventoryItem('burger', 1)

-- read one item
local item = xPlayer.getInventoryItem('burger')
print(item.count)

getInventoryItem en az count, label ve name içeren bir tablo döndürür. Öğe tabloda yoksa sonuç bazı sürümlerde nil olabilir, bu nedenle count okumadan önce kontrol edin.

Güvenilir bir desen kaldırmadan önce kontrol etmektir:

lua
local item = xPlayer.getInventoryItem('lockpick')
if item and item.count >= 1 then
    xPlayer.removeInventoryItem('lockpick', 1)
    -- do the action
else
    xPlayer.showNotification('You need a lockpick')
end

Ağırlığı önce kontrol edin: canCarryItem

Bir öğe vermeden önce oyuncunun taşıyabilip taşıyamayacağını sorun. Yoksa, addInventoryItem tam bir envanterinde başarısız olabilir ve oyuncu ödülü kaybeder:

lua
if xPlayer.canCarryItem('burger', 2) then
    xPlayer.addInventoryItem('burger', 2)
else
    xPlayer.showNotification('You cannot carry that much')
end

canCarryItem(name, count) öğe ağırlığını oyuncunun serbest ağırlığı ile karşılaştırır. Bunu her yerde bir betik öğe ödülü verdiğinde kullanın: işler, zanaat, taşınmaz. Diğer yardımcılar için bkz. ESX iş kurulumu.

Örnek: bir öğe satan bir mağaza

Parça ve ağırlık kontrolüyle sunucuda bir araya koyun:

lua
RegisterNetEvent('my_script:buyBurger', function()
    local src = source
    local xPlayer = ESX.GetPlayerFromId(src)
    if not xPlayer then return end

    local price = 10
    if xPlayer.getAccount('money').money < price then
        return xPlayer.showNotification('Not enough money')
    end
    if not xPlayer.canCarryItem('burger', 1) then
        return xPlayer.showNotification('Your inventory is full')
    end

    xPlayer.removeAccountMoney('money', price)
    xPlayer.addInventoryItem('burger', 1)
end)

Fiyat ve öğe sunucuya sabittir. İstemci sadece "Bir hamburger istiyorum" der, hiçbir zaman fiyat göndermez. Neden için bkz. sunucu olaylarını güvenli hale getirme.

ESX ox_inventory ile

Birçok ESX sunucusu varsayılan envanter yerine ox_inventory çalıştırır. Sonra:

  • öğeler SQL tablosu değil ox_inventory/data/items.lua içinde tanımlanır
  • xPlayer.addInventoryItem ailesi hala çalışır, ESX bunu ox_inventory'ye verir
  • ESX.RegisterUsableItem hala çalışır, bu nedenle eski betiklerin değişmesi gerekmez
  • öğe items.lua içinde var olmalı veya çağrı başarısız olur

Geçiş yapmak için ox_inventory ESX kurulumunu izleyin ve es_extended yapılandırmasında özel envanter seçeneğini ayarlayın; böylece ESX hangi envanteri kullanıyorsa bunu bilir. ox_inventory yolunda bir öğe ekleme için, bkz. ox_inventory'ye öğeler nasıl eklenir.

İpucu: her yeni öğe için SQL veya Lua'yı düzenlemek istemiyorsanız, Öğe Yaratıcı oyunda öğeler oluşturmanıza izin verir.

Kontrol Listesi

Belirtisi Düzeltme
Öğe var değil items tablosuna veya ox_inventory ile items.lua öğesine bir satır ekleyin
Öğe kullanıldığında hiçbir şey yapmıyor Sunucuda ESX.RegisterUsableItem ile kaydedin
addInventoryItem hiçbir şey vermiyor Yanlış ad veya oyuncu taşıyamıyor; xPlayer.canCarryItem kontrol edin
Öğe kullanımdan sonra kaldırılmaz Geri çağırı kendisini removeInventoryItem çağırmalı
getInventoryItem nil Öğe adı öğeler tablosunda yok
Ad uyumsuzluğu Adlar büyük/küçük harf duyarlıdır; tam name değerini kullanın

Kısa yanıtlar

ESX'te yeni bir öğe nerede eklerim?

Veritabanınızın items tablosunda, bir ad, bir etiket ve bir ağırlıkla. ox_inventory çalıştıran bir sunucuda, öğeler bunun yerine ox_inventory/data/items.lua içinde tanımlanır.

ESX öğesini nasıl kullanılabilir yapabilirim?

Sunucuda ESX.RegisterUsableItem('itemname', function(source) ... end) ile kaydedin. Öğe adı öğeler tablosundaki name ile eşleşmelidir.

addInventoryItem neden hiçbir şey yapmıyor?

Öğe adı öğeler tablosunda yok, oyuncu bunu taşıyamıyor veya farklı büyük harfle bir ad kullandınız. Öğenin var olduğundan emin olun ve önce xPlayer.canCarryItem ile test edin.

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 →

Okumaya devam edin