Konfiguracja VS Code FiveM: serwer języka Lua, natives, brak fałszywych ostrzeżeń

VS Code pełny ostrzeżeń 'Undefined global' na Lua FiveM? Skonfiguruj serwer języka Lua, typings natives, ustawienia workspace, formatter i szybkie wyszukiwanie natives.

Otwierasz całkowicie dobry skrypt w VS Code i wygląda to tak:

text
Undefined global `PlayerPedId`.

Każdy native, exports, ESX i QBCore otrzymuje żółte podkreślenie, a prawdziwe błędy tonęcia w szumie. Ten przewodnik konfiguruje VS Code, aby rozumiał Lua FiveM i ostrzegał cię tylko o rzeczach, które są faktycznie nieprawidłowe.

Zainstaluj serwer języka Lua

W panelu Extensions zainstaluj rozszerzenie Lua language server. Szeroko używane to rozszerzenie "Lua" autorstwa sumneko, które jest zbudowane na Lua Language Server (LuaLS). Daje ci ukończenie, przejdź do definicji, zmień nazwę i diagnostykę.

Otwórz folder zasobów jako workspace (nie pojedynczy plik), aby serwer mógł widzieć każdy skrypt i ustawienia, które właśnie dodajesz.

Dodaj definicje FiveM natives

Zwykły LuaLS nie ma pojęcia, co GetEntityCoords przyjmuje. Społeczność utrzymuje typings dla FiveM / CfxLua: zestaw plików adnotacji, które opisują natives, globalne Cfx.re i dodatkową składnię Lua, którą FiveM pozwala. Przeszukaj panel Extensions w poszukiwaniu "CfxLua" lub "FiveM natives", lub poszukaj dodatku "FiveM" w menedżerze dodatków LuaLS i wybierz ten, który jest aktywnie utrzymywany.

Po zainstalowaniu ich otrzymujesz podpisy, gdy typujesz:

lua
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)

Najedź myszą na native, a parametry i typy zwracane się pojawiają. Większość typingów zawiera również exports, adnotacje lib, jeśli dodasz definicje ox_lib i tabelę cache.

Porada: nazwy rozszerzeń i ustawienia zmieniają się w czasie. Jeśli ustawienie poniżej nie istnieje w Twojej wersji, sprawdź własny README rozszerzenia, który zawsze jest bardziej aktualny niż tutorial.

Ustawienia Workspace

Utwórz .vscode/settings.json w katalogu głównym folderu zasobów. To przechowuje ustawienia z projektem, więc każdy, kto go otwiera, otrzymuje to samo zachowanie:

json
{
  "Lua.runtime.version": "Lua 5.4",
  "Lua.runtime.nonstandardSymbol": [
    "/**/", "`", "+=", "-=", "*=", "/=", "<<=", ">>=", "&=", "|=", "^="
  ],
  "Lua.diagnostics.globals": [
    "ESX", "QBCore", "Config", "Locales", "PlayerData",
    "lib", "cache", "exports"
  ],
  "Lua.workspace.checkThirdParty": false,
  "Lua.workspace.ignoreDir": [".vscode", "node_modules", "dist"]
}

Co każda część robi:

  • Lua.runtime.version dopasowuje lua54 'yes' w Twoim fxmanifest.lua.
  • nonstandardSymbol mówi parserowi, że złożone przypisanie FiveM (x += 1) i hesze backtick są prawidłowe. Bez niego, całkowicie dobry kod jest flagowany jako błąd składni.
  • Lua.diagnostics.globals wymienia nazwy, które skrypt definiuje gdzieś, gdzie serwer nie może śledzić. Dodaj swoje: ESX, QBCore, tabelę Config z config.lua. Jeśli rozszerzenie typingów już deklaruje lib i exports, możesz je usunąć z listy.

Dodaj tylko prawdziwe globale. Jeśli wyciszysz wszystko, tracisz ostrzeżenie, które łapie błędnie napisaną zmienną, co jest jedną z najlepszych rzeczy, które robi edytor.

Napraw ostrzeżenia, które są rzeczywiste

Niektóre ostrzeżenia to edytor wykonujący swoją pracę:

lua
local players = ESX.GetPlayers()
for i = 1, #player do   -- 'player' is not defined: should be 'players'
end

Zamień Lua.diagnostics.globals na krótką, celową listę i każde pozostałe Undefined global to literówka lub brakujący local. To również najszybszy sposób na znalezienie przypadkowych globalnych, które przewodnik resmon wymienia jako źródło wydajności i błędów.

W przypadkach jednorazowych komentarz inline jest lepszy niż ustawienie globalne:

lua
---@diagnostic disable-next-line: undefined-global
local x = SomeOtherResourceGlobal

Adnotuj swój własny kod

LuaLS czyta komentarze ---@. Kilka linii czyni twoje własne funkcje samoobjśniające i daje automat kompletny:

lua
---@param plate string
---@param coords vector3
---@return boolean
local function isPlateNear(plate, coords)
    -- ...
end

Jeśli budujesz bibliotekę, którą inne skrypty wołają przez exports, umieszczenie tych adnotacji na eksportowanych funkcjach się zwraca.

Formatuj przy zapisie

Zainstaluj StyLua (rozszerzenie formattera StyLua) lub użyj własnego formattera serwera języka. Dla StyLua dodaj stylua.toml obok swoich zasobów:

toml
column_width = 120
indent_type = "Spaces"
indent_width = 4
quote_style = "AutoPreferSingle"

Następnie w ustawieniach VS Code:

json
{
  "[lua]": {
    "editor.defaultFormatter": "JohnnyMorganz.stylua",
    "editor.formatOnSave": true
  }
}

Sprawdź identyfikator formattera w panelu Extensions, jeśli się nie wyzwoli. StyLua może nie lubić składni tylko FiveM, takiej jak hesze backtick, więc uruchom go na kopii pierwszy, jeśli twoje skrypty ich ciężko używają.

Wyszukaj natives

Edytor mówi ci podpis; oficjalna referencja natives mówi ci, co native naprawdę robi, z notatkami od innych programistów. Strony natives są na docs.fivem.net/natives i pole wyszukiwania znajdzie native po nazwie lub opisie. Dwa nawyki pomagają:

  • Wyszukaj przez to, co chcesz, nie dokładną nazwę: "get closest vehicle", "ped bone".
  • Przeczytaj Cfx.re native najpierw, potem tekst referencji GTA V, ponieważ niektóre natives zachowują się inaczej na budowie FiveM.

Aby uzyskać szczegóły klient/serwer, zobacz zdarzenia klient i serwer i Wait i wątki.

Lista kontrolna

Objaw Naprawa
Undefined global na każdym native Zainstaluj typings natives (CfxLua / dodatek FiveM) dla serwera języka Lua
ESX lub QBCore podkreślone Dodaj je do Lua.diagnostics.globals w .vscode/settings.json
x += 1 pokazane jako błąd składni Dodaj złożone operatory do Lua.runtime.nonstandardSymbol
Hesze backtick flagowany Dodaj backtick do nonstandardSymbol
Ostrzeżenia wszędzie po wyciszeniu Utrzymuj listę globalnych krótko, aby błędy wciąż się pokazywały
Formatter nic nie robi Ustaw editor.defaultFormatter dla [lua] i włącz formatowanie przy zapisie

Szybkie odpowiedzi

Dlaczego VS Code mówi 'Undefined global' dla natives jak PlayerPedId?

Serwer języka Lua zna tylko standard Lua. Natives FiveM, exports, ESX lub QBCore to globalne rzeczy, które nigdy nie słyszał. Dodaj typings dla natives i wymień globale swoich frameworków w Lua.diagnostics.globals.

Czy muszę zmienić wersję Lua w ustawieniach?

Ustaw Lua.runtime.version na Lua 5.4, ponieważ to to, co skrypty FiveM działają na lua54 'yes' w manifeście. Uniemożliwia to również edytorowi flagowanie składni, którą FiveM akceptuje.

Którego formattera powinienem użyć dla Lua FiveM?

StyLua działa dobrze i jest konfigurowany przez mały stylua.toml w repozytorium. Formatter wbudowany w serwer języka Lua również działa, jeśli chcesz mniej rozszerzeń.

Skrypty bez tego problemu

Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →

Czytaj dalej