Dokumentation

Dokumentation Barber shop

Ein Barbershop, inszeniert wie eine Szene, mit einer Kamera, die der Spieler wirklich steuert. Der Charakter kommt herein, setzt sich, und der Barber legt los, während eine Orbit-Kamera den Kopf ins Bild rückt. Haare, Bart, Overlays und der komplette Satz an Skin-Details, live am Charakter zu sehen, bevor ein einziger Dollar ausgegeben ist.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Installation

  1. Resource ablegen

    Hol dir das Script aus deinem Tebex-Konto, kopier den Ordner avenida_barber/ in dein resources-Verzeichnis und füg ensure avenida_barber hinter ensure oxmysql in deine Serverconfig ein.

  2. SQL ausführen

    Führ Abschnitt [A] von INSTALL.sql auf deiner Datenbank aus. Abschnitt [B] ist bedingt, der Dateikopf sagt, wann du ihn brauchst.

  3. Config durchsehen

    Öffne config/config.lua. Die Defaults passen auf den meisten Servern, die einzige Zeile, die du wirklich prüfen solltest, ist Config.Locale. Preise, Salons und Stuhlverhalten liegen nebenan in config/barber.lua.

  4. Integrationen prüfen

    Setz Config.Debug = true, starte neu und lies die Konsole: Eine Zeile pro Bridge-Kategorie nennt das gewählte Target. Setz es wieder auf false, sobald die Zeilen zu deinem Server passen. Die freigeschalteten Diagnosebefehle kosten einen Frame-Hitch.

  5. Admin-Rechte geben

    Füg add_ace group.admin avenida_barber.admin allow in deine Serverconfig ein und ruf dann im Spiel /avenida_barber_check für den vollen Bericht auf.

02

Konfiguration

Eine Integration erzwingen, statt sie zu erkennen

Die Auto-Erkennung deckt die meisten Server ab, und sie prüft den echten Export statt nur den Resource-Status. Auf einem eigenen Stack erzwingst du das Target, dann entfällt die Erkennung komplett.

lua
-- config/config.lua
Config.Locale    = 'en'
Config.UseOxLib  = true

Config.Framework = 'auto'   -- 'qbcore' | 'esx' | 'vrp' | 'standalone' | 'custom'
Config.Notif     = 'ox_lib' -- 'qbcore' | 'esx' | 'ox_lib' | 'okok' | 'vrp' | 'chat' | 'custom'
Config.Interact  = 'auto'   -- 'avenida' | 'ox_target' | 'qb-target' | 'standalone' | 'custom'
Config.Clothing  = 'auto'   -- 'qb' | 'illenium' | 'fivem-appearance' | 'esx_skin' | 'vrp' | 'table' | 'custom'

Config.Camera = {
    Sensitivity = 1.0,      -- rotation, zoom and height, clamped to 0.1 - 5.0
    InvertY     = false,
}
03

Exports

Client

  • GetHairbase
    exports['avenida_barber']:GetHairbase() --> { c = collection, t = nameHash } | nil

    Die Hairbase, die der Ped gerade trägt, oder nil, wenn der Haarschnitt keine braucht. Lies sie aus, bevor du ClearPedDecorations aufrufst, und trag sie danach wieder ein, sonst wird aus den Haaren eine flache Kappe.

  • GetTattoos
    exports['avenida_barber']:GetTattoos() --> { { c, t }, ... }

    Alle Tattoo-Decorations, die diese Resource auf dem Ped hält. Der Barbershop teilt sich den einzigen Decoration-Slot mit dem Ink-Studio, und ein Redraw ohne diese Liste löscht Tattoos, für die der Spieler bezahlt hat.

  • GetSkinData
    exports['avenida_barber']:GetSkinData()

    Der Charakter genau so, wie der Barber ihn im Speicher hält, samt Haaren, Bart, Augenbrauen und deren Farben. Praktisch, um einen Look festzuhalten, bevor ein Job-Outfit übernimmt.

  • ApplySkin
    exports['avenida_barber']:ApplySkin(data, ped)

    Schreibt ein komplettes Aussehen auf einen Ped. Übergib den Ped, den du anziehen willst. Das darf auch ein Vorschau-Klon statt des Spielers sein, damit Spiegel oder Charakterauswahl dasselbe Gesicht zeigen.

  • ApplyClothing
    exports['avenida_barber']:ApplyClothing(data, ped, temporary)

    Wendet nur die Kleidung an und lässt Gesicht und Haare unangetastet. Setz temporary auf true für ein Outfit, das nicht in die Datenbank soll, etwa Gefängniskleidung oder eine Verkleidung.

04

Rezepte

Kamera und Bild der Szene einstellen

Die Kamera dreht sich um den Kopf, dieselben Höhenwerte funktionieren also im Stehen wie im Sitzen. Negative Werte gehen am Körper hinunter. Licht und Tiefenschärfe machen den Charakter zum Motiv, statt zum Ped in einem dunklen Raum.

lua
-- config/config.lua
Config.Camera = {
    Sensitivity = 1.4,          -- faster drag
    InvertY     = true,
}

Config.UI = {
    Tutorial          = true,   -- first-run tour, replayable from the toolbar
    Sounds            = true,
    Blips             = true,

    Timecycle         = 'casino_brightroom',
    TimecycleStrength = 1.0,
    TimecycleFadeMs   = 400,    -- 0 makes it snap like a light switch

    DofStrength       = 0.1,    -- false drops the per-frame SetUseHiDof call
    DofPlanes         = { 0.4, 0.7, 2.2, 4.5 },
}

Einen Salon ergänzen oder die Inszenierung weglassen

Die Salons liegen in einer offenen Datei, ein Eintrag pro Salon, mit eigenem Barber-Ped und eigenen Preisen. Schaltest du die Stuhl-Szene ab, bleiben Kamera und Menü erhalten, nur das Hereinkommen entfällt.

lua
-- config/barber.lua
Config.Barber.ChairScene = false   -- menu opens on the spot

Config.Barber.Shops[9] = {
    BarberPedModel = 's_m_m_hairdress_01',
    Welcome        = vec3(-1282.60, -1116.60, 6.99),
    Blip           = { sprite = 71, color = 4, scale = 0.7 },
}

Decorations aus deinem eigenen Script neu zeichnen

Der Ped hat einen einzigen Decoration-Slot für den ganzen Server. Wenn dein Script ClearPedDecorations aufruft, lies vorher aus, was diese Resource besitzt, und gib es danach zurück, sonst löschst du die Hair Base.

lua
local hairbase = exports['avenida_barber']:GetHairbase()
local tattoos  = exports['avenida_barber']:GetTattoos()

ClearPedDecorations(PlayerPedId())
-- your own decoration work here

if hairbase then
    AddPedDecorationFromHashes(PlayerPedId(), hairbase.c, hairbase.t)
end
for _, dec in ipairs(tattoos) do
    AddPedDecorationFromHashes(PlayerPedId(), dec.c, dec.t)
end

Dein HUD ausblenden, solange ein Shop offen ist

Die Resource feuert ein Client-Event, wenn sich ein Menü öffnet und schließt. Häng dich daran, statt zu pollen, es ist dasselbe Signal, das die eingebaute HUD-Steuerung nutzt.

lua
AddEventHandler('avenida_barber:client:uiStateChanged', function(hidden)
    if hidden then
        exports['myhud']:hide()
    else
        exports['myhud']:show()
    end
end)
05

Fragen

Welche Frameworks werden wirklich unterstützt?

QBCore, ESX und vRP, dazu ein Standalone-Modus, der gar kein Framework braucht, und ein custom-Zweig in bridges/framework.lua für alles andere. Die Erkennung läuft beim Start und prüft den echten Export. Qbox und ox_core haben keinen eigenen Zweig: Sie laufen über den Standalone- oder Custom-Pfad, nicht über ein getestetes Target.

Was kostet mich vRP?

vRP speichert Kleidungskomponenten und Props, sonst nichts. Es hat kein Feld für Head-Overlays, Gesichtszüge, Haarfarbe, Augenfarbe oder Ped-Decorations. Auf vRP hält diese Resource den ganzen Charakter deshalb in ihrer eigenen Tabelle. Die Kleidungshälfte bekommt vRP trotzdem, direkt nach jeder Änderung aufgefrischt. Praktische Folge: Ein vRP-eigener Skinshop zeigt die Arbeit aus dem Salon nicht, weil vRP keinen Platz dafür hat. vRP 2 und vRP 0.5 werden nicht unterstützt, und die Resource sagt das in der Konsole, statt sich still falsch zu verhalten.

Funktioniert es mit dem ox-Stack?

Ja, überall, wo es zählt: ox_lib für Notifications über Config.UseOxLib, ox_target für den Interaktions-Prompt, ox_inventory für Kleidungs-Items und oxmysql als einzige harte Dependency. Nichts davon ist Pflicht außer oxmysql, und bridges/compat.lua liefert native Fallbacks, wenn ox_lib aus ist. Keinen eigenen Zweig hat ox_core als Framework: Auf einem ox_core-Server läuft die Resource standalone oder über den custom-Zweig von bridges/framework.lua, wenn sie deine Spielerdaten lesen soll.

Kann ich es neben avenida_tattoo und avenida_clotheshops laufen lassen?

Ja, genau dafür sind sie gebaut. Jede besitzt ihre Hälfte des einen Ped-Decoration-Slots und trägt die der anderen nach jedem Redraw wieder ein. Was du nicht tun darfst: die einzelnen Resources und das Bundle avenida_skin gleichzeitig laufen lassen. Beide würden je einen eigenen Blip setzen und je eine eigene Kopie desselben Charakters schreiben. Die Resource erkennt die Überschneidung und meldet das beim Start in der Konsole.

Eine Frisur fehlt in der Liste

Hair Bases sind nach Game Build gefiltert. Ein Style, den dein Client nicht rendern kann, wird bewusst nie gelistet, denn eine Option, die am Ende kaputt herauskommt, führt den Spieler nur in die Irre. Ruf /avenida_barber_check auf, um den Build zu sehen, den dein Server tatsächlich fährt.

Der Kopf folgt meinem Cursor nicht

Die Blickverfolgung hängt an einer Orbit-Kamerasitzung: Der Thread startet mit der Kamera und endet mit ihr. Er braucht außerdem NUI-Fokus, da er den Cursor über GetNuiCursorPosition liest. Wenn eine andere Resource die Kamera übernommen hat, bleibt die Verfolgung absichtlich aus.

Kann ich eine Sprache ergänzen?

Fünfzehn werden gefüllt ausgeliefert, im offenen Ordner locales/. Kopier eine Datei, übersetz die Werte und trag deinen neuen Code in Config.Locale ein. en.lua ist der Fallback für jeden ausgelassenen Key, eine unvollständige Datei zeigt also nie ein leeres Label.

Was kostet es, wenn niemand im Shop ist?

0.00ms. Die Interaktionspunkte teilen sich einen Thread, der auf eine Sekunde hochgeht, wenn niemand in der Nähe ist, Blips werden einmal erzeugt, und jeder Session-Thread wird beim Verlassen beendet. Zwischen zwei Haarschnitten läuft nichts.

Warenkorb
Spirit RP
Discord