Dokumentation

Dokumentation Dance minigame

Das Tanz-Minigame aus den GTA Online Nightclubs, für FiveM nachgebaut und überall auf deiner Map spielbar. Tipp im Takt, um vier Intensitätsstufen hochzugehen, halt sie oben, zieh sie auf Kommando hoch oder lass sie fallen, wechsle zehn Styles und zieh 27 Special Moves durch, ohne die Tanzfläche zu verlassen. Alle um dich herum sehen die ganze Show, und dein Server führt keine einzige Zeile davon aus.

  • ESX
  • QBCore
  • Qbox
  • vRP
  • Standalone
01

Installation

  1. Resource ablegen

    Hol dir das Script aus deinem Tebex-Konto, kopier den Ordner avenida_dance/ in dein resources-Verzeichnis und füg ensure avenida_dance in deine Serverconfig ein. Es muss nichts vorher starten.

  2. Auslöser wählen

    Öffne config/config.lua. Config.Command ist der Chat-Command, Config.Keybind registriert eine frei belegbare Taste mit Config.DefaultKey als Standard. Behalt beides oder setz den Command auf false und lass deinen Spielern die Taste.

  3. Sprache setzen

    Config.Locale nimmt jeden der fünfzehn Codes aus locales/. Die Dateien sind escrow-frei, du kannst also jede Zeile auf den Ton deines Servers umschreiben.

  4. Notifications auf deinen Stack umbiegen

    Config.Notif steht auf auto und erkennt ox_lib, okokNotify, QBCore oder ESX in dieser Reihenfolge. Erzwing ein Ziel, wenn du mehrere fährst, oder nimm den custom-Zweig in bridges/notif.lua für dein eigenes System.

  5. Einen fünften Schritt gibt es nicht

    Kein SQL auszuführen, kein Framework zu deklarieren, keine Permission zu vergeben. Server neu starten und den Command tippen.

02

Konfiguration

Wie deine Spieler den Tanz starten

Ein Command, eine Taste oder beides. Die Taste registriert sich in den FiveM-Einstellungen unter Key Bindings, jeder Spieler kann sie also selbst neu belegen, ohne deine Config anzufassen.

lua
-- config/config.lua
Config.Command    = 'dance'   -- chat command, false to disable
Config.Keybind    = true      -- rebindable key in FiveM settings
Config.DefaultKey = 'F7'

-- The GTA:O help panel with styles, actions and controls.
-- Off, style and move changes are announced by notification instead.
Config.ShowHints = true
03

Exports

Session

  • StartDance
    exports.avenida_dance:StartDance(styleIndex?) --> boolean

    Startet eine Session für den lokalen Spieler, optional mit erzwungenem Style-Index von 1 bis 10. Gibt false zurück, wenn er gerade nicht tanzen kann, im Fahrzeug, im Wasser, in der Luft oder schon am Tanzen. Dein Script kann also entscheiden, was dann passiert.

  • StopDance
    exports.avenida_dance:StopDance()

    Beendet die laufende Session und spielt das echte Outro, statt die Animation abzuschneiden. Ohne Wirkung, wenn niemand tanzt.

  • IsDancing
    exports.avenida_dance:IsDancing() --> boolean

    True, solange der lokale Spieler in einer Session ist. Praktisch, um deine eigenen Interaktionen, dein Inventar oder eine Job-Aktion zu blockieren, während das Minigame die Controls belegt.

Music

  • SetDanceBeat
    exports.avenida_dance:SetDanceBeat(bpm, msToNextBeat?)

    Füttert den simulierten Beat mit dem Tempo des Tracks, den deine eigene Musik-Resource spielt. Das zweite Argument setzt die Phase, das Icon pulst dann auf dem echten Downbeat statt irgendwo daneben. Wird ignoriert, wenn der Wert keine positive Zahl ist.

04

Rezepte

Das Minigame auf deine eigene Musik legen

Den nativen Beat gibt es nur dort, wo Rockstar einen Audio-Emitter gesetzt hat. Streamt dein Club eigene Tracks, schalt den nativen Beat ab und gib dein Tempo selbst vor. Einmal beim Start eines Tracks aufrufen, dann bei jedem Wechsel erneut.

lua
-- config/config.lua
Config.UseNativeBeat = false
Config.FallbackBpm   = 122.0

-- in your music resource, when a track starts
exports.avenida_dance:SetDanceBeat(128.0, 180)

Einen Tanz aus einem Job oder einem Prop starten

Eine Bühne, ein Podest, eine Stange, ein Tänzer-Job: Gib deinem Spieler den Tanz ohne Command. Erzwing einen Style-Index, damit das Podest immer gleich aussieht, und lies den Rückgabewert, damit du weißt, ob es wirklich losging.

lua
local started = exports.avenida_dance:StartDance(7) -- shuffle

if not started then
    -- the player is in a vehicle, in water, or already dancing
    return
end

Dem Minigame dein eigenes Layout geben

Ein Controller braucht hier gar nichts, die Defaults sind FiveM-Inputs und das Spiel legt sie schon auf das Pad. Das hier ist für einen Server, der eigene Tasten will. Lass Tippen und Halten auf zwei verschiedenen Eingaben, das Minigame liest sie getrennt.

lua
-- config/config.lua
Config.Controls = {
    beat        = 201, -- INPUT_FRONTEND_ACCEPT
    hold        = 202, -- INPUT_FRONTEND_CANCEL
    boost       = 22,  -- INPUT_JUMP
    drop        = 23,  -- INPUT_ENTER
    flourish    = 45,  -- INPUT_RELOAD
    stop        = 73,
    -- the rest keeps its default
}

Das Minigame nachsichtig oder gnadenlos machen

Die Schwierigkeit sind vier Zahlen. Senk BeatsHit, und auch Gelegenheitsspieler erreichen Stufe vier. Erhöh BeatsFail, und Tastenhämmern wird nicht mehr bestraft. Das sind die Werte, die ein Clubbetreiber zuerst anfassen will.

lua
-- config/config.lua
Config.BeatsHit  = 8    -- clean beats to cross a level
Config.BeatsMiss = 16   -- missed beats to drop one
Config.BeatsFail = 8    -- bad inputs to drop one

Config.Level3Min = 0.25
Config.Level4Min = 0.75
05

Fragen

Brauche ich ein Framework?

Nein, auch nicht als Fallback: Es gibt in dieser Resource nichts, was ein Framework liefern könnte. Sie liest nie Geld, Items, Jobs oder Identität. Deshalb läuft dieselbe Datei auf ESX, QBCore, Qbox, vRP, ox_core oder einem nackten Server, ohne dass du eine einzige Bridge konfigurierst. Das Einzige, was ein Framework hier tun kann, ist eine Notification anzuzeigen, und die liegt in einer offenen Datei.

Brauche ich ox_lib?

Nein. Config.UseOxLib ist im Auslieferungszustand aus, und dann nimmt die Resource für alles die nativen FiveM-APIs: den Ped, den Fahrzeug-Check, die Spieler-ID. Schaltest du es ein, nutzt sie stattdessen die ox_lib-Caches, was sich auf einem Server lohnt, der den ox-Stack ohnehin fährt. Sonst taucht es nur noch in einem der sechs Zweige der Notification-Bridge auf.

Gibt es ein Serverscript oder eine Datenbank?

Weder noch. In der Resource gibt es keine Serverdatei, kein SQL, keine Tabelle, kein Event, das von einem Client zurückkommt. Alles, was Spieler in der Nähe sehen, kommt aus vier Statebags, die der Tänzer pusht. Das ist eine Architekturentscheidung mit einer Folge, die man aussprechen sollte: Wir speichern nichts serverseitig, die Style-Vorliebe deines Spielers liegt also in seinen eigenen Spieleinstellungen und nicht in deiner Datenbank.

Warum sehen entfernte Tänzer weniger flüssig aus als mein eigener?

Das Animationsnetzwerk, das GTA für dieses Minigame nutzt, klont nicht über OneSync, entfernte Tänzer werden deshalb lokal aus den Statebags nachsimuliert. Meistens gibt das genau das Original wieder. Bleibt ein Klon in seinem Intro hängen, versucht es die Resource zweimal erneut und loopt dann den dominanten Clip aus dem 27er-Raster. Style, Intensität und Richtung stimmen weiter, nur die Übergänge zwischen den Posen sind weniger weich. Ganzkörper-Moves replizieren immer nativ.

Mein Club spielt eigene Musik, funktioniert der Beat trotzdem?

Ja, über SetDanceBeat. Der native Beat wird aus den Audio-Emittern der Map gelesen, und die gibt es nur dort, wo Rockstar sie gesetzt hat. Für einen eigenen Track schaltest du Config.UseNativeBeat ab und gibst der Resource deine BPM plus die Zeit bis zum nächsten Schlag. Das Icon pulst dann auf deinem Track statt auf einer Schätzung.

Was passiert auf einem sehr schnellen Track?

Oberhalb von Config.MaxBpm, standardmäßig 140, geraten die Tanzanimationen gegenüber der Musik aus dem Takt. Damit das nicht sichtbar wird, sinkt die Animationsrate über dieser Schwelle um ein Viertel, und die Wiedergabegeschwindigkeit bleibt auf das 0,8- bis 1,2-Fache der Normalgeschwindigkeit begrenzt. Beide Werte stehen in der offenen Config, wenn du sie hochziehen willst.

Kann man überall tanzen oder nur im Club?

Überall, zu Fuß und auf festem Boden. Du musst keine Zone deklarieren und keine Ortsliste pflegen. Die Session endet von selbst, wenn dein Spieler ins Wasser gerät, in die Luft kommt, Feuer fängt oder in den Ragdoll geht. So tanzt am Ende niemand neben einem Dach in der Luft.

Was kostet das Script, wenn niemand tanzt?

0.00ms. Die Resource hat überhaupt keine Ambient-Schleife: Sie registriert einen Command, eine Tastenbelegung und einen Statebag-Handler und tut dann nichts mehr, bis jemand eine Session startet. Jeder Thread, den eine Session erzeugt, stirbt mit ihr.

Warenkorb
Spirit RP
Discord