System crafting FiveM: stanowiska ox_inventory i niestandardowe crafting
Zbuduj crafting na FiveM: stanowiska crafting ox_inventory w data/crafting.lua z składnikami i strefami, niestandardowy przepis sprawdzony przez serwer i porady anti-dupe.
Crafting oznacza, że gracz zmienia kilka przedmiotów w inny przedmiot. Możesz użyć stanowisk crafting wbudowanych w ox_inventory, lub napisać własny przepis w skrypcie. Ten artykuł pokazuje oba, a następnie czeki, które uniemożliwiają graczom duplikowanie przedmiotów.
Stanowiska crafting ox_inventory
Otwórz ox_inventory/data/crafting.lua. Zwraca listę stanowisk. Każde stanowisko ma listę możliwych do stworzenia przedmiotów i miejsce na świecie:
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),
},
},
}Co robi każde pole:
| Pole | Znaczenie |
|---|---|
name |
Przedmiot, który jest wytwarzany |
ingredients |
Nazwy przedmiotów i liczba każdego potrzebnego |
duration |
Czas crafting w milisekundach |
count |
Ile wyników otrzymujesz na craftowanie |
points |
Współrzędne, gdzie można użyć stanowiska |
zones |
Strefy pudełka dla ox_target, jako alternatywa dla points |
Wszystko nazwane w name lub ingredients musi istnieć w data/items.lua. Patrz adding items to ox_inventory. Uruchom ponownie ox_inventory po edycji pliku.
Porada: wartość składnika poniżej 1 nie zużywa przedmiotu, używa tej frakcji jego wytrzymałości. Wartość
0.1na narzędzie z wytrzymałością używa dziesięciu procent.
Strefy zamiast punktów
Strefa to pudełko, które gracz może wskazać:
zones = {
{
coords = vec3(1087.3, -3099.4, -39.0),
size = vec3(1.5, 1.0, 1.0),
distance = 1.5,
rotation = 45.0,
},
},Strefy potrzebują ox_target do pracy. Spójrz na przykłady w twojej kopii data/crafting.lua dla dokładnych pól twojej wersji, ponieważ format zmienia się między wydaniami. Aby ograniczyć stanowisko do pracy, ox_inventory również czyta groups na stanowisku, to samo co w ox_inventory stashes.
Niestandardowy przepis ze sprawdzeniami serwera
Jeśli chcesz swoich własnych reguł, takich jak poziom umiejętności, koszt lub pasek postępu swojego własnego, napisz przepis w swoim skrypcie i pozwól ox_inventory tylko obsługiwać przedmioty. Ważna część to, że serwer robi wszystko:
-- 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)Klient pyta, gra pasek postępu i tylko czyta odpowiedź:
-- 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' })
endDla funkcji callback i powiadomienia, patrz server callbacks on ESX, QBCore and ox_lib.
Porady anti-dupe
Crafting to klasyczne miejsce duplikacji przedmiotów, ponieważ przedmioty są usuwane i dodawane w dwóch krokach. Trzymaj te reguły:
- Tylko serwer. Serwer sprawdza składniki i daje wynik. Klient wysyła « Chcę tworzyć przepis X », nigdy liczby lub nazwy przedmiotów, które wymyślił.
- Sprawdź, potem usuń, potem dodaj. Nigdy nie dodawaj wyniku, zanim usunięcie się powiodło. Jeśli dodanie nie powiedzie się, oddaj składniki z powrotem.
- Jeden craft na raz. Flaga na gracza, jak
crafting[source]powyżej, zatrzymuje spam zdarzenia z pracy przepisu kilka razy równolegle. - Sprawdzić
CanCarryItemnajpierw. Pełny ekwipunek to zwykły powód, dla któregoAddItemzawodzi, i gracz straciłby składniki. - Sprawdzić dystans. Jeśli przepis należy do stanowiska, porównaj współrzędne gracza ze stanowiskiem na serwerze.
- Wyczyść stan przy upuszczeniu. Zresetuj flagę, gdy gracz odejdzie, więc rozłączenie w środku nie zablokuje przepisu.
AddEventHandler('playerDropped', function()
crafting[source] = nil
end)Aby dowiedzieć się więcej na temat ochrony zdarzeń, patrz securing server events.
Lista kontrolna
| Objaw | Naprawa |
|---|---|
| Stanowisko się nie pojawia | Edytuj data/crafting.lua, potem uruchom ponownie ox_inventory |
| Błędy przepisu na start | Przedmiot w name lub ingredients brakuje w data/items.lua |
| Strefa nic nie robi | ox_target musi działać, a pola strefy muszą pasować do twojej wersji |
| Składniki zaginione, bez wyniku | Sprawdzić CanCarryItem najpierw i zwrócić, gdy AddItem zawiedzie |
| Przedmioty zduplikowane | Przenieś całą receptę na serwer, dodaj flagę jeden-na-raz |
| Craft działa z daleka | Sprawdzić dystans gracza do stanowiska na serwerze |
Szybkie odpowiedzi
Jak dodać stanowisko crafting do ox_inventory?
Dodaj wpis do ox_inventory/data/crafting.lua z items (każdy z ingredients i duration) i albo points, albo zones na miejsce, gdzie stoi stanowisko. Uruchom ponownie ox_inventory.
Czy przepis może używać część wytrzymałości przedmiotu?
Tak. Wartość składnika poniżej 1 używa tej frakcji wytrzymałości przedmiotu, który go ma, zamiast zużywać przedmiot.
Jak mogę uniemożliwić graczom duplikowanie przedmiotów podczas crafting?
Zrób całą receptę na serwerze: sprawdzić składniki, usunąć je, a następnie dodać rezultat, i odmówić rozpoczęcia drugiego craftu, gdy jeden już działa dla tego gracza.
Skrypty bez tego problemu
Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →
Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →
Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →