Zum Inhalt

Shop-System (cv_shops)

NPC-Läden mit Warenkorb, Preisprüfung, optionalem Führerschein-Check und Discord-Logging. Spieler interagieren über E bei NPC-Modellen in der Spielwelt.


Konfiguration

Jeder Shop ist ein Eintrag in Config.Shops:

Config.Shops = {
    ["24/7"] = {
        titel   = "24/7",
        slogan  = "Täglich nur für Sie geöffnet!",
        blip = { sprite = 52, color = 2, scale = 0.9 },

        items = {
            ["water"] = { itemName = "water", price = 4 },
            ["sandwich"] = { itemName = "sandwich", price = 9 },
        },

        npcs = {
            { coords = vector4(x, y, z, heading), model = "mp_m_shopkeep_01", animation = "guard" },
        }
    },

    -- Waffenladen – benötigt Waffenschein
    ["Ammunition"] = {
        titel          = "Ammunition",
        requiredLicense = "weapon_license",   -- Lizenz-Check via gh_license
        blip           = { sprite = 110, color = 3, scale = 0.8 },
        items          = { ... },
        npcs           = { ... },
    },

    -- Schwarzmarkt – nur Bargeld-Zahlung
    ["Schwarzmarkt"] = {
        payBlack = true,   -- nur Cash akzeptiert (kein Bank)
        items    = { ... },
        npcs     = { ... },
    }
}

Config.Radius = 2.0  -- Interaktionsradius zum NPC in Metern

Vordefinierte Shops

Shop Blip Lizenz Besonderheit
24/7 🟢 Grün Basisgüter, Elektronik
Ammunition 🔵 Blau weapon_license Waffen & Munition
Schwarzmarkt payBlack = true, kein Blip
Baumarkt 🟡 Gelb Materialien, Werkzeug
Weedshop 🟡 Gelb Baggy
Apotheke 🟢 Grün Medikit
Bahama Mamas 🟣 Lila Bar & Getränke
Burgershot 🔴 Orange Fast Food
Diamond Casino Alkohol
Cat Cafe 🩷 Pink Cafe & Sushi
Rex Diner 🟠 Orange Diner-Food
La Dolce Pizza 🔴 Rot Pizza & Bier
DCA 🔵 Blau Kennzeichen plate
Stadthalle plate, contract

Kauf-Ablauf (Server-seitig)

Der Callback cv_shops:serverBuy führt folgende Validierungen durch:

  1. Charakter-Check — Spieler muss aktiven Charakter haben
  2. Nähe-Check — Spieler muss ≤ 5 m von einem Shop-NPC entfernt sein
  3. Lizenz-Check — falls requiredLicense gesetzt, via gh_license-Export
  4. Item-Validierung — alle Items müssen im Shop konfiguriert sein
  5. Inventar-Kapazitätcv.inventory.canAddItem() prüft Gewicht und Slots
  6. Geld-Check — Bank (payBank = true) oder Bargeld, bei payBlack immer Cash
  7. Transaktion — Geld abziehen, Items hinzufügen, Discord-Log

Callback

-- Client ruft auf:
cv.callback.trigger('cv_shops:serverBuy', false, function(result)
    -- result.status: 'success', 'notmoney', 'nospace', 'error'
    print(result.message)
end, {
    shop    = '24/7',
    payBank = false,   -- true = Bankkonto zahlen
    items   = {
        { id = 'water',    quantity = 2 },
        { id = 'sandwich', quantity = 1 },
    }
})

Zahlungsarten

Flag Quelle
payBlack = true (Config) immer Bargeld (Cash)
payBank = true (Callback-Daten) Bankkonto
Standard Bargeld (Cash)

Sicherheit & Logging

Alle Käufe werden per cv.log mit Kategorie shops in Discord geloggt. Fehlverhalten (außerhalb der Reichweite kaufen, Items die nicht im Shop sind) wird als warning geloggt und der Kauf abgebrochen.