FJX Studios Dokumentation

Konfiguration

Alle Einstellungen der config.lua, der Server-Config und des Creators.

Zuletzt aktualisiert: 22. August 2026

Das System hat zwei Konfigurationsdateien. Die config.lua wird an die Clients übertragen, die config_server.lua bleibt auf dem Server — Webhook-URLs gehören deshalb ausschließlich dorthin.

Allgemein

config.lua
lua
Config.Debug = false
Config.Framework = 'auto'
Config.Locale = 'de'
Config.DebugbooleanStandard: false

Ausführliche Ausgaben in F8 und der Server-Konsole. Im Normalbetrieb aus lassen.

Config.FrameworkstringStandard: 'auto'

'auto' erkennt das Framework selbst. Feste Werte: 'esx', 'qbcore', 'standalone'.

Config.LocalestringStandard: 'de'

Sprachdatei aus locales/. Mitgeliefert sind de und en.

Das Anzeigentableau der Brandmeldezentrale bleibt bewusst deutsch beschriftet, auch bei Config.Locale = 'en'. Es bildet eine echte Anlage nach — bei der stehen die Beschriftungen ebenfalls in Landessprache.

Berechtigungen

config.lua
lua
Config.CreatorGroup = 'admin'
Config.UseAcePermission = true
Config.AcePermission = 'fjx_bma.creator'
Config.CreatorGroupstringStandard: 'admin'

Framework-Gruppe, die den Creator öffnen darf. Gilt nur bei abgeschalteter Ace-Prüfung.

Config.UseAcePermissionbooleanStandard: true

true prüft die Ace-Permission, false die Gruppe aus Config.CreatorGroup.

Config.AcePermissionstringStandard: 'fjx_bma.creator'

Name der Ace-Permission. Freigabe per add_ace group.admin fjx_bma.creator allow.

Bedienung und Target

config.lua
lua
Config.TargetSystem = 'ox_target'

Config.DrawText = {
    distance = 2.5,
    key = 38,
    bmaText = '[E] Brandmeldeanlage öffnen',
    handmelderText = '[E] Handmelder betätigen',
    keySecondary = 47,
    repairText = '[G] Anlage instand setzen',
}
Config.TargetSystemstringStandard: 'ox_target'

'ox_target', 'qb-target' oder '3dtext'. Der Wert 3dtext braucht kein weiteres Script und blendet stattdessen Tastenhinweise ein.

Config.DrawText gilt nur bei 3dtext:

Parameter Typ Beschreibung
distance number Ab welcher Entfernung in Metern der Hinweis erscheint
key number Taste für die erste Aktion (38 = E)
keySecondary number Taste für die zweite Aktion, etwa die Instandsetzung (47 = G)
bmaText string Text an der Brandmeldezentrale
handmelderText string Text am Handmelder
repairText string Text für die Instandsetzung an einer gestörten Anlage

Mit ox_target oder qb-target gelten stattdessen Symbol, Beschriftung und Reichweite aus Config.Target:

Eintrag Beschreibung
bma Brandmeldezentrale öffnen
handmelder Handmelder betätigen
repair Anlage instand setzen — nur für den Wartungsjob an gestörten Anlagen sichtbar

Props

config.lua
lua
Config.Props = {
    bma = 'bma',
    handmelder = 'handmelder_prop',
    rauchmelder = 'rauchmelder',
    alarmleuchte_off = 'hei_prop_wall_alarm_off',
    alarmleuchte_on = 'hei_prop_wall_alarm_on',
}

Die ersten drei Modelle werden mitgeliefert und über stream/ geladen. Die Alarm-Leuchte nutzt zwei Basisspiel-Modelle: Bei Alarm wird automatisch von alarmleuchte_off auf alarmleuchte_on getauscht. Eigene Modelle lassen sich hier eintragen, sofern sie auf dem Server gestreamt werden.

Kamera und Audio

config.lua
lua
Config.Camera = {
    transitionTime = 1500,
    fov = 50.0,
    offsetForward = 0.8,
    offsetUp = 0.0,
}

Config.Audio = {
    alarmFile = 'alarm.ogg',
    maxVolume = 0.8,
}
Parameter Typ Beschreibung
Camera.transitionTime number Dauer der Kamerafahrt zur Zentrale in Millisekunden
Camera.fov number Blickwinkel der Kamera vor der Anlage
Camera.offsetForward number Abstand der Kamera zur Anlage in Metern
Camera.offsetUp number Höhenversatz der Kamera in Metern
Audio.alarmFile string Sounddatei in html/audio/
Audio.maxVolume number Lautstärke im Zentrum des Alarmradius, 0.0 bis 1.0

Die Lautstärke nimmt zum Rand des Radius hin ab. Radius und Mittelpunkt werden pro Gebäude im Creator gesetzt.

Rauchmelder

config.lua
lua
Config.Rauchmelder = {
    detectRadius = 15.0,
    piepRadius = 10.0,
    checkInterval = 3000,
}
Parameter Typ Beschreibung
detectRadius number Standard-Erkennungsradius in Metern, pro Melder im Creator änderbar
piepRadius number Radius, in dem der Piepton hörbar ist
checkInterval number Prüfintervall in Millisekunden, in dem nach Feuer gesucht wird

Cooldowns

config.lua
lua
Config.Cooldowns = {
    handmelder = 15,
    bmaButton = 5,
    resetBMA = 10,
}
Parameter Typ Beschreibung
handmelder number Sekunden zwischen zwei Auslösungen desselben Melders
bmaButton number Sekunden zwischen zwei Klicks am Bedienfeld
resetBMA number Sekunden zwischen zwei Rückstellungen

Der Cooldown des Handmelders zählt je Melder, nicht je Spieler. Zwei verschiedene Handmelder lassen sich also direkt nacheinander auslösen — beide erscheinen im Tableau, ein zweiter Dispatch geht aber nicht heraus.

Fehlalarme

config.lua
lua
Config.FalseAlarm = {
    minInterval = 1800,
    maxInterval = 7200,
    jobName = 'feuerwehr',
}
Parameter Typ Beschreibung
minInterval number Kürzester Abstand zwischen zwei automatischen Fehlalarmen in Sekunden
maxInterval number Längster Abstand in Sekunden
jobName string Job, dessen Online-Anzahl geprüft wird

Ob ein Gebäude überhaupt Fehlalarme auslöst und wie viele Feuerwehrleute dafür online sein müssen, wird pro Gebäude im Creator eingestellt.

Feuer

config.lua
lua
Config.Fire = {
    system = 'z_fire',
    burnoutTime = 600,
    spreadSize = 5,
}
Parameter Typ Beschreibung
system string 'z_fire' oder 'smartfires'
burnoutTime number Sekunden bis das Feuer ausgeht, nur bei z_fire
spreadSize number Ausbreitungsradius, nur bei z_fire

Creator

config.lua
lua
Config.Creator = {
    moveSpeed = 0.01,
    moveSpeedFast = 0.05,
    rotateSpeed = 1.0,
    radiusStep = 0.5,
    minRadius = 5.0,
    maxRadius = 100.0,
    defaultRadius = 30.0,
    teleportKey = 311,
}
Parameter Typ Beschreibung
moveSpeed number Schrittweite beim Verschieben in Metern
moveSpeedFast number Schrittweite mit gedrückter SHIFT-Taste
rotateSpeed number Drehung pro Tastendruck in Grad
radiusStep number Schrittweite beim Einstellen des Alarmradius
minRadius number Kleinster einstellbarer Alarmradius in Metern
maxRadius number Größter einstellbarer Alarmradius in Metern
defaultRadius number Radius, den ein neues Gebäude bekommt
teleportKey number Taste, die das Prop vor den Spieler holt (311 = K)

Dispatch

config.lua
lua
Config.Dispatch = {
    enabled = true,
    system = 'emergencydispatch',
    customEvent = '',
    sendResetDispatch = true,
    emergencyDispatch = {
        jobs = { 'feuerwehr' },
        message = 'Brandmeldeanlage ausgelöst',
    },
}
Parameter Typ Beschreibung
enabled boolean Weiterleitung an die Leitstelle insgesamt
system string emergencydispatch, cd_dispatch, ps-dispatch, qs-dispatch oder custom
customEvent string Eigenes Server-Event bei system = 'custom'
sendResetDispatch boolean Entwarnung senden, wenn die Zentrale zurückgestellt wird
emergencyDispatch.jobs table Empfänger-Jobs; jeder Job erhält den Dispatch
emergencyDispatch.message string Meldungstext

Diese Weiterleitung entspricht der Übertragungseinrichtung einer echten Anlage. Sie lässt sich am Tableau abschalten — dann bleibt der Alarm örtlich. Auch eine Störung kann sie unterdrücken, siehe Config.Maintenance.effect.

Items

config.lua
lua
Config.Items = {
    enabled = false,
    system = 'auto',
}
Config.Items.enabledbooleanStandard: false

false überspringt alle Item-Prüfungen. Genutzt werden Items nur vom Anlagenbau und von der Wartung.

Config.Items.systemstringStandard: 'auto'

'auto', 'ox_inventory', 'esx' oder 'qbcore'.

Anlagenbau im Rollenspiel

Erlaubt es einem Job, Anlagen und Melder selbst zu setzen — ohne Admin-Creator. Eine neu gesetzte Anlage startet unscharf und muss erst in Betrieb genommen werden, wofür mindestens ein Handmelder nötig ist.

config.lua
lua
Config.Install = {
    enabled = false,
    jobs = { 'mechanic' },
    command = 'bmatechnik',

    itemBma = 'bma_zentrale',
    itemMelder = 'bma_handmelder',
    itemRauch = 'bma_rauchmelder',

    melderRadius = 100.0,
    minDistance = 50.0,
    maxTotal = 40,
    maxPerPlayer = 5,
    maxMelderPerBuilding = 20,

    carryAnim = true,
    carryBone = 24818,
    carryOffset = { x = 0.0, y = 0.38, z = 0.0 },
    carryRot = { x = 180.0, y = -90.0, z = 0.0 },
    carryBoxModel = 'prop_cs_cardbox_01',
    carryBoxOffset = { x = 0.0, y = 0.33, z = 0.0 },
    carryBoxRot = { x = 0.0, y = 0.0, z = 0.0 },
    refundOnRemove = false,
    removeOnlyOwn = false,
}
Parameter Typ Beschreibung
enabled boolean Techniker-Menü und Installation freischalten
jobs table Jobs, die bauen und warten dürfen
command string Chat-Befehl für das Techniker-Menü
itemBma string Item für eine Zentrale, wird beim Setzen verbraucht
itemMelder string Item für einen Handmelder
itemRauch string Item für einen Rauchmelder
melderRadius number Umkreis in Metern, in dem ein Melder einer Anlage zugeordnet werden kann
minDistance number Mindestabstand zwischen zwei Anlagen in Metern
maxTotal number Obergrenze aller im Rollenspiel gebauten Anlagen, 0 = unbegrenzt
maxPerPlayer number Obergrenze pro Spieler, 0 = unbegrenzt
maxMelderPerBuilding number Melder je Anlage
carryAnim boolean Die Anlage wird beim Platzieren sichtbar getragen
carryBone number Knochen, an dem das Prop hängt (24818 = Brustwirbel)
carryOffset table Versatz des getragenen Props; y schiebt nach vorn, z nach oben
carryRot table Drehung des getragenen Props in Grad
carryBoxModel string Modell für Melder und Depots — sie werden als Karton getragen
carryBoxOffset table Versatz des Kartons
carryBoxRot table Drehung des Kartons
refundOnRemove boolean Item beim Rückbau zurückgeben
removeOnlyOwn boolean Nur selbst gesetzte Anlagen dürfen zurückgebaut werden

Die Item-Prüfungen greifen nur, wenn zusätzlich Config.Items.enabled = true gesetzt ist. Ein leerer Item-Name bedeutet, dass für diese Aktion nichts benötigt wird.

Wartung und Störung

Anlagen werden nach einem Intervall wartungsfällig und gehen dann auf Störung: Funkeneffekt am Prop, Störungsanzeige im Tableau und je nach Einstellung keine Weiterleitung mehr an die Leitstelle. Die Feuerwehr kann eine Störung am Tableau nicht zurückstellen — das geht nur über die Reparatur vor Ort.

config.lua
lua
Config.Maintenance = {
    enabled = false,
    defaultInterval = 24,
    job = 'mechanic',
    minOnline = 1,
    tool = 'werkzeugkoffer',
    effect = 'ue',
    dispatch = true,
    checkInterval = 300,
    command = 'wartungstrigger',
    maxOpenFaults = 3,

    particle = {
        dict = 'core', name = 'ent_amb_elec_crackle',
        scale = 1.0,
        offsetX = 0.0, offsetY = 0.0, offsetZ = 0.05,
    },

    screws = 4,
    wires = 4,
    timeLimit = 0,
    minDuration = 6,
    failCooldown = 60,
    failAlarm = false,
}
Parameter Typ Beschreibung
enabled boolean Wartungsmodus insgesamt. Alle scharfen Anlagen nehmen automatisch teil
defaultInterval number Standard-Wartungsintervall in Stunden, 0 = nie
job string Job, der repariert und den Dispatch bekommt
minOnline number Erst ab so vielen Spielern dieses Jobs tritt eine Störung ein
tool string Werkzeug für die Reparatur, wird nicht verbraucht; leer = keins
effect string Wirkung der Störung: ue, dead oder cosmetic
dispatch boolean Meldung an den Wartungsjob bei neuer Störung
checkInterval number Sekunden zwischen zwei Fälligkeitsprüfungen
command string Admin-Befehl, der eine Störung auslöst
maxOpenFaults number Höchstens so viele Anlagen gleichzeitig gestört, 0 = unbegrenzt

Sind zu wenige Spieler des Wartungsjobs online, wird die Störung aufgeschoben und nicht übersprungen. Zusätzlich entsteht je Prüflauf höchstens eine neue Störung.

Wirkung der Störung

Wert Bedeutung
ue Der Alarm geht örtlich los, aber es gibt keine Weiterleitung an die Leitstelle. Empfohlen, weil es dem realen Verhalten entspricht
dead Die Anlage meldet gar nicht mehr
cosmetic Nur Optik, keine Auswirkung auf den Betrieb

Funkeneffekt

Parameter Typ Beschreibung
particle.dict string Partikel-Bibliothek
particle.name string Name des Effekts; muss zur Bibliothek passen
particle.scale number Größe des Effekts
particle.offsetX number Versatz relativ zum Prop in Metern
particle.offsetY number Versatz relativ zum Prop in Metern
particle.offsetZ number Höhenversatz relativ zum Prop in Metern

Effektname und Bibliothek müssen zusammenpassen. Stimmt die Kombination nicht, erscheint schlicht kein Effekt — eine Fehlermeldung gibt es dazu nicht.

Reparatur-Minispiel

Parameter Typ Beschreibung
screws number Schrauben in der ersten Stufe, eine je Ecke
wires number Adern in der zweiten Stufe; 3 bis 6 sind sinnvoll
timeLimit number 0 = ohne Zeitlimit. Ein Wert größer 0 wird rein serverseitig geprüft, es gibt bewusst keine Anzeige dazu
minDuration number Mindestdauer in Sekunden als Plausibilitätsprüfung
failCooldown number Sperre nach einem Fehlversuch in Sekunden
failAlarm boolean Ein Kurzschluss löst zusätzlich einen örtlichen Fehlalarm aus

Die richtige Verdrahtung wird bei jedem Start neu vom Server ausgewürfelt und dort geprüft. Der Client erfährt die Lösung nicht.

Server-Config

Diese Datei wird nicht an Clients übertragen. Webhook-URLs sind hier sicher aufgehoben.

config_server.lua
lua
Config.Logs = {
    enabled = false,
    webhook = '',
    botName = 'FJX BMA',
    botAvatar = '',
    appendIdentifier = true,
    events = {
        alarm = true,
        falseAlarm = true,
        reset = true,
        armed = true,
        ueab = true,
        fire = true,
        building = true,
        fault = true,
    },
}
Parameter Typ Beschreibung
enabled boolean Discord-Logs aktivieren
webhook string Webhook-URL aus den Kanaleinstellungen
botName string Anzeigename des Webhooks
botAvatar string Avatarbild; leer = Discord-Standard
appendIdentifier boolean License-Identifier mitloggen
events.alarm boolean Handmelder und Alarm
events.falseAlarm boolean Automatischer Fehlalarm
events.reset boolean Zentrale zurückgestellt
events.armed boolean Scharf und unscharf geschaltet
events.ueab boolean Weiterleitung ab- und eingeschaltet
events.fire boolean Feuer manuell ausgelöst
events.building boolean Gebäude erstellt und gelöscht
events.fault boolean Störung, Reparatur und Wartung
config_server.lua
lua
Config.Security = {
    panelDistance = 25.0,
    handmelderDistance = 25.0,
    rauchmelderDistance = 400.0,
    maxNameLength = 30,
}
Parameter Typ Beschreibung
panelDistance number Höchstentfernung in Metern für Aktionen am Bedienfeld
handmelderDistance number Höchstentfernung in Metern beim Auslösen eines Handmelders
rauchmelderDistance number Höchstentfernung in Metern bei automatischer Rauchmelder-Auslösung
maxNameLength number Höchstlänge für Melder-Namen im Creator

Diese Werte sind kein Komfort, sondern die serverseitige Prüfung gegen manipulierte Clients. Setze sie nicht großzügiger als nötig.

Einstellungen im Creator

Vieles wird nicht in der config.lua festgelegt, sondern pro Gebäude in /bmacreator.

Tab Einstellung
Anlage Name, Position der Zentrale, Wartung aktiv, Dispatch bei Störung, Wartungsintervall in Stunden, Alarm-Leuchte mit Position, Mittelpunkt und Radius des Alarmtons
Handmelder Melder anlegen, umbenennen, neu positionieren, löschen
Rauchmelder Name, Position, Erkennungsradius, Piepton, Auslösung der Zentrale
Laufkarten Name und Bild-URL je Laufkarte
Fehlalarm und Feuer Automatische Fehlalarme, Mindestanzahl Feuerwehr online, Brandsimulation mit Wahrscheinlichkeit, Anteil Feuer ohne Alarm, feste Feuer-Positionen
Zugang Zugriffsmodus und erlaubte Jobs

Der Zugriffsmodus im Tab Zugang kennt drei Stufen: keine Einschränkung, andere dürfen nur ansehen ohne Bedienelemente, und anderen wird der Zugang ganz verwehrt.