@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.
Files changed (281) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +360 -0
  3. package/dist/client/client-bootstrap.d.ts +1 -0
  4. package/dist/client/client-bootstrap.js +50 -0
  5. package/dist/client/client-container.d.ts +2 -0
  6. package/dist/client/client-container.js +6 -0
  7. package/dist/client/client-core.d.ts +1 -0
  8. package/dist/client/client-core.js +7 -0
  9. package/dist/client/controllers/spawner.controller.d.ts +12 -0
  10. package/dist/client/controllers/spawner.controller.js +51 -0
  11. package/dist/client/decorators/controller.d.ts +3 -0
  12. package/dist/client/decorators/controller.js +14 -0
  13. package/dist/client/decorators/export.d.ts +7 -0
  14. package/dist/client/decorators/export.js +15 -0
  15. package/dist/client/decorators/gameEvent.d.ts +47 -0
  16. package/dist/client/decorators/gameEvent.js +54 -0
  17. package/dist/client/decorators/index.d.ts +10 -0
  18. package/dist/client/decorators/index.js +26 -0
  19. package/dist/client/decorators/interval.d.ts +7 -0
  20. package/dist/client/decorators/interval.js +15 -0
  21. package/dist/client/decorators/key.d.ts +2 -0
  22. package/dist/client/decorators/key.js +10 -0
  23. package/dist/client/decorators/localEvent.d.ts +7 -0
  24. package/dist/client/decorators/localEvent.js +15 -0
  25. package/dist/client/decorators/nui.d.ts +1 -0
  26. package/dist/client/decorators/nui.js +9 -0
  27. package/dist/client/decorators/onNet.d.ts +1 -0
  28. package/dist/client/decorators/onNet.js +9 -0
  29. package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
  30. package/dist/client/decorators/resourceLifecycle.js +24 -0
  31. package/dist/client/decorators/tick.d.ts +1 -0
  32. package/dist/client/decorators/tick.js +9 -0
  33. package/dist/client/index.d.ts +7 -0
  34. package/dist/client/index.js +23 -0
  35. package/dist/client/interfaces/appearance.interface.d.ts +19 -0
  36. package/dist/client/interfaces/appearance.interface.js +2 -0
  37. package/dist/client/player/player.d.ts +262 -0
  38. package/dist/client/player/player.js +480 -0
  39. package/dist/client/player/player.loader.d.ts +1 -0
  40. package/dist/client/player/player.loader.js +22 -0
  41. package/dist/client/services/appearance.service.d.ts +6 -0
  42. package/dist/client/services/appearance.service.js +89 -0
  43. package/dist/client/services/blip.service.d.ts +112 -0
  44. package/dist/client/services/blip.service.js +215 -0
  45. package/dist/client/services/index.d.ts +9 -0
  46. package/dist/client/services/index.js +25 -0
  47. package/dist/client/services/marker.service.d.ts +94 -0
  48. package/dist/client/services/marker.service.js +153 -0
  49. package/dist/client/services/notification.service.d.ts +76 -0
  50. package/dist/client/services/notification.service.js +111 -0
  51. package/dist/client/services/ped.service.d.ts +182 -0
  52. package/dist/client/services/ped.service.js +302 -0
  53. package/dist/client/services/progress.service.d.ts +82 -0
  54. package/dist/client/services/progress.service.js +210 -0
  55. package/dist/client/services/spawn.service.d.ts +73 -0
  56. package/dist/client/services/spawn.service.js +261 -0
  57. package/dist/client/services/streaming.service.d.ts +165 -0
  58. package/dist/client/services/streaming.service.js +341 -0
  59. package/dist/client/services/textui.service.d.ts +82 -0
  60. package/dist/client/services/textui.service.js +156 -0
  61. package/dist/client/services/vehicle.service.d.ts +168 -0
  62. package/dist/client/services/vehicle.service.js +296 -0
  63. package/dist/client/system/metadata-client.keys.d.ts +13 -0
  64. package/dist/client/system/metadata-client.keys.js +16 -0
  65. package/dist/client/system/processors/export.processor.d.ts +7 -0
  66. package/dist/client/system/processors/export.processor.js +39 -0
  67. package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
  68. package/dist/client/system/processors/gameEvent.processor.js +58 -0
  69. package/dist/client/system/processors/interval.processor.d.ts +7 -0
  70. package/dist/client/system/processors/interval.processor.js +43 -0
  71. package/dist/client/system/processors/key.processor.d.ts +8 -0
  72. package/dist/client/system/processors/key.processor.js +27 -0
  73. package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
  74. package/dist/client/system/processors/localEvent.processor.js +38 -0
  75. package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
  76. package/dist/client/system/processors/netEvent.processor.js +38 -0
  77. package/dist/client/system/processors/nui.processor.d.ts +7 -0
  78. package/dist/client/system/processors/nui.processor.js +40 -0
  79. package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
  80. package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
  81. package/dist/client/system/processors/tick.processor.d.ts +5 -0
  82. package/dist/client/system/processors/tick.processor.js +37 -0
  83. package/dist/client/system/processors.register.d.ts +1 -0
  84. package/dist/client/system/processors.register.js +27 -0
  85. package/dist/client/types/game-events.d.ts +126 -0
  86. package/dist/client/types/game-events.js +83 -0
  87. package/dist/client/types/index.d.ts +1 -0
  88. package/dist/client/types/index.js +17 -0
  89. package/dist/client/ui-bridge.d.ts +116 -0
  90. package/dist/client/ui-bridge.js +201 -0
  91. package/dist/index.d.ts +5 -0
  92. package/dist/index.js +41 -0
  93. package/dist/server/bootstrap.d.ts +16 -0
  94. package/dist/server/bootstrap.js +57 -0
  95. package/dist/server/bus/core-event-bus.d.ts +6 -0
  96. package/dist/server/bus/core-event-bus.js +31 -0
  97. package/dist/server/configs/api.config.d.ts +71 -0
  98. package/dist/server/configs/api.config.js +81 -0
  99. package/dist/server/configs/config.base.d.ts +63 -0
  100. package/dist/server/configs/config.base.js +64 -0
  101. package/dist/server/configs/index.d.ts +2 -0
  102. package/dist/server/configs/index.js +18 -0
  103. package/dist/server/container.d.ts +2 -0
  104. package/dist/server/container.js +6 -0
  105. package/dist/server/controllers/chat.controller.d.ts +10 -0
  106. package/dist/server/controllers/chat.controller.js +50 -0
  107. package/dist/server/controllers/command.controller.d.ts +7 -0
  108. package/dist/server/controllers/command.controller.js +47 -0
  109. package/dist/server/controllers/session.controller.d.ts +9 -0
  110. package/dist/server/controllers/session.controller.js +70 -0
  111. package/dist/server/core.d.ts +1 -0
  112. package/dist/server/core.js +7 -0
  113. package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
  114. package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
  115. package/dist/server/database/database.contract.d.ts +128 -0
  116. package/dist/server/database/database.contract.js +29 -0
  117. package/dist/server/database/database.service.d.ts +216 -0
  118. package/dist/server/database/database.service.js +301 -0
  119. package/dist/server/database/index.d.ts +53 -0
  120. package/dist/server/database/index.js +70 -0
  121. package/dist/server/database/types.d.ts +67 -0
  122. package/dist/server/database/types.js +7 -0
  123. package/dist/server/database.d.ts +7 -0
  124. package/dist/server/database.js +23 -0
  125. package/dist/server/decorators/bind.d.ts +2 -0
  126. package/dist/server/decorators/bind.js +15 -0
  127. package/dist/server/decorators/command.d.ts +49 -0
  128. package/dist/server/decorators/command.js +23 -0
  129. package/dist/server/decorators/controller.d.ts +25 -0
  130. package/dist/server/decorators/controller.js +36 -0
  131. package/dist/server/decorators/export.d.ts +39 -0
  132. package/dist/server/decorators/export.js +47 -0
  133. package/dist/server/decorators/guard.d.ts +56 -0
  134. package/dist/server/decorators/guard.js +82 -0
  135. package/dist/server/decorators/index.d.ts +10 -0
  136. package/dist/server/decorators/index.js +29 -0
  137. package/dist/server/decorators/onFiveMEvent.d.ts +6 -0
  138. package/dist/server/decorators/onFiveMEvent.js +14 -0
  139. package/dist/server/decorators/onFrameworkEvent.d.ts +22 -0
  140. package/dist/server/decorators/onFrameworkEvent.js +29 -0
  141. package/dist/server/decorators/onNet.d.ts +58 -0
  142. package/dist/server/decorators/onNet.js +57 -0
  143. package/dist/server/decorators/onTick.d.ts +32 -0
  144. package/dist/server/decorators/onTick.js +40 -0
  145. package/dist/server/decorators/public.d.ts +27 -0
  146. package/dist/server/decorators/public.js +36 -0
  147. package/dist/server/decorators/requiresState.d.ts +56 -0
  148. package/dist/server/decorators/requiresState.js +63 -0
  149. package/dist/server/decorators/throttle.d.ts +48 -0
  150. package/dist/server/decorators/throttle.js +63 -0
  151. package/dist/server/decorators/utils.d.ts +57 -0
  152. package/dist/server/decorators/utils.js +63 -0
  153. package/dist/server/entities/index.d.ts +1 -0
  154. package/dist/server/entities/index.js +17 -0
  155. package/dist/server/entities/player.d.ts +157 -0
  156. package/dist/server/entities/player.js +217 -0
  157. package/dist/server/error-handler.d.ts +2 -0
  158. package/dist/server/error-handler.js +43 -0
  159. package/dist/server/helpers/resolve-method.d.ts +5 -0
  160. package/dist/server/helpers/resolve-method.js +18 -0
  161. package/dist/server/index.d.ts +10 -0
  162. package/dist/server/index.js +31 -0
  163. package/dist/server/loaders/exports.loader.d.ts +0 -0
  164. package/dist/server/loaders/exports.loader.js +23 -0
  165. package/dist/server/loaders/playerSession.loader.d.ts +1 -0
  166. package/dist/server/loaders/playerSession.loader.js +51 -0
  167. package/dist/server/services/access-control.service.d.ts +56 -0
  168. package/dist/server/services/access-control.service.js +99 -0
  169. package/dist/server/services/chat.service.d.ts +7 -0
  170. package/dist/server/services/chat.service.js +31 -0
  171. package/dist/server/services/command.service.d.ts +15 -0
  172. package/dist/server/services/command.service.js +77 -0
  173. package/dist/server/services/config.service.d.ts +75 -0
  174. package/dist/server/services/config.service.js +116 -0
  175. package/dist/server/services/default/default-security.handler.d.ts +6 -0
  176. package/dist/server/services/default/default-security.handler.js +26 -0
  177. package/dist/server/services/http/http.service.d.ts +50 -0
  178. package/dist/server/services/http/http.service.js +126 -0
  179. package/dist/server/services/index.d.ts +10 -0
  180. package/dist/server/services/index.js +26 -0
  181. package/dist/server/services/parallel/index.d.ts +49 -0
  182. package/dist/server/services/parallel/index.js +67 -0
  183. package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
  184. package/dist/server/services/parallel/parallel-compute.service.js +449 -0
  185. package/dist/server/services/parallel/types.d.ts +188 -0
  186. package/dist/server/services/parallel/types.js +7 -0
  187. package/dist/server/services/parallel/worker-pool.d.ts +83 -0
  188. package/dist/server/services/parallel/worker-pool.js +350 -0
  189. package/dist/server/services/parallel/worker.d.ts +19 -0
  190. package/dist/server/services/parallel/worker.js +49 -0
  191. package/dist/server/services/persistence.service.d.ts +59 -0
  192. package/dist/server/services/persistence.service.js +166 -0
  193. package/dist/server/services/player.service.d.ts +96 -0
  194. package/dist/server/services/player.service.js +132 -0
  195. package/dist/server/services/rate-limiter.service.d.ts +5 -0
  196. package/dist/server/services/rate-limiter.service.js +39 -0
  197. package/dist/server/services/registers.d.ts +1 -0
  198. package/dist/server/services/registers.js +18 -0
  199. package/dist/server/setup.d.ts +9 -0
  200. package/dist/server/setup.js +28 -0
  201. package/dist/server/system/metadata-server.keys.d.ts +10 -0
  202. package/dist/server/system/metadata-server.keys.js +13 -0
  203. package/dist/server/system/processors/command.processor.d.ts +9 -0
  204. package/dist/server/system/processors/command.processor.js +30 -0
  205. package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
  206. package/dist/server/system/processors/coreEvent.processor.js +41 -0
  207. package/dist/server/system/processors/export.processor.d.ts +7 -0
  208. package/dist/server/system/processors/export.processor.js +30 -0
  209. package/dist/server/system/processors/fivemEvent.processor.d.ts +7 -0
  210. package/dist/server/system/processors/fivemEvent.processor.js +40 -0
  211. package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
  212. package/dist/server/system/processors/netEvent.processor.js +103 -0
  213. package/dist/server/system/processors/tick.processor.d.ts +5 -0
  214. package/dist/server/system/processors/tick.processor.js +36 -0
  215. package/dist/server/system/processors.register.d.ts +1 -0
  216. package/dist/server/system/processors.register.js +23 -0
  217. package/dist/server/system/schema-generator.d.ts +2 -0
  218. package/dist/server/system/schema-generator.js +34 -0
  219. package/dist/server/templates/admin/admin.controller-template.d.ts +12 -0
  220. package/dist/server/templates/admin/admin.controller-template.js +2 -0
  221. package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
  222. package/dist/server/templates/auth/auth-provider.contract.js +23 -0
  223. package/dist/server/templates/index.d.ts +8 -0
  224. package/dist/server/templates/index.js +21 -0
  225. package/dist/server/templates/persistence/index.d.ts +30 -0
  226. package/dist/server/templates/persistence/index.js +34 -0
  227. package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
  228. package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
  229. package/dist/server/templates/repository/index.d.ts +57 -0
  230. package/dist/server/templates/repository/index.js +61 -0
  231. package/dist/server/templates/repository/repository.contract.d.ts +224 -0
  232. package/dist/server/templates/repository/repository.contract.js +342 -0
  233. package/dist/server/templates/repository/repository.types.d.ts +51 -0
  234. package/dist/server/templates/repository/repository.types.js +7 -0
  235. package/dist/server/templates/security/permission.types.d.ts +32 -0
  236. package/dist/server/templates/security/permission.types.js +2 -0
  237. package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
  238. package/dist/server/templates/security/principal-provider.contract.js +19 -0
  239. package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
  240. package/dist/server/templates/security/security-handler.contract.js +6 -0
  241. package/dist/server/types/core-events.d.ts +22 -0
  242. package/dist/server/types/core-events.js +2 -0
  243. package/dist/server/types/security.types.d.ts +7 -0
  244. package/dist/server/types/security.types.js +2 -0
  245. package/dist/shared/index.d.ts +1 -0
  246. package/dist/shared/index.js +17 -0
  247. package/dist/shared/logger/core-logger.d.ts +35 -0
  248. package/dist/shared/logger/core-logger.js +52 -0
  249. package/dist/shared/logger/index.d.ts +11 -0
  250. package/dist/shared/logger/index.js +26 -0
  251. package/dist/shared/logger/logger.config.d.ts +47 -0
  252. package/dist/shared/logger/logger.config.js +33 -0
  253. package/dist/shared/logger/logger.service.d.ts +161 -0
  254. package/dist/shared/logger/logger.service.js +279 -0
  255. package/dist/shared/logger/logger.types.d.ts +85 -0
  256. package/dist/shared/logger/logger.types.js +74 -0
  257. package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
  258. package/dist/shared/logger/transports/buffered.transport.js +174 -0
  259. package/dist/shared/logger/transports/console.transport.d.ts +37 -0
  260. package/dist/shared/logger/transports/console.transport.js +134 -0
  261. package/dist/shared/logger/transports/index.d.ts +3 -0
  262. package/dist/shared/logger/transports/index.js +19 -0
  263. package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
  264. package/dist/shared/logger/transports/transport.interface.js +2 -0
  265. package/dist/system/class-constructor.d.ts +1 -0
  266. package/dist/system/class-constructor.js +2 -0
  267. package/dist/system/decorator-processor.d.ts +4 -0
  268. package/dist/system/decorator-processor.js +2 -0
  269. package/dist/system/metadata.scanner.d.ts +7 -0
  270. package/dist/system/metadata.scanner.js +45 -0
  271. package/dist/utils/errors.d.ts +14 -0
  272. package/dist/utils/errors.js +25 -0
  273. package/dist/utils/index.d.ts +4 -0
  274. package/dist/utils/index.js +20 -0
  275. package/dist/utils/result.d.ts +12 -0
  276. package/dist/utils/result.js +10 -0
  277. package/dist/utils/rgb.d.ts +5 -0
  278. package/dist/utils/rgb.js +2 -0
  279. package/dist/utils/vector3.d.ts +13 -0
  280. package/dist/utils/vector3.js +27 -0
  281. 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);