aether-framework/resources/[aether]/aether-inventory/shared/items.lua
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark,
  Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI)
- aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource,
  an aether-core gekoppelt (Rechte über aether_users.admin_group), mit
  WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU)
- Prototypen admin/ vervollständigt
- SQL-Schema aether_admin.sql
- Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 18:55:32 +02:00

265 lines
11 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================================
-- Aether Inventory — Item-Registry und Slot-Aufteilung
-- Wird auf Client und Server geladen. Der Server rechnet damit
-- (Gewicht, Stapelbarkeit), der Client zeigt sie nur an.
-- =====================================================================
Inventar = Inventar or {}
-- ---------------------------------------------------------------------
-- Grenzen
-- ---------------------------------------------------------------------
Inventar.MAX_GEWICHT = 30.0 -- Traglast in Kilogramm
Inventar.TASCHE_SLOTS = 25 -- Plaetze in der Tasche
Inventar.HOTBAR_SLOTS = 5 -- Plaetze in der Schnellleiste
Inventar.AUFHEB_WEITE = 3.0 -- Reichweite zum Aufheben (Meter)
Inventar.GEBEN_WEITE = 3.0 -- Reichweite zum Geben (Meter)
Inventar.BODEN_SICHT = 15.0 -- Sichtweite fuer Items in der Inventarliste (Meter)
-- ---------------------------------------------------------------------
-- Fallengelassene Items (sichtbare Kartons in der Welt)
-- ---------------------------------------------------------------------
-- Einheitliche Props: Beim Fallenlassen wird zufaellig einer davon gewaehlt
Inventar.DROP_PROPS = {
'prop_cardbordbox_03a',
'prop_cardbordbox_04a',
'prop_cardbordbox_05a',
}
Inventar.DROP_SPAWN_WEITE = 30.0 -- Ab dieser Entfernung wird der Karton erzeugt
Inventar.DROP_HINWEIS = 1.8 -- Entfernung, ab der „E zum Aufheben" erscheint
Inventar.DROP_MAX_STUNDEN = 48 -- Nach dieser Zeit werden Drops aufgeraeumt (0 = nie)
-- ---------------------------------------------------------------------
-- Slot-Aufteilung
-- Alles liegt in einer Tabelle; die Slotnummer bestimmt den Bereich.
-- ---------------------------------------------------------------------
Inventar.BEREICH = {
tasche = { von = 0, bis = 24 }, -- 0–24
hotbar = { von = 100, bis = 104 }, -- 100–104
equip = { von = 200, bis = 204 }, -- 200–204
}
-- Zuordnung der Ausruestungs-Slots zu ihren Slotnummern
Inventar.EQUIP_SLOTS = {
helm = 200,
brust = 201,
hose = 202,
schuhe = 203,
schmuck = 204,
}
--- Liefert den Bereichsnamen zu einer Slotnummer
--- @param slot number Slotnummer
--- @return string|nil 'tasche' | 'hotbar' | 'equip'
function Inventar.BereichVon(slot)
for name, bereich in pairs(Inventar.BEREICH) do
if slot >= bereich.von and slot <= bereich.bis then return name end
end
return nil
end
--- Liefert den Ausruestungs-Schluessel zu einer Slotnummer (z. B. 'brust')
--- @param slot number Slotnummer
--- @return string|nil
function Inventar.EquipSchluessel(slot)
for schluessel, nummer in pairs(Inventar.EQUIP_SLOTS) do
if nummer == slot then return schluessel end
end
return nil
end
-- ---------------------------------------------------------------------
-- Item-Registry
-- gewicht = Kilogramm pro Stueck
-- stapelbar = mehrere Stueck in einem Slot
-- slot = passt nur in diesen Ausruestungs-Slot
-- nutzbar = kann benutzt werden
-- wirkung = was beim Benutzen passiert (vom Server ausgewertet)
-- ---------------------------------------------------------------------
Inventar.Items = {
pistole = {
name = 'Pistole P99', icon = '🔫', kat = 'Waffe', gewicht = 1.2, rar = 'epic',
waffe = true, beschreibung = 'Halbautomatische 9mm-Pistole. Registrierte Feuerwaffe.',
},
munition9 = {
name = '9mm Munition', icon = '🧨', kat = 'Munition', gewicht = 0.01, rar = 'common',
stapelbar = true, beschreibung = 'Standard-Patronen für 9mm-Waffen.',
},
handy = {
name = 'Smartphone', icon = '📱', kat = 'Elektronik', gewicht = 0.3, rar = 'rare',
komponenten = { 'SIM-Karte', 'Akku' }, nutzbar = true,
beschreibung = 'Modernes Smartphone. Enthält verbaute Komponenten.',
},
wasser = {
name = 'Wasserflasche', icon = '🥤', kat = 'Nahrung', gewicht = 0.5, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'durst', menge = 25 },
beschreibung = 'Löscht den Durst. +25 Durst.',
},
sandwich = {
name = 'Sandwich', icon = '🥪', kat = 'Nahrung', gewicht = 0.2, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'hunger', menge = 30 },
beschreibung = 'Stillt den Hunger. +30 Hunger.',
},
verband = {
name = 'Verband', icon = '🩹', kat = 'Medizin', gewicht = 0.1, rar = 'uncommon',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'leben', menge = 25 },
beschreibung = 'Stoppt Blutungen und heilt leichte Wunden.',
},
tablette = {
name = 'Schmerztabletten', icon = '💊', kat = 'Medizin', gewicht = 0.02, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'leben', menge = 10 },
beschreibung = 'Lindert Schmerzen kurzfristig.',
},
funk = {
name = 'Funkgerät', icon = '📻', kat = 'Elektronik', gewicht = 0.4, rar = 'uncommon',
nutzbar = true, beschreibung = 'Kurzstrecken-Funk für die Kommunikation.',
},
dietrich = {
name = 'Dietrich', icon = '🗝️', kat = 'Werkzeug', gewicht = 0.05, rar = 'uncommon',
stapelbar = true, beschreibung = 'Zum Öffnen einfacher Schlösser. Kann brechen.',
},
reparaturkit = {
name = 'Reparaturkit', icon = '🧰', kat = 'Werkzeug', gewicht = 2.0, rar = 'uncommon',
nutzbar = true, beschreibung = 'Repariert Fahrzeuge notdürftig.',
},
bargeld = {
name = 'Bargeld', icon = '💵', kat = 'Wertsache', gewicht = 0, rar = 'legendary',
stapelbar = true, beschreibung = 'Sauberes Bargeld.',
},
goldkette = {
name = 'Goldkette', icon = '📿', kat = 'Schmuck', gewicht = 0.15, rar = 'epic',
slot = 'schmuck', beschreibung = 'Massive Goldkette. Ein echter Hingucker.',
},
helm = {
name = 'Ballistikhelm', icon = '⛑️', kat = 'Ausrüstung', gewicht = 1.0, rar = 'uncommon',
slot = 'helm', beschreibung = 'Schützt den Kopf vor Treffern.',
},
weste = {
name = 'Schutzweste', icon = '🦺', kat = 'Ausrüstung', gewicht = 3.5, rar = 'rare',
slot = 'brust', beschreibung = 'Kugelsichere Weste. Reduziert Schaden am Oberkörper.',
},
jeans = {
name = 'Jeans', icon = '👖', kat = 'Kleidung', gewicht = 0.6, rar = 'common',
slot = 'hose', beschreibung = 'Robuste Jeans.',
},
sneaker = {
name = 'Sneaker', icon = '👟', kat = 'Kleidung', gewicht = 0.8, rar = 'common',
slot = 'schuhe', beschreibung = 'Bequeme Sneaker.',
},
-- --- Weitere Waren aus dem Laden -------------------------------------
cola = {
name = 'Cola', icon = '🥫', kat = 'Nahrung', gewicht = 0.4, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'durst', menge = 20 },
beschreibung = 'Eiskalt, koffeinhaltig.',
},
energy = {
name = 'Energydrink', icon = '⚡', kat = 'Nahrung', gewicht = 0.4, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'ausdauer', menge = 40 },
beschreibung = 'Gibt Extra-Ausdauer.',
},
kaffee = {
name = 'Kaffee to go', icon = '☕', kat = 'Nahrung', gewicht = 0.3, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'ausdauer', menge = 25 },
beschreibung = 'Wach werden.',
},
chips = {
name = 'Chips', icon = '🍟', kat = 'Nahrung', gewicht = 0.2, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'hunger', menge = 15 },
beschreibung = 'Knuspriger Snack.',
},
schoko = {
name = 'Schokoriegel', icon = '🍫', kat = 'Nahrung', gewicht = 0.1, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'hunger', menge = 12 },
beschreibung = 'Süße Energie.',
},
burger = {
name = 'Burger', icon = '🍔', kat = 'Nahrung', gewicht = 0.3, rar = 'common',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'hunger', menge = 45 },
beschreibung = 'Deftige Mahlzeit.',
},
medkit = {
name = 'Erste-Hilfe-Kit', icon = '🧳', kat = 'Medizin', gewicht = 1.5, rar = 'rare',
stapelbar = true, verbrauchbar = true, nutzbar = true,
wirkung = { art = 'leben', menge = 60 },
beschreibung = 'Behandelt schwere Wunden.',
},
kabel = {
name = 'Kabelbinder', icon = '🔗', kat = 'Werkzeug', gewicht = 0.1, rar = 'common',
stapelbar = true, beschreibung = 'Vielseitig einsetzbar.',
},
lampe = {
name = 'Taschenlampe', icon = '🔦', kat = 'Werkzeug', gewicht = 0.3, rar = 'common',
nutzbar = true, beschreibung = 'Leuchtet den Weg.',
},
sim = {
name = 'SIM-Karte', icon = '📶', kat = 'Elektronik', gewicht = 0.01, rar = 'common',
stapelbar = true, beschreibung = 'Wird fürs Handy benötigt.',
},
akku = {
name = 'Akku', icon = '🔋', kat = 'Elektronik', gewicht = 0.1, rar = 'common',
stapelbar = true, beschreibung = 'Ersatz-Akku fürs Handy.',
},
boerse = {
name = 'Börse', icon = '👛', kat = 'Zubehör', gewicht = 0.2, rar = 'uncommon',
beschreibung = 'Fasst bis zu 10 Dokumente.',
},
rucksack = {
name = 'Rucksack', icon = '🎒', kat = 'Zubehör', gewicht = 0.6, rar = 'uncommon',
beschreibung = 'Erhöht die Tragekapazität.',
},
-- --- Waffen und Zubehoer (Ammu-Nation) -------------------------------
smg = {
name = 'MP5 (MPX)', icon = '🔫', kat = 'Waffe', gewicht = 3.0, rar = 'legendary',
waffe = true, beschreibung = 'Maschinenpistole. Registrierte Feuerwaffe.',
},
flinte = {
name = 'Schrotflinte 870', icon = '🔫', kat = 'Waffe', gewicht = 3.6, rar = 'epic',
waffe = true, beschreibung = 'Pump-Action Shotgun. Registrierte Feuerwaffe.',
},
schrot12 = {
name = 'Schrot 12/70', icon = '🧨', kat = 'Munition', gewicht = 0.04, rar = 'common',
stapelbar = true, beschreibung = 'Schrotpatronen für Flinten.',
},
schalldaempfer = {
name = 'Schalldämpfer', icon = '🔇', kat = 'Aufsatz', gewicht = 0.2, rar = 'rare',
beschreibung = 'Dämpft den Mündungsknall.',
},
waffenlampe = {
name = 'Waffenlampe', icon = '🔦', kat = 'Aufsatz', gewicht = 0.15, rar = 'uncommon',
beschreibung = 'Taktische Beleuchtung.',
},
laservisier = {
name = 'Laservisier', icon = '🎯', kat = 'Aufsatz', gewicht = 0.15, rar = 'uncommon',
beschreibung = 'Bessere Zielerfassung.',
},
}
-- Startausruestung eines frisch erstellten Charakters
Inventar.StartItems = {
{ item = 'handy', menge = 1, slot = 0 },
{ item = 'wasser', menge = 2, slot = 1 },
{ item = 'sandwich', menge = 1, slot = 2 },
{ item = 'jeans', menge = 1, slot = Inventar.EQUIP_SLOTS.hose },
{ item = 'sneaker', menge = 1, slot = Inventar.EQUIP_SLOTS.schuhe },
}
--- Liefert die Definition eines Items
--- @param kennung string Item-Kennung
--- @return table|nil
function Inventar.HoleItem(kennung)
return Inventar.Items[kennung]
end