„attempt to index a nil value” in FiveM-scripts oplossen (ESX, QBCore, xPlayer)
Deze Lua-fout betekent dat een script iets dat niet bestaat heeft gebruikt alsof het een tabel was. Het deel tussen haakjes, zoals global 'ESX' of local 'xPlayer', vertelt wat ontbreekt, en elk heeft een andere oplossing.
Lees eerst de fout
De serverconsole en de F8-console tonen de fout zo:
SCRIPT ERROR: @my_script/server/main.lua:12: attempt to index a nil value (global 'ESX')
De resourcenaam, het bestand en het regelnummer staan voorop, dus je weet precies waar je moet kijken. De woorden tussen haakjes zeggen wat nil is:
| Tussen haakjes | Wat het meestal betekent |
|---|---|
| global 'ESX' | Het script kreeg het ESX-object nooit, of ESX draaide niet toen het script startte. |
| global 'QBCore' | Hetzelfde voor QBCore. |
| local 'xPlayer' of 'Player' | Het framework heeft geen spelerobject voor die speler. |
| field 'Jobs' of een andere naam | De tabel bestaat maar de sleutel ontbreekt, omdat gegevens of een configbestand niet zijn geladen. |
global 'ESX' oplossen
- Start ESX eerst. Zet in server.cfg
ensure es_extendedboven elk script dat het gebruikt, en controleer de console op fouten van es_extended zelf, dat zijn databaseverbinding nodig heeft om te starten. - Importeer ESX in het script. Voeg deze regel toe aan de fxmanifest.lua van het script:
shared_script '@es_extended/imports.lua'
Of stel het object in Lua in, bovenaan het bestand:
ESX = exports["es_extended"]:getSharedObject()
Oude scripts gebruiken TriggerEvent('esx:getSharedObject', ...). Dat event bestaat niet meer in het huidige ESX, vervang het dus door de export hierboven.
global 'QBCore' oplossen
Definieer het object bovenaan elk Lua-bestand dat het gebruikt:
local QBCore = exports['qb-core']:GetCoreObject()
Een local in het ene bestand is niet zichtbaar in een ander, dus een script dat in client/main.lua werkt kan in client/events.lua nog steeds falen. Start qb-core vóór het script in server.cfg. Qbox bevat een compatibiliteitslaag voor de meeste QBCore-scripts, maar controleer of het script die ondersteunt.
local 'xPlayer' oplossen
ESX.GetPlayerFromId(source) en QBCore.Functions.GetPlayer(source) geven nil terug als de speler nog niet geladen is, is vertrokken of de ID fout is. Controleer het resultaat altijd voordat je het gebruikt:
local xPlayer = ESX.GetPlayerFromId(source) if not xPlayer then return end
Veelvoorkomende redenen dat de speler ontbreekt:
sourceis 0 als een commando vanuit de serverconsole draait, dus er is geen speler.sourcekan veranderen na eenWait. Kopieer het eerst metlocal src = sourceen gebruik daarnasrc.- Het event liep terwijl de speler nog aan het joinen was. Wacht op het „speler geladen”-event van het framework,
esx:playerLoadedin ESX enQBCore:Server:PlayerLoadedin QBCore. - De speler is offline. Zoek hem in plaats daarvan op via de identifier in de database.
Een ontbrekend veld oplossen
Bestaat een tabel maar is een sleutel nil, dan zijn de gegevens erachter niet geladen. Controleer of het configbestand in fxmanifest.lua vóór de bestanden staat die het gebruiken, of de naam overal hetzelfde is gespeld en of de scriptversie bij je frameworkversie past. Frameworks hernoemen functies tussen versies, en scripts voor een oudere versie gaan dan stuk.
Controleer de basis
- Lees de eerste fout in de console. Latere fouten zijn vaak een gevolg van de eerste.
- Controleer de eigen frameworkinstelling van het script, als het die heeft, in het configbestand.
- Voer na het bewerken van een script
restart resource_nameuit in de console en let op nieuwe fouten.
Kom je er nog steeds niet uit?
Vraag de maker van het script, met de volledige fouttekst, het bestand en de regel, je framework en de versie ervan, en de startvolgorde uit server.cfg.
Host je FiveM-server in Singapore
Lage ping voor spelers in India, Maleisië en Indonesië, op AMD EPYC met NVMe en Gcore DDoS-bescherming op elk IP.
