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:
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.
burgerveBurgerfarklı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:
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:
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:
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:
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')
endAğı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:
if xPlayer.canCarryItem('burger', 2) then
xPlayer.addInventoryItem('burger', 2)
else
xPlayer.showNotification('You cannot carry that much')
endcanCarryItem(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:
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.luaiçinde tanımlanır xPlayer.addInventoryItemailesi hala çalışır, ESX bunu ox_inventory'ye verirESX.RegisterUsableItemhala çalışır, bu nedenle eski betiklerin değişmesi gerekmez- öğe
items.luaiç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.

