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:

lua
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.1 na 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ć:

lua
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:

lua
-- 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ź:

lua
-- 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' })
end

Dla 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ć CanCarryItem najpierw. Pełny ekwipunek to zwykły powód, dla którego AddItem zawodzi, 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.
lua
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 →

Czytaj dalej