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.Debug = false
Config.Framework = 'auto'
Config.Locale = 'de'
Config.DebugbooleanStandard: falseAusfü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.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: truetrue 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.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.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.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.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.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.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.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.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.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.Items = {
enabled = false,
system = 'auto',
}
Config.Items.enabledbooleanStandard: falsefalse ü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.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.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.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.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.