rock-mod 0.20.0 → 0.21.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.
- package/dist/client/RockMod.d.ts +1 -1
- package/dist/client/RockMod.js +4 -0
- package/dist/client/entities/ccmp/camera/CCMPCamera.d.ts +24 -0
- package/dist/client/entities/ccmp/camera/CCMPCamera.js +58 -0
- package/dist/client/entities/ccmp/camera/CCMPCameraManager.d.ts +16 -0
- package/dist/client/entities/ccmp/camera/CCMPCameraManager.js +50 -0
- package/dist/client/entities/ccmp/ped/CCMPPed.d.ts +65 -0
- package/dist/client/entities/ccmp/ped/CCMPPed.js +185 -0
- package/dist/client/entities/ccmp/ped/CCMPPedsManager.d.ts +20 -0
- package/dist/client/entities/ccmp/ped/CCMPPedsManager.js +105 -0
- package/dist/client/entities/ccmp/player/CCMPPlayer.d.ts +112 -0
- package/dist/client/entities/ccmp/player/CCMPPlayer.js +332 -0
- package/dist/client/entities/ccmp/player/CCMPPlayersManager.d.ts +84 -0
- package/dist/client/entities/ccmp/player/CCMPPlayersManager.js +318 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +64 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.js +105 -0
- package/dist/client/entities/common/entity/IEntity.d.ts +3 -0
- package/dist/client/entities/ragemp/entity/RageEntity.d.ts +3 -0
- package/dist/client/entities/ragemp/entity/RageEntity.js +11 -0
- package/dist/client/factories/ccmp/CCMPManagersFactory.d.ts +46 -0
- package/dist/client/factories/ccmp/CCMPManagersFactory.js +149 -0
- package/dist/client/factories/ccmp/createNotImplementedProxy.d.ts +1 -0
- package/dist/client/factories/ccmp/createNotImplementedProxy.js +24 -0
- package/dist/client/game/ccmp/browser/CCMPBrowserManager.d.ts +22 -0
- package/dist/client/game/ccmp/browser/CCMPBrowserManager.js +66 -0
- package/dist/client/game/ccmp/chat/CCMPChatManager.d.ts +26 -0
- package/dist/client/game/ccmp/chat/CCMPChatManager.js +41 -0
- package/dist/client/game/ccmp/controls/CCMPControlsManager.d.ts +33 -0
- package/dist/client/game/ccmp/controls/CCMPControlsManager.js +47 -0
- package/dist/client/game/ccmp/cursor/CCMPCursorManager.d.ts +6 -0
- package/dist/client/game/ccmp/cursor/CCMPCursorManager.js +15 -0
- package/dist/client/game/ccmp/gameplay/CCMPGameplayManager.d.ts +6 -0
- package/dist/client/game/ccmp/gameplay/CCMPGameplayManager.js +10 -0
- package/dist/client/game/ccmp/graphics/CCMPGraphicsManager.d.ts +58 -0
- package/dist/client/game/ccmp/graphics/CCMPGraphicsManager.js +112 -0
- package/dist/client/game/ccmp/gui/CCMPGuiManager.d.ts +5 -0
- package/dist/client/game/ccmp/gui/CCMPGuiManager.js +17 -0
- package/dist/client/game/ccmp/keys/CCMPKeysManager.d.ts +41 -0
- package/dist/client/game/ccmp/keys/CCMPKeysManager.js +94 -0
- package/dist/client/game/ccmp/nametags/CCMPNametagsManager.d.ts +4 -0
- package/dist/client/game/ccmp/nametags/CCMPNametagsManager.js +6 -0
- package/dist/client/game/ccmp/native/CCMPNativeCallerManager.d.ts +74 -0
- package/dist/client/game/ccmp/native/CCMPNativeCallerManager.js +129 -0
- package/dist/client/game/ccmp/native/_generated/nativeDispatch.d.ts +5 -0
- package/dist/client/game/ccmp/native/_generated/nativeDispatch.js +8123 -0
- package/dist/client/game/ccmp/object/CCMPGameObjectManager.d.ts +4 -0
- package/dist/client/game/ccmp/object/CCMPGameObjectManager.js +6 -0
- package/dist/client/game/ccmp/pathfind/CCMPPathfindManager.d.ts +26 -0
- package/dist/client/game/ccmp/pathfind/CCMPPathfindManager.js +31 -0
- package/dist/client/game/ccmp/raycasting/CCMPRaycastingManager.d.ts +10 -0
- package/dist/client/game/ccmp/raycasting/CCMPRaycastingManager.js +46 -0
- package/dist/client/game/ccmp/storage/CCMPStorageManager.d.ts +25 -0
- package/dist/client/game/ccmp/storage/CCMPStorageManager.js +46 -0
- package/dist/client/game/ccmp/streaming/CCMPStreamingManager.d.ts +17 -0
- package/dist/client/game/ccmp/streaming/CCMPStreamingManager.js +41 -0
- package/dist/client/game/ccmp/ui/CCMPUiManager.d.ts +41 -0
- package/dist/client/game/ccmp/ui/CCMPUiManager.js +69 -0
- package/dist/client/game/ccmp/zone/CCMPZoneManager.d.ts +19 -0
- package/dist/client/game/ccmp/zone/CCMPZoneManager.js +20 -0
- package/dist/client/game/common/browser/IBrowserManager.d.ts +7 -0
- package/dist/client/game/common/chat/IChatManager.d.ts +1 -0
- package/dist/client/game/common/controls/IControlsManager.d.ts +3 -0
- package/dist/client/game/common/graphics/IGraphicsManager.d.ts +17 -0
- package/dist/client/game/common/streaming/IStreamingManager.d.ts +2 -0
- package/dist/client/game/ragemp/browser/RageBrowserManager.d.ts +2 -1
- package/dist/client/game/ragemp/browser/RageBrowserManager.js +30 -1
- package/dist/client/game/ragemp/chat/RageChatManager.d.ts +1 -0
- package/dist/client/game/ragemp/chat/RageChatManager.js +3 -0
- package/dist/client/game/ragemp/controls/RageControlsManager.d.ts +3 -0
- package/dist/client/game/ragemp/controls/RageControlsManager.js +9 -0
- package/dist/client/game/ragemp/graphics/RageGraphicsManager.d.ts +5 -1
- package/dist/client/game/ragemp/graphics/RageGraphicsManager.js +12 -0
- package/dist/client/game/ragemp/streaming/RageStreamingManager.d.ts +2 -0
- package/dist/client/game/ragemp/streaming/RageStreamingManager.js +6 -0
- package/dist/client/net/ccmp/CCMPConsoleForwarder.d.ts +11 -0
- package/dist/client/net/ccmp/CCMPConsoleForwarder.js +153 -0
- package/dist/client/net/ccmp/CCMPNetManager.d.ts +23 -0
- package/dist/client/net/ccmp/CCMPNetManager.js +55 -0
- package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.d.ts +23 -0
- package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.js +43 -0
- package/dist/client/net/ccmp/events/CCMPEventsBridge.d.ts +14 -0
- package/dist/client/net/ccmp/events/CCMPEventsBridge.js +19 -0
- package/dist/client/net/ccmp/events/CCMPEventsManager.d.ts +72 -0
- package/dist/client/net/ccmp/events/CCMPEventsManager.js +177 -0
- package/dist/client/net/ccmp/events/CCMPInProcessEmitter.d.ts +45 -0
- package/dist/client/net/ccmp/events/CCMPInProcessEmitter.js +133 -0
- package/dist/client/net/ccmp/events/CCMPRenderTicker.d.ts +18 -0
- package/dist/client/net/ccmp/events/CCMPRenderTicker.js +74 -0
- package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.d.ts +24 -0
- package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.js +35 -0
- package/dist/client/net/ccmp/rpc/CCMPRPCManager.d.ts +22 -0
- package/dist/client/net/ccmp/rpc/CCMPRPCManager.js +31 -0
- package/dist/client/net/common/events/types.d.ts +3 -1
- package/dist/client/net/common/events/types.js +1 -0
- package/dist/client/utils/ccmp/CCMPUtilsManager.d.ts +18 -0
- package/dist/client/utils/ccmp/CCMPUtilsManager.js +20 -0
- package/dist/server/RockMod.d.ts +1 -1
- package/dist/server/RockMod.js +4 -0
- package/dist/server/entities/ccmp/baseObject/CCMPBaseObject.d.ts +8 -0
- package/dist/server/entities/ccmp/baseObject/CCMPBaseObject.js +21 -0
- package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsIterator.d.ts +8 -0
- package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsIterator.js +16 -0
- package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsManager.d.ts +19 -0
- package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsManager.js +49 -0
- package/dist/server/entities/ccmp/blip/CCMPBlip.d.ts +34 -0
- package/dist/server/entities/ccmp/blip/CCMPBlip.js +80 -0
- package/dist/server/entities/ccmp/blip/CCMPBlipsManager.d.ts +9 -0
- package/dist/server/entities/ccmp/blip/CCMPBlipsManager.js +33 -0
- package/dist/server/entities/ccmp/colshape/CCMPCircleColshape.d.ts +7 -0
- package/dist/server/entities/ccmp/colshape/CCMPCircleColshape.js +10 -0
- package/dist/server/entities/ccmp/colshape/CCMPColshape.d.ts +23 -0
- package/dist/server/entities/ccmp/colshape/CCMPColshape.js +47 -0
- package/dist/server/entities/ccmp/colshape/CCMPColshapesManager.d.ts +28 -0
- package/dist/server/entities/ccmp/colshape/CCMPColshapesManager.js +108 -0
- package/dist/server/entities/ccmp/colshape/CCMPCuboidColshape.d.ts +7 -0
- package/dist/server/entities/ccmp/colshape/CCMPCuboidColshape.js +10 -0
- package/dist/server/entities/ccmp/colshape/CCMPCylinderColshape.d.ts +7 -0
- package/dist/server/entities/ccmp/colshape/CCMPCylinderColshape.js +10 -0
- package/dist/server/entities/ccmp/colshape/CCMPRectangleColshape.d.ts +7 -0
- package/dist/server/entities/ccmp/colshape/CCMPRectangleColshape.js +10 -0
- package/dist/server/entities/ccmp/colshape/CCMPSphereColshape.d.ts +7 -0
- package/dist/server/entities/ccmp/colshape/CCMPSphereColshape.js +10 -0
- package/dist/server/entities/ccmp/entity/CCMPEntitiesManager.d.ts +8 -0
- package/dist/server/entities/ccmp/entity/CCMPEntitiesManager.js +10 -0
- package/dist/server/entities/ccmp/entity/CCMPEntity.d.ts +13 -0
- package/dist/server/entities/ccmp/entity/CCMPEntity.js +28 -0
- package/dist/server/entities/ccmp/marker/CCMPMarker.d.ts +32 -0
- package/dist/server/entities/ccmp/marker/CCMPMarker.js +79 -0
- package/dist/server/entities/ccmp/marker/CCMPMarkersManager.d.ts +9 -0
- package/dist/server/entities/ccmp/marker/CCMPMarkersManager.js +30 -0
- package/dist/server/entities/ccmp/object/CCMPObject.d.ts +48 -0
- package/dist/server/entities/ccmp/object/CCMPObject.js +70 -0
- package/dist/server/entities/ccmp/object/CCMPObjectsManager.d.ts +9 -0
- package/dist/server/entities/ccmp/object/CCMPObjectsManager.js +28 -0
- package/dist/server/entities/ccmp/ped/CCMPPed.d.ts +33 -0
- package/dist/server/entities/ccmp/ped/CCMPPed.js +82 -0
- package/dist/server/entities/ccmp/ped/CCMPPedsManager.d.ts +9 -0
- package/dist/server/entities/ccmp/ped/CCMPPedsManager.js +28 -0
- package/dist/server/entities/ccmp/player/CCMPPlayer.d.ts +65 -0
- package/dist/server/entities/ccmp/player/CCMPPlayer.js +180 -0
- package/dist/server/entities/ccmp/player/CCMPPlayersManager.d.ts +12 -0
- package/dist/server/entities/ccmp/player/CCMPPlayersManager.js +66 -0
- package/dist/server/entities/ccmp/vehicle/CCMPVehicle.d.ts +58 -0
- package/dist/server/entities/ccmp/vehicle/CCMPVehicle.js +161 -0
- package/dist/server/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +9 -0
- package/dist/server/entities/ccmp/vehicle/CCMPVehiclesManager.js +31 -0
- package/dist/server/entities/ccmp/worldObject/CCMPWorldObject.d.ts +9 -0
- package/dist/server/entities/ccmp/worldObject/CCMPWorldObject.js +7 -0
- package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsIterator.d.ts +10 -0
- package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsIterator.js +40 -0
- package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsManager.d.ts +11 -0
- package/dist/server/entities/ccmp/worldObject/CCMPWorldObjectsManager.js +16 -0
- package/dist/server/entities/mock/player/MockPlayersManager.js +2 -1
- package/dist/server/factories/ccmp/CCMPManagersFactory.d.ts +23 -0
- package/dist/server/factories/ccmp/CCMPManagersFactory.js +46 -0
- package/dist/server/net/ccmp/CCMPNetManager.d.ts +19 -0
- package/dist/server/net/ccmp/CCMPNetManager.js +112 -0
- package/dist/server/net/ccmp/events/CCMPEventsManager.d.ts +17 -0
- package/dist/server/net/ccmp/events/CCMPEventsManager.js +54 -0
- package/dist/server/net/ccmp/rpc/CCMPRPCManager.d.ts +8 -0
- package/dist/server/net/ccmp/rpc/CCMPRPCManager.js +18 -0
- package/dist/server/net/common/events/types.d.ts +2 -0
- package/dist/server/net/common/events/types.js +1 -0
- package/dist/server/utils/ccmp/CCMPUtilsManager.d.ts +4 -0
- package/dist/server/utils/ccmp/CCMPUtilsManager.js +9 -0
- package/dist/server/world/ccmp/CCMPWorldManager.d.ts +10 -0
- package/dist/server/world/ccmp/CCMPWorldManager.js +24 -0
- package/package.json +3 -1
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { ClientInternalEventName } from "../../../net/common/events/types";
|
|
2
|
+
import { CCMPPlayer } from "./CCMPPlayer";
|
|
3
|
+
/**
|
|
4
|
+
* Реализация `IPlayersManager` под CCMP — single source of truth для
|
|
5
|
+
* `IPlayer`-инстансов и `rm::playerReady`/`rm::playerConnected`-эмиссий
|
|
6
|
+
* с настоящими `CCMPPlayer`-инстансами.
|
|
7
|
+
*
|
|
8
|
+
* ### Хранилище
|
|
9
|
+
*
|
|
10
|
+
* `Map<id, CCMPPlayer>`. У CCMP нет отдельных `id`/`remoteId` как в RageMP:
|
|
11
|
+
* один числовой `id` приходит от сервера, и он же используется везде.
|
|
12
|
+
* `findByID`/`findByRemoteID`/`findByRemoteId` маппятся на один lookup.
|
|
13
|
+
*
|
|
14
|
+
* ### Жизненный цикл local player'а
|
|
15
|
+
*
|
|
16
|
+
* `ccmp.players.local` (backed by `op_get_local_player_id`) валиден сразу
|
|
17
|
+
* после handshake'а — `PlayerManager::set_local_player_id` срабатывает до
|
|
18
|
+
* того, как scripts загружаются. Мы используем его, чтобы синхронно
|
|
19
|
+
* выпустить `rm::playerReady` как sticky-event (см. ниже):
|
|
20
|
+
*
|
|
21
|
+
* 1. **На конструкторе** — fast-path. Если local op возвращает игрока,
|
|
22
|
+
* эмитим `rm::playerReady` через `emitInternalSticky` с реальным
|
|
23
|
+
* `CCMPPlayer`-инстансом. Sticky-кэш гарантирует, что поздние
|
|
24
|
+
* подписчики из async DI-bootstrap'а геймода тоже получат сигнал
|
|
25
|
+
* при подписке.
|
|
26
|
+
* 2. **На `connectionStateChanged`** — fallback / handler реконнекта.
|
|
27
|
+
* Если на конструкторе local ещё не был валиден (handshake race),
|
|
28
|
+
* `connected = true` запустит retry fast-path. На `connected = false`
|
|
29
|
+
* чистим _localPlayer и sticky-кэш, чтобы при следующем connect'е
|
|
30
|
+
* эмитнуть с актуальным remoteId.
|
|
31
|
+
*
|
|
32
|
+
* `CCMPPlayer`-инстанс важен (а не структурный stub) потому что
|
|
33
|
+
* `RockModStateAdapter` в геймоде хранит `rockModPlayer`-ссылку и через
|
|
34
|
+
* неё вызывает методы (`setNoCollision`, etc). На структурном stub'е
|
|
35
|
+
* без методов это падало бы с `TypeError`.
|
|
36
|
+
*
|
|
37
|
+
* ### Remote-игроки
|
|
38
|
+
*
|
|
39
|
+
* Источники:
|
|
40
|
+
* - `ccmp.players.all` — prepopulation для уже-существующих на момент
|
|
41
|
+
* подключения (заполнен Rust'ом в `ClientScriptingService::init`).
|
|
42
|
+
* - `rm::playerConnected`/`rm::playerDisconnected` internal events
|
|
43
|
+
* (эмитит `CCMPEventsBridge` из нативных `ccmp.on('playerConnected'/...)`).
|
|
44
|
+
*/
|
|
45
|
+
export class CCMPPlayersManager {
|
|
46
|
+
constructor(events) {
|
|
47
|
+
var _a;
|
|
48
|
+
this._players = new Map();
|
|
49
|
+
this._localPlayer = null;
|
|
50
|
+
// Iterator реализован inline — у CCMP нет per-dimension/per-range
|
|
51
|
+
// фильтрации игроков на JS-уровне.
|
|
52
|
+
this._iterator = {
|
|
53
|
+
all: () => this._players.values(),
|
|
54
|
+
dimension: (value) => this._iterateDimension(value),
|
|
55
|
+
range2D: (center, range) => this._iterateRange2D(center, range),
|
|
56
|
+
range3D: (center, range) => this._iterateRange3D(center, range),
|
|
57
|
+
};
|
|
58
|
+
this._events = events;
|
|
59
|
+
// 1) Subscribe ПЕРВЫМ — чтобы между подпиской и prepopulation'ом не
|
|
60
|
+
// пропустить параллельный `rm::playerConnected`.
|
|
61
|
+
this._events.onInternal({
|
|
62
|
+
[ClientInternalEventName.PlayerReady]: (player) => {
|
|
63
|
+
// Если кто-то ещё эмитнул rm::playerReady (например, cooperation
|
|
64
|
+
// fallback в будущем) — синхронизируем своё состояние.
|
|
65
|
+
this._ensurePlayer(player.remoteId, player.name, /* isLocal */ true);
|
|
66
|
+
},
|
|
67
|
+
[ClientInternalEventName.PlayerConnected]: (player) => {
|
|
68
|
+
this._ensurePlayer(player.remoteId, player.name, /* isLocal */ false);
|
|
69
|
+
},
|
|
70
|
+
[ClientInternalEventName.PlayerDisconnected]: (player) => {
|
|
71
|
+
const existing = this._players.get(player.remoteId);
|
|
72
|
+
if (existing) {
|
|
73
|
+
existing.markRemoved();
|
|
74
|
+
this._players.delete(player.remoteId);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
this._registerNativePlayerEvents();
|
|
79
|
+
// 2) Prepopulate уже-существующих remote-игроков из CCMP-runtime'а.
|
|
80
|
+
// `ccmp.players.all` исключает local (см. js_runtime.rs::setup_globals).
|
|
81
|
+
try {
|
|
82
|
+
for (const ccmpPlayer of ccmp.players.all) {
|
|
83
|
+
this._ensurePlayer(ccmpPlayer.id, (_a = ccmpPlayer.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ false);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.warn("[CCMPPlayersManager] failed to prepopulate from ccmp.players.all:", error);
|
|
88
|
+
}
|
|
89
|
+
// 3) Fast-path: попытка эмитнуть rm::playerReady сразу. Если local не
|
|
90
|
+
// готов (handshake ещё не отработал) — пропускаем, дальше connectionStateChanged
|
|
91
|
+
// подберёт.
|
|
92
|
+
this._tryEmitLocalPlayerReady();
|
|
93
|
+
// 4) Retry-on-reconnect + reset-on-disconnect. Listener регистрируем
|
|
94
|
+
// через `ccmp.on` напрямую (не через bridge), чтобы наша логика была
|
|
95
|
+
// независимой от состояния других менеджеров.
|
|
96
|
+
ccmp.on("connectionStateChanged", (state) => {
|
|
97
|
+
if (state === null || state === void 0 ? void 0 : state.connected) {
|
|
98
|
+
this._tryEmitLocalPlayerReady();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this._handleDisconnect();
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// -- IPlayersManager ------------------------------------------------------
|
|
106
|
+
findLocalPlayer() {
|
|
107
|
+
// Кэшированный _localPlayer проставлен из rm::playerReady-эмиссии
|
|
108
|
+
// (либо нашей собственной из конструктора, либо чьей-то ещё).
|
|
109
|
+
// Если кэш пуст, lazy-retry: возможно local op теперь валиден.
|
|
110
|
+
if (this._localPlayer) {
|
|
111
|
+
return this._localPlayer;
|
|
112
|
+
}
|
|
113
|
+
this._tryEmitLocalPlayerReady();
|
|
114
|
+
return this._localPlayer;
|
|
115
|
+
}
|
|
116
|
+
getLocalPlayer() {
|
|
117
|
+
const player = this.findLocalPlayer();
|
|
118
|
+
if (!player) {
|
|
119
|
+
throw new Error("CCMPPlayersManager.getLocalPlayer: local player ещё не известен — handshake не завершён");
|
|
120
|
+
}
|
|
121
|
+
return player;
|
|
122
|
+
}
|
|
123
|
+
findByRemoteId(remoteId) {
|
|
124
|
+
var _a;
|
|
125
|
+
return (_a = this._players.get(remoteId)) !== null && _a !== void 0 ? _a : null;
|
|
126
|
+
}
|
|
127
|
+
getByRemoteId(remoteId) {
|
|
128
|
+
const player = this.findByRemoteId(remoteId);
|
|
129
|
+
if (!player) {
|
|
130
|
+
throw new Error(`CCMPPlayersManager.getByRemoteId: player remoteId=${remoteId} не найден`);
|
|
131
|
+
}
|
|
132
|
+
return player;
|
|
133
|
+
}
|
|
134
|
+
findByName(name) {
|
|
135
|
+
for (const player of this._players.values()) {
|
|
136
|
+
if (player.name === name) {
|
|
137
|
+
return player;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
getByName(name) {
|
|
143
|
+
const player = this.findByName(name);
|
|
144
|
+
if (!player) {
|
|
145
|
+
throw new Error(`CCMPPlayersManager.getByName: player name="${name}" не найден`);
|
|
146
|
+
}
|
|
147
|
+
return player;
|
|
148
|
+
}
|
|
149
|
+
// -- IEntitiesManager -----------------------------------------------------
|
|
150
|
+
syncWithMpPool() {
|
|
151
|
+
// RageMP-pool API не существует под CCMP. Игроки управляются событиями
|
|
152
|
+
// `rm::playerConnected`/`rm::playerDisconnected`, prepopulation идёт
|
|
153
|
+
// из `ccmp.players.all` в конструкторе. No-op для соответствия интерфейсу.
|
|
154
|
+
}
|
|
155
|
+
registerById(id) {
|
|
156
|
+
// Под CCMP мы не можем "достать" игрока по id из глобального пула без
|
|
157
|
+
// дополнительных данных (name, isLocal). Возвращаем существующего или
|
|
158
|
+
// создаём минимальный stub. Корректный путь регистрации — через события.
|
|
159
|
+
return this._ensurePlayer(id, /* name */ "", /* isLocal */ false);
|
|
160
|
+
}
|
|
161
|
+
unregisterById(id) {
|
|
162
|
+
return this.deleteById(id);
|
|
163
|
+
}
|
|
164
|
+
// -- IBaseObjectsManager / IWorldObjectsManager ---------------------------
|
|
165
|
+
findByID(id) {
|
|
166
|
+
return this.findByRemoteId(id);
|
|
167
|
+
}
|
|
168
|
+
getByID(id) {
|
|
169
|
+
return this.getByRemoteId(id);
|
|
170
|
+
}
|
|
171
|
+
findByRemoteID(remoteId) {
|
|
172
|
+
return this.findByRemoteId(remoteId);
|
|
173
|
+
}
|
|
174
|
+
getByRemoteID(remoteId) {
|
|
175
|
+
return this.getByRemoteId(remoteId);
|
|
176
|
+
}
|
|
177
|
+
deleteById(id) {
|
|
178
|
+
const player = this.getByRemoteId(id);
|
|
179
|
+
player.markRemoved();
|
|
180
|
+
this._players.delete(id);
|
|
181
|
+
if (this._localPlayer === player) {
|
|
182
|
+
this._localPlayer = null;
|
|
183
|
+
this._events.clearInternalSticky(ClientInternalEventName.PlayerReady);
|
|
184
|
+
}
|
|
185
|
+
return player;
|
|
186
|
+
}
|
|
187
|
+
get iterator() {
|
|
188
|
+
return this._iterator;
|
|
189
|
+
}
|
|
190
|
+
// -- Внутреннее -----------------------------------------------------------
|
|
191
|
+
_registerNativePlayerEvents() {
|
|
192
|
+
ccmp.on("playerConnected", (ccmpPlayer) => {
|
|
193
|
+
var _a;
|
|
194
|
+
const player = this._ensurePlayer(ccmpPlayer.id, (_a = ccmpPlayer.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ false);
|
|
195
|
+
this._events.emitInternal(ClientInternalEventName.PlayerConnected, player);
|
|
196
|
+
});
|
|
197
|
+
ccmp.on("playerDisconnected", (ccmpPlayer) => {
|
|
198
|
+
var _a, _b;
|
|
199
|
+
const player = (_a = this._players.get(ccmpPlayer.id)) !== null && _a !== void 0 ? _a : this._ensurePlayer(ccmpPlayer.id, (_b = ccmpPlayer.name) !== null && _b !== void 0 ? _b : "", /* isLocal */ false);
|
|
200
|
+
player.markRemoved();
|
|
201
|
+
this._players.delete(ccmpPlayer.id);
|
|
202
|
+
if (this._localPlayer === player) {
|
|
203
|
+
this._localPlayer = null;
|
|
204
|
+
this._events.clearInternalSticky(ClientInternalEventName.PlayerReady);
|
|
205
|
+
}
|
|
206
|
+
this._events.emitInternal(ClientInternalEventName.PlayerDisconnected, player);
|
|
207
|
+
});
|
|
208
|
+
ccmp.on("playerStreamIn", (ccmpPlayer) => {
|
|
209
|
+
var _a;
|
|
210
|
+
const player = this._ensurePlayer(ccmpPlayer.id, (_a = ccmpPlayer.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ false);
|
|
211
|
+
this._events.emitInternal(ClientInternalEventName.EntityStreamIn, player);
|
|
212
|
+
});
|
|
213
|
+
ccmp.on("playerStreamOut", (ccmpPlayer) => {
|
|
214
|
+
var _a, _b;
|
|
215
|
+
const player = (_a = this._players.get(ccmpPlayer.id)) !== null && _a !== void 0 ? _a : this._ensurePlayer(ccmpPlayer.id, (_b = ccmpPlayer.name) !== null && _b !== void 0 ? _b : "", /* isLocal */ false);
|
|
216
|
+
this._events.emitInternal(ClientInternalEventName.EntityStreamOut, player);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Идемпотентная точка создания/обновления CCMPPlayer. Все источники
|
|
221
|
+
* (events, prepopulation, fast-path) проходят сюда.
|
|
222
|
+
*/
|
|
223
|
+
_ensurePlayer(id, name, isLocal) {
|
|
224
|
+
const existing = this._players.get(id);
|
|
225
|
+
if (existing) {
|
|
226
|
+
if (name) {
|
|
227
|
+
existing.setNameInternal(name);
|
|
228
|
+
}
|
|
229
|
+
if (isLocal && !this._localPlayer) {
|
|
230
|
+
this._localPlayer = existing;
|
|
231
|
+
}
|
|
232
|
+
return existing;
|
|
233
|
+
}
|
|
234
|
+
const player = new CCMPPlayer({
|
|
235
|
+
id,
|
|
236
|
+
name,
|
|
237
|
+
isLocal,
|
|
238
|
+
});
|
|
239
|
+
this._players.set(id, player);
|
|
240
|
+
if (isLocal) {
|
|
241
|
+
this._localPlayer = player;
|
|
242
|
+
}
|
|
243
|
+
return player;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Пытается синхронно достать local player из CCMP, создать CCMPPlayer
|
|
247
|
+
* и эмитнуть rm::playerReady как sticky-event. Идемпотентна: повторный
|
|
248
|
+
* вызов после успешной эмиссии — no-op (`_localPlayer !== null`).
|
|
249
|
+
*/
|
|
250
|
+
_tryEmitLocalPlayerReady() {
|
|
251
|
+
var _a;
|
|
252
|
+
if (this._localPlayer) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
let nativeLocal;
|
|
256
|
+
try {
|
|
257
|
+
nativeLocal = ccmp.players.local;
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
console.warn("[CCMPPlayersManager] ccmp.players.local read failed:", error);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (!nativeLocal) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const localPlayer = this._ensurePlayer(nativeLocal.id, (_a = nativeLocal.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ true);
|
|
267
|
+
// Sticky: поздние подписчики из async DI-bootstrap'а геймода
|
|
268
|
+
// (например `RockModMultiplayerEventsAdapter` из NetworkModule.init)
|
|
269
|
+
// получат событие сразу при подписке.
|
|
270
|
+
this._events.emitInternalSticky(ClientInternalEventName.PlayerReady, localPlayer);
|
|
271
|
+
}
|
|
272
|
+
_handleDisconnect() {
|
|
273
|
+
if (this._localPlayer) {
|
|
274
|
+
this._localPlayer.markRemoved();
|
|
275
|
+
this._players.delete(this._localPlayer.id);
|
|
276
|
+
this._localPlayer = null;
|
|
277
|
+
}
|
|
278
|
+
// Чистим sticky-кэш — иначе новые подписчики после reconnect'а получат
|
|
279
|
+
// устаревший local-player stub с прошлым remoteId.
|
|
280
|
+
this._events.clearInternalSticky(ClientInternalEventName.PlayerReady);
|
|
281
|
+
}
|
|
282
|
+
*_iterateDimension(value) {
|
|
283
|
+
for (const player of this._players.values()) {
|
|
284
|
+
if (player.dimension === value) {
|
|
285
|
+
yield player;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
*_iterateRange2D(center, range) {
|
|
290
|
+
const squaredRange = range * range;
|
|
291
|
+
for (const player of this._players.values()) {
|
|
292
|
+
if (!player.isExists || player.handle === 0) {
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const position = player.position;
|
|
296
|
+
const dx = position.x - center.x;
|
|
297
|
+
const dy = position.y - center.y;
|
|
298
|
+
if (dx * dx + dy * dy <= squaredRange) {
|
|
299
|
+
yield player;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
*_iterateRange3D(center, range) {
|
|
304
|
+
const squaredRange = range * range;
|
|
305
|
+
for (const player of this._players.values()) {
|
|
306
|
+
if (!player.isExists || player.handle === 0) {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const position = player.position;
|
|
310
|
+
const dx = position.x - center.x;
|
|
311
|
+
const dy = position.y - center.y;
|
|
312
|
+
const dz = position.z - center.z;
|
|
313
|
+
if (dx * dx + dy * dy + dz * dz <= squaredRange) {
|
|
314
|
+
yield player;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type IVehicle } from "../../common/vehicle/IVehicle";
|
|
2
|
+
import { type IVehicleCreateOptions, type IVehiclesManager } from "../../common/vehicle/IVehiclesManager";
|
|
3
|
+
import { type IWorldObjectsIterator } from "../../common/worldObject/IWorldObjectsIterator";
|
|
4
|
+
/**
|
|
5
|
+
* Реализация `IVehiclesManager` под CCMP — **пустой пул** + native helper.
|
|
6
|
+
*
|
|
7
|
+
* ### Почему пусто
|
|
8
|
+
*
|
|
9
|
+
* RageMP даёт `mp.vehicles.toArray()`/`mp.vehicles.at(id)` — JS-side pool из
|
|
10
|
+
* stream'нутых-в-радиус транспортных средств, заполняемый рантаймом. CCMP
|
|
11
|
+
* такого пула на client-side не экспонирует:
|
|
12
|
+
* - `ccmp.natives.vehicle.createVehicle` создаёт локальный handle без id /
|
|
13
|
+
* replication / managed lifecycle.
|
|
14
|
+
* - `ccmp.vehicles.*` (server-side) спавнит реплицируемые vehicle-сущности,
|
|
15
|
+
* но клиент видит их данные через game state, а не как managed-IVehicle-
|
|
16
|
+
* инстансы в JS-pool'е.
|
|
17
|
+
*
|
|
18
|
+
* Поэтому iterator всегда пустой, `find*` возвращает null, `get*` и `deleteById` кидают.
|
|
19
|
+
*
|
|
20
|
+
* ### Hot path: `iterator.all()` на каждый render-tick
|
|
21
|
+
*
|
|
22
|
+
* Геймод-консьюмер `VehiclePartsInteractionController.syncVehicleProximity` →
|
|
23
|
+
* `VehiclePartsInteractionService.syncState` → `VehicleService.getNearbyVehicles`
|
|
24
|
+
* → `VehicleRepository.getNearby` → `VehicleRepository.getAll` → `iterator.all()`.
|
|
25
|
+
* До этой реализации `VehiclesManager` был `createNotImplementedProxy`, и каждый
|
|
26
|
+
* frame падал `CCMPVehiclesManager.iterator.all: not implemented yet`. Теперь
|
|
27
|
+
* iterator возвращает пустой итератор — interaction-сервис тихо деградирует
|
|
28
|
+
* (нет vehicles в радиусе → нет UI-хинтов / интеракций).
|
|
29
|
+
*
|
|
30
|
+
* ### `create(...)` под CCMP
|
|
31
|
+
*
|
|
32
|
+
* Не реализован осознанно: `VehicleRepository.create(...)` в геймоде ожидает
|
|
33
|
+
* `IRockModVehicle` с id/remoteId/position/etc, а CCMP-натив `createVehicle`
|
|
34
|
+
* возвращает только handle без id-mapping'а. Для корректной поддержки нужен
|
|
35
|
+
* полноценный `CCMPVehicle`-класс и интеграция с server-side `ccmp.vehicles.*`
|
|
36
|
+
* — отдельная задача. Сейчас бросаем понятную ошибку.
|
|
37
|
+
*
|
|
38
|
+
* ### `getDisplayNameFromVehicleModel`
|
|
39
|
+
*
|
|
40
|
+
* Этот метод **реализован** — натив `getDisplayNameFromVehicleModel`
|
|
41
|
+
* (`0xB215AAC32D25D019`) экспонирован в `ccmp.natives.vehicle.*` и работает
|
|
42
|
+
* без vehicle-pool'а (принимает только modelHash, возвращает GXT-ключ или
|
|
43
|
+
* "CARNOTFOUND" для unknown-моделей).
|
|
44
|
+
*
|
|
45
|
+
* TODO: когда понадобится spawning vehicles из клиента (миссии, тестовые
|
|
46
|
+
* объекты) — реализовать через `ccmp.natives.vehicle.createVehicle` + локальный
|
|
47
|
+
* id-counter + `CCMPVehicle`-обёртку. Для синхронизированных vehicles нужна
|
|
48
|
+
* server-side фабрика с `ccmp.vehicles.create` и net-events для распространения
|
|
49
|
+
* id-mapping'а.
|
|
50
|
+
*/
|
|
51
|
+
export declare class CCMPVehiclesManager implements IVehiclesManager {
|
|
52
|
+
create(options: IVehicleCreateOptions): IVehicle;
|
|
53
|
+
getDisplayNameFromVehicleModel(modelHash: number): string;
|
|
54
|
+
syncWithMpPool(): void;
|
|
55
|
+
registerById(id: number): IVehicle;
|
|
56
|
+
unregisterById(id: number): IVehicle;
|
|
57
|
+
findByID(id: number): IVehicle | null;
|
|
58
|
+
getByID(id: number): IVehicle;
|
|
59
|
+
findByRemoteID(remoteId: number): IVehicle | null;
|
|
60
|
+
getByRemoteID(remoteId: number): IVehicle;
|
|
61
|
+
deleteById(id: number): IVehicle;
|
|
62
|
+
get iterator(): IWorldObjectsIterator<IVehicle>;
|
|
63
|
+
private readonly _iterator;
|
|
64
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/// <reference types="@classic-mp/types/client" />
|
|
2
|
+
const EMPTY_VEHICLES = [];
|
|
3
|
+
/**
|
|
4
|
+
* Реализация `IVehiclesManager` под CCMP — **пустой пул** + native helper.
|
|
5
|
+
*
|
|
6
|
+
* ### Почему пусто
|
|
7
|
+
*
|
|
8
|
+
* RageMP даёт `mp.vehicles.toArray()`/`mp.vehicles.at(id)` — JS-side pool из
|
|
9
|
+
* stream'нутых-в-радиус транспортных средств, заполняемый рантаймом. CCMP
|
|
10
|
+
* такого пула на client-side не экспонирует:
|
|
11
|
+
* - `ccmp.natives.vehicle.createVehicle` создаёт локальный handle без id /
|
|
12
|
+
* replication / managed lifecycle.
|
|
13
|
+
* - `ccmp.vehicles.*` (server-side) спавнит реплицируемые vehicle-сущности,
|
|
14
|
+
* но клиент видит их данные через game state, а не как managed-IVehicle-
|
|
15
|
+
* инстансы в JS-pool'е.
|
|
16
|
+
*
|
|
17
|
+
* Поэтому iterator всегда пустой, `find*` возвращает null, `get*` и `deleteById` кидают.
|
|
18
|
+
*
|
|
19
|
+
* ### Hot path: `iterator.all()` на каждый render-tick
|
|
20
|
+
*
|
|
21
|
+
* Геймод-консьюмер `VehiclePartsInteractionController.syncVehicleProximity` →
|
|
22
|
+
* `VehiclePartsInteractionService.syncState` → `VehicleService.getNearbyVehicles`
|
|
23
|
+
* → `VehicleRepository.getNearby` → `VehicleRepository.getAll` → `iterator.all()`.
|
|
24
|
+
* До этой реализации `VehiclesManager` был `createNotImplementedProxy`, и каждый
|
|
25
|
+
* frame падал `CCMPVehiclesManager.iterator.all: not implemented yet`. Теперь
|
|
26
|
+
* iterator возвращает пустой итератор — interaction-сервис тихо деградирует
|
|
27
|
+
* (нет vehicles в радиусе → нет UI-хинтов / интеракций).
|
|
28
|
+
*
|
|
29
|
+
* ### `create(...)` под CCMP
|
|
30
|
+
*
|
|
31
|
+
* Не реализован осознанно: `VehicleRepository.create(...)` в геймоде ожидает
|
|
32
|
+
* `IRockModVehicle` с id/remoteId/position/etc, а CCMP-натив `createVehicle`
|
|
33
|
+
* возвращает только handle без id-mapping'а. Для корректной поддержки нужен
|
|
34
|
+
* полноценный `CCMPVehicle`-класс и интеграция с server-side `ccmp.vehicles.*`
|
|
35
|
+
* — отдельная задача. Сейчас бросаем понятную ошибку.
|
|
36
|
+
*
|
|
37
|
+
* ### `getDisplayNameFromVehicleModel`
|
|
38
|
+
*
|
|
39
|
+
* Этот метод **реализован** — натив `getDisplayNameFromVehicleModel`
|
|
40
|
+
* (`0xB215AAC32D25D019`) экспонирован в `ccmp.natives.vehicle.*` и работает
|
|
41
|
+
* без vehicle-pool'а (принимает только modelHash, возвращает GXT-ключ или
|
|
42
|
+
* "CARNOTFOUND" для unknown-моделей).
|
|
43
|
+
*
|
|
44
|
+
* TODO: когда понадобится spawning vehicles из клиента (миссии, тестовые
|
|
45
|
+
* объекты) — реализовать через `ccmp.natives.vehicle.createVehicle` + локальный
|
|
46
|
+
* id-counter + `CCMPVehicle`-обёртку. Для синхронизированных vehicles нужна
|
|
47
|
+
* server-side фабрика с `ccmp.vehicles.create` и net-events для распространения
|
|
48
|
+
* id-mapping'а.
|
|
49
|
+
*/
|
|
50
|
+
export class CCMPVehiclesManager {
|
|
51
|
+
constructor() {
|
|
52
|
+
// -- IVehiclesManager -----------------------------------------------------
|
|
53
|
+
// Iterator реализован inline и возвращает пустые итераторы — hot path
|
|
54
|
+
// `VehiclePartsInteractionController.syncVehicleProximity` → `VehicleRepository.getNearby`
|
|
55
|
+
// теперь тихо деградирует вместо падения на каждом render-tick'е.
|
|
56
|
+
this._iterator = {
|
|
57
|
+
all: () => EMPTY_VEHICLES[Symbol.iterator](),
|
|
58
|
+
dimension: () => EMPTY_VEHICLES[Symbol.iterator](),
|
|
59
|
+
range2D: () => EMPTY_VEHICLES[Symbol.iterator](),
|
|
60
|
+
range3D: () => EMPTY_VEHICLES[Symbol.iterator](),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
create(options) {
|
|
64
|
+
void options;
|
|
65
|
+
throw new Error("CCMPVehiclesManager.create: создание vehicles на client-side под CCMP не поддерживается. " +
|
|
66
|
+
"Используйте server-side `ccmp.vehicles.create` (см. server/entities/ccmp/vehicle/*), " +
|
|
67
|
+
"либо вызывайте `ccmp.natives.vehicle.createVehicle` напрямую для локального vehicle-handle.");
|
|
68
|
+
}
|
|
69
|
+
getDisplayNameFromVehicleModel(modelHash) {
|
|
70
|
+
return ccmp.natives.vehicle.getDisplayNameFromVehicleModel(modelHash);
|
|
71
|
+
}
|
|
72
|
+
// -- IEntitiesManager -----------------------------------------------------
|
|
73
|
+
syncWithMpPool() {
|
|
74
|
+
// No-op: client-side vehicle pool под CCMP отсутствует, синхронизировать нечего.
|
|
75
|
+
}
|
|
76
|
+
registerById(id) {
|
|
77
|
+
throw new Error(`CCMPVehiclesManager.registerById(${id}): client-side vehicle pool под CCMP отсутствует, ` +
|
|
78
|
+
"регистрировать vehicle по id невозможно.");
|
|
79
|
+
}
|
|
80
|
+
unregisterById(id) {
|
|
81
|
+
throw new Error(`CCMPVehiclesManager.unregisterById(${id}): client-side vehicle pool под CCMP отсутствует, ` +
|
|
82
|
+
"разрегистрировать vehicle по id невозможно.");
|
|
83
|
+
}
|
|
84
|
+
// -- IBaseObjectsManager / IWorldObjectsManager ---------------------------
|
|
85
|
+
findByID(id) {
|
|
86
|
+
void id;
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
getByID(id) {
|
|
90
|
+
throw new Error(`CCMPVehiclesManager.getByID(${id}): vehicle не найден (пул пуст под CCMP).`);
|
|
91
|
+
}
|
|
92
|
+
findByRemoteID(remoteId) {
|
|
93
|
+
void remoteId;
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
getByRemoteID(remoteId) {
|
|
97
|
+
throw new Error(`CCMPVehiclesManager.getByRemoteID(${remoteId}): vehicle не найден (пул пуст под CCMP).`);
|
|
98
|
+
}
|
|
99
|
+
deleteById(id) {
|
|
100
|
+
throw new Error(`CCMPVehiclesManager.deleteById(${id}): vehicle не найден (пул пуст под CCMP).`);
|
|
101
|
+
}
|
|
102
|
+
get iterator() {
|
|
103
|
+
return this._iterator;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -22,6 +22,9 @@ export interface IEntity extends IWorldObject {
|
|
|
22
22
|
getBoneIndexByName(boneName: string): number;
|
|
23
23
|
getWorldPositionOfBone(boneIndex: number): IVector3D;
|
|
24
24
|
getVariable(name: string): unknown | null;
|
|
25
|
+
getSyncedMeta(key: string): unknown | undefined;
|
|
26
|
+
hasSyncedMeta(key: string): boolean;
|
|
27
|
+
getSyncedMetaKeys(): readonly string[];
|
|
25
28
|
attachToEntity(target: IBaseObject, boneIndex: number, offset: IVector3D, rotation: IVector3D, p9: boolean, useSoftPinning: boolean, collision: boolean, isPed: boolean, vertexIndex: number, fixedRot: boolean): void;
|
|
26
29
|
detach(useDetachVelocity: boolean, collision: boolean): void;
|
|
27
30
|
getSpeed(): number;
|
|
@@ -24,6 +24,9 @@ export declare abstract class RageEntity<T extends EntityMp> extends RageWorldOb
|
|
|
24
24
|
getBoneIndexByName(boneName: string): number;
|
|
25
25
|
getWorldPositionOfBone(boneIndex: number): IVector3D;
|
|
26
26
|
getVariable(name: string): unknown | null;
|
|
27
|
+
getSyncedMeta(key: string): unknown | undefined;
|
|
28
|
+
hasSyncedMeta(key: string): boolean;
|
|
29
|
+
getSyncedMetaKeys(): readonly string[];
|
|
27
30
|
attachToEntity(target: IBaseObject, boneIndex: number, offset: IVector3D, rotation: IVector3D, p9: boolean, useSoftPinning: boolean, collision: boolean, isPed: boolean, vertexIndex: number, fixedRot: boolean): void;
|
|
28
31
|
detach(useDetachVelocity: boolean, collision: boolean): void;
|
|
29
32
|
getSpeed(): number;
|
|
@@ -65,6 +65,17 @@ export class RageEntity extends RageWorldObject {
|
|
|
65
65
|
getVariable(name) {
|
|
66
66
|
return this.mpEntity.getVariable(name);
|
|
67
67
|
}
|
|
68
|
+
getSyncedMeta(key) {
|
|
69
|
+
const value = this.mpEntity.getVariable(key);
|
|
70
|
+
return value === null ? undefined : value;
|
|
71
|
+
}
|
|
72
|
+
hasSyncedMeta(key) {
|
|
73
|
+
return this.mpEntity.getVariable(key) !== null;
|
|
74
|
+
}
|
|
75
|
+
getSyncedMetaKeys() {
|
|
76
|
+
// RageMP не экспонирует список ключей синхронно — возвращаем пустой массив.
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
68
79
|
attachToEntity(target, boneIndex, offset, rotation, p9, useSoftPinning, collision, isPed, vertexIndex, fixedRot) {
|
|
69
80
|
mp.game.entity.attachToEntity(this.handle, target.handle, boneIndex, offset.x, offset.y, offset.z, rotation.x, rotation.y, rotation.z, p9, useSoftPinning, collision, isPed, vertexIndex, fixedRot);
|
|
70
81
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type IManagersFactory } from "../common/IManagersFactory";
|
|
2
|
+
type ManagerReturn<K extends keyof IManagersFactory> = IManagersFactory[K] extends (...args: never[]) => infer R ? R : never;
|
|
3
|
+
export declare class CCMPManagersFactory implements IManagersFactory {
|
|
4
|
+
/**
|
|
5
|
+
* Сохраняем созданный `CCMPNetManager` потому что другим менеджерам
|
|
6
|
+
* (например, `CCMPPlayersManager`) нужен доступ к его событиям. Порядок
|
|
7
|
+
* создания в `RockMod` гарантирует, что `createNetManager` вызывается
|
|
8
|
+
* первым — мы можем безопасно полагаться на наличие `_netManager` в
|
|
9
|
+
* последующих фабричных методах.
|
|
10
|
+
*/
|
|
11
|
+
private _netManager;
|
|
12
|
+
createNetManager(): ManagerReturn<"createNetManager">;
|
|
13
|
+
private _requireNetManager;
|
|
14
|
+
createBlipsManager(): ManagerReturn<"createBlipsManager">;
|
|
15
|
+
createColshapesManager(): ManagerReturn<"createColshapesManager">;
|
|
16
|
+
createMarkersManager(): ManagerReturn<"createMarkersManager">;
|
|
17
|
+
createObjectsManager(): ManagerReturn<"createObjectsManager">;
|
|
18
|
+
createPedsManager(): ManagerReturn<"createPedsManager">;
|
|
19
|
+
createPlayersManager(): ManagerReturn<"createPlayersManager">;
|
|
20
|
+
createUtilsManager(): ManagerReturn<"createUtilsManager">;
|
|
21
|
+
createVehiclesManager(): ManagerReturn<"createVehiclesManager">;
|
|
22
|
+
createBrowserManager(): ManagerReturn<"createBrowserManager">;
|
|
23
|
+
createChatManager(): ManagerReturn<"createChatManager">;
|
|
24
|
+
createCursorManager(): ManagerReturn<"createCursorManager">;
|
|
25
|
+
createGuiManager(): ManagerReturn<"createGuiManager">;
|
|
26
|
+
createRaycastingManager(): ManagerReturn<"createRaycastingManager">;
|
|
27
|
+
createVoiceChatManager(): ManagerReturn<"createVoiceChatManager">;
|
|
28
|
+
createCameraManager(): ManagerReturn<"createCameraManager">;
|
|
29
|
+
createStorageManager(): ManagerReturn<"createStorageManager">;
|
|
30
|
+
createGraphicsManager(): ManagerReturn<"createGraphicsManager">;
|
|
31
|
+
createNativeManager(): ManagerReturn<"createNativeManager">;
|
|
32
|
+
createStreamingManager(): ManagerReturn<"createStreamingManager">;
|
|
33
|
+
createLocalPlayerManager(): ManagerReturn<"createLocalPlayerManager">;
|
|
34
|
+
createControlsManager(): ManagerReturn<"createControlsManager">;
|
|
35
|
+
createKeysManager(): ManagerReturn<"createKeysManager">;
|
|
36
|
+
createGameplayManager(): ManagerReturn<"createGameplayManager">;
|
|
37
|
+
createGameCameraManager(): ManagerReturn<"createGameCameraManager">;
|
|
38
|
+
createUiManager(): ManagerReturn<"createUiManager">;
|
|
39
|
+
createNametagsManager(): ManagerReturn<"createNametagsManager">;
|
|
40
|
+
createPathfindManager(): ManagerReturn<"createPathfindManager">;
|
|
41
|
+
createZoneManager(): ManagerReturn<"createZoneManager">;
|
|
42
|
+
createWeaponManager(): ManagerReturn<"createWeaponManager">;
|
|
43
|
+
createGameObjectManager(): ManagerReturn<"createGameObjectManager">;
|
|
44
|
+
createConsoleManager(): ManagerReturn<"createConsoleManager">;
|
|
45
|
+
}
|
|
46
|
+
export {};
|