Оружие и боеприпасы ox_inventory: data/weapons.lua и исчезающее оружие
Оружие исчезает после переподключения с ox_inventory? Как работает оружие как элементы: data/weapons.lua, элементы боеприпасов, износ, AddItem для WEAPON_PISTOL и крепления.
Вы даёте игроку пистолет через меню администратора или скрипт работы. Они отключаются, возвращаются и пистолета нет. С ox_inventory оружие — это не отдельная экипировка: это элементы, и всё остальное, что не является элементом, удаляется. Эта статья объясняет, как работают оружие и боеприпасы, как правильно их давать и где настроить износ и крепления.
Оружие — это элементы
В ox_inventory имя элемента оружия — это его имя хэша, например WEAPON_PISTOL. Они определены в ox_inventory/data/weapons.lua, а не в items.lua. Файл возвращает три группы:
return {
Weapons = {
['WEAPON_PISTOL'] = {
label = 'Pistol',
weight = 1130,
durability = 0.1,
},
-- ...
},
Components = {
-- attachments
},
Ammo = {
-- ammo definitions
},
}Откройте файл в вашей установке: каждое оружие по умолчанию имеет готовую запись, и это ссылка на точные поля вашей версии. Оружие, отсутствующее в Weapons, просто не является допустимым элементом.
Почему оружие исчезает при переподключении
Старые скрипты ESX и QBCore дают оружие с native, такие как GiveWeaponToPed, или с ESX's xPlayer.addWeapon. Это кладёт оружие в руки педу на эту сессию, но это не элемент и ничто его не сохраняет. ox_inventory также удаляет оружие, которое не в инвентаре, поэтому они исчезают при переподключении или даже раньше.
Решение — дать оружие как элементы с сервера:
local success = exports.ox_inventory:AddItem(source, 'WEAPON_PISTOL', 1)
if not success then
print('Could not give the weapon: inventory full or unknown weapon')
endЗамените каждый вызов скрипта, который выдаёт оружие с native, addWeapon или Player.Functions.AddItem('weapon_pistol', ...) на вызов AddItem с именем оружия в верхнем регистре. Скрипт, который только работает через native, такой как магазин, который спавнит оружие в руку, нуждается в этом изменении перед работой на сервере, использующем ox_inventory.
Совет: названия оружия чувствительны к регистру в списках элементов, и
WEAPON_PISTOL— это форма, которую использует ox_inventory. Старый скрипт, который отправляетweapon_pistol, может не работать по этой причине.
Элементы боеприпасов
Боеприпасы — это тоже элемент. Тип боеприпасов называется ammoname оружия в его записи, например ammo-9 для 9 мм:
exports.ox_inventory:AddItem(source, 'ammo-9', 60)Когда игрок использует элемент боеприпаса с экипированным оружием, которое его принимает, ox_inventory загружает его в оружие, и оружие хранит собственный счётчик боеприпасов в своих метаданных. Боеприпасы показываются как элемент в инвентаре, если они не загружены.
Проверьте имена элементов в вашей версии в data/items.lua и data/weapons.lua. Шаблон — ammo-<type>, например ammo-9, ammo-rifle, ammo-shotgun, и элемент, который не существует, не может быть добавлен.
Износ и деградация
Оружие изнашивается при срабатывании. Значение durability в записи оружия устанавливает скорость: большее число означает быструю деградацию. Оружие с нулевым износом не работает, пока его не отремонтируют.
['WEAPON_PISTOL'] = {
label = 'Pistol',
weight = 1130,
durability = 0.05,
},Понизьте число, чтобы оружие прослужило дольше. Ремонт — это выбор геймплея: многие серверы используют элемент ремонта, рецепт крафта или механика, и вы можете установить износ обратно с помощью SetMetadata (смотрите метаданные элементов в ox_inventory).
Крепления (компоненты)
Крепления, такие как фонарик, глушитель или магазин, — это элементы, перечисленные в группе Components, и они имеют собственные записи в items.lua. Игрок надевает один, используя его, пока оружие экипировано. Компонент хранится на элементе оружия, поэтому он выживает при переподключении.
Если крепление ничего не делает, проверьте эти три вещи:
- элемент компонента существует в
data/items.lua - он указан для этого оружия в
data/weapons.lua - оружие экипировано при использовании компонента
Вы также можете добавить компонент с сервера через метаданные оружия, например когда вы продаёте предварительно собранное оружие, но сначала протестируйте его с обычным пистолетом, так как формат метаданных зависит от вашей версии.
Продажа оружия в магазинах
Оружие появляется в магазине, как любой элемент, с тем же именем:
{ name = 'WEAPON_PISTOL', price = 2500, license = 'weapon' },Смотрите магазины ox_inventory для остальной части формата магазина. Если скрипт магазина всё ещё дает оружие native, ему нужно изменение, показанное выше.
Другие скрипты, которые трогают оружие
Меню администратора, скрипты полиции, скрипты экипировки и системы банд часто используют native. Поищите в ваших ресурсах эти вызовы и замените их:
GiveWeaponToPed(...)
GiveDelayedWeaponToPed(...)
xPlayer.addWeapon(...)Поищите в папке ресурсов addWeapon и GiveWeaponToPed, затем переключите каждый результат на exports.ox_inventory:AddItem. Если вы сделаете это для всех них один раз, оружие перестанет исчезать.
Контрольный список
| Симптом | Решение |
|---|---|
| Оружие исчезает при переподключении | Оно не было элементом; дайте его с exports.ox_inventory:AddItem |
AddItem возвращает false |
Неизвестное имя, инвентарь полон или слишком тяжело |
| Оружие не работает | Имя должно быть в верхнем регистре, например WEAPON_PISTOL, и существовать в data/weapons.lua |
| Нет боеприпасов после использования | Проверьте ammoname оружия и имя элемента боеприпасов |
| Оружие ломается слишком быстро | Понизьте durability в data/weapons.lua |
| Крепление ничего не делает | Элемент компонента и запись оружия должны совпадать, оружие экипировано |
Короткие ответы
Почему моё оружие исчезает при переподключении с ox_inventory?
Оружие было дано педу с native, а не как элемент. ox_inventory только хранит оружие, которое являются элементами в вашем инвентаре, поэтому всё остальное теряется.
Как дать оружие игроку с ox_inventory?
Используйте exports.ox_inventory:AddItem(source, 'WEAPON_PISTOL', 1) на сервере. Имя оружия — это имя элемента заглавными буквами.
Где я изменяю вес оружия или его износ?
В ox_inventory/data/weapons.lua. Каждое оружие имеет запись с его меткой, весом и износом, и боеприпасы и компоненты определены в том же файле.

