ai-jobs для разработчиков
Чем ai-jobs делится с другими скриптами (экспортов у него нет): репутация продавца хот-догов, номера и ключи рабочего транспорта, причины операций и его приватные события.
У ai-jobs нет экспортов. Другим скриптам никогда не нужно его вызывать: маршруты и остановки являются данными панели, а всё, что делает смена, идёт через AI Core (деньги, ключи, инвентарь). Ниже перечислено то, что может читать другой скрипт.
Репутация продавца хот-догов
Репутация продавца хот-догов хранится в метаданных персонажа ai-core под ключом rep, в поле hotdog (там же, где QBCore хранит PlayerData.metadata.rep). Это целое число от 0 до Highest reputation из панели. ai-jobs читает её, когда арендуют ларёк, и записывает после каждого приготовленного хот-дога, сохраняя остальные поля rep как есть.
Сторона: сервер · Ожидание: нет
GetMeta(src: number, key: "rep"): { hotdog?: number; [other: string]: unknown } | nulllocal rep = exports['ai-core']:GetMeta(source, 'rep') -- таблица или nilВозвращает
Таблица rep персонажа или null / nil, если у игрока нет загруженного персонажа или он никогда не зарабатывал репутацию. hotdog отсутствует до первого приготовленного хот-дога.
Пример
import { addCommand, notify, resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
// /hotdogrep показывает игроку его репутацию продавца хот-догов.
addCommand("hotdogrep", { help: "Show your hot dog reputation" }, (source) => {
if (source === 0) return;
const rep = core.GetMeta(source, "rep") as { hotdog?: number } | null;
notify(source, `Hot dog reputation: ${rep?.hotdog ?? 0}`, "info");
});Записывайте репутацию только через SetMeta(source, "rep", { ...old, hotdog = value }), сохраняя остальные поля. Арендованный ларёк хранит значение, которое прочитал при аренде, и записывает своё значение после следующего хот-дога, поэтому изменение, сделанное, пока ларёк арендован, перезаписывается.
Рабочий транспорт
- Создаётся через
spawnVehicleиз lib, номерWORK<source>(серверный id работника), удаляется, когда смена заканчивается. - Работник получает ключи через слой ключей AI Core (
vehicleKeys.giveиз lib) с назначениемjob, поэтому их видит любой запущенный скрипт ключей. - Сломанная машина маршрута эвакуатора появляется запертой, без ключей, и удаляется на базе или когда смена заканчивается.
Деньги
Оплата маршрута идёт на Pay account маршрута с причиной операции work:<routeId> (например, work:taxi). Продажи хот-догов идут на Sales paid into. Обе показываются в истории операций ai-core.
Приватные события и колбэки
Это собственный контракт скрипта между клиентом и сервером (resource/common/routes.ts и resource/common/hotdog.ts). Сервер проверяет каждый вызов (расстояние, время, текущую остановку). Они могут меняться между версиями: не вызывайте и не слушайте их из других ресурсов.
| Имя | Направление | Что передаёт |
|---|---|---|
ai-jobs:start | client callback | (routeId): начать смену на базе, отвечает { ok }. |
ai-jobs:stop | client callback | (): закончить смену. |
ai-jobs:arrive | client callback | (stopId, underwater): работа на остановке; сервер запускает полосу прогресса, затем платит. |
ai-jobs:client:shift | server -> worker | (shift | null): текущая остановка или null, когда смена закончилась. |
ai-jobs:client:attach | server -> towed car's owner | (carNetId, flatbedNetId): прицепить эвакуируемую машину к платформе. |
ai-jobs
Рабочие маршруты, которые начинаются на базе (такси, автобус, дальнобойщик, мусоровоз, новости, эвакуатор, переработка, виноградник, дайвинг), и ларёк с хот-догами.
ai-police
Работа полиции для офицеров на дежурстве: наручники, сопровождение, посадка в транспорт, обыск, штраф, отправка в тюрьму и на штрафстоянку, а также участки для дежурства и вызовы при стрельбе.