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:
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.1bei einem Werkzeug mit Haltbarkeit verwendet zehn Prozent davon.
Zonen anstelle von Punkten
Eine Zone ist eine Box, die der Spieler ansprechen kann:
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:
-- 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:
-- 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' })
endFü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
CanCarryItemzuerst. Ein volles Inventar ist der übliche Grund, warumAddItemfehlschlä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.
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 →