rock-mod 0.21.0 → 0.22.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 (64) 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 +53 -0
  17. package/dist/client/entities/ccmp/object/CCMPObject.js +218 -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 +1 -1
  25. package/dist/client/entities/ccmp/player/CCMPPlayer.js +10 -4
  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 +119 -0
  29. package/dist/client/entities/ccmp/vehicle/CCMPVehicle.js +392 -0
  30. package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +11 -48
  31. package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.js +152 -74
  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/storage/CCMPStorageManager.d.ts +0 -18
  38. package/dist/client/game/ccmp/storage/CCMPStorageManager.js +4 -36
  39. package/dist/client/net/ccmp/CCMPNetManager.js +1 -1
  40. package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.d.ts +2 -2
  41. package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.js +2 -2
  42. package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.d.ts +21 -16
  43. package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.js +32 -22
  44. package/dist/client/net/common/dataHandler/IDataHandler.d.ts +2 -2
  45. package/dist/client/net/common/events/types.d.ts +4 -4
  46. package/dist/client/net/ragemp/dataHandler/RageDataHandler.d.ts +2 -2
  47. package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsManager.js +4 -4
  48. package/dist/server/entities/ccmp/blip/CCMPBlip.d.ts +2 -0
  49. package/dist/server/entities/ccmp/blip/CCMPBlip.js +6 -0
  50. package/dist/server/entities/ccmp/colshape/CCMPColshape.d.ts +2 -0
  51. package/dist/server/entities/ccmp/colshape/CCMPColshape.js +6 -0
  52. package/dist/server/entities/ccmp/marker/CCMPMarker.d.ts +2 -0
  53. package/dist/server/entities/ccmp/marker/CCMPMarker.js +6 -0
  54. package/dist/server/entities/ccmp/object/CCMPObject.d.ts +1 -1
  55. package/dist/server/entities/ccmp/object/CCMPObject.js +3 -5
  56. package/dist/server/entities/ccmp/object/CCMPObjectsManager.js +1 -2
  57. package/dist/server/entities/ccmp/vehicle/CCMPVehicle.d.ts +2 -2
  58. package/dist/server/entities/ccmp/vehicle/CCMPVehicle.js +5 -5
  59. package/dist/server/entities/ragemp/entity/RageEntity.d.ts +5 -1
  60. package/dist/server/entities/ragemp/entity/RageEntity.js +17 -1
  61. package/dist/server/entities/ragemp/object/RageObjectsManager.js +1 -1
  62. package/dist/server/entities/ragemp/ped/RagePedsManager.js +1 -1
  63. package/dist/server/entities/ragemp/vehicle/RageVehiclesManager.js +1 -1
  64. package/package.json +2 -2
@@ -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
  }
@@ -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,
@@ -40,7 +40,7 @@ export declare class CCMPVehicle extends CCMPEntity implements IVehicle {
40
40
  setBodyHealth(_value: number): void;
41
41
  setEngineHealth(_value: number): void;
42
42
  setEngineOn(value: boolean): void;
43
- setNumberPlate(_value: string): void;
43
+ setNumberPlate(value: string): void;
44
44
  setLocked(_value: boolean): void;
45
45
  setPrimaryColor(_value: number): void;
46
46
  setSecondaryColor(_value: number): void;
@@ -52,7 +52,7 @@ export declare class CCMPVehicle extends CCMPEntity implements IVehicle {
52
52
  setNeonColor(_r: number, _g: number, _b: number): void;
53
53
  setWindowTint(_tintType: number): void;
54
54
  setWheelType(_wheelType: number): void;
55
- setPlateType(_plateType: number): void;
55
+ setPlateType(plateType: number): void;
56
56
  explode(): void;
57
57
  repair(): void;
58
58
  }
@@ -41,7 +41,7 @@ class CCMPVehicle extends CCMPEntity_1.CCMPEntity {
41
41
  return notImplemented("CCMPVehicle.engineHealth");
42
42
  }
43
43
  get numberPlate() {
44
- return notImplemented("CCMPVehicle.numberPlate");
44
+ return this._ccmpVehicle.numberPlateText;
45
45
  }
46
46
  get isLocked() {
47
47
  return notImplemented("CCMPVehicle.isLocked");
@@ -112,8 +112,8 @@ class CCMPVehicle extends CCMPEntity_1.CCMPEntity {
112
112
  setEngineOn(value) {
113
113
  this._ccmpVehicle.engineOn = value;
114
114
  }
115
- setNumberPlate(_value) {
116
- notImplemented("CCMPVehicle.setNumberPlate");
115
+ setNumberPlate(value) {
116
+ this._ccmpVehicle.numberPlateText = value;
117
117
  }
118
118
  setLocked(_value) {
119
119
  notImplemented("CCMPVehicle.setLocked");
@@ -148,8 +148,8 @@ class CCMPVehicle extends CCMPEntity_1.CCMPEntity {
148
148
  setWheelType(_wheelType) {
149
149
  notImplemented("CCMPVehicle.setWheelType");
150
150
  }
151
- setPlateType(_plateType) {
152
- notImplemented("CCMPVehicle.setPlateType");
151
+ setPlateType(plateType) {
152
+ this._ccmpVehicle.numberPlateType = plateType;
153
153
  }
154
154
  explode() {
155
155
  notImplemented("CCMPVehicle.explode");
@@ -1,9 +1,11 @@
1
1
  import { type IEntity } from "../../common/entity/IEntity";
2
2
  import { type IRageWorldObjectOptions, RageWorldObject } from "../worldObject/RageWorldObject";
3
- import { Vector3D } from "../../../../shared/common/utils";
3
+ import { type IVector3D, Vector3D } from "../../../../shared/common/utils";
4
4
  export interface IRageEntityOptions<T extends EntityMp> extends IRageWorldObjectOptions<T> {
5
+ rotation?: IVector3D;
5
6
  }
6
7
  export declare abstract class RageEntity<T extends EntityMp> extends RageWorldObject<T> implements IEntity {
8
+ private _rotation;
7
9
  get model(): number;
8
10
  get rotation(): Vector3D;
9
11
  protected constructor(options: IRageEntityOptions<T>);
@@ -11,4 +13,6 @@ export declare abstract class RageEntity<T extends EntityMp> extends RageWorldOb
11
13
  setRotation(value: Vector3D): void;
12
14
  getNetData(name: string): unknown;
13
15
  setNetData(name: string, value: unknown): void;
16
+ private _getEntityRotationProperty;
17
+ private _isVectorLike;
14
18
  }
@@ -4,20 +4,23 @@ exports.RageEntity = void 0;
4
4
  const RageWorldObject_1 = require("../worldObject/RageWorldObject");
5
5
  const utils_1 = require("../../../../shared/common/utils");
6
6
  class RageEntity extends RageWorldObject_1.RageWorldObject {
7
+ _rotation;
7
8
  get model() {
8
9
  return this.mpEntity.model;
9
10
  }
10
11
  get rotation() {
11
- const { x, y, z } = this.mpEntity.rotation;
12
+ const { x, y, z } = this._getEntityRotationProperty() ?? this._rotation ?? new utils_1.Vector3D(0, 0, 0);
12
13
  return new utils_1.Vector3D(x, y, z);
13
14
  }
14
15
  constructor(options) {
15
16
  super(options);
17
+ this._rotation = options.rotation;
16
18
  }
17
19
  setModel(value) {
18
20
  this.mpEntity.model = mp.joaat(value);
19
21
  }
20
22
  setRotation(value) {
23
+ this._rotation = value;
21
24
  this.mpEntity.rotation = new mp.Vector3(value);
22
25
  }
23
26
  getNetData(name) {
@@ -26,5 +29,18 @@ class RageEntity extends RageWorldObject_1.RageWorldObject {
26
29
  setNetData(name, value) {
27
30
  this.mpEntity.setVariable(name, value);
28
31
  }
32
+ _getEntityRotationProperty() {
33
+ const rotation = this.mpEntity.rotation;
34
+ if (!this._isVectorLike(rotation))
35
+ return null;
36
+ return rotation;
37
+ }
38
+ _isVectorLike(value) {
39
+ return (typeof value === "object" &&
40
+ value !== null &&
41
+ typeof value.x === "number" &&
42
+ typeof value.y === "number" &&
43
+ typeof value.z === "number");
44
+ }
29
45
  }
30
46
  exports.RageEntity = RageEntity;
@@ -17,7 +17,7 @@ class RageObjectsManager extends RageEntitiesManager_1.RageEntitiesManager {
17
17
  alpha,
18
18
  });
19
19
  mpEntity.isExists = () => mp.objects.exists(mpEntity);
20
- const object = new RageObject_1.RageObject({ mpEntity });
20
+ const object = new RageObject_1.RageObject({ mpEntity, rotation });
21
21
  this.registerBaseObject(object);
22
22
  return object;
23
23
  }
@@ -17,7 +17,7 @@ class RagePedsManager extends RageEntitiesManager_1.RageEntitiesManager {
17
17
  frozen,
18
18
  });
19
19
  mpEntity.isExists = () => mp.peds.exists(mpEntity);
20
- const ped = new RagePed_1.RagePed({ mpEntity });
20
+ const ped = new RagePed_1.RagePed({ mpEntity, rotation });
21
21
  this.registerBaseObject(ped);
22
22
  return ped;
23
23
  }
@@ -19,7 +19,7 @@ class RageVehiclesManager extends RageEntitiesManager_1.RageEntitiesManager {
19
19
  });
20
20
  mpEntity.rotation = new mp.Vector3(rotation);
21
21
  mpEntity.isExists = () => mp.vehicles.exists(mpEntity);
22
- const vehicle = new RageVehicle_1.RageVehicle({ mpEntity });
22
+ const vehicle = new RageVehicle_1.RageVehicle({ mpEntity, rotation });
23
23
  this.registerBaseObject(vehicle);
24
24
  return vehicle;
25
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rock-mod",
3
- "version": "0.21.0",
3
+ "version": "0.22.0",
4
4
  "description": "Rock-Mod is a powerful framework designed for creating and managing mods for Grand Theft Auto (GTA) games.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -87,7 +87,7 @@
87
87
  "@swc/helpers": "^0.5.15"
88
88
  },
89
89
  "devDependencies": {
90
- "@classic-mp/types": "^1.4.1",
90
+ "@classic-mp/types": "^1.6.0",
91
91
  "@rollup/plugin-commonjs": "^25.0.7",
92
92
  "@rollup/plugin-node-resolve": "^15.2.3",
93
93
  "@rollup/plugin-terser": "^0.4.4",