„attempt to index a nil value“ in FiveM-Skripten beheben (ESX, QBCore, xPlayer)
Dieser Lua-Fehler bedeutet, dass ein Skript etwas, das nicht existiert, wie eine Tabelle benutzt hat. Der Teil in Klammern, etwa global 'ESX' oder local 'xPlayer', sagt, was fehlt, und jeder hat eine andere Lösung.
Lesen Sie zuerst den Fehler
Die Server-Konsole und die F8-Konsole zeigen den Fehler so an:
SCRIPT ERROR: @my_script/server/main.lua:12: attempt to index a nil value (global 'ESX')
Ressourcenname, Datei und Zeilennummer stehen zuerst, Sie wissen also genau, wo Sie suchen müssen. Die Wörter in Klammern sagen, was nil ist:
| In den Klammern | Was er meist bedeutet |
|---|---|
| global 'ESX' | Das Skript hat das ESX-Objekt nie bekommen, oder ESX lief beim Start des Skripts nicht. |
| global 'QBCore' | Dasselbe für QBCore. |
| local 'xPlayer' oder 'Player' | Das Framework hat für diesen Spieler kein Spielerobjekt. |
| field 'Jobs' oder ein anderer Name | Die Tabelle existiert, aber der Schlüssel fehlt, weil Daten oder eine Konfigurationsdatei nicht geladen wurden. |
global 'ESX' beheben
- ESX zuerst starten. Setzen Sie in server.cfg
ensure es_extendedvor jedes Skript, das es nutzt, und prüfen Sie die Konsole auf Fehler von es_extended selbst, das seine Datenbankverbindung zum Starten braucht. - ESX im Skript importieren. Fügen Sie diese Zeile in die fxmanifest.lua des Skripts ein:
shared_script '@es_extended/imports.lua'
Oder setzen Sie das Objekt in Lua, nahe am Dateianfang:
ESX = exports["es_extended"]:getSharedObject()
Alte Skripte nutzen TriggerEvent('esx:getSharedObject', ...). Dieses Event gibt es im aktuellen ESX nicht mehr, ersetzen Sie es durch den Export oben.
global 'QBCore' beheben
Definieren Sie das Objekt am Anfang jeder Lua-Datei, die es nutzt:
local QBCore = exports['qb-core']:GetCoreObject()
Ein local in einer Datei ist in einer anderen nicht sichtbar, ein Skript, das in client/main.lua funktioniert, kann also in client/events.lua trotzdem scheitern. Starten Sie qb-core in server.cfg vor dem Skript. Qbox enthält eine Kompatibilitätsschicht für die meisten QBCore-Skripte, prüfen Sie aber, ob das Skript sie unterstützt.
local 'xPlayer' beheben
ESX.GetPlayerFromId(source) und QBCore.Functions.GetPlayer(source) geben nil zurück, wenn der Spieler noch nicht geladen ist, gegangen ist oder die ID falsch ist. Prüfen Sie das Ergebnis immer, bevor Sie es benutzen:
local xPlayer = ESX.GetPlayerFromId(source) if not xPlayer then return end
Häufige Gründe, warum der Spieler fehlt:
sourceist 0, wenn ein Befehl in der Server-Konsole läuft, also gibt es keinen Spieler.sourcekann sich nach einemWaitändern. Kopieren Sie es zuerst mitlocal src = sourceund nutzen Sie danachsrc.- Das Event lief, während der Spieler noch beitrat. Warten Sie auf das „Spieler geladen“-Event des Frameworks,
esx:playerLoadedin ESX undQBCore:Server:PlayerLoadedin QBCore. - Der Spieler ist offline. Suchen Sie ihn stattdessen über die Kennung in der Datenbank.
Ein fehlendes Feld beheben
Existiert eine Tabelle, aber ein Schlüssel ist nil, wurden die zugehörigen Daten nicht geladen. Prüfen Sie, ob die Konfigurationsdatei in fxmanifest.lua vor den Dateien steht, die sie nutzen, ob der Name überall gleich geschrieben ist und ob die Skriptversion zur Version Ihres Frameworks passt. Frameworks benennen Funktionen zwischen Versionen um, und für ältere Versionen geschriebene Skripte funktionieren dann nicht mehr.
Grundlagen prüfen
- Lesen Sie den ersten Fehler in der Konsole. Spätere Fehler sind oft eine Folge des ersten.
- Prüfen Sie die eigene Framework-Einstellung des Skripts, falls es eine hat, in dessen Konfigurationsdatei.
- Führen Sie nach dem Bearbeiten eines Skripts
restart resource_namein der Konsole aus und achten Sie auf neue Fehler.
Immer noch Probleme?
Fragen Sie den Autor des Skripts, mit dem vollständigen Fehlertext, Datei und Zeile, Ihrem Framework und dessen Version sowie der Startreihenfolge aus server.cfg.
Hosten Sie Ihren FiveM-Server in Singapur
Niedriger Ping für Spieler in Indien, Malaysia und Indonesien, auf AMD EPYC mit NVMe und Gcore-DDoS-Schutz auf jeder IP.
