- 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>
265 lines
11 KiB
Lua
265 lines
11 KiB
Lua
-- =====================================================================
|
||
-- 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
|