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
@@ -5,8 +5,8 @@ export class RageEntity extends RageWorldObject {
5
5
  return this.mpEntity.model;
6
6
  }
7
7
  get rotation() {
8
- const { x, y, z } = this.mpEntity.rotation;
9
- return new Vector3D(x, y, z);
8
+ var _a, _b;
9
+ return (_b = (_a = this._getNativeRotation()) !== null && _a !== void 0 ? _a : this._getEntityRotationProperty()) !== null && _b !== void 0 ? _b : new Vector3D(0, 0, this.heading);
10
10
  }
11
11
  constructor(options) {
12
12
  super(options);
@@ -22,6 +22,9 @@ export class RageEntity extends RageWorldObject {
22
22
  }
23
23
  setRotation(value) {
24
24
  this.mpEntity.rotation = new mp.Vector3(value);
25
+ if (this._hasValidHandle()) {
26
+ mp.game.entity.setRotation(this.handle, value.x, value.y, value.z, 2, true);
27
+ }
25
28
  }
26
29
  get forwardVector() {
27
30
  const vector = this.mpEntity.getForwardVector();
@@ -88,4 +91,33 @@ export class RageEntity extends RageWorldObject {
88
91
  isPlayingAnim(dictionary, name, taskFlag) {
89
92
  return mp.game.entity.isPlayingAnim(this.handle, dictionary, name, taskFlag);
90
93
  }
94
+ _getNativeRotation() {
95
+ if (!this._hasValidHandle())
96
+ return null;
97
+ try {
98
+ const rotation = mp.game.entity.getRotation(this.handle, 2);
99
+ if (!this._isVectorLike(rotation))
100
+ return null;
101
+ return new Vector3D(rotation.x, rotation.y, rotation.z);
102
+ }
103
+ catch (_a) {
104
+ return null;
105
+ }
106
+ }
107
+ _getEntityRotationProperty() {
108
+ const rotation = this.mpEntity.rotation;
109
+ if (!this._isVectorLike(rotation))
110
+ return null;
111
+ return new Vector3D(rotation.x, rotation.y, rotation.z);
112
+ }
113
+ _hasValidHandle() {
114
+ return typeof this.handle === "number" && this.handle > 0;
115
+ }
116
+ _isVectorLike(value) {
117
+ return (typeof value === "object" &&
118
+ value !== null &&
119
+ typeof value.x === "number" &&
120
+ typeof value.y === "number" &&
121
+ typeof value.z === "number");
122
+ }
91
123
  }
@@ -1,16 +1,18 @@
1
1
  import { type IManagersFactory } from "../common/IManagersFactory";
2
2
  type ManagerReturn<K extends keyof IManagersFactory> = IManagersFactory[K] extends (...args: never[]) => infer R ? R : never;
3
3
  export declare class CCMPManagersFactory implements IManagersFactory {
4
- /**
5
- * Сохраняем созданный `CCMPNetManager` потому что другим менеджерам
6
- * (например, `CCMPPlayersManager`) нужен доступ к его событиям. Порядок
7
- * создания в `RockMod` гарантирует, что `createNetManager` вызывается
8
- * первым — мы можем безопасно полагаться на наличие `_netManager` в
9
- * последующих фабричных методах.
10
- */
11
4
  private _netManager;
5
+ private _blipsManager;
6
+ private _colshapesManager;
7
+ private _markersManager;
8
+ private _objectsManager;
9
+ private _pedsManager;
10
+ private _playersManager;
11
+ private _vehiclesManager;
12
+ private _syncedMetaBridgeRegistered;
12
13
  createNetManager(): ManagerReturn<"createNetManager">;
13
14
  private _requireNetManager;
15
+ private _registerSyncedMetaBridgeIfReady;
14
16
  createBlipsManager(): ManagerReturn<"createBlipsManager">;
15
17
  createColshapesManager(): ManagerReturn<"createColshapesManager">;
16
18
  createMarkersManager(): ManagerReturn<"createMarkersManager">;
@@ -8,6 +8,10 @@ import { CCMPControlsManager } from "../../game/ccmp/controls/CCMPControlsManage
8
8
  import { CCMPPlayersManager } from "../../entities/ccmp/player/CCMPPlayersManager";
9
9
  import { CCMPPedsManager } from "../../entities/ccmp/ped/CCMPPedsManager";
10
10
  import { CCMPVehiclesManager } from "../../entities/ccmp/vehicle/CCMPVehiclesManager";
11
+ import { CCMPObjectsManager } from "../../entities/ccmp/object/CCMPObjectsManager";
12
+ import { CCMPMarkersManager } from "../../entities/ccmp/marker/CCMPMarkersManager";
13
+ import { CCMPBlipsManager } from "../../entities/ccmp/blip/CCMPBlipsManager";
14
+ import { CCMPColshapesManager } from "../../entities/ccmp/colshape/CCMPColshapesManager";
11
15
  import { CCMPUtilsManager } from "../../utils/ccmp/CCMPUtilsManager";
12
16
  import { CCMPGraphicsManager } from "../../game/ccmp/graphics/CCMPGraphicsManager";
13
17
  import { CCMPUiManager } from "../../game/ccmp/ui/CCMPUiManager";
@@ -25,14 +29,15 @@ import { CCMPGameplayManager } from "../../game/ccmp/gameplay/CCMPGameplayManage
25
29
  import { createNotImplementedProxy } from "./createNotImplementedProxy";
26
30
  export class CCMPManagersFactory {
27
31
  constructor() {
28
- /**
29
- * Сохраняем созданный `CCMPNetManager` потому что другим менеджерам
30
- * (например, `CCMPPlayersManager`) нужен доступ к его событиям. Порядок
31
- * создания в `RockMod` гарантирует, что `createNetManager` вызывается
32
- * первым — мы можем безопасно полагаться на наличие `_netManager` в
33
- * последующих фабричных методах.
34
- */
35
32
  this._netManager = null;
33
+ this._blipsManager = null;
34
+ this._colshapesManager = null;
35
+ this._markersManager = null;
36
+ this._objectsManager = null;
37
+ this._pedsManager = null;
38
+ this._playersManager = null;
39
+ this._vehiclesManager = null;
40
+ this._syncedMetaBridgeRegistered = false;
36
41
  }
37
42
  createNetManager() {
38
43
  this._netManager = new CCMPNetManager();
@@ -41,41 +46,76 @@ export class CCMPManagersFactory {
41
46
  _requireNetManager(forMethod) {
42
47
  if (!this._netManager) {
43
48
  throw new Error(`CCMPManagersFactory.${forMethod}: ` +
44
- "createNetManager() ещё не вызывался. Это нарушение контракта порядка " +
45
- "фабричных методов в RockMod-конструкторе.");
49
+ "createNetManager() was not called yet. This violates RockMod manager factory order.");
46
50
  }
47
51
  return this._netManager;
48
52
  }
53
+ _registerSyncedMetaBridgeIfReady() {
54
+ if (this._syncedMetaBridgeRegistered ||
55
+ !this._netManager ||
56
+ !this._blipsManager ||
57
+ !this._colshapesManager ||
58
+ !this._markersManager ||
59
+ !this._objectsManager ||
60
+ !this._pedsManager ||
61
+ !this._playersManager ||
62
+ !this._vehiclesManager) {
63
+ return;
64
+ }
65
+ new CCMPSyncedMetaBridge(this._netManager.events, {
66
+ blips: this._blipsManager,
67
+ colshapes: this._colshapesManager,
68
+ markers: this._markersManager,
69
+ objects: this._objectsManager,
70
+ peds: this._pedsManager,
71
+ players: this._playersManager,
72
+ vehicles: this._vehiclesManager,
73
+ }).register();
74
+ this._syncedMetaBridgeRegistered = true;
75
+ }
49
76
  createBlipsManager() {
50
- return createNotImplementedProxy("CCMPBlipsManager");
77
+ const netManager = this._requireNetManager("createBlipsManager");
78
+ this._blipsManager = new CCMPBlipsManager(netManager.events);
79
+ this._registerSyncedMetaBridgeIfReady();
80
+ return this._blipsManager;
51
81
  }
52
82
  createColshapesManager() {
53
- return createNotImplementedProxy("CCMPColshapesManager");
83
+ const netManager = this._requireNetManager("createColshapesManager");
84
+ this._colshapesManager = new CCMPColshapesManager(netManager.events);
85
+ this._registerSyncedMetaBridgeIfReady();
86
+ return this._colshapesManager;
54
87
  }
55
88
  createMarkersManager() {
56
- return createNotImplementedProxy("CCMPMarkersManager");
89
+ const netManager = this._requireNetManager("createMarkersManager");
90
+ this._markersManager = new CCMPMarkersManager(netManager.events);
91
+ this._registerSyncedMetaBridgeIfReady();
92
+ return this._markersManager;
57
93
  }
58
94
  createObjectsManager() {
59
- return createNotImplementedProxy("CCMPObjectsManager");
95
+ const netManager = this._requireNetManager("createObjectsManager");
96
+ this._objectsManager = new CCMPObjectsManager(netManager.events);
97
+ this._registerSyncedMetaBridgeIfReady();
98
+ return this._objectsManager;
60
99
  }
61
100
  createPedsManager() {
62
- return new CCMPPedsManager();
101
+ const netManager = this._requireNetManager("createPedsManager");
102
+ this._pedsManager = new CCMPPedsManager(netManager.events);
103
+ this._registerSyncedMetaBridgeIfReady();
104
+ return this._pedsManager;
63
105
  }
64
106
  createPlayersManager() {
65
107
  const netManager = this._requireNetManager("createPlayersManager");
66
- const playersManager = new CCMPPlayersManager(netManager.events);
67
- // Bridge для `streamSyncedMetaChange` создаётся здесь — ему нужен
68
- // players manager для резолва `entityId → CCMPPlayer`, а events bus
69
- // — для эмиссии `rm::syncedMetaChange` (на который уже подписан
70
- // `CCMPDataHandler`, инстанцированный в `CCMPNetManager`).
71
- new CCMPSyncedMetaBridge(netManager.events, playersManager).register();
72
- return playersManager;
108
+ this._playersManager = new CCMPPlayersManager(netManager.events);
109
+ this._registerSyncedMetaBridgeIfReady();
110
+ return this._playersManager;
73
111
  }
74
112
  createUtilsManager() {
75
113
  return new CCMPUtilsManager();
76
114
  }
77
115
  createVehiclesManager() {
78
- return new CCMPVehiclesManager();
116
+ this._vehiclesManager = new CCMPVehiclesManager();
117
+ this._registerSyncedMetaBridgeIfReady();
118
+ return this._vehiclesManager;
79
119
  }
80
120
  createBrowserManager() {
81
121
  return new CCMPBrowserManager();
@@ -1,26 +1,6 @@
1
1
  import { type IChatManager } from "../../common/chat/IChatManager";
2
- /**
3
- * No-op реализация `IChatManager` под CCMP.
4
- *
5
- * У RageMP клиента есть `mp.gui.chat.activate(state)` (разрешает игроку
6
- * печатать в чат по T) и `mp.gui.chat.show(state)` (видимость чат-окна).
7
- * У CCMP **нет JS API для управления чатом** — только встроенное событие
8
- * `chatMessage` на приём входящих сообщений и `ccmp.notify(text)` для HUD-
9
- * уведомлений (не относится к чату).
10
- *
11
- * Бросать нельзя: геймод-консьюмер `RockModChatAdapter.activate` вызывается
12
- * из `ChatService.onModuleInit` — исключение поднимет весь bootstrap DI.
13
- * Поэтому игнорируем + один раз пишем warn, чтобы было видно в логах что
14
- * фича недоступна.
15
- *
16
- * Следствие: под CCMP программное управление чатом не работает. Чат-UI
17
- * (если он есть) рисуется самим CCMP-клиентом на Rust-стороне и реагирует
18
- * на свои клавиши. Когда (если) CCMP добавит JS-API для чата — заменим.
19
- */
20
2
  export declare class CCMPChatManager implements IChatManager {
21
- private _warned;
22
- activate(state: boolean): void;
23
- show(state: boolean): void;
3
+ activate(_state: boolean): void;
4
+ show(_state: boolean): void;
24
5
  push(text: string): void;
25
- private _warnOnce;
26
6
  }
@@ -1,41 +1,13 @@
1
- /**
2
- * No-op реализация `IChatManager` под CCMP.
3
- *
4
- * У RageMP клиента есть `mp.gui.chat.activate(state)` (разрешает игроку
5
- * печатать в чат по T) и `mp.gui.chat.show(state)` (видимость чат-окна).
6
- * У CCMP **нет JS API для управления чатом** — только встроенное событие
7
- * `chatMessage` на приём входящих сообщений и `ccmp.notify(text)` для HUD-
8
- * уведомлений (не относится к чату).
9
- *
10
- * Бросать нельзя: геймод-консьюмер `RockModChatAdapter.activate` вызывается
11
- * из `ChatService.onModuleInit` — исключение поднимет весь bootstrap DI.
12
- * Поэтому игнорируем + один раз пишем warn, чтобы было видно в логах что
13
- * фича недоступна.
14
- *
15
- * Следствие: под CCMP программное управление чатом не работает. Чат-UI
16
- * (если он есть) рисуется самим CCMP-клиентом на Rust-стороне и реагирует
17
- * на свои клавиши. Когда (если) CCMP добавит JS-API для чата — заменим.
18
- */
19
1
  export class CCMPChatManager {
20
- constructor() {
21
- this._warned = false;
2
+ activate(_state) {
3
+ void _state;
4
+ // CCMP currently does not expose chat activation controls to JS.
22
5
  }
23
- activate(state) {
24
- this._warnOnce("activate", state);
25
- }
26
- show(state) {
27
- this._warnOnce("show", state);
6
+ show(_state) {
7
+ void _state;
8
+ // CCMP currently does not expose chat visibility controls to JS.
28
9
  }
29
10
  push(text) {
30
11
  ccmp.notify(text);
31
12
  }
32
- _warnOnce(method, state) {
33
- if (this._warned) {
34
- return;
35
- }
36
- this._warned = true;
37
- console.warn(`[CCMPChatManager] ${method}(${String(state)}) вызван, но CCMP не ` +
38
- `предоставляет JS API для управления чатом. Дальнейшие вызовы ` +
39
- `activate/show будут проигнорированы молча.`);
40
- }
41
13
  }
@@ -1,23 +1,5 @@
1
1
  import { type IStorageManager } from "../../common/storage/IStorageManager";
2
- /**
3
- * In-memory реализация `IStorageManager` под CCMP.
4
- *
5
- * RageMP даёт `mp.storage.data` — персистентное JSON-K/V на диске между
6
- * сессиями. У CCMP нативного аналога client-side storage пока нет. Этот
7
- * MVP — обычный `Map` в памяти процесса:
8
- * - Данные доступны в рамках одной сессии.
9
- * - Не переживают переподключение/перезапуск игры.
10
- *
11
- * Этого достаточно для `CacheController` геймода: пустой кэш заставит
12
- * перезапросить данные с сервера, чуть менее эффективно но функционально.
13
- *
14
- * Долгосрочно: добавить persistent storage в CCMP-клиент (Rust) — файл в
15
- * `%APPDATA%/ccmp/storage/<server>.json` через `Deno.core.ops`, тогда
16
- * заменить этот класс на адаптер к ops.
17
- */
18
2
  export declare class CCMPStorageManager implements IStorageManager {
19
- private readonly _data;
20
- constructor();
21
3
  getData<T>(key: string): T | null;
22
4
  setData<T>(key: string, value: T): void;
23
5
  removeData(key: string): void;
@@ -1,46 +1,14 @@
1
- /**
2
- * In-memory реализация `IStorageManager` под CCMP.
3
- *
4
- * RageMP даёт `mp.storage.data` — персистентное JSON-K/V на диске между
5
- * сессиями. У CCMP нативного аналога client-side storage пока нет. Этот
6
- * MVP — обычный `Map` в памяти процесса:
7
- * - Данные доступны в рамках одной сессии.
8
- * - Не переживают переподключение/перезапуск игры.
9
- *
10
- * Этого достаточно для `CacheController` геймода: пустой кэш заставит
11
- * перезапросить данные с сервера, чуть менее эффективно но функционально.
12
- *
13
- * Долгосрочно: добавить persistent storage в CCMP-клиент (Rust) — файл в
14
- * `%APPDATA%/ccmp/storage/<server>.json` через `Deno.core.ops`, тогда
15
- * заменить этот класс на адаптер к ops.
16
- */
17
1
  export class CCMPStorageManager {
18
- constructor() {
19
- this._data = new Map();
20
- console.warn("[rock-mod] CCMPStorageManager uses in-memory storage; data will not persist between sessions");
21
- }
22
2
  getData(key) {
23
- var _a;
24
- if (!this._data.has(key)) {
25
- return null;
26
- }
27
- return (_a = this._data.get(key)) !== null && _a !== void 0 ? _a : null;
3
+ return ccmp.storage.getItem(key);
28
4
  }
29
5
  setData(key, value) {
30
- this._data.set(key, value);
6
+ ccmp.storage.setItem(key, value);
31
7
  }
32
8
  removeData(key) {
33
- this._data.delete(key);
9
+ ccmp.storage.removeItem(key);
34
10
  }
35
11
  clearData(prefix) {
36
- if (!prefix) {
37
- this._data.clear();
38
- return;
39
- }
40
- for (const key of [...this._data.keys()]) {
41
- if (key.startsWith(prefix)) {
42
- this._data.delete(key);
43
- }
44
- }
12
+ ccmp.storage.clear(prefix);
45
13
  }
46
14
  }
@@ -1,34 +1,6 @@
1
1
  import { type IUiManager } from "../../common/ui/IUiManager";
2
2
  import { type IVector3D } from "../../../../shared/common/utils";
3
- /**
4
- * Реализация `IUiManager` под CCMP. Большинство методов — прямой passthrough
5
- * к `ccmp.natives.hud.*` (cрезом GTA V нативов HUD-намespace'а).
6
- *
7
- * **Hot path:** `hideHudComponentThisFrame(componentIndex)` вызывается каждый
8
- * render-tick из `HudService.render` → `_hideHudComponents`. CCMP-native —
9
- * синхронный V8-op, стоимость незначительная.
10
- *
11
- * ### Пробелы в CCMP-нативах
12
- *
13
- * `getLabelText(labelName)` — GTA V натив `_GET_LABEL_TEXT` (0x7B5280EBA9840C72)
14
- * **не экспонирован** в CCMP-биндингах (см. `@classic-mp/types/natives`).
15
- * Этот натив резолвит локализационный label из game GXT-таблиц — без него
16
- * мы не можем достать перевод. Возвращаем сам `labelName` как fallback и
17
- * один раз варнём в консоль — UI-консьюмер (скорее всего, что-то вроде
18
- * weapon-display или street-name) получит непереведённый ключ, что лучше
19
- * пустой строки или падения.
20
- *
21
- * TODO: при появлении `getLabelText` в `@classic-mp/types/natives.hud` или
22
- * `natives.localization` — заменить fallback на реальный вызов.
23
- *
24
- * ### `deleteWaypoint` под CCMP
25
- *
26
- * RageMP-натив `deleteWaypoint()` — алиас для `SET_WAYPOINT_OFF` (
27
- * `0xA7E4E2D361C2627F`). CCMP экспонирует его как `setWaypointOff`.
28
- */
29
3
  export declare class CCMPUiManager implements IUiManager {
30
- /** Глобальный набор для one-time варнингов, чтобы не флудить лог. */
31
- private static readonly _warnedMethods;
32
4
  getStreetNameFromHashKey(hash: number): string;
33
5
  getLabelText(labelName: string): string;
34
6
  hideHudComponentThisFrame(componentIndex: number): void;
@@ -37,5 +9,4 @@ export declare class CCMPUiManager implements IUiManager {
37
9
  setWaypoint(x: number, y: number): void;
38
10
  deleteWaypoint(): void;
39
11
  getBlipInfoIdCoord(blip: number): IVector3D;
40
- private static _warnOnce;
41
12
  }
@@ -1,40 +1,15 @@
1
1
  /// <reference types="@classic-mp/types/client" />
2
2
  import { Vector3D } from "../../../../shared/common/utils";
3
- /**
4
- * Реализация `IUiManager` под CCMP. Большинство методов — прямой passthrough
5
- * к `ccmp.natives.hud.*` (cрезом GTA V нативов HUD-намespace'а).
6
- *
7
- * **Hot path:** `hideHudComponentThisFrame(componentIndex)` вызывается каждый
8
- * render-tick из `HudService.render` → `_hideHudComponents`. CCMP-native —
9
- * синхронный V8-op, стоимость незначительная.
10
- *
11
- * ### Пробелы в CCMP-нативах
12
- *
13
- * `getLabelText(labelName)` — GTA V натив `_GET_LABEL_TEXT` (0x7B5280EBA9840C72)
14
- * **не экспонирован** в CCMP-биндингах (см. `@classic-mp/types/natives`).
15
- * Этот натив резолвит локализационный label из game GXT-таблиц — без него
16
- * мы не можем достать перевод. Возвращаем сам `labelName` как fallback и
17
- * один раз варнём в консоль — UI-консьюмер (скорее всего, что-то вроде
18
- * weapon-display или street-name) получит непереведённый ключ, что лучше
19
- * пустой строки или падения.
20
- *
21
- * TODO: при появлении `getLabelText` в `@classic-mp/types/natives.hud` или
22
- * `natives.localization` — заменить fallback на реальный вызов.
23
- *
24
- * ### `deleteWaypoint` под CCMP
25
- *
26
- * RageMP-натив `deleteWaypoint()` — алиас для `SET_WAYPOINT_OFF` (
27
- * `0xA7E4E2D361C2627F`). CCMP экспонирует его как `setWaypointOff`.
28
- */
29
3
  export class CCMPUiManager {
30
4
  getStreetNameFromHashKey(hash) {
31
5
  return ccmp.natives.hud.getStreetNameFromHashKey(hash);
32
6
  }
33
7
  getLabelText(labelName) {
34
- // _GET_LABEL_TEXT не доступен в CCMP — отдаём ключ как fallback.
35
- CCMPUiManager._warnOnce("getLabelText", "[CCMPUiManager] getLabelText() не реализован в CCMP-нативах — " +
36
- "возвращаем сам labelName как fallback. Локализованных строк не будет.");
37
- return labelName;
8
+ if (!ccmp.natives.hud.doesTextLabelExist(labelName)) {
9
+ return labelName;
10
+ }
11
+ const text = ccmp.natives.hud.getFilenameForAudioConversation(labelName);
12
+ return text && text !== "NULL" ? text : labelName;
38
13
  }
39
14
  hideHudComponentThisFrame(componentIndex) {
40
15
  ccmp.natives.hud.hideHudComponentThisFrame(componentIndex);
@@ -49,21 +24,10 @@ export class CCMPUiManager {
49
24
  ccmp.natives.hud.setNewWaypoint(x, y);
50
25
  }
51
26
  deleteWaypoint() {
52
- // RageMP `deleteWaypoint()` === GTA `SET_WAYPOINT_OFF`. CCMP экспонирует
53
- // под именем `setWaypointOff`.
54
27
  ccmp.natives.hud.setWaypointOff();
55
28
  }
56
29
  getBlipInfoIdCoord(blip) {
57
30
  const { x, y, z } = ccmp.natives.hud.getBlipInfoIdCoord(blip);
58
31
  return new Vector3D(x, y, z);
59
32
  }
60
- static _warnOnce(method, message) {
61
- if (CCMPUiManager._warnedMethods.has(method)) {
62
- return;
63
- }
64
- CCMPUiManager._warnedMethods.add(method);
65
- console.warn(message);
66
- }
67
33
  }
68
- /** Глобальный набор для one-time варнингов, чтобы не флудить лог. */
69
- CCMPUiManager._warnedMethods = new Set();
@@ -2,13 +2,6 @@ import { type INetManager } from "../common/INetManager";
2
2
  import { CCMPDataHandler } from "./dataHandler/CCMPDataHandler";
3
3
  import { CCMPEventsManager } from "./events/CCMPEventsManager";
4
4
  import { CCMPRPCManager } from "./rpc/CCMPRPCManager";
5
- /**
6
- * Корневой сетевой менеджер CCMP-клиента.
7
- *
8
- * Симметричен `RageNetManager` (`src/client/net/ragemp/RageNetManager.ts`), но
9
- * без `IEntityPoolRouter` — CCMP entity pool ещё не реализован, а events+RPC
10
- * milestone от него не зависит.
11
- */
12
5
  export declare class CCMPNetManager implements INetManager {
13
6
  private readonly _eventsManager;
14
7
  private readonly _rpcManager;
@@ -4,13 +4,6 @@ import { CCMPEventsBridge } from "./events/CCMPEventsBridge";
4
4
  import { CCMPEventsManager } from "./events/CCMPEventsManager";
5
5
  import { CCMPRenderTicker } from "./events/CCMPRenderTicker";
6
6
  import { CCMPRPCManager } from "./rpc/CCMPRPCManager";
7
- /**
8
- * Корневой сетевой менеджер CCMP-клиента.
9
- *
10
- * Симметричен `RageNetManager` (`src/client/net/ragemp/RageNetManager.ts`), но
11
- * без `IEntityPoolRouter` — CCMP entity pool ещё не реализован, а events+RPC
12
- * milestone от него не зависит.
13
- */
14
7
  export class CCMPNetManager {
15
8
  get events() {
16
9
  return this._eventsManager;
@@ -22,29 +15,10 @@ export class CCMPNetManager {
22
15
  return this._dataHandler;
23
16
  }
24
17
  constructor() {
25
- // Прямой ping на сервер — не зависит от console-обёртки и других
26
- // менеджеров. Серверная сторона (`CCMPNetManager`) логирует через
27
- // `rm::clientLog` handler с уровнем info. Если в серверном stdout не
28
- // видно "[client:<id>] [rock-mod] CCMP client net manager constructed" —
29
- // значит client-бандл не загрузился / не дошёл до этого места.
30
- try {
31
- ccmp.emitServer("rm::clientLog", {
32
- level: "info",
33
- args: ["[rock-mod] CCMP client net manager constructed"],
34
- });
35
- }
36
- catch (_a) {
37
- // Если сетевой канал не готов, эта диагностическая строка теряется.
38
- }
39
- // Console forwarder ставим первым: чтобы любые `console.*` из
40
- // конструкторов других менеджеров/модулей уже зеркалились на сервер.
41
18
  this._consoleForwarder = new CCMPConsoleForwarder();
42
19
  this._consoleForwarder.install();
43
20
  this._eventsManager = new CCMPEventsManager();
44
21
  this._rpcManager = new CCMPRPCManager();
45
- // DataHandler сначала, чтобы он успел подписаться на internal-bus до
46
- // первых эмиссий `rm::syncedMetaChange` от `CCMPSyncedMetaBridge`
47
- // (создаётся позже в `CCMPManagersFactory.createPlayersManager`).
48
22
  this._dataHandler = new CCMPDataHandler(this._eventsManager);
49
23
  this._bridge = new CCMPEventsBridge(this._eventsManager);
50
24
  this._renderTicker = new CCMPRenderTicker();
@@ -1,7 +1,7 @@
1
- import { type IEntity } from "../../../entities";
1
+ import { type IBaseObject } from "../../../entities";
2
2
  import { type IDataHandler } from "../../common/dataHandler/IDataHandler";
3
3
  import { type CCMPEventsManager } from "../events/CCMPEventsManager";
4
- type DataHandlerCallback = (entity: IEntity, value: unknown, oldValue?: unknown) => void;
4
+ type DataHandlerCallback = (object: IBaseObject, value: unknown, oldValue?: unknown) => void;
5
5
  /**
6
6
  * Реализация `IDataHandler` под CCMP поверх `rm::syncedMetaChange`.
7
7
  *
@@ -16,14 +16,14 @@ export class CCMPDataHandler {
16
16
  constructor(events) {
17
17
  this._handlers = new Map();
18
18
  events.onInternal({
19
- [ClientInternalEventName.SyncedMetaChange]: (entity, key, value, oldValue) => {
19
+ [ClientInternalEventName.SyncedMetaChange]: (object, key, value, oldValue) => {
20
20
  const callbacks = this._handlers.get(key);
21
21
  if (!callbacks || callbacks.length === 0) {
22
22
  return;
23
23
  }
24
24
  for (const callback of [...callbacks]) {
25
25
  try {
26
- callback(entity, value, oldValue);
26
+ callback(object, value, oldValue);
27
27
  }
28
28
  catch (error) {
29
29
  console.error(`[CCMPDataHandler] callback for key "${key}" failed:`, error);
@@ -8,7 +8,9 @@ import { type CCMPEventsManager } from "./CCMPEventsManager";
8
8
  * Rock-Mod `CCMPPlayer` instance before emitting internal `rm::*` events.
9
9
  */
10
10
  export declare class CCMPEventsBridge implements IEventsBridge {
11
- constructor(events: CCMPEventsManager);
11
+ private readonly _events;
12
+ constructor(_events: CCMPEventsManager);
12
13
  registerRawEvents(): void;
13
14
  registerServerEvents(): void;
15
+ private _resolveVehicleEventPayload;
14
16
  }
@@ -1,3 +1,5 @@
1
+ import { ClientInternalEventName } from "../../../net/common/events/types";
2
+ import { RockMod } from "../../../RockMod";
1
3
  /**
2
4
  * Legacy bridge slot for CCMP raw events.
3
5
  *
@@ -6,14 +8,42 @@
6
8
  * Rock-Mod `CCMPPlayer` instance before emitting internal `rm::*` events.
7
9
  */
8
10
  export class CCMPEventsBridge {
9
- constructor(events) {
10
- void events;
11
+ constructor(_events) {
12
+ this._events = _events;
11
13
  }
12
14
  registerRawEvents() {
13
- // Intentionally empty. See class comment.
15
+ this._events.register("playerEnterVehicle", (payload) => {
16
+ const event = this._resolveVehicleEventPayload(payload);
17
+ if (!event)
18
+ return;
19
+ this._events.emitInternal(ClientInternalEventName.PlayerEnterVehicle, event.vehicle, event.seat);
20
+ });
21
+ this._events.register("playerLeaveVehicle", (payload) => {
22
+ const event = this._resolveVehicleEventPayload(payload);
23
+ if (!event)
24
+ return;
25
+ this._events.emitInternal(ClientInternalEventName.PlayerLeaveVehicle, event.vehicle, event.seat);
26
+ });
14
27
  }
15
28
  registerServerEvents() {
16
29
  // No-op: ранее тут жил handler для cooperation `rm::clientReady`-ответа.
17
30
  // Теперь это responsibility `CCMPPlayersManager`.
18
31
  }
32
+ _resolveVehicleEventPayload(payload) {
33
+ var _a;
34
+ const ccmpPayload = payload;
35
+ const ccmpVehicleId = (_a = ccmpPayload === null || ccmpPayload === void 0 ? void 0 : ccmpPayload.vehicle) === null || _a === void 0 ? void 0 : _a.id;
36
+ if (typeof ccmpVehicleId !== "number" || !Number.isFinite(ccmpVehicleId)) {
37
+ return null;
38
+ }
39
+ const rawSeat = Number(ccmpPayload === null || ccmpPayload === void 0 ? void 0 : ccmpPayload.seat);
40
+ const seat = Number.isFinite(rawSeat) ? rawSeat : -1;
41
+ try {
42
+ const vehicle = RockMod.instance.vehicles.registerById(ccmpVehicleId);
43
+ return { vehicle, seat };
44
+ }
45
+ catch (_b) {
46
+ return null;
47
+ }
48
+ }
19
49
  }