FiveM Cursor feststecken oder kann sich nicht bewegen, nachdem ein Menü geschlossen wurde: NUI-Fokus-Behebung
Cursor auf Bildschirm feststecken oder kann sich nicht bewegen, nachdem ein Menü geschlossen wurde? Wie SetNuiFocus funktioniert, mit einem NUI Callback schließen, Behandlung von ESC in JavaScript und Finden des Schuldigen.
Du schließt ein Menü, und eines davon passiert:
the mouse cursor stays on screen
the character will not move or look around
the keyboard does nothing until you reconnectNichts zeigt sich in der Konsole, weil nichts mit dem Code nicht stimmt, der läuft: er gab den Fokus einfach nie zurück. Hier ist, wie Fokus funktioniert, wie man ein Menü richtig schließt und wie man den Schuldigen findet.
Wie NUI-Fokus funktioniert
Ein NUI ist eine Webseite (HTML, CSS und JavaScript), die FiveM über dem Spiel zeichnet. Während es den Fokus hat, gehen Maus und Tastatur zur Seite anstatt zum Spiel. Ein Skript gibt und nimmt Fokus mit einem nativen:
SetNuiFocus(hasFocus, hasCursor)SetNuiFocus(true, true): Das NUI bekommt die Tastatur und die Maus, und der Cursor wird angezeigt.SetNuiFocus(true, false): Das NUI bekommt die Tastatur, kein Cursor.SetNuiFocus(false, false): Der Fokus geht zurück zum Spiel und der Cursor versteckt sich.
Wenn ein Menü mit true, true öffnet und kein Code ruft jemals SetNuiFocus(false, false) auf, bleibt das Spiel gesperrt, auch wenn die Seite versteckt ist.
Die Behebung: Schließe immer mit SetNuiFocus(false, false)
Lege den Close in eine Funktion und verwende es für jede Möglichkeit, das Menü zu schließen:
local open = false
local function openMenu()
open = true
SetNuiFocus(true, true)
SendNUIMessage({ action = 'open' })
end
local function closeMenu()
open = false
SetNuiFocus(false, false)
SendNUIMessage({ action = 'close' })
endMache das Gleiche, wenn das Menü von anderem Code geschlossen werden kann: wenn der Spieler stirbt, ein Fahrzeug betritt, oder wenn die Ressource stoppt.
AddEventHandler('onResourceStop', function(resource)
if resource == GetCurrentResourceName() and open then
SetNuiFocus(false, false)
end
end)Dieser letzte ist wichtig. Wenn eine Ressource stoppt, während ihr Menü offen ist, wird der Fokus nicht für dich zurückgegeben, und der Spieler ist feststecken, bis er sich erneut verbindet.
Schließe von der Seite: RegisterNUICallback und fetch
Ein Close-Button oder ein Tastendruck im Innern der Seite läuft in JavaScript. JavaScript kann einen nativen nicht aufrufen, also sendet er eine Anfrage zur Lua-Seite, die sie handhabt:
RegisterNUICallback('close', function(data, cb)
closeMenu()
cb('ok')
end)Auf deiner Seite sende die Anfrage mit fetch zu https://<resource name>/close. GetParentResourceName() gibt dir den Ressourcennamen in einer NUI-Seite:
function closeMenu() {
fetch(`https://${GetParentResourceName()}/close`, {
method: 'POST',
headers: { 'Content-Type': 'application/json; charset=UTF-8' },
body: JSON.stringify({}),
})
}
document.getElementById('close-button').addEventListener('click', closeMenu)Der Callback muss cb aufrufen. Wenn es niemals antwortet, bleibt die Anfrage auf der Seite offen, und einige Bibliotheken stoppen darauf zu warten. Beende immer einen Callback mit cb('ok') oder einer anderen Antwort.
ESC und andere Tasten in JavaScript
Während das NUI den Fokus hat, sieht das Spiel die Tastatur nicht, also erreicht die ESC-Taste deinen Lua-Code nie. Die Seite muss darauf hören:
window.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
closeMenu()
}
})Füge die gleiche Prüfung für jede andere Taste hinzu, die das Menü schließen sollte. Wenn die Seite ein Eingabefeld hat, denke darüber nach, was die Taste dort macht: ESC in einem Textfeld sollte immer noch das Menü schließen, aber ein Buchstabe nicht.
Achtung: Verlasse dich nicht nur auf einen Close-Button. Wenn ein Spieler ESC drückt und die Seite hat keinen Listener, kann das Pause-Menü öffnen, und das Menü bleibt auf dem Bildschirm ohne Möglichkeit zu schließen.
Gehen, während ein Menü offen ist
Einige Schnittstellen, wie ein HUD mit einem kleinen Panel oder ein Telefon, sollten den Spieler weiter bewegen lassen. Verwende dafür SetNuiFocusKeepInput:
SetNuiFocus(true, true)
SetNuiFocusKeepInput(true)Mit Keep Input empfängt das Spiel immer noch die Tastatur, während das NUI den Fokus hat. Wenn du es einschaltest, schalte es aus, wenn das Menü schließt, weil es eingeschaltet bleibt, bis du das tust:
local function closeMenu()
SetNuiFocusKeepInput(false)
SetNuiFocus(false, false)
endEin übrig gebliebener SetNuiFocusKeepInput(true) gibt seltsame Symptome: Der Cursor ist weg, aber einige Tasten verhalten sich seltsam oder tun nichts.
Finde die Ressource, die den Fokus hält
Oft ist das feststeckende Menü nicht deins. Wenn du nicht weißt, welche Ressource den Fokus nahm, finde es durch Eliminierung:
- Reproduziere das Problem: Öffne das Menü, schließe es und sehe den Cursor feststecken.
- In der Server-Konsole (oder der txAdmin Live Console) gib
restart resource_namefür eine Ressource ein, die ein Menü hat: ein Telefon, Inventar, Shop, Radial-Menü oder Kleidungs-Menü. - Prüfe, ob der Cursor und die Steuerelemente zurückkommen oder ob das Problem nicht mehr auftritt.
- Wiederhole für die nächste Ressource, bis sich das Verhalten ändert.
Wenn ein Neustart den Fokus zurückgibt, hält dieses Skript ihn. Schaue in seinem Code nach einem Close-Pfad, der SetNuiFocus(false, false) nicht aufruft: ein Fehler vor der Close-Zeile, ein Tod oder eine Jobänderung, die nur das HTML schließt, oder ein Callback, der nicht antwortet. Ein Fehler in der Konsole zum Zeitpunkt des Bugs ist ein starker Hinweis: siehe how to read a FiveM script error.
Wenn es ein Skript ist, das du gekauft hast, sende seinem Autor die genauen Schritte und den Ressourcennamen, den du gefunden hast.
Checkliste
| Symptom | Behebung |
|---|---|
| Cursor bleibt nach dem Schließen | Rufe SetNuiFocus(false, false) in der Close-Funktion auf |
| Close-Button tut nichts | Füge RegisterNUICallback('close', ...) und einen fetch zu https://<resource>/close hinzu |
| ESC schließt das Menü nicht | Höre nach Escape in JavaScript und rufe den Close-Callback auf |
| Feststecken nach einem Ressourcen-Neustart | Gib den Fokus in onResourceStop frei |
| Charakter kann sich nach dem Schließen nicht bewegen | Schalte SetNuiFocusKeepInput(false) beim Schließen aus |
| Weiß nicht, welches Skript es tut | Starte Ressourcen nacheinander neu, bis der Cursor zurückkommt |
| Callback hängt | Antworte immer mit cb('ok') |
Kurze Antworten
Warum bleibt mein Cursor auf dem Bildschirm, nachdem ich ein Menü schließe?
Das Menü versteckte seine HTML, aber nichts sagte dem Spiel, den Fokus zurückzugeben. Das Skript muss SetNuiFocus(false, false) aufrufen, wenn das Menü schließt.
Was macht SetNuiFocusKeepInput?
SetNuiFocusKeepInput(true) lässt das Spiel Tastatureingaben erhalten, während ein NUI den Fokus hat, sodass der Spieler immer noch gehen kann. Es muss erneut ausgeschaltet werden, wenn das Menü schließt.
Wie finde ich, welche Ressource den Fokus hält?
Starte deine Ressourcen nacheinander neu und prüfe nach jedem, ob der Cursor und die Steuerelemente zurückkommen. Derjenige, dessen Neustart es behebt, ist derjenige, der den Fokus hielt.
Scripts ohne dieses Problem
Mic PhoneEin faltbares Handy, das sich zum Tablet aufklappt und bis aufs echte Handy des Spielers reicht.Script ansehen →
Arcade MachinesSieben spielbare Arcade-Games in echten Automaten, mit Bestenlisten und Wetten.Script ansehen →
Clothing DesignerDesigne Kleidung direkt in FiveM — Pinsel, Ebenen, Bildimport und KI — und trag sie dann.Script ansehen →