FiveM Crafting-System: ox_inventory Bänke und benutzerdefiniertes Crafting

Baue Crafting auf FiveM: ox_inventory Crafting-Bänke in data/crafting.lua mit Zutaten und Zonen, eine benutzerdefinierte Server-geprüfte Rezept und Anti-Dupe-Tipps.

Crafting bedeutet, dass ein Spieler einige Gegenstände in einen anderen Gegenstand verwandelt. Du kannst die in ox_inventory eingebauten Crafting-Bänke verwenden, oder schreibe deine eigene Rezept in einem Skript. Dieser Artikel zeigt beides, und dann die Überprüfungen, die Spieler davon abhalten, Gegenstände zu duplizieren.

ox_inventory Crafting-Bänke

Öffne ox_inventory/data/crafting.lua. Es gibt eine Liste von Bänken zurück. Jede Bank hat eine Liste von handwerklichen Gegenständen und einen Ort in der Welt:

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),
        },
    },
}

Was jedes Feld macht:

Feld Bedeutung
name Der Gegenstand, der produziert wird
ingredients Item-Namen und die Anzahl von jedem benötigten
duration Crafting-Zeit in Millisekunden
count Wie viel des Ergebnisses du pro Handwerk bekommst
points Koordinaten, an denen die Bank verwendet werden kann
zones Box-Zonen für ox_target, als Alternative zu points

Alles, das in name oder ingredients benannt ist, muss in data/items.lua existieren. Siehe adding items to ox_inventory. Starte ox_inventory neu nach dem Bearbeiten der Datei.

Tipp: Ein Zutat-Wert unter 1 verbraucht den Gegenstand nicht, es verwendet diese Fraktion seiner Haltbarkeit. Ein Wert von 0.1 bei einem Werkzeug mit Haltbarkeit verwendet zehn Prozent davon.

Zonen anstelle von Punkten

Eine Zone ist eine Box, die der Spieler ansprechen kann:

lua
zones = {
    {
        coords = vec3(1087.3, -3099.4, -39.0),
        size = vec3(1.5, 1.0, 1.0),
        distance = 1.5,
        rotation = 45.0,
    },
},

Zonen brauchen ox_target, um zu laufen. Schau dir die Beispiele in deiner Kopie von data/crafting.lua an, um die genauen Felder deiner Version zu sehen, da sich das Format zwischen Releases ändert. Für das Einschränken einer Bank auf einen Job liest ox_inventory auch groups in der Bank, die gleiche Idee wie in ox_inventory stashes.

Eine benutzerdefinierte Rezept mit Server-Überprüfungen

Wenn du deine eigenen Regeln möchtest, wie ein Geschicklichkeits-Level, ein Preis oder einen Fortschrittsbalken von deinem eigenen, schreibe die Rezept in deinem Skript und lass ox_inventory nur die Gegenstände verarbeiten. Der wichtige Teil ist, dass der Server alles macht:

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)

Der Client fragt, spielt den Fortschrittsbalken ab und liest nur die Antwort:

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

Für die Rückruf- und Benachrichtigungsfunktionen siehe server callbacks on ESX, QBCore and ox_lib.

Anti-Dupe-Tipps

Crafting ist ein klassischer Ort für Gegenstands-Duplizierung, da Gegenstände in zwei Schritten entfernt und hinzugefügt werden. Halte diese Regeln:

  • Nur Server. Der Server überprüft Zutaten und gibt das Ergebnis. Der Client sendet „Ich möchte Rezept X handwerken", nie Zählungen oder Itemns, die er sich ausgedacht hat.
  • Überprüfen, dann entfernen, dann hinzufügen. Füge das Ergebnis nie vor dem erfolgreichen Entfernen hinzu. Wenn das Hinzufügen fehlschlägt, gib die Zutaten zurück.
  • Ein Handwerk nach dem anderen. Eine Flag pro Spieler, wie crafting[source] oben, stoppt ein Spam-Event davon, die Rezept mehrmals parallel zu laufen.
  • Überprüfe CanCarryItem zuerst. Ein volles Inventar ist der übliche Grund, warum AddItem fehlschlägt, und der Spieler würde die Zutaten verlieren.
  • Überprüfe die Entfernung. Wenn die Rezept zu einer Bank gehört, vergleiche die Koordinaten des Spielers zur Bank auf dem Server.
  • Lösche Staat beim Drop. Setze die Flag zurück, wenn ein Spieler verlässt, damit ein Disconnect in der Mitte die Rezept nicht sperrt.
lua
AddEventHandler('playerDropped', function()
    crafting[source] = nil
end)

Mehr zum Schutz von Events findest du unter securing server events.

Checkliste

Symptom Lösung
Bank nicht erscheinend Bearbeite data/crafting.lua, starte dann ox_inventory neu
Rezept-Fehler beim Start Ein Gegenstand in name oder ingredients fehlt in data/items.lua
Zone macht nichts ox_target muss laufen, und die Zonen-Felder müssen mit deiner Version abgestimmt werden
Zutaten verloren, kein Ergebnis Überprüfe CanCarryItem zuerst und erstattet, wenn AddItem fehlschlägt
Gegenstände dupliziert Verschiebe die ganze Rezept auf den Server, füge eine Eins-nach-der-anderen-Flag hinzu
Handwerk funktioniert von weit weg Überprüfe die Entfernung des Spielers zur Bank auf dem Server

Kurze Antworten

Wie füge ich eine Crafting-Bank zu ox_inventory hinzu?

Füge einen Eintrag zu ox_inventory/data/crafting.lua mit items (jede mit ingredients und duration) und entweder points oder zones für das Hinzufügen der Bank hinzu. Starte ox_inventory neu.

Kann eine Rezept einen Teil der Haltbarkeit eines Gegenstandes verwenden?

Ja. Ein Zutat-Wert unter 1 verwendet diese Fraktion der Haltbarkeit eines Gegenstandes, der sie hat, anstatt den Gegenstand zu verbrauchen.

Wie halte ich Spieler davon ab, Gegenstände beim Crafting zu duplizieren?

Mache das ganze Rezept auf dem Server: Überprüfe die Zutaten, entferne sie, füge dann das Ergebnis hinzu, und weigere dich, ein zweites Handwerk zu starten, während eines für diesen Spieler läuft.

Scripts ohne dieses Problem

Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →

Weiterlesen