@sagl/server 0.0.0-stage → 0.1.0-next.49

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.
Files changed (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +61 -2
  3. package/dist/actions.d.ts +46 -0
  4. package/dist/actions.js +80 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/animations.d.ts +32 -0
  7. package/dist/animations.js +95 -0
  8. package/dist/animations.js.map +1 -0
  9. package/dist/audio.d.ts +180 -0
  10. package/dist/audio.js +353 -0
  11. package/dist/audio.js.map +1 -0
  12. package/dist/audio_effects.d.ts +219 -0
  13. package/dist/audio_effects.js +84 -0
  14. package/dist/audio_effects.js.map +1 -0
  15. package/dist/camera.d.ts +188 -0
  16. package/dist/camera.js +247 -0
  17. package/dist/camera.js.map +1 -0
  18. package/dist/claims.d.ts +27 -0
  19. package/dist/claims.js +48 -0
  20. package/dist/claims.js.map +1 -0
  21. package/dist/commands.d.ts +135 -0
  22. package/dist/commands.js +373 -0
  23. package/dist/commands.js.map +1 -0
  24. package/dist/console.d.ts +21 -0
  25. package/dist/console.js +100 -0
  26. package/dist/console.js.map +1 -0
  27. package/dist/constants.d.ts +654 -0
  28. package/dist/constants.js +657 -0
  29. package/dist/constants.js.map +1 -0
  30. package/dist/cutscene.d.ts +47 -0
  31. package/dist/cutscene.js +190 -0
  32. package/dist/cutscene.js.map +1 -0
  33. package/dist/draw.d.ts +106 -0
  34. package/dist/draw.js +132 -0
  35. package/dist/draw.js.map +1 -0
  36. package/dist/effects.d.ts +91 -0
  37. package/dist/effects.js +116 -0
  38. package/dist/effects.js.map +1 -0
  39. package/dist/gangzones.d.ts +47 -0
  40. package/dist/gangzones.js +122 -0
  41. package/dist/gangzones.js.map +1 -0
  42. package/dist/geo.d.ts +11 -0
  43. package/dist/geo.js +25 -0
  44. package/dist/geo.js.map +1 -0
  45. package/dist/hud.d.ts +159 -0
  46. package/dist/hud.js +247 -0
  47. package/dist/hud.js.map +1 -0
  48. package/dist/index.d.ts +40 -0
  49. package/dist/index.js +43 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/interaction.d.ts +81 -0
  52. package/dist/interaction.js +143 -0
  53. package/dist/interaction.js.map +1 -0
  54. package/dist/junctions.d.ts +1 -0
  55. package/dist/junctions.js +330 -0
  56. package/dist/junctions.js.map +1 -0
  57. package/dist/map.d.ts +55 -0
  58. package/dist/map.js +71 -0
  59. package/dist/map.js.map +1 -0
  60. package/dist/menu.d.ts +96 -0
  61. package/dist/menu.js +129 -0
  62. package/dist/menu.js.map +1 -0
  63. package/dist/mission.d.ts +482 -0
  64. package/dist/mission.js +1258 -0
  65. package/dist/mission.js.map +1 -0
  66. package/dist/models.d.ts +56 -0
  67. package/dist/models.js +71 -0
  68. package/dist/models.js.map +1 -0
  69. package/dist/modshop.d.ts +229 -0
  70. package/dist/modshop.js +904 -0
  71. package/dist/modshop.js.map +1 -0
  72. package/dist/modshop_data.d.ts +44 -0
  73. package/dist/modshop_data.js +287 -0
  74. package/dist/modshop_data.js.map +1 -0
  75. package/dist/native.d.ts +809 -0
  76. package/dist/native.js +27 -0
  77. package/dist/native.js.map +1 -0
  78. package/dist/objects.d.ts +249 -0
  79. package/dist/objects.js +455 -0
  80. package/dist/objects.js.map +1 -0
  81. package/dist/paint.d.ts +124 -0
  82. package/dist/paint.js +84 -0
  83. package/dist/paint.js.map +1 -0
  84. package/dist/paynspray.d.ts +44 -0
  85. package/dist/paynspray.js +177 -0
  86. package/dist/paynspray.js.map +1 -0
  87. package/dist/ped.d.ts +335 -0
  88. package/dist/ped.js +536 -0
  89. package/dist/ped.js.map +1 -0
  90. package/dist/player.d.ts +685 -0
  91. package/dist/player.js +1163 -0
  92. package/dist/player.js.map +1 -0
  93. package/dist/screeneffects.d.ts +99 -0
  94. package/dist/screeneffects.js +257 -0
  95. package/dist/screeneffects.js.map +1 -0
  96. package/dist/scripts.d.ts +69 -0
  97. package/dist/scripts.js +125 -0
  98. package/dist/scripts.js.map +1 -0
  99. package/dist/server.d.ts +713 -0
  100. package/dist/server.js +1080 -0
  101. package/dist/server.js.map +1 -0
  102. package/dist/shopblips.d.ts +9 -0
  103. package/dist/shopblips.js +30 -0
  104. package/dist/shopblips.js.map +1 -0
  105. package/dist/special.d.ts +33 -0
  106. package/dist/special.js +26 -0
  107. package/dist/special.js.map +1 -0
  108. package/dist/splash.d.ts +42 -0
  109. package/dist/splash.js +55 -0
  110. package/dist/splash.js.map +1 -0
  111. package/dist/text.d.ts +19 -0
  112. package/dist/text.js +25 -0
  113. package/dist/text.js.map +1 -0
  114. package/dist/ui.d.ts +141 -0
  115. package/dist/ui.js +243 -0
  116. package/dist/ui.js.map +1 -0
  117. package/dist/vehicle.d.ts +306 -0
  118. package/dist/vehicle.js +612 -0
  119. package/dist/vehicle.js.map +1 -0
  120. package/dist/vehiclecolors.d.ts +26 -0
  121. package/dist/vehiclecolors.js +49 -0
  122. package/dist/vehiclecolors.js.map +1 -0
  123. package/dist/world.d.ts +222 -0
  124. package/dist/world.js +227 -0
  125. package/dist/world.js.map +1 -0
  126. package/dist/zone.d.ts +89 -0
  127. package/dist/zone.js +140 -0
  128. package/dist/zone.js.map +1 -0
  129. 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 {};