Copnet Docs
Alles, was du für dein Copnet-System brauchst: Einrichtung in Copnet, Rechte, die FiveM-Ressourcen für deinen Server, Exports, Events und die API für eigene Scripts.
Übersicht
Copnet läuft zentral unter https://cop.nexuscase.de – du musst nichts installieren oder hosten. Für deinen Server bekommst du ein eigenes System: eigene Benutzer, Gruppen, Akten, eigener API-Key und ein eigenes Dienstnummern-Präfix (z. B. 0001-2101). Andere Systeme sehen deine Daten nicht.
Erste Schritte
- Zugangsdaten bereitlegen: Dienstnummer des System-Admins (z. B.
0001-0000) und das zugehörige Passwort. - Anmelden unter
https://cop.nexuscase.de. - API-Key kopieren: App System › API.
- FiveM-Ressourcen installieren und den API-Key eintragen (siehe unten und FiveM-Ressourcen).
- Gruppen & Benutzer anlegen: Gruppen & Rechte, dann Benutzer.
- Optional einrichten: Fivemanage-Key für Beweisfotos, E-Mail-Domain, Abgleich mit deiner FiveM-Datenbank, eigenes Gesetzbuch (Systemeinstellungen).
API-Key eintragen
Der Key kommt in diese drei Dateien – alle werden nur auf dem Server geladen:
Config.ApiKey = "DEIN_API_KEY"api_key = "DEIN_API_KEY",Die Adresse https://cop.nexuscase.de ist in allen Ressourcen schon eingetragen (Config.ApiBase, Config.tabletUrl, api_url) – bitte nicht ändern. Du musst nur den API-Key eintragen.
Dein Zugang
- Der System-Admin (
…-0000) hat immer alle Rechte und sieht alle Geheimhaltungsstufen. Er kann nicht gesperrt oder in eine andere Gruppe gesetzt werden. - Passwort des System-Admins vergessen oder ändern? Melde dich beim Copnet-Team.
- Passwörter aller anderen Benutzer setzt du selbst in der App Benutzer (Recht „Benutzer verwalten“).
- Lege für die Leitung eigene Konten mit einer Admin-Gruppe an, statt den System-Admin-Zugang zu teilen.
- Beim Aktualisieren der FiveM-Ressourcen deinen API-Key wieder in die neuen Dateien eintragen.
- Erscheint beim Login „Dieses System ist derzeit gesperrt“, melde dich beim Copnet-Team.
Gruppen & Rechte
Gruppen (Ränge) legst du in der App Benutzer an. Rechte werden pro App vergeben – insgesamt 39 einzelne Rechte.
- Voraussetzungen werden automatisch gesetzt: „Einträge schreiben“ setzt „Akten ansehen“ mit. Entfernst du „Akten ansehen“, fallen alle Akten-Rechte weg, die darauf aufbauen.
- Vorlage: Über „Rechte von Gruppe übernehmen …“ kopierst du die Rechte einer anderen Gruppe und passt sie danach frei an.
- Schnellauswahl: „Nur Lesen“, „Alle“, „Keine“ und ein Schalter pro App.
- Admin-Gruppen haben automatisch alle Rechte und sehen alle Geheimhaltungsstufen.
- Wer selbst kein Admin ist, kann nur Gruppen mit Rechten anlegen, die er selbst besitzt.
Rechte nach App
| App | Rechte |
|---|---|
| 📁 Akten | ansehen · anlegen · Personendaten bearbeiten · Einträge schreiben · Einträge anderer bearbeiten · Fahndungen setzen & aufheben · Einträge löschen · Geschwärzte Einträge lesen · Schwärzen & entschwärzen · Akten löschen |
| 🔎 Ermittlungen | ansehen · eröffnen · bearbeiten (Titel, Beteiligte, Verlauf) · abschließen & wieder öffnen |
| 📸 Beweise | Bilder hochladen · Fotos zuordnen · Beweise verwalten (alle sehen, entfernen, löschen) |
| 📝 Einsatzberichte | ansehen · erstellen · bearbeiten · Geschwärzte lesen · Schwärzen & entschwärzen · löschen |
| 🚨 Dispatch | sehen & annehmen · archivieren · löschen |
| 🚔 Fahrzeugregister | ansehen · bearbeiten · als gestohlen melden |
| 📢 Ankündigungen | schreiben (eigene löschen) · alle verwalten |
| Mails schreiben · Verteiler verwalten (empfangen kann jeder) | |
| 📅 Kalender | Termine erstellen (eigene löschen) · alle Termine verwalten |
| 📜 Gesetzbuch | Gesetze bearbeiten (lesen kann jeder) |
| 📄 Vorlagen | Globale Vorlagen verwalten (eigene kann jeder anlegen) |
| 👥 Benutzer & Gruppen | Benutzer verwalten · Gruppen & Rechte verwalten |
Benutzer & Dienstnummern
Benutzer legst du in der App Benutzer an: Name, Nummer, Gruppe, Geheimhaltungsstufe und Passwort (ein sicheres Passwort kann generiert werden).
- Die Dienstnummer besteht aus System-Präfix und Nummer: Präfix
0001+ Nummer2101ergibt0001-2101. Damit melden sich Benutzer an. - Sperren beendet sofort alle Anmeldungen des Benutzers.
- „Auf diesem Gerät angemeldet bleiben“ speichert nur ein widerrufbares Token, nie das Passwort.
Geheimhaltungsstufen
Stufen aufsteigend: OFFEN → VS-NfD → VS-VERTRAULICH → GEHEIM → STRENG GEHEIM. Jeder Benutzer hat eine Stufe.
- Ermittlungen und Akten-Einträge bekommen beim Erstellen eine Stufe – höchstens die eigene.
- Ermittlungen über der eigenen Stufe sind unsichtbar (auch ihre Beweisfotos).
- Akten-Einträge über der eigenen Stufe erscheinen als „Verschlusssache“. Titel, Text, Paragrafen und Fotos bleiben verborgen, die Fahndung bleibt sichtbar.
- Admins sehen alles.
Systemeinstellungen
In der App System (nur für den System-Admin):
| Bereich | Wofür |
|---|---|
| API | System-API-Key für alle FiveM-Ressourcen. Kann neu erzeugt werden – danach in allen config_server.lua bzw. sv_copnet_config.lua ersetzen. |
| Datenbank | Zugang zur Datenbank deines FiveM-Servers und Abgleich. Presets für ESX und QBCore oder eigene Tabellen/Spalten. Übernimmt Personen als Akten und Fahrzeuge ins Fahrzeugregister. |
| Beweise | Fivemanage-API-Key für Beweisfotos (Bilder liegen bei Fivemanage, Copnet speichert nur den Link). |
Domain für interne Adressen, z. B. lspd.gov → lena.weiss@lspd.gov. Es werden keine echten E-Mails verschickt. |
Datenbank-Abgleich: Copnet liest deine FiveM-Datenbank über das Internet. Sie muss daher von außen erreichbar sein. Lege dafür einen eigenen Datenbank-Benutzer mit reinen Leserechten an – Copnet schreibt nichts in deine Datenbank.
Ingame-Verknüpfung
Damit Dispatch-Routen, Dienststatus und Kamera-Fotos beim richtigen Benutzer landen, muss der Spieler mit seinem Copnet-Konto verknüpft sein.
- Ingame das Tablet öffnen (Standard
F6). - Mit Dienstnummer und Passwort anmelden.
- Copnet verknüpft den Spieler automatisch über seine FiveM-Lizenz. Die Kachel „Dienststatus“ zeigt danach Job und Dienst an.
Wer das Recht „Benutzer verwalten“ hat, kann Benutzer auch in der App Benutzer mit einem Spieler verknüpfen, der gerade online ist.
Die Verknüpfung läuft über ein kurzlebiges Token, das Copnet nur für den gerade angemeldeten Benutzer ausstellt. Spieler können keine fremden Konten verknüpfen.
FiveM-Ressourcen
pol-tabletTablet mit Copnet ingame
copnet-dispatchDispatches, Online-Spieler, Routen
copnet-cameraPolizeikamera für Beweisfotos
pol-radarRadar & Kennzeichenleser mit BOLO
server.cfg
# Framework/Inventar zuerst (z. B. es_extended oder qb-core, ox_inventory)
ensure screenshot-basic
ensure pol-tablet
ensure copnet-dispatch
ensure copnet-camera
ensure pol-radarOrdnernamen nicht ändern. Exports und Events werden über den Ressourcennamen angesprochen, z. B. exports['copnet-dispatch']. Wer umbenennt, muss alle Aufrufe anpassen.
Gemeinsame Einstellungen
- API-Key steht immer in einer serverseitigen Datei (
config_server.luabzw.sv_copnet_config.lua) und wird nie an Spieler ausgeliefert. Die Adresse von Copnet ist dort bereits eingetragen. - Polizei-Jobs (Standard
{ "police" }) steuern, wer Dispatches bekommt und die Kamera nutzen darf. Erkannt werden ESX- und QBCore-Jobs inkl.onduty.
pol-tablet
Öffnet Copnet ingame als Tablet (NUI mit eingebetteter Webseite), spielt eine Tablet-Animation ab und übergibt Dienststatus und Spielerliste an Copnet.
Config config.lua
| Option | Standard | Beschreibung |
|---|---|---|
Config.tabletUrl | "https://cop.nexuscase.de" | Adresse der Copnet-App. |
Config.key | "F6" | Standard-Taste (ingame umbelegbar). |
Config.scale | 1.3 | Größe des Tablets (0.6 – 2.0). |
Config.policeJobs | { "police" } | Jobs, die als Polizei gelten (Dienststatus). |
Befehle & Tasten
| Befehl | Beschreibung |
|---|---|
copnet_tablet_toggle | Tablet öffnen/schließen, per Tastenbelegung „Copnet Tablet öffnen/schließen“ (Standard F6). |
/copnet_tablet_scale 1.2 | Größe einstellen (0.6 – 2.0), wird pro Spieler gespeichert. Ohne Wert: aktuelle Größe anzeigen. |
Events
| Event | Seite | Beschreibung |
|---|---|---|
copnet:tabletOpen | Client | Tablet öffnen |
copnet:tabletClose | Client | Tablet schließen |
copnet:tabletToggle | Client | Öffnen bzw. schließen |
Tablet als Item öffnen
local QBCore = exports['qb-core']:GetCoreObject() QBCore.Functions.CreateUseableItem('police_tablet', function(source) TriggerClientEvent('copnet:tabletOpen', source) end)
ESX.RegisterUsableItem('police_tablet', function(source) TriggerClientEvent('copnet:tabletOpen', source) end)
TriggerEvent('copnet:tabletToggle')Nachrichten zwischen Tablet und Copnet (NUI)
Nur relevant, wenn du das Tablet selbst anpasst. Die Copnet-Seite kommuniziert per postMessage mit dem Tablet-Rahmen:
| Nachricht | Richtung | Zweck |
|---|---|---|
copnet-duty | Tablet → Copnet | Job, Dienst, Polizei ja/nein, Server-ID |
copnet-players | Tablet → Copnet | Online-Spielerliste (für Verknüpfung) |
copnet-user | Copnet → Tablet | Link-Token nach dem Login (Verknüpfung) |
copnet-waypoint | Copnet → Tablet | Wegpunkt setzen (x, y, z) |
copnet-request-duty / copnet-request-players | Copnet → Tablet | Daten anfordern |
copnet-close-tablet | Copnet → Tablet | Tablet schließen |
copnet-dispatch
Schickt Dispatches an Copnet, alarmiert Polizisten im Dienst, synchronisiert Online-Spieler und setzt Routen, die in Copnet angenommen wurden.
Ablauf
- Ein Script meldet einen Einsatz (Export oder Event).
- Copnet speichert den Dispatch. Alle Polizisten im Dienst bekommen eine Meldung und haben 7 Sekunden, um mit
ENTERanzunehmen (setzt Wegpunkt). - In der App Dispatch sehen Beamte alle offenen Einsätze. „Route setzen“ legt den Wegpunkt ingame beim verknüpften Beamten.
- Beim Archivieren wird die Route bei allen Beteiligten entfernt.
Config
| Option | Datei | Standard | Beschreibung |
|---|---|---|---|
Config.ApiKey | config_server.lua | – | Dein API-Key (System › API) |
Config.ApiBase | config_server.lua | "https://cop.nexuscase.de/api.php" | Bereits eingetragen – nicht ändern |
Config.PoliceJobs | config.lua | { "police" } | Jobs, die Dispatches bekommen |
Config.PlayerSyncInterval | config.lua | 15000 | Online-Spieler-Abgleich in ms (min. 5000) |
Config.DispatchSyncInterval | config.lua | 10000 | Abgleich des Dispatch-Zählers in ms (min. 5000) |
Config.RouteSyncInterval | config.lua | 3000 | Abruf neuer Routen in ms (min. 2000) |
Config.DispatchCooldown | config.lua | 10000 | Mindestabstand zwischen zwei Dispatches eines Spielers (Spam-Schutz, gilt nur für Client-Events) |
Config.Debug | config.lua | false | Debug-Ausgaben und Testbefehl /test-dispatch |
Dispatch senden
Export Server
exports['copnet-dispatch']:SendDispatch(payload)Event vom Client oder Server
-- Client: Absender wird automatisch auf den Spielernamen gesetzt, Cooldown aktiv TriggerServerEvent('copnet:dispatch', payload) -- Server: ohne Cooldown, created_by frei wählbar TriggerEvent('copnet:dispatch', payload)
Payload
| Feld | Typ | Beschreibung |
|---|---|---|
title | string | Titel, max. 180 Zeichen (Standard „Dispatch“) |
message | string | Beschreibung, max. 2000 Zeichen (alternativ info) |
code | string | Funkcode, z. B. 10-90 (max. 40) |
street | string | Straße/Ort (max. 180) |
coords | vector3 / table | vector3(x, y, z) oder { x = , y = , z = } – alternativ einzeln x, y, z |
created_by | string | Absender (nur serverseitig wirksam, max. 120) |
Ohne Koordinaten kann der Dispatch angezeigt, aber keine Route gesetzt werden.
Events an Polizisten Client
| Event | Daten | Beschreibung |
|---|---|---|
copnet:dispatchAlert | { id, title, message, code, street, x, y, z, coords } | Neuer Dispatch (nur Polizei im Dienst) |
copnet:dispatchCount | count | Anzahl offener Dispatches |
copnet:dispatchRoute | { id, dispatch_id, x, y, z } | Route setzen (aus Copnet angefordert) |
copnet:dispatchClearRoute | { id, dispatch_id } | Route entfernen (z. B. nach Archivieren) |
Eigene Scripts können auf diese Events hören, z. B. für ein eigenes HUD:
AddEventHandler('copnet:dispatchAlert', function(data) print(('Neuer Einsatz: %s (%s)'):format(data.title, data.street or '?')) end)
Befehle & Tasten
| Befehl | Beschreibung |
|---|---|
copnet_accept_dispatch | Letzten Dispatch annehmen, Taste „Copnet Dispatch annehmen“ (Standard ENTER, 7 Sekunden Zeit) |
/test-dispatch | Test-Dispatch an der eigenen Position – nur mit Config.Debug = true |
Interne Server-Events
Werden von Tablet und Client genutzt und prüfen selbst, ob der Spieler Polizist im Dienst ist:
copnet:ackDispatch– Dispatch als angenommen markieren ({ id })copnet:requestPlayerList– Online-Spielerliste für das Tabletcopnet:linkOfficer– Spieler mit Copnet-Konto verknüpfen (nur mit Link-Token)
Dispatch-Beispiele
Ladenraub (Server-Script)
-- z. B. im Raub-Script, wenn der Überfall startet local function alarmPolice(src, storeName) local coords = GetEntityCoords(GetPlayerPed(src)) exports['copnet-dispatch']:SendDispatch({ title = 'Ladenraub', message = ('Stiller Alarm ausgelöst: %s'):format(storeName), code = '10-90', street = storeName, coords = coords, created_by = 'Alarmanlage' }) end
Schüsse gemeldet (Client-Script)
local function reportShots() local coords = GetEntityCoords(PlayerPedId()) local streetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z) TriggerServerEvent('copnet:dispatch', { title = 'Schüsse gemeldet', message = 'Anwohner melden Schüsse in der Umgebung.', code = '10-71', street = GetStreetNameFromHashKey(streetHash), coords = { x = coords.x, y = coords.y, z = coords.z } }) end
Notruf-Befehl /911
RegisterCommand('911', function(source, args) local text = table.concat(args, ' ') if text == '' then return end exports['copnet-dispatch']:SendDispatch({ title = 'Notruf 911', message = text, code = '911', created_by = GetPlayerName(source), coords = GetEntityCoords(GetPlayerPed(source)) }) end, false)
Anderes Dispatch-System weiterleiten
Wenn schon ein anderes Dispatch-Script läuft, leite dessen Meldungen serverseitig zusätzlich an Copnet weiter – dort, wo das Script seinen Alarm erzeugt:
-- Beispiel: vorhandene Funktion, die einen Alarm erzeugt local function onAlert(alert) -- … bisheriger Code des Dispatch-Scripts … exports['copnet-dispatch']:SendDispatch({ title = alert.title, message = alert.description, code = alert.code, street = alert.street, coords = alert.coords }) end
Die Feldnamen des anderen Scripts (alert.title usw.) sind nur Beispiele – passe sie an das jeweilige Script an.
copnet-camera
Polizeikamera für Beweisfotos. Fotos werden über den Server an Copnet geschickt, bei Fivemanage gespeichert und erscheinen in der App Beweise des verknüpften Beamten.
Voraussetzungen: screenshot-basic läuft, in Copnet ist unter System › Beweise ein Fivemanage-Key eingetragen und der Spieler ist verknüpft.
Config
| Option | Standard | Beschreibung |
|---|---|---|
Config.Inventory | "ox" | "ox", "qb", "esx", "custom" oder "none" |
Config.ItemName | "police_camera" | Name des Items |
Config.Command | "polizeikamera" | Zusätzlicher Befehl, leer = aus |
Config.PoliceOnly / PoliceJobs | true / { "police" } | Nur Polizei im Dienst |
Config.ImageQuality | 0.85 | JPG-Qualität 0.1 – 1.0 |
Config.Cooldown | 3000 | Mindestabstand zwischen Fotos (ms) |
Config.MinFov / MaxFov | 10.0 / 70.0 | Zoombereich (Sichtfeld in Grad) |
Config.ApiKey | – | Dein API-Key in config_server.lua (Config.ApiBase ist bereits eingetragen) |
Item anlegen
['police_camera'] = { label = 'Polizeikamera', weight = 800, stack = false, consume = 0, server = { export = 'copnet-camera.useCamera' } },
police_camera = { name = 'police_camera', label = 'Polizeikamera', weight = 800, type = 'item', image = 'police_camera.png', unique = true, useable = true, shouldClose = true, description = 'Kamera für Beweisfotos' },INSERT INTO items (name, label, weight) VALUES ('police_camera', 'Polizeikamera', 1);-- serverseitig beim Benutzen des Items exports['copnet-camera']:OpenCamera(source) -- oder TriggerEvent('copnet-camera:use', source)
Exports & Events
| Name | Art | Beschreibung |
|---|---|---|
OpenCamera(source) | Server-Export | Kamera beim Spieler öffnen (prüft Polizei-Job) |
useCamera | Server-Export | Für ox_inventory (server.export) |
copnet-camera:use | Server-Event | TriggerEvent('copnet-camera:use', source) |
copnet-camera:open | Client-Event | Öffnet den Kamera-Modus (ohne Job-Prüfung – besser OpenCamera nutzen) |
copnet-camera:notify | Client-Event | Meldung in der Kamera-Oberfläche (message, kind) |
Bedienung
| Taste | Aktion |
|---|---|
E oder Linksklick | Foto aufnehmen |
| Mausrad | Zoom |
Backspace, Esc oder Rechtsklick | Kamera beenden |
Als Beschreibung wird automatisch die Straße gespeichert. In Copnet lassen sich Fotos danach beschreiben, freigeben und in Akten oder Ermittlungen auswählen. Standardmäßig zeigt die App die letzten 2 Stunden.
pol-radar
Radar und Kennzeichenleser (basiert auf Wraith ARS 2X). Copnet liefert eine BOLO-Liste: Fahrzeuge, die gestohlen gemeldet sind oder deren Halter zur Fahndung steht. Der Kennzeichenleser sperrt bei einem Treffer automatisch.
Copnet-Anbindung sv_copnet_config.lua
COPNET_RADAR = {
enabled = true,
api_url = 'https://cop.nexuscase.de/api.php?action=vehicleList&flagged=1', -- nicht ändern
api_key = 'DEIN_API_KEY',
interval = 120000 -- alle 2 Minuten abrufen
}Tasten (Standard)
| Befehl | Taste | Beschreibung |
|---|---|---|
radar_remote | F5 | Fernbedienung öffnen |
radar_fr_ant / radar_bk_ant | Num 8 / Num 5 | Antenne vorne/hinten sperren |
radar_fr_cam / radar_bk_cam | Num 9 / Num 6 | Kennzeichenleser vorne/hinten sperren |
Events
wk:copnet:updateBolosClient – der Server verteilt die BOLO-Liste an alle.wk:copnet:requestBolosServer – Client fordert die aktuelle Liste an.TogglePlateLock(clientId, cam, beepAudio, boloAudio)Server-Export – Kennzeichenleser sperren (cam="front"oder"rear").
Alle Exports & Events
| Name | Ressource | Art | Zweck |
|---|---|---|---|
SendDispatch(payload) | copnet-dispatch | Export | Dispatch senden |
copnet:dispatch | copnet-dispatch | Server-Event | Dispatch senden (Client oder Server) |
copnet:dispatchAlert | copnet-dispatch | Client-Event | Neuer Dispatch an Polizei |
copnet:dispatchCount | copnet-dispatch | Client-Event | Anzahl offener Dispatches |
copnet:dispatchRoute | copnet-dispatch | Client-Event | Route setzen |
copnet:dispatchClearRoute | copnet-dispatch, pol-tablet | Client-Event | Route entfernen |
copnet:ackDispatch | copnet-dispatch | Server-Event | Dispatch annehmen (intern) |
copnet:requestPlayerList | copnet-dispatch | Server-Event | Spielerliste fürs Tablet (intern) |
copnet:playerList | pol-tablet | Client-Event | Spielerliste empfangen (intern) |
copnet:linkOfficer | copnet-dispatch | Server-Event | Konto verknüpfen (intern) |
copnet:tabletOpen / Close / Toggle | pol-tablet | Client-Event | Tablet steuern |
OpenCamera(source) | copnet-camera | Export | Kamera öffnen |
useCamera | copnet-camera | Export | ox_inventory-Item |
copnet-camera:use | copnet-camera | Server-Event | Kamera öffnen |
copnet-camera:open / notify | copnet-camera | Client-Event | Kamera-Oberfläche |
TogglePlateLock(...) | pol-radar | Export | Kennzeichenleser sperren |
wk:copnet:updateBolos | pol-radar | Client-Event | BOLO-Liste aus Copnet |
API für Server-Scripts
Eigene Server-Scripts können Copnet direkt ansprechen – mit dem System-API-Key. Alle Antworten sind JSON: { "ok": true, … } bzw. { "ok": false, "error": "…" }.
| Adresse | https://cop.nexuscase.de/api.php?action=<aktion> |
| Methode | POST mit JSON-Body (Content-Type: application/json) |
| Anmeldung | Header X-API-Key: <dein Key> |
| Fehler | 401 Key fehlt/ungültig · 400 ungültige Eingabe · 404 nicht gefunden · 500 Server-/Datenbankfehler |
local API_BASE = 'https://cop.nexuscase.de/api.php' local API_KEY = 'DEIN_API_KEY' -- nur serverseitig! local function copnet(action, payload, cb) PerformHttpRequest(API_BASE .. '?action=' .. action, function(status, body) local ok, data = pcall(json.decode, body or '') if cb then cb(status, ok and data or nil) end end, 'POST', json.encode(payload or {}), { ['Content-Type'] = 'application/json', ['X-API-Key'] = API_KEY }) end copnet('dispatchStats', {}, function(status, data) if data and data.ok then print('Offene Dispatches: ' .. data.count) end end)
Aktionen mit API-Key
| Aktion | Parameter | Antwort |
|---|---|---|
dispatchCreate | title*, message, code, street, x/y/z oder coords, created_by | { ok, id } |
dispatchStats | – | { ok, count, max_id } (offene Dispatches) |
dispatchAcknowledge | id*, ack_by_name | { ok } |
dispatchRouteList | – | { ok, routes: [{ id, dispatch_id, server_id, license, x, y, z, action }] } |
dispatchRouteConsume | id* | { ok } – Route als ausgeliefert markieren |
onlinePlayersSync | players: [{ id, name, identifiers, job, onduty, isPolice }] | { ok } |
vehicleList | URL: &flagged=1 (nur gestohlen/Fahndung) oder &q= (Suche) | { ok, vehicles: [{ plate, model, color, stolen, first_name, last_name, has_wanted, … }] } |
evidenceIngameUpload | identifiers*, image* (Data-URI JPG/PNG/WebP, max. 10 MB), description | { ok, id, officer } |
officerLink | link_token*, game_identifier, identifiers | { ok } – nur mit Link-Token aus Copnet |
* Pflichtfeld
Der API-Key gibt Zugriff auf Dispatches, Fahrzeuge und Spielerdaten deines Systems. Verwende ihn nur in serverseitigen Dateien – niemals in client_script, shared_script oder NUI.
Fehlerbehebung
No such export useCamera in resource copnet-camera
ox_inventory findet die Kamera-Ressource nicht.
- Steht
ensure copnet-camerain derserver.cfg? Beim Start muss[copnet-camera] gestartet …in der Konsole stehen. - Heißt der Ordner genau
copnet-camera? Sonst initems.luaden echten Ordnernamen verwenden. - Nach Änderungen an
items.luaden Server bzw. ox_inventory neu starten. restart copnet-camerain der Server-Konsole zeigt Fehler beim Laden direkt an.
„Kein API-Key gesetzt – bitte config_server.lua ausfüllen“
In config_server.lua (Dispatch, Kamera) bzw. sv_copnet_config.lua (Radar) den API-Key aus Copnet › System › API eintragen und die Ressource neu starten.
Dispatches kommen ingame nicht an
- Ist der Spieler im Polizei-Job (
Config.PoliceJobs) und im Dienst? - Ist in
config_server.luader richtigeConfig.ApiKeyeingetragen undConfig.ApiBaseunverändert (https://cop.nexuscase.de/api.php)? Config.Debug = truesetzen – die Server-Konsole zeigt dann jede API-Antwort, z. B.401 Ungültiger API-Key.- Mit
/test-dispatch(nur im Debug-Modus) einen Test auslösen.
„Route setzen“ in Copnet tut ingame nichts
- Der Beamte muss verknüpft und online sein.
- Der Dispatch braucht Koordinaten.
copnet-dispatchfragt Routen alleConfig.RouteSyncIntervalms ab (Standard 3 Sekunden).
Tablet bleibt leer oder lädt nicht
Config.tabletUrlmuss auf die Copnet-App zeigen und per HTTPS erreichbar sein.- Die Seite im normalen Browser öffnen und prüfen, ob sie lädt.
Kamera öffnet sich, aber es entsteht kein Foto
screenshot-basicfehlt oder läuft nicht (Meldung in der Server-Konsole und ingame).- „Bild-Upload ist noch nicht eingerichtet“: In Copnet › System › Beweise den Fivemanage-Key eintragen.
- „Spieler ist mit keinem Copnet-Konto verknüpft“: Einmal ingame im Tablet anmelden.
„Keine Berechtigung für diese Aktion.“
Der Gruppe fehlt das passende Recht. In der App Benutzer › Gruppen die Rechte der jeweiligen App prüfen. Die Suche im Rechte-Dialog hilft, z. B. „Fahndung“.
Radar erkennt gesuchte Fahrzeuge nicht
COPNET_RADAR.enabled = trueund API-Key prüfen,api_urlunverändert lassen.- Die Liste wird nur alle
intervalms geladen (Standard 2 Minuten). - Das Fahrzeug muss in Copnet als gestohlen markiert sein oder sein Halter muss eine Fahndung haben.
„Zu viele Fehlversuche“ beim Login
Nach mehreren falschen Passwörtern wird der Login kurz gesperrt. Einige Minuten warten. Ein Admin kann das Passwort in der App Benutzer neu setzen. Für das Passwort des System-Admins melde dich beim Copnet-Team.
Sicherheit
- API-Key nur in serverseitigen Dateien, nie in
client_script,shared_scriptoder NUI und nie öffentlich teilen. Wurde er geleakt: in Copnet › System › API neu erzeugen und in allen Ressourcen ersetzen. - System-Admin-Zugang nicht teilen – für die Leitung eigene Admin-Konten anlegen.
- Rechte sparsam vergeben: „Benutzer verwalten“ und „Gruppen & Rechte verwalten“ nur für die Leitung.
- Ausgeschiedene Mitglieder sperren (App Benutzer) – das beendet sofort alle ihre Anmeldungen.
- Eigene Web-Tools, die mit einer Copnet-Anmeldung arbeiten, müssen den Header
X-Requested-Withmitschicken (Schutz gegen fremde Seiten). FiveM-Scripts mit API-Key betrifft das nicht. - Copnet ist für Roleplay gedacht – keine echten personenbezogenen Daten eintragen.