- lib.progressBar -> exports.d4rk_lib:progress (Betreiber: "beim benutzen kommt noch der alte balken von ox_lib"). - /tauchstand <id> (Serverkonsole): was liegt in rigSlot/maskSlot. Erster Lauf: beide Slots "clothing" mit der richtigen Kennung - vor dem Kleidungseintrag gekauft; getWorn antwortete also richtig. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
227 lines
8.9 KiB
Lua
227 lines
8.9 KiB
Lua
--[[
|
|
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)
|
|
--[[
|
|
/tauchstand <id> - WAS LIEGT IN DEN SLOTS? (29.09.2026, nur Serverkonsole)
|
|
|
|
Betreiber: "nachdem er durchgelaufen ist sagt er du traegst keine
|
|
taucherflasche". getWorn (server/main.lua) liest rigSlot und maskSlot -
|
|
dieser Befehl zeigt, was dort wirklich liegt: Itemname, Kleidungskennung,
|
|
Patrone. Ein `clothing` mit der richtigen Kennung heisst: vor dem
|
|
/tauchartikel-Eintrag gekauft, die Optik stimmt, das Item nicht.
|
|
]]
|
|
RegisterCommand('tauchstand', function(source, args)
|
|
if source ~= 0 then return end
|
|
|
|
local ziel = tonumber(args[1])
|
|
|
|
if not ziel or not GetPlayerName(ziel) then
|
|
print('[d4rk_divegear] tauchstand <server-id> - Spieler nicht gefunden.')
|
|
return
|
|
end
|
|
|
|
print(('[d4rk_divegear] tauchstand %d:'):format(ziel))
|
|
|
|
for _, s in ipairs({ { 'Flasche', shared.rigSlot, shared.rigItem }, { 'Maske', shared.maskSlot, shared.maskItem } }) do
|
|
local slot = exports.d4rk_inventory:GetSlot(ziel, s[2])
|
|
local m = slot and slot.metadata or {}
|
|
|
|
print((' %-8s Slot %d: %s (soll %s) garment %s patrone %s oxygen %s'):format(s[1], s[2],
|
|
slot and slot.name or '<leer>', s[3], tostring(m.garment), tostring(m.patrone), tostring(m.oxygen)))
|
|
end
|
|
end, true)
|