Aktualizacja skryptu
Przenieś skrypt ai-*, pakiet albo skrypt innej firmy na nową wersję i zachowaj swoje ustawienia, dane panelu, sekrety, teksty i bazę danych.
Aktualizacja ma dwie połowy: zainstaluj nową wersję dokładnie tak, jak przychodzi, a potem przenieś na nią własne zmiany serwera. Kopiowanie starych plików na nowe nigdy nie jest właściwą drogą: wraca stary kod, stare klucze i stare błędy, a nowa wersja psuje się w sposób trudny do znalezienia.
Ta strona jest napisana dla dwóch czytelników: dla ciebie i dla agenta AI do kodowania (Claude Code, Codex, Cursor...), któremu ją wskażesz. Obaj stosują tę samą procedurę.
Poproś swoje AI
Otwórz folder danych serwera w swoim agencie do kodowania i wklej to, uzupełniając zakres:
Zaktualizuj skrypty na tym serwerze AI Core zgodnie z https://aifivem.com/docs/update-a-script.md
Jeśli ten folder ma .claude/skills/aicore-script-update/, przeczytaj jego SKILL.md i references: to ta sama procedura.
Zakres: <każdy nieaktualny skrypt ai-* i pakiet | ai-inventory ai-garages | skrypty innych firm w C:\sciezka\do\nowych-wersji>
- Najpierw pokaż mi listę (nazwa, ścieżka, obecna -> nowa wersja, notatki wydania wymagające działania) i poczekaj na moją zgodę.
- Zrób kopię każdego folderu, zanim go dotkniesz, łącznie z plikami ignorowanymi przez git, jak data/secrets.json.
- Weź trzy drzewa na skrypt: stary upstream (wersja, której używam, w stanie z wydania), nasz (folder teraz), nowy upstream.
Scalaj plik po pliku według tego modelu trójstronnego. Nigdy nie kopiuj starego pliku na nowy.
- Zachowaj moją zawartość panelu data/*.json, data/secrets.json, moje teksty locale i moją bazę danych.
Nigdy nie wypisuj sekretu na czacie i nigdy go nie commituj.
- Żadnego SQL bez mojej zgody i kopii zapasowej dotkniętych tabel. security.cfg nigdy nie jest luzowany.
- Pliki generowane (dist/, fxmanifest.lua, resource/server/tables.ts, data/schemas/) weź z nowej wersji
i wygeneruj je buildem od nowa; nigdy nie edytuj ich ręcznie.
- Zbuduj, zrób refresh, zrestartuj i przeczytaj log konsoli pod kątem błędów, nie tylko "Started resource".
- Nie commituj ani nie pushuj, chyba że o to poproszę.
- Zakończ raportem dla każdego skryptu, w moim języku: zmiana wersji, co zmieniło się w upstream, co przeniosłeś
i dokąd, co odpadło (ze starą wartością), nowe opcje zostawione na domyślnych, baza danych, zmiany cfg,
wynik buildu / restartu / logu, co przetestować w grze i decyzje, które muszę podjąć.Każdy folder serwera AI Core zawiera tę procedurę jako skill projektu w .claude/skills/aicore-script-update/: recipe txAdmin instaluje go razem z zasadami, tools/, docs/compat/, CLAUDE.md i AGENTS.md, tak samo jak instalacja ręczna. Claude Code ładuje go sam, gdy powiesz "zaktualizuj moje skrypty" albo "wyszła nowa wersja"; inne agenty znajdują go przez AGENTS.md. Serwer zainstalowany starszym recipe może nie mieć tych plików: pobierz je z repozytorium aicore-server do folderu serwera jak w Instalacji ręcznej, zachowując własne pliki cfg.
Co zostaje twoje
| Co | Gdzie | Co robi z tym aktualizacja |
|---|---|---|
| Ustawienia i zawartość panelu | data/*.json w każdym skrypcie | Zostają. Konwertowane do nowego formatu tylko wtedy, gdy nowa wersja czyta inne pola. |
| Sekrety | data/secrets.json (ignorowany przez git) | Przywracane z kopii bez zmian. Nigdy nie wypisywane, nigdy nie commitowane. |
| Twoje teksty | locales/*.json, folder locales/ lub languages/ skryptu innej firmy | Twoje sformułowanie zostaje dla każdego klucza, który nadal istnieje; nowe klucze dochodzą w twoim języku; usunięte klucze znikają. |
| Twoje zmiany w kodzie | Każdy plik źródłowy, który edytowałeś | Wpisywane w kod nowej wersji. Zmiana, dla której nie ma już miejsca, trafia do raportu. |
| Baza danych | Twoje tabele i wiersze | Nigdy nie usuwana. Nowe tabele i kolumny dochodzą przy starcie; reszta czeka na twoją zgodę. |
| Ustawienia bezpieczeństwa | security.cfg | Nigdy nie luzowane. Jeśli wydanie albo dostawca tego wymaga, aktualizacja staje i decydujesz ty. |
Skąd pochodzi nowa wersja
| Skrypt | Nowa wersja | Co dajesz |
|---|---|---|
Zasoby ai-* w resources/[ai]/ (łącznie z ai-core, ai-lib i ai-mysql) | Wydanie na GitHubie repozytorium podanego w jego package.json ("repository": "github:aifivem/<name>") | Nic |
Pakiety @aicore-fivem/* w packages/ | npm (npm view @aicore-fivem/<pkg> version) | Nic |
Każdy inny zasób (zwykle w resources/[standalone]/) | Dostawca | Nowy folder albo zip |
ai-core sprawdza każdy uruchomiony skrypt z repozytorium na GitHubie (co 6 godzin dla każdego skryptu) i wypisuje w konsoli <name> <current> is outdated: <latest> is out (<url>); ta sama lista jest na dashboardzie admina. Sprawdzanie aktualizacji i pomijane skrypty ustawiasz w panelu administratora w zakładce General (updates.check, updates.ignore w data/settings.json ai-core).
Przeniesienie trójstronne
Każda aktualizacja porównuje trzy wersje każdego pliku:
- Stary upstream: wersja, której używa twój serwer, w stanie z wydania.
- Nasz: folder w obecnym stanie, łącznie z niezacommitowanymi zmianami.
- Nowy upstream: nowa wersja, w stanie z wydania.
| Stary -> nasz | Stary -> nowy | Wynik |
|---|---|---|
| taki sam | zmieniony lub taki sam | weź nowy |
| zmieniony | taki sam | zostaw nasz |
| zmieniony | zmieniony | git merge-file -p ours old new, potem każdy konflikt rozwiązuje się, czytając obie strony; wynik trzyma się struktury nowego pliku (zostają przemianowane klucze, przeniesione sekcje, nowe komentarze i wartości domyślne) |
| brak w starym, jest w naszym | brak w nowym | własny plik serwera: zostaje, jeśli jest nadal używany, inaczej trafia do raportu |
| jest w starym | brak w nowym | usunięty; jeśli go zmieniałeś, raport mówi, co przepadło |
git merge-file i git diff --no-index <a> <b> działają na dowolnych dwóch folderach, bez repozytorium. Usuń \r przed porównaniem (pliki z Windows są często w CRLF). Gdy starego upstreamu nie da się znaleźć, nasz porównuje się bezpośrednio z nowym: pojedyncze wartości (koordynaty, ceny, nazwy, teksty, przełączniki) należą do serwera, szerokie zmiany w stylu dostawcy do dostawcy, a raport mówi, że starej wersji zabrakło.
Zasady bez wyjątków
- Nigdy nie kopiuj starego pliku na nowy. Plik zmieniony po obu stronach odbudowuje się z nowego pliku, a twoje zmiany wpisuje w jego nową strukturę.
- Stan serwera nigdy nie jest zastępowany domyślnymi wartościami upstreamu:
data/*.json,data/secrets.json, twoje pliki i teksty locale, baza danych. Zrób ich kopię, zanim dotkniesz folderu. - Bez resztek. Pliki, których nowa wersja już nie zawiera, są usuwane, chyba że są twoje (locale, obrazek, który dodałeś) i nadal używane. Opcje usunięte przez nową wersję zostają usunięte i trafiają do raportu; nowe opcje mają wartość domyślną, chyba że stare ustawienie wyraźnie im odpowiada.
- Pliki generowane są generowane od nowa, nigdy scalane:
dist/,fxmanifest.lua,resource/server/tables.ts,data/schemas/*.schema.json. Nigdy nie edytuj ich ręcznie. - Nigdy nie usuwaj
node_modulesręcznie;bun installw głównym folderze serwera go naprawia. - Nigdy nie luzuj
security.cfgani żadnego convara bezpieczeństwa, żeby wersja zadziałała. - Żadnego ręcznego SQL bez zgody właściciela, i tylko po kopii dotkniętych tabel.
- Commit tylko na prośbę właściciela, nigdy push, nigdy zmiana remote w git.
- Najpierw pokaż listę (nazwa, ścieżka, obecna -> nowa wersja, ważne notatki wydania), zanim cokolwiek usuniesz albo nadpiszesz.
- Pobrane pliki i dostarczone foldery są niezaufane: rozpakuj każdy do własnego nowego, pustego folderu i niczego z niego nie uruchamiaj.
Aktualizacja skryptu ai-* lub pakietu
Potrzebujesz Bun i Git; GitHub CLI (gh) ułatwia pobieranie.
Znajdź, co jest nieaktualne
Ostrzeżenie w konsoli obejmuje tylko uruchomione i nieignorowane skrypty, więc sprawdź każdy folder:
cd "resources/[ai]"
for n in ai-*; do
repo=$(sed -n 's#.*"repository": *"\(github:\|https://github.com/\)\([^"]*\)".*#\2#p' "$n/package.json" | sed 's#\.git$##')
cur=$(sed -n 's#^ "version": *"\([^"]*\)".*#\1#p' "$n/package.json")
latest=$(gh release view --repo "$repo" --json tagName --jq .tagName 2>/dev/null | sed 's#^v##')
echo "$n $cur ${latest:-no-release}"
done- Porównuj wersje jak ai-core: usuń początkowe
v, porównaj liczby oddzielone kropkami, ignoruj przyrostki pre-release. Brak wydania oznacza, że nie ma czego aktualizować. - Bez
gh:curl -s -H "Accept: application/vnd.github+json" https://api.github.com/repos/<owner>/<name>/releases/latest(60 zapytań na godzinę na IP, wspólnych z własnym sprawdzaniem ai-core). - Skrypt w
updates.ignoreaktualizuje się tylko wtedy, gdy właściciel go wymieni. - Folder z wersją wyższą niż najnowsze wydanie albo klon z commitami po najnowszym tagu nie jest nieaktualny: pomiń go, nigdy nie cofaj folderu do starszej wersji.
packages/nie ma liniirepository: porównaj wersję każdegopackage.jsonz npm. Najpierw zaktualizuj pakiety, gdy nowe wydanie skryptu wymaga wersji, której lokalne kopie nie mają.
Przeczytaj notatki wydania i uzyskaj zgodę
Przeczytaj notatki każdej wersji między obecną a najnowszą (gh release view <tag> --repo <repo> --json body,assets,url): niezgodne zmiany, wymagane wersje pakietów, migracje, nowe linie cfg (ensure, add_convar_permission, ACE), nowe nazwy provide, kroki ręczne.
Pokaż właścicielowi listę i poczekaj na zgodę. Aktualizuj w kolejności zależności: pakiety, ai-mysql, ai-core, ai-lib, potem reszta.
Pobierz stary i nowy upstream
Dla każdego skryptu dwa nowe, puste foldery poza serwerem (na przykład update/<name>/old i update/<name>/new):
gh release download <tag> --repo <owner>/<name> --archive zip --dir update/<name>/new # źródła tagu
gh release download <tag> --repo <owner>/<name> --pattern '*.zip' --dir update/<name>/new # asset wydania, jeśli jest
unzip -q update/<name>/new/*.zip -d update/<name>/new/x- Wybierz asset wydania, gdy wydanie go ma; inaczej źródła tagu (zawierają zacommitowane
dist/ifxmanifest.lua). Górny folder zipa ze źródłami to<owner>-<name>-<sha>/. - Stary upstream to tag wersji, której używa serwer (styl tagów pokazuje
gh release list --repo <owner>/<name>). Zawsze da się go pobrać, więc porównanie trójstronne zawsze ma swoją bazę. - Nic w tych folderach nie jest uruchamiane, instalowane ani budowane.
Zrób kopię zapasową
- Skopiuj cały folder skryptu bez
node_modulesdoupdate/<name>/ours(w Windowsrobocopy "<src>" "<dst>" /E /XD node_modules; kody wyjścia robocopy poniżej 8 oznaczają sukces). To jest "nasz" do scalania i droga powrotu. - Pliki ignorowane przez git istnieją tylko w tej kopii:
data/secrets.json,data/*.json.bak. W klonie git listuje jegit ls-files --others --ignored --exclude-standard. - Niezacommitowane zmiany w klonie (
git status --porcelain) to też zmiany serwera. Powiedz o nich właścicielowi; commituj je tylko na jego prośbę.
Scalaj plik po pliku
Zastosuj model trójstronny do starego, naszego i nowego, a wynik zapisz w folderze skryptu:
| Plik | Zasada |
|---|---|
resource/**, web/src/**, bridge/**, sql/**, Lua i inne źródła | Trójstronnie. Lokalna zmiana, której kod się przeniósł albo której kontrakt się zmienił, jest dopasowywana do nowego kodu; zmiana bez miejsca trafia do raportu. |
package.json | Nowy upstream plus lokalne dodatki, które nadal mają sens. version kończy na wersji nowego wydania, inaczej sprawdzanie aktualizacji dalej ostrzega. |
dist/, fxmanifest.lua, resource/server/tables.ts, data/schemas/*.schema.json | Weź nowe; build generuje je od nowa. |
data/<file>.json (zawartość panelu) | Zostaw nasz (patrz niżej). |
data/secrets.json, data/*.json.bak | Przywróć z kopii bez zmian. |
locales/en.json | Trójstronnie: nowe klucze i placeholdery z upstreamu, sformułowania serwera dla kluczy, które nadal istnieją. |
locales/<lang>.json, którego wydanie nie zawiera | Zostaw. Dodaj nowe klucze przetłumaczone na ten język w tym samym tonie, usuń usunięte klucze, idź za zmienionymi placeholderami ({0}, {1}). |
CLAUDE.md, dokumentacja | Weź nowe, dopisz z powrotem własne notatki serwera. |
Zawartość panelu (data/*.json) to żywa zawartość serwera, edytowana w panelu; wydanie przynosi tylko wartości domyślne.
- Ten sam schemat (nowy
schema.tsalbo loader czyta te same pola): zostaw nasz bez zmian. Plik, który dodaje nowa wersja: weź ten z wydania. - Zmieniony schemat: poszukaj własnej migracji skryptu przy starcie (notatki wydania, migracja wywoływana przy starcie). Jeśli jest, zostaw nasz na miejscu; przekonwertuje go przy starcie. Jeśli nie ma, przekonwertuj ręcznie według nowego loadera i schematu: te same nazwy pól, typy i format id co plik z wydania, każda wartość zachowana, nowe pola z wartością domyślną z wydania, usunięte pola wyrzucone i zgłoszone. Sprawdź, że każdy plik się parsuje.
Baza danych. Każdy skrypt tworzy swoje tabele z sql/main.sql przy starcie: tworzy brakujące tabele i dodaje brakujące kolumny, a nigdy nie usuwa, nie zmienia nazwy ani typu kolumny i nie dodaje kluczy. Porównaj stary i nowy sql/main.sql:
- Nowe tabele i kolumny: restart je wprowadza.
- Zmieniony typ kolumny, nowy indeks albo klucz, przemianowana lub usunięta kolumna: wydanie musi przynieść własną migrację (notatki wydania, kod serwera), która uruchamia się przy starcie; sprawdź log. Jeśli nie przynosi, napisz SQL, pokaż go właścicielowi, zrób kopię dotkniętych tabel i uruchom go tylko za jego zgodą.
Pliki cfg poza folderem.
server.cfg: nowy skrypt dostaje swoją linięensurew kolejności zależności; usunięty ją traci (najpierw zapytaj).env.cfgienv.example.cfg: skrypt, który zaczyna używać bazy danych, potrzebujeadd_convar_permission <resource> read mysql_connection_string.permission.cfg: linie ACE, których wymagają notatki wydania.security.cfg: nigdy nie luzowany.
Zbuduj, zrestartuj, sprawdź
-
bun installw głównym folderze serwera, gdy zmienił się jakiśpackage.json. -
W każdym zaktualizowanym skrypcie:
bun run typecheck,bun run lint,bun run build(albobun tools/run.ts build ai-x ai-yz głównego folderu serwera). Zawsze buduj:dist/musi pochodzić ze scalonych źródeł. Popraw błędy w przeniesionych zmianach serwera; błąd w nietkniętym kodzie upstreamu trafia do raportu, nie jest łatany. -
Porównaj wynik z nowym upstreamem:
diff -r --strip-trailing-cr -x node_modules -x dist -x data update/<name>/new/x/<top> "<script folder>". Każda pozostała różnica musi być jedną ze zmian serwera. -
Zrób refresh i restart:
bun tools/rcon.ts --log ../default/logs/fxserver.log --wait 3 "refresh" bun tools/restart.ts --from ai-inventory # jeden skrypt bun tools/restart.ts # po aktualizacji ai-core, ai-lib, ai-mysql lub pakietówbun tools/restart.tsrestartuje ai-core, robiensurekażdegoai-*po nim i sprawdza, że każdy wystartował. Skrypty innych firm zależne od ai-mysql zatrzymują się razem z nim: zrób im ponownieensurepo nazwie. Nowa liniaprovidewymaga pełnego startu serwera:bun tools/rcon.ts "quit \"<reason>\"". -
Przeczytaj log konsoli pod kątem
SCRIPT ERROR,Failed to load script,[client error], błędów ładowania lub walidacji panelu i błędów bazy danych, nie tylkoStarted resource. Ostrzeżenieis outdatedmusi zniknąć po następnym sprawdzeniu skryptu.
Aktualizacja skryptu innej firmy
Właściciel dostarcza nową wersję (folder albo zip). Zainstaluj ją tak, jak przyszła, przenieś na nią zmiany serwera, a potem sprawdź, czy ai-core nadal poprawnie z nią rozmawia.
Dopasuj dostawę do zainstalowanych zasobów
- Każdy folder najwyższego poziomu z
fxmanifest.lua(albo__resource.lua) to zasób; folder[category]zawiera kilka. Rozpakuj zipy do nowego, pustego folderu i niczego z niego nie uruchamiaj. - Znajdź zainstalowaną kopię po nazwie folderu w
resources/(na przykładfind resources -maxdepth 3 -type d -name <name>). Zostaw zainstalowane miejsce, nie kategorię z dostawy. Brak dopasowania albo kilka: zapytaj właściciela. Skrypt, który nie jest jeszcze zainstalowany, instaluje się tylko na polecenie właściciela. - Folder
ai-*w dostawie nie idzie tą ścieżką: skryptyai-*aktualizują się z GitHuba (wyżej). Zapytaj właściciela, czym jest ten folder. - Przeczytaj oba manifesty:
version,files, skrypty,dependencies,provide,escrow_ignore,ai_replaces. Wersja, która spada, albo dostawa bez plików, które ma zainstalowana kopia, może być starszym buildem: porównaj i zgłoś zamiast instalować. - Nowe zależności: oxmysql obsługuje ai-mysql (nigdy nie instaluj oxmysql obok); ox_lib i inne biblioteki instaluje właściciel; zależność od czegoś, co ai-core zastępuje (
es_extended,qb-core,qbx_core,pma-voice,ox_inventory...), jest już spełniona. - Pokaż dopasowaną listę (nazwa, ścieżka, obecna -> nowa wersja) i poczekaj na zgodę.
Zrób kopię zapasową
- Skopiuj cały zainstalowany folder do folderu kopii poza serwerem (
robocopy "<src>" "<dst>" /E). Dla folderu, którego nie śledzi żadne repozytorium git, ta kopia jest jedyną kopią wersji serwera. - Jeśli git śledzi folder:
git status --porcelain -- <path>pokazuje niezacommitowane zmiany (liczą się jako nasz; powiedz właścicielowi), agit ls-files --others --ignored --exclude-standard -- <path>pokazuje pliki robocze ignorowane przez git (zapisany JSON, cache), które są w kopii.
Znajdź zmiany serwera
Zdobądź stary upstream w tej kolejności:
- Właściciel nadal ma stary zip albo folder od dostawcy.
- Skrypt open source na GitHubie: wydanie albo tag zainstalowanej wersji.
- Historia git, gdy folder jest śledzony: commit, który ustawił zainstalowaną
version(git log -S"version '<old>'" -- <path>/fxmanifest.lua). Jeśli ten commit ponownie nałożył też wcześniejsze dostosowania, jego pliki config liczą się jako nasz, a czysta wersja z wydania jest commit wcześniej. - Nic z tego: porównaj nasz bezpośrednio z nową wersją i napisz o tym w raporcie.
Potem przeczytaj każdą różnicę stary -> nasz (edycje serwera: configi, locales/* lub languages/*, pliki editable, data/*.json, fxmanifest.lua, SQL, obrazy, dźwięki, pliki stream, łatki kodu) i stary -> nowy (zmiany dostawcy: dodane i usunięte pliki, przemianowane klucze, przeniesione sekcje, zmienione funkcje editable). W skrypcie z escrow (jest .fxap) czytać i edytować można tylko pliki z escrow_ignore; edycji w pliku, który nowa wersja objęła escrow, nie da się przenieść i trafia ona do raportu.
Zainstaluj nową wersję
Usuń zainstalowany folder w całości, a potem skopiuj nowy folder w to samo miejsce, łącznie z ukrytymi plikami (.fxap). Stare resztki to błędy; stara wersja zostaje w kopii. Przywróć skopiowane pliki robocze tylko wtedy, gdy nowa wersja nadal używa ich w tym samym formacie; inaczej przekonwertuj je albo porzuć i zgłoś.
Nałóż ponownie zmiany serwera
Dla każdej edycji znajdź, gdzie to ustawienie jest w nowej wersji, i wpisz tam wartość w nowym formacie:
- Ten sam klucz, ten sam plik: ustaw wartość w nowym pliku; zachowaj jego komentarze i układ.
- Przemianowany lub przeniesiony klucz: znajdź nowy klucz, czytając kod, który go używa (szukaj starej nazwy, jej komentarza, wartości domyślnej, klucza tekstu), i przekonwertuj wartość na nowy kształt.
- Config przeniesiony do pliku danych (JSON edytowany przez własny panel skryptu): przeczytaj nowy loader i plik z wydania, wpisz stare wartości dokładnie w tym schemacie (nazwy pól, typy, format id, wcięcia) i sprawdź, że się parsuje. Nie licz na konwerter, który skrypt może uruchomić.
- Istniejące pliki danych serwera: przenieś je, przekonwertuj pole po polu, jeśli schemat się zmienił, nigdy nie zastępuj ich przykładem dostawcy.
- Usunięta opcja: żaden kod już jej nie czyta (wyszukiwanie to potwierdza): usuń ją i zgłoś ze starą wartością.
- Pliki editable (
client/editable.lua,server/editable.lua...): zacznij od nowego pliku i ponownie nałóż każde zmienione ciało funkcji, dopasowane do zmienionej sygnatury albo wartości zwracanej; nowe funkcje zostają domyślne. - Języki: zachowaj sformułowania serwera dla każdego klucza, który nadal istnieje; dodaj nowe klucze do każdego pliku językowego, którego używa serwer, przetłumaczone w tonie istniejących tekstów; usuń usunięte klucze; idź za zmienionymi placeholderami.
- fxmanifest: nowy, plus tylko własne dodatki serwera, które nadal mają sens. Nigdy nie zmieniaj
version. - SQL (
*.sql, foldery instalacyjne): porównaj stary i nowy; nowe tabele, kolumny i indeksy trafiają do raportu jako SQL do uruchomienia przez właściciela. Nic nie jest uruchamiane bez jego zgody. - Dane dostępowe (tokeny botów, klucze API, adresy webhooków w configach): nigdy ich nie wypisuj. Przenieś je z kopii; jeśli się nie da, zostaw nową wartość domyślną i wypisz plik i klucz dla właściciela.
- Assety (
stream/, obrazy, dźwięki): te od dostawcy plus pliki dodane przez serwer, które są nadal używane. - Koordynaty, itemy, ceny, teksty i zachowanie są przenoszone dokładnie; poza własnymi edycjami serwera nic się nie zmienia.
Sprawdź zgodność z ai-core
Skrypt może być jednym z tych, z którymi rozmawia ai-core. Znajdź każde miejsce, które go wymienia:
grep -rln "<name>" "resources/[ai]/ai-core/resource" "resources/[ai]/ai-core/bridge" docs/compat| Kategoria | Adaptery ai-core | Notatka |
|---|---|---|
| Ekwipunek | resource/server/inventory/adapters/, resource/client/inventory/adapters/ | docs/compat/inventory.md |
| Kluczyki do pojazdów | resource/server/vehicleKeys/adapters/, resource/client/vehicleKeys/adapters/ | docs/compat/vehicle-keys.md |
| Telefon | resource/server/phone/adapters/ | docs/compat/phone.md |
| Alerty policji | resource/server/dispatch/adapters/ | docs/compat/dispatch.md |
| Menu radialne | resource/client/radial/adapters/ | docs/compat/radial.md |
| Emotki, ręce do góry | resource/client/gestures.ts | docs/compat/gestures.md |
| Czas i pogoda | resource/server/world.ts, resource/client/world.ts | docs/compat/weather.md |
| HUD | resource/client/hud.ts | |
| Głos, czat | ai-voice (API pma-voice), ai-chat (API chat) | docs/compat/voice.md, docs/compat/chat.md |
| Użycie ESX / QB / Qbox | bridge/ | docs/compat/bridge.md, docs/compat/frameworks.md |
- Dla każdego exportu, eventu i callbacku, którego używa adapter, sprawdź nową wersję: nadal jest, te same argumenty, ten sam kształt wyniku, ten sam moment. W kodzie z escrow sprawdź czytelne pliki i dokumentację dostawcy, a to, czego nie da się sprawdzić, wypisz.
- Niezgodność poprawia się tylko w pliku adaptera (cienkie tłumaczenie), podnosząc jego testowaną wersję; potem typecheck, lint i build ai-core oraz restart (
bun tools/restart.ts). - Nowa linia
ai_replacesalboprovidemoże sprawić, że ai-core odrzuca połączenia, dopóki działa zastępnikai-*(zobacz Zastępowanie skryptu ai-*): podaj folder, który właściciel musi usunąć. - Zaktualizuj
docs/compat/<script>.md(testowana wersja, status, dokładny config albo łatka, znane ograniczenia); wspierany skrypt bez notatki dostaje ją.
Zweryfikuj i zrestartuj
- Porównaj zainstalowany wynik z nową wersją: każda różnica jest zmianą serwera i nie zostaje żaden stary plik, którego nowa wersja nie zawiera (poza przywróconymi plikami roboczymi).
- Edytowany Lua się parsuje, JSON się parsuje, każdy ustawiony klucz config istnieje w nowym kodzie.
- Jeśli żaden SQL nie czeka na właściciela:
bun tools/rcon.ts --log ../default/logs/fxserver.log --wait 3 "refresh", potem to samo z"ensure <name>", i przeczytaj log pod kątemSCRIPT ERROR,Failed to load scripti własnych błędów skryptu. Skrypty zależne od niego, które się zatrzymały, są uruchamiane ponownie.
Raport końcowy
Aktualizacja kończy się raportem w języku właściciela, jedna sekcja na skrypt:
- nazwa, ścieżka, obecna -> nowa wersja, źródło (tag wydania albo folder właściciela)
- co zmieniło się w upstream, co ma znaczenie dla tego serwera
- przeniesione: zmiany w kodzie, teksty i ustawienia, i gdzie każda trafiła w nowej wersji
- zostawione bez zmian:
data/*.json,data/secrets.json, własne pliki locale; wykonane konwersje schematu (przez migrację skryptu albo ręcznie) - porzucone albo nieprzeniesione: usunięte opcje i edycje bez miejsca, ze starą wartością, żeby właściciel mógł zdecydować
- nowe opcje zostawione na domyślnych, które właściciel może chcieć ustawić
- baza danych: tabele lub kolumny dodane przy starcie, migracje uruchomione przez wydanie, SQL czekający na właściciela
- potrzebne albo wykonane zmiany cfg (linie
ensurewserver.cfg, uprawnienia convarów wenv.cfg,permission.cfg) - zgodność: sprawdzone lub zmienione adaptery i notatki
docs/compat(skrypty innych firm) - wynik buildu, restartu i logu oraz co przetestować w grze
Kończy się decyzjami, które musi podjąć właściciel. Zobacz też Praca z AI.