--[[ d4rk_divegear - /tauchartikel: die Items in d4rk_item anlegen (28.09.2026). DIE ITEMS GEHOEREN d4rk_items. Angelegt wird ueber dieselben Exporte wie der Editor im Panel (adminItemList / adminItemCreate) - dasselbe Muster wie d4rk_medical `medartikel` (server/artikel.lua dort). NUR AUF ZURUF, NIE BEIM START: eine Saat bei jedem Start holte zurueck, was der Betreiber geloescht hat (Gedaechtnis "Wiederholte Saat holt Geloeschtes zurueck"). Vorhandene Items werden NICHT angefasst - was im Panel gepflegt ist, gewinnt. NUR AN DER SERVERKONSOLE (restricted, source 0). Taucherflasche Kleidung (Kleiderladen, d4rk_garment -> item). Traegt die Patrone in der Metadata. Gewicht GESETZT: Geraet mit Atemregler ohne Patrone. Tauchmaske Kleidung. Patronen die fuenf aus config/shared.lua. Gewichte aus items_for_ox_inventory.lua (dem Original). client_export + consume = 0: siehe client/main.lua (einsetzen) - CreateUseableItem feuert hier nie. consume = 0 bei ALLEN - wie das Kleidungsitem `clothing` in d4rk_inventory/data/items.lua. Mit dem Vorgabewert 1 (d4rk_items daten.lua:224) koennte "Benutzen" im Inventar die Flasche verbrauchen. Am 28.09.2026 zuerst ohne angelegt (Flasche, Maske: consume 1) - deshalb gibt es `tauchartikel nachziehen`: stellt bei VORHANDENEN Items nur consume und den Export richtig, alles andere bleibt, wie es im Panel steht. stack = false bei allen: die Luft steht in der Metadata jedes Stuecks. KEIN decay und keine durability-Schalter: metadata.durability zeigt den Fuellstand und darf bei 0 nicht zum Loeschen fuehren (ENTSCHEIDUNGEN.md). ]] local shared = require 'config.shared' local ITEMS = 'd4rk_items' local EXPORT = 'd4rk_divegear.patroneBenutzen' -- Die Schalter einer Zeile als Boolean: adminItemUpdate liest sie mit -- `w.x and 1 or 0`, eine 0 als Zahl waere in Lua wahr (wie d4rk_medical -- server/artikel.lua, SCHALTER). local SCHALTER = { 'stack', 'close_ui', 'nur_ausgabe', 'aktiv', 'cancel', 'disable_move', 'disable_car', 'disable_combat', 'allow_armed', 'durability', } local function wahr(x) return x == true or x == 1 end local GEWICHT = { [shared.rigItem] = 3000, [shared.maskItem] = 400, diving_tank_small = 4000, diving_tank_medium = 7000, diving_tank_large = 10000, diving_tank_xl = 13000, diving_tank_trimix = 11000, } local function liste() local l = { { name = shared.rigItem }, { name = shared.maskItem }, } for i = 1, #shared.tankNames do l[#l + 1] = { name = shared.tankNames[i], patrone = true } end return l end --[[ DIE KLEIDUNGSEINTRAEGE (d4rk_garment) - 29.09.2026. Ohne sie gibt der Kleiderladen fuer Flasche und Maske `clothing` aus statt der Items (d4rk_inventory d4rkStueckGeben -> d4rk_items GarmentInfo). Wie die Items: nur auf Zuruf, vorhandene Zeilen werden nicht angefasst. ]] local function kleidungAnlegen() local ok, zeilen = pcall(function() return exports[ITEMS]:adminGarmentList() end) if not ok or type(zeilen) ~= 'table' then print('^1 Kleidung: adminGarmentList antwortet nicht - UNGUELTIG, nichts angelegt.^7') return end for _, k in ipairs(shared.kleidung or {}) do local vorhanden for _, z in ipairs(zeilen) do if z.pedset == k.pedset and (z.collection or '') == k.collection and tonumber(z.drawable) == k.drawable and tonumber(z.texture) == -1 then vorhanden = z break end end local name = ('%s %s %s:%d'):format(k.pedset, k.komponente, k.collection, k.drawable) if vorhanden then print((' Kleidung %-34s vorhanden (Item %s)%s'):format(name, tostring(vorhanden.item), vorhanden.item == k.item and '' or ' ^3- soll ' .. k.item .. ', im Panel pruefen^7')) else local okC, erfolg, grund = pcall(function() return exports[ITEMS]:adminGarmentCreate(0, { pedset = k.pedset, komponente = k.komponente, collection = k.collection, drawable = k.drawable, texture = -1, label = locale('artikel.' .. k.item .. '.name'), item = k.item, aktiv = true, }) end) print((' Kleidung %-34s %s'):format(name, (okC and erfolg == true) and '^2angelegt -> ' .. k.item .. '^7' or ('^1FEHLER: %s^7'):format(okC and tostring(grund) or tostring(erfolg)))) end end end RegisterCommand('tauchartikel', function(source, args) if source ~= 0 then return end local nachziehen = args[1] == 'nachziehen' if GetResourceState(ITEMS) ~= 'started' then print('^1[d4rk_divegear] tauchartikel: d4rk_items laeuft nicht - nichts angelegt.^7') return end local ok, zeilen = pcall(function() return exports[ITEMS]:adminItemList() end) if not ok or type(zeilen) ~= 'table' then print('^1[d4rk_divegear] tauchartikel: adminItemList antwortet nicht - UNGUELTIG, nichts angelegt.^7') return end local da = {} for _, z in ipairs(zeilen) do if z.name then da[z.name] = z end end -- GEGENPROBE: eine leere Liste hiesse "d4rk_items kennt kein einziges -- Item" - das ist nie wahr, sondern eine kaputte Antwort. if next(da) == nil then print('^1[d4rk_divegear] tauchartikel: adminItemList lieferte 0 Items - UNGUELTIG, nichts angelegt.^7') return end print(('[d4rk_divegear] tauchartikel: %d Items in d4rk_item bekannt.'):format(#zeilen)) for _, it in ipairs(liste()) do local sollExport = it.patrone and EXPORT or nil local z = da[it.name] if z then local istExport = (z.client_export and z.client_export ~= '') and z.client_export or nil local passt = tonumber(z.consume) == 0 and istExport == sollExport if passt then print((' %-20s vorhanden, passt'):format(it.name)) elseif not nachziehen then print((' %-20s ^3vorhanden, consume %s / Export %s - soll 0 / %s: tauchartikel nachziehen^7') :format(it.name, tostring(z.consume), tostring(istExport), tostring(sollExport))) else local w = {} for k, v in pairs(z) do w[k] = v end for _, k in ipairs(SCHALTER) do w[k] = wahr(z[k]) end w.consume = 0 w.client_export = sollExport or '' local okU, erfolg, grund = pcall(function() return exports[ITEMS]:adminItemUpdate(0, z.id, w) end) print((' %-20s %s'):format(it.name, (okU and erfolg == true) and '^2nachgezogen (consume 0)^7' or ('^1FEHLER: %s^7'):format(okU and tostring(grund) or tostring(erfolg)))) end else local werte = { name = it.name, label = locale('artikel.' .. it.name .. '.name'), description = locale('artikel.' .. it.name .. '.text'), weight = GEWICHT[it.name] or 1000, stack = false, close_ui = true, aktiv = true, consume = 0, client_export = sollExport, } local okC, erfolg, grund = pcall(function() return exports[ITEMS]:adminItemCreate(0, werte) end) print((' %-20s %s'):format(it.name, (okC and erfolg == true) and '^2angelegt^7' or ('^1FEHLER: %s^7'):format(okC and tostring(grund) or tostring(erfolg)))) end end kleidungAnlegen() end, true)