Мир
Время и погода через тот скрипт погоды, который запущен, routing buckets из распределителя ai-core, замки дверей и точки появления сохранённых персонажей.
import { world, buckets, doors, characters } from "@aicore-fivem/lib/server";world
Время и погода через ai-core, какой бы скрипт погоды ни был запущен (Renewed-Weathersync, av_weather, cd_easytime, qb-weathersync). Пока никакой не запущен, чтение отвечает null, а изменения отвечают false.
world.getWeather
Сторона: Сервер · Ждёт: нет
world.getWeather(): string | nulllocal weather = aiLib.world.getWeather()Возвращает текущий тип погоды так, как его сообщает скрипт погоды (CLEAR, RAIN...), или null, пока никакой не запущен.
const raining = ["RAIN", "THUNDER"].includes(world.getWeather() ?? "");world.setWeather
Задаёт погоду.
Сторона: Сервер · Ждёт: нет
world.setWeather(type: Weather): booleanlocal ok = aiLib.world.setWeather(weather)Prop
Type
Возвращает true, если задано, false, пока не запущен скрипт погоды или значение не является строкой.
import { addCommand, world } from "@aicore-fivem/lib/server";
import { isWeather } from "@aicore-fivem/shared";
addCommand("weather", { restricted: true, params: [{ name: "type", type: "string" }] }, (_source, { type }) => {
const upper = type.toUpperCase();
if (isWeather(upper)) world.setWeather(upper);
});world.getTime
Сторона: Сервер · Ждёт: нет
world.getTime(): { hour: number; minute: number } | nulllocal time = aiLib.world.getTime() -- { hour, minute } или nilВозвращает игровое время или null, пока не запущен скрипт погоды.
const time = world.getTime();
const night = time !== null && (time.hour >= 22 || time.hour < 6);world.setTime
Задаёт игровое время.
Сторона: Сервер · Ждёт: нет
world.setTime(hour: number, minute?: number): booleanlocal ok = aiLib.world.setTime(hour, minute)Prop
Type
Возвращает true, если задано, false, пока не запущен скрипт погоды.
world.setTime(12, 30);world.setBlackout
Включает или выключает блэкаут в городе.
Сторона: Сервер · Ждёт: нет
world.setBlackout(on: boolean): booleanlocal ok = aiLib.world.setBlackout(on)Возвращает true, если применено, false, пока не запущен скрипт погоды или в нём нет блэкаута.
world.setBlackout(true); // электростанцию вывели из строяworld.freezeTime
Останавливает или снова запускает игровые часы.
Сторона: Сервер · Ждёт: нет
world.freezeTime(on: boolean): booleanlocal ok = aiLib.world.freezeTime(on)Возвращает true, если применено, false, пока не запущен скрипт погоды или он не умеет замораживать время.
world.setTime(20, 0);
world.freezeTime(true);buckets
Routing buckets (отдельные миры: интерьер квартиры, инстанс) из распределителя ai-core, поэтому два скрипта никогда не получат один и тот же. Никогда не выбирайте номера buckets сами (1000 + n). Lua-аналога нет: вызывайте экспорты ai-core AcquireBucket(tag) / ReleaseBucket(id).
buckets.acquire
Берёт свободный bucket для этого ресурса. В нём нет населения (ни фоновых педов, ни машин) и действует строгая блокировка сущностей.
Сторона: Сервер · Ждёт: нет
buckets.acquire(tag: string): numberProp
Type
Возвращает id bucket.
import { buckets } from "@aicore-fivem/lib/server";
const bucket = buckets.acquire(`property:${propertyId}`);
SetPlayerRoutingBucket(String(source), bucket);buckets.release
Возвращает bucket, когда из него вышли игроки.
Сторона: Сервер · Ждёт: нет
buckets.release(id: number): booleanВозвращает true, если освобождён. Каждый bucket остановленного ресурса возвращается сам.
SetPlayerRoutingBucket(String(source), 0);
buckets.release(bucket);doors
Замки дверей через слой замков ai-core, по собственному id двери в скрипте замков. Lua-аналога нет: вызывайте экспорты ai-core SetDoorLocked, IsDoorLocked.
doors.setLocked
Запирает или отпирает дверь.
Сторона: Сервер · Ждёт: нет
doors.setLocked(id: string, locked: boolean, by?: number): booleanProp
Type
Возвращает true, если скрипт дверей принял вызов, иначе false.
if (outcome === "won") doors.setLocked("bank_vault", false, source);doors.isLocked
Сторона: Сервер · Ждёт: нет
doors.isLocked(id: string): boolean | nullВозвращает true или false либо null, если неизвестно (нет скрипта замков, нет такой двери или скрипт не может сказать это на сервере).
if (doors.isLocked("bank_vault") === false) return fail("ALREADY_OPEN");doors.provider
Сторона: Сервер · Ждёт: нет
doors.provider(): string | nullВозвращает скрипт замков, который отвечает, или null, если никакой не запущен.
console.log(`doors through ${doors.provider() ?? "nothing"}`);characters
Сохранённые персонажи через ai-core. Загруженные персонажи идут через online и экспорты игроков ai-core.
characters.setOfflinePosition
Перемещает точку появления сохранённого (не загруженного) персонажа, например спящего тела, которое унесли. ai-core записывает её, как только персонажа не удерживает сохранение при загрузке или выгрузке.
Сторона: Сервер · Ждёт: нет
characters.setOfflinePosition(charId: number, position: { x: number; y: number; z: number; heading?: number }): booleanLua-аналога нет: вызывайте экспорт ai-core SetOfflinePosition(charId, position).
Prop
Type
Возвращает true, если принято. false, если персонаж загружен или значения неверные.
characters.setOfflinePosition(sleeperCharId, { x: 340.2, y: -1396.7, z: 32.5, heading: 50 });Работы и службы
Полицейские оповещения, тюрьма, записи MDT, медики, реанимация и лечение, стресс, голод и жажда, определения работ и банд, прайм-тайм.
Телефон и внешность
Телефон игрока через ai-core (номера, письма, сообщения, уведомления) и сохранённая внешность персонажей через тот скрипт одежды, который запущен.