-
Notifications
You must be signed in to change notification settings - Fork 2
Context API Contexts RU
Главная ▸ Context API ▸ Контексты
Контекст - это класс, экземпляр которого создаётся при инициализации чего-либо (например: при подключении игрока).
Контекст может состоять из дочерних контекстов:
// index.ts
import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";
@Context([A, B])
export class Mode extends GameMode.Context {
public onInit(): void {
console.log("[Mode] Init!");
}
}
// a.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";
@Context()
export class A extends GameMode.Context {
public onInit(): void {
console.log("[Mode][A] Init!");
}
}
// b.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";
@Context()
export class B extends GameMode.Context {
public onInit(): void {
console.log("[Mode][B] Init!");
}
}
Вывод:
[Mode] Init!
[Mode][A] Init!
[Mode][B] Init!
Импорт контекста - это получение экземпляра контекста.
Импорт между контекстами:
// mode.gctx.ts
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";
@Context([A, B])
export class Mode extends GameMode.Context {
@Import(() => A)
public readonly a: A;
public onInit(): void {
console.log("[Mode] Init!");
console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
}
public multi(a: number, b: number): number {
return a * b;
}
}
// a.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {B} from "./b.gtx";
@Context()
export class A extends GameMode.Context {
@Import(() => B)
public readonly b: B;
public onInit(): void {
console.log("[Mode][A] Init!");
console.log(`[Mode][A] 12 - 7 = ${this.b.minus(12, 7)};`);
}
public plus(a: number, b: number): number {
return a + b;
}
}
// b.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {Mode} from "./mode.gctx";
@Context()
export class B extends GameMode.Context {
@Import(() => Mode)
public readonly mode: Mode;
public onInit(): void {
console.log("[Mode][B] Init!");
console.log(`[Mode][B] 3 * 4 = ${this.mode.multi(3, 4)};`);
}
public minus(a: number, b: number): number {
return a - b;
}
}
Вывод:
[Mode] Init!
[Mode] 2 + 3 = 5;
[Mode][B] Init!
[Mode][B] 3 * 4 = 12;
[Mode][A] Init!
[Mode][A] 12 - 7 = 5;
Импорт возможен без передачи аргументов () => A
:
Убедитесь, что включён флаг компиляции "emitDecoratorMetadata": true
!
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";
@Context([A, B])
export class Mode extends GameMode.Context {
@Import()
public readonly a: A;
public onInit(): void {
console.log("[Mode] Init!");
console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
}
public multi(a: number, b: number): number {
return a * b;
}
}
Пример:
import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";
@Context()
export class Mode extends GameMode.Context {
public handleContextCreate(): void {
super.handleContextCreate();
console.log("handleContextCreate");
}
public handleContextDestroy(): void {
super.handleContextDestroy();
console.log("handleContextDestroy");
}
}
Где handleContextCreate
- обработчик создания контекста, handleContextDestroy
- обработчик уничтожения контекста.
Замороженный контекст - это контекст, у которого не вызываются события.
Заморозка распространяется на дочерние контексты.
Есть 2 способа заморозить контекст:
Использовать предоставляемую функциональность:
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";
@Context([A, B])
export class Mode extends GameMode.Context {
@Import()
public readonly a: A;
public handleContextCreate(): void {
super.handleContextCreate();
this.freeze();
}
public onInit(): void {
console.log("[Mode] Init!");
console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
}
public multi(a: number, b: number): number {
return a * b;
}
}
Где freeze
- это метод, который замораживает контекст.
Чтобы разморозить контекст, используйте метод unfreeze
.
Вывод будет пустым.
Переопределение метода проверяющего, замороженный ли контекст:
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";
@Context([A, B])
export class Mode extends GameMode.Context {
@Import()
public readonly a: A;
public isFrozen(): boolean {
return true;
}
public onInit(): void {
console.log("[Mode] Init!");
console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
}
public multi(a: number, b: number): number {
return a * b;
}
}
Где isFrozen
- это метод, проверяющий заморожен ли контекст.
Вывод будет пустым.
Чтобы проверить, заморожен ли контекст и его родители, используйте метод isFrozenStrict
.
В контексте доступны 6 методов цикла событий setTimeout
, clearTimeout
, setInterval
, clearInterval
, setImmediate
и clearImmediate
.
Отличия от обычного цикла событий:
- Не выполняется, когда контекст замороженный.
- Очищается, когда контекст уничтожается.
Это является дополнительным функционалом для контекстов!
Пример:
import {GameMode, Rcon} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";
@Context()
export class Mode extends GameMode.Context {
public handleContextCreate(): void {
super.handleContextCreate();
console.log("[Mode] handleContextCreate");
}
public handleContextDestroy(): void {
console.log("[Mode] handleContextDestroy");
super.handleContextDestroy();
}
public onInit(): void {
console.log("[Mode] Init!");
this.setInterval(() => console.log("[Mode] 1s"), 1000);
this.setTimeout(() => Rcon.send("exit"), 3000);
}
public onExit(): void {
console.log("[Mode] Exit!");
}
}
- Getting started [RU]
- Configuration [RU]
- Command line interface (CLI) [RU]
- Examples [RU]
- Player commands [RU]
- Keyboard [RU]
- Dialogs [RU]
- Groups [RU]
- Context API [RU]
- AMX API [RU]