@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
@@ -0,0 +1,373 @@
1
+ /** A command's usage went wrong: the message is shown to the player. */
2
+ export class CommandError extends Error {
3
+ }
4
+ let lookup = { players: () => [], vehicle: () => undefined };
5
+ /** @internal */
6
+ export function setLookup(l) {
7
+ lookup = l;
8
+ }
9
+ const clean = (s) => s.replace(/[\t\n:|]/g, " ");
10
+ /** Argument types for `command(...).argument(name, type)`. */
11
+ export const arg = {
12
+ /** A player: by id, their name, or the start of it (one match). */
13
+ player() {
14
+ return {
15
+ label: "player",
16
+ token: "player",
17
+ parse(input) {
18
+ const all = lookup.players();
19
+ if (/^\d+$/.test(input)) {
20
+ const p = all.find((x) => x.id === Number(input));
21
+ if (p)
22
+ return p;
23
+ }
24
+ const lower = input.toLowerCase();
25
+ const exact = all.find((x) => x.name.toLowerCase() === lower);
26
+ if (exact)
27
+ return exact;
28
+ const matches = all.filter((x) => x.name.toLowerCase().startsWith(lower));
29
+ if (matches.length === 1)
30
+ return matches[0];
31
+ if (matches.length > 1)
32
+ throw new CommandError(`More than one player matches "${input}": ${matches.map((p) => p.name).join(", ")}`);
33
+ throw new CommandError(`No player "${input}"`);
34
+ },
35
+ };
36
+ },
37
+ /** A whole number, within `min`-`max`. */
38
+ integer(o = {}) {
39
+ const { min = -2147483648, max = 2147483647 } = o;
40
+ return {
41
+ label: o.min !== undefined || o.max !== undefined ? `${o.min ?? ""}-${o.max ?? ""}`.replace(/^-$/, "number") : "number",
42
+ token: `int:${min}:${max}`,
43
+ parse(input) {
44
+ if (!/^[-+]?\d+$/.test(input))
45
+ throw new CommandError(`"${input}" isn't a whole number`);
46
+ const n = Number(input);
47
+ if (n < min || n > max)
48
+ throw new CommandError(`${n} isn't within ${min}-${max}`);
49
+ return n;
50
+ },
51
+ };
52
+ },
53
+ /** A number (decimals too), within `min`-`max`. */
54
+ number(o = {}) {
55
+ const { min = -Infinity, max = Infinity } = o;
56
+ return {
57
+ label: "number",
58
+ token: `num:${Number.isFinite(min) ? min : ""}:${Number.isFinite(max) ? max : ""}`,
59
+ parse(input) {
60
+ const n = Number(input);
61
+ if (input === "" || !Number.isFinite(n))
62
+ throw new CommandError(`"${input}" isn't a number`);
63
+ if (n < min || n > max)
64
+ throw new CommandError(`${n} isn't within ${min}-${max}`);
65
+ return n;
66
+ },
67
+ };
68
+ },
69
+ /** One word. */
70
+ word() {
71
+ return { label: "word", token: "word", parse: (input) => input };
72
+ },
73
+ /** The rest of the line (it must come last). */
74
+ text() {
75
+ return { label: "text", token: "text", greedy: true, parse: (input) => input };
76
+ },
77
+ /** yes/no, true/false, on/off, 1/0. */
78
+ boolean() {
79
+ return {
80
+ label: "yes/no",
81
+ token: "choice:yes|no|on|off|true|false",
82
+ parse(input) {
83
+ const v = input.toLowerCase();
84
+ if (["yes", "true", "on", "1"].includes(v))
85
+ return true;
86
+ if (["no", "false", "off", "0"].includes(v))
87
+ return false;
88
+ throw new CommandError(`"${input}" isn't yes or no`);
89
+ },
90
+ };
91
+ },
92
+ /** One of these words. */
93
+ choice(choices) {
94
+ return {
95
+ label: choices.join("|"),
96
+ token: `choice:${choices.map(clean).join("|")}`,
97
+ parse(input) {
98
+ const c = choices.find((x) => x.toLowerCase() === input.toLowerCase());
99
+ if (c === undefined)
100
+ throw new CommandError(`"${input}" isn't one of ${choices.join(", ")}`);
101
+ return c;
102
+ },
103
+ };
104
+ },
105
+ /** A vehicle, by its id. */
106
+ vehicle() {
107
+ return {
108
+ label: "vehicle id",
109
+ token: "int:0:2147483647",
110
+ parse(input) {
111
+ const v = /^\d+$/.test(input) ? lookup.vehicle(Number(input)) : undefined;
112
+ if (!v)
113
+ throw new CommandError(`No vehicle ${input}`);
114
+ return v;
115
+ },
116
+ };
117
+ },
118
+ /**
119
+ * Your own: `parse` reads it (throw `CommandError` to refuse), `suggest`
120
+ * offers what the chat suggests as they type (asked of the server).
121
+ */
122
+ custom(o) {
123
+ return { label: o.label, token: "custom", greedy: o.greedy, parse: o.parse, suggest: o.suggest };
124
+ },
125
+ };
126
+ /**
127
+ * A command, built up (as Minecraft's Brigadier): its name, aliases,
128
+ * arguments, subcommands, who may use it, and what it does. Made with
129
+ * `command(name)`.
130
+ *
131
+ * ```ts
132
+ * server.commands.register(
133
+ * command("pay").description("Give money to a player")
134
+ * .argument("player", arg.player())
135
+ * .argument("amount", arg.integer({ min: 1 }))
136
+ * .executes((player, { player: to, amount }) => { ... }),
137
+ * );
138
+ * ```
139
+ */
140
+ export class CommandBuilder {
141
+ /** @internal */ name;
142
+ /** @internal */ aliases = [];
143
+ /** @internal */ text = "";
144
+ /** @internal */ check = null;
145
+ /** @internal */ args = [];
146
+ /** @internal */ children = [];
147
+ /** @internal */ run = null;
148
+ /** @internal */
149
+ constructor(name) {
150
+ if (!/^[A-Za-z0-9_.-]{1,32}$/.test(name))
151
+ throw new RangeError(`not a command name: "${name}"`);
152
+ this.name = name.toLowerCase();
153
+ }
154
+ /** Other names for it. */
155
+ alias(...names) {
156
+ for (const n of names) {
157
+ if (!/^[A-Za-z0-9_.-]{1,32}$/.test(n))
158
+ throw new RangeError(`not a command name: "${n}"`);
159
+ this.aliases.push(n.toLowerCase());
160
+ }
161
+ return this;
162
+ }
163
+ /** What it does, shown with its usage in the chat's suggestions. */
164
+ description(text) {
165
+ this.text = clean(text);
166
+ return this;
167
+ }
168
+ /** Who may use it (and see it suggested): checked per player. */
169
+ requires(check) {
170
+ this.check = check;
171
+ return this;
172
+ }
173
+ /** The next argument. Optional ones come last. */
174
+ argument(name, type, options = {}) {
175
+ if (!/^[A-Za-z0-9_]{1,32}$/.test(name))
176
+ throw new RangeError(`not an argument name: "${name}"`);
177
+ const last = this.args[this.args.length - 1];
178
+ if (last?.type.greedy)
179
+ throw new TypeError(`/${this.name}: nothing can follow "${last.name}" (it takes the rest of the line)`);
180
+ if (last?.optional && !options.optional)
181
+ throw new TypeError(`/${this.name}: "${name}" can't follow an optional argument`);
182
+ this.args.push({ name, type, optional: options.optional ?? false });
183
+ return this;
184
+ }
185
+ /** A subcommand: `/faction invite ...` is `command("faction").then(command("invite")...)`. */
186
+ then(sub) {
187
+ this.children.push(sub);
188
+ return this;
189
+ }
190
+ /** What it does: `fn(player, args, line)`; throw `CommandError` to tell them what's wrong. */
191
+ executes(fn) {
192
+ this.run = fn;
193
+ return this;
194
+ }
195
+ }
196
+ /** Starts a command: see `CommandBuilder`. */
197
+ export function command(name) {
198
+ return new CommandBuilder(name);
199
+ }
200
+ const allowed = (b, p) => {
201
+ try {
202
+ return !b.check || b.check(p);
203
+ }
204
+ catch {
205
+ return false;
206
+ }
207
+ };
208
+ const named = (b, word) => b.name === word || b.aliases.includes(word);
209
+ // Every way of using it: the literals on the way, and the arguments.
210
+ function syntaxes(b, p, prefix = []) {
211
+ const own = [...prefix, ...b.args.map((a) => `${a.optional ? "opt" : "arg"}:${a.name}:${a.type.token}`)];
212
+ const out = [];
213
+ if (b.run)
214
+ out.push({ tokens: own, text: b.text });
215
+ for (const c of b.children) {
216
+ if (allowed(c, p))
217
+ out.push(...syntaxes(c, p, [...own, `lit:${c.name}`]));
218
+ }
219
+ return out;
220
+ }
221
+ // "/pay <player> <amount>", for each way of using it.
222
+ function usage(name, b, p) {
223
+ return syntaxes(b, p).map((s) => `/${name} ` + s.tokens.map((t) => {
224
+ const [kind, n] = t.split(":");
225
+ return kind === "lit" ? n : kind === "opt" ? `[${n}]` : `<${n}>`;
226
+ }).join(" "));
227
+ }
228
+ /** `server.commands`: the server's chat commands. */
229
+ export class Commands {
230
+ #roots = [];
231
+ #send;
232
+ #players;
233
+ #error;
234
+ /** @internal */
235
+ constructor(send, players, error) {
236
+ this.#send = send;
237
+ this.#players = players;
238
+ this.#error = error;
239
+ }
240
+ /** Adds commands (players' chat suggests them at once). */
241
+ register(...commands) {
242
+ for (const c of commands) {
243
+ for (const n of [c.name, ...c.aliases]) {
244
+ if (this.#roots.some((r) => named(r, n)))
245
+ throw new Error(`/${n} is already a command`);
246
+ }
247
+ this.#roots.push(c);
248
+ }
249
+ for (const p of this.#players())
250
+ this.refresh(p);
251
+ return this;
252
+ }
253
+ /** Removes a command, by its name. */
254
+ unregister(name) {
255
+ this.#roots = this.#roots.filter((r) => r.name !== name.toLowerCase());
256
+ for (const p of this.#players())
257
+ this.refresh(p);
258
+ }
259
+ /** Sends their chat the commands they can use now: after what `requires` checks changes (their admin level...). */
260
+ refresh(player) {
261
+ if (!player.connected)
262
+ return;
263
+ const lines = [];
264
+ for (const r of this.#roots) {
265
+ if (!allowed(r, player))
266
+ continue;
267
+ for (const n of [r.name, ...r.aliases]) {
268
+ for (const s of syntaxes(r, player))
269
+ lines.push([n, s.text, s.tokens.join(" ")].join("\t"));
270
+ }
271
+ }
272
+ this.#send(player, lines.join("\n"));
273
+ }
274
+ /**
275
+ * @internal A /command line from `player`: true if a registered command
276
+ * took it (run, or its usage error shown), false if none is called that.
277
+ */
278
+ async handle(player, line) {
279
+ const words = line.slice(1).trim().split(/\s+/).filter(Boolean);
280
+ const name = (words.shift() ?? "").toLowerCase();
281
+ const root = this.#roots.find((r) => named(r, name));
282
+ if (!root || !allowed(root, player))
283
+ return false;
284
+ const rest = line.slice(1).trim().slice(line.slice(1).trim().split(/\s+/)[0].length).trim();
285
+ try {
286
+ await this.#run(root, player, rest, {}, name, line);
287
+ }
288
+ catch (err) {
289
+ if (err instanceof CommandError) {
290
+ this.#error(player, err.message);
291
+ for (const u of usage(name, root, player).slice(0, 4))
292
+ this.#error(player, `Usage: ${u}`);
293
+ }
294
+ else {
295
+ console.error(`[sagl] /${name} threw:`, err);
296
+ this.#error(player, "That command failed.");
297
+ }
298
+ }
299
+ return true;
300
+ }
301
+ async #run(b, player, rest, args, name, line) {
302
+ let text = rest;
303
+ for (const a of b.args) {
304
+ text = text.trimStart();
305
+ if (!text) {
306
+ if (a.optional)
307
+ break;
308
+ throw new CommandError(`Missing ${a.name}`);
309
+ }
310
+ let word;
311
+ if (a.type.greedy) {
312
+ word = text;
313
+ text = "";
314
+ }
315
+ else {
316
+ const m = /^\S+/.exec(text);
317
+ word = m[0];
318
+ text = text.slice(word.length);
319
+ }
320
+ args[a.name] = a.type.parse(word, player);
321
+ }
322
+ text = text.trim();
323
+ if (text) {
324
+ const next = text.split(/\s+/)[0].toLowerCase();
325
+ const sub = b.children.find((c) => named(c, next) && allowed(c, player));
326
+ if (sub)
327
+ return this.#run(sub, player, text.slice(next.length), args, name, line);
328
+ if (!b.children.length)
329
+ throw new CommandError("Too much after the command");
330
+ throw new CommandError(`Unknown: "${next}"`);
331
+ }
332
+ if (!b.run)
333
+ throw new CommandError(b.children.length ? "Which one?" : "That can't be used alone");
334
+ await b.run(player, args, line);
335
+ }
336
+ /**
337
+ * @internal Suggestions for the custom argument being typed at the end of
338
+ * `line`: [where its word starts, suggestions], or null.
339
+ */
340
+ async suggest(player, line) {
341
+ const body = line.slice(1);
342
+ const words = body.split(" ");
343
+ const root = this.#roots.find((r) => named(r, (words[0] ?? "").toLowerCase()));
344
+ if (!root || !allowed(root, player))
345
+ return null;
346
+ let b = root;
347
+ let i = 1;
348
+ let pos = 1 + words[0].length + 1;
349
+ for (;;) {
350
+ for (const a of b.args) {
351
+ const last = i === words.length - 1;
352
+ if (a.type.greedy || last) {
353
+ const partial = a.type.greedy ? words.slice(i).join(" ") : words[i];
354
+ if (!a.type.suggest)
355
+ return null;
356
+ const list = await a.type.suggest(player, partial ?? "");
357
+ return [pos, list.slice(0, 20)];
358
+ }
359
+ pos += words[i].length + 1;
360
+ ++i;
361
+ }
362
+ if (i >= words.length)
363
+ return null;
364
+ const sub = b.children.find((c) => named(c, words[i].toLowerCase()) && allowed(c, player));
365
+ if (!sub || i === words.length - 1)
366
+ return null;
367
+ pos += words[i].length + 1;
368
+ ++i;
369
+ b = sub;
370
+ }
371
+ }
372
+ }
373
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Server } from "./server.js";
2
+ export type CommandHandler = (args: string[], line: string) => void;
3
+ /**
4
+ * Operator console on stdin. Comes with built-in commands (`help` lists them);
5
+ * gamemodes add their own:
6
+ *
7
+ * ```ts
8
+ * server.console.command("heal", "heal <id>", ([id]) => { ... });
9
+ * ```
10
+ */
11
+ export declare class Console {
12
+ #private;
13
+ constructor(server: Server);
14
+ command(name: string, usage: string, run: CommandHandler): this;
15
+ /** Runs one console line, as if typed. */
16
+ run(line: string): void;
17
+ /** @internal */
18
+ start(): void;
19
+ /** @internal */
20
+ stop(): void;
21
+ }
@@ -0,0 +1,100 @@
1
+ import * as readline from "node:readline";
2
+ import { native } from "./native.js";
3
+ /**
4
+ * Operator console on stdin. Comes with built-in commands (`help` lists them);
5
+ * gamemodes add their own:
6
+ *
7
+ * ```ts
8
+ * server.console.command("heal", "heal <id>", ([id]) => { ... });
9
+ * ```
10
+ */
11
+ export class Console {
12
+ #server;
13
+ #commands = new Map();
14
+ #rl = null;
15
+ constructor(server) {
16
+ this.#server = server;
17
+ this.#builtins();
18
+ }
19
+ command(name, usage, run) {
20
+ this.#commands.set(name, { usage, run });
21
+ return this;
22
+ }
23
+ /** Runs one console line, as if typed. */
24
+ run(line) {
25
+ const [name, ...args] = line.trim().split(/\s+/);
26
+ if (!name)
27
+ return;
28
+ const command = this.#commands.get(name);
29
+ if (!command) {
30
+ console.log(`unknown command '${name}' (try 'help')`);
31
+ return;
32
+ }
33
+ try {
34
+ command.run(args, line.trim().slice(name.length).trim());
35
+ }
36
+ catch (err) {
37
+ console.error(`${name}:`, err instanceof Error ? err.message : err);
38
+ }
39
+ }
40
+ /** @internal */
41
+ start() {
42
+ if (this.#rl || !process.stdin.readable)
43
+ return;
44
+ this.#rl = readline.createInterface({ input: process.stdin, terminal: false });
45
+ this.#rl.on("line", (line) => this.run(line));
46
+ console.log("console: type 'help'");
47
+ }
48
+ /** @internal */
49
+ stop() {
50
+ this.#rl?.close();
51
+ this.#rl = null;
52
+ }
53
+ #player(arg) {
54
+ const player = arg === undefined ? undefined : this.#server.player(Number(arg));
55
+ if (!player)
56
+ throw new Error(`no player ${arg}`);
57
+ return player;
58
+ }
59
+ #builtins() {
60
+ const server = this.#server;
61
+ this.command("help", "help", () => {
62
+ for (const { usage } of this.#commands.values())
63
+ console.log(` ${usage}`);
64
+ });
65
+ this.command("players", "players", () => {
66
+ for (const p of server.players) {
67
+ const pos = p.position;
68
+ console.log(` ${p.id}: ${p.name} ${p.ip} skin ${p.skin} hp ${p.health} ` +
69
+ `at ${pos.x.toFixed(1)} ${pos.y.toFixed(1)} ${pos.z.toFixed(1)} ping ${p.ping} ms`);
70
+ }
71
+ console.log(`${server.players.length} player(s)`);
72
+ });
73
+ this.command("time", "time [HH:MM]", ([arg]) => {
74
+ if (arg) {
75
+ const [hour, minute] = arg.split(":").map(Number);
76
+ server.time = { hour, minute };
77
+ }
78
+ const t = server.time;
79
+ console.log(`time ${String(t.hour).padStart(2, "0")}:${String(t.minute).padStart(2, "0")}, ${t.frozen ? "frozen" : "running"}`);
80
+ });
81
+ this.command("freeze", "freeze", () => server.freezeTime());
82
+ this.command("unfreeze", "unfreeze", () => server.unfreezeTime());
83
+ this.command("skin", "skin <id> <model|random>", ([id, model]) => {
84
+ const skin = model === "random" ? server.randomSkin() : Number(model);
85
+ if (!native.isValidSkin(skin))
86
+ throw new Error(`not a valid ped model: ${model}`);
87
+ this.#player(id).skin = skin;
88
+ });
89
+ this.command("say", "say <text>", (_args, rest) => server.broadcast(rest));
90
+ this.command("kick", "kick <id> [reason]", ([id, ...reason]) => this.#player(id).kick(reason.join(" ")));
91
+ this.command("tp", "tp <id> <x> <y> <z>", ([id, x, y, z]) => this.#player(id).setPosition({ x: Number(x), y: Number(y), z: Number(z) }));
92
+ this.command("hp", "hp <id> <health> [armour]", ([id, health, armour]) => {
93
+ const p = this.#player(id);
94
+ p.health = Number(health);
95
+ if (armour !== undefined)
96
+ p.armour = Number(armour);
97
+ });
98
+ }
99
+ }
100
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"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"}