@sagl/server 0.0.0-stage → 0.1.0-next.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +61 -2
- package/dist/actions.d.ts +46 -0
- package/dist/actions.js +80 -0
- package/dist/actions.js.map +1 -0
- package/dist/animations.d.ts +32 -0
- package/dist/animations.js +95 -0
- package/dist/animations.js.map +1 -0
- package/dist/audio.d.ts +180 -0
- package/dist/audio.js +353 -0
- package/dist/audio.js.map +1 -0
- package/dist/audio_effects.d.ts +219 -0
- package/dist/audio_effects.js +84 -0
- package/dist/audio_effects.js.map +1 -0
- package/dist/camera.d.ts +188 -0
- package/dist/camera.js +247 -0
- package/dist/camera.js.map +1 -0
- package/dist/claims.d.ts +27 -0
- package/dist/claims.js +48 -0
- package/dist/claims.js.map +1 -0
- package/dist/commands.d.ts +135 -0
- package/dist/commands.js +373 -0
- package/dist/commands.js.map +1 -0
- package/dist/console.d.ts +21 -0
- package/dist/console.js +100 -0
- package/dist/console.js.map +1 -0
- package/dist/constants.d.ts +654 -0
- package/dist/constants.js +657 -0
- package/dist/constants.js.map +1 -0
- package/dist/cutscene.d.ts +47 -0
- package/dist/cutscene.js +190 -0
- package/dist/cutscene.js.map +1 -0
- package/dist/draw.d.ts +106 -0
- package/dist/draw.js +132 -0
- package/dist/draw.js.map +1 -0
- package/dist/effects.d.ts +91 -0
- package/dist/effects.js +116 -0
- package/dist/effects.js.map +1 -0
- package/dist/gangzones.d.ts +47 -0
- package/dist/gangzones.js +122 -0
- package/dist/gangzones.js.map +1 -0
- package/dist/geo.d.ts +11 -0
- package/dist/geo.js +25 -0
- package/dist/geo.js.map +1 -0
- package/dist/hud.d.ts +159 -0
- package/dist/hud.js +247 -0
- package/dist/hud.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +81 -0
- package/dist/interaction.js +143 -0
- package/dist/interaction.js.map +1 -0
- package/dist/junctions.d.ts +1 -0
- package/dist/junctions.js +330 -0
- package/dist/junctions.js.map +1 -0
- package/dist/map.d.ts +55 -0
- package/dist/map.js +71 -0
- package/dist/map.js.map +1 -0
- package/dist/menu.d.ts +96 -0
- package/dist/menu.js +129 -0
- package/dist/menu.js.map +1 -0
- package/dist/mission.d.ts +482 -0
- package/dist/mission.js +1258 -0
- package/dist/mission.js.map +1 -0
- package/dist/models.d.ts +56 -0
- package/dist/models.js +71 -0
- package/dist/models.js.map +1 -0
- package/dist/modshop.d.ts +229 -0
- package/dist/modshop.js +904 -0
- package/dist/modshop.js.map +1 -0
- package/dist/modshop_data.d.ts +44 -0
- package/dist/modshop_data.js +287 -0
- package/dist/modshop_data.js.map +1 -0
- package/dist/native.d.ts +809 -0
- package/dist/native.js +27 -0
- package/dist/native.js.map +1 -0
- package/dist/objects.d.ts +249 -0
- package/dist/objects.js +455 -0
- package/dist/objects.js.map +1 -0
- package/dist/paint.d.ts +124 -0
- package/dist/paint.js +84 -0
- package/dist/paint.js.map +1 -0
- package/dist/paynspray.d.ts +44 -0
- package/dist/paynspray.js +177 -0
- package/dist/paynspray.js.map +1 -0
- package/dist/ped.d.ts +335 -0
- package/dist/ped.js +536 -0
- package/dist/ped.js.map +1 -0
- package/dist/player.d.ts +685 -0
- package/dist/player.js +1163 -0
- package/dist/player.js.map +1 -0
- package/dist/screeneffects.d.ts +99 -0
- package/dist/screeneffects.js +257 -0
- package/dist/screeneffects.js.map +1 -0
- package/dist/scripts.d.ts +69 -0
- package/dist/scripts.js +125 -0
- package/dist/scripts.js.map +1 -0
- package/dist/server.d.ts +713 -0
- package/dist/server.js +1080 -0
- package/dist/server.js.map +1 -0
- package/dist/shopblips.d.ts +9 -0
- package/dist/shopblips.js +30 -0
- package/dist/shopblips.js.map +1 -0
- package/dist/special.d.ts +33 -0
- package/dist/special.js +26 -0
- package/dist/special.js.map +1 -0
- package/dist/splash.d.ts +42 -0
- package/dist/splash.js +55 -0
- package/dist/splash.js.map +1 -0
- package/dist/text.d.ts +19 -0
- package/dist/text.js +25 -0
- package/dist/text.js.map +1 -0
- package/dist/ui.d.ts +141 -0
- package/dist/ui.js +243 -0
- package/dist/ui.js.map +1 -0
- package/dist/vehicle.d.ts +306 -0
- package/dist/vehicle.js +612 -0
- package/dist/vehicle.js.map +1 -0
- package/dist/vehiclecolors.d.ts +26 -0
- package/dist/vehiclecolors.js +49 -0
- package/dist/vehiclecolors.js.map +1 -0
- package/dist/world.d.ts +222 -0
- package/dist/world.js +227 -0
- package/dist/world.js.map +1 -0
- package/dist/zone.d.ts +89 -0
- package/dist/zone.js +140 -0
- package/dist/zone.js.map +1 -0
- package/package.json +33 -4
package/dist/native.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Loads the C++ addon (build/Release/sagl_native.node) and describes its
|
|
2
|
+
// shape. Internal: gamemodes use Server and Player instead.
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
// The addon for this computer: the platform package npm installed beside
|
|
6
|
+
// this one (@sagl/server-linux-x64, -win32-x64), else a local build (a
|
|
7
|
+
// checkout: `npm run build:native`, or the Windows server zip).
|
|
8
|
+
function load() {
|
|
9
|
+
const platform = `${process.platform}-${process.arch}`;
|
|
10
|
+
const tried = [];
|
|
11
|
+
for (const path of [`@sagl/server-${platform}`, "../build/Release/sagl_native.node"]) {
|
|
12
|
+
try {
|
|
13
|
+
return require(path);
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
const code = e.code;
|
|
17
|
+
if (code !== "MODULE_NOT_FOUND")
|
|
18
|
+
throw e; // there, but it wouldn't load: say why
|
|
19
|
+
tried.push(path);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`@sagl/server has no server for ${platform} (tried ${tried.join(", ")}). ` +
|
|
23
|
+
"It runs on Linux x64 (glibc 2.28 or newer) and Windows x64. On another platform, build it from source: " +
|
|
24
|
+
"see the README in the SAGL repository.");
|
|
25
|
+
}
|
|
26
|
+
export const native = load();
|
|
27
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AACA,yEAAyE;AACzE,4DAA4D;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6jB5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,yEAAyE;AACzE,uEAAuE;AACvE,gEAAgE;AAChE,SAAS,IAAI;IACX,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,QAAQ,EAAE,EAAE,mCAAmC,CAAC,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,IAAI,CAAiB,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,CAAC;YAC/C,IAAI,IAAI,KAAK,kBAAkB;gBAAE,MAAM,CAAC,CAAC,CAAE,uCAAuC;YAClF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,kCAAkC,QAAQ,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;QAC1E,yGAAyG;QACzG,wCAAwC,CACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAiB,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import type { NativeServer } from "./native.js";
|
|
2
|
+
import { type MapColor } from "./map.js";
|
|
3
|
+
import { Ped } from "./ped.js";
|
|
4
|
+
import { Player, type Vector3 } from "./player.js";
|
|
5
|
+
import { Vehicle } from "./vehicle.js";
|
|
6
|
+
/** Rotation in degrees about x, y and z (z: the heading). */
|
|
7
|
+
export interface Rotation {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
z: number;
|
|
11
|
+
}
|
|
12
|
+
type Sender<S> = (player: Player, spec: S) => void;
|
|
13
|
+
/** @internal Something sent to some players (or everyone, players joining later too). */
|
|
14
|
+
export declare class Broadcast<S extends {
|
|
15
|
+
id: number;
|
|
16
|
+
}> {
|
|
17
|
+
#private;
|
|
18
|
+
spec: S;
|
|
19
|
+
constructor(send: Sender<S>, players: () => Player[], to: readonly Player[] | undefined, spec: S);
|
|
20
|
+
sees(player: Player): boolean;
|
|
21
|
+
sendAll(extra?: Partial<S>): void;
|
|
22
|
+
replay(player: Player): void;
|
|
23
|
+
/** Every connected player who sees it. */
|
|
24
|
+
each(fn: (player: Player) => void): void;
|
|
25
|
+
}
|
|
26
|
+
export interface ObjectOptions {
|
|
27
|
+
/** Default true. */
|
|
28
|
+
collision?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Makes it breakable: players' shots, blows and cars wear this down, and
|
|
31
|
+
* at 0 it's destroyed for everyone (`onDestroyed`). Left out: nothing
|
|
32
|
+
* breaks it.
|
|
33
|
+
*/
|
|
34
|
+
health?: number;
|
|
35
|
+
/** Who sees it. Default everyone (players joining later too). */
|
|
36
|
+
visibleTo?: readonly Player[];
|
|
37
|
+
/** The interior it's in (0 outside, the default); -1: every interior. */
|
|
38
|
+
interior?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Made in each player's game only within this far of them (m). Default
|
|
41
|
+
* 300. Each game holds the nearest few hundred objects at most: thousands
|
|
42
|
+
* can be placed, they come and go as players move (as SA-MP's streamer).
|
|
43
|
+
*/
|
|
44
|
+
streamDistance?: number;
|
|
45
|
+
}
|
|
46
|
+
type ObjectSpec = Parameters<NativeServer["serverObject"]>[1] & {
|
|
47
|
+
id: number;
|
|
48
|
+
};
|
|
49
|
+
type MaterialSpec = Parameters<NativeServer["objectMaterial"]>[1];
|
|
50
|
+
/** A material's new texture (`object.setMaterial`). */
|
|
51
|
+
export interface MaterialOptions {
|
|
52
|
+
/**
|
|
53
|
+
* A texture from a model's textures: `model` (a game model, or a custom
|
|
54
|
+
* model's id: then its own TXD), the dictionary `txd` (a game model's:
|
|
55
|
+
* the name its TXD has, as SA-MP's txdname) and the `texture` in it.
|
|
56
|
+
*/
|
|
57
|
+
model?: number;
|
|
58
|
+
txd?: string;
|
|
59
|
+
texture?: string;
|
|
60
|
+
/** Or an image client file (PNG or JPG) as its texture. */
|
|
61
|
+
image?: string;
|
|
62
|
+
/** Tints it (its own texture, or the new one): `"#RRGGBB[AA]"` or 0xRRGGBBAA. */
|
|
63
|
+
color?: MapColor;
|
|
64
|
+
}
|
|
65
|
+
/** Text drawn as a material (`object.setMaterialText`). */
|
|
66
|
+
export interface MaterialTextOptions {
|
|
67
|
+
/** The canvas (`MaterialSize`). Default 256x128. */
|
|
68
|
+
size?: number;
|
|
69
|
+
/** A font by name, as Windows has them (SA-MP's: "Arial", "Courier New"...). Default Arial. */
|
|
70
|
+
font?: string;
|
|
71
|
+
/** Its height in the canvas' pixels. Default 24. */
|
|
72
|
+
fontSize?: number;
|
|
73
|
+
bold?: boolean;
|
|
74
|
+
/** Default white. `{RRGGBB}` in the text colours what follows. */
|
|
75
|
+
color?: MapColor;
|
|
76
|
+
/** Behind the text; default none (clear: the object shows through). */
|
|
77
|
+
background?: MapColor;
|
|
78
|
+
/** `MaterialTextAlign`. Default left. */
|
|
79
|
+
align?: number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* One of the server's objects (`server.createObject()`): any of the game's
|
|
83
|
+
* object models, where you put it. Players' games never move or break it
|
|
84
|
+
* on their own; the server moves it (`move()`) and decides its damage.
|
|
85
|
+
*/
|
|
86
|
+
export declare class GameObject {
|
|
87
|
+
#private;
|
|
88
|
+
readonly id: number;
|
|
89
|
+
readonly model: number;
|
|
90
|
+
/** @internal */
|
|
91
|
+
constructor(id: number, model: number, b: Broadcast<ObjectSpec>, health: number, forget: (o: GameObject) => void, sendMaterial: (p: Player, m: MaterialSpec) => void);
|
|
92
|
+
/**
|
|
93
|
+
* Draws one of its model's materials (`index`, 0-15, in the order the
|
|
94
|
+
* model has them) otherwise, as SA-MP's SetObjectMaterial: another
|
|
95
|
+
* texture (from any model's textures, a custom model's, or an image
|
|
96
|
+
* client file), tinted, or both. Only this object changes.
|
|
97
|
+
*
|
|
98
|
+
* ```ts
|
|
99
|
+
* atm.setMaterial(1, { model: 2942, txd: "kmb_atmx", texture: "kmb_chip1" }); // a game texture
|
|
100
|
+
* atm.setMaterial(1, { image: "textures/poster.png" }); // your own picture
|
|
101
|
+
* atm.setMaterial(0, { color: "#ff3030" }); // its own, tinted
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
setMaterial(index: number, options: MaterialOptions): void;
|
|
105
|
+
/**
|
|
106
|
+
* Text as one of its materials, as SA-MP's SetObjectMaterialText: drawn
|
|
107
|
+
* on a canvas (`MaterialSize`) in place of its texture. `\n` breaks a
|
|
108
|
+
* line; `{RRGGBB}` colours what follows.
|
|
109
|
+
*
|
|
110
|
+
* ```ts
|
|
111
|
+
* atm.setMaterialText(1, "{ffcc00}SAGL\nBANK", { size: MaterialSize.Size256x128, fontSize: 48, bold: true, align: MaterialTextAlign.Center });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
setMaterialText(index: number, text: string, options?: MaterialTextOptions): void;
|
|
115
|
+
/** Material `index` as its model has it again (or all, with none given). */
|
|
116
|
+
resetMaterial(index?: number): void;
|
|
117
|
+
get exists(): boolean;
|
|
118
|
+
get position(): Vector3;
|
|
119
|
+
get rotation(): Rotation;
|
|
120
|
+
/** Its health (breakable ones), or Infinity. */
|
|
121
|
+
get health(): number;
|
|
122
|
+
/**
|
|
123
|
+
* Glides it to `position` (and `rotation`) over `ms` (0: puts it there).
|
|
124
|
+
* Resolves when it's there: gates, shutters, lifts.
|
|
125
|
+
*/
|
|
126
|
+
move(position: Vector3, rotation?: Rotation, ms?: number): Promise<void>;
|
|
127
|
+
/** Collision on or off (walk through it, or not). */
|
|
128
|
+
set collision(on: boolean);
|
|
129
|
+
/**
|
|
130
|
+
* `fn(player, damage, weapon)` when a player hurts it (breakable ones),
|
|
131
|
+
* before it counts: return false to ignore it, or a number for the
|
|
132
|
+
* damage it does instead.
|
|
133
|
+
*/
|
|
134
|
+
onHit(fn: (player: Player, damage: number, weapon: number) => number | boolean | void): this;
|
|
135
|
+
/** `fn(by)` when it's destroyed by damage (`by`: whoever did it). */
|
|
136
|
+
onDestroyed(fn: (by: Player | null) => void): this;
|
|
137
|
+
/** Takes it away for everyone; `shatter` breaks it apart first (glass, crates). */
|
|
138
|
+
destroy(options?: {
|
|
139
|
+
shatter?: boolean;
|
|
140
|
+
}): void;
|
|
141
|
+
/** @internal */
|
|
142
|
+
replay(player: Player): void;
|
|
143
|
+
/** @internal */
|
|
144
|
+
hit(player: Player, damage: number, weapon: number): void;
|
|
145
|
+
}
|
|
146
|
+
export interface PickupOptions {
|
|
147
|
+
/** Where it floats. */
|
|
148
|
+
position: Vector3;
|
|
149
|
+
/** A weapon (`Weapon`), with `ammo` (default 30): its model, and given on pickup. */
|
|
150
|
+
weapon?: number;
|
|
151
|
+
ammo?: number;
|
|
152
|
+
/** Health: brings theirs up to at least this (the game's heart: 100). */
|
|
153
|
+
health?: number;
|
|
154
|
+
/** Armour: brings theirs up to at least this. */
|
|
155
|
+
armour?: number;
|
|
156
|
+
/** Money: given. */
|
|
157
|
+
money?: number;
|
|
158
|
+
/** Any model instead (its look); give nothing unless `onPickup` does. */
|
|
159
|
+
model?: number;
|
|
160
|
+
/** Back this long (ms) after it's taken. Left out: taken once, then gone. */
|
|
161
|
+
respawn?: number;
|
|
162
|
+
/** Vehicles pick it up too. Default false. */
|
|
163
|
+
inVehicle?: boolean;
|
|
164
|
+
/** Who sees (and can take) it. Default everyone. */
|
|
165
|
+
visibleTo?: readonly Player[];
|
|
166
|
+
/** Floating text over it (see `server.labels`). */
|
|
167
|
+
label?: string;
|
|
168
|
+
/** The interior it's in (0 outside, the default); -1: every interior. */
|
|
169
|
+
interior?: number;
|
|
170
|
+
}
|
|
171
|
+
type PickupSpec = Parameters<NativeServer["pickup"]>[1] & {
|
|
172
|
+
id: number;
|
|
173
|
+
};
|
|
174
|
+
/** A pickup (`server.createPickup()`). */
|
|
175
|
+
export declare class Pickup {
|
|
176
|
+
#private;
|
|
177
|
+
readonly id: number;
|
|
178
|
+
readonly options: Readonly<PickupOptions>;
|
|
179
|
+
/** @internal */
|
|
180
|
+
label: Label | null;
|
|
181
|
+
/** @internal */
|
|
182
|
+
constructor(id: number, options: PickupOptions, b: Broadcast<PickupSpec>, forget: (p: Pickup) => void, sound: (player: Player, sound: number) => void);
|
|
183
|
+
get exists(): boolean;
|
|
184
|
+
/** Taken, and not back yet. */
|
|
185
|
+
get taken(): boolean;
|
|
186
|
+
get position(): Vector3;
|
|
187
|
+
/**
|
|
188
|
+
* `fn(player)` when a player takes it, before they get what it holds:
|
|
189
|
+
* return false to refuse (it stays, they get nothing).
|
|
190
|
+
*/
|
|
191
|
+
onPickup(fn: (player: Player) => boolean | void): this;
|
|
192
|
+
/** Takes it away for everyone. */
|
|
193
|
+
remove(): void;
|
|
194
|
+
/** @internal */
|
|
195
|
+
replay(player: Player): void;
|
|
196
|
+
/** @internal Their game says they walked into it: checked, then given. */
|
|
197
|
+
touch(player: Player): void;
|
|
198
|
+
}
|
|
199
|
+
export type LabelTarget = Vector3 | Ped | Player | Vehicle | GameObject | Pickup;
|
|
200
|
+
export interface LabelOptions {
|
|
201
|
+
/** Default white. */
|
|
202
|
+
color?: MapColor;
|
|
203
|
+
/** Seen up to this far (m). Default 20. */
|
|
204
|
+
distance?: number;
|
|
205
|
+
/** Shown through walls. Default false. */
|
|
206
|
+
throughWalls?: boolean;
|
|
207
|
+
/** From what it's on (m). Default above it: a ped's or player's head, a vehicle's roof. */
|
|
208
|
+
offset?: Vector3;
|
|
209
|
+
/** Who sees it. Default everyone (players joining later too). */
|
|
210
|
+
to?: readonly Player[];
|
|
211
|
+
/** The interior it's shown in (0 outside); -1: every interior. Default 0 at a spot, -1 on something (it goes where that goes). */
|
|
212
|
+
interior?: number;
|
|
213
|
+
}
|
|
214
|
+
type LabelSpec = Parameters<NativeServer["label"]>[1] & {
|
|
215
|
+
id: number;
|
|
216
|
+
};
|
|
217
|
+
/** Floating text in the world (`server.labels.add()`). */
|
|
218
|
+
export declare class Label {
|
|
219
|
+
#private;
|
|
220
|
+
readonly id: number;
|
|
221
|
+
/** @internal What it's on (LabelSpec.on, target). */
|
|
222
|
+
readonly on: number;
|
|
223
|
+
/** @internal */
|
|
224
|
+
readonly target: number;
|
|
225
|
+
/** @internal */
|
|
226
|
+
constructor(id: number, b: Broadcast<LabelSpec>, forget: (l: Label) => void);
|
|
227
|
+
/** Changes its text (game codes and `gxt()` work). */
|
|
228
|
+
set text(text: string);
|
|
229
|
+
get text(): string;
|
|
230
|
+
set color(color: MapColor);
|
|
231
|
+
remove(): void;
|
|
232
|
+
/** @internal */
|
|
233
|
+
replay(player: Player): void;
|
|
234
|
+
}
|
|
235
|
+
/** @internal The server's objects, pickups and labels. */
|
|
236
|
+
export declare class WorldThings {
|
|
237
|
+
#private;
|
|
238
|
+
objects: Map<number, GameObject>;
|
|
239
|
+
pickups: Map<number, Pickup>;
|
|
240
|
+
labels: Map<number, Label>;
|
|
241
|
+
constructor(native: NativeServer, players: () => Player[]);
|
|
242
|
+
createObject(model: number, position: Vector3, rotation?: Rotation, options?: ObjectOptions): GameObject;
|
|
243
|
+
createPickup(options: PickupOptions): Pickup;
|
|
244
|
+
addLabel(text: string, at: LabelTarget, options?: LabelOptions): Label;
|
|
245
|
+
/** Labels on something that's gone (its id may be another's later). */
|
|
246
|
+
forgetTarget(on: number, target: number): void;
|
|
247
|
+
replay(player: Player): void;
|
|
248
|
+
}
|
|
249
|
+
export {};
|