@open-core/framework 0.1.0-alpha.1
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 +373 -0
- package/README.md +360 -0
- package/dist/client/client-bootstrap.d.ts +1 -0
- package/dist/client/client-bootstrap.js +50 -0
- package/dist/client/client-container.d.ts +2 -0
- package/dist/client/client-container.js +6 -0
- package/dist/client/client-core.d.ts +1 -0
- package/dist/client/client-core.js +7 -0
- package/dist/client/controllers/spawner.controller.d.ts +12 -0
- package/dist/client/controllers/spawner.controller.js +51 -0
- package/dist/client/decorators/controller.d.ts +3 -0
- package/dist/client/decorators/controller.js +14 -0
- package/dist/client/decorators/export.d.ts +7 -0
- package/dist/client/decorators/export.js +15 -0
- package/dist/client/decorators/gameEvent.d.ts +47 -0
- package/dist/client/decorators/gameEvent.js +54 -0
- package/dist/client/decorators/index.d.ts +10 -0
- package/dist/client/decorators/index.js +26 -0
- package/dist/client/decorators/interval.d.ts +7 -0
- package/dist/client/decorators/interval.js +15 -0
- package/dist/client/decorators/key.d.ts +2 -0
- package/dist/client/decorators/key.js +10 -0
- package/dist/client/decorators/localEvent.d.ts +7 -0
- package/dist/client/decorators/localEvent.js +15 -0
- package/dist/client/decorators/nui.d.ts +1 -0
- package/dist/client/decorators/nui.js +9 -0
- package/dist/client/decorators/onNet.d.ts +1 -0
- package/dist/client/decorators/onNet.js +9 -0
- package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
- package/dist/client/decorators/resourceLifecycle.js +24 -0
- package/dist/client/decorators/tick.d.ts +1 -0
- package/dist/client/decorators/tick.js +9 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.js +23 -0
- package/dist/client/interfaces/appearance.interface.d.ts +19 -0
- package/dist/client/interfaces/appearance.interface.js +2 -0
- package/dist/client/player/player.d.ts +262 -0
- package/dist/client/player/player.js +480 -0
- package/dist/client/player/player.loader.d.ts +1 -0
- package/dist/client/player/player.loader.js +22 -0
- package/dist/client/services/appearance.service.d.ts +6 -0
- package/dist/client/services/appearance.service.js +89 -0
- package/dist/client/services/blip.service.d.ts +112 -0
- package/dist/client/services/blip.service.js +215 -0
- package/dist/client/services/index.d.ts +9 -0
- package/dist/client/services/index.js +25 -0
- package/dist/client/services/marker.service.d.ts +94 -0
- package/dist/client/services/marker.service.js +153 -0
- package/dist/client/services/notification.service.d.ts +76 -0
- package/dist/client/services/notification.service.js +111 -0
- package/dist/client/services/ped.service.d.ts +182 -0
- package/dist/client/services/ped.service.js +302 -0
- package/dist/client/services/progress.service.d.ts +82 -0
- package/dist/client/services/progress.service.js +210 -0
- package/dist/client/services/spawn.service.d.ts +73 -0
- package/dist/client/services/spawn.service.js +261 -0
- package/dist/client/services/streaming.service.d.ts +165 -0
- package/dist/client/services/streaming.service.js +341 -0
- package/dist/client/services/textui.service.d.ts +82 -0
- package/dist/client/services/textui.service.js +156 -0
- package/dist/client/services/vehicle.service.d.ts +168 -0
- package/dist/client/services/vehicle.service.js +296 -0
- package/dist/client/system/metadata-client.keys.d.ts +13 -0
- package/dist/client/system/metadata-client.keys.js +16 -0
- package/dist/client/system/processors/export.processor.d.ts +7 -0
- package/dist/client/system/processors/export.processor.js +39 -0
- package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
- package/dist/client/system/processors/gameEvent.processor.js +58 -0
- package/dist/client/system/processors/interval.processor.d.ts +7 -0
- package/dist/client/system/processors/interval.processor.js +43 -0
- package/dist/client/system/processors/key.processor.d.ts +8 -0
- package/dist/client/system/processors/key.processor.js +27 -0
- package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/localEvent.processor.js +38 -0
- package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/netEvent.processor.js +38 -0
- package/dist/client/system/processors/nui.processor.d.ts +7 -0
- package/dist/client/system/processors/nui.processor.js +40 -0
- package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
- package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
- package/dist/client/system/processors/tick.processor.d.ts +5 -0
- package/dist/client/system/processors/tick.processor.js +37 -0
- package/dist/client/system/processors.register.d.ts +1 -0
- package/dist/client/system/processors.register.js +27 -0
- package/dist/client/types/game-events.d.ts +126 -0
- package/dist/client/types/game-events.js +83 -0
- package/dist/client/types/index.d.ts +1 -0
- package/dist/client/types/index.js +17 -0
- package/dist/client/ui-bridge.d.ts +116 -0
- package/dist/client/ui-bridge.js +201 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +41 -0
- package/dist/server/bootstrap.d.ts +16 -0
- package/dist/server/bootstrap.js +57 -0
- package/dist/server/bus/core-event-bus.d.ts +6 -0
- package/dist/server/bus/core-event-bus.js +31 -0
- package/dist/server/configs/api.config.d.ts +71 -0
- package/dist/server/configs/api.config.js +81 -0
- package/dist/server/configs/config.base.d.ts +63 -0
- package/dist/server/configs/config.base.js +64 -0
- package/dist/server/configs/index.d.ts +2 -0
- package/dist/server/configs/index.js +18 -0
- package/dist/server/container.d.ts +2 -0
- package/dist/server/container.js +6 -0
- package/dist/server/controllers/chat.controller.d.ts +10 -0
- package/dist/server/controllers/chat.controller.js +50 -0
- package/dist/server/controllers/command.controller.d.ts +7 -0
- package/dist/server/controllers/command.controller.js +47 -0
- package/dist/server/controllers/session.controller.d.ts +9 -0
- package/dist/server/controllers/session.controller.js +70 -0
- package/dist/server/core.d.ts +1 -0
- package/dist/server/core.js +7 -0
- package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
- package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
- package/dist/server/database/database.contract.d.ts +128 -0
- package/dist/server/database/database.contract.js +29 -0
- package/dist/server/database/database.service.d.ts +216 -0
- package/dist/server/database/database.service.js +301 -0
- package/dist/server/database/index.d.ts +53 -0
- package/dist/server/database/index.js +70 -0
- package/dist/server/database/types.d.ts +67 -0
- package/dist/server/database/types.js +7 -0
- package/dist/server/database.d.ts +7 -0
- package/dist/server/database.js +23 -0
- package/dist/server/decorators/bind.d.ts +2 -0
- package/dist/server/decorators/bind.js +15 -0
- package/dist/server/decorators/command.d.ts +49 -0
- package/dist/server/decorators/command.js +23 -0
- package/dist/server/decorators/controller.d.ts +25 -0
- package/dist/server/decorators/controller.js +36 -0
- package/dist/server/decorators/export.d.ts +39 -0
- package/dist/server/decorators/export.js +47 -0
- package/dist/server/decorators/guard.d.ts +56 -0
- package/dist/server/decorators/guard.js +82 -0
- package/dist/server/decorators/index.d.ts +10 -0
- package/dist/server/decorators/index.js +29 -0
- package/dist/server/decorators/onFiveMEvent.d.ts +6 -0
- package/dist/server/decorators/onFiveMEvent.js +14 -0
- package/dist/server/decorators/onFrameworkEvent.d.ts +22 -0
- package/dist/server/decorators/onFrameworkEvent.js +29 -0
- package/dist/server/decorators/onNet.d.ts +58 -0
- package/dist/server/decorators/onNet.js +57 -0
- package/dist/server/decorators/onTick.d.ts +32 -0
- package/dist/server/decorators/onTick.js +40 -0
- package/dist/server/decorators/public.d.ts +27 -0
- package/dist/server/decorators/public.js +36 -0
- package/dist/server/decorators/requiresState.d.ts +56 -0
- package/dist/server/decorators/requiresState.js +63 -0
- package/dist/server/decorators/throttle.d.ts +48 -0
- package/dist/server/decorators/throttle.js +63 -0
- package/dist/server/decorators/utils.d.ts +57 -0
- package/dist/server/decorators/utils.js +63 -0
- package/dist/server/entities/index.d.ts +1 -0
- package/dist/server/entities/index.js +17 -0
- package/dist/server/entities/player.d.ts +157 -0
- package/dist/server/entities/player.js +217 -0
- package/dist/server/error-handler.d.ts +2 -0
- package/dist/server/error-handler.js +43 -0
- package/dist/server/helpers/resolve-method.d.ts +5 -0
- package/dist/server/helpers/resolve-method.js +18 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +31 -0
- package/dist/server/loaders/exports.loader.d.ts +0 -0
- package/dist/server/loaders/exports.loader.js +23 -0
- package/dist/server/loaders/playerSession.loader.d.ts +1 -0
- package/dist/server/loaders/playerSession.loader.js +51 -0
- package/dist/server/services/access-control.service.d.ts +56 -0
- package/dist/server/services/access-control.service.js +99 -0
- package/dist/server/services/chat.service.d.ts +7 -0
- package/dist/server/services/chat.service.js +31 -0
- package/dist/server/services/command.service.d.ts +15 -0
- package/dist/server/services/command.service.js +77 -0
- package/dist/server/services/config.service.d.ts +75 -0
- package/dist/server/services/config.service.js +116 -0
- package/dist/server/services/default/default-security.handler.d.ts +6 -0
- package/dist/server/services/default/default-security.handler.js +26 -0
- package/dist/server/services/http/http.service.d.ts +50 -0
- package/dist/server/services/http/http.service.js +126 -0
- package/dist/server/services/index.d.ts +10 -0
- package/dist/server/services/index.js +26 -0
- package/dist/server/services/parallel/index.d.ts +49 -0
- package/dist/server/services/parallel/index.js +67 -0
- package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
- package/dist/server/services/parallel/parallel-compute.service.js +449 -0
- package/dist/server/services/parallel/types.d.ts +188 -0
- package/dist/server/services/parallel/types.js +7 -0
- package/dist/server/services/parallel/worker-pool.d.ts +83 -0
- package/dist/server/services/parallel/worker-pool.js +350 -0
- package/dist/server/services/parallel/worker.d.ts +19 -0
- package/dist/server/services/parallel/worker.js +49 -0
- package/dist/server/services/persistence.service.d.ts +59 -0
- package/dist/server/services/persistence.service.js +166 -0
- package/dist/server/services/player.service.d.ts +96 -0
- package/dist/server/services/player.service.js +132 -0
- package/dist/server/services/rate-limiter.service.d.ts +5 -0
- package/dist/server/services/rate-limiter.service.js +39 -0
- package/dist/server/services/registers.d.ts +1 -0
- package/dist/server/services/registers.js +18 -0
- package/dist/server/setup.d.ts +9 -0
- package/dist/server/setup.js +28 -0
- package/dist/server/system/metadata-server.keys.d.ts +10 -0
- package/dist/server/system/metadata-server.keys.js +13 -0
- package/dist/server/system/processors/command.processor.d.ts +9 -0
- package/dist/server/system/processors/command.processor.js +30 -0
- package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/coreEvent.processor.js +41 -0
- package/dist/server/system/processors/export.processor.d.ts +7 -0
- package/dist/server/system/processors/export.processor.js +30 -0
- package/dist/server/system/processors/fivemEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/fivemEvent.processor.js +40 -0
- package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
- package/dist/server/system/processors/netEvent.processor.js +103 -0
- package/dist/server/system/processors/tick.processor.d.ts +5 -0
- package/dist/server/system/processors/tick.processor.js +36 -0
- package/dist/server/system/processors.register.d.ts +1 -0
- package/dist/server/system/processors.register.js +23 -0
- package/dist/server/system/schema-generator.d.ts +2 -0
- package/dist/server/system/schema-generator.js +34 -0
- package/dist/server/templates/admin/admin.controller-template.d.ts +12 -0
- package/dist/server/templates/admin/admin.controller-template.js +2 -0
- package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
- package/dist/server/templates/auth/auth-provider.contract.js +23 -0
- package/dist/server/templates/index.d.ts +8 -0
- package/dist/server/templates/index.js +21 -0
- package/dist/server/templates/persistence/index.d.ts +30 -0
- package/dist/server/templates/persistence/index.js +34 -0
- package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
- package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
- package/dist/server/templates/repository/index.d.ts +57 -0
- package/dist/server/templates/repository/index.js +61 -0
- package/dist/server/templates/repository/repository.contract.d.ts +224 -0
- package/dist/server/templates/repository/repository.contract.js +342 -0
- package/dist/server/templates/repository/repository.types.d.ts +51 -0
- package/dist/server/templates/repository/repository.types.js +7 -0
- package/dist/server/templates/security/permission.types.d.ts +32 -0
- package/dist/server/templates/security/permission.types.js +2 -0
- package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
- package/dist/server/templates/security/principal-provider.contract.js +19 -0
- package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
- package/dist/server/templates/security/security-handler.contract.js +6 -0
- package/dist/server/types/core-events.d.ts +22 -0
- package/dist/server/types/core-events.js +2 -0
- package/dist/server/types/security.types.d.ts +7 -0
- package/dist/server/types/security.types.js +2 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +17 -0
- package/dist/shared/logger/core-logger.d.ts +35 -0
- package/dist/shared/logger/core-logger.js +52 -0
- package/dist/shared/logger/index.d.ts +11 -0
- package/dist/shared/logger/index.js +26 -0
- package/dist/shared/logger/logger.config.d.ts +47 -0
- package/dist/shared/logger/logger.config.js +33 -0
- package/dist/shared/logger/logger.service.d.ts +161 -0
- package/dist/shared/logger/logger.service.js +279 -0
- package/dist/shared/logger/logger.types.d.ts +85 -0
- package/dist/shared/logger/logger.types.js +74 -0
- package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
- package/dist/shared/logger/transports/buffered.transport.js +174 -0
- package/dist/shared/logger/transports/console.transport.d.ts +37 -0
- package/dist/shared/logger/transports/console.transport.js +134 -0
- package/dist/shared/logger/transports/index.d.ts +3 -0
- package/dist/shared/logger/transports/index.js +19 -0
- package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
- package/dist/shared/logger/transports/transport.interface.js +2 -0
- package/dist/system/class-constructor.d.ts +1 -0
- package/dist/system/class-constructor.js +2 -0
- package/dist/system/decorator-processor.d.ts +4 -0
- package/dist/system/decorator-processor.js +2 -0
- package/dist/system/metadata.scanner.d.ts +7 -0
- package/dist/system/metadata.scanner.js +45 -0
- package/dist/utils/errors.d.ts +14 -0
- package/dist/utils/errors.js +25 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/result.d.ts +12 -0
- package/dist/utils/result.js +10 -0
- package/dist/utils/rgb.d.ts +5 -0
- package/dist/utils/rgb.js +2 -0
- package/dist/utils/vector3.d.ts +13 -0
- package/dist/utils/vector3.js +27 -0
- package/package.json +98 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ProgressService = void 0;
|
|
10
|
+
const tsyringe_1 = require("tsyringe");
|
|
11
|
+
/**
|
|
12
|
+
* Service for displaying progress bars/indicators.
|
|
13
|
+
*/
|
|
14
|
+
let ProgressService = class ProgressService {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.state = null;
|
|
17
|
+
this.tickHandle = null;
|
|
18
|
+
this.callback = null;
|
|
19
|
+
this.propHandle = null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start a progress action.
|
|
23
|
+
*
|
|
24
|
+
* @param options - Progress options
|
|
25
|
+
* @returns Promise that resolves with true if completed, false if cancelled
|
|
26
|
+
*/
|
|
27
|
+
async start(options) {
|
|
28
|
+
var _a;
|
|
29
|
+
if ((_a = this.state) === null || _a === void 0 ? void 0 : _a.active) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
this.state = {
|
|
34
|
+
active: true,
|
|
35
|
+
progress: 0,
|
|
36
|
+
label: options.label,
|
|
37
|
+
startTime: GetGameTimer(),
|
|
38
|
+
duration: options.duration,
|
|
39
|
+
options,
|
|
40
|
+
};
|
|
41
|
+
this.callback = resolve;
|
|
42
|
+
this.startProgress();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Cancel the current progress.
|
|
47
|
+
*/
|
|
48
|
+
cancel() {
|
|
49
|
+
var _a;
|
|
50
|
+
if (!((_a = this.state) === null || _a === void 0 ? void 0 : _a.active))
|
|
51
|
+
return;
|
|
52
|
+
this.cleanup(false);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a progress is currently active.
|
|
56
|
+
*/
|
|
57
|
+
isActive() {
|
|
58
|
+
var _a, _b;
|
|
59
|
+
return (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.active) !== null && _b !== void 0 ? _b : false;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get current progress percentage (0-100).
|
|
63
|
+
*/
|
|
64
|
+
getProgress() {
|
|
65
|
+
var _a, _b;
|
|
66
|
+
return (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.progress) !== null && _b !== void 0 ? _b : 0;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get current progress state.
|
|
70
|
+
*/
|
|
71
|
+
getState() {
|
|
72
|
+
return this.state;
|
|
73
|
+
}
|
|
74
|
+
async startProgress() {
|
|
75
|
+
var _a;
|
|
76
|
+
if (!this.state)
|
|
77
|
+
return;
|
|
78
|
+
const { options } = this.state;
|
|
79
|
+
const ped = PlayerPedId();
|
|
80
|
+
// Load and play animation if specified
|
|
81
|
+
if (options.animation) {
|
|
82
|
+
await this.loadAnimDict(options.animation.dict);
|
|
83
|
+
TaskPlayAnim(ped, options.animation.dict, options.animation.anim, 8.0, -8.0, options.duration, (_a = options.animation.flags) !== null && _a !== void 0 ? _a : 1, 0.0, false, false, false);
|
|
84
|
+
}
|
|
85
|
+
// Attach prop if specified
|
|
86
|
+
if (options.prop) {
|
|
87
|
+
await this.loadModel(options.prop.model);
|
|
88
|
+
const propHash = GetHashKey(options.prop.model);
|
|
89
|
+
const coords = GetEntityCoords(ped, true);
|
|
90
|
+
this.propHandle = CreateObject(propHash, coords[0], coords[1], coords[2], true, true, true);
|
|
91
|
+
AttachEntityToEntity(this.propHandle, ped, GetPedBoneIndex(ped, options.prop.bone), options.prop.offset.x, options.prop.offset.y, options.prop.offset.z, options.prop.rotation.x, options.prop.rotation.y, options.prop.rotation.z, true, true, false, true, 1, true);
|
|
92
|
+
}
|
|
93
|
+
// Start the tick
|
|
94
|
+
this.tickHandle = setTick(() => {
|
|
95
|
+
if (!this.state)
|
|
96
|
+
return;
|
|
97
|
+
const elapsed = GetGameTimer() - this.state.startTime;
|
|
98
|
+
this.state.progress = Math.min((elapsed / this.state.duration) * 100, 100);
|
|
99
|
+
// Handle controls
|
|
100
|
+
if (options.disableControls) {
|
|
101
|
+
DisableAllControlActions(0);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
if (options.disableMovement) {
|
|
105
|
+
DisableControlAction(0, 30, true); // Move LR
|
|
106
|
+
DisableControlAction(0, 31, true); // Move UD
|
|
107
|
+
DisableControlAction(0, 21, true); // Sprint
|
|
108
|
+
DisableControlAction(0, 22, true); // Jump
|
|
109
|
+
}
|
|
110
|
+
if (options.disableCombat) {
|
|
111
|
+
DisableControlAction(0, 24, true); // Attack
|
|
112
|
+
DisableControlAction(0, 25, true); // Aim
|
|
113
|
+
DisableControlAction(0, 47, true); // Weapon
|
|
114
|
+
DisableControlAction(0, 58, true); // Weapon
|
|
115
|
+
DisableControlAction(0, 263, true); // Melee
|
|
116
|
+
DisableControlAction(0, 264, true); // Melee
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Check for cancel
|
|
120
|
+
if (options.canCancel && IsControlJustPressed(0, 200)) {
|
|
121
|
+
// ESC key
|
|
122
|
+
this.cancel();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Draw progress bar (native style)
|
|
126
|
+
this.drawProgressBar();
|
|
127
|
+
// Check completion
|
|
128
|
+
if (elapsed >= this.state.duration) {
|
|
129
|
+
this.cleanup(true);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
drawProgressBar() {
|
|
134
|
+
if (!this.state)
|
|
135
|
+
return;
|
|
136
|
+
const { label, progress, options } = this.state;
|
|
137
|
+
if (options.useCircular) {
|
|
138
|
+
// Circular progress indicator
|
|
139
|
+
BeginTextCommandBusyspinnerOn('STRING');
|
|
140
|
+
AddTextComponentString(label);
|
|
141
|
+
EndTextCommandBusyspinnerOn(4);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Bar style progress
|
|
145
|
+
const barWidth = 0.15;
|
|
146
|
+
const barHeight = 0.015;
|
|
147
|
+
const x = 0.5 - barWidth / 2;
|
|
148
|
+
const y = 0.88;
|
|
149
|
+
// Background
|
|
150
|
+
DrawRect(0.5, y + barHeight / 2, barWidth, barHeight, 0, 0, 0, 180);
|
|
151
|
+
// Progress fill
|
|
152
|
+
const fillWidth = (barWidth * progress) / 100;
|
|
153
|
+
DrawRect(x + fillWidth / 2, y + barHeight / 2, fillWidth, barHeight, 255, 255, 255, 255);
|
|
154
|
+
// Label
|
|
155
|
+
SetTextFont(4);
|
|
156
|
+
SetTextScale(0.35, 0.35);
|
|
157
|
+
SetTextColour(255, 255, 255, 255);
|
|
158
|
+
SetTextCentre(true);
|
|
159
|
+
BeginTextCommandDisplayText('STRING');
|
|
160
|
+
AddTextComponentString(`${label} (${Math.floor(progress)}%)`);
|
|
161
|
+
EndTextCommandDisplayText(0.5, y - 0.03);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
cleanup(completed) {
|
|
165
|
+
var _a, _b;
|
|
166
|
+
const ped = PlayerPedId();
|
|
167
|
+
// Stop animation
|
|
168
|
+
if ((_a = this.state) === null || _a === void 0 ? void 0 : _a.options.animation) {
|
|
169
|
+
StopAnimTask(ped, this.state.options.animation.dict, this.state.options.animation.anim, 1.0);
|
|
170
|
+
}
|
|
171
|
+
// Remove prop
|
|
172
|
+
if (this.propHandle) {
|
|
173
|
+
DeleteEntity(this.propHandle);
|
|
174
|
+
this.propHandle = null;
|
|
175
|
+
}
|
|
176
|
+
// Clear tick
|
|
177
|
+
if (this.tickHandle !== null) {
|
|
178
|
+
clearTick(this.tickHandle);
|
|
179
|
+
this.tickHandle = null;
|
|
180
|
+
}
|
|
181
|
+
// Clear busy spinner
|
|
182
|
+
if ((_b = this.state) === null || _b === void 0 ? void 0 : _b.options.useCircular) {
|
|
183
|
+
BusyspinnerOff();
|
|
184
|
+
}
|
|
185
|
+
// Reset state
|
|
186
|
+
this.state = null;
|
|
187
|
+
// Invoke callback
|
|
188
|
+
if (this.callback) {
|
|
189
|
+
this.callback(completed);
|
|
190
|
+
this.callback = null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async loadAnimDict(dict) {
|
|
194
|
+
RequestAnimDict(dict);
|
|
195
|
+
while (!HasAnimDictLoaded(dict)) {
|
|
196
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async loadModel(model) {
|
|
200
|
+
const hash = GetHashKey(model);
|
|
201
|
+
RequestModel(hash);
|
|
202
|
+
while (!HasModelLoaded(hash)) {
|
|
203
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
exports.ProgressService = ProgressService;
|
|
208
|
+
exports.ProgressService = ProgressService = __decorate([
|
|
209
|
+
(0, tsyringe_1.injectable)()
|
|
210
|
+
], ProgressService);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Vector3 } from '../../utils';
|
|
2
|
+
import { AppearanceService } from './appearance.service';
|
|
3
|
+
import { PlayerAppearance } from '../interfaces/appearance.interface';
|
|
4
|
+
interface SpawnOptions {
|
|
5
|
+
/** Optional: Apply complete character appearance (RP clothing, face, props, tattoos...) */
|
|
6
|
+
appearance?: PlayerAppearance;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Handles all player spawning logic on the client.
|
|
10
|
+
*
|
|
11
|
+
* This service manages the complete lifecycle of a player spawn:
|
|
12
|
+
* - Waiting for the network session
|
|
13
|
+
* - Loading and applying the player model
|
|
14
|
+
* - Ensuring collision and world data is ready
|
|
15
|
+
* - Resurrecting the player cleanly
|
|
16
|
+
* - Applying default ped components for freemode models
|
|
17
|
+
* - Fading the screen in/out during transitions
|
|
18
|
+
*
|
|
19
|
+
* The service is designed to be robust, predictable, and safe for any gamemode.
|
|
20
|
+
*/
|
|
21
|
+
export declare class SpawnService {
|
|
22
|
+
private appearanceService;
|
|
23
|
+
private spawned;
|
|
24
|
+
private spawning;
|
|
25
|
+
constructor(appearanceService: AppearanceService);
|
|
26
|
+
init(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Performs the first spawn of the player.
|
|
29
|
+
*
|
|
30
|
+
* This method handles:
|
|
31
|
+
* - Fade out
|
|
32
|
+
* - Closing loading screens
|
|
33
|
+
* - Setting the player model
|
|
34
|
+
* - Ensuring the ped exists
|
|
35
|
+
* - Ensuring collision is loaded
|
|
36
|
+
* - Resurrecting the player
|
|
37
|
+
* - Preparing the ped for gameplay
|
|
38
|
+
* - Placing the player at the desired position
|
|
39
|
+
* - Fade in
|
|
40
|
+
*
|
|
41
|
+
* It should only be called once when the player joins.
|
|
42
|
+
*/
|
|
43
|
+
spawn(position: Vector3, model: string, heading?: number, options?: SpawnOptions): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Teleports the player instantly to a new position.
|
|
46
|
+
* Does not change the model or resurrect the player.
|
|
47
|
+
* Safe for gameplay use.
|
|
48
|
+
*/
|
|
49
|
+
teleportTo(position: Vector3, heading?: number): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Respawns the player after death or a gameplay event.
|
|
52
|
+
* Restores health, resurrects the player, loads collision,
|
|
53
|
+
* prepares the ped and teleports them to the desired location.
|
|
54
|
+
*/
|
|
55
|
+
respawn(position: Vector3, heading?: number): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Returns whether the player has completed their first spawn.
|
|
58
|
+
*/
|
|
59
|
+
isSpawned(): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Allows other systems to wait until the player is fully spawned.
|
|
62
|
+
*/
|
|
63
|
+
waitUntilSpawned(): Promise<void>;
|
|
64
|
+
private ensureNetworkReady;
|
|
65
|
+
private closeLoadingScreens;
|
|
66
|
+
private setPlayerModel;
|
|
67
|
+
private ensurePed;
|
|
68
|
+
private ensureCollisionAt;
|
|
69
|
+
private setupPedForGameplay;
|
|
70
|
+
private placePed;
|
|
71
|
+
private applyAppearanceIfNeeded;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SpawnService = void 0;
|
|
13
|
+
const tsyringe_1 = require("tsyringe");
|
|
14
|
+
const shared_1 = require("../../shared");
|
|
15
|
+
const appearance_service_1 = require("./appearance.service");
|
|
16
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
17
|
+
const NETWORK_TIMEOUT_MS = 15000;
|
|
18
|
+
const PED_TIMEOUT_MS = 10000;
|
|
19
|
+
const COLLISION_TIMEOUT_MS = 7000;
|
|
20
|
+
/**
|
|
21
|
+
* Handles all player spawning logic on the client.
|
|
22
|
+
*
|
|
23
|
+
* This service manages the complete lifecycle of a player spawn:
|
|
24
|
+
* - Waiting for the network session
|
|
25
|
+
* - Loading and applying the player model
|
|
26
|
+
* - Ensuring collision and world data is ready
|
|
27
|
+
* - Resurrecting the player cleanly
|
|
28
|
+
* - Applying default ped components for freemode models
|
|
29
|
+
* - Fading the screen in/out during transitions
|
|
30
|
+
*
|
|
31
|
+
* The service is designed to be robust, predictable, and safe for any gamemode.
|
|
32
|
+
*/
|
|
33
|
+
let SpawnService = class SpawnService {
|
|
34
|
+
constructor(appearanceService) {
|
|
35
|
+
this.appearanceService = appearanceService;
|
|
36
|
+
this.spawned = false;
|
|
37
|
+
this.spawning = false;
|
|
38
|
+
}
|
|
39
|
+
async init() {
|
|
40
|
+
shared_1.loggers.spawn.debug('SpawnService initialized');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Performs the first spawn of the player.
|
|
44
|
+
*
|
|
45
|
+
* This method handles:
|
|
46
|
+
* - Fade out
|
|
47
|
+
* - Closing loading screens
|
|
48
|
+
* - Setting the player model
|
|
49
|
+
* - Ensuring the ped exists
|
|
50
|
+
* - Ensuring collision is loaded
|
|
51
|
+
* - Resurrecting the player
|
|
52
|
+
* - Preparing the ped for gameplay
|
|
53
|
+
* - Placing the player at the desired position
|
|
54
|
+
* - Fade in
|
|
55
|
+
*
|
|
56
|
+
* It should only be called once when the player joins.
|
|
57
|
+
*/
|
|
58
|
+
async spawn(position, model, heading = 0.0, options) {
|
|
59
|
+
if (this.spawning) {
|
|
60
|
+
shared_1.loggers.spawn.warn('Spawn requested while a spawn is already in progress');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.spawning = true;
|
|
64
|
+
try {
|
|
65
|
+
await this.ensureNetworkReady();
|
|
66
|
+
if (!IsScreenFadedOut() && !IsScreenFadingOut()) {
|
|
67
|
+
DoScreenFadeOut(500);
|
|
68
|
+
while (!IsScreenFadedOut()) {
|
|
69
|
+
await delay(0);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
this.closeLoadingScreens();
|
|
73
|
+
await this.setPlayerModel(model);
|
|
74
|
+
const ped = await this.ensurePed();
|
|
75
|
+
await this.applyAppearanceIfNeeded(ped, options === null || options === void 0 ? void 0 : options.appearance);
|
|
76
|
+
await this.ensureCollisionAt(position, ped);
|
|
77
|
+
NetworkResurrectLocalPlayer(position.x, position.y, position.z, heading, 0, false);
|
|
78
|
+
const finalPed = await this.ensurePed();
|
|
79
|
+
await this.setupPedForGameplay(finalPed);
|
|
80
|
+
await this.placePed(finalPed, position, heading);
|
|
81
|
+
this.spawned = true;
|
|
82
|
+
if (!IsScreenFadedIn() && !IsScreenFadingIn()) {
|
|
83
|
+
DoScreenFadeIn(500);
|
|
84
|
+
}
|
|
85
|
+
shared_1.loggers.spawn.info('Player spawned successfully (first spawn)', {
|
|
86
|
+
position: { x: position.x, y: position.y, z: position.z },
|
|
87
|
+
model,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
shared_1.loggers.spawn.error('Failed to spawn player', {
|
|
92
|
+
error: err instanceof Error ? err.message : String(err),
|
|
93
|
+
});
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
this.spawning = false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Teleports the player instantly to a new position.
|
|
102
|
+
* Does not change the model or resurrect the player.
|
|
103
|
+
* Safe for gameplay use.
|
|
104
|
+
*/
|
|
105
|
+
async teleportTo(position, heading) {
|
|
106
|
+
const ped = await this.ensurePed();
|
|
107
|
+
await this.ensureCollisionAt(position, ped);
|
|
108
|
+
FreezeEntityPosition(ped, true);
|
|
109
|
+
SetEntityCoordsNoOffset(ped, position.x, position.y, position.z, false, false, false);
|
|
110
|
+
if (heading !== undefined) {
|
|
111
|
+
SetEntityHeading(ped, heading);
|
|
112
|
+
}
|
|
113
|
+
FreezeEntityPosition(ped, false);
|
|
114
|
+
shared_1.loggers.spawn.debug('Teleported', {
|
|
115
|
+
position: { x: position.x, y: position.y, z: position.z },
|
|
116
|
+
heading,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Respawns the player after death or a gameplay event.
|
|
121
|
+
* Restores health, resurrects the player, loads collision,
|
|
122
|
+
* prepares the ped and teleports them to the desired location.
|
|
123
|
+
*/
|
|
124
|
+
async respawn(position, heading = 0.0) {
|
|
125
|
+
const ped = await this.ensurePed();
|
|
126
|
+
await this.ensureCollisionAt(position, ped);
|
|
127
|
+
ClearPedTasksImmediately(ped);
|
|
128
|
+
SetEntityHealth(ped, GetEntityMaxHealth(ped));
|
|
129
|
+
NetworkResurrectLocalPlayer(position.x, position.y, position.z, heading, 0, false);
|
|
130
|
+
const finalPed = await this.ensurePed();
|
|
131
|
+
await this.setupPedForGameplay(finalPed);
|
|
132
|
+
await this.teleportTo(position, heading);
|
|
133
|
+
shared_1.loggers.spawn.info('Player respawned', {
|
|
134
|
+
position: { x: position.x, y: position.y, z: position.z },
|
|
135
|
+
heading,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Returns whether the player has completed their first spawn.
|
|
140
|
+
*/
|
|
141
|
+
isSpawned() {
|
|
142
|
+
return this.spawned;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Allows other systems to wait until the player is fully spawned.
|
|
146
|
+
*/
|
|
147
|
+
async waitUntilSpawned() {
|
|
148
|
+
while (!this.spawned) {
|
|
149
|
+
await delay(0);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async ensureNetworkReady() {
|
|
153
|
+
const start = GetGameTimer();
|
|
154
|
+
while (!NetworkIsSessionStarted()) {
|
|
155
|
+
if (GetGameTimer() - start > NETWORK_TIMEOUT_MS) {
|
|
156
|
+
shared_1.loggers.spawn.error('Network session did not start in time');
|
|
157
|
+
throw new Error('NETWORK_TIMEOUT');
|
|
158
|
+
}
|
|
159
|
+
await delay(0);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
closeLoadingScreens() {
|
|
163
|
+
try {
|
|
164
|
+
ShutdownLoadingScreen();
|
|
165
|
+
}
|
|
166
|
+
catch (_a) { }
|
|
167
|
+
try {
|
|
168
|
+
ShutdownLoadingScreenNui();
|
|
169
|
+
}
|
|
170
|
+
catch (_b) { }
|
|
171
|
+
}
|
|
172
|
+
async setPlayerModel(model) {
|
|
173
|
+
const modelHash = GetHashKey(model);
|
|
174
|
+
if (!IsModelInCdimage(modelHash) || !IsModelValid(modelHash)) {
|
|
175
|
+
shared_1.loggers.spawn.error('Invalid model requested', { model });
|
|
176
|
+
throw new Error('MODEL_INVALID');
|
|
177
|
+
}
|
|
178
|
+
RequestModel(modelHash);
|
|
179
|
+
while (!HasModelLoaded(modelHash)) {
|
|
180
|
+
await delay(0);
|
|
181
|
+
}
|
|
182
|
+
SetPlayerModel(PlayerId(), modelHash);
|
|
183
|
+
SetModelAsNoLongerNeeded(modelHash);
|
|
184
|
+
const ped = PlayerPedId();
|
|
185
|
+
if (ped !== 0) {
|
|
186
|
+
SetPedDefaultComponentVariation(ped);
|
|
187
|
+
}
|
|
188
|
+
shared_1.loggers.spawn.debug('Player model set', { model, modelHash });
|
|
189
|
+
}
|
|
190
|
+
async ensurePed() {
|
|
191
|
+
const start = GetGameTimer();
|
|
192
|
+
let ped = PlayerPedId();
|
|
193
|
+
while (ped === 0) {
|
|
194
|
+
if (GetGameTimer() - start > PED_TIMEOUT_MS) {
|
|
195
|
+
shared_1.loggers.spawn.error('PlayerPedId() did not become valid in time');
|
|
196
|
+
throw new Error('PED_TIMEOUT');
|
|
197
|
+
}
|
|
198
|
+
await delay(0);
|
|
199
|
+
ped = PlayerPedId();
|
|
200
|
+
}
|
|
201
|
+
return ped;
|
|
202
|
+
}
|
|
203
|
+
async ensureCollisionAt(position, ped) {
|
|
204
|
+
RequestCollisionAtCoord(position.x, position.y, position.z);
|
|
205
|
+
const start = GetGameTimer();
|
|
206
|
+
while (!HasCollisionLoadedAroundEntity(ped)) {
|
|
207
|
+
if (GetGameTimer() - start > COLLISION_TIMEOUT_MS) {
|
|
208
|
+
shared_1.loggers.spawn.warn('Collision did not fully load around entity in time', {
|
|
209
|
+
x: position.x,
|
|
210
|
+
y: position.y,
|
|
211
|
+
z: position.z,
|
|
212
|
+
});
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
await delay(0);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async setupPedForGameplay(ped) {
|
|
219
|
+
SetEntityAsMissionEntity(ped, true, true);
|
|
220
|
+
ClearPedTasksImmediately(ped);
|
|
221
|
+
RemoveAllPedWeapons(ped, true);
|
|
222
|
+
ResetEntityAlpha(ped);
|
|
223
|
+
await delay(0);
|
|
224
|
+
SetEntityAlpha(ped, 255, false);
|
|
225
|
+
SetEntityVisible(ped, true, false);
|
|
226
|
+
SetEntityCollision(ped, true, true);
|
|
227
|
+
SetEntityInvincible(ped, false);
|
|
228
|
+
shared_1.loggers.spawn.debug('Ped prepared for gameplay', { ped });
|
|
229
|
+
}
|
|
230
|
+
async placePed(ped, position, heading) {
|
|
231
|
+
FreezeEntityPosition(ped, true);
|
|
232
|
+
SetEntityCoordsNoOffset(ped, position.x, position.y, position.z, false, false, false);
|
|
233
|
+
SetEntityHeading(ped, heading);
|
|
234
|
+
await delay(0);
|
|
235
|
+
FreezeEntityPosition(ped, false);
|
|
236
|
+
}
|
|
237
|
+
async applyAppearanceIfNeeded(ped, appearance) {
|
|
238
|
+
if (!appearance) {
|
|
239
|
+
SetPedDefaultComponentVariation(ped);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (!this.appearanceService.validateAppearance(appearance)) {
|
|
243
|
+
SetPedDefaultComponentVariation(ped);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
await this.appearanceService.applyAppearance(ped, appearance);
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
shared_1.loggers.spawn.error('Failed to apply appearance, using default variation', {
|
|
251
|
+
error: error instanceof Error ? error.message : String(error),
|
|
252
|
+
});
|
|
253
|
+
SetPedDefaultComponentVariation(ped);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
exports.SpawnService = SpawnService;
|
|
258
|
+
exports.SpawnService = SpawnService = __decorate([
|
|
259
|
+
(0, tsyringe_1.injectable)(),
|
|
260
|
+
__metadata("design:paramtypes", [appearance_service_1.AppearanceService])
|
|
261
|
+
], SpawnService);
|