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,153 @@
1
+ /// <reference types="@classic-mp/types/client" />
2
+ /**
3
+ * Имя приватного rock-mod события для зеркалирования клиентских `console.*`
4
+ * вызовов в серверный stdout.
5
+ *
6
+ * Серверная сторона (`src/server/net/ccmp/CCMPNetManager.ts`) ловит это
7
+ * событие и печатает payload через свой `console.log`/`error`/`warn`. Это
8
+ * критически важно для отладки CCMP: на клиенте `console.log` идёт в игровую
9
+ * консоль (F8), и разработчик в серверном терминале не видит ничего.
10
+ */
11
+ const CLIENT_LOG_EVENT = "rm::clientLog";
12
+ const FORWARDED_LEVELS = ["log", "info", "warn", "error", "debug"];
13
+ function safeJsonStringify(value) {
14
+ try {
15
+ return JSON.stringify(value, Object.getOwnPropertyNames(value));
16
+ }
17
+ catch (_a) {
18
+ return "[unjsonable]";
19
+ }
20
+ }
21
+ function safeToString(value) {
22
+ try {
23
+ const s = String(value);
24
+ return s === "[object Object]" ? safeJsonStringify(value) : s;
25
+ }
26
+ catch (_a) {
27
+ return "[unstringifiable]";
28
+ }
29
+ }
30
+ function safeReadString(value, key) {
31
+ try {
32
+ const v = value[key];
33
+ return typeof v === "string" ? v : undefined;
34
+ }
35
+ catch (_a) {
36
+ return undefined;
37
+ }
38
+ }
39
+ function looksLikeError(value) {
40
+ if (value instanceof Error) {
41
+ return true;
42
+ }
43
+ if (typeof value !== "object" || value === null) {
44
+ return false;
45
+ }
46
+ const v = value;
47
+ // Структурные признаки. Хотя бы один из: stack (V8 ставит на ошибки),
48
+ // или name+message (классический duck-type).
49
+ return typeof v["stack"] === "string" || (typeof v["name"] === "string" && typeof v["message"] === "string");
50
+ }
51
+ /**
52
+ * Превращает аргумент в JSON-сериализуемое значение.
53
+ *
54
+ * Проблема: `JSON.stringify(new Error("..."))` возвращает `"{}"` — у Error
55
+ * свойства `message`/`stack` не enumerable. Плюс под deno_core встречаются
56
+ * "ошибки" не наследующие `Error.prototype` (cross-realm, ops_throw,
57
+ * NotImplementedProxy через Proxy traps), для которых `instanceof Error`
58
+ * возвращает false, но визуально они ошибки.
59
+ *
60
+ * Стратегия:
61
+ * 1. Скаляры — как есть.
62
+ * 2. Если есть `.message`/`.stack` / похожее на Error — пакуем в
63
+ * `__error`-обёртку с явно перечисленными полями.
64
+ * 3. Объекты — пробуем `JSON.stringify`. Если пусто (`{}`/`[]`) или падает
65
+ * — добавляем `__toString` с `String(value)`.
66
+ * 4. Худший случай — голая строка `String(value)`.
67
+ */
68
+ function serializeArg(value) {
69
+ var _a, _b;
70
+ if (value === null || value === undefined) {
71
+ return value;
72
+ }
73
+ const type = typeof value;
74
+ if (type === "string" || type === "number" || type === "boolean") {
75
+ return value;
76
+ }
77
+ if (looksLikeError(value)) {
78
+ return {
79
+ __error: true,
80
+ name: (_a = safeReadString(value, "name")) !== null && _a !== void 0 ? _a : "Error",
81
+ message: (_b = safeReadString(value, "message")) !== null && _b !== void 0 ? _b : safeToString(value),
82
+ stack: safeReadString(value, "stack"),
83
+ toString: safeToString(value),
84
+ };
85
+ }
86
+ try {
87
+ const json = JSON.stringify(value);
88
+ if (json && json !== "{}" && json !== "[]") {
89
+ return value;
90
+ }
91
+ // Пустой JSON для непустого объекта — non-enumerable props. Дублируем
92
+ // через String(...) чтобы на сервере хоть что-то прочиталось.
93
+ return {
94
+ __toString: safeToString(value),
95
+ __raw: value,
96
+ };
97
+ }
98
+ catch (_c) {
99
+ return {
100
+ __toString: safeToString(value),
101
+ };
102
+ }
103
+ }
104
+ /**
105
+ * Создаёт обёртку для конкретного level. Извлечено в именованную функцию,
106
+ * чтобы избежать `no-loop-func` (захват `ccmp` в замыкании внутри `for`).
107
+ */
108
+ function createForwardingMethod(level, original) {
109
+ return (...args) => {
110
+ try {
111
+ original(...args);
112
+ }
113
+ catch (_a) {
114
+ // Локальный консоль-вывод не должен ломать форвард.
115
+ }
116
+ try {
117
+ const payload = {
118
+ level,
119
+ args: args.map(serializeArg),
120
+ };
121
+ ccmp.emitServer(CLIENT_LOG_EVENT, payload);
122
+ }
123
+ catch (_b) {
124
+ // Если сервер недоступен (раннее в boot до handshake) — молча.
125
+ }
126
+ };
127
+ }
128
+ /**
129
+ * Оборачивает `globalThis.console` так, чтобы каждый вызов
130
+ * `console.log/info/warn/error/debug` дополнительно отправлялся на сервер.
131
+ * Оригинальное поведение (вывод в локальный игровой лог) сохраняется.
132
+ *
133
+ * Идемпотентно: повторный `install()` ничего не делает.
134
+ */
135
+ export class CCMPConsoleForwarder {
136
+ constructor() {
137
+ this._installed = false;
138
+ }
139
+ install() {
140
+ var _a;
141
+ if (this._installed) {
142
+ return;
143
+ }
144
+ this._installed = true;
145
+ for (const level of FORWARDED_LEVELS) {
146
+ const original = (_a = console[level]) === null || _a === void 0 ? void 0 : _a.bind(console);
147
+ if (!original) {
148
+ continue;
149
+ }
150
+ console[level] = createForwardingMethod(level, original);
151
+ }
152
+ }
153
+ }
@@ -0,0 +1,23 @@
1
+ import { type INetManager } from "../common/INetManager";
2
+ import { CCMPDataHandler } from "./dataHandler/CCMPDataHandler";
3
+ import { CCMPEventsManager } from "./events/CCMPEventsManager";
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
+ export declare class CCMPNetManager implements INetManager {
13
+ private readonly _eventsManager;
14
+ private readonly _rpcManager;
15
+ private readonly _dataHandler;
16
+ private readonly _bridge;
17
+ private readonly _renderTicker;
18
+ private readonly _consoleForwarder;
19
+ get events(): CCMPEventsManager;
20
+ get rpc(): CCMPRPCManager;
21
+ get dataHandler(): CCMPDataHandler;
22
+ constructor();
23
+ }
@@ -0,0 +1,55 @@
1
+ import { CCMPConsoleForwarder } from "./CCMPConsoleForwarder";
2
+ import { CCMPDataHandler } from "./dataHandler/CCMPDataHandler";
3
+ import { CCMPEventsBridge } from "./events/CCMPEventsBridge";
4
+ import { CCMPEventsManager } from "./events/CCMPEventsManager";
5
+ import { CCMPRenderTicker } from "./events/CCMPRenderTicker";
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
+ export class CCMPNetManager {
15
+ get events() {
16
+ return this._eventsManager;
17
+ }
18
+ get rpc() {
19
+ return this._rpcManager;
20
+ }
21
+ get dataHandler() {
22
+ return this._dataHandler;
23
+ }
24
+ 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
+ this._consoleForwarder = new CCMPConsoleForwarder();
42
+ this._consoleForwarder.install();
43
+ this._eventsManager = new CCMPEventsManager();
44
+ this._rpcManager = new CCMPRPCManager();
45
+ // DataHandler сначала, чтобы он успел подписаться на internal-bus до
46
+ // первых эмиссий `rm::syncedMetaChange` от `CCMPSyncedMetaBridge`
47
+ // (registers later, when all stream-synced base-object managers are ready).
48
+ this._dataHandler = new CCMPDataHandler(this._eventsManager);
49
+ this._bridge = new CCMPEventsBridge(this._eventsManager);
50
+ this._renderTicker = new CCMPRenderTicker();
51
+ this._bridge.registerRawEvents();
52
+ this._bridge.registerServerEvents();
53
+ this._renderTicker.start(this._eventsManager);
54
+ }
55
+ }
@@ -0,0 +1,23 @@
1
+ import { type IBaseObject } from "../../../entities";
2
+ import { type IDataHandler } from "../../common/dataHandler/IDataHandler";
3
+ import { type CCMPEventsManager } from "../events/CCMPEventsManager";
4
+ type DataHandlerCallback = (object: IBaseObject, value: unknown, oldValue?: unknown) => void;
5
+ /**
6
+ * Реализация `IDataHandler` под CCMP поверх `rm::syncedMetaChange`.
7
+ *
8
+ * `CCMPSyncedMetaBridge` переводит нативное событие
9
+ * `ccmp.on('streamSyncedMetaChange')` в internal-bus
10
+ * `rm::syncedMetaChange(entity, key, value, oldValue)`. Этот класс
11
+ * держит per-key реестр колбэков и диспатчит на них пришедшие изменения.
12
+ *
13
+ * Снапшот всех ключей сущности (отправляется CCMP'ом сразу после
14
+ * `StreamIn`) тоже проходит через это событие — поэтому первое появление
15
+ * сущности у клиента триггерит колбэк на каждый уже выставленный сервером
16
+ * ключ (с `oldValue === undefined`).
17
+ */
18
+ export declare class CCMPDataHandler implements IDataHandler {
19
+ private readonly _handlers;
20
+ constructor(events: CCMPEventsManager);
21
+ addDataHandler(key: string, callback: DataHandlerCallback): void;
22
+ }
23
+ export {};
@@ -0,0 +1,43 @@
1
+ import { ClientInternalEventName } from "../../common/events/types";
2
+ /**
3
+ * Реализация `IDataHandler` под CCMP поверх `rm::syncedMetaChange`.
4
+ *
5
+ * `CCMPSyncedMetaBridge` переводит нативное событие
6
+ * `ccmp.on('streamSyncedMetaChange')` в internal-bus
7
+ * `rm::syncedMetaChange(entity, key, value, oldValue)`. Этот класс
8
+ * держит per-key реестр колбэков и диспатчит на них пришедшие изменения.
9
+ *
10
+ * Снапшот всех ключей сущности (отправляется CCMP'ом сразу после
11
+ * `StreamIn`) тоже проходит через это событие — поэтому первое появление
12
+ * сущности у клиента триггерит колбэк на каждый уже выставленный сервером
13
+ * ключ (с `oldValue === undefined`).
14
+ */
15
+ export class CCMPDataHandler {
16
+ constructor(events) {
17
+ this._handlers = new Map();
18
+ events.onInternal({
19
+ [ClientInternalEventName.SyncedMetaChange]: (object, key, value, oldValue) => {
20
+ const callbacks = this._handlers.get(key);
21
+ if (!callbacks || callbacks.length === 0) {
22
+ return;
23
+ }
24
+ for (const callback of [...callbacks]) {
25
+ try {
26
+ callback(object, value, oldValue);
27
+ }
28
+ catch (error) {
29
+ console.error(`[CCMPDataHandler] callback for key "${key}" failed:`, error);
30
+ }
31
+ }
32
+ },
33
+ });
34
+ }
35
+ addDataHandler(key, callback) {
36
+ let bucket = this._handlers.get(key);
37
+ if (!bucket) {
38
+ bucket = [];
39
+ this._handlers.set(key, bucket);
40
+ }
41
+ bucket.push(callback);
42
+ }
43
+ }
@@ -0,0 +1,14 @@
1
+ import { type IEventsBridge } from "../../common/events/IEventsBridge";
2
+ import { type CCMPEventsManager } from "./CCMPEventsManager";
3
+ /**
4
+ * Legacy bridge slot for CCMP raw events.
5
+ *
6
+ * Player lifecycle and stream events are handled by `CCMPPlayersManager`,
7
+ * because it can resolve every native `ccmp.players.Player` into the stable
8
+ * Rock-Mod `CCMPPlayer` instance before emitting internal `rm::*` events.
9
+ */
10
+ export declare class CCMPEventsBridge implements IEventsBridge {
11
+ constructor(events: CCMPEventsManager);
12
+ registerRawEvents(): void;
13
+ registerServerEvents(): void;
14
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Legacy bridge slot for CCMP raw events.
3
+ *
4
+ * Player lifecycle and stream events are handled by `CCMPPlayersManager`,
5
+ * because it can resolve every native `ccmp.players.Player` into the stable
6
+ * Rock-Mod `CCMPPlayer` instance before emitting internal `rm::*` events.
7
+ */
8
+ export class CCMPEventsBridge {
9
+ constructor(events) {
10
+ void events;
11
+ }
12
+ registerRawEvents() {
13
+ // Intentionally empty. See class comment.
14
+ }
15
+ registerServerEvents() {
16
+ // No-op: ранее тут жил handler для cooperation `rm::clientReady`-ответа.
17
+ // Теперь это responsibility `CCMPPlayersManager`.
18
+ }
19
+ }
@@ -0,0 +1,72 @@
1
+ import { type IEventsManager } from "../../common/events/IEventsManager";
2
+ import { type IClientInternalEvents } from "../../common/events/types";
3
+ import { type IClientToServerEvents, type IServerToClientEvents } from "../../../../shared/net/common/events/types";
4
+ /**
5
+ * Реализация `IEventsManager` поверх нативного CCMP клиента.
6
+ *
7
+ * Важные особенности CCMP, продиктовавшие дизайн:
8
+ *
9
+ * 1. У `ccmp.on(name, cb)` **нет** парного `ccmp.off`. Поэтому unsubscribe
10
+ * реализован через собственный реестр: на каждое имя регистрируется ровно
11
+ * один диспетчер в `ccmp`, который проходит по нашему `Set` подписчиков.
12
+ * `off` лишь удаляет колбэк из `Set`, диспетчер на стороне CCMP остаётся
13
+ * висеть (становится no-op).
14
+ *
15
+ * 2. `ccmp.emitServer(event, data)` принимает **одно** значение `data`. Наш
16
+ * контракт `emitServer(name, ...args)` — variadic. Чтобы не терять
17
+ * позиционные аргументы, всегда отправляем `args` массивом, а на приёме
18
+ * разворачиваем обратно. Это совпадает с тем, как сервер уже шлёт клиенту
19
+ * (`ccmpPlayer.emit(name, args)` в `CCMPEventsManager` на сервере).
20
+ *
21
+ * 3. Локальной in-process шины событий (аналог `mp.events.call`) у CCMP нет —
22
+ * под `emitInternal` подкладываем `CCMPInProcessEmitter`. Однако `onInternal`
23
+ * дополнительно подписывает handler ещё и на нативный `ccmp.on(name, ...)`,
24
+ * потому что геймод использует `events.onInternal` как канал для UI-ingress
25
+ * (см. `rock-mod-event-emitter.adapter.ts:61-66` в геймоде: `registerUI()`
26
+ * делегирует в `events.onInternal`). Под RageMP такого дубля не нужно,
27
+ * потому что `mp.events.add` естественно ловит и `mp.events.call`, и
28
+ * CEF-выпуски `mp.trigger`. Побочный эффект: server/system события с тем
29
+ * же именем тоже долетят до internal-handler'а — на практике конфликтов
30
+ * нет, потому что namespace'ы геймода различаются (`rm::*` server,
31
+ * `api:*` UI, `player:*`/`vehicle:*`/etc. internal).
32
+ *
33
+ * 4. `IClientEvents` (для `onRaw`/`offRaw`) — RageMP-specific глобальный
34
+ * тип. Под CCMP осмысленно регистрировать `ccmp.on('playerConnected', ...)`
35
+ * и другие билтины, но строго типизировать их через `IClientEvents` нельзя
36
+ * — используем `@ts-expect-error` по аналогии с серверным `CCMPEventsManager`.
37
+ */
38
+ export declare class CCMPEventsManager implements IEventsManager {
39
+ /** Реестр всех серверных/raw/generic подписчиков. */
40
+ private readonly _externalListeners;
41
+ /** Имена, для которых уже зарегистрирован диспетчер в нативном `ccmp`. */
42
+ private readonly _dispatched;
43
+ /** Локальная in-process шина — питает `onInternal`/`emitInternal`. */
44
+ private readonly _internalEmitter;
45
+ onRaw(events: Partial<IClientEvents>): void;
46
+ offRaw<K extends keyof IClientEvents>(eventName: K, listener?: IClientEvents[K]): void;
47
+ onInternal(events: Partial<IClientInternalEvents>): void;
48
+ offInternal<K extends keyof IClientInternalEvents>(eventName: K, listener?: IClientInternalEvents[K]): void;
49
+ emitInternal<K extends keyof IClientInternalEvents>(eventName: K, ...args: Parameters<IClientInternalEvents[K]>): void;
50
+ /**
51
+ * Sticky-вариант `emitInternal`. Кэширует последнее значение, чтобы поздние
52
+ * подписчики (`onInternal`) получили его сразу при подписке. Использовать
53
+ * для one-shot lifecycle-событий (`rm::playerReady` и т.п.), где гонка между
54
+ * "событие случилось" и "подписчик зарегистрирован" критична.
55
+ *
56
+ * См. `CCMPInProcessEmitter.emitSticky` для подробностей семантики.
57
+ */
58
+ emitInternalSticky<K extends keyof IClientInternalEvents>(eventName: K, ...args: Parameters<IClientInternalEvents[K]>): void;
59
+ /**
60
+ * Очищает sticky-кэш для конкретного internal-события. Использовать на
61
+ * disconnect/reset чтобы новые подписчики не получали устаревший local-
62
+ * player-stub после реконнекта.
63
+ */
64
+ clearInternalSticky<K extends keyof IClientInternalEvents>(eventName: K): void;
65
+ onServer(events: Partial<IServerToClientEvents>): void;
66
+ offServer<K extends keyof IServerToClientEvents>(eventName: K, listener?: IServerToClientEvents[K]): void;
67
+ emitServer<K extends keyof IClientToServerEvents>(eventName: K, ...args: Parameters<IClientToServerEvents[K]>): void;
68
+ register(event: string, listener: (...args: unknown[]) => void): void;
69
+ unregister(event: string): void;
70
+ private _registerExternal;
71
+ private _unregisterExternal;
72
+ }
@@ -0,0 +1,177 @@
1
+ import { CCMPInProcessEmitter } from "./CCMPInProcessEmitter";
2
+ /**
3
+ * Реализация `IEventsManager` поверх нативного CCMP клиента.
4
+ *
5
+ * Важные особенности CCMP, продиктовавшие дизайн:
6
+ *
7
+ * 1. У `ccmp.on(name, cb)` **нет** парного `ccmp.off`. Поэтому unsubscribe
8
+ * реализован через собственный реестр: на каждое имя регистрируется ровно
9
+ * один диспетчер в `ccmp`, который проходит по нашему `Set` подписчиков.
10
+ * `off` лишь удаляет колбэк из `Set`, диспетчер на стороне CCMP остаётся
11
+ * висеть (становится no-op).
12
+ *
13
+ * 2. `ccmp.emitServer(event, data)` принимает **одно** значение `data`. Наш
14
+ * контракт `emitServer(name, ...args)` — variadic. Чтобы не терять
15
+ * позиционные аргументы, всегда отправляем `args` массивом, а на приёме
16
+ * разворачиваем обратно. Это совпадает с тем, как сервер уже шлёт клиенту
17
+ * (`ccmpPlayer.emit(name, args)` в `CCMPEventsManager` на сервере).
18
+ *
19
+ * 3. Локальной in-process шины событий (аналог `mp.events.call`) у CCMP нет —
20
+ * под `emitInternal` подкладываем `CCMPInProcessEmitter`. Однако `onInternal`
21
+ * дополнительно подписывает handler ещё и на нативный `ccmp.on(name, ...)`,
22
+ * потому что геймод использует `events.onInternal` как канал для UI-ingress
23
+ * (см. `rock-mod-event-emitter.adapter.ts:61-66` в геймоде: `registerUI()`
24
+ * делегирует в `events.onInternal`). Под RageMP такого дубля не нужно,
25
+ * потому что `mp.events.add` естественно ловит и `mp.events.call`, и
26
+ * CEF-выпуски `mp.trigger`. Побочный эффект: server/system события с тем
27
+ * же именем тоже долетят до internal-handler'а — на практике конфликтов
28
+ * нет, потому что namespace'ы геймода различаются (`rm::*` server,
29
+ * `api:*` UI, `player:*`/`vehicle:*`/etc. internal).
30
+ *
31
+ * 4. `IClientEvents` (для `onRaw`/`offRaw`) — RageMP-specific глобальный
32
+ * тип. Под CCMP осмысленно регистрировать `ccmp.on('playerConnected', ...)`
33
+ * и другие билтины, но строго типизировать их через `IClientEvents` нельзя
34
+ * — используем `@ts-expect-error` по аналогии с серверным `CCMPEventsManager`.
35
+ */
36
+ export class CCMPEventsManager {
37
+ constructor() {
38
+ /** Реестр всех серверных/raw/generic подписчиков. */
39
+ this._externalListeners = new Map();
40
+ /** Имена, для которых уже зарегистрирован диспетчер в нативном `ccmp`. */
41
+ this._dispatched = new Set();
42
+ /** Локальная in-process шина — питает `onInternal`/`emitInternal`. */
43
+ this._internalEmitter = new CCMPInProcessEmitter();
44
+ }
45
+ // -- Raw (CCMP builtin) ---------------------------------------------------
46
+ onRaw(events) {
47
+ // IClientEvents is RageMP-specific; под CCMP принимаем тот же call-shape,
48
+ // но привязываем через свой реестр диспетчеров.
49
+ for (const eventName of Object.keys(events)) {
50
+ const handler = events[eventName];
51
+ if (!handler) {
52
+ continue;
53
+ }
54
+ this._registerExternal(eventName, handler);
55
+ }
56
+ }
57
+ offRaw(eventName, listener) {
58
+ this._unregisterExternal(eventName, listener);
59
+ }
60
+ // -- Internal (in-process) ------------------------------------------------
61
+ onInternal(events) {
62
+ for (const eventName of Object.keys(events)) {
63
+ const handler = events[eventName];
64
+ if (!handler) {
65
+ continue;
66
+ }
67
+ // 1) Локальная in-process шина — питает `emitInternal` от client-кода.
68
+ this._internalEmitter.on(eventName, handler);
69
+ // 2) UI ingress. Геймод-адаптер `registerUI()` маппит UI-events через
70
+ // `events.onInternal`. Под CCMP UI шлёт `window.ccmp.emitClient(name, payload)`,
71
+ // которое приходит на клиент через `ccmp.on(name, handler)`. Подписываем
72
+ // тот же handler на нативный канал через общий `_registerExternal`-реестр
73
+ // (он управляет single-dispatcher'ом и Array.isArray-unwrap'ом).
74
+ this._registerExternal(eventName, handler);
75
+ }
76
+ }
77
+ offInternal(eventName, listener) {
78
+ this._internalEmitter.off(eventName, listener);
79
+ this._unregisterExternal(eventName, listener);
80
+ }
81
+ emitInternal(eventName, ...args) {
82
+ this._internalEmitter.emit(eventName, ...args);
83
+ }
84
+ /**
85
+ * Sticky-вариант `emitInternal`. Кэширует последнее значение, чтобы поздние
86
+ * подписчики (`onInternal`) получили его сразу при подписке. Использовать
87
+ * для one-shot lifecycle-событий (`rm::playerReady` и т.п.), где гонка между
88
+ * "событие случилось" и "подписчик зарегистрирован" критична.
89
+ *
90
+ * См. `CCMPInProcessEmitter.emitSticky` для подробностей семантики.
91
+ */
92
+ emitInternalSticky(eventName, ...args) {
93
+ this._internalEmitter.emitSticky(eventName, ...args);
94
+ }
95
+ /**
96
+ * Очищает sticky-кэш для конкретного internal-события. Использовать на
97
+ * disconnect/reset чтобы новые подписчики не получали устаревший local-
98
+ * player-stub после реконнекта.
99
+ */
100
+ clearInternalSticky(eventName) {
101
+ this._internalEmitter.clearSticky(eventName);
102
+ }
103
+ // -- Server <-> Client ----------------------------------------------------
104
+ onServer(events) {
105
+ for (const eventName of Object.keys(events)) {
106
+ const handler = events[eventName];
107
+ if (!handler) {
108
+ continue;
109
+ }
110
+ this._registerExternal(eventName, handler);
111
+ }
112
+ }
113
+ offServer(eventName, listener) {
114
+ this._unregisterExternal(eventName, listener);
115
+ }
116
+ emitServer(eventName, ...args) {
117
+ // Заворачиваем variadic args в массив — соответствует контракту приёма
118
+ // на сервере (`CCMPEventsManager.onClient` разворачивает обратно).
119
+ ccmp.emitServer(eventName, args);
120
+ }
121
+ // -- Generic escape hatch -------------------------------------------------
122
+ register(event, listener) {
123
+ this._internalEmitter.on(event, listener);
124
+ this._registerExternal(event, listener);
125
+ }
126
+ unregister(event) {
127
+ this._internalEmitter.off(event);
128
+ this._unregisterExternal(event);
129
+ }
130
+ // -- Implementation details -----------------------------------------------
131
+ _registerExternal(event, listener) {
132
+ let bucket = this._externalListeners.get(event);
133
+ if (!bucket) {
134
+ bucket = new Set();
135
+ this._externalListeners.set(event, bucket);
136
+ }
137
+ bucket.add(listener);
138
+ if (!this._dispatched.has(event)) {
139
+ this._dispatched.add(event);
140
+ ccmp.on(event, (payload) => {
141
+ const handlers = this._externalListeners.get(event);
142
+ if (!handlers || handlers.size === 0) {
143
+ return;
144
+ }
145
+ // Сервер заворачивает variadic args в массив через
146
+ // `ccmpPlayer.emit(name, args)`. Однопараметрические/нативные события
147
+ // (билтины CCMP типа `playerConnected`) приходят как один объект —
148
+ // их прокидываем как единственный аргумент.
149
+ const args = Array.isArray(payload) ? payload : [payload];
150
+ for (const handler of [...handlers]) {
151
+ try {
152
+ handler(...args);
153
+ }
154
+ catch (error) {
155
+ console.error(`[CCMPEventsManager] handler "${event}" failed:`, error);
156
+ }
157
+ }
158
+ });
159
+ }
160
+ }
161
+ _unregisterExternal(event, listener) {
162
+ const bucket = this._externalListeners.get(event);
163
+ if (!bucket) {
164
+ return;
165
+ }
166
+ if (listener) {
167
+ bucket.delete(listener);
168
+ if (bucket.size === 0) {
169
+ this._externalListeners.delete(event);
170
+ }
171
+ return;
172
+ }
173
+ this._externalListeners.delete(event);
174
+ // Нативный `ccmp.on`-диспетчер остаётся висеть — у CCMP нет `off`.
175
+ // Когда в реестре пусто, он просто ничего не делает.
176
+ }
177
+ }
@@ -0,0 +1,45 @@
1
+ type Listener = (...args: unknown[]) => void;
2
+ /**
3
+ * Тонкий внутренний event bus.
4
+ *
5
+ * RageMP даёт `mp.events.call(name, ...args)` для локальной шины поверх своего
6
+ * движка событий. У CCMP нативной внутренней шины нет — её роль выполняет этот
7
+ * класс. Используется только из `CCMPEventsManager` для `onInternal` /
8
+ * `offInternal` / `emitInternal` и из `CCMPEventsBridge` для синтезированных
9
+ * `rm::*` событий.
10
+ *
11
+ * Поддерживает "sticky" events (см. `emitSticky`) для one-shot lifecycle-
12
+ * сигналов (например `rm::playerReady`), которые могут эмититься до того,
13
+ * как поздние подписчики из DI-цепочки геймода успели зарегистрироваться.
14
+ * Sticky-кэш гарантирует, что любой `on()`-вызов после `emitSticky` получит
15
+ * последнее значение synchronously.
16
+ */
17
+ export declare class CCMPInProcessEmitter {
18
+ private readonly _listeners;
19
+ /** Кэш аргументов для sticky-events. См. `emitSticky` / `on`. */
20
+ private readonly _stickyCache;
21
+ on(event: string, listener: Listener): void;
22
+ off(event: string, listener?: Listener): void;
23
+ emit(event: string, ...args: unknown[]): void;
24
+ /**
25
+ * Как `emit`, но дополнительно кэширует args, чтобы любой будущий
26
+ * `on(event, listener)` сразу получил воспроизведение последнего значения.
27
+ *
28
+ * Использовать только для one-shot lifecycle-событий (`rm::playerReady` и
29
+ * т.п.), где "позднее" подписавшийся обработчик всё равно должен получить
30
+ * сигнал. Для регулярных событий (`rm::playerConnected` на каждого нового
31
+ * игрока) sticky-кэш приведёт к нежелательному поведению — используйте
32
+ * обычный `emit`.
33
+ *
34
+ * Кэш переписывается на каждый последующий вызов с тем же event'ом, так
35
+ * что подписчики получат последнее значение, не цепочку историй.
36
+ */
37
+ emitSticky(event: string, ...args: unknown[]): void;
38
+ /**
39
+ * Удаляет sticky-кэш для события. Полезно на disconnect/reset, чтобы
40
+ * новые подписчики не получили устаревший local-player-stub.
41
+ */
42
+ clearSticky(event: string): void;
43
+ private _callListener;
44
+ }
45
+ export {};