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.
- package/dist/client/RockMod.d.ts +1 -1
- package/dist/client/RockMod.js +4 -0
- package/dist/client/entities/ccmp/blip/CCMPBlip.d.ts +38 -0
- package/dist/client/entities/ccmp/blip/CCMPBlip.js +118 -0
- package/dist/client/entities/ccmp/blip/CCMPBlipsManager.d.ts +27 -0
- package/dist/client/entities/ccmp/blip/CCMPBlipsManager.js +191 -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 +51 -0
- package/dist/client/entities/ccmp/colshape/CCMPColshape.d.ts +26 -0
- package/dist/client/entities/ccmp/colshape/CCMPColshape.js +83 -0
- package/dist/client/entities/ccmp/colshape/CCMPColshapesManager.d.ts +31 -0
- package/dist/client/entities/ccmp/colshape/CCMPColshapesManager.js +193 -0
- package/dist/client/entities/ccmp/marker/CCMPMarker.d.ts +34 -0
- package/dist/client/entities/ccmp/marker/CCMPMarker.js +109 -0
- package/dist/client/entities/ccmp/marker/CCMPMarkersManager.d.ts +27 -0
- package/dist/client/entities/ccmp/marker/CCMPMarkersManager.js +180 -0
- package/dist/client/entities/ccmp/object/CCMPObject.d.ts +53 -0
- package/dist/client/entities/ccmp/object/CCMPObject.js +218 -0
- package/dist/client/entities/ccmp/object/CCMPObjectsManager.d.ts +27 -0
- package/dist/client/entities/ccmp/object/CCMPObjectsManager.js +177 -0
- package/dist/client/entities/ccmp/ped/CCMPPed.d.ts +65 -0
- package/dist/client/entities/ccmp/ped/CCMPPed.js +199 -0
- package/dist/client/entities/ccmp/ped/CCMPPedsManager.d.ts +27 -0
- package/dist/client/entities/ccmp/ped/CCMPPedsManager.js +177 -0
- package/dist/client/entities/ccmp/player/CCMPPlayer.d.ts +112 -0
- package/dist/client/entities/ccmp/player/CCMPPlayer.js +338 -0
- package/dist/client/entities/ccmp/player/CCMPPlayersManager.d.ts +85 -0
- package/dist/client/entities/ccmp/player/CCMPPlayersManager.js +331 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehicle.d.ts +119 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehicle.js +392 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +27 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.js +183 -0
- package/dist/client/entities/common/baseObject/IBaseObject.d.ts +2 -1
- package/dist/client/entities/common/entity/IEntity.d.ts +3 -0
- package/dist/client/entities/ragemp/entity/RageEntity.d.ts +7 -0
- package/dist/client/entities/ragemp/entity/RageEntity.js +45 -2
- package/dist/client/factories/ccmp/CCMPManagersFactory.d.ts +48 -0
- package/dist/client/factories/ccmp/CCMPManagersFactory.js +189 -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 +7 -0
- package/dist/client/game/ccmp/storage/CCMPStorageManager.js +14 -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 +29 -0
- package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.js +45 -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/dataHandler/IDataHandler.d.ts +2 -2
- package/dist/client/net/common/events/types.d.ts +6 -4
- package/dist/client/net/common/events/types.js +1 -0
- package/dist/client/net/ragemp/dataHandler/RageDataHandler.d.ts +2 -2
- 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 +36 -0
- package/dist/server/entities/ccmp/blip/CCMPBlip.js +86 -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 +25 -0
- package/dist/server/entities/ccmp/colshape/CCMPColshape.js +53 -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 +34 -0
- package/dist/server/entities/ccmp/marker/CCMPMarker.js +85 -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 +68 -0
- package/dist/server/entities/ccmp/object/CCMPObjectsManager.d.ts +9 -0
- package/dist/server/entities/ccmp/object/CCMPObjectsManager.js +27 -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/entities/ragemp/entity/RageEntity.d.ts +5 -1
- package/dist/server/entities/ragemp/entity/RageEntity.js +17 -1
- package/dist/server/entities/ragemp/object/RageObjectsManager.js +1 -1
- package/dist/server/entities/ragemp/ped/RagePedsManager.js +1 -1
- package/dist/server/entities/ragemp/vehicle/RageVehiclesManager.js +1 -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,85 @@
|
|
|
1
|
+
import { type CCMPEventsManager } from "../../../net/ccmp/events/CCMPEventsManager";
|
|
2
|
+
import { type IPlayersManager } from "../../common/player/IPlayersManager";
|
|
3
|
+
import { type IWorldObjectsIterator } from "../../common/worldObject/IWorldObjectsIterator";
|
|
4
|
+
import { CCMPPlayer } from "./CCMPPlayer";
|
|
5
|
+
/**
|
|
6
|
+
* Реализация `IPlayersManager` под CCMP — single source of truth для
|
|
7
|
+
* `IPlayer`-инстансов и `rm::playerReady`/`rm::playerConnected`-эмиссий
|
|
8
|
+
* с настоящими `CCMPPlayer`-инстансами.
|
|
9
|
+
*
|
|
10
|
+
* ### Хранилище
|
|
11
|
+
*
|
|
12
|
+
* `Map<id, CCMPPlayer>`. For CCMP players only, `id` and `remoteId` still
|
|
13
|
+
* mean the same server/network id. Non-player CCMP wrappers have a separate
|
|
14
|
+
* client-local `id` and nullable server `remoteId`.
|
|
15
|
+
* `findByID`/`findByRemoteID`/`findByRemoteId` map to one lookup for players.
|
|
16
|
+
*
|
|
17
|
+
* ### Жизненный цикл local player'а
|
|
18
|
+
*
|
|
19
|
+
* `ccmp.players.local` (backed by `op_get_local_player_id`) валиден сразу
|
|
20
|
+
* после handshake'а — `PlayerManager::set_local_player_id` срабатывает до
|
|
21
|
+
* того, как scripts загружаются. Мы используем его, чтобы синхронно
|
|
22
|
+
* выпустить `rm::playerReady` как sticky-event (см. ниже):
|
|
23
|
+
*
|
|
24
|
+
* 1. **На конструкторе** — fast-path. Если local op возвращает игрока,
|
|
25
|
+
* эмитим `rm::playerReady` через `emitInternalSticky` с реальным
|
|
26
|
+
* `CCMPPlayer`-инстансом. Sticky-кэш гарантирует, что поздние
|
|
27
|
+
* подписчики из async DI-bootstrap'а геймода тоже получат сигнал
|
|
28
|
+
* при подписке.
|
|
29
|
+
* 2. **На `connectionStateChanged`** — fallback / handler реконнекта.
|
|
30
|
+
* Если на конструкторе local ещё не был валиден (handshake race),
|
|
31
|
+
* `connected = true` запустит retry fast-path. На `connected = false`
|
|
32
|
+
* чистим _localPlayer и sticky-кэш, чтобы при следующем connect'е
|
|
33
|
+
* эмитнуть с актуальным remoteId.
|
|
34
|
+
*
|
|
35
|
+
* `CCMPPlayer`-инстанс важен (а не структурный stub) потому что
|
|
36
|
+
* `RockModStateAdapter` в геймоде хранит `rockModPlayer`-ссылку и через
|
|
37
|
+
* неё вызывает методы (`setNoCollision`, etc). На структурном stub'е
|
|
38
|
+
* без методов это падало бы с `TypeError`.
|
|
39
|
+
*
|
|
40
|
+
* ### Remote-игроки
|
|
41
|
+
*
|
|
42
|
+
* Источники:
|
|
43
|
+
* - `ccmp.players.all` — prepopulation для уже-существующих на момент
|
|
44
|
+
* подключения (заполнен Rust'ом в `ClientScriptingService::init`).
|
|
45
|
+
* - `rm::playerConnected`/`rm::playerDisconnected` internal events
|
|
46
|
+
* (эмитит `CCMPEventsBridge` из нативных `ccmp.on('playerConnected'/...)`).
|
|
47
|
+
*/
|
|
48
|
+
export declare class CCMPPlayersManager implements IPlayersManager {
|
|
49
|
+
private readonly _players;
|
|
50
|
+
private readonly _events;
|
|
51
|
+
private _localPlayer;
|
|
52
|
+
constructor(events: CCMPEventsManager);
|
|
53
|
+
findLocalPlayer(): CCMPPlayer | null;
|
|
54
|
+
getLocalPlayer(): CCMPPlayer;
|
|
55
|
+
findByRemoteId(remoteId: number): CCMPPlayer | null;
|
|
56
|
+
getByRemoteId(remoteId: number): CCMPPlayer;
|
|
57
|
+
findByName(name: string): CCMPPlayer | null;
|
|
58
|
+
getByName(name: string): CCMPPlayer;
|
|
59
|
+
syncWithMpPool(): void;
|
|
60
|
+
registerById(id: number): CCMPPlayer;
|
|
61
|
+
unregisterById(id: number): CCMPPlayer;
|
|
62
|
+
findByID(id: number): CCMPPlayer | null;
|
|
63
|
+
getByID(id: number): CCMPPlayer;
|
|
64
|
+
findByRemoteID(remoteId: number): CCMPPlayer | null;
|
|
65
|
+
getByRemoteID(remoteId: number): CCMPPlayer;
|
|
66
|
+
deleteById(id: number): CCMPPlayer;
|
|
67
|
+
get iterator(): IWorldObjectsIterator<CCMPPlayer>;
|
|
68
|
+
private _registerNativePlayerEvents;
|
|
69
|
+
/**
|
|
70
|
+
* Идемпотентная точка создания/обновления CCMPPlayer. Все источники
|
|
71
|
+
* (events, prepopulation, fast-path) проходят сюда.
|
|
72
|
+
*/
|
|
73
|
+
private _ensurePlayer;
|
|
74
|
+
/**
|
|
75
|
+
* Пытается синхронно достать local player из CCMP, создать CCMPPlayer
|
|
76
|
+
* и эмитнуть rm::playerReady как sticky-event. Идемпотентна: повторный
|
|
77
|
+
* вызов после успешной эмиссии — no-op (`_localPlayer !== null`).
|
|
78
|
+
*/
|
|
79
|
+
private _tryEmitLocalPlayerReady;
|
|
80
|
+
private _handleDisconnect;
|
|
81
|
+
private readonly _iterator;
|
|
82
|
+
private _iterateDimension;
|
|
83
|
+
private _iterateRange2D;
|
|
84
|
+
private _iterateRange3D;
|
|
85
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
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>`. For CCMP players only, `id` and `remoteId` still
|
|
11
|
+
* mean the same server/network id. Non-player CCMP wrappers have a separate
|
|
12
|
+
* client-local `id` and nullable server `remoteId`.
|
|
13
|
+
* `findByID`/`findByRemoteID`/`findByRemoteId` map to one lookup for players.
|
|
14
|
+
*
|
|
15
|
+
* ### Жизненный цикл local player'а
|
|
16
|
+
*
|
|
17
|
+
* `ccmp.players.local` (backed by `op_get_local_player_id`) валиден сразу
|
|
18
|
+
* после handshake'а — `PlayerManager::set_local_player_id` срабатывает до
|
|
19
|
+
* того, как scripts загружаются. Мы используем его, чтобы синхронно
|
|
20
|
+
* выпустить `rm::playerReady` как sticky-event (см. ниже):
|
|
21
|
+
*
|
|
22
|
+
* 1. **На конструкторе** — fast-path. Если local op возвращает игрока,
|
|
23
|
+
* эмитим `rm::playerReady` через `emitInternalSticky` с реальным
|
|
24
|
+
* `CCMPPlayer`-инстансом. Sticky-кэш гарантирует, что поздние
|
|
25
|
+
* подписчики из async DI-bootstrap'а геймода тоже получат сигнал
|
|
26
|
+
* при подписке.
|
|
27
|
+
* 2. **На `connectionStateChanged`** — fallback / handler реконнекта.
|
|
28
|
+
* Если на конструкторе local ещё не был валиден (handshake race),
|
|
29
|
+
* `connected = true` запустит retry fast-path. На `connected = false`
|
|
30
|
+
* чистим _localPlayer и sticky-кэш, чтобы при следующем connect'е
|
|
31
|
+
* эмитнуть с актуальным remoteId.
|
|
32
|
+
*
|
|
33
|
+
* `CCMPPlayer`-инстанс важен (а не структурный stub) потому что
|
|
34
|
+
* `RockModStateAdapter` в геймоде хранит `rockModPlayer`-ссылку и через
|
|
35
|
+
* неё вызывает методы (`setNoCollision`, etc). На структурном stub'е
|
|
36
|
+
* без методов это падало бы с `TypeError`.
|
|
37
|
+
*
|
|
38
|
+
* ### Remote-игроки
|
|
39
|
+
*
|
|
40
|
+
* Источники:
|
|
41
|
+
* - `ccmp.players.all` — prepopulation для уже-существующих на момент
|
|
42
|
+
* подключения (заполнен Rust'ом в `ClientScriptingService::init`).
|
|
43
|
+
* - `rm::playerConnected`/`rm::playerDisconnected` internal events
|
|
44
|
+
* (эмитит `CCMPEventsBridge` из нативных `ccmp.on('playerConnected'/...)`).
|
|
45
|
+
*/
|
|
46
|
+
export class CCMPPlayersManager {
|
|
47
|
+
constructor(events) {
|
|
48
|
+
var _a;
|
|
49
|
+
this._players = new Map();
|
|
50
|
+
this._localPlayer = null;
|
|
51
|
+
// Iterator реализован inline — у CCMP нет per-dimension/per-range
|
|
52
|
+
// фильтрации игроков на JS-уровне.
|
|
53
|
+
this._iterator = {
|
|
54
|
+
all: () => this._players.values(),
|
|
55
|
+
dimension: (value) => this._iterateDimension(value),
|
|
56
|
+
range2D: (center, range) => this._iterateRange2D(center, range),
|
|
57
|
+
range3D: (center, range) => this._iterateRange3D(center, range),
|
|
58
|
+
};
|
|
59
|
+
this._events = events;
|
|
60
|
+
// 1) Subscribe ПЕРВЫМ — чтобы между подпиской и prepopulation'ом не
|
|
61
|
+
// пропустить параллельный `rm::playerConnected`.
|
|
62
|
+
this._events.onInternal({
|
|
63
|
+
[ClientInternalEventName.PlayerReady]: (player) => {
|
|
64
|
+
// Если кто-то ещё эмитнул rm::playerReady (например, cooperation
|
|
65
|
+
// fallback в будущем) — синхронизируем своё состояние.
|
|
66
|
+
const remoteId = player.remoteId;
|
|
67
|
+
if (remoteId === null) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this._ensurePlayer(remoteId, player.name, /* isLocal */ true);
|
|
71
|
+
},
|
|
72
|
+
[ClientInternalEventName.PlayerConnected]: (player) => {
|
|
73
|
+
const remoteId = player.remoteId;
|
|
74
|
+
if (remoteId === null) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this._ensurePlayer(remoteId, player.name, /* isLocal */ false);
|
|
78
|
+
},
|
|
79
|
+
[ClientInternalEventName.PlayerDisconnected]: (player) => {
|
|
80
|
+
const remoteId = player.remoteId;
|
|
81
|
+
if (remoteId === null) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const existing = this._players.get(remoteId);
|
|
85
|
+
if (existing) {
|
|
86
|
+
existing.markRemoved();
|
|
87
|
+
this._players.delete(remoteId);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
this._registerNativePlayerEvents();
|
|
92
|
+
// 2) Prepopulate уже-существующих remote-игроков из CCMP-runtime'а.
|
|
93
|
+
// `ccmp.players.all` исключает local (см. js_runtime.rs::setup_globals).
|
|
94
|
+
try {
|
|
95
|
+
for (const ccmpPlayer of ccmp.players.all) {
|
|
96
|
+
this._ensurePlayer(ccmpPlayer.id, (_a = ccmpPlayer.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ false);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.warn("[CCMPPlayersManager] failed to prepopulate from ccmp.players.all:", error);
|
|
101
|
+
}
|
|
102
|
+
// 3) Fast-path: попытка эмитнуть rm::playerReady сразу. Если local не
|
|
103
|
+
// готов (handshake ещё не отработал) — пропускаем, дальше connectionStateChanged
|
|
104
|
+
// подберёт.
|
|
105
|
+
this._tryEmitLocalPlayerReady();
|
|
106
|
+
// 4) Retry-on-reconnect + reset-on-disconnect. Listener регистрируем
|
|
107
|
+
// через `ccmp.on` напрямую (не через bridge), чтобы наша логика была
|
|
108
|
+
// независимой от состояния других менеджеров.
|
|
109
|
+
ccmp.on("connectionStateChanged", (state) => {
|
|
110
|
+
if (state === null || state === void 0 ? void 0 : state.connected) {
|
|
111
|
+
this._tryEmitLocalPlayerReady();
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
this._handleDisconnect();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// -- IPlayersManager ------------------------------------------------------
|
|
119
|
+
findLocalPlayer() {
|
|
120
|
+
// Кэшированный _localPlayer проставлен из rm::playerReady-эмиссии
|
|
121
|
+
// (либо нашей собственной из конструктора, либо чьей-то ещё).
|
|
122
|
+
// Если кэш пуст, lazy-retry: возможно local op теперь валиден.
|
|
123
|
+
if (this._localPlayer) {
|
|
124
|
+
return this._localPlayer;
|
|
125
|
+
}
|
|
126
|
+
this._tryEmitLocalPlayerReady();
|
|
127
|
+
return this._localPlayer;
|
|
128
|
+
}
|
|
129
|
+
getLocalPlayer() {
|
|
130
|
+
const player = this.findLocalPlayer();
|
|
131
|
+
if (!player) {
|
|
132
|
+
throw new Error("CCMPPlayersManager.getLocalPlayer: local player ещё не известен — handshake не завершён");
|
|
133
|
+
}
|
|
134
|
+
return player;
|
|
135
|
+
}
|
|
136
|
+
findByRemoteId(remoteId) {
|
|
137
|
+
var _a;
|
|
138
|
+
return (_a = this._players.get(remoteId)) !== null && _a !== void 0 ? _a : null;
|
|
139
|
+
}
|
|
140
|
+
getByRemoteId(remoteId) {
|
|
141
|
+
const player = this.findByRemoteId(remoteId);
|
|
142
|
+
if (!player) {
|
|
143
|
+
throw new Error(`CCMPPlayersManager.getByRemoteId: player remoteId=${remoteId} не найден`);
|
|
144
|
+
}
|
|
145
|
+
return player;
|
|
146
|
+
}
|
|
147
|
+
findByName(name) {
|
|
148
|
+
for (const player of this._players.values()) {
|
|
149
|
+
if (player.name === name) {
|
|
150
|
+
return player;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
getByName(name) {
|
|
156
|
+
const player = this.findByName(name);
|
|
157
|
+
if (!player) {
|
|
158
|
+
throw new Error(`CCMPPlayersManager.getByName: player name="${name}" не найден`);
|
|
159
|
+
}
|
|
160
|
+
return player;
|
|
161
|
+
}
|
|
162
|
+
// -- IEntitiesManager -----------------------------------------------------
|
|
163
|
+
syncWithMpPool() {
|
|
164
|
+
// RageMP-pool API не существует под CCMP. Игроки управляются событиями
|
|
165
|
+
// `rm::playerConnected`/`rm::playerDisconnected`, prepopulation идёт
|
|
166
|
+
// из `ccmp.players.all` в конструкторе. No-op для соответствия интерфейсу.
|
|
167
|
+
}
|
|
168
|
+
registerById(id) {
|
|
169
|
+
// Под CCMP мы не можем "достать" игрока по id из глобального пула без
|
|
170
|
+
// дополнительных данных (name, isLocal). Возвращаем существующего или
|
|
171
|
+
// создаём минимальный stub. Корректный путь регистрации — через события.
|
|
172
|
+
return this._ensurePlayer(id, /* name */ "", /* isLocal */ false);
|
|
173
|
+
}
|
|
174
|
+
unregisterById(id) {
|
|
175
|
+
return this.deleteById(id);
|
|
176
|
+
}
|
|
177
|
+
// -- IBaseObjectsManager / IWorldObjectsManager ---------------------------
|
|
178
|
+
findByID(id) {
|
|
179
|
+
return this.findByRemoteId(id);
|
|
180
|
+
}
|
|
181
|
+
getByID(id) {
|
|
182
|
+
return this.getByRemoteId(id);
|
|
183
|
+
}
|
|
184
|
+
findByRemoteID(remoteId) {
|
|
185
|
+
return this.findByRemoteId(remoteId);
|
|
186
|
+
}
|
|
187
|
+
getByRemoteID(remoteId) {
|
|
188
|
+
return this.getByRemoteId(remoteId);
|
|
189
|
+
}
|
|
190
|
+
deleteById(id) {
|
|
191
|
+
const player = this.getByRemoteId(id);
|
|
192
|
+
player.markRemoved();
|
|
193
|
+
this._players.delete(id);
|
|
194
|
+
if (this._localPlayer === player) {
|
|
195
|
+
this._localPlayer = null;
|
|
196
|
+
this._events.clearInternalSticky(ClientInternalEventName.PlayerReady);
|
|
197
|
+
}
|
|
198
|
+
return player;
|
|
199
|
+
}
|
|
200
|
+
get iterator() {
|
|
201
|
+
return this._iterator;
|
|
202
|
+
}
|
|
203
|
+
// -- Внутреннее -----------------------------------------------------------
|
|
204
|
+
_registerNativePlayerEvents() {
|
|
205
|
+
ccmp.on("playerConnected", (ccmpPlayer) => {
|
|
206
|
+
var _a;
|
|
207
|
+
const player = this._ensurePlayer(ccmpPlayer.id, (_a = ccmpPlayer.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ false);
|
|
208
|
+
this._events.emitInternal(ClientInternalEventName.PlayerConnected, player);
|
|
209
|
+
});
|
|
210
|
+
ccmp.on("playerDisconnected", (ccmpPlayer) => {
|
|
211
|
+
var _a, _b;
|
|
212
|
+
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);
|
|
213
|
+
player.markRemoved();
|
|
214
|
+
this._players.delete(ccmpPlayer.id);
|
|
215
|
+
if (this._localPlayer === player) {
|
|
216
|
+
this._localPlayer = null;
|
|
217
|
+
this._events.clearInternalSticky(ClientInternalEventName.PlayerReady);
|
|
218
|
+
}
|
|
219
|
+
this._events.emitInternal(ClientInternalEventName.PlayerDisconnected, player);
|
|
220
|
+
});
|
|
221
|
+
ccmp.on("playerStreamIn", (ccmpPlayer) => {
|
|
222
|
+
var _a;
|
|
223
|
+
const player = this._ensurePlayer(ccmpPlayer.id, (_a = ccmpPlayer.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ false);
|
|
224
|
+
this._events.emitInternal(ClientInternalEventName.EntityStreamIn, player);
|
|
225
|
+
});
|
|
226
|
+
ccmp.on("playerStreamOut", (ccmpPlayer) => {
|
|
227
|
+
var _a, _b;
|
|
228
|
+
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);
|
|
229
|
+
this._events.emitInternal(ClientInternalEventName.EntityStreamOut, player);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Идемпотентная точка создания/обновления CCMPPlayer. Все источники
|
|
234
|
+
* (events, prepopulation, fast-path) проходят сюда.
|
|
235
|
+
*/
|
|
236
|
+
_ensurePlayer(id, name, isLocal) {
|
|
237
|
+
const existing = this._players.get(id);
|
|
238
|
+
if (existing) {
|
|
239
|
+
if (name) {
|
|
240
|
+
existing.setNameInternal(name);
|
|
241
|
+
}
|
|
242
|
+
if (isLocal && !this._localPlayer) {
|
|
243
|
+
this._localPlayer = existing;
|
|
244
|
+
}
|
|
245
|
+
return existing;
|
|
246
|
+
}
|
|
247
|
+
const player = new CCMPPlayer({
|
|
248
|
+
id,
|
|
249
|
+
name,
|
|
250
|
+
isLocal,
|
|
251
|
+
});
|
|
252
|
+
this._players.set(id, player);
|
|
253
|
+
if (isLocal) {
|
|
254
|
+
this._localPlayer = player;
|
|
255
|
+
}
|
|
256
|
+
return player;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Пытается синхронно достать local player из CCMP, создать CCMPPlayer
|
|
260
|
+
* и эмитнуть rm::playerReady как sticky-event. Идемпотентна: повторный
|
|
261
|
+
* вызов после успешной эмиссии — no-op (`_localPlayer !== null`).
|
|
262
|
+
*/
|
|
263
|
+
_tryEmitLocalPlayerReady() {
|
|
264
|
+
var _a;
|
|
265
|
+
if (this._localPlayer) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
let nativeLocal;
|
|
269
|
+
try {
|
|
270
|
+
nativeLocal = ccmp.players.local;
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
console.warn("[CCMPPlayersManager] ccmp.players.local read failed:", error);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (!nativeLocal) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const localPlayer = this._ensurePlayer(nativeLocal.id, (_a = nativeLocal.name) !== null && _a !== void 0 ? _a : "", /* isLocal */ true);
|
|
280
|
+
// Sticky: поздние подписчики из async DI-bootstrap'а геймода
|
|
281
|
+
// (например `RockModMultiplayerEventsAdapter` из NetworkModule.init)
|
|
282
|
+
// получат событие сразу при подписке.
|
|
283
|
+
this._events.emitInternalSticky(ClientInternalEventName.PlayerReady, localPlayer);
|
|
284
|
+
}
|
|
285
|
+
_handleDisconnect() {
|
|
286
|
+
if (this._localPlayer) {
|
|
287
|
+
this._localPlayer.markRemoved();
|
|
288
|
+
this._players.delete(this._localPlayer.id);
|
|
289
|
+
this._localPlayer = null;
|
|
290
|
+
}
|
|
291
|
+
// Чистим sticky-кэш — иначе новые подписчики после reconnect'а получат
|
|
292
|
+
// устаревший local-player stub с прошлым remoteId.
|
|
293
|
+
this._events.clearInternalSticky(ClientInternalEventName.PlayerReady);
|
|
294
|
+
}
|
|
295
|
+
*_iterateDimension(value) {
|
|
296
|
+
for (const player of this._players.values()) {
|
|
297
|
+
if (player.dimension === value) {
|
|
298
|
+
yield player;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
*_iterateRange2D(center, range) {
|
|
303
|
+
const squaredRange = range * range;
|
|
304
|
+
for (const player of this._players.values()) {
|
|
305
|
+
if (!player.isExists || player.handle === 0) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
const position = player.position;
|
|
309
|
+
const dx = position.x - center.x;
|
|
310
|
+
const dy = position.y - center.y;
|
|
311
|
+
if (dx * dx + dy * dy <= squaredRange) {
|
|
312
|
+
yield player;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
*_iterateRange3D(center, range) {
|
|
317
|
+
const squaredRange = range * range;
|
|
318
|
+
for (const player of this._players.values()) {
|
|
319
|
+
if (!player.isExists || player.handle === 0) {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const position = player.position;
|
|
323
|
+
const dx = position.x - center.x;
|
|
324
|
+
const dy = position.y - center.y;
|
|
325
|
+
const dz = position.z - center.z;
|
|
326
|
+
if (dx * dx + dy * dy + dz * dz <= squaredRange) {
|
|
327
|
+
yield player;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { BaseObjectType } from "../../../../shared/entities";
|
|
2
|
+
import { type IRGB, type IVector3D, Vector3D } from "../../../../shared/common/utils";
|
|
3
|
+
import { type IBaseObject } from "../../common/baseObject/IBaseObject";
|
|
4
|
+
import { type ILightState, type IVehicle } from "../../common/vehicle/IVehicle";
|
|
5
|
+
export interface ICCMPNativeVehicle {
|
|
6
|
+
readonly id: number;
|
|
7
|
+
readonly remoteId: number | null;
|
|
8
|
+
readonly isRemote: boolean;
|
|
9
|
+
readonly handle: number;
|
|
10
|
+
readonly model: number;
|
|
11
|
+
readonly dimension: number;
|
|
12
|
+
readonly isAlive: boolean;
|
|
13
|
+
readonly isExists?: boolean;
|
|
14
|
+
readonly position: IVector3D;
|
|
15
|
+
readonly rotation: IVector3D;
|
|
16
|
+
readonly heading: number;
|
|
17
|
+
readonly numberPlateText: string;
|
|
18
|
+
readonly numberPlate: string;
|
|
19
|
+
destroy(): boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class CCMPVehicle implements IVehicle {
|
|
22
|
+
private readonly _ccmpVehicle;
|
|
23
|
+
private readonly _onDestroy;
|
|
24
|
+
private _destroyed;
|
|
25
|
+
constructor(_ccmpVehicle: ICCMPNativeVehicle, _onDestroy?: (vehicle: CCMPVehicle) => void);
|
|
26
|
+
get id(): number;
|
|
27
|
+
get remoteId(): number | null;
|
|
28
|
+
get type(): BaseObjectType;
|
|
29
|
+
get isExists(): boolean;
|
|
30
|
+
get handle(): number;
|
|
31
|
+
destroy(): void;
|
|
32
|
+
get position(): Vector3D;
|
|
33
|
+
get dimension(): number;
|
|
34
|
+
setPosition(_value: IVector3D): void;
|
|
35
|
+
setDimension(_value: number): void;
|
|
36
|
+
setCoords(_xPos: number, _yPos: number, _zPos: number, _xAxis: boolean, _yAxis: boolean, _zAxis: boolean, _clearArea: boolean): void;
|
|
37
|
+
get model(): number;
|
|
38
|
+
get heading(): number;
|
|
39
|
+
setHeading(_heading: number): void;
|
|
40
|
+
setModel(_value: string): void;
|
|
41
|
+
get rotation(): Vector3D;
|
|
42
|
+
get forwardVector(): Vector3D;
|
|
43
|
+
setRotation(_value: IVector3D): void;
|
|
44
|
+
freezePosition(_freeze: boolean): void;
|
|
45
|
+
setCollision(_collision: boolean, _keepPhysics: boolean): void;
|
|
46
|
+
setInvincible(_invincible: boolean): void;
|
|
47
|
+
setVisible(_visible: boolean): void;
|
|
48
|
+
setAlpha(alpha: number): void;
|
|
49
|
+
get alpha(): number;
|
|
50
|
+
resetAlpha(): void;
|
|
51
|
+
getOffsetFromInWorldCoords(offsetX: number, offsetY: number, offsetZ: number): IVector3D;
|
|
52
|
+
getBoneIndexByName(boneName: string): number;
|
|
53
|
+
getWorldPositionOfBone(boneIndex: number): IVector3D;
|
|
54
|
+
getVariable(name: string): unknown | null;
|
|
55
|
+
getSyncedMeta(key: string): unknown | undefined;
|
|
56
|
+
hasSyncedMeta(key: string): boolean;
|
|
57
|
+
getSyncedMetaKeys(): readonly string[];
|
|
58
|
+
attachToEntity(_target: IBaseObject, _boneIndex: number, _offset: IVector3D, _rotation: IVector3D, _p9: boolean, _useSoftPinning: boolean, _collision: boolean, _isPed: boolean, _vertexIndex: number, _fixedRot: boolean): void;
|
|
59
|
+
detach(_useDetachVelocity: boolean, _collision: boolean): void;
|
|
60
|
+
getSpeed(): number;
|
|
61
|
+
isPlayingAnim(_dictionary: string, _name: string, _taskFlag: number): boolean;
|
|
62
|
+
get bodyHealth(): number;
|
|
63
|
+
get engineHealth(): number;
|
|
64
|
+
get numberPlate(): string;
|
|
65
|
+
get isDead(): boolean;
|
|
66
|
+
setBodyHealth(_value: number): void;
|
|
67
|
+
setEngineHealth(_value: number): void;
|
|
68
|
+
setNumberPlate(_value: string): void;
|
|
69
|
+
explode(): void;
|
|
70
|
+
getPedInSeat(seat: number): number;
|
|
71
|
+
setUndriveable(_toggle: boolean): void;
|
|
72
|
+
get maxNumberOfPassengers(): number;
|
|
73
|
+
get gear(): number;
|
|
74
|
+
get speed(): number;
|
|
75
|
+
get isEngineRunning(): boolean;
|
|
76
|
+
setEngineOn(_toggle: boolean, _instantly: boolean, _otherwise: boolean): void;
|
|
77
|
+
get lightsState(): ILightState;
|
|
78
|
+
get isLocked(): boolean;
|
|
79
|
+
setIsLocked(_value: boolean): void;
|
|
80
|
+
setCustomPrimaryColour(color: IRGB): void;
|
|
81
|
+
setCustomSecondaryColour(color: IRGB): void;
|
|
82
|
+
get customPrimaryColour(): IRGB;
|
|
83
|
+
get customSecondaryColour(): IRGB;
|
|
84
|
+
setMod(modType: number, modIndex: number): void;
|
|
85
|
+
getMod(modType: number): number;
|
|
86
|
+
getNumMods(modType: number): number;
|
|
87
|
+
setNeonLightEnabled(index: number, toggle: boolean): void;
|
|
88
|
+
setNeonLightsColour(color: IRGB): void;
|
|
89
|
+
setWindowTint(tintType: number): void;
|
|
90
|
+
get windowTint(): number;
|
|
91
|
+
setWheelType(wheelType: number): void;
|
|
92
|
+
get wheelType(): number;
|
|
93
|
+
setNumberPlateTextIndex(_index: number): void;
|
|
94
|
+
get numberPlateTextIndex(): number;
|
|
95
|
+
setDoorOpen(_doorIndex: number, _loose: boolean, _openInstantly: boolean): void;
|
|
96
|
+
setDoorShut(_doorIndex: number, _instantly: boolean): void;
|
|
97
|
+
setHandling(_field: string, _value: number): void;
|
|
98
|
+
getHandling(_field: string): number;
|
|
99
|
+
setEnginePowerMultiplier(_value: number): void;
|
|
100
|
+
setEngineTorqueMultiplier(_value: number): void;
|
|
101
|
+
modifyTopSpeed(_value: number): void;
|
|
102
|
+
setCheatPowerIncrease(_value: number): void;
|
|
103
|
+
toggleMod(modType: number, toggle: boolean): void;
|
|
104
|
+
setTyreSmokeColor(r: number, g: number, b: number): void;
|
|
105
|
+
setModColor1(paintType: number, color: number, p3: number): void;
|
|
106
|
+
setExtraColours(_pearlescentColor: number, _wheelColor: number): void;
|
|
107
|
+
setHeadlightColor(colorIndex: number): void;
|
|
108
|
+
setDashboardColor(colorIndex: number): void;
|
|
109
|
+
setInteriorColor(colorIndex: number): void;
|
|
110
|
+
getMaxBraking(): number;
|
|
111
|
+
getAcceleration(): number;
|
|
112
|
+
getMaxTraction(): number;
|
|
113
|
+
getModelMaxSpeed(): number;
|
|
114
|
+
private _withHandle;
|
|
115
|
+
private _withHandleVoid;
|
|
116
|
+
private _setModKit;
|
|
117
|
+
private _getRemoteVehicleExists;
|
|
118
|
+
private _getOffsetFromCachedTransform;
|
|
119
|
+
}
|