@open-core/framework 1.0.5-beta.2 → 1.0.6

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 (128) hide show
  1. package/README.md +2 -8
  2. package/dist/adapters/contracts/IEngineEvents.d.ts +3 -3
  3. package/dist/adapters/contracts/IExports.d.ts +2 -2
  4. package/dist/adapters/contracts/client/IClientLocalPlayerBridge.d.ts +21 -0
  5. package/dist/adapters/contracts/client/IClientLocalPlayerBridge.js +6 -0
  6. package/dist/adapters/contracts/client/IClientRuntimeBridge.d.ts +5 -5
  7. package/dist/adapters/contracts/client/camera/IClientCameraPort.d.ts +107 -0
  8. package/dist/adapters/contracts/client/camera/IClientCameraPort.js +8 -0
  9. package/dist/adapters/contracts/client/camera/index.d.ts +1 -0
  10. package/dist/adapters/contracts/client/camera/index.js +1 -0
  11. package/dist/adapters/contracts/client/index.d.ts +4 -0
  12. package/dist/adapters/contracts/client/index.js +4 -0
  13. package/dist/adapters/contracts/client/ped/IClientPedPort.d.ts +62 -0
  14. package/dist/adapters/contracts/client/ped/IClientPedPort.js +5 -0
  15. package/dist/adapters/contracts/client/ped/index.d.ts +1 -0
  16. package/dist/adapters/contracts/client/ped/index.js +1 -0
  17. package/dist/adapters/contracts/client/progress/IClientProgressPort.d.ts +53 -0
  18. package/dist/adapters/contracts/client/progress/IClientProgressPort.js +8 -0
  19. package/dist/adapters/contracts/client/progress/index.d.ts +1 -0
  20. package/dist/adapters/contracts/client/progress/index.js +1 -0
  21. package/dist/adapters/contracts/client/spawn/IClientSpawnBridge.d.ts +5 -6
  22. package/dist/adapters/contracts/client/spawn/IClientSpawnBridge.js +5 -1
  23. package/dist/adapters/contracts/client/spawn/IClientSpawnPort.d.ts +19 -0
  24. package/dist/adapters/contracts/client/spawn/IClientSpawnPort.js +2 -0
  25. package/dist/adapters/contracts/client/spawn/index.d.ts +2 -0
  26. package/dist/adapters/contracts/client/spawn/index.js +2 -0
  27. package/dist/adapters/contracts/client/spawn/types.d.ts +3 -0
  28. package/dist/adapters/contracts/client/ui/webview/IClientWebViewBridge.d.ts +1 -0
  29. package/dist/adapters/contracts/client/ui/webview/types.d.ts +2 -0
  30. package/dist/adapters/contracts/client/vehicle/IClientVehiclePort.d.ts +166 -0
  31. package/dist/adapters/contracts/client/vehicle/IClientVehiclePort.js +8 -0
  32. package/dist/adapters/contracts/client/vehicle/index.d.ts +1 -0
  33. package/dist/adapters/contracts/client/vehicle/index.js +1 -0
  34. package/dist/adapters/contracts/transport/events.api.d.ts +3 -3
  35. package/dist/adapters/contracts/transport/index.d.ts +1 -0
  36. package/dist/adapters/contracts/transport/index.js +1 -0
  37. package/dist/adapters/contracts/transport/rpc-error.d.ts +17 -0
  38. package/dist/adapters/contracts/transport/rpc-error.js +28 -0
  39. package/dist/adapters/contracts/transport/rpc.api.d.ts +3 -3
  40. package/dist/adapters/node/transport/node.events.d.ts +4 -4
  41. package/dist/adapters/node/transport/node.rpc.d.ts +3 -3
  42. package/dist/adapters/node/transport/node.rpc.js +1 -1
  43. package/dist/contracts.d.ts +1 -0
  44. package/dist/contracts.js +1 -0
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.js +1 -0
  47. package/dist/kernel/logger/client-log-console.js +8 -8
  48. package/dist/kernel/logger/index.d.ts +1 -1
  49. package/dist/kernel/logger/index.js +1 -1
  50. package/dist/kernel/logger/logger.types.d.ts +1 -0
  51. package/dist/kernel/logger/logger.types.js +35 -0
  52. package/dist/kernel/logger/transports/buffered.transport.js +4 -4
  53. package/dist/kernel/logger/transports/console.transport.js +2 -2
  54. package/dist/kernel/logger/transports/simple-console.transport.js +2 -2
  55. package/dist/runtime/client/adapter/index.d.ts +5 -0
  56. package/dist/runtime/client/adapter/index.js +5 -0
  57. package/dist/runtime/client/adapter/node-camera-port.d.ts +19 -0
  58. package/dist/runtime/client/adapter/node-camera-port.js +31 -0
  59. package/dist/runtime/client/adapter/node-client-adapter.js +15 -1
  60. package/dist/runtime/client/adapter/node-local-player-bridge.d.ts +3 -0
  61. package/dist/runtime/client/adapter/node-local-player-bridge.js +9 -0
  62. package/dist/runtime/client/adapter/node-log-console.js +8 -8
  63. package/dist/runtime/client/adapter/node-ped-port.d.ts +20 -0
  64. package/dist/runtime/client/adapter/node-ped-port.js +38 -0
  65. package/dist/runtime/client/adapter/node-progress-port.d.ts +8 -0
  66. package/dist/runtime/client/adapter/node-progress-port.js +27 -0
  67. package/dist/runtime/client/adapter/node-runtime-bridge.d.ts +2 -4
  68. package/dist/runtime/client/adapter/node-spawn-bridge.d.ts +5 -5
  69. package/dist/runtime/client/adapter/node-spawn-bridge.js +8 -4
  70. package/dist/runtime/client/adapter/node-vehicle-port.d.ts +31 -0
  71. package/dist/runtime/client/adapter/node-vehicle-port.js +73 -0
  72. package/dist/runtime/client/adapter/node-webview-bridge.d.ts +1 -0
  73. package/dist/runtime/client/adapter/node-webview-bridge.js +2 -0
  74. package/dist/runtime/client/controllers/appearance.controller.d.ts +3 -3
  75. package/dist/runtime/client/controllers/appearance.controller.js +11 -10
  76. package/dist/runtime/client/controllers/spawner.controller.js +4 -3
  77. package/dist/runtime/client/services/camera.d.ts +4 -26
  78. package/dist/runtime/client/services/camera.js +21 -27
  79. package/dist/runtime/client/services/notification.service.d.ts +3 -3
  80. package/dist/runtime/client/services/notification.service.js +7 -7
  81. package/dist/runtime/client/services/ped.service.d.ts +6 -21
  82. package/dist/runtime/client/services/ped.service.js +31 -78
  83. package/dist/runtime/client/services/progress.service.d.ts +4 -50
  84. package/dist/runtime/client/services/progress.service.js +11 -143
  85. package/dist/runtime/client/services/session-bridge.service.js +3 -2
  86. package/dist/runtime/client/services/spawn.service.d.ts +3 -5
  87. package/dist/runtime/client/services/spawn.service.js +12 -17
  88. package/dist/runtime/client/services/vehicle-client.service.d.ts +3 -3
  89. package/dist/runtime/client/services/vehicle-client.service.js +43 -143
  90. package/dist/runtime/client/services/vehicle.service.d.ts +4 -41
  91. package/dist/runtime/client/services/vehicle.service.js +24 -130
  92. package/dist/runtime/client/webview-bridge.d.ts +3 -0
  93. package/dist/runtime/client/webview-bridge.js +6 -0
  94. package/dist/runtime/client/webview.service.d.ts +1 -0
  95. package/dist/runtime/client/webview.service.js +5 -0
  96. package/dist/runtime/server/adapter/node-player-appearance-lifecycle-server.js +3 -2
  97. package/dist/runtime/server/adapter/node-player-lifecycle-server.js +4 -3
  98. package/dist/runtime/server/adapter/node-vehicle-lifecycle-server.js +2 -1
  99. package/dist/runtime/server/apis/chat.api.js +6 -5
  100. package/dist/runtime/server/apis/npcs.api.js +2 -1
  101. package/dist/runtime/server/apis/parallel-compute.api.js +1 -0
  102. package/dist/runtime/server/apis/vehicle-modification.api.js +6 -4
  103. package/dist/runtime/server/apis/vehicles.api.js +7 -4
  104. package/dist/runtime/server/bootstrap.js +13 -12
  105. package/dist/runtime/server/controllers/command-export.controller.js +4 -2
  106. package/dist/runtime/server/controllers/remote-command-execution.controller.js +2 -1
  107. package/dist/runtime/server/controllers/vehicle.controller.js +6 -5
  108. package/dist/runtime/server/decorators/command.d.ts +2 -0
  109. package/dist/runtime/server/decorators/command.js +3 -1
  110. package/dist/runtime/server/entities/npc.d.ts +1 -1
  111. package/dist/runtime/server/entities/player.d.ts +1 -1
  112. package/dist/runtime/server/entities/player.js +10 -3
  113. package/dist/runtime/server/helpers/command-validation.helper.js +20 -7
  114. package/dist/runtime/server/helpers/function-helper.d.ts +1 -0
  115. package/dist/runtime/server/helpers/function-helper.js +15 -8
  116. package/dist/runtime/server/implementations/local/channel.local.d.ts +1 -1
  117. package/dist/runtime/server/implementations/local/channel.local.js +3 -2
  118. package/dist/runtime/server/ports/channel.api-port.d.ts +1 -1
  119. package/dist/runtime/server/services/parallel/worker-pool.d.ts +1 -1
  120. package/dist/runtime/server/services/parallel/worker-pool.js +38 -6
  121. package/dist/runtime/server/services/parallel/worker.js +1 -0
  122. package/dist/runtime/server/system/processors/onRpc.processor.js +14 -3
  123. package/dist/runtime/server/system/schema-generator.d.ts +1 -1
  124. package/dist/runtime/server/system/schema-generator.js +6 -3
  125. package/dist/runtime/shared/helpers/process-tuple-schema.js +3 -0
  126. package/dist/runtime/shared/types/system-types.d.ts +55 -0
  127. package/dist/runtime/shared/types/system-types.js +54 -0
  128. package/package.json +21 -11
@@ -11,183 +11,77 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
13
  import { inject, injectable } from 'tsyringe';
14
- import { IClientPlatformBridge } from '../adapter/platform-bridge';
14
+ import { IClientVehiclePort, } from '../../../adapters/contracts/client/vehicle/IClientVehiclePort';
15
15
  let VehicleService = class VehicleService {
16
- platform;
17
- constructor(platform) {
18
- this.platform = platform;
16
+ vehicles;
17
+ constructor(vehicles) {
18
+ this.vehicles = vehicles;
19
19
  }
20
20
  async spawn(options) {
21
- const { model, position, heading = 0, placeOnGround = true, warpIntoVehicle = false, seatIndex = -1, primaryColor, secondaryColor, plate, networked = true, } = options;
22
- const modelHash = this.platform.getHashKey(model);
23
- if (!this.platform.isModelInCdimage(modelHash) || !this.platform.isModelAVehicle(modelHash)) {
24
- throw new Error(`Invalid vehicle model: ${model}`);
25
- }
26
- this.platform.requestModel(modelHash);
27
- while (!this.platform.hasModelLoaded(modelHash)) {
28
- await new Promise((r) => setTimeout(r, 0));
29
- }
30
- const vehicle = this.platform.createVehicle(modelHash, position, heading, networked, false);
31
- this.platform.setModelAsNoLongerNeeded(modelHash);
32
- if (!vehicle || vehicle === 0)
33
- throw new Error('Failed to create vehicle');
34
- if (placeOnGround)
35
- this.platform.setVehicleOnGroundProperly(vehicle);
36
- if (primaryColor !== undefined || secondaryColor !== undefined) {
37
- const [currentPrimary, currentSecondary] = this.platform.getVehicleColours(vehicle);
38
- this.platform.setVehicleColours(vehicle, primaryColor ?? currentPrimary, secondaryColor ?? currentSecondary);
39
- }
40
- if (plate)
41
- this.platform.setVehicleNumberPlateText(vehicle, plate);
42
- if (warpIntoVehicle)
43
- this.platform.taskWarpPedIntoVehicle(this.platform.getLocalPlayerPed(), vehicle, seatIndex);
44
- return vehicle;
21
+ return this.vehicles.spawn(options);
45
22
  }
46
23
  delete(vehicle) {
47
- if (this.platform.doesEntityExist(vehicle)) {
48
- this.platform.setEntityAsMissionEntity(vehicle, true, true);
49
- this.platform.deleteVehicle(vehicle);
50
- }
24
+ this.vehicles.delete(vehicle);
51
25
  }
52
26
  deleteCurrentVehicle() {
53
27
  const vehicle = this.getCurrentVehicle();
54
28
  if (vehicle) {
55
- this.platform.taskLeaveVehicle(this.platform.getLocalPlayerPed(), vehicle, 16);
29
+ this.vehicles.leaveLocalPlayerVehicle(vehicle, 16);
56
30
  setTimeout(() => this.delete(vehicle), 1000);
57
31
  }
58
32
  }
59
33
  repair(vehicle) {
60
- if (!this.platform.doesEntityExist(vehicle))
61
- return;
62
- this.platform.setVehicleFixed(vehicle);
63
- this.platform.setVehicleDeformationFixed(vehicle);
64
- this.platform.setVehicleUndriveable(vehicle, false);
65
- this.platform.setVehicleEngineOn(vehicle, true, true, false);
66
- this.platform.setVehicleEngineHealth(vehicle, 1000.0);
67
- this.platform.setVehiclePetrolTankHealth(vehicle, 1000.0);
34
+ this.vehicles.repair(vehicle);
68
35
  }
69
36
  setFuel(vehicle, level) {
70
- if (!this.platform.doesEntityExist(vehicle))
71
- return;
72
- this.platform.setVehicleFuelLevel(vehicle, Math.max(0, Math.min(100, level * 100)));
37
+ this.vehicles.setFuel(vehicle, level);
73
38
  }
74
39
  getFuel(vehicle) {
75
- if (!this.platform.doesEntityExist(vehicle))
76
- return 0;
77
- return this.platform.getVehicleFuelLevel(vehicle) / 100;
40
+ return this.vehicles.getFuel(vehicle);
78
41
  }
79
42
  getClosest(radius = 10.0) {
80
- const playerPed = this.platform.getLocalPlayerPed();
81
- return this.platform.getClosestVehicle(this.platform.getEntityCoords(playerPed), radius);
43
+ return this.vehicles.getClosest(radius);
82
44
  }
83
45
  isPlayerInVehicle() {
84
- return this.platform.isPedInAnyVehicle(this.platform.getLocalPlayerPed());
46
+ return this.vehicles.isLocalPlayerInVehicle();
85
47
  }
86
48
  getCurrentVehicle() {
87
- const ped = this.platform.getLocalPlayerPed();
88
- if (!this.platform.isPedInAnyVehicle(ped))
89
- return null;
90
- return this.platform.getVehiclePedIsIn(ped, false);
49
+ return this.vehicles.getCurrentForLocalPlayer();
91
50
  }
92
51
  getLastVehicle() {
93
- return this.platform.getVehiclePedIsIn(this.platform.getLocalPlayerPed(), true);
52
+ return this.vehicles.getLastForLocalPlayer();
94
53
  }
95
54
  isPlayerDriver() {
96
55
  const vehicle = this.getCurrentVehicle();
97
56
  if (!vehicle)
98
57
  return false;
99
- return this.platform.getPedInVehicleSeat(vehicle, -1) === this.platform.getLocalPlayerPed();
58
+ return this.vehicles.isLocalPlayerDriver(vehicle);
100
59
  }
101
60
  setMods(vehicle, mods) {
102
- if (!this.platform.doesEntityExist(vehicle))
103
- return;
104
- this.platform.setVehicleModKit(vehicle, 0);
105
- if (mods.spoiler !== undefined)
106
- this.platform.setVehicleMod(vehicle, 0, mods.spoiler, false);
107
- if (mods.frontBumper !== undefined)
108
- this.platform.setVehicleMod(vehicle, 1, mods.frontBumper, false);
109
- if (mods.rearBumper !== undefined)
110
- this.platform.setVehicleMod(vehicle, 2, mods.rearBumper, false);
111
- if (mods.sideSkirt !== undefined)
112
- this.platform.setVehicleMod(vehicle, 3, mods.sideSkirt, false);
113
- if (mods.exhaust !== undefined)
114
- this.platform.setVehicleMod(vehicle, 4, mods.exhaust, false);
115
- if (mods.frame !== undefined)
116
- this.platform.setVehicleMod(vehicle, 5, mods.frame, false);
117
- if (mods.grille !== undefined)
118
- this.platform.setVehicleMod(vehicle, 6, mods.grille, false);
119
- if (mods.hood !== undefined)
120
- this.platform.setVehicleMod(vehicle, 7, mods.hood, false);
121
- if (mods.fender !== undefined)
122
- this.platform.setVehicleMod(vehicle, 8, mods.fender, false);
123
- if (mods.rightFender !== undefined)
124
- this.platform.setVehicleMod(vehicle, 9, mods.rightFender, false);
125
- if (mods.roof !== undefined)
126
- this.platform.setVehicleMod(vehicle, 10, mods.roof, false);
127
- if (mods.engine !== undefined)
128
- this.platform.setVehicleMod(vehicle, 11, mods.engine, false);
129
- if (mods.brakes !== undefined)
130
- this.platform.setVehicleMod(vehicle, 12, mods.brakes, false);
131
- if (mods.transmission !== undefined)
132
- this.platform.setVehicleMod(vehicle, 13, mods.transmission, false);
133
- if (mods.horns !== undefined)
134
- this.platform.setVehicleMod(vehicle, 14, mods.horns, false);
135
- if (mods.suspension !== undefined)
136
- this.platform.setVehicleMod(vehicle, 15, mods.suspension, false);
137
- if (mods.armor !== undefined)
138
- this.platform.setVehicleMod(vehicle, 16, mods.armor, false);
139
- if (mods.turbo !== undefined)
140
- this.platform.toggleVehicleMod(vehicle, 18, mods.turbo);
141
- if (mods.xenon !== undefined)
142
- this.platform.toggleVehicleMod(vehicle, 22, mods.xenon);
143
- if (mods.wheelType !== undefined)
144
- this.platform.setVehicleWheelType(vehicle, mods.wheelType);
145
- if (mods.wheels !== undefined)
146
- this.platform.setVehicleMod(vehicle, 23, mods.wheels, false);
147
- if (mods.windowTint !== undefined)
148
- this.platform.setVehicleWindowTint(vehicle, mods.windowTint);
149
- if (mods.livery !== undefined)
150
- this.platform.setVehicleLivery(vehicle, mods.livery);
151
- if (mods.plateStyle !== undefined)
152
- this.platform.setVehicleNumberPlateTextIndex(vehicle, mods.plateStyle);
61
+ this.vehicles.applyMods(vehicle, mods);
153
62
  }
154
63
  setDoorsLocked(vehicle, locked) {
155
- if (!this.platform.doesEntityExist(vehicle))
156
- return;
157
- this.platform.setVehicleDoorsLocked(vehicle, locked ? 2 : 0);
64
+ this.vehicles.setDoorsLocked(vehicle, locked);
158
65
  }
159
66
  setEngineRunning(vehicle, running, instant = false) {
160
- if (!this.platform.doesEntityExist(vehicle))
161
- return;
162
- this.platform.setVehicleEngineOn(vehicle, running, instant, true);
67
+ this.vehicles.setEngineRunning(vehicle, running, instant);
163
68
  }
164
69
  setInvincible(vehicle, invincible) {
165
- if (!this.platform.doesEntityExist(vehicle))
166
- return;
167
- this.platform.setEntityInvincible(vehicle, invincible);
70
+ this.vehicles.setInvincible(vehicle, invincible);
168
71
  }
169
72
  getSpeed(vehicle) {
170
- if (!this.platform.doesEntityExist(vehicle))
171
- return 0;
172
- return this.platform.getEntitySpeed(vehicle) * 3.6;
73
+ return this.vehicles.getSpeed(vehicle) * 3.6;
173
74
  }
174
75
  setHeading(vehicle, heading) {
175
- if (!this.platform.doesEntityExist(vehicle))
176
- return;
177
- this.platform.setEntityHeading(vehicle, heading);
76
+ this.vehicles.setHeading(vehicle, heading);
178
77
  }
179
78
  teleport(vehicle, position, heading) {
180
- if (!this.platform.doesEntityExist(vehicle))
181
- return;
182
- this.platform.setEntityCoords(vehicle, position);
183
- if (heading !== undefined)
184
- this.platform.setEntityHeading(vehicle, heading);
185
- this.platform.setVehicleOnGroundProperly(vehicle);
79
+ this.vehicles.teleport(vehicle, position, heading);
186
80
  }
187
81
  };
188
82
  VehicleService = __decorate([
189
83
  injectable(),
190
- __param(0, inject(IClientPlatformBridge)),
191
- __metadata("design:paramtypes", [IClientPlatformBridge])
84
+ __param(0, inject(IClientVehiclePort)),
85
+ __metadata("design:paramtypes", [IClientVehiclePort])
192
86
  ], VehicleService);
193
87
  export { VehicleService };
@@ -9,15 +9,18 @@ export declare class WebViewBridge<TSend extends Record<string, any> = Record<st
9
9
  focused?: boolean;
10
10
  cursor?: boolean;
11
11
  inputPassthrough?: boolean;
12
+ chatMode?: boolean;
12
13
  }): void;
13
14
  destroy(): void;
14
15
  exists(): boolean;
16
+ getCapabilities(): import("../../contracts/client").WebViewCapabilities;
15
17
  send<K extends keyof TSend & string>(action: K, data: TSend[K]): void;
16
18
  sendRaw(action: string, data: unknown): void;
17
19
  on<K extends keyof TReceive & string>(action: K, handler: (data: TReceive[K]) => void | Promise<void>): () => void;
18
20
  onWithResponse<K extends keyof TReceive & string, R = unknown>(action: K, handler: (data: TReceive[K]) => R | Promise<R>): () => void;
19
21
  focus(hasFocus: boolean, hasCursor?: boolean): void;
20
22
  blur(): void;
23
+ markAsChat(): void;
21
24
  setVisible(visible: boolean): void;
22
25
  show(withFocus?: boolean, withCursor?: boolean): void;
23
26
  hide(): void;
@@ -31,6 +31,9 @@ let WebViewBridge = class WebViewBridge {
31
31
  exists() {
32
32
  return this.service.exists(this.viewId);
33
33
  }
34
+ getCapabilities() {
35
+ return this.service.getCapabilities();
36
+ }
34
37
  send(action, data) {
35
38
  this.service.send(this.viewId, action, data);
36
39
  }
@@ -58,6 +61,9 @@ let WebViewBridge = class WebViewBridge {
58
61
  blur() {
59
62
  this.service.blur(this.viewId);
60
63
  }
64
+ markAsChat() {
65
+ this.service.markAsChat(this.viewId);
66
+ }
61
67
  setVisible(visible) {
62
68
  visible ? this.service.show(this.viewId) : this.service.hide(this.viewId);
63
69
  }
@@ -9,6 +9,7 @@ export declare class WebViewService {
9
9
  hide(viewId: string): void;
10
10
  focus(viewId: string, options?: WebViewFocusOptions): void;
11
11
  blur(viewId: string): void;
12
+ markAsChat(viewId: string): void;
12
13
  send(viewId: string, event: string, payload: unknown): void;
13
14
  onMessage(handler: (message: WebViewMessage) => void | Promise<void>): () => void;
14
15
  }
@@ -17,6 +17,7 @@ const FALLBACK_CAPABILITIES = {
17
17
  supportsBidirectionalMessaging: true,
18
18
  supportsExecute: false,
19
19
  supportsHeadless: false,
20
+ supportsChatMode: false,
20
21
  };
21
22
  function createFallbackBridge() {
22
23
  const runtime = di.resolve(IClientRuntimeBridge);
@@ -34,6 +35,7 @@ function createFallbackBridge() {
34
35
  runtime.setWebViewInputPassthrough(options?.inputPassthrough ?? false);
35
36
  },
36
37
  blur: () => runtime.setWebViewFocus(false, false),
38
+ markAsChat: () => { },
37
39
  send: (viewId, event, payload) => {
38
40
  runtime.sendWebViewMessage(JSON.stringify({ __opencoreWebView: true, viewId, action: event, data: payload }));
39
41
  },
@@ -85,6 +87,9 @@ let WebViewService = class WebViewService {
85
87
  blur(viewId) {
86
88
  this.bridge.blur(viewId);
87
89
  }
90
+ markAsChat(viewId) {
91
+ this.bridge.markAsChat(viewId);
92
+ }
88
93
  send(viewId, event, payload) {
89
94
  this.bridge.send(viewId, event, payload);
90
95
  }
@@ -16,6 +16,7 @@ import { IPedAppearanceServer } from '../../../adapters/contracts/server/IPedApp
16
16
  import { IPlayerAppearanceLifecycleServer } from '../../../adapters/contracts/server/player-appearance/IPlayerAppearanceLifecycleServer';
17
17
  import { IPlayerServer } from '../../../adapters/contracts/server/IPlayerServer';
18
18
  import { Players } from '../ports/players.api-port';
19
+ import { SYSTEM_EVENTS } from '../../shared/types/system-types';
19
20
  let NodePlayerAppearanceLifecycleServer = class NodePlayerAppearanceLifecycleServer extends IPlayerAppearanceLifecycleServer {
20
21
  pedAdapter;
21
22
  playerServer;
@@ -38,7 +39,7 @@ let NodePlayerAppearanceLifecycleServer = class NodePlayerAppearanceLifecycleSer
38
39
  if (!target) {
39
40
  return { success: false, errors: ['Player not found'] };
40
41
  }
41
- this.events.emit('opencore:appearance:apply', target, appearance);
42
+ this.events.emit(SYSTEM_EVENTS.appearance.apply, target, appearance);
42
43
  return { success: true, appearance };
43
44
  }
44
45
  applyClothing(playerSrc, appearance) {
@@ -56,7 +57,7 @@ let NodePlayerAppearanceLifecycleServer = class NodePlayerAppearanceLifecycleSer
56
57
  const target = this.resolveTarget(playerSrc);
57
58
  if (!target)
58
59
  return false;
59
- this.events.emit('opencore:appearance:reset', target);
60
+ this.events.emit(SYSTEM_EVENTS.appearance.reset, target);
60
61
  return true;
61
62
  }
62
63
  resolveTarget(playerSrc) {
@@ -13,6 +13,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
13
13
  import { inject, injectable } from 'tsyringe';
14
14
  import { EventsAPI } from '../../../adapters/contracts/transport/events.api';
15
15
  import { IPlayerLifecycleServer } from '../../../adapters/contracts/server/player-lifecycle/IPlayerLifecycleServer';
16
+ import { SYSTEM_EVENTS } from '../../shared/types/system-types';
16
17
  let NodePlayerLifecycleServer = class NodePlayerLifecycleServer extends IPlayerLifecycleServer {
17
18
  events;
18
19
  constructor(events) {
@@ -23,7 +24,7 @@ let NodePlayerLifecycleServer = class NodePlayerLifecycleServer extends IPlayerL
23
24
  const target = this.resolveTarget(playerSrc);
24
25
  if (!target)
25
26
  return;
26
- this.events.emit('opencore:spawner:spawn', target, {
27
+ this.events.emit(SYSTEM_EVENTS.spawner.spawn, target, {
27
28
  position: request.position,
28
29
  model: request.model,
29
30
  heading: request.heading,
@@ -34,13 +35,13 @@ let NodePlayerLifecycleServer = class NodePlayerLifecycleServer extends IPlayerL
34
35
  const target = this.resolveTarget(playerSrc);
35
36
  if (!target)
36
37
  return;
37
- this.events.emit('opencore:spawner:teleport', target, request.position, request.heading);
38
+ this.events.emit(SYSTEM_EVENTS.spawner.teleport, target, request.position, request.heading);
38
39
  }
39
40
  respawn(playerSrc, request) {
40
41
  const target = this.resolveTarget(playerSrc);
41
42
  if (!target)
42
43
  return;
43
- this.events.emit('opencore:spawner:respawn', target, request.position, request.heading);
44
+ this.events.emit(SYSTEM_EVENTS.spawner.respawn, target, request.position, request.heading);
44
45
  }
45
46
  resolveTarget(playerSrc) {
46
47
  const clientId = Number(playerSrc);
@@ -15,6 +15,7 @@ import { IVehicleLifecycleServer } from '../../../adapters/contracts/server/vehi
15
15
  import { IPlatformContext } from '../../../adapters/contracts/IPlatformContext';
16
16
  import { IVehicleServer } from '../../../adapters/contracts/server/IVehicleServer';
17
17
  import { EventsAPI } from '../../../adapters/contracts/transport/events.api';
18
+ import { SYSTEM_EVENTS } from '../../shared/types/system-types';
18
19
  let NodeVehicleLifecycleServer = class NodeVehicleLifecycleServer extends IVehicleLifecycleServer {
19
20
  vehicleServer;
20
21
  platformContext;
@@ -42,7 +43,7 @@ let NodeVehicleLifecycleServer = class NodeVehicleLifecycleServer extends IVehic
42
43
  const clientId = Number(request.playerSrc);
43
44
  if (Number.isNaN(clientId))
44
45
  return;
45
- this.events.emit('opencore:vehicle:warpInto', clientId, request.networkId, request.seatIndex);
46
+ this.events.emit(SYSTEM_EVENTS.vehicle.warpInto, clientId, request.networkId, request.seatIndex);
46
47
  }
47
48
  };
48
49
  NodeVehicleLifecycleServer = __decorate([
@@ -12,6 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  };
13
13
  import { inject, injectable } from 'tsyringe';
14
14
  import { EventsAPI } from '../../../adapters/contracts/transport/events.api';
15
+ import { SYSTEM_EVENTS } from '../../shared/types/system-types';
15
16
  import { Players } from '../ports/players.api-port';
16
17
  /**
17
18
  * Service for sending chat messages to players.
@@ -35,7 +36,7 @@ let Chat = class Chat {
35
36
  * @param color - Message color (RGB). Defaults to white.
36
37
  */
37
38
  broadcast(message, author = 'SYSTEM', color = { r: 255, g: 255, b: 255 }) {
38
- this.events.emit('core:chat:message', 'all', {
39
+ this.events.emit(SYSTEM_EVENTS.chat.message, 'all', {
39
40
  args: [author, message],
40
41
  color: color,
41
42
  });
@@ -49,7 +50,7 @@ let Chat = class Chat {
49
50
  * @param color - Message color (RGB).
50
51
  */
51
52
  sendPrivate(player, message, author = 'Private', color = { r: 200, g: 200, b: 200 }) {
52
- this.events.emit('core:chat:addMessage', player.clientID, {
53
+ this.events.emit(SYSTEM_EVENTS.chat.addMessage, player.clientID, {
53
54
  args: [author, message],
54
55
  color: color,
55
56
  });
@@ -60,7 +61,7 @@ let Chat = class Chat {
60
61
  * @param player - Target player.
61
62
  */
62
63
  clearChat(player) {
63
- this.events.emit('core:chat:clear', player.clientID);
64
+ this.events.emit(SYSTEM_EVENTS.chat.clear, player.clientID);
64
65
  }
65
66
  /**
66
67
  * Send a chat message to multiple players.
@@ -72,7 +73,7 @@ let Chat = class Chat {
72
73
  */
73
74
  sendMany(players, message, author = 'SYSTEM', color = { r: 255, g: 255, b: 255 }) {
74
75
  const targetIds = players.map((p) => (typeof p === 'number' ? p : p.clientID));
75
- this.events.emit('core:chat:addMessage', targetIds, {
76
+ this.events.emit(SYSTEM_EVENTS.chat.addMessage, targetIds, {
76
77
  args: [author, message],
77
78
  color: color,
78
79
  });
@@ -116,7 +117,7 @@ let Chat = class Chat {
116
117
  * Clear chat for all connected players.
117
118
  */
118
119
  clearChatAll() {
119
- this.events.emit('core:chat:clear', 'all');
120
+ this.events.emit(SYSTEM_EVENTS.chat.clear, 'all');
120
121
  }
121
122
  };
122
123
  Chat = __decorate([
@@ -19,6 +19,7 @@ import { INpcLifecycleServer } from '../../../adapters/contracts/server/npc-life
19
19
  import { IPedServer } from '../../../adapters/contracts/server/IPedServer';
20
20
  import { coreLogger } from '../../../kernel/logger';
21
21
  import { WorldContext } from '../../core/world';
22
+ import { SYSTEM_EVENTS } from '../../shared/types/system-types';
22
23
  import { NPC } from '../entities/npc';
23
24
  /**
24
25
  * Server-side API responsible for the full NPC (ped) lifecycle:
@@ -311,7 +312,7 @@ let Npcs = class Npcs {
311
312
  netId: npc.netId,
312
313
  remainingNpcs: this.npcById.size,
313
314
  });
314
- this.events.emit('opencore:npc:deleted', 'all', npc.npcId);
315
+ this.events.emit(SYSTEM_EVENTS.npc.deleted, 'all', npc.npcId);
315
316
  return true;
316
317
  }
317
318
  /**
@@ -4,6 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  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;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
+ import { performance } from 'node:perf_hooks';
7
8
  import { injectable } from 'tsyringe';
8
9
  import { v4 as uuid } from 'uuid';
9
10
  import { WorkerPool } from '../services/parallel/worker-pool';
@@ -10,9 +10,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
- import { inject, injectable } from 'tsyringe';
13
+ import { inject } from 'tsyringe';
14
14
  import { EventsAPI } from '../../../adapters/contracts/transport/events.api';
15
15
  import { coreLogger } from '../../../kernel/logger';
16
+ import { SYSTEM_EVENTS } from '../../shared/types/system-types';
17
+ import { Bind } from '../decorators/bind';
16
18
  import { Vehicles } from './vehicles.api';
17
19
  /**
18
20
  * Service for handling vehicle modifications with validation.
@@ -73,7 +75,7 @@ let VehicleModification = class VehicleModification {
73
75
  requestedBy,
74
76
  mods: Object.keys(validatedMods),
75
77
  });
76
- this.events.emit('opencore:vehicle:modified', 'all', {
78
+ this.events.emit(SYSTEM_EVENTS.vehicle.modified, 'all', {
77
79
  networkId,
78
80
  mods: validatedMods,
79
81
  });
@@ -200,7 +202,7 @@ let VehicleModification = class VehicleModification {
200
202
  windowTint: 0,
201
203
  };
202
204
  coreLogger.info('Vehicle modifications reset', { networkId, requestedBy });
203
- this.events.emit('opencore:vehicle:modified', 'all', {
205
+ this.events.emit(SYSTEM_EVENTS.vehicle.modified, 'all', {
204
206
  networkId,
205
207
  mods: defaultMods,
206
208
  });
@@ -304,7 +306,7 @@ let VehicleModification = class VehicleModification {
304
306
  }
305
307
  };
306
308
  VehicleModification = __decorate([
307
- injectable(),
309
+ Bind('singleton'),
308
310
  __param(0, inject(Vehicles)),
309
311
  __param(1, inject(EventsAPI)),
310
312
  __metadata("design:paramtypes", [Vehicles,
@@ -10,15 +10,17 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
- import { inject, injectable } from 'tsyringe';
13
+ import { inject } from 'tsyringe';
14
14
  import { IHasher } from '../../../adapters/contracts/IHasher';
15
15
  import { EventsAPI } from '../../../adapters/contracts/transport/events.api';
16
16
  import { IEntityServer } from '../../../adapters/contracts/server/IEntityServer';
17
17
  import { IVehicleLifecycleServer } from '../../../adapters/contracts/server/vehicle-lifecycle/IVehicleLifecycleServer';
18
18
  import { IVehicleServer } from '../../../adapters/contracts/server/IVehicleServer';
19
19
  import { coreLogger } from '../../../kernel/logger';
20
+ import { SYSTEM_EVENTS } from '../../shared/types/system-types';
20
21
  import { Vehicle } from '../entities/vehicle';
21
22
  import { Players } from '../ports/players.api-port';
23
+ import { Bind } from '../decorators/bind';
22
24
  const DEFAULT_PLAYER_VEHICLE_OFFSET = { x: 0, y: 3, z: 0 };
23
25
  /**
24
26
  * Server-side service for managing vehicle entities.
@@ -130,7 +132,7 @@ let Vehicles = class Vehicles {
130
132
  persistent,
131
133
  totalVehicles: this.vehiclesByNetworkId.size,
132
134
  });
133
- this.events.emit('opencore:vehicle:created', 'all', vehicle.serialize());
135
+ this.events.emit(SYSTEM_EVENTS.vehicle.created, 'all', vehicle.serialize());
134
136
  return {
135
137
  networkId,
136
138
  handle,
@@ -178,6 +180,7 @@ let Vehicles = class Vehicles {
178
180
  ...options,
179
181
  position: spawnPosition,
180
182
  heading: spawnHeading,
183
+ plate: ownership.type === 'player' ? player.name : 'anom',
181
184
  ownership,
182
185
  });
183
186
  if (result.success) {
@@ -289,7 +292,7 @@ let Vehicles = class Vehicles {
289
292
  networkId,
290
293
  totalVehicles: this.vehiclesByNetworkId.size,
291
294
  });
292
- this.events.emit('opencore:vehicle:deleted', 'all', networkId);
295
+ this.events.emit(SYSTEM_EVENTS.vehicle.deleted, 'all', networkId);
293
296
  return true;
294
297
  }
295
298
  /**
@@ -381,7 +384,7 @@ let Vehicles = class Vehicles {
381
384
  }
382
385
  };
383
386
  Vehicles = __decorate([
384
- injectable(),
387
+ Bind('singleton'),
385
388
  __param(0, inject(Players)),
386
389
  __param(1, inject(IEntityServer)),
387
390
  __param(2, inject(IVehicleServer)),
@@ -12,6 +12,7 @@ import { getFrameworkModeScope, setRuntimeContext, validateRuntimeOptions, } fro
12
12
  import { BinaryProcessManager } from './system/managers/binary-process.manager';
13
13
  import { SessionRecoveryService } from './services/session-recovery.local';
14
14
  import { registerServicesServer } from './services/services.register';
15
+ import { SYSTEM_EVENTS } from '../shared/types/system-types';
15
16
  import { METADATA_KEYS } from './system/metadata-server.keys';
16
17
  import { registerSystemServer } from './system/processors.register';
17
18
  const CORE_WAIT_TIMEOUT = 10000;
@@ -163,13 +164,13 @@ export async function initServer(options, plugins) {
163
164
  const engineEvents = GLOBAL_CONTAINER.resolve(IEngineEvents);
164
165
  const events = GLOBAL_CONTAINER.resolve(EventsAPI);
165
166
  // 1. Broadast to resources already running
166
- engineEvents.emit('core:ready');
167
- events.emit('core:ready', 'all');
168
- // 2. Listen for 'core:request-ready' for resources starting late (hot-reload)
169
- engineEvents.on('core:request-ready', () => {
170
- engineEvents.emit('core:ready');
167
+ engineEvents.emit(SYSTEM_EVENTS.core.ready);
168
+ events.emit(SYSTEM_EVENTS.core.ready, 'all');
169
+ // 2. Listen for '_systemcore:request-ready' for resources starting late (hot-reload)
170
+ engineEvents.on(SYSTEM_EVENTS.core.requestReady, () => {
171
+ engineEvents.emit(SYSTEM_EVENTS.core.ready);
171
172
  });
172
- loggers.bootstrap.info(`'core:ready' logic initialized and broadcasted`);
173
+ loggers.bootstrap.info(`'${SYSTEM_EVENTS.core.ready}' logic initialized and broadcasted`);
173
174
  }
174
175
  const logLevelLabel = LogLevelLabels[getLogLevel()];
175
176
  loggers.bootstrap.info(`LogLevel Setted: ${logLevelLabel}`);
@@ -192,13 +193,13 @@ function createCoreDependency(coreName) {
192
193
  const exportsService = GLOBAL_CONTAINER.resolve(IExports);
193
194
  const onReady = () => {
194
195
  if (!resolved) {
195
- loggers.bootstrap.debug(`Core '${coreName}' detected via 'core:ready' event!`);
196
+ loggers.bootstrap.debug(`Core '${coreName}' detected via '${SYSTEM_EVENTS.core.ready}' event!`);
196
197
  cleanup();
197
198
  resolve();
198
199
  }
199
200
  };
200
- engineEvents.on('core:ready', onReady);
201
- loggers.bootstrap.debug(`Listening for 'core:ready' event from Core`);
201
+ engineEvents.on(SYSTEM_EVENTS.core.ready, onReady);
202
+ loggers.bootstrap.debug(`Listening for '${SYSTEM_EVENTS.core.ready}' event from Core`);
202
203
  // 2. Check if already ready via export (Polling)
203
204
  const checkReady = () => {
204
205
  if (resolved)
@@ -223,15 +224,15 @@ function createCoreDependency(coreName) {
223
224
  // 3. Request status (for hot-reload cases where Core is already up)
224
225
  // This is sent AFTER registering the listener so we can receive the response
225
226
  if (!resolved) {
226
- loggers.bootstrap.debug(`Requesting Core status via 'core:request-ready' event`);
227
- engineEvents.emit('core:request-ready');
227
+ loggers.bootstrap.debug(`Requesting Core status via '${SYSTEM_EVENTS.core.requestReady}' event`);
228
+ engineEvents.emit(SYSTEM_EVENTS.core.requestReady);
228
229
  }
229
230
  // 4. Timeout protection
230
231
  timeout = setTimeout(() => {
231
232
  if (!resolved) {
232
233
  loggers.bootstrap.warn(`Timeout waiting for Core '${coreName}' after ${CORE_WAIT_TIMEOUT}ms`);
233
234
  cleanup();
234
- reject(new Error(`[OpenCore] Timeout waiting for CORE '${coreName}'. The Core did not emit 'core:ready' or expose 'isCoreReady' within ${CORE_WAIT_TIMEOUT}ms.`));
235
+ reject(new Error(`[OpenCore] Timeout waiting for CORE '${coreName}'. The Core did not emit '${SYSTEM_EVENTS.core.ready}' or expose 'isCoreReady' within ${CORE_WAIT_TIMEOUT}ms.`));
235
236
  }
236
237
  }, CORE_WAIT_TIMEOUT);
237
238
  });
@@ -11,9 +11,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
13
  import { inject } from 'tsyringe';
14
+ import { z } from 'zod';
14
15
  import { IEngineEvents } from '../../../adapters/contracts/IEngineEvents';
15
16
  import { AppError, SecurityError } from '../../../kernel/error';
16
17
  import { loggers } from '../../../kernel/logger';
18
+ import { buildRemoteCommandExecuteEventName, SYSTEM_EVENTS } from '../../shared/types/system-types';
17
19
  import { CommandErrorObserverContract } from '../contracts/security/command-error-observer.contract';
18
20
  import { Controller, Export, Public } from '../decorators';
19
21
  import { OnNet } from '../decorators/onNet';
@@ -211,7 +213,7 @@ let CommandExportController = class CommandExportController {
211
213
  // Validate security BEFORE delegating to resource
212
214
  await this.validateSecurity(player, commandName, remoteEntry.metadata.security);
213
215
  // Delegate to resource via local event (server-to-server, not network)
214
- const eventName = `opencore:command:execute:${remoteEntry.resourceName}`;
216
+ const eventName = buildRemoteCommandExecuteEventName(remoteEntry.resourceName);
215
217
  this.engineEvents.emit(eventName, clientID, commandName, args);
216
218
  loggers.command.debug(`Delegated remote command execution to ${remoteEntry.resourceName}`, {
217
219
  command: commandName,
@@ -294,7 +296,7 @@ let CommandExportController = class CommandExportController {
294
296
  };
295
297
  __decorate([
296
298
  Public(),
297
- OnNet('core:execute-command'),
299
+ OnNet(SYSTEM_EVENTS.command.execute, z.tuple([z.string().min(1), z.array(z.string())])),
298
300
  __metadata("design:type", Function),
299
301
  __metadata("design:paramtypes", [Player, String, Array]),
300
302
  __metadata("design:returntype", Promise)
@@ -14,6 +14,7 @@ import { inject } from 'tsyringe';
14
14
  import { IEngineEvents } from '../../../adapters/contracts/IEngineEvents';
15
15
  import { IResourceInfo } from '../../../adapters/contracts/IResourceInfo';
16
16
  import { loggers } from '../../../kernel/logger';
17
+ import { buildRemoteCommandExecuteEventName } from '../../shared/types/system-types';
17
18
  import { CommandErrorObserverContract } from '../contracts/security/command-error-observer.contract';
18
19
  import { Controller } from '../decorators';
19
20
  import { normalizeToAppError } from '../helpers/normalize-app-error';
@@ -73,7 +74,7 @@ let RemoteCommandExecutionController = class RemoteCommandExecutionController {
73
74
  */
74
75
  registerEventHandler() {
75
76
  const resourceName = this.resourceInfo.getCurrentResourceName();
76
- const eventName = `opencore:command:execute:${resourceName}`;
77
+ const eventName = buildRemoteCommandExecuteEventName(resourceName);
77
78
  this.engineEvents.on(eventName, async (clientID, commandName, args) => {
78
79
  await this.handleCommandExecution(clientID, commandName, args);
79
80
  });