Erişim, blip’ler ve yer NPC’leri
readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields ve readPlacePed: her yerin paylaştığı panel parçaları.
Bir script’in eklediği yerlerin çoğu (bir market, bir depo, bir garaj, bir belediye binası) aynı üç panel parçasına sahiptir: kimin kullanabileceği, harita blip’i ve orada duran bir NPC. Her parça üçlü olarak gelir: schema.ts için bir veri tanımı, ai-core’un kendi etiketleriyle hazır panel alanları ve kaydedilen değer için bir okuyucu. Her script’in paneli aynı görünsün ve aynı davransın diye bunları kullan.
import { readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields, readPlacePed } from "@aicore-fivem/lib/shared";Lua: bunların hiçbirinin Lua karşılığı yok (admin paneli yalnızca TypeScript’tir).
Erişim
Kural bir AccessRule’dır: listelenen mesleklerden biri (minimum rütbesinde, onDuty ayarlıysa görevde) ya da listelenen çetelerden biri (minimum rütbesinde). İki liste de boşsa herkes demektir. Client kontrolü (allows(rule), bkz. Üyelik) ve server kontrolü (online.allows(source, rule), bkz. Oyuncular) aynı kararı kullanır; böylece oyuncunun gördüğü server’ın izin verdiğiyle eşleşir.
readAccess
Bir kaydın kendi alanlarından (jobs, gangs, grades, onDuty) bir erişim kuralı okur. Eksik alanlar herkesin kullanabileceği anlamına gelir.
Taraf: Client, server ve NUI · Bekler: hayır
readAccess(value: unknown): AccessRuleParametreler
Prop
Type
Dönüş değeri
AccessRule. String olmayan adlar atılır; 0 ya da daha büyük tam sayı olmayan rütbeler atılır.
Örnek
import { readAccess } from "@aicore-fivem/lib/shared";
readAccess({ label: "Armoury", jobs: ["police"], grades: { police: 2 }, onDuty: true });
// { jobs: ["police"], gangs: [], grades: { police: 2 }, onDuty: true }isPublic
Bir kuralın herkesi içeri alıp almadığı (hiç meslek ve hiç çete listelenmemiş). Kontrolleri atlamak ve bir yeri herkese göstermek için kullan.
Taraf: Client, server ve NUI · Bekler: hayır
isPublic(rule: AccessRule): booleanParametreler
Prop
Type
Dönüş değeri
Hem jobs hem gangs boşsa true.
Örnek
import { isPublic, readAccess } from "@aicore-fivem/lib/shared";
isPublic(readAccess({})); // truedecideAccess
Bir oyuncunun üyeliklerinden kuralın kararı. Client’ın allows’u ve server’ın online.allows’u bunu senin için çağırır; onu yalnızca üyelikleri başka bir yoldan tuttuğunda (bir NUI sayfası, bir test) kendin çağır.
Taraf: Client, server ve NUI · Bekler: hayır
decideAccess(
rule: AccessRule,
jobs: ReadonlyArray<{ job: string; grade: number }>,
gangs: ReadonlyArray<{ gang: string; grade: number }>,
dutyJob: string | null,
): booleanParametreler
Prop
Type
Dönüş değeri
Kural herkese açıksa, listelenen bir çete minimum rütbesinde eşleşiyorsa ya da listelenen bir meslek minimum rütbesinde eşleşiyorsa (ve onDuty ayarlıysa oyuncu o meslekte görevdeyse) true.
Örnek
import { decideAccess, readAccess } from "@aicore-fivem/lib/shared";
const rule = readAccess({ jobs: ["police"], grades: { police: 2 }, onDuty: true });
decideAccess(rule, [{ job: "police", grade: 3 }], [], "police"); // true
decideAccess(rule, [{ job: "police", grade: 3 }], [], null); // false: görevde değilACCESS_FIELDS
Erişim alanlarının veri tanımı; schema.ts içindeki bir records dosyasının sections’ına yayılmak için.
Taraf: Client, server ve NUI · Bekler: hayır
const ACCESS_FIELDS: Record<string, DataSpec>
// { jobs: meslek aramalı adlar, isteğe bağlı; gangs: çete aramalı adlar, isteğe bağlı; onDuty: bool, isteğe bağlı }Örnek
import { ACCESS_FIELDS } from "@aicore-fivem/lib/shared";
const stashSections = {
label: { type: "text", min: 1, max: 48 },
coords: { type: "vec3" },
...ACCESS_FIELDS,
};accessFields
Erişim kuralının panel alanları (meslek etiketleri, çete etiketleri, bir görevde anahtarı); ai-core’un kendi panel etiketleri ve ipuçları zaten ayarlı.
Taraf: Client, server ve NUI · Bekler: hayır
accessFields(): WidgetSpec[]Dönüş değeri
WidgetSpec[]: jobs, gangs ve onDuty yollarında üç alan. Onları panelinin tabs’ındaki bir kartın fields’ına yay.
Örnek
import { accessFields } from "@aicore-fivem/lib/shared";
import type { CardSpec } from "@aicore-fivem/shared";
const accessCard: CardSpec = { icon: "lock", title: "ADMIN_CARD_ACCESS", fields: [...accessFields()] };ACCESS_FIELDS ve accessFields() yalnızca jobs, gangs ve onDuty’yi kapsar. readAccess, kayıtta varsa grades’i ({ police: 2 }) de okur; o olmadan listelenen her meslek ya da çete 0 rütbesini gerektirir.
Blip’ler
readBlipStyle
Panel verisinden bir blip stili okur. Eksik ya da hatalı her parça yedekten gelir; değerler aralıkta tutulur (sprite 0-1000, renk 0-100, ölçek 0.3-2).
Taraf: Client, server ve NUI · Bekler: hayır
readBlipStyle(value: unknown, fallback: BlipStyle): BlipStyleParametreler
Prop
Type
Dönüş değeri
Bir BlipStyle.
Örnek
import { readBlipStyle } from "@aicore-fivem/lib/shared";
readBlipStyle({ sprite: 52, color: 500 }, { sprite: 52, color: 2, scale: 0.8 });
// { sprite: 52, color: 100, scale: 0.8 }: renk sıkıştırıldı, ölçek yedektenBLIP_STYLE_FIELDS
Bir blip stilinin alanlarının veri tanımı; schema.ts içinde { type: "object", fields: BLIP_STYLE_FIELDS } için. Panel onu blip widget’ıyla gösterir.
Taraf: Client, server ve NUI · Bekler: hayır
const BLIP_STYLE_FIELDS: Record<string, DataSpec>
// sprite: tam sayı 0-1000, color: tam sayı 0-100, scale: sayı 0.3-2Örnek
import { BLIP_STYLE_FIELDS } from "@aicore-fivem/lib/shared";
const sections = {
blip: { type: "bool" },
blipStyle: { type: "object", optional: true, fields: BLIP_STYLE_FIELDS },
};Yer NPC’leri
PLACE_PED_SPEC
Bir yerin ped bölümünün veri tanımı: model, bekleme senaryosu ve konum, hepsi isteğe bağlı. Modeli olmayan bir yerin NPC’si yoktur.
Taraf: Client, server ve NUI · Bekler: hayır
const PLACE_PED_SPEC: DataSpec
// { type: "object", optional: true, fields: { model: 64’e kadar metin, scenario: sunulan senaryolardan biri, coords: vec4 } }Panelin sunduğu senaryolar: yok (hareketsiz durur), WORLD_HUMAN_STAND_IMPATIENT, WORLD_HUMAN_CLIPBOARD, WORLD_HUMAN_STAND_MOBILE, WORLD_HUMAN_AA_COFFEE, WORLD_HUMAN_SMOKING, WORLD_HUMAN_GUARD_STAND, WORLD_HUMAN_COP_IDLES, WORLD_HUMAN_HANG_OUT_STREET.
Örnek
import { PLACE_PED_SPEC } from "@aicore-fivem/lib/shared";
const sections = { ped: PLACE_PED_SPEC, label: { type: "text", min: 1, max: 48 } };placePedFields
Bir yerin NPC’sinin panel alanları: bir ped model seçici, bir senaryo seçimi ve zemine oturan, heading’li bir nokta aracı. Etiketler ai-core’un kendisinindir.
Taraf: Client, server ve NUI · Bekler: hayır
placePedFields(path?: string): WidgetSpec[]Parametreler
Prop
Type
Dönüş değeri
WidgetSpec[]: <path>.model, <path>.scenario ve <path>.coords yollarında üç alan.
Örnek
import { placePedFields } from "@aicore-fivem/lib/shared";
import type { CardSpec } from "@aicore-fivem/shared";
const npcCard: CardSpec = { icon: "user", title: "ADMIN_CARD_NPC", fields: [...placePedFields()] };readPlacePed
Panel verisinden bir yerin NPC’sini okur.
Taraf: Client, server ve NUI · Bekler: hayır
readPlacePed(value: unknown): PlacePed | nullParametreler
Prop
Type
Dönüş değeri
Bir PlacePed ya da model yoksa (yerin NPC’si yok) null. x, y, z ve heading’in hepsi sayı değilse coords dışarıda bırakılır; boş bir senaryo dışarıda bırakılır.
Örnek
import { readPlacePed, readBlipStyle, readAccess, str, type PlacePed, type BlipStyle, type AccessRule } from "@aicore-fivem/lib/shared";
export interface Shop {
label: string;
ped: PlacePed | null;
blipStyle: BlipStyle;
access: AccessRule;
}
export function readShop(id: string, v: Record<string, unknown>): Shop {
return {
label: str(v.label, id, 48),
ped: readPlacePed(v.ped),
blipStyle: readBlipStyle(v.blipStyle, { sprite: 52, color: 2, scale: 0.8 }),
access: readAccess(v),
};
}Client’ta shop.ped ?? undefined’ı bir Points noktasının ped seçeneği olarak geçir: nokta NPC’yi oluşturur ve target seçeneğini onun üzerine koyar.