SCRIPT ERROR w FiveM: jak go czytać i naprawić zasób
SCRIPT ERROR: attempt to index a nil value i inne błędy z konsoli FiveM: który plik i linijkę otworzyć, skąd się zwykle biorą i jak je naprawić.
Autor: Termi
- Errors
- Lua
- Debugging
- Server health
Na tej stronie
- Jak czytać SCRIPT ERROR
- Najczęstsze błędy i jak je naprawić
- attempt to index a nil value
- attempt to call a nil value
- No such export in resource
- attempt to perform arithmetic on a nil value
- attempt to compare number with nil
- Błędy z zasobów w JavaScripcie
- Error running system event handling function
- Które błędy naprawić najpierw
- Niech FiveDock je pogrupuje
- Częste pytania
- Co znaczy attempt to index a nil value w FiveM?
- Jak znaleźć zasób, który powoduje SCRIPT ERROR?
- Dlaczego SCRIPT ERROR pojawia się po aktualizacji zasobu?
- Czy da się ukryć SCRIPT ERROR w konsoli?
Konsola każdego serwera FiveM wypisuje czerwone linijki SCRIPT ERROR, a ruchliwy serwer potrafi ich wypluć setki dziennie. Większość bierze się z kilku błędów, które powtarzają się w różnych zasobach. Ten poradnik pokazuje, jak taki błąd czytać, co znaczą najczęstsze komunikaty i jak znaleźć tych kilka, które warto naprawić najpierw.
Jak czytać SCRIPT ERROR
[ script:qb-garages] SCRIPT ERROR: @qb-garages/server/main.lua:57: attempt to index a nil value (local 'Player')
[ script:qb-garages] > handler (@qb-garages/server/main.lua:57)Najczęstsze błędy i jak je naprawić
attempt to index a nil value
Skrypt czyta pole z czegoś, co nie istnieje. Na ESX i QBCore to prawie zawsze obiekt gracza pobrany dla kogoś, kto już wyszedł albo jeszcze się nie wczytał:
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
local cash = Player.PlayerData.money.cashPoprawka to sprawdzenie w drugiej linijce, i to samo dotyczy ESX.GetPlayerFromId(source). Gdy komunikat podaje pole, np. (field 'PlayerData'), tabela nad nim istnieje, ale nie ma takiego klucza. Często znaczy to, że skrypt powstał pod inną wersję frameworka.
attempt to call a nil value
Skrypt wywołuje funkcję, której nie ma, a nawias podaje jej nazwę: (field 'GetPlayerData') albo (method 'addMoney'). Zwykłe przyczyny to funkcja, której nazwę framework zmienił w aktualizacji, zasób, który ją definiuje, ale startuje później, albo zmienna globalna typu ESX, której nikt nie ustawił. Nowsze ESX wydaje swój obiekt przez exports['es_extended']:getSharedObject() albo @es_extended/imports.lua, a skrypt, który dalej czeka na stary event esx:getSharedObject, może zostać bez niego.
No such export in resource
No such export SendAlert in resource ps-mdt znaczy, że skrypt wywołał exports['ps-mdt']:SendAlert(), a ps-mdt nie ma eksportu o tej nazwie, a przynajmniej jeszcze nie ma. Albo zasób nie wystartował, albo działa pod inną nazwą folderu, albo eksport zmienił nazwę. Przesuń zasób, który daje eksport, wyżej w server.cfg i sprawdź nazwę w jego fxmanifest.lua albo dokumentacji.
attempt to perform arithmetic on a nil value
Coś w stylu count + 1, gdzie count to nil, zwykle wartość z bazy albo klucz configu, którego nie ma. Daj jej wartość domyślną tam, gdzie ją czytasz: local count = row.count or 0.
attempt to compare number with nil
Ta sama przyczyna w porównaniu: if amount > Config.Limit, a w twoim configu nie ma Limit. Sprawdź, czy każdy klucz, który czyta skrypt, jest w twojej kopii config.lua, zwłaszcza po aktualizacji, która dodała nowe.
Błędy z zasobów w JavaScripcie
Zasoby w JavaScripcie wypisują SCRIPT ERROR:, a po nim błąd JavaScriptu i stos z at. TypeError: Cannot read properties of undefined (reading 'citizenid') to javascriptowa wersja indeksowania nil i naprawia się ją tym samym sprawdzeniem.
Error running system event handling function
Ta linijka znaczy, że rzucił handler wbudowanego eventu, np. playerDropped albo onResourceStart. Linijki pod nią podają plik i linijkę, tak jak zwykły SCRIPT ERROR.
Które błędy naprawić najpierw
Konsola z pięciuset błędami zwykle mieści dwadzieścia różnych. Naprawiaj według skutków: najpierw błąd, który trafił najwięcej graczy, potem wszystko nowe od ostatniego restartu, czyli zwykle aktualizacja, którą właśnie wgrałeś. Jeśli konsola zapisuje się do pliku, to polecenie policzy błędy według miejsca:
grep -o 'SCRIPT ERROR: @[^:]*:[0-9]*' console.log | sort | uniq -c | sort -rn | head -20Liczy tylko linijki, więc jeden gracz w pętli potrafi wypchnąć na górę niegroźny błąd, a głośny błąd z wczoraj wygląda tak samo jak ten, który zaczął się godzinę temu.
Niech FiveDock je pogrupuje
Agent FiveDock czyta konsolę serwera na bieżąco. Łączy każdy SCRIPT ERROR z jego stosem, maskuje nicki graczy, adresy IP i identyfikatory i grupuje błędy po zasobie, pliku, linijce i treści, pomijając liczby w treści, żeby ten sam bug liczył się raz.
Na Metro Error Hunter pokazuje te grupy z liczbą wystąpień, liczbą trafionych graczy i tym, kiedy każdy błąd pojawił się pierwszy i ostatni raz, a wszystko nowe od restartu jest na górze. Deploy Guard robi kopię zapasową przed restartem, dziesięć minut po nim wydaje werdykt i wskazuje zasób, który narobił nowych problemów.
Agent to jeden zasób bez otwartych portów. Uruchom go przed frameworkiem, żeby widział błędy od pierwszej sekundy startu.
Częste pytania
Co znaczy attempt to index a nil value w FiveM?
Skrypt próbował odczytać pole ze zmiennej, która ma wartość nil, a nazwa w nawiasie mówi, z której. Na ESX i QBCore to zwykle obiekt gracza pobrany dla kogoś, kto się rozłączył albo jeszcze nie wczytał, a poprawka to sprawdzenie, czy obiekt istnieje, zanim go użyjesz.
Jak znaleźć zasób, który powoduje SCRIPT ERROR?
Zasób to nazwa po @ na początku lokalizacji, np. @qb-garages/server/main.lua:57. Jeśli to framework albo biblioteka, czytaj linijki stosu zaczynające się od >, aż dojdziesz do pierwszej w zasobie, który sam utrzymujesz.
Dlaczego SCRIPT ERROR pojawia się po aktualizacji zasobu?
Aktualizacje zmieniają nazwy funkcji i eksportów, dodają klucze configu i wymagają nowszych wersji frameworka. Porównaj nowy config.lua ze swoim, poszukaj w changelogu zmienionych eksportów i zrestartuj zasoby zależne od tego, który zaktualizowałeś.
Czy da się ukryć SCRIPT ERROR w konsoli?
Możesz owinąć wywołania w pcall, ale to chowa buga i zostawia to, co zepsuł. Napraw wartość nil tam, skąd przychodzi, i grupuj błędy, żeby widzieć, które się liczą.