AI Core
Dokumentacja APIAI Core: eksporty serwerowe

Sprawdzanie połączeń

Dodaj sprawdzenia, które musi przejść każdy łączący się gracz (whitelisty, bany), i zadeklaruj, że twój skrypt zastępuje inny.

Każdy łączący się gracz przechodzi przez jedną bramę w ai-core. Najpierw idą własne sprawdzenia ai-core: gracz potrzebuje konta FiveM i żaden niepotrzebny skrypt nie może działać obok skryptu, który go zastępuje (gdy w panelu włączone jest Refuse players while both run). Potem idą sprawdzenia, które inne zasoby dodają przez AddConnectionCheck, w kolejności dodania. Wygrywa pierwsza odmowa.

AddConnectionCheck

Dodaje sprawdzenie, które musi przejść każdy łączący się gracz. Używaj tego dla whitelisty, listy banów albo trybu konserwacji.

Strona: Serwer · Czeka: nie (samo sprawdzenie musi odpowiedzieć od razu) · Lib: brak

Sygnatura
AddConnectionCheck(
  id: string,
  check: (source: number, identifiers: Record<string, string>) => string | null | undefined,
): void
Lua
exports['ai-core']:AddConnectionCheck('myscript:whitelist', function(source, identifiers) end)

Parametry

Prop

Type

identifiers trzyma każdy typ identyfikatora z jego wartością bez prefiksu: identifiers.license to abc123..., nie license:abc123.... Typów, których gracz nie ma, brakuje.

Zwraca

Nic. Bez tekstowego id albo funkcji wywołanie nic nie robi. Sprawdzenie jest usuwane, gdy twój zasób się zatrzymuje.

Przykład

import { resourceExport } from "@aicore-fivem/lib/server";
import { Locale } from "common";

const core = resourceExport("ai-core");
const allowed = new Set<string>(); // wypełniane z twojej bazy danych przy starcie

core.AddConnectionCheck("myscript:whitelist", (_source, identifiers) => {
  const fivem = identifiers.fivem;
  return fivem && allowed.has(fivem) ? null : Locale("CONNECT_NOT_WHITELISTED");
});

Sprawdzenie działa podczas łączenia się gracza i musi odpowiedzieć od razu: bez zapytań do bazy danych, bez await, bez Wait. Trzymaj to, co sprawdzasz, w pamięci (wczytaj przy starcie, aktualizuj przy zmianie). Sprawdzenie, które rzuca wyjątek, jest zapisywane w logu i pomijane, więc nigdy nie blokuje wszystkich.

RegisterReplacement

Deklaruje, że jeden skrypt sprawia, że inne są niepotrzebne (twój skrypt wykonuje to samo zadanie co one). Dopóki oba są zainstalowane, ai-core ostrzega w konsoli i podaje folder do usunięcia; dopóki oba są uruchomione, a w panelu włączone jest Refuse players while both run, nikt nie może dołączyć.

Strona: Serwer · Czeka: nie · Lib: brak

Sygnatura
RegisterReplacement(remove: string | string[], keep?: string): void
Lua
exports['ai-core']:RegisterReplacement({ 'qb-banking', 'okokBanking' })

Parametry

Prop

Type

Zwraca

Nic. Reguła jest usuwana, gdy wywołujący zasób się zatrzymuje. ai-core ponownie sprawdza konflikty sekundę po starcie lub zatrzymaniu dowolnego zasobu.

Przykład

import { resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

// Nasz skrypt bankowy robi to, co te; uruchomienie obu podwoiłoby ekrany banku.
core.RegisterReplacement(["qb-banking", "okokBanking"]);

Zasób, którego nie możesz zmienić (skrypt escrow), może zadeklarować to samo linią w swoim fxmanifest.lua: ai_replaces 'qb-banking'.

GetConflicts

Każdy konflikt znaleziony teraz: skrypt zainstalowany obok skryptu, który go zastępuje.

Strona: Serwer · Czeka: nie · Lib: brak

Sygnatura
GetConflicts(): { keep: string; remove: string; running: boolean; from: string }[]
Lua
local conflicts = exports['ai-core']:GetConflicts() -- lista tabel

Parametry

Brak.

Zwraca

Lista, jeden wpis na konflikt:

Prop

Type

Pusta lista, gdy nie ma konfliktu.

Przykład

import { addCommand, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

addCommand("conflicts", { help: "Lists scripts to remove", restricted: true }, () => {
  for (const c of core.GetConflicts())
    console.log(`${c.keep} replaces ${c.remove}${c.running ? " (both started!)" : ""} [${c.from}]`);
});

Na tej stronie