rock-mod 0.21.0 → 0.23.0

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 (81) hide show
  1. package/dist/client/entities/ccmp/blip/CCMPBlip.d.ts +38 -0
  2. package/dist/client/entities/ccmp/blip/CCMPBlip.js +118 -0
  3. package/dist/client/entities/ccmp/blip/CCMPBlipsManager.d.ts +27 -0
  4. package/dist/client/entities/ccmp/blip/CCMPBlipsManager.js +191 -0
  5. package/dist/client/entities/ccmp/camera/CCMPCamera.d.ts +1 -1
  6. package/dist/client/entities/ccmp/camera/CCMPCamera.js +1 -1
  7. package/dist/client/entities/ccmp/camera/CCMPCameraManager.js +2 -1
  8. package/dist/client/entities/ccmp/colshape/CCMPColshape.d.ts +26 -0
  9. package/dist/client/entities/ccmp/colshape/CCMPColshape.js +83 -0
  10. package/dist/client/entities/ccmp/colshape/CCMPColshapesManager.d.ts +31 -0
  11. package/dist/client/entities/ccmp/colshape/CCMPColshapesManager.js +193 -0
  12. package/dist/client/entities/ccmp/marker/CCMPMarker.d.ts +34 -0
  13. package/dist/client/entities/ccmp/marker/CCMPMarker.js +109 -0
  14. package/dist/client/entities/ccmp/marker/CCMPMarkersManager.d.ts +27 -0
  15. package/dist/client/entities/ccmp/marker/CCMPMarkersManager.js +180 -0
  16. package/dist/client/entities/ccmp/object/CCMPObject.d.ts +50 -0
  17. package/dist/client/entities/ccmp/object/CCMPObject.js +149 -0
  18. package/dist/client/entities/ccmp/object/CCMPObjectsManager.d.ts +27 -0
  19. package/dist/client/entities/ccmp/object/CCMPObjectsManager.js +177 -0
  20. package/dist/client/entities/ccmp/ped/CCMPPed.d.ts +1 -1
  21. package/dist/client/entities/ccmp/ped/CCMPPed.js +21 -7
  22. package/dist/client/entities/ccmp/ped/CCMPPedsManager.d.ts +7 -0
  23. package/dist/client/entities/ccmp/ped/CCMPPedsManager.js +82 -10
  24. package/dist/client/entities/ccmp/player/CCMPPlayer.d.ts +15 -17
  25. package/dist/client/entities/ccmp/player/CCMPPlayer.js +86 -87
  26. package/dist/client/entities/ccmp/player/CCMPPlayersManager.d.ts +4 -3
  27. package/dist/client/entities/ccmp/player/CCMPPlayersManager.js +20 -7
  28. package/dist/client/entities/ccmp/vehicle/CCMPVehicle.d.ts +102 -0
  29. package/dist/client/entities/ccmp/vehicle/CCMPVehicle.js +311 -0
  30. package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +11 -48
  31. package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.js +154 -75
  32. package/dist/client/entities/common/baseObject/IBaseObject.d.ts +2 -1
  33. package/dist/client/entities/ragemp/entity/RageEntity.d.ts +4 -0
  34. package/dist/client/entities/ragemp/entity/RageEntity.js +34 -2
  35. package/dist/client/factories/ccmp/CCMPManagersFactory.d.ts +9 -7
  36. package/dist/client/factories/ccmp/CCMPManagersFactory.js +62 -22
  37. package/dist/client/game/ccmp/chat/CCMPChatManager.d.ts +2 -22
  38. package/dist/client/game/ccmp/chat/CCMPChatManager.js +6 -34
  39. package/dist/client/game/ccmp/storage/CCMPStorageManager.d.ts +0 -18
  40. package/dist/client/game/ccmp/storage/CCMPStorageManager.js +4 -36
  41. package/dist/client/game/ccmp/ui/CCMPUiManager.d.ts +0 -29
  42. package/dist/client/game/ccmp/ui/CCMPUiManager.js +5 -41
  43. package/dist/client/net/ccmp/CCMPNetManager.d.ts +0 -7
  44. package/dist/client/net/ccmp/CCMPNetManager.js +0 -26
  45. package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.d.ts +2 -2
  46. package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.js +2 -2
  47. package/dist/client/net/ccmp/events/CCMPEventsBridge.d.ts +3 -1
  48. package/dist/client/net/ccmp/events/CCMPEventsBridge.js +33 -3
  49. package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.d.ts +21 -16
  50. package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.js +32 -22
  51. package/dist/client/net/common/dataHandler/IDataHandler.d.ts +2 -2
  52. package/dist/client/net/common/events/types.d.ts +4 -4
  53. package/dist/client/net/ragemp/dataHandler/RageDataHandler.d.ts +2 -2
  54. package/dist/server/entities/altv/colshape/AltVColshape.d.ts +2 -0
  55. package/dist/server/entities/altv/colshape/AltVColshape.js +6 -0
  56. package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsManager.js +4 -4
  57. package/dist/server/entities/ccmp/blip/CCMPBlip.d.ts +2 -0
  58. package/dist/server/entities/ccmp/blip/CCMPBlip.js +6 -0
  59. package/dist/server/entities/ccmp/colshape/CCMPColshape.d.ts +2 -0
  60. package/dist/server/entities/ccmp/colshape/CCMPColshape.js +6 -0
  61. package/dist/server/entities/ccmp/marker/CCMPMarker.d.ts +2 -0
  62. package/dist/server/entities/ccmp/marker/CCMPMarker.js +6 -0
  63. package/dist/server/entities/ccmp/object/CCMPObject.d.ts +1 -1
  64. package/dist/server/entities/ccmp/object/CCMPObject.js +3 -5
  65. package/dist/server/entities/ccmp/object/CCMPObjectsManager.js +1 -2
  66. package/dist/server/entities/ccmp/player/CCMPPlayersManager.js +15 -0
  67. package/dist/server/entities/ccmp/vehicle/CCMPVehicle.d.ts +29 -15
  68. package/dist/server/entities/ccmp/vehicle/CCMPVehicle.js +87 -44
  69. package/dist/server/entities/common/colshape/IColshape.d.ts +2 -0
  70. package/dist/server/entities/mock/colshape/MockColshape.d.ts +3 -0
  71. package/dist/server/entities/mock/colshape/MockColshape.js +8 -0
  72. package/dist/server/entities/ragemp/colshape/RageColshape.d.ts +2 -0
  73. package/dist/server/entities/ragemp/colshape/RageColshape.js +6 -0
  74. package/dist/server/entities/ragemp/entity/RageEntity.d.ts +5 -1
  75. package/dist/server/entities/ragemp/entity/RageEntity.js +17 -1
  76. package/dist/server/entities/ragemp/object/RageObjectsManager.js +1 -1
  77. package/dist/server/entities/ragemp/ped/RagePedsManager.js +1 -1
  78. package/dist/server/entities/ragemp/vehicle/RageVehiclesManager.js +1 -1
  79. package/dist/server/net/ccmp/CCMPNetManager.js +0 -5
  80. package/dist/server/net/ccmp/events/CCMPEventsManager.d.ts +6 -2
  81. package/package.json +2 -2
@@ -1,24 +1,29 @@
1
+ import { type CCMPBlipsManager } from "../../../entities/ccmp/blip/CCMPBlipsManager";
2
+ import { type CCMPColshapesManager } from "../../../entities/ccmp/colshape/CCMPColshapesManager";
3
+ import { type CCMPMarkersManager } from "../../../entities/ccmp/marker/CCMPMarkersManager";
4
+ import { type CCMPObjectsManager } from "../../../entities/ccmp/object/CCMPObjectsManager";
5
+ import { type CCMPPedsManager } from "../../../entities/ccmp/ped/CCMPPedsManager";
1
6
  import { type CCMPPlayersManager } from "../../../entities/ccmp/player/CCMPPlayersManager";
7
+ import { type CCMPVehiclesManager } from "../../../entities/ccmp/vehicle/CCMPVehiclesManager";
2
8
  import { type CCMPEventsManager } from "./CCMPEventsManager";
9
+ export interface ICCMPSyncedMetaBridgeManagers {
10
+ blips: CCMPBlipsManager;
11
+ colshapes: CCMPColshapesManager;
12
+ markers: CCMPMarkersManager;
13
+ objects: CCMPObjectsManager;
14
+ peds: CCMPPedsManager;
15
+ players: CCMPPlayersManager;
16
+ vehicles: CCMPVehiclesManager;
17
+ }
3
18
  /**
4
- * Переводит нативное CCMP-событие `streamSyncedMetaChange` в internal-bus
5
- * `rm::syncedMetaChange`.
6
- *
7
- * Вынесено в отдельный класс от `CCMPEventsBridge` из-за порядка
8
- * инстанцирования: bridge'у нужна ссылка на `CCMPPlayersManager` чтобы
9
- * резолвить `payload.entityId → CCMPPlayer`, а players manager создаётся
10
- * в `CCMPManagersFactory` **после** `CCMPNetManager` (внутри которого
11
- * живёт `CCMPEventsBridge`). Поэтому этот bridge создаётся вторым
12
- * шагом из `createPlayersManager`, когда обе зависимости уже доступны.
13
- *
14
- * Сейчас обслуживается только `entityType === Player` (=0) — на клиенте
15
- * rock-mod-CCMP других сущностей пока нет. Остальные типы тихо
16
- * игнорируем (snapshot прилетает на каждом stream-in, для несуществующих
17
- * на клиенте сущностей это нормально).
19
+ * Translates CCMP `streamSyncedMetaChange` into Rock-Mod's internal
20
+ * `rm::syncedMetaChange` for stream-synced base objects.
18
21
  */
19
22
  export declare class CCMPSyncedMetaBridge {
20
23
  private readonly _events;
21
- private readonly _playersManager;
22
- constructor(events: CCMPEventsManager, playersManager: CCMPPlayersManager);
24
+ private readonly _managers;
25
+ private _registered;
26
+ constructor(events: CCMPEventsManager, managers: ICCMPSyncedMetaBridgeManagers);
23
27
  register(): void;
28
+ private _resolveObject;
24
29
  }
@@ -1,35 +1,45 @@
1
1
  import { ClientInternalEventName } from "../../common/events/types";
2
2
  /**
3
- * Переводит нативное CCMP-событие `streamSyncedMetaChange` в internal-bus
4
- * `rm::syncedMetaChange`.
5
- *
6
- * Вынесено в отдельный класс от `CCMPEventsBridge` из-за порядка
7
- * инстанцирования: bridge'у нужна ссылка на `CCMPPlayersManager` чтобы
8
- * резолвить `payload.entityId → CCMPPlayer`, а players manager создаётся
9
- * в `CCMPManagersFactory` **после** `CCMPNetManager` (внутри которого
10
- * живёт `CCMPEventsBridge`). Поэтому этот bridge создаётся вторым
11
- * шагом из `createPlayersManager`, когда обе зависимости уже доступны.
12
- *
13
- * Сейчас обслуживается только `entityType === Player` (=0) — на клиенте
14
- * rock-mod-CCMP других сущностей пока нет. Остальные типы тихо
15
- * игнорируем (snapshot прилетает на каждом stream-in, для несуществующих
16
- * на клиенте сущностей это нормально).
3
+ * Translates CCMP `streamSyncedMetaChange` into Rock-Mod's internal
4
+ * `rm::syncedMetaChange` for stream-synced base objects.
17
5
  */
18
6
  export class CCMPSyncedMetaBridge {
19
- constructor(events, playersManager) {
7
+ constructor(events, managers) {
8
+ this._registered = false;
20
9
  this._events = events;
21
- this._playersManager = playersManager;
10
+ this._managers = managers;
22
11
  }
23
12
  register() {
13
+ if (this._registered) {
14
+ return;
15
+ }
16
+ this._registered = true;
24
17
  ccmp.on("streamSyncedMetaChange", (payload) => {
25
- if (payload.entityType !== ccmp.entities.ENTITY_TYPE.Player) {
18
+ const object = this._resolveObject(payload.entityType, payload.entityId);
19
+ if (!object) {
26
20
  return;
27
21
  }
28
- const player = this._playersManager.findByRemoteId(payload.entityId);
29
- if (!player) {
30
- return;
31
- }
32
- this._events.emitInternal(ClientInternalEventName.SyncedMetaChange, player, payload.key, payload.newValue, payload.oldValue);
22
+ this._events.emitInternal(ClientInternalEventName.SyncedMetaChange, object, payload.key, payload.newValue, payload.oldValue);
33
23
  });
34
24
  }
25
+ _resolveObject(entityType, entityId) {
26
+ switch (entityType) {
27
+ case ccmp.entities.ENTITY_TYPE.Player:
28
+ return this._managers.players.findByRemoteId(entityId);
29
+ case ccmp.entities.ENTITY_TYPE.Vehicle:
30
+ return this._managers.vehicles.findByRemoteID(entityId);
31
+ case ccmp.entities.ENTITY_TYPE.Object:
32
+ return this._managers.objects.findByRemoteID(entityId);
33
+ case ccmp.entities.ENTITY_TYPE.Ped:
34
+ return this._managers.peds.findByRemoteID(entityId);
35
+ case ccmp.entities.ENTITY_TYPE.Marker:
36
+ return this._managers.markers.findByRemoteID(entityId);
37
+ case ccmp.entities.ENTITY_TYPE.Blip:
38
+ return this._managers.blips.findByRemoteID(entityId);
39
+ case ccmp.entities.ENTITY_TYPE.Colshape:
40
+ return this._managers.colshapes.findByRemoteID(entityId);
41
+ default:
42
+ return null;
43
+ }
44
+ }
35
45
  }
@@ -1,4 +1,4 @@
1
- import { type IEntity } from "../../../entities";
1
+ import { type IBaseObject } from "../../../entities";
2
2
  export interface IDataHandler {
3
- addDataHandler(key: string, callback: (entity: IEntity, value: unknown, oldValue?: unknown) => void): void;
3
+ addDataHandler(key: string, callback: (object: IBaseObject, value: unknown, oldValue?: unknown) => void): void;
4
4
  }
@@ -1,4 +1,4 @@
1
- import { type IBaseObject, type IEntity, type IPlayer, type IVehicle } from "../../../entities";
1
+ import { type IBaseObject, type IPlayer, type IVehicle } from "../../../entities";
2
2
  import { type IVector3D } from "../../../../shared/common/utils";
3
3
  export declare enum ClientInternalEventName {
4
4
  PlayerConnected = "rm::playerConnected",
@@ -35,8 +35,8 @@ export interface IClientInternalEvents {
35
35
  [ClientInternalEventName.EntityDestroyed]: (object: IBaseObject) => void;
36
36
  [ClientInternalEventName.PlayerReady]: (localPlayer: IPlayer) => void;
37
37
  [ClientInternalEventName.BrowserDomReady]: () => void;
38
- [ClientInternalEventName.EntityStreamIn]: (entity: IEntity) => void;
39
- [ClientInternalEventName.EntityStreamOut]: (entity: IEntity) => void;
38
+ [ClientInternalEventName.EntityStreamIn]: (object: IBaseObject) => void;
39
+ [ClientInternalEventName.EntityStreamOut]: (object: IBaseObject) => void;
40
40
  [ClientInternalEventName.PlayerEnterVehicle]: (vehicle: IVehicle, seat: number) => void;
41
41
  [ClientInternalEventName.PlayerLeaveVehicle]: (vehicle: IVehicle, seat: number) => void;
42
42
  [ClientInternalEventName.PlayerDeath]: (player: IPlayer) => void;
@@ -44,5 +44,5 @@ export interface IClientInternalEvents {
44
44
  [ClientInternalEventName.PlayerWeaponShot]: () => void;
45
45
  [ClientInternalEventName.Render]: () => void;
46
46
  [ClientInternalEventName.Click]: (options: IClickOptions) => void;
47
- [ClientInternalEventName.SyncedMetaChange]: (entity: IEntity, key: string, value: unknown, oldValue: unknown) => void;
47
+ [ClientInternalEventName.SyncedMetaChange]: (object: IBaseObject, key: string, value: unknown, oldValue: unknown) => void;
48
48
  }
@@ -1,7 +1,7 @@
1
- import { type IEntity, type IEntityPoolRouter } from "../../../entities";
1
+ import { type IBaseObject, type IEntityPoolRouter } from "../../../entities";
2
2
  import { type IDataHandler } from "../../../net/common/dataHandler/IDataHandler";
3
3
  export declare class RageDataHandler implements IDataHandler {
4
4
  private readonly _entityPoolRouter;
5
5
  constructor(entityPoolRouter: IEntityPoolRouter);
6
- addDataHandler(key: string, callback: (entity: IEntity, value: unknown, oldValue?: unknown) => void): void;
6
+ addDataHandler(key: string, callback: (object: IBaseObject, value: unknown, oldValue?: unknown) => void): void;
7
7
  }
@@ -4,4 +4,6 @@ export interface IAltVColshapeOptions extends IAltVWorldObjectOptions<Colshape>
4
4
  }
5
5
  export declare abstract class AltVColshape extends AltVWorldObject<Colshape> {
6
6
  protected constructor(options: IAltVColshapeOptions);
7
+ getNetData(name: string): unknown;
8
+ setNetData(name: string, value: unknown): void;
7
9
  }
@@ -6,5 +6,11 @@ class AltVColshape extends AltVWorldObject_1.AltVWorldObject {
6
6
  constructor(options) {
7
7
  super(options);
8
8
  }
9
+ getNetData(name) {
10
+ return this.mpEntity.getSyncedMeta(name);
11
+ }
12
+ setNetData(name, value) {
13
+ this.mpEntity.setSyncedMeta({ name, value });
14
+ }
9
15
  }
10
16
  exports.AltVColshape = AltVColshape;
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CCMPBaseObjectsManager = void 0;
4
4
  const CCMPBaseObjectsIterator_1 = require("./CCMPBaseObjectsIterator");
5
+ const RockMod_1 = require("../../../RockMod");
6
+ const types_1 = require("../../../net/common/events/types");
5
7
  class CCMPBaseObjectsManager {
6
8
  _baseObjects;
7
9
  _baseObjectsType;
@@ -35,15 +37,13 @@ class CCMPBaseObjectsManager {
35
37
  throw new Error(`BaseObject [${this._baseObjectsType}] with id ${baseObject.id} already exists`);
36
38
  }
37
39
  this._baseObjects.set(baseObject.id, baseObject);
38
- // TODO: emit ServerInternalEventName.EntityCreated and broadcast EntityCreated DTO
39
- // through net.events once CCMPEventsManager is implemented (parity with RageBaseObjectsManager).
40
+ RockMod_1.RockMod.instance.net.events.emitInternal(types_1.ServerInternalEventName.EntityCreated, baseObject);
40
41
  }
41
42
  unregisterBaseObject(baseObject) {
42
43
  if (!this._baseObjects.delete(baseObject.id)) {
43
44
  throw new Error(`BaseObject [${this._baseObjectsType}] with id ${baseObject.id} not found`);
44
45
  }
45
- // TODO: emit ServerInternalEventName.EntityDestroyed and broadcast EntityDestroyed DTO
46
- // through net.events once CCMPEventsManager is implemented.
46
+ RockMod_1.RockMod.instance.net.events.emitInternal(types_1.ServerInternalEventName.EntityDestroyed, baseObject);
47
47
  }
48
48
  }
49
49
  exports.CCMPBaseObjectsManager = CCMPBaseObjectsManager;
@@ -27,6 +27,8 @@ export declare class CCMPBlip extends CCMPWorldObject implements IBlip {
27
27
  destroy(): void;
28
28
  setPosition(value: IVector3D): void;
29
29
  setDimension(value: number): void;
30
+ getNetData(name: string): unknown;
31
+ setNetData(name: string, value: unknown): void;
30
32
  setName(value: string): void;
31
33
  setSprite(value: IBlipSprite): void;
32
34
  setColor(value: IBlipColor): void;
@@ -64,6 +64,12 @@ class CCMPBlip extends CCMPWorldObject_1.CCMPWorldObject {
64
64
  setDimension(value) {
65
65
  this._ccmpBlip.dimension = value;
66
66
  }
67
+ getNetData(name) {
68
+ return this._ccmpBlip.getStreamSyncedMeta(name);
69
+ }
70
+ setNetData(name, value) {
71
+ this._ccmpBlip.setStreamSyncedMeta(name, value);
72
+ }
67
73
  setName(value) {
68
74
  this._ccmpBlip.name = value;
69
75
  }
@@ -16,6 +16,8 @@ export declare abstract class CCMPColshape extends CCMPWorldObject implements IC
16
16
  get position(): IVector3D;
17
17
  get dimension(): number;
18
18
  get playersInside(): readonly CcmpPlayer[];
19
+ getNetData(name: string): unknown;
20
+ setNetData(name: string, value: unknown): void;
19
21
  protected constructor(options: ICCMPColshapeOptions);
20
22
  destroy(): void;
21
23
  setPosition(value: IVector3D): void;
@@ -26,6 +26,12 @@ class CCMPColshape extends CCMPWorldObject_1.CCMPWorldObject {
26
26
  get playersInside() {
27
27
  return this._ccmpColshape.playersInside;
28
28
  }
29
+ getNetData(name) {
30
+ return this._ccmpColshape.getStreamSyncedMeta(name);
31
+ }
32
+ setNetData(name, value) {
33
+ this._ccmpColshape.setStreamSyncedMeta(name, value);
34
+ }
29
35
  constructor(options) {
30
36
  super();
31
37
  this._ccmpColshape = options.ccmpColshape;
@@ -25,6 +25,8 @@ export declare class CCMPMarker extends CCMPWorldObject implements IMarker {
25
25
  destroy(): void;
26
26
  setPosition(value: IVector3D): void;
27
27
  setDimension(value: number): void;
28
+ getNetData(name: string): unknown;
29
+ setNetData(name: string, value: unknown): void;
28
30
  setVisible(value: boolean): void;
29
31
  setScale(value: number): void;
30
32
  setColor(value: IRGBA): void;
@@ -58,6 +58,12 @@ class CCMPMarker extends CCMPWorldObject_1.CCMPWorldObject {
58
58
  setDimension(value) {
59
59
  this._ccmpMarker.dimension = value;
60
60
  }
61
+ getNetData(name) {
62
+ return this._ccmpMarker.getStreamSyncedMeta(name);
63
+ }
64
+ setNetData(name, value) {
65
+ this._ccmpMarker.setStreamSyncedMeta(name, value);
66
+ }
61
67
  setVisible(value) {
62
68
  this._ccmpMarker.visible = value;
63
69
  }
@@ -18,6 +18,7 @@ export interface ICCMPObjectNative extends StreamSyncedMeta {
18
18
  };
19
19
  model: number;
20
20
  dimension: number;
21
+ alpha: number;
21
22
  destroy(): boolean;
22
23
  }
23
24
  export interface ICCMPObjectOptions {
@@ -28,7 +29,6 @@ export interface ICCMPObjectOptions {
28
29
  export declare class CCMPObject extends CCMPEntity implements IObject {
29
30
  private readonly _ccmpObject;
30
31
  private readonly _onDestroy;
31
- private _alpha;
32
32
  get id(): number;
33
33
  get type(): BaseObjectType;
34
34
  get isExists(): boolean;
@@ -8,7 +8,6 @@ const RockMod_1 = require("../../../RockMod");
8
8
  class CCMPObject extends CCMPEntity_1.CCMPEntity {
9
9
  _ccmpObject;
10
10
  _onDestroy;
11
- _alpha;
12
11
  get id() {
13
12
  return this._ccmpObject.id;
14
13
  }
@@ -33,7 +32,7 @@ class CCMPObject extends CCMPEntity_1.CCMPEntity {
33
32
  return new Vectors_1.Vector3D(r.x, r.y, r.z);
34
33
  }
35
34
  get alpha() {
36
- return this._alpha;
35
+ return this._ccmpObject.alpha;
37
36
  }
38
37
  get ccmpMeta() {
39
38
  return this._ccmpObject;
@@ -41,7 +40,7 @@ class CCMPObject extends CCMPEntity_1.CCMPEntity {
41
40
  constructor(options) {
42
41
  super();
43
42
  this._ccmpObject = options.ccmpObject;
44
- this._alpha = options.alpha;
43
+ this._ccmpObject.alpha = options.alpha;
45
44
  this._onDestroy = options.onDestroy;
46
45
  }
47
46
  destroy() {
@@ -62,9 +61,8 @@ class CCMPObject extends CCMPEntity_1.CCMPEntity {
62
61
  setRotation(value) {
63
62
  this._ccmpObject.rotation = { x: value.x, y: value.y, z: value.z };
64
63
  }
65
- // CCMP runtime currently has no object alpha op; keep an API-level cache.
66
64
  setAlpha(value) {
67
- this._alpha = value;
65
+ this._ccmpObject.alpha = value;
68
66
  }
69
67
  }
70
68
  exports.CCMPObject = CCMPObject;
@@ -11,11 +11,10 @@ class CCMPObjectsManager extends CCMPEntitiesManager_1.CCMPEntitiesManager {
11
11
  }
12
12
  create(options) {
13
13
  const { model, position, dimension, rotation, alpha } = options;
14
- const ccmpObject = ccmp.objects.create(ccmp.hash(model), position.x, position.y, position.z, rotation.x, rotation.y, rotation.z);
14
+ const ccmpObject = ccmp.objects.create(ccmp.hash(model), position.x, position.y, position.z, rotation.x, rotation.y, rotation.z, { dimension, alpha });
15
15
  if (!ccmpObject) {
16
16
  throw new Error("CCMPObjectsManager.create: ccmp.objects.create failed (server full?)");
17
17
  }
18
- ccmpObject.dimension = dimension;
19
18
  const object = new CCMPObject_1.CCMPObject({
20
19
  ccmpObject,
21
20
  alpha,
@@ -4,6 +4,7 @@ exports.CCMPPlayersManager = void 0;
4
4
  const CCMPEntitiesManager_1 = require("../entity/CCMPEntitiesManager");
5
5
  const CCMPPlayer_1 = require("./CCMPPlayer");
6
6
  const types_1 = require("../../../net/common/events/types");
7
+ const RockMod_1 = require("../../../RockMod");
7
8
  class CCMPPlayersManager extends CCMPEntitiesManager_1.CCMPEntitiesManager {
8
9
  constructor(net) {
9
10
  super({
@@ -60,6 +61,20 @@ class CCMPPlayersManager extends CCMPEntitiesManager_1.CCMPEntitiesManager {
60
61
  return;
61
62
  net.events.emitInternal(types_1.ServerInternalEventName.PlayerDimensionChange, player, oldDim, newDim);
62
63
  },
64
+ playerEnterVehicle: (ccmpPlayer, ccmpVehicle, seat) => {
65
+ const player = this.findByID(ccmpPlayer.id);
66
+ const vehicle = RockMod_1.RockMod.instance.vehicles.findByID(ccmpVehicle.id);
67
+ if (!player || !vehicle)
68
+ return;
69
+ net.events.emitInternal(types_1.ServerInternalEventName.PlayerEnterVehicle, player, vehicle, seat);
70
+ },
71
+ playerExitVehicle: (ccmpPlayer, ccmpVehicle) => {
72
+ const player = this.findByID(ccmpPlayer.id);
73
+ const vehicle = RockMod_1.RockMod.instance.vehicles.findByID(ccmpVehicle.id);
74
+ if (!player || !vehicle)
75
+ return;
76
+ net.events.emitInternal(types_1.ServerInternalEventName.PlayerExitVehicle, player, vehicle);
77
+ },
63
78
  });
64
79
  }
65
80
  }
@@ -10,8 +10,18 @@ export interface ICCMPVehicleOptions {
10
10
  onDestroy: (vehicle: CCMPVehicle) => void;
11
11
  }
12
12
  export declare class CCMPVehicle extends CCMPEntity implements IVehicle {
13
+ private static readonly _customPrimaryColorMeta;
14
+ private static readonly _customSecondaryColorMeta;
15
+ private static readonly _vehicleModsMeta;
16
+ private static readonly _neonEnabledMeta;
17
+ private static readonly _neonColorMeta;
18
+ private static readonly _windowTintMeta;
19
+ private static readonly _wheelTypeMeta;
13
20
  private readonly _ccmpVehicle;
14
21
  private readonly _onDestroy;
22
+ private readonly _mods;
23
+ private _customPrimaryColor;
24
+ private _customSecondaryColor;
15
25
  get id(): number;
16
26
  get type(): BaseObjectType;
17
27
  get isExists(): boolean;
@@ -37,22 +47,26 @@ export declare class CCMPVehicle extends CCMPEntity implements IVehicle {
37
47
  setDimension(value: number): void;
38
48
  setModel(value: string): void;
39
49
  setRotation(value: IVector3D): void;
40
- setBodyHealth(_value: number): void;
41
- setEngineHealth(_value: number): void;
50
+ setBodyHealth(value: number): void;
51
+ setEngineHealth(value: number): void;
42
52
  setEngineOn(value: boolean): void;
43
- setNumberPlate(_value: string): void;
44
- setLocked(_value: boolean): void;
45
- setPrimaryColor(_value: number): void;
46
- setSecondaryColor(_value: number): void;
47
- setCustomPrimaryColor(_value: IRGBA): void;
48
- setCustomSecondaryColor(_value: IRGBA): void;
49
- setMod(_modType: number, _modIndex: number): void;
50
- getMod(_modType: number): number;
51
- setNeonEnabled(_enabled: boolean): void;
52
- setNeonColor(_r: number, _g: number, _b: number): void;
53
- setWindowTint(_tintType: number): void;
54
- setWheelType(_wheelType: number): void;
55
- setPlateType(_plateType: number): void;
53
+ setNumberPlate(value: string): void;
54
+ setLocked(value: boolean): void;
55
+ setPrimaryColor(value: number): void;
56
+ setSecondaryColor(value: number): void;
57
+ setCustomPrimaryColor(value: IRGBA): void;
58
+ setCustomSecondaryColor(value: IRGBA): void;
59
+ setMod(modType: number, modIndex: number): void;
60
+ getMod(modType: number): number;
61
+ setNeonEnabled(enabled: boolean): void;
62
+ setNeonColor(r: number, g: number, b: number): void;
63
+ setWindowTint(tintType: number): void;
64
+ setWheelType(wheelType: number): void;
65
+ setPlateType(plateType: number): void;
56
66
  explode(): void;
57
67
  repair(): void;
68
+ private _restoreCompatibilityState;
69
+ private _readColorMeta;
70
+ private _setCompatibilityMeta;
71
+ private _toRgba;
58
72
  }
@@ -2,15 +2,23 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CCMPVehicle = void 0;
4
4
  const CCMPEntity_1 = require("../entity/CCMPEntity");
5
+ const utils_1 = require("../../../../shared/common/utils");
5
6
  const Vectors_1 = require("../../../../shared/common/utils/math/Vectors");
6
7
  const shared_1 = require("../../../../shared");
7
8
  const RockMod_1 = require("../../../RockMod");
8
- const notImplemented = (name) => {
9
- throw new Error(`Not implemented yet: ${name}`);
10
- };
11
9
  class CCMPVehicle extends CCMPEntity_1.CCMPEntity {
10
+ static _customPrimaryColorMeta = "rockMod:customPrimaryColor";
11
+ static _customSecondaryColorMeta = "rockMod:customSecondaryColor";
12
+ static _vehicleModsMeta = "rockMod:vehicleMods";
13
+ static _neonEnabledMeta = "rockMod:neonEnabled";
14
+ static _neonColorMeta = "rockMod:neonColor";
15
+ static _windowTintMeta = "rockMod:windowTint";
16
+ static _wheelTypeMeta = "rockMod:wheelType";
12
17
  _ccmpVehicle;
13
18
  _onDestroy;
19
+ _mods = new Map();
20
+ _customPrimaryColor = new utils_1.RGBA(0, 0, 0);
21
+ _customSecondaryColor = new utils_1.RGBA(0, 0, 0);
14
22
  get id() {
15
23
  return this._ccmpVehicle.id;
16
24
  }
@@ -35,31 +43,32 @@ class CCMPVehicle extends CCMPEntity_1.CCMPEntity {
35
43
  return new Vectors_1.Vector3D(r.x, r.y, r.z);
36
44
  }
37
45
  get bodyHealth() {
38
- return notImplemented("CCMPVehicle.bodyHealth");
46
+ return this._ccmpVehicle.bodyHealth;
39
47
  }
40
48
  get engineHealth() {
41
- return notImplemented("CCMPVehicle.engineHealth");
49
+ return this._ccmpVehicle.engineHealth;
42
50
  }
43
51
  get numberPlate() {
44
- return notImplemented("CCMPVehicle.numberPlate");
52
+ return this._ccmpVehicle.numberPlateText;
45
53
  }
46
54
  get isLocked() {
47
- return notImplemented("CCMPVehicle.isLocked");
55
+ const lockState = this._ccmpVehicle.lockState;
56
+ return lockState !== 0 && lockState !== 1;
48
57
  }
49
58
  get isDead() {
50
- return notImplemented("CCMPVehicle.isDead");
59
+ return !this.isExists || this.bodyHealth <= 0;
51
60
  }
52
61
  get primaryColor() {
53
- return notImplemented("CCMPVehicle.primaryColor");
62
+ return this._ccmpVehicle.primaryColor;
54
63
  }
55
64
  get secondaryColor() {
56
- return notImplemented("CCMPVehicle.secondaryColor");
65
+ return this._ccmpVehicle.secondaryColor;
57
66
  }
58
67
  get customPrimaryColor() {
59
- return notImplemented("CCMPVehicle.customPrimaryColor");
68
+ return this._customPrimaryColor;
60
69
  }
61
70
  get customSecondaryColor() {
62
- return notImplemented("CCMPVehicle.customSecondaryColor");
71
+ return this._customSecondaryColor;
63
72
  }
64
73
  get driver() {
65
74
  const ccmpDriver = this._ccmpVehicle.driver;
@@ -84,6 +93,7 @@ class CCMPVehicle extends CCMPEntity_1.CCMPEntity {
84
93
  super();
85
94
  this._ccmpVehicle = options.ccmpVehicle;
86
95
  this._onDestroy = options.onDestroy;
96
+ this._restoreCompatibilityState();
87
97
  }
88
98
  destroy() {
89
99
  if (!this._ccmpVehicle.isExists)
@@ -103,59 +113,92 @@ class CCMPVehicle extends CCMPEntity_1.CCMPEntity {
103
113
  setRotation(value) {
104
114
  this._ccmpVehicle.rotation = { x: value.x, y: value.y, z: value.z };
105
115
  }
106
- setBodyHealth(_value) {
107
- notImplemented("CCMPVehicle.setBodyHealth");
116
+ setBodyHealth(value) {
117
+ this._ccmpVehicle.bodyHealth = value;
108
118
  }
109
- setEngineHealth(_value) {
110
- notImplemented("CCMPVehicle.setEngineHealth");
119
+ setEngineHealth(value) {
120
+ this._ccmpVehicle.engineHealth = value;
111
121
  }
112
122
  setEngineOn(value) {
113
123
  this._ccmpVehicle.engineOn = value;
114
124
  }
115
- setNumberPlate(_value) {
116
- notImplemented("CCMPVehicle.setNumberPlate");
125
+ setNumberPlate(value) {
126
+ this._ccmpVehicle.numberPlateText = value;
117
127
  }
118
- setLocked(_value) {
119
- notImplemented("CCMPVehicle.setLocked");
128
+ setLocked(value) {
129
+ this._ccmpVehicle.lockState = value ? 2 : 1;
120
130
  }
121
- setPrimaryColor(_value) {
122
- notImplemented("CCMPVehicle.setPrimaryColor");
131
+ setPrimaryColor(value) {
132
+ this._ccmpVehicle.primaryColor = value;
123
133
  }
124
- setSecondaryColor(_value) {
125
- notImplemented("CCMPVehicle.setSecondaryColor");
134
+ setSecondaryColor(value) {
135
+ this._ccmpVehicle.secondaryColor = value;
126
136
  }
127
- setCustomPrimaryColor(_value) {
128
- notImplemented("CCMPVehicle.setCustomPrimaryColor");
137
+ setCustomPrimaryColor(value) {
138
+ this._customPrimaryColor = this._toRgba(value);
139
+ this._setCompatibilityMeta(CCMPVehicle._customPrimaryColorMeta, this._customPrimaryColor);
129
140
  }
130
- setCustomSecondaryColor(_value) {
131
- notImplemented("CCMPVehicle.setCustomSecondaryColor");
141
+ setCustomSecondaryColor(value) {
142
+ this._customSecondaryColor = this._toRgba(value);
143
+ this._setCompatibilityMeta(CCMPVehicle._customSecondaryColorMeta, this._customSecondaryColor);
132
144
  }
133
- setMod(_modType, _modIndex) {
134
- notImplemented("CCMPVehicle.setMod");
145
+ setMod(modType, modIndex) {
146
+ this._mods.set(Math.trunc(modType), Math.trunc(modIndex));
147
+ this._setCompatibilityMeta(CCMPVehicle._vehicleModsMeta, Object.fromEntries(this._mods));
135
148
  }
136
- getMod(_modType) {
137
- return notImplemented("CCMPVehicle.getMod");
149
+ getMod(modType) {
150
+ return this._mods.get(Math.trunc(modType)) ?? -1;
138
151
  }
139
- setNeonEnabled(_enabled) {
140
- notImplemented("CCMPVehicle.setNeonEnabled");
152
+ setNeonEnabled(enabled) {
153
+ this._setCompatibilityMeta(CCMPVehicle._neonEnabledMeta, enabled);
141
154
  }
142
- setNeonColor(_r, _g, _b) {
143
- notImplemented("CCMPVehicle.setNeonColor");
155
+ setNeonColor(r, g, b) {
156
+ this._setCompatibilityMeta(CCMPVehicle._neonColorMeta, new utils_1.RGBA(r, g, b));
144
157
  }
145
- setWindowTint(_tintType) {
146
- notImplemented("CCMPVehicle.setWindowTint");
158
+ setWindowTint(tintType) {
159
+ this._setCompatibilityMeta(CCMPVehicle._windowTintMeta, Math.trunc(tintType));
147
160
  }
148
- setWheelType(_wheelType) {
149
- notImplemented("CCMPVehicle.setWheelType");
161
+ setWheelType(wheelType) {
162
+ this._setCompatibilityMeta(CCMPVehicle._wheelTypeMeta, Math.trunc(wheelType));
150
163
  }
151
- setPlateType(_plateType) {
152
- notImplemented("CCMPVehicle.setPlateType");
164
+ setPlateType(plateType) {
165
+ this._ccmpVehicle.numberPlateType = plateType;
153
166
  }
154
167
  explode() {
155
- notImplemented("CCMPVehicle.explode");
168
+ this._ccmpVehicle.bodyHealth = 0;
169
+ this._ccmpVehicle.engineHealth = -4000;
170
+ this._ccmpVehicle.engineOn = false;
156
171
  }
157
172
  repair() {
158
- notImplemented("CCMPVehicle.repair");
173
+ this._ccmpVehicle.bodyHealth = 1000;
174
+ this._ccmpVehicle.engineHealth = 1000;
175
+ }
176
+ _restoreCompatibilityState() {
177
+ this._customPrimaryColor = this._readColorMeta(CCMPVehicle._customPrimaryColorMeta);
178
+ this._customSecondaryColor = this._readColorMeta(CCMPVehicle._customSecondaryColorMeta);
179
+ const mods = this._ccmpVehicle.getStreamSyncedMeta(CCMPVehicle._vehicleModsMeta);
180
+ if (!mods || typeof mods !== "object")
181
+ return;
182
+ for (const [key, value] of Object.entries(mods)) {
183
+ const modType = Number(key);
184
+ const modIndex = Number(value);
185
+ if (Number.isFinite(modType) && Number.isFinite(modIndex)) {
186
+ this._mods.set(Math.trunc(modType), Math.trunc(modIndex));
187
+ }
188
+ }
189
+ }
190
+ _readColorMeta(key) {
191
+ const value = this._ccmpVehicle.getStreamSyncedMeta(key);
192
+ if (!value || typeof value !== "object") {
193
+ return new utils_1.RGBA(0, 0, 0);
194
+ }
195
+ return new utils_1.RGBA(Number(value.r) || 0, Number(value.g) || 0, Number(value.b) || 0, value.a);
196
+ }
197
+ _setCompatibilityMeta(key, value) {
198
+ this._ccmpVehicle.setStreamSyncedMeta(key, value);
199
+ }
200
+ _toRgba(value) {
201
+ return new utils_1.RGBA(value.r, value.g, value.b, value.a);
159
202
  }
160
203
  }
161
204
  exports.CCMPVehicle = CCMPVehicle;
@@ -2,4 +2,6 @@ import { type IWorldObject, type IWorldObjectOptions } from "../worldObject";
2
2
  export interface IColshapeOptions extends IWorldObjectOptions {
3
3
  }
4
4
  export interface IColshape extends IWorldObject {
5
+ getNetData(name: string): unknown;
6
+ setNetData(name: string, value: unknown): void;
5
7
  }