rock-mod 0.20.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 (194) hide show
  1. package/dist/client/RockMod.d.ts +1 -1
  2. package/dist/client/RockMod.js +4 -0
  3. package/dist/client/entities/ccmp/blip/CCMPBlip.d.ts +38 -0
  4. package/dist/client/entities/ccmp/blip/CCMPBlip.js +118 -0
  5. package/dist/client/entities/ccmp/blip/CCMPBlipsManager.d.ts +27 -0
  6. package/dist/client/entities/ccmp/blip/CCMPBlipsManager.js +191 -0
  7. package/dist/client/entities/ccmp/camera/CCMPCamera.d.ts +24 -0
  8. package/dist/client/entities/ccmp/camera/CCMPCamera.js +58 -0
  9. package/dist/client/entities/ccmp/camera/CCMPCameraManager.d.ts +16 -0
  10. package/dist/client/entities/ccmp/camera/CCMPCameraManager.js +51 -0
  11. package/dist/client/entities/ccmp/colshape/CCMPColshape.d.ts +26 -0
  12. package/dist/client/entities/ccmp/colshape/CCMPColshape.js +83 -0
  13. package/dist/client/entities/ccmp/colshape/CCMPColshapesManager.d.ts +31 -0
  14. package/dist/client/entities/ccmp/colshape/CCMPColshapesManager.js +193 -0
  15. package/dist/client/entities/ccmp/marker/CCMPMarker.d.ts +34 -0
  16. package/dist/client/entities/ccmp/marker/CCMPMarker.js +109 -0
  17. package/dist/client/entities/ccmp/marker/CCMPMarkersManager.d.ts +27 -0
  18. package/dist/client/entities/ccmp/marker/CCMPMarkersManager.js +180 -0
  19. package/dist/client/entities/ccmp/object/CCMPObject.d.ts +53 -0
  20. package/dist/client/entities/ccmp/object/CCMPObject.js +218 -0
  21. package/dist/client/entities/ccmp/object/CCMPObjectsManager.d.ts +27 -0
  22. package/dist/client/entities/ccmp/object/CCMPObjectsManager.js +177 -0
  23. package/dist/client/entities/ccmp/ped/CCMPPed.d.ts +65 -0
  24. package/dist/client/entities/ccmp/ped/CCMPPed.js +199 -0
  25. package/dist/client/entities/ccmp/ped/CCMPPedsManager.d.ts +27 -0
  26. package/dist/client/entities/ccmp/ped/CCMPPedsManager.js +177 -0
  27. package/dist/client/entities/ccmp/player/CCMPPlayer.d.ts +112 -0
  28. package/dist/client/entities/ccmp/player/CCMPPlayer.js +338 -0
  29. package/dist/client/entities/ccmp/player/CCMPPlayersManager.d.ts +85 -0
  30. package/dist/client/entities/ccmp/player/CCMPPlayersManager.js +331 -0
  31. package/dist/client/entities/ccmp/vehicle/CCMPVehicle.d.ts +119 -0
  32. package/dist/client/entities/ccmp/vehicle/CCMPVehicle.js +392 -0
  33. package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +27 -0
  34. package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.js +183 -0
  35. package/dist/client/entities/common/baseObject/IBaseObject.d.ts +2 -1
  36. package/dist/client/entities/common/entity/IEntity.d.ts +3 -0
  37. package/dist/client/entities/ragemp/entity/RageEntity.d.ts +7 -0
  38. package/dist/client/entities/ragemp/entity/RageEntity.js +45 -2
  39. package/dist/client/factories/ccmp/CCMPManagersFactory.d.ts +48 -0
  40. package/dist/client/factories/ccmp/CCMPManagersFactory.js +189 -0
  41. package/dist/client/factories/ccmp/createNotImplementedProxy.d.ts +1 -0
  42. package/dist/client/factories/ccmp/createNotImplementedProxy.js +24 -0
  43. package/dist/client/game/ccmp/browser/CCMPBrowserManager.d.ts +22 -0
  44. package/dist/client/game/ccmp/browser/CCMPBrowserManager.js +66 -0
  45. package/dist/client/game/ccmp/chat/CCMPChatManager.d.ts +26 -0
  46. package/dist/client/game/ccmp/chat/CCMPChatManager.js +41 -0
  47. package/dist/client/game/ccmp/controls/CCMPControlsManager.d.ts +33 -0
  48. package/dist/client/game/ccmp/controls/CCMPControlsManager.js +47 -0
  49. package/dist/client/game/ccmp/cursor/CCMPCursorManager.d.ts +6 -0
  50. package/dist/client/game/ccmp/cursor/CCMPCursorManager.js +15 -0
  51. package/dist/client/game/ccmp/gameplay/CCMPGameplayManager.d.ts +6 -0
  52. package/dist/client/game/ccmp/gameplay/CCMPGameplayManager.js +10 -0
  53. package/dist/client/game/ccmp/graphics/CCMPGraphicsManager.d.ts +58 -0
  54. package/dist/client/game/ccmp/graphics/CCMPGraphicsManager.js +112 -0
  55. package/dist/client/game/ccmp/gui/CCMPGuiManager.d.ts +5 -0
  56. package/dist/client/game/ccmp/gui/CCMPGuiManager.js +17 -0
  57. package/dist/client/game/ccmp/keys/CCMPKeysManager.d.ts +41 -0
  58. package/dist/client/game/ccmp/keys/CCMPKeysManager.js +94 -0
  59. package/dist/client/game/ccmp/nametags/CCMPNametagsManager.d.ts +4 -0
  60. package/dist/client/game/ccmp/nametags/CCMPNametagsManager.js +6 -0
  61. package/dist/client/game/ccmp/native/CCMPNativeCallerManager.d.ts +74 -0
  62. package/dist/client/game/ccmp/native/CCMPNativeCallerManager.js +129 -0
  63. package/dist/client/game/ccmp/native/_generated/nativeDispatch.d.ts +5 -0
  64. package/dist/client/game/ccmp/native/_generated/nativeDispatch.js +8123 -0
  65. package/dist/client/game/ccmp/object/CCMPGameObjectManager.d.ts +4 -0
  66. package/dist/client/game/ccmp/object/CCMPGameObjectManager.js +6 -0
  67. package/dist/client/game/ccmp/pathfind/CCMPPathfindManager.d.ts +26 -0
  68. package/dist/client/game/ccmp/pathfind/CCMPPathfindManager.js +31 -0
  69. package/dist/client/game/ccmp/raycasting/CCMPRaycastingManager.d.ts +10 -0
  70. package/dist/client/game/ccmp/raycasting/CCMPRaycastingManager.js +46 -0
  71. package/dist/client/game/ccmp/storage/CCMPStorageManager.d.ts +7 -0
  72. package/dist/client/game/ccmp/storage/CCMPStorageManager.js +14 -0
  73. package/dist/client/game/ccmp/streaming/CCMPStreamingManager.d.ts +17 -0
  74. package/dist/client/game/ccmp/streaming/CCMPStreamingManager.js +41 -0
  75. package/dist/client/game/ccmp/ui/CCMPUiManager.d.ts +41 -0
  76. package/dist/client/game/ccmp/ui/CCMPUiManager.js +69 -0
  77. package/dist/client/game/ccmp/zone/CCMPZoneManager.d.ts +19 -0
  78. package/dist/client/game/ccmp/zone/CCMPZoneManager.js +20 -0
  79. package/dist/client/game/common/browser/IBrowserManager.d.ts +7 -0
  80. package/dist/client/game/common/chat/IChatManager.d.ts +1 -0
  81. package/dist/client/game/common/controls/IControlsManager.d.ts +3 -0
  82. package/dist/client/game/common/graphics/IGraphicsManager.d.ts +17 -0
  83. package/dist/client/game/common/streaming/IStreamingManager.d.ts +2 -0
  84. package/dist/client/game/ragemp/browser/RageBrowserManager.d.ts +2 -1
  85. package/dist/client/game/ragemp/browser/RageBrowserManager.js +30 -1
  86. package/dist/client/game/ragemp/chat/RageChatManager.d.ts +1 -0
  87. package/dist/client/game/ragemp/chat/RageChatManager.js +3 -0
  88. package/dist/client/game/ragemp/controls/RageControlsManager.d.ts +3 -0
  89. package/dist/client/game/ragemp/controls/RageControlsManager.js +9 -0
  90. package/dist/client/game/ragemp/graphics/RageGraphicsManager.d.ts +5 -1
  91. package/dist/client/game/ragemp/graphics/RageGraphicsManager.js +12 -0
  92. package/dist/client/game/ragemp/streaming/RageStreamingManager.d.ts +2 -0
  93. package/dist/client/game/ragemp/streaming/RageStreamingManager.js +6 -0
  94. package/dist/client/net/ccmp/CCMPConsoleForwarder.d.ts +11 -0
  95. package/dist/client/net/ccmp/CCMPConsoleForwarder.js +153 -0
  96. package/dist/client/net/ccmp/CCMPNetManager.d.ts +23 -0
  97. package/dist/client/net/ccmp/CCMPNetManager.js +55 -0
  98. package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.d.ts +23 -0
  99. package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.js +43 -0
  100. package/dist/client/net/ccmp/events/CCMPEventsBridge.d.ts +14 -0
  101. package/dist/client/net/ccmp/events/CCMPEventsBridge.js +19 -0
  102. package/dist/client/net/ccmp/events/CCMPEventsManager.d.ts +72 -0
  103. package/dist/client/net/ccmp/events/CCMPEventsManager.js +177 -0
  104. package/dist/client/net/ccmp/events/CCMPInProcessEmitter.d.ts +45 -0
  105. package/dist/client/net/ccmp/events/CCMPInProcessEmitter.js +133 -0
  106. package/dist/client/net/ccmp/events/CCMPRenderTicker.d.ts +18 -0
  107. package/dist/client/net/ccmp/events/CCMPRenderTicker.js +74 -0
  108. package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.d.ts +29 -0
  109. package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.js +45 -0
  110. package/dist/client/net/ccmp/rpc/CCMPRPCManager.d.ts +22 -0
  111. package/dist/client/net/ccmp/rpc/CCMPRPCManager.js +31 -0
  112. package/dist/client/net/common/dataHandler/IDataHandler.d.ts +2 -2
  113. package/dist/client/net/common/events/types.d.ts +6 -4
  114. package/dist/client/net/common/events/types.js +1 -0
  115. package/dist/client/net/ragemp/dataHandler/RageDataHandler.d.ts +2 -2
  116. package/dist/client/utils/ccmp/CCMPUtilsManager.d.ts +18 -0
  117. package/dist/client/utils/ccmp/CCMPUtilsManager.js +20 -0
  118. package/dist/server/RockMod.d.ts +1 -1
  119. package/dist/server/RockMod.js +4 -0
  120. package/dist/server/entities/ccmp/baseObject/CCMPBaseObject.d.ts +8 -0
  121. package/dist/server/entities/ccmp/baseObject/CCMPBaseObject.js +21 -0
  122. package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsIterator.d.ts +8 -0
  123. package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsIterator.js +16 -0
  124. package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsManager.d.ts +19 -0
  125. package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsManager.js +49 -0
  126. package/dist/server/entities/ccmp/blip/CCMPBlip.d.ts +36 -0
  127. package/dist/server/entities/ccmp/blip/CCMPBlip.js +86 -0
  128. package/dist/server/entities/ccmp/blip/CCMPBlipsManager.d.ts +9 -0
  129. package/dist/server/entities/ccmp/blip/CCMPBlipsManager.js +33 -0
  130. package/dist/server/entities/ccmp/colshape/CCMPCircleColshape.d.ts +7 -0
  131. package/dist/server/entities/ccmp/colshape/CCMPCircleColshape.js +10 -0
  132. package/dist/server/entities/ccmp/colshape/CCMPColshape.d.ts +25 -0
  133. package/dist/server/entities/ccmp/colshape/CCMPColshape.js +53 -0
  134. package/dist/server/entities/ccmp/colshape/CCMPColshapesManager.d.ts +28 -0
  135. package/dist/server/entities/ccmp/colshape/CCMPColshapesManager.js +108 -0
  136. package/dist/server/entities/ccmp/colshape/CCMPCuboidColshape.d.ts +7 -0
  137. package/dist/server/entities/ccmp/colshape/CCMPCuboidColshape.js +10 -0
  138. package/dist/server/entities/ccmp/colshape/CCMPCylinderColshape.d.ts +7 -0
  139. package/dist/server/entities/ccmp/colshape/CCMPCylinderColshape.js +10 -0
  140. package/dist/server/entities/ccmp/colshape/CCMPRectangleColshape.d.ts +7 -0
  141. package/dist/server/entities/ccmp/colshape/CCMPRectangleColshape.js +10 -0
  142. package/dist/server/entities/ccmp/colshape/CCMPSphereColshape.d.ts +7 -0
  143. package/dist/server/entities/ccmp/colshape/CCMPSphereColshape.js +10 -0
  144. package/dist/server/entities/ccmp/entity/CCMPEntitiesManager.d.ts +8 -0
  145. package/dist/server/entities/ccmp/entity/CCMPEntitiesManager.js +10 -0
  146. package/dist/server/entities/ccmp/entity/CCMPEntity.d.ts +13 -0
  147. package/dist/server/entities/ccmp/entity/CCMPEntity.js +28 -0
  148. package/dist/server/entities/ccmp/marker/CCMPMarker.d.ts +34 -0
  149. package/dist/server/entities/ccmp/marker/CCMPMarker.js +85 -0
  150. package/dist/server/entities/ccmp/marker/CCMPMarkersManager.d.ts +9 -0
  151. package/dist/server/entities/ccmp/marker/CCMPMarkersManager.js +30 -0
  152. package/dist/server/entities/ccmp/object/CCMPObject.d.ts +48 -0
  153. package/dist/server/entities/ccmp/object/CCMPObject.js +68 -0
  154. package/dist/server/entities/ccmp/object/CCMPObjectsManager.d.ts +9 -0
  155. package/dist/server/entities/ccmp/object/CCMPObjectsManager.js +27 -0
  156. package/dist/server/entities/ccmp/ped/CCMPPed.d.ts +33 -0
  157. package/dist/server/entities/ccmp/ped/CCMPPed.js +82 -0
  158. package/dist/server/entities/ccmp/ped/CCMPPedsManager.d.ts +9 -0
  159. package/dist/server/entities/ccmp/ped/CCMPPedsManager.js +28 -0
  160. package/dist/server/entities/ccmp/player/CCMPPlayer.d.ts +65 -0
  161. package/dist/server/entities/ccmp/player/CCMPPlayer.js +180 -0
  162. package/dist/server/entities/ccmp/player/CCMPPlayersManager.d.ts +12 -0
  163. package/dist/server/entities/ccmp/player/CCMPPlayersManager.js +66 -0
  164. package/dist/server/entities/ccmp/vehicle/CCMPVehicle.d.ts +58 -0
  165. package/dist/server/entities/ccmp/vehicle/CCMPVehicle.js +161 -0
  166. package/dist/server/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +9 -0
  167. package/dist/server/entities/ccmp/vehicle/CCMPVehiclesManager.js +31 -0
  168. package/dist/server/entities/ccmp/worldObject/CCMPWorldObject.d.ts +9 -0
  169. package/dist/server/entities/ccmp/worldObject/CCMPWorldObject.js +7 -0
  170. package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsIterator.d.ts +10 -0
  171. package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsIterator.js +40 -0
  172. package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsManager.d.ts +11 -0
  173. package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsManager.js +16 -0
  174. package/dist/server/entities/mock/player/MockPlayersManager.js +2 -1
  175. package/dist/server/entities/ragemp/entity/RageEntity.d.ts +5 -1
  176. package/dist/server/entities/ragemp/entity/RageEntity.js +17 -1
  177. package/dist/server/entities/ragemp/object/RageObjectsManager.js +1 -1
  178. package/dist/server/entities/ragemp/ped/RagePedsManager.js +1 -1
  179. package/dist/server/entities/ragemp/vehicle/RageVehiclesManager.js +1 -1
  180. package/dist/server/factories/ccmp/CCMPManagersFactory.d.ts +23 -0
  181. package/dist/server/factories/ccmp/CCMPManagersFactory.js +46 -0
  182. package/dist/server/net/ccmp/CCMPNetManager.d.ts +19 -0
  183. package/dist/server/net/ccmp/CCMPNetManager.js +112 -0
  184. package/dist/server/net/ccmp/events/CCMPEventsManager.d.ts +17 -0
  185. package/dist/server/net/ccmp/events/CCMPEventsManager.js +54 -0
  186. package/dist/server/net/ccmp/rpc/CCMPRPCManager.d.ts +8 -0
  187. package/dist/server/net/ccmp/rpc/CCMPRPCManager.js +18 -0
  188. package/dist/server/net/common/events/types.d.ts +2 -0
  189. package/dist/server/net/common/events/types.js +1 -0
  190. package/dist/server/utils/ccmp/CCMPUtilsManager.d.ts +4 -0
  191. package/dist/server/utils/ccmp/CCMPUtilsManager.js +9 -0
  192. package/dist/server/world/ccmp/CCMPWorldManager.d.ts +10 -0
  193. package/dist/server/world/ccmp/CCMPWorldManager.js +24 -0
  194. package/package.json +3 -1
@@ -0,0 +1,4 @@
1
+ import { type IGameObjectManager } from "../../common/object/IGameObjectManager";
2
+ export declare class CCMPGameObjectManager implements IGameObjectManager {
3
+ doorControl(modelHash: number, x: number, y: number, z: number, locked: boolean, xRotMult: number, yRotMult: number, zRotMult: number): void;
4
+ }
@@ -0,0 +1,6 @@
1
+ /// <reference types="@classic-mp/types/client" />
2
+ export class CCMPGameObjectManager {
3
+ doorControl(modelHash, x, y, z, locked, xRotMult, yRotMult, zRotMult) {
4
+ ccmp.natives.object.setLockedUnstreamedInDoorOfType(modelHash, x, y, z, locked, xRotMult, yRotMult, zRotMult);
5
+ }
6
+ }
@@ -0,0 +1,26 @@
1
+ import { type IPathfindManager, type IStreetNameHash } from "../../common/pathfind/IPathfindManager";
2
+ import { type IVector3D } from "../../../../shared/common/utils";
3
+ /**
4
+ * Реализация `IPathfindManager` под CCMP.
5
+ *
6
+ * RageMP `mp.game.pathfind.getStreetNameAtCoord` маппится 1:1 на GTA V натив
7
+ * `GET_STREET_NAME_AT_COORD` (`0x2EB41072B4C1E4C0`), который в CCMP экспонирован
8
+ * как `ccmp.natives.pathfind.getStreetNameAtCoord`. Натив возвращает два хэша
9
+ * локализационных GXT-ключей — улицу и пересекающую дорогу (или 0 для второй,
10
+ * если в точке нет пересечения).
11
+ *
12
+ * **Hot path:** вызывается ~раз в секунду из `HudController.onInterval` →
13
+ * `HudService.syncCurrentLocation` → `LocationService.getCurrentLocation` →
14
+ * `LocationService.getLocationByCords` → `RockModLocationAdapter.getStreetByCords`.
15
+ * Не render-tick, но всё равно высокая частота — синхронный native-call,
16
+ * стоимость незначительная.
17
+ *
18
+ * ### Маппинг полей
19
+ *
20
+ * CCMP-натив возвращает `{streetname, crossingroad}` (lowercase, как в C++
21
+ * биндинге), интерфейс `IStreetNameHash` ожидает `{streetName, crossingRoad}`
22
+ * (camelCase). Переименовываем в return-statement.
23
+ */
24
+ export declare class CCMPPathfindManager implements IPathfindManager {
25
+ getStreetNameAtCoord(position: IVector3D): IStreetNameHash;
26
+ }
@@ -0,0 +1,31 @@
1
+ /// <reference types="@classic-mp/types/client" />
2
+ /**
3
+ * Реализация `IPathfindManager` под CCMP.
4
+ *
5
+ * RageMP `mp.game.pathfind.getStreetNameAtCoord` маппится 1:1 на GTA V натив
6
+ * `GET_STREET_NAME_AT_COORD` (`0x2EB41072B4C1E4C0`), который в CCMP экспонирован
7
+ * как `ccmp.natives.pathfind.getStreetNameAtCoord`. Натив возвращает два хэша
8
+ * локализационных GXT-ключей — улицу и пересекающую дорогу (или 0 для второй,
9
+ * если в точке нет пересечения).
10
+ *
11
+ * **Hot path:** вызывается ~раз в секунду из `HudController.onInterval` →
12
+ * `HudService.syncCurrentLocation` → `LocationService.getCurrentLocation` →
13
+ * `LocationService.getLocationByCords` → `RockModLocationAdapter.getStreetByCords`.
14
+ * Не render-tick, но всё равно высокая частота — синхронный native-call,
15
+ * стоимость незначительная.
16
+ *
17
+ * ### Маппинг полей
18
+ *
19
+ * CCMP-натив возвращает `{streetname, crossingroad}` (lowercase, как в C++
20
+ * биндинге), интерфейс `IStreetNameHash` ожидает `{streetName, crossingRoad}`
21
+ * (camelCase). Переименовываем в return-statement.
22
+ */
23
+ export class CCMPPathfindManager {
24
+ getStreetNameAtCoord(position) {
25
+ const result = ccmp.natives.pathfind.getStreetNameAtCoord(position.x, position.y, position.z);
26
+ return {
27
+ streetName: result.streetname,
28
+ crossingRoad: result.crossingroad,
29
+ };
30
+ }
31
+ }
@@ -0,0 +1,10 @@
1
+ import { type IRaycastResult, type IRaycastingManager, type TIgnoreEntityType } from "../../common/raycasting/IRaycastingManager";
2
+ import { type IVector3D } from "../../../../shared/common/utils";
3
+ export declare class CCMPRaycastingManager implements IRaycastingManager {
4
+ private readonly _native;
5
+ testPointToPoint(startPos: IVector3D, endPos: IVector3D, ignoreEntity?: TIgnoreEntityType, flags?: number | number[]): IRaycastResult | null;
6
+ private _resolveFlags;
7
+ private _resolveIgnoreHandle;
8
+ private _isIgnoreEntity;
9
+ private _toVector3D;
10
+ }
@@ -0,0 +1,46 @@
1
+ import { CCMPNativeCallerManager } from "../native/CCMPNativeCallerManager";
2
+ import { Vector3D } from "../../../../shared/common/utils";
3
+ const START_SHAPE_TEST_LOS_PROBE = "0x7EE9F5D83DD4F90E";
4
+ const GET_SHAPE_TEST_RESULT = "0x3D87450E15D98694";
5
+ const DEFAULT_TRACE_FLAG = 7;
6
+ export class CCMPRaycastingManager {
7
+ constructor() {
8
+ this._native = new CCMPNativeCallerManager();
9
+ }
10
+ testPointToPoint(startPos, endPos, ignoreEntity, flags) {
11
+ const shapeTestHandle = this._native.callNative(START_SHAPE_TEST_LOS_PROBE, startPos.x, startPos.y, startPos.z, endPos.x, endPos.y, endPos.z, this._resolveFlags(flags), this._resolveIgnoreHandle(ignoreEntity), DEFAULT_TRACE_FLAG);
12
+ const result = this._native.callNative(GET_SHAPE_TEST_RESULT, shapeTestHandle);
13
+ const [, hit, position, surfaceNormal, entityHandle] = result;
14
+ if (!hit) {
15
+ return null;
16
+ }
17
+ return {
18
+ entityHandle,
19
+ position: this._toVector3D(position),
20
+ surfaceNormal: this._toVector3D(surfaceNormal),
21
+ };
22
+ }
23
+ _resolveFlags(flags) {
24
+ if (Array.isArray(flags)) {
25
+ return flags.reduce((acc, flag) => acc | flag, 0);
26
+ }
27
+ return flags !== null && flags !== void 0 ? flags : 0;
28
+ }
29
+ _resolveIgnoreHandle(ignoreEntity) {
30
+ if (!ignoreEntity) {
31
+ return 0;
32
+ }
33
+ const entity = Array.isArray(ignoreEntity) ? ignoreEntity[0] : ignoreEntity;
34
+ return this._isIgnoreEntity(entity) ? entity.handle : 0;
35
+ }
36
+ _isIgnoreEntity(entity) {
37
+ return typeof (entity === null || entity === void 0 ? void 0 : entity.handle) === "number";
38
+ }
39
+ _toVector3D(value) {
40
+ var _a, _b, _c;
41
+ if (Array.isArray(value)) {
42
+ return new Vector3D((_a = value[0]) !== null && _a !== void 0 ? _a : 0, (_b = value[1]) !== null && _b !== void 0 ? _b : 0, (_c = value[2]) !== null && _c !== void 0 ? _c : 0);
43
+ }
44
+ return new Vector3D(value.x, value.y, value.z);
45
+ }
46
+ }
@@ -0,0 +1,7 @@
1
+ import { type IStorageManager } from "../../common/storage/IStorageManager";
2
+ export declare class CCMPStorageManager implements IStorageManager {
3
+ getData<T>(key: string): T | null;
4
+ setData<T>(key: string, value: T): void;
5
+ removeData(key: string): void;
6
+ clearData(prefix?: string): void;
7
+ }
@@ -0,0 +1,14 @@
1
+ export class CCMPStorageManager {
2
+ getData(key) {
3
+ return ccmp.storage.getItem(key);
4
+ }
5
+ setData(key, value) {
6
+ ccmp.storage.setItem(key, value);
7
+ }
8
+ removeData(key) {
9
+ ccmp.storage.removeItem(key);
10
+ }
11
+ clearData(prefix) {
12
+ ccmp.storage.clear(prefix);
13
+ }
14
+ }
@@ -0,0 +1,17 @@
1
+ import { type IStreamingManager } from "../../../game";
2
+ import { type IVector3D } from "../../../../shared/common/utils";
3
+ export declare class CCMPStreamingManager implements IStreamingManager {
4
+ requestAnimationDictionary(dictionary: string): void;
5
+ hasAnimationDictionaryLoaded(dictionary: string): boolean;
6
+ removeAnimationDictionary(dictionary: string): void;
7
+ requestNamedPtfxAsset(assetName: string): void;
8
+ hasNamedPtfxAssetLoaded(assetName: string): boolean;
9
+ isModelInCdimage(model: string): boolean;
10
+ requestModel(modelHash: number): void;
11
+ hasModelLoaded(modelHash: number): boolean;
12
+ requestIpl(iplName: string): void;
13
+ removeIpl(iplName: string): void;
14
+ setFocusArea(position: IVector3D, offset: IVector3D): void;
15
+ clearFocus(): void;
16
+ setFocusEntity(entityHandle: number): void;
17
+ }
@@ -0,0 +1,41 @@
1
+ export class CCMPStreamingManager {
2
+ requestAnimationDictionary(dictionary) {
3
+ ccmp.natives.streaming.requestAnimDict(dictionary);
4
+ }
5
+ hasAnimationDictionaryLoaded(dictionary) {
6
+ return ccmp.natives.streaming.hasAnimDictLoaded(dictionary);
7
+ }
8
+ removeAnimationDictionary(dictionary) {
9
+ ccmp.natives.streaming.removeAnimDict(dictionary);
10
+ }
11
+ requestNamedPtfxAsset(assetName) {
12
+ ccmp.natives.streaming.requestNamedPtfxAsset(assetName);
13
+ }
14
+ hasNamedPtfxAssetLoaded(assetName) {
15
+ return ccmp.natives.streaming.hasNamedPtfxAssetLoaded(assetName);
16
+ }
17
+ isModelInCdimage(model) {
18
+ return ccmp.natives.streaming.isModelInCdimage(ccmp.natives.misc.getHashKey(model));
19
+ }
20
+ requestModel(modelHash) {
21
+ ccmp.natives.streaming.requestModel(modelHash);
22
+ }
23
+ hasModelLoaded(modelHash) {
24
+ return ccmp.natives.streaming.hasModelLoaded(modelHash);
25
+ }
26
+ requestIpl(iplName) {
27
+ ccmp.natives.streaming.requestIpl(iplName);
28
+ }
29
+ removeIpl(iplName) {
30
+ ccmp.natives.streaming.removeIpl(iplName);
31
+ }
32
+ setFocusArea(position, offset) {
33
+ ccmp.natives.streaming.setFocusPosAndVel(position.x, position.y, position.z, offset.x, offset.y, offset.z);
34
+ }
35
+ clearFocus() {
36
+ ccmp.natives.streaming.clearFocus();
37
+ }
38
+ setFocusEntity(entityHandle) {
39
+ ccmp.natives.streaming.setFocusEntity(entityHandle);
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ import { type IUiManager } from "../../common/ui/IUiManager";
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
+ export declare class CCMPUiManager implements IUiManager {
30
+ /** Глобальный набор для one-time варнингов, чтобы не флудить лог. */
31
+ private static readonly _warnedMethods;
32
+ getStreetNameFromHashKey(hash: number): string;
33
+ getLabelText(labelName: string): string;
34
+ hideHudComponentThisFrame(componentIndex: number): void;
35
+ displayRadar(display: boolean): void;
36
+ setPauseMenuActive(toggle: boolean): void;
37
+ setWaypoint(x: number, y: number): void;
38
+ deleteWaypoint(): void;
39
+ getBlipInfoIdCoord(blip: number): IVector3D;
40
+ private static _warnOnce;
41
+ }
@@ -0,0 +1,69 @@
1
+ /// <reference types="@classic-mp/types/client" />
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
+ export class CCMPUiManager {
30
+ getStreetNameFromHashKey(hash) {
31
+ return ccmp.natives.hud.getStreetNameFromHashKey(hash);
32
+ }
33
+ getLabelText(labelName) {
34
+ // _GET_LABEL_TEXT не доступен в CCMP — отдаём ключ как fallback.
35
+ CCMPUiManager._warnOnce("getLabelText", "[CCMPUiManager] getLabelText() не реализован в CCMP-нативах — " +
36
+ "возвращаем сам labelName как fallback. Локализованных строк не будет.");
37
+ return labelName;
38
+ }
39
+ hideHudComponentThisFrame(componentIndex) {
40
+ ccmp.natives.hud.hideHudComponentThisFrame(componentIndex);
41
+ }
42
+ displayRadar(display) {
43
+ ccmp.natives.hud.displayRadar(display);
44
+ }
45
+ setPauseMenuActive(toggle) {
46
+ ccmp.natives.hud.setPauseMenuActive(toggle);
47
+ }
48
+ setWaypoint(x, y) {
49
+ ccmp.natives.hud.setNewWaypoint(x, y);
50
+ }
51
+ deleteWaypoint() {
52
+ // RageMP `deleteWaypoint()` === GTA `SET_WAYPOINT_OFF`. CCMP экспонирует
53
+ // под именем `setWaypointOff`.
54
+ ccmp.natives.hud.setWaypointOff();
55
+ }
56
+ getBlipInfoIdCoord(blip) {
57
+ const { x, y, z } = ccmp.natives.hud.getBlipInfoIdCoord(blip);
58
+ return new Vector3D(x, y, z);
59
+ }
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
+ }
68
+ /** Глобальный набор для one-time варнингов, чтобы не флудить лог. */
69
+ CCMPUiManager._warnedMethods = new Set();
@@ -0,0 +1,19 @@
1
+ import { type IZoneManager } from "../../common/zone/IZoneManager";
2
+ import { type IVector3D } from "../../../../shared/common/utils";
3
+ /**
4
+ * Реализация `IZoneManager` под CCMP.
5
+ *
6
+ * RageMP `mp.game.zone.getNameOfZone` маппится 1:1 на GTA V натив
7
+ * `GET_NAME_OF_ZONE` (`0x7875CE91B4119A5F`), который в CCMP экспонирован
8
+ * как `ccmp.natives.zone.getNameOfZone`. Натив возвращает GXT-ключ зоны
9
+ * (например, `"VINE"`, `"DOWNT"`, `"AIRP"`) — локализуется в UI через
10
+ * `getLabelText(key)`.
11
+ *
12
+ * **Hot path:** вызывается ~раз в секунду из `HudController.onInterval` →
13
+ * `HudService.syncCurrentLocation` → `LocationService.getLocationByCords`
14
+ * → `RockModLocationAdapter.getRegionByCords`. Парная с
15
+ * `CCMPPathfindManager.getStreetNameAtCoord`.
16
+ */
17
+ export declare class CCMPZoneManager implements IZoneManager {
18
+ getNameOfZone(position: IVector3D): string;
19
+ }
@@ -0,0 +1,20 @@
1
+ /// <reference types="@classic-mp/types/client" />
2
+ /**
3
+ * Реализация `IZoneManager` под CCMP.
4
+ *
5
+ * RageMP `mp.game.zone.getNameOfZone` маппится 1:1 на GTA V натив
6
+ * `GET_NAME_OF_ZONE` (`0x7875CE91B4119A5F`), который в CCMP экспонирован
7
+ * как `ccmp.natives.zone.getNameOfZone`. Натив возвращает GXT-ключ зоны
8
+ * (например, `"VINE"`, `"DOWNT"`, `"AIRP"`) — локализуется в UI через
9
+ * `getLabelText(key)`.
10
+ *
11
+ * **Hot path:** вызывается ~раз в секунду из `HudController.onInterval` →
12
+ * `HudService.syncCurrentLocation` → `LocationService.getLocationByCords`
13
+ * → `RockModLocationAdapter.getRegionByCords`. Парная с
14
+ * `CCMPPathfindManager.getStreetNameAtCoord`.
15
+ */
16
+ export class CCMPZoneManager {
17
+ getNameOfZone(position) {
18
+ return ccmp.natives.zone.getNameOfZone(position.x, position.y, position.z);
19
+ }
20
+ }
@@ -1,5 +1,12 @@
1
+ export interface IBrowserHandle {
2
+ readonly isAlive: boolean;
3
+ execute(code: string): void;
4
+ destroy(): void;
5
+ setOrderId?(orderId: number): void;
6
+ }
1
7
  export interface IBrowserManager {
2
8
  create(url: string): void;
9
+ createInstance(url: string): IBrowserHandle;
3
10
  destroy(): void;
4
11
  execute(code: string): void;
5
12
  }
@@ -1,4 +1,5 @@
1
1
  export interface IChatManager {
2
2
  activate(state: boolean): void;
3
3
  show(state: boolean): void;
4
+ push(text: string): void;
4
5
  }
@@ -1,6 +1,9 @@
1
1
  export interface IControlsManager {
2
2
  disableControlAction(padIndex: number, control: number, disable: boolean): void;
3
3
  isDisabledControlPressed(padIndex: number, control: number): boolean;
4
+ isDisabledControlJustPressed(padIndex: number, control: number): boolean;
4
5
  isControlPressed(padIndex: number, control: number): boolean;
6
+ isControlJustPressed(padIndex: number, control: number): boolean;
7
+ isControlJustReleased(padIndex: number, control: number): boolean;
5
8
  getDisabledControlNormal(padIndex: number, control: number): number;
6
9
  }
@@ -1,4 +1,5 @@
1
1
  import { type IRGBA, type IVector2D, type IVector3D } from "../../../../shared/common/utils";
2
+ export type IParticleFxVector3D = Pick<IVector3D, "x" | "y" | "z">;
2
3
  export interface IScreenTextOptions {
3
4
  font: number;
4
5
  color: IRGBA;
@@ -6,11 +7,27 @@ export interface IScreenTextOptions {
6
7
  outline: boolean;
7
8
  centre: boolean;
8
9
  }
10
+ export interface IParticleFxAtCoordOptions {
11
+ effectName: string;
12
+ position: IParticleFxVector3D;
13
+ rotation: IParticleFxVector3D;
14
+ scale: number;
15
+ xAxis: boolean;
16
+ yAxis: boolean;
17
+ zAxis: boolean;
18
+ }
19
+ export interface ILoopedParticleFxAtCoordOptions extends IParticleFxAtCoordOptions {
20
+ p11: boolean;
21
+ }
9
22
  export interface IGraphicsManager {
10
23
  drawText(text: string, position: IVector2D, options?: IScreenTextOptions): void;
11
24
  world3dToScreen2d(position: IVector3D): IVector2D | null;
12
25
  startScreenEffect(effectName: string, duration: number, looped: boolean): void;
13
26
  stopScreenEffect(effectName: string): void;
27
+ setPtfxAssetNextCall(assetName: string): void;
28
+ startParticleFxNonLoopedAtCoord(options: IParticleFxAtCoordOptions): boolean;
29
+ startParticleFxLoopedAtCoord(options: ILoopedParticleFxAtCoordOptions): number;
30
+ stopParticleFxLooped(handle: number, p1: boolean): void;
14
31
  getSafeZoneSize(): number;
15
32
  getActiveScreenResolution(): IVector2D;
16
33
  }
@@ -3,6 +3,8 @@ export interface IStreamingManager {
3
3
  requestAnimationDictionary(dictionary: string): void;
4
4
  hasAnimationDictionaryLoaded(dictionary: string): boolean;
5
5
  removeAnimationDictionary(dictionary: string): void;
6
+ requestNamedPtfxAsset(assetName: string): void;
7
+ hasNamedPtfxAssetLoaded(assetName: string): boolean;
6
8
  isModelInCdimage(model: string): boolean;
7
9
  requestModel(modelHash: number): void;
8
10
  hasModelLoaded(modelHash: number): boolean;
@@ -1,7 +1,8 @@
1
- import { type IBrowserManager } from "../../../game/common/browser/IBrowserManager";
1
+ import { type IBrowserHandle, type IBrowserManager } from "../../../game/common/browser/IBrowserManager";
2
2
  export declare class RageBrowserManager implements IBrowserManager {
3
3
  private _browser;
4
4
  create(url: string): void;
5
+ createInstance(url: string): IBrowserHandle;
5
6
  destroy(): void;
6
7
  execute(code: string): void;
7
8
  }
@@ -1,9 +1,38 @@
1
+ class RageBrowserHandle {
2
+ constructor(url) {
3
+ this._browser = null;
4
+ this._browser = mp.browsers.new(url);
5
+ }
6
+ get isAlive() {
7
+ return this._browser !== null;
8
+ }
9
+ destroy() {
10
+ if (this._browser) {
11
+ this._browser.destroy();
12
+ this._browser = null;
13
+ }
14
+ }
15
+ execute(code) {
16
+ if (this._browser) {
17
+ this._browser.execute(code);
18
+ }
19
+ }
20
+ setOrderId(orderId) {
21
+ if (this._browser) {
22
+ this._browser.orderId = orderId;
23
+ }
24
+ }
25
+ }
1
26
  export class RageBrowserManager {
2
27
  constructor() {
3
28
  this._browser = null;
4
29
  }
5
30
  create(url) {
6
- this._browser = mp.browsers.new(url);
31
+ this.destroy();
32
+ this._browser = this.createInstance(url);
33
+ }
34
+ createInstance(url) {
35
+ return new RageBrowserHandle(url);
7
36
  }
8
37
  destroy() {
9
38
  if (this._browser) {
@@ -2,4 +2,5 @@ import { type IChatManager } from "../../../game";
2
2
  export declare class RageChatManager implements IChatManager {
3
3
  activate(state: boolean): void;
4
4
  show(state: boolean): void;
5
+ push(text: string): void;
5
6
  }
@@ -5,4 +5,7 @@ export class RageChatManager {
5
5
  show(state) {
6
6
  mp.gui.chat.show(state);
7
7
  }
8
+ push(text) {
9
+ mp.gui.chat.push(text);
10
+ }
8
11
  }
@@ -2,6 +2,9 @@ import { type IControlsManager } from "../../../game";
2
2
  export declare class RageControlsManager implements IControlsManager {
3
3
  disableControlAction(padIndex: number, control: number, disable: boolean): void;
4
4
  isDisabledControlPressed(padIndex: number, control: number): boolean;
5
+ isDisabledControlJustPressed(padIndex: number, control: number): boolean;
5
6
  isControlPressed(padIndex: number, control: number): boolean;
7
+ isControlJustPressed(padIndex: number, control: number): boolean;
8
+ isControlJustReleased(padIndex: number, control: number): boolean;
6
9
  getDisabledControlNormal(padIndex: number, control: number): number;
7
10
  }
@@ -5,9 +5,18 @@ export class RageControlsManager {
5
5
  isDisabledControlPressed(padIndex, control) {
6
6
  return mp.game.controls.isDisabledControlPressed(padIndex, control);
7
7
  }
8
+ isDisabledControlJustPressed(padIndex, control) {
9
+ return mp.game.controls.isDisabledControlJustPressed(padIndex, control);
10
+ }
8
11
  isControlPressed(padIndex, control) {
9
12
  return mp.game.controls.isControlPressed(padIndex, control);
10
13
  }
14
+ isControlJustPressed(padIndex, control) {
15
+ return mp.game.controls.isControlJustPressed(padIndex, control);
16
+ }
17
+ isControlJustReleased(padIndex, control) {
18
+ return mp.game.controls.isControlJustReleased(padIndex, control);
19
+ }
11
20
  getDisabledControlNormal(padIndex, control) {
12
21
  return mp.game.controls.getDisabledControlNormal(padIndex, control);
13
22
  }
@@ -1,10 +1,14 @@
1
- import { type IGraphicsManager, type IScreenTextOptions } from "../../../game";
1
+ import { type IGraphicsManager, type ILoopedParticleFxAtCoordOptions, type IParticleFxAtCoordOptions, type IScreenTextOptions } from "../../../game";
2
2
  import { type IVector3D, type IVector2D } from "../../../../shared/index";
3
3
  export declare class RageGraphicsManager implements IGraphicsManager {
4
4
  drawText(text: string, position: IVector2D, options?: IScreenTextOptions): void;
5
5
  world3dToScreen2d(position: IVector3D): IVector2D | null;
6
6
  startScreenEffect(effectName: string, duration: number, looped: boolean): void;
7
7
  stopScreenEffect(effectName: string): void;
8
+ setPtfxAssetNextCall(assetName: string): void;
9
+ startParticleFxNonLoopedAtCoord(options: IParticleFxAtCoordOptions): boolean;
10
+ startParticleFxLoopedAtCoord(options: ILoopedParticleFxAtCoordOptions): number;
11
+ stopParticleFxLooped(handle: number, p1: boolean): void;
8
12
  getSafeZoneSize(): number;
9
13
  getActiveScreenResolution(): IVector2D;
10
14
  }
@@ -27,6 +27,18 @@ export class RageGraphicsManager {
27
27
  stopScreenEffect(effectName) {
28
28
  mp.game.graphics.stopScreenEffect(effectName);
29
29
  }
30
+ setPtfxAssetNextCall(assetName) {
31
+ mp.game.graphics.setPtfxAssetNextCall(assetName);
32
+ }
33
+ startParticleFxNonLoopedAtCoord(options) {
34
+ return Boolean(mp.game.graphics.startParticleFxNonLoopedAtCoord(options.effectName, options.position.x, options.position.y, options.position.z, options.rotation.x, options.rotation.y, options.rotation.z, options.scale, options.xAxis, options.yAxis, options.zAxis));
35
+ }
36
+ startParticleFxLoopedAtCoord(options) {
37
+ return mp.game.graphics.startParticleFxLoopedAtCoord(options.effectName, options.position.x, options.position.y, options.position.z, options.rotation.x, options.rotation.y, options.rotation.z, options.scale, options.xAxis, options.yAxis, options.zAxis, options.p11);
38
+ }
39
+ stopParticleFxLooped(handle, p1) {
40
+ mp.game.graphics.stopParticleFxLooped(handle, p1);
41
+ }
30
42
  getSafeZoneSize() {
31
43
  return mp.game.graphics.getSafeZoneSize();
32
44
  }
@@ -4,6 +4,8 @@ export declare class RageStreamingManager implements IStreamingManager {
4
4
  requestAnimationDictionary(dictionary: string): void;
5
5
  hasAnimationDictionaryLoaded(dictionary: string): boolean;
6
6
  removeAnimationDictionary(dictionary: string): void;
7
+ requestNamedPtfxAsset(assetName: string): void;
8
+ hasNamedPtfxAssetLoaded(assetName: string): boolean;
7
9
  isModelInCdimage(model: string): boolean;
8
10
  requestModel(modelHash: number): void;
9
11
  hasModelLoaded(modelHash: number): boolean;
@@ -8,6 +8,12 @@ export class RageStreamingManager {
8
8
  removeAnimationDictionary(dictionary) {
9
9
  mp.game.streaming.removeAnimDict(dictionary);
10
10
  }
11
+ requestNamedPtfxAsset(assetName) {
12
+ mp.game.streaming.requestNamedPtfxAsset(assetName);
13
+ }
14
+ hasNamedPtfxAssetLoaded(assetName) {
15
+ return mp.game.streaming.hasNamedPtfxAssetLoaded(assetName);
16
+ }
11
17
  isModelInCdimage(model) {
12
18
  const modelHash = mp.game.joaat(model);
13
19
  return mp.game.streaming.isModelInCdimage(modelHash);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Оборачивает `globalThis.console` так, чтобы каждый вызов
3
+ * `console.log/info/warn/error/debug` дополнительно отправлялся на сервер.
4
+ * Оригинальное поведение (вывод в локальный игровой лог) сохраняется.
5
+ *
6
+ * Идемпотентно: повторный `install()` ничего не делает.
7
+ */
8
+ export declare class CCMPConsoleForwarder {
9
+ private _installed;
10
+ install(): void;
11
+ }