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,149 @@
|
|
|
1
|
+
import { CCMPNetManager } from "../../net/ccmp/CCMPNetManager";
|
|
2
|
+
import { CCMPBrowserManager } from "../../game/ccmp/browser/CCMPBrowserManager";
|
|
3
|
+
import { CCMPStorageManager } from "../../game/ccmp/storage/CCMPStorageManager";
|
|
4
|
+
import { CCMPKeysManager } from "../../game/ccmp/keys/CCMPKeysManager";
|
|
5
|
+
import { CCMPNametagsManager } from "../../game/ccmp/nametags/CCMPNametagsManager";
|
|
6
|
+
import { CCMPChatManager } from "../../game/ccmp/chat/CCMPChatManager";
|
|
7
|
+
import { CCMPControlsManager } from "../../game/ccmp/controls/CCMPControlsManager";
|
|
8
|
+
import { CCMPPlayersManager } from "../../entities/ccmp/player/CCMPPlayersManager";
|
|
9
|
+
import { CCMPPedsManager } from "../../entities/ccmp/ped/CCMPPedsManager";
|
|
10
|
+
import { CCMPVehiclesManager } from "../../entities/ccmp/vehicle/CCMPVehiclesManager";
|
|
11
|
+
import { CCMPUtilsManager } from "../../utils/ccmp/CCMPUtilsManager";
|
|
12
|
+
import { CCMPGraphicsManager } from "../../game/ccmp/graphics/CCMPGraphicsManager";
|
|
13
|
+
import { CCMPUiManager } from "../../game/ccmp/ui/CCMPUiManager";
|
|
14
|
+
import { CCMPPathfindManager } from "../../game/ccmp/pathfind/CCMPPathfindManager";
|
|
15
|
+
import { CCMPZoneManager } from "../../game/ccmp/zone/CCMPZoneManager";
|
|
16
|
+
import { CCMPNativeCallerManager } from "../../game/ccmp/native/CCMPNativeCallerManager";
|
|
17
|
+
import { CCMPGuiManager } from "../../game/ccmp/gui/CCMPGuiManager";
|
|
18
|
+
import { CCMPRaycastingManager } from "../../game/ccmp/raycasting/CCMPRaycastingManager";
|
|
19
|
+
import { CCMPSyncedMetaBridge } from "../../net/ccmp/events/CCMPSyncedMetaBridge";
|
|
20
|
+
import { CCMPCameraManager } from "../../entities/ccmp/camera/CCMPCameraManager";
|
|
21
|
+
import { CCMPStreamingManager } from "../../game/ccmp/streaming/CCMPStreamingManager";
|
|
22
|
+
import { CCMPCursorManager } from "../../game/ccmp/cursor/CCMPCursorManager";
|
|
23
|
+
import { CCMPGameObjectManager } from "../../game/ccmp/object/CCMPGameObjectManager";
|
|
24
|
+
import { CCMPGameplayManager } from "../../game/ccmp/gameplay/CCMPGameplayManager";
|
|
25
|
+
import { createNotImplementedProxy } from "./createNotImplementedProxy";
|
|
26
|
+
export class CCMPManagersFactory {
|
|
27
|
+
constructor() {
|
|
28
|
+
/**
|
|
29
|
+
* Сохраняем созданный `CCMPNetManager` потому что другим менеджерам
|
|
30
|
+
* (например, `CCMPPlayersManager`) нужен доступ к его событиям. Порядок
|
|
31
|
+
* создания в `RockMod` гарантирует, что `createNetManager` вызывается
|
|
32
|
+
* первым — мы можем безопасно полагаться на наличие `_netManager` в
|
|
33
|
+
* последующих фабричных методах.
|
|
34
|
+
*/
|
|
35
|
+
this._netManager = null;
|
|
36
|
+
}
|
|
37
|
+
createNetManager() {
|
|
38
|
+
this._netManager = new CCMPNetManager();
|
|
39
|
+
return this._netManager;
|
|
40
|
+
}
|
|
41
|
+
_requireNetManager(forMethod) {
|
|
42
|
+
if (!this._netManager) {
|
|
43
|
+
throw new Error(`CCMPManagersFactory.${forMethod}: ` +
|
|
44
|
+
"createNetManager() ещё не вызывался. Это нарушение контракта порядка " +
|
|
45
|
+
"фабричных методов в RockMod-конструкторе.");
|
|
46
|
+
}
|
|
47
|
+
return this._netManager;
|
|
48
|
+
}
|
|
49
|
+
createBlipsManager() {
|
|
50
|
+
return createNotImplementedProxy("CCMPBlipsManager");
|
|
51
|
+
}
|
|
52
|
+
createColshapesManager() {
|
|
53
|
+
return createNotImplementedProxy("CCMPColshapesManager");
|
|
54
|
+
}
|
|
55
|
+
createMarkersManager() {
|
|
56
|
+
return createNotImplementedProxy("CCMPMarkersManager");
|
|
57
|
+
}
|
|
58
|
+
createObjectsManager() {
|
|
59
|
+
return createNotImplementedProxy("CCMPObjectsManager");
|
|
60
|
+
}
|
|
61
|
+
createPedsManager() {
|
|
62
|
+
return new CCMPPedsManager();
|
|
63
|
+
}
|
|
64
|
+
createPlayersManager() {
|
|
65
|
+
const netManager = this._requireNetManager("createPlayersManager");
|
|
66
|
+
const playersManager = new CCMPPlayersManager(netManager.events);
|
|
67
|
+
// Bridge для `streamSyncedMetaChange` создаётся здесь — ему нужен
|
|
68
|
+
// players manager для резолва `entityId → CCMPPlayer`, а events bus
|
|
69
|
+
// — для эмиссии `rm::syncedMetaChange` (на который уже подписан
|
|
70
|
+
// `CCMPDataHandler`, инстанцированный в `CCMPNetManager`).
|
|
71
|
+
new CCMPSyncedMetaBridge(netManager.events, playersManager).register();
|
|
72
|
+
return playersManager;
|
|
73
|
+
}
|
|
74
|
+
createUtilsManager() {
|
|
75
|
+
return new CCMPUtilsManager();
|
|
76
|
+
}
|
|
77
|
+
createVehiclesManager() {
|
|
78
|
+
return new CCMPVehiclesManager();
|
|
79
|
+
}
|
|
80
|
+
createBrowserManager() {
|
|
81
|
+
return new CCMPBrowserManager();
|
|
82
|
+
}
|
|
83
|
+
createChatManager() {
|
|
84
|
+
return new CCMPChatManager();
|
|
85
|
+
}
|
|
86
|
+
createCursorManager() {
|
|
87
|
+
return new CCMPCursorManager();
|
|
88
|
+
}
|
|
89
|
+
createGuiManager() {
|
|
90
|
+
return new CCMPGuiManager();
|
|
91
|
+
}
|
|
92
|
+
createRaycastingManager() {
|
|
93
|
+
return new CCMPRaycastingManager();
|
|
94
|
+
}
|
|
95
|
+
createVoiceChatManager() {
|
|
96
|
+
return createNotImplementedProxy("CCMPVoiceChatManager");
|
|
97
|
+
}
|
|
98
|
+
createCameraManager() {
|
|
99
|
+
return new CCMPCameraManager();
|
|
100
|
+
}
|
|
101
|
+
createStorageManager() {
|
|
102
|
+
return new CCMPStorageManager();
|
|
103
|
+
}
|
|
104
|
+
createGraphicsManager() {
|
|
105
|
+
return new CCMPGraphicsManager();
|
|
106
|
+
}
|
|
107
|
+
createNativeManager() {
|
|
108
|
+
return new CCMPNativeCallerManager();
|
|
109
|
+
}
|
|
110
|
+
createStreamingManager() {
|
|
111
|
+
return new CCMPStreamingManager();
|
|
112
|
+
}
|
|
113
|
+
createLocalPlayerManager() {
|
|
114
|
+
return createNotImplementedProxy("CCMPLocalPlayerManager");
|
|
115
|
+
}
|
|
116
|
+
createControlsManager() {
|
|
117
|
+
return new CCMPControlsManager();
|
|
118
|
+
}
|
|
119
|
+
createKeysManager() {
|
|
120
|
+
return new CCMPKeysManager();
|
|
121
|
+
}
|
|
122
|
+
createGameplayManager() {
|
|
123
|
+
return new CCMPGameplayManager();
|
|
124
|
+
}
|
|
125
|
+
createGameCameraManager() {
|
|
126
|
+
return createNotImplementedProxy("CCMPGameCameraManager");
|
|
127
|
+
}
|
|
128
|
+
createUiManager() {
|
|
129
|
+
return new CCMPUiManager();
|
|
130
|
+
}
|
|
131
|
+
createNametagsManager() {
|
|
132
|
+
return new CCMPNametagsManager();
|
|
133
|
+
}
|
|
134
|
+
createPathfindManager() {
|
|
135
|
+
return new CCMPPathfindManager();
|
|
136
|
+
}
|
|
137
|
+
createZoneManager() {
|
|
138
|
+
return new CCMPZoneManager();
|
|
139
|
+
}
|
|
140
|
+
createWeaponManager() {
|
|
141
|
+
return createNotImplementedProxy("CCMPWeaponManager");
|
|
142
|
+
}
|
|
143
|
+
createGameObjectManager() {
|
|
144
|
+
return new CCMPGameObjectManager();
|
|
145
|
+
}
|
|
146
|
+
createConsoleManager() {
|
|
147
|
+
return createNotImplementedProxy("CCMPConsoleManager");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createNotImplementedProxy: <T extends object>(name: string) => T;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const createNotImplementedError = (path) => new Error(`${path}: not implemented yet`);
|
|
2
|
+
const createProxy = (path) => {
|
|
3
|
+
function notImplementedProxyTarget() {
|
|
4
|
+
throw createNotImplementedError(path);
|
|
5
|
+
}
|
|
6
|
+
return new Proxy(notImplementedProxyTarget, {
|
|
7
|
+
apply() {
|
|
8
|
+
throw createNotImplementedError(path);
|
|
9
|
+
},
|
|
10
|
+
construct() {
|
|
11
|
+
throw createNotImplementedError(path);
|
|
12
|
+
},
|
|
13
|
+
get(_target, property) {
|
|
14
|
+
if (property === "then") {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return createProxy(`${path}.${String(property)}`);
|
|
18
|
+
},
|
|
19
|
+
set(_target, property) {
|
|
20
|
+
throw createNotImplementedError(`${path}.${String(property)}`);
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
export const createNotImplementedProxy = (name) => createProxy(name);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type IBrowserHandle, type IBrowserManager } from "../../common/browser/IBrowserManager";
|
|
2
|
+
/**
|
|
3
|
+
* Реализация `IBrowserManager` поверх нативного CCMP browser API.
|
|
4
|
+
*
|
|
5
|
+
* CCMP предоставляет полноценное CEF-управление через `ccmp.browsers` —
|
|
6
|
+
* это прямое соответствие RageMP'шному `mp.browsers`. Маппинг:
|
|
7
|
+
* - `create(url)` → `ccmp.browsers.create(url)` → возвращает `Browser` с
|
|
8
|
+
* числовым `id`, который мы храним для последующих `execute`/`destroy`.
|
|
9
|
+
* - `execute(code)` → `Browser.executeJavaScript(code)`.
|
|
10
|
+
* - `destroy()` → `Browser.destroy()`.
|
|
11
|
+
*
|
|
12
|
+
* Геймод-консьюмер (`BrowserService` → один логический браузер на гейм-mod)
|
|
13
|
+
* управляет только одним инстансом одновременно, поэтому держим ссылку
|
|
14
|
+
* на единственный созданный браузер.
|
|
15
|
+
*/
|
|
16
|
+
export declare class CCMPBrowserManager implements IBrowserManager {
|
|
17
|
+
private _browser;
|
|
18
|
+
create(url: string): void;
|
|
19
|
+
createInstance(url: string): IBrowserHandle;
|
|
20
|
+
destroy(): void;
|
|
21
|
+
execute(code: string): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
class CCMPBrowserHandle {
|
|
2
|
+
constructor(url) {
|
|
3
|
+
this._browser = ccmp.browsers.create(url);
|
|
4
|
+
}
|
|
5
|
+
get isAlive() {
|
|
6
|
+
return this._browser !== null;
|
|
7
|
+
}
|
|
8
|
+
destroy() {
|
|
9
|
+
if (!this._browser) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
this._browser.destroy();
|
|
13
|
+
this._browser = null;
|
|
14
|
+
}
|
|
15
|
+
execute(code) {
|
|
16
|
+
if (!this._browser) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this._browser.executeJavaScript(code);
|
|
20
|
+
}
|
|
21
|
+
setOrderId(orderId) {
|
|
22
|
+
if (!this._browser) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this._browser.setOrderId(orderId);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Реализация `IBrowserManager` поверх нативного CCMP browser API.
|
|
30
|
+
*
|
|
31
|
+
* CCMP предоставляет полноценное CEF-управление через `ccmp.browsers` —
|
|
32
|
+
* это прямое соответствие RageMP'шному `mp.browsers`. Маппинг:
|
|
33
|
+
* - `create(url)` → `ccmp.browsers.create(url)` → возвращает `Browser` с
|
|
34
|
+
* числовым `id`, который мы храним для последующих `execute`/`destroy`.
|
|
35
|
+
* - `execute(code)` → `Browser.executeJavaScript(code)`.
|
|
36
|
+
* - `destroy()` → `Browser.destroy()`.
|
|
37
|
+
*
|
|
38
|
+
* Геймод-консьюмер (`BrowserService` → один логический браузер на гейм-mod)
|
|
39
|
+
* управляет только одним инстансом одновременно, поэтому держим ссылку
|
|
40
|
+
* на единственный созданный браузер.
|
|
41
|
+
*/
|
|
42
|
+
export class CCMPBrowserManager {
|
|
43
|
+
constructor() {
|
|
44
|
+
this._browser = null;
|
|
45
|
+
}
|
|
46
|
+
create(url) {
|
|
47
|
+
this.destroy();
|
|
48
|
+
this._browser = this.createInstance(url);
|
|
49
|
+
}
|
|
50
|
+
createInstance(url) {
|
|
51
|
+
return new CCMPBrowserHandle(url);
|
|
52
|
+
}
|
|
53
|
+
destroy() {
|
|
54
|
+
if (!this._browser) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this._browser.destroy();
|
|
58
|
+
this._browser = null;
|
|
59
|
+
}
|
|
60
|
+
execute(code) {
|
|
61
|
+
if (!this._browser) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this._browser.execute(code);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type IChatManager } from "../../common/chat/IChatManager";
|
|
2
|
+
/**
|
|
3
|
+
* No-op реализация `IChatManager` под CCMP.
|
|
4
|
+
*
|
|
5
|
+
* У RageMP клиента есть `mp.gui.chat.activate(state)` (разрешает игроку
|
|
6
|
+
* печатать в чат по T) и `mp.gui.chat.show(state)` (видимость чат-окна).
|
|
7
|
+
* У CCMP **нет JS API для управления чатом** — только встроенное событие
|
|
8
|
+
* `chatMessage` на приём входящих сообщений и `ccmp.notify(text)` для HUD-
|
|
9
|
+
* уведомлений (не относится к чату).
|
|
10
|
+
*
|
|
11
|
+
* Бросать нельзя: геймод-консьюмер `RockModChatAdapter.activate` вызывается
|
|
12
|
+
* из `ChatService.onModuleInit` — исключение поднимет весь bootstrap DI.
|
|
13
|
+
* Поэтому игнорируем + один раз пишем warn, чтобы было видно в логах что
|
|
14
|
+
* фича недоступна.
|
|
15
|
+
*
|
|
16
|
+
* Следствие: под CCMP программное управление чатом не работает. Чат-UI
|
|
17
|
+
* (если он есть) рисуется самим CCMP-клиентом на Rust-стороне и реагирует
|
|
18
|
+
* на свои клавиши. Когда (если) CCMP добавит JS-API для чата — заменим.
|
|
19
|
+
*/
|
|
20
|
+
export declare class CCMPChatManager implements IChatManager {
|
|
21
|
+
private _warned;
|
|
22
|
+
activate(state: boolean): void;
|
|
23
|
+
show(state: boolean): void;
|
|
24
|
+
push(text: string): void;
|
|
25
|
+
private _warnOnce;
|
|
26
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-op реализация `IChatManager` под CCMP.
|
|
3
|
+
*
|
|
4
|
+
* У RageMP клиента есть `mp.gui.chat.activate(state)` (разрешает игроку
|
|
5
|
+
* печатать в чат по T) и `mp.gui.chat.show(state)` (видимость чат-окна).
|
|
6
|
+
* У CCMP **нет JS API для управления чатом** — только встроенное событие
|
|
7
|
+
* `chatMessage` на приём входящих сообщений и `ccmp.notify(text)` для HUD-
|
|
8
|
+
* уведомлений (не относится к чату).
|
|
9
|
+
*
|
|
10
|
+
* Бросать нельзя: геймод-консьюмер `RockModChatAdapter.activate` вызывается
|
|
11
|
+
* из `ChatService.onModuleInit` — исключение поднимет весь bootstrap DI.
|
|
12
|
+
* Поэтому игнорируем + один раз пишем warn, чтобы было видно в логах что
|
|
13
|
+
* фича недоступна.
|
|
14
|
+
*
|
|
15
|
+
* Следствие: под CCMP программное управление чатом не работает. Чат-UI
|
|
16
|
+
* (если он есть) рисуется самим CCMP-клиентом на Rust-стороне и реагирует
|
|
17
|
+
* на свои клавиши. Когда (если) CCMP добавит JS-API для чата — заменим.
|
|
18
|
+
*/
|
|
19
|
+
export class CCMPChatManager {
|
|
20
|
+
constructor() {
|
|
21
|
+
this._warned = false;
|
|
22
|
+
}
|
|
23
|
+
activate(state) {
|
|
24
|
+
this._warnOnce("activate", state);
|
|
25
|
+
}
|
|
26
|
+
show(state) {
|
|
27
|
+
this._warnOnce("show", state);
|
|
28
|
+
}
|
|
29
|
+
push(text) {
|
|
30
|
+
ccmp.notify(text);
|
|
31
|
+
}
|
|
32
|
+
_warnOnce(method, state) {
|
|
33
|
+
if (this._warned) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this._warned = true;
|
|
37
|
+
console.warn(`[CCMPChatManager] ${method}(${String(state)}) вызван, но CCMP не ` +
|
|
38
|
+
`предоставляет JS API для управления чатом. Дальнейшие вызовы ` +
|
|
39
|
+
`activate/show будут проигнорированы молча.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type IControlsManager } from "../../common/controls/IControlsManager";
|
|
2
|
+
/**
|
|
3
|
+
* Реализация `IControlsManager` поверх натива-обёртки CCMP `ccmp.natives.pad.*`.
|
|
4
|
+
*
|
|
5
|
+
* Все четыре метода — прямой passthrough к соответствующим GTA V-нативам
|
|
6
|
+
* (`DISABLE_CONTROL_ACTION`, `IS_CONTROL_PRESSED`, `IS_DISABLED_CONTROL_PRESSED`,
|
|
7
|
+
* `GET_DISABLED_CONTROL_NORMAL`) с сохранением порядка аргументов:
|
|
8
|
+
*
|
|
9
|
+
* IControlsManager.disableControlAction(padIndex, control, disable)
|
|
10
|
+
* → ccmp.natives.pad.disableControlAction(padIndex, control, disable)
|
|
11
|
+
*
|
|
12
|
+
* Семантика и значения индексов идентичны RageMP — гейм-mod консьюмеры
|
|
13
|
+
* (`ControlsService` / `WeaponService.disableControlActions`) используют те
|
|
14
|
+
* же константы `Control.*` (см. `@shared/common/enums/Control`).
|
|
15
|
+
*
|
|
16
|
+
* **Hot path:** `disableControlAction` вызывается на каждый render-tick из
|
|
17
|
+
* `WeaponController.onRender`. CCMP-native — это синхронный вызов V8 op'а,
|
|
18
|
+
* стоимость порядка единиц микросекунд; никакой буферизации не нужно.
|
|
19
|
+
*
|
|
20
|
+
* Имена параметров `CcmpNativesPad.disableControlAction(control, action, ...)`
|
|
21
|
+
* **обманчивы** — это generic-renames из натив-генератора. Фактически первый
|
|
22
|
+
* аргумент — `padIndex` (0..2), второй — `control` (Control.*), третий —
|
|
23
|
+
* `disable: boolean`. См. https://docs.fivem.net/natives/?_0xFE99B66D43DA8E7B.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CCMPControlsManager implements IControlsManager {
|
|
26
|
+
disableControlAction(padIndex: number, control: number, disable: boolean): void;
|
|
27
|
+
isDisabledControlPressed(padIndex: number, control: number): boolean;
|
|
28
|
+
isDisabledControlJustPressed(padIndex: number, control: number): boolean;
|
|
29
|
+
isControlPressed(padIndex: number, control: number): boolean;
|
|
30
|
+
isControlJustPressed(padIndex: number, control: number): boolean;
|
|
31
|
+
isControlJustReleased(padIndex: number, control: number): boolean;
|
|
32
|
+
getDisabledControlNormal(padIndex: number, control: number): number;
|
|
33
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/// <reference types="@classic-mp/types/client" />
|
|
2
|
+
/**
|
|
3
|
+
* Реализация `IControlsManager` поверх натива-обёртки CCMP `ccmp.natives.pad.*`.
|
|
4
|
+
*
|
|
5
|
+
* Все четыре метода — прямой passthrough к соответствующим GTA V-нативам
|
|
6
|
+
* (`DISABLE_CONTROL_ACTION`, `IS_CONTROL_PRESSED`, `IS_DISABLED_CONTROL_PRESSED`,
|
|
7
|
+
* `GET_DISABLED_CONTROL_NORMAL`) с сохранением порядка аргументов:
|
|
8
|
+
*
|
|
9
|
+
* IControlsManager.disableControlAction(padIndex, control, disable)
|
|
10
|
+
* → ccmp.natives.pad.disableControlAction(padIndex, control, disable)
|
|
11
|
+
*
|
|
12
|
+
* Семантика и значения индексов идентичны RageMP — гейм-mod консьюмеры
|
|
13
|
+
* (`ControlsService` / `WeaponService.disableControlActions`) используют те
|
|
14
|
+
* же константы `Control.*` (см. `@shared/common/enums/Control`).
|
|
15
|
+
*
|
|
16
|
+
* **Hot path:** `disableControlAction` вызывается на каждый render-tick из
|
|
17
|
+
* `WeaponController.onRender`. CCMP-native — это синхронный вызов V8 op'а,
|
|
18
|
+
* стоимость порядка единиц микросекунд; никакой буферизации не нужно.
|
|
19
|
+
*
|
|
20
|
+
* Имена параметров `CcmpNativesPad.disableControlAction(control, action, ...)`
|
|
21
|
+
* **обманчивы** — это generic-renames из натив-генератора. Фактически первый
|
|
22
|
+
* аргумент — `padIndex` (0..2), второй — `control` (Control.*), третий —
|
|
23
|
+
* `disable: boolean`. См. https://docs.fivem.net/natives/?_0xFE99B66D43DA8E7B.
|
|
24
|
+
*/
|
|
25
|
+
export class CCMPControlsManager {
|
|
26
|
+
disableControlAction(padIndex, control, disable) {
|
|
27
|
+
ccmp.natives.pad.disableControlAction(padIndex, control, disable);
|
|
28
|
+
}
|
|
29
|
+
isDisabledControlPressed(padIndex, control) {
|
|
30
|
+
return ccmp.natives.pad.isDisabledControlPressed(padIndex, control);
|
|
31
|
+
}
|
|
32
|
+
isDisabledControlJustPressed(padIndex, control) {
|
|
33
|
+
return ccmp.natives.pad.isDisabledControlJustPressed(padIndex, control);
|
|
34
|
+
}
|
|
35
|
+
isControlPressed(padIndex, control) {
|
|
36
|
+
return ccmp.natives.pad.isControlPressed(padIndex, control);
|
|
37
|
+
}
|
|
38
|
+
isControlJustPressed(padIndex, control) {
|
|
39
|
+
return ccmp.natives.pad.isControlJustPressed(padIndex, control);
|
|
40
|
+
}
|
|
41
|
+
isControlJustReleased(padIndex, control) {
|
|
42
|
+
return ccmp.natives.pad.isControlJustReleased(padIndex, control);
|
|
43
|
+
}
|
|
44
|
+
getDisabledControlNormal(padIndex, control) {
|
|
45
|
+
return ccmp.natives.pad.getDisabledControlNormal(padIndex, control);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ICursorManager } from "../../../game";
|
|
2
|
+
import { Vector2D } from "../../../../shared/common/utils";
|
|
3
|
+
export declare class CCMPCursorManager implements ICursorManager {
|
|
4
|
+
show(_freezeControls: boolean, state: boolean): void;
|
|
5
|
+
getPosition(): Vector2D;
|
|
6
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="@classic-mp/types/client" />
|
|
2
|
+
import { Vector2D } from "../../../../shared/common/utils";
|
|
3
|
+
export class CCMPCursorManager {
|
|
4
|
+
show(_freezeControls, state) {
|
|
5
|
+
if (state) {
|
|
6
|
+
ccmp.cursor.show();
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
ccmp.cursor.hide();
|
|
10
|
+
}
|
|
11
|
+
getPosition() {
|
|
12
|
+
const position = ccmp.cursor.getPosition();
|
|
13
|
+
return new Vector2D(position.x, position.y);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type IGameplayManager } from "../../../game";
|
|
2
|
+
import { type IVector3D } from "../../../../shared/common/utils";
|
|
3
|
+
export declare class CCMPGameplayManager implements IGameplayManager {
|
|
4
|
+
setFadeOutAfterDeath(toggle: boolean): void;
|
|
5
|
+
getGroundZFor3dCoord(position: IVector3D, ignoreWater: boolean, waterLevelCheck: boolean): number;
|
|
6
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="@classic-mp/types/client" />
|
|
2
|
+
export class CCMPGameplayManager {
|
|
3
|
+
setFadeOutAfterDeath(toggle) {
|
|
4
|
+
ccmp.natives.misc.setFadeOutAfterDeath(toggle);
|
|
5
|
+
}
|
|
6
|
+
getGroundZFor3dCoord(position, ignoreWater, waterLevelCheck) {
|
|
7
|
+
const result = ccmp.natives.misc.getGroundZFor3dCoord(position.x, position.y, position.z, ignoreWater, waterLevelCheck);
|
|
8
|
+
return result.groundz;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type IGraphicsManager, type ILoopedParticleFxAtCoordOptions, type IParticleFxAtCoordOptions, type IScreenTextOptions } from "../../common/graphics/IGraphicsManager";
|
|
2
|
+
import { type IVector2D, type IVector3D } from "../../../../shared/common/utils";
|
|
3
|
+
/**
|
|
4
|
+
* Реализация `IGraphicsManager` под CCMP.
|
|
5
|
+
*
|
|
6
|
+
* RageMP даёт высокоуровневые обёртки `mp.game.graphics.drawText` /
|
|
7
|
+
* `world3dToScreen2d` / etc. У CCMP таких помощников нет — есть только
|
|
8
|
+
* сырые GTA V натив-биндинги в `ccmp.natives.{hud,graphics}.*`. Этот класс
|
|
9
|
+
* собирает их в эквивалент RageMP API.
|
|
10
|
+
*
|
|
11
|
+
* ### `drawText` — мульти-нативная цепочка
|
|
12
|
+
*
|
|
13
|
+
* Стандартная GTA V последовательность:
|
|
14
|
+
* 1. `SET_TEXT_FONT/SCALE/COLOUR/OUTLINE/CENTRE` — стиль текста
|
|
15
|
+
* 2. `BEGIN_TEXT_COMMAND_DISPLAY_TEXT('STRING')` — открыть text command
|
|
16
|
+
* 3. `ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text)` — добавить содержимое
|
|
17
|
+
* 4. `END_TEXT_COMMAND_DISPLAY_TEXT(x, y, 0)` — отрисовать
|
|
18
|
+
*
|
|
19
|
+
* **Hot path:** вызывается каждый render-tick из `HudController.onRender`
|
|
20
|
+
* (ammo, nametags, etc). Все вызовы синхронны (V8-ops), общая стоимость —
|
|
21
|
+
* единицы микросекунд на текст.
|
|
22
|
+
*
|
|
23
|
+
* **Ограничение длины:** `ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME` усекает
|
|
24
|
+
* вход на 99 символов. Для типичных HUD-меток (ammo "30/120", имена игроков)
|
|
25
|
+
* не критично; для длинных строк нужно разбивать на чанки последовательными
|
|
26
|
+
* `ADD_*` вызовами. Сейчас не реализовано — добавим если понадобится.
|
|
27
|
+
*
|
|
28
|
+
* ### `world3dToScreen2d`
|
|
29
|
+
*
|
|
30
|
+
* `getScreenCoordFromWorldCoord` возвращает `{return, screenx, screeny}` —
|
|
31
|
+
* `return=false` означает, что точка вне frustum'а; маппим в `null` для
|
|
32
|
+
* совпадения с RageMP-семантикой.
|
|
33
|
+
*
|
|
34
|
+
* ### `getActiveScreenResolution`
|
|
35
|
+
*
|
|
36
|
+
* Маппится на `getActualScreenResolution` (GTA native `0x873C9F3104101DD3`),
|
|
37
|
+
* который возвращает физическое разрешение рендера — то же, что RageMP'шный
|
|
38
|
+
* `getActiveScreenResolution` (это один и тот же натив, переименованный по-
|
|
39
|
+
* разному в разных биндингах).
|
|
40
|
+
*
|
|
41
|
+
* ### `startScreenEffect` / `stopScreenEffect`
|
|
42
|
+
*
|
|
43
|
+
* Маппятся на `animpostfxPlay` / `animpostfxStop` (`ANIMPOSTFX_PLAY`/`STOP`) —
|
|
44
|
+
* это и есть GTA V натив для screen effect'ов (по-старому называвшийся
|
|
45
|
+
* `START_SCREEN_EFFECT`).
|
|
46
|
+
*/
|
|
47
|
+
export declare class CCMPGraphicsManager implements IGraphicsManager {
|
|
48
|
+
drawText(text: string, position: IVector2D, options?: IScreenTextOptions): void;
|
|
49
|
+
world3dToScreen2d(position: IVector3D): IVector2D | null;
|
|
50
|
+
startScreenEffect(effectName: string, duration: number, looped: boolean): void;
|
|
51
|
+
stopScreenEffect(effectName: string): void;
|
|
52
|
+
setPtfxAssetNextCall(assetName: string): void;
|
|
53
|
+
startParticleFxNonLoopedAtCoord(options: IParticleFxAtCoordOptions): boolean;
|
|
54
|
+
startParticleFxLoopedAtCoord(options: ILoopedParticleFxAtCoordOptions): number;
|
|
55
|
+
stopParticleFxLooped(handle: number, p1: boolean): void;
|
|
56
|
+
getSafeZoneSize(): number;
|
|
57
|
+
getActiveScreenResolution(): IVector2D;
|
|
58
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/// <reference types="@classic-mp/types/client" />
|
|
2
|
+
import { Vector2D } from "../../../../shared/common/utils";
|
|
3
|
+
/**
|
|
4
|
+
* Реализация `IGraphicsManager` под CCMP.
|
|
5
|
+
*
|
|
6
|
+
* RageMP даёт высокоуровневые обёртки `mp.game.graphics.drawText` /
|
|
7
|
+
* `world3dToScreen2d` / etc. У CCMP таких помощников нет — есть только
|
|
8
|
+
* сырые GTA V натив-биндинги в `ccmp.natives.{hud,graphics}.*`. Этот класс
|
|
9
|
+
* собирает их в эквивалент RageMP API.
|
|
10
|
+
*
|
|
11
|
+
* ### `drawText` — мульти-нативная цепочка
|
|
12
|
+
*
|
|
13
|
+
* Стандартная GTA V последовательность:
|
|
14
|
+
* 1. `SET_TEXT_FONT/SCALE/COLOUR/OUTLINE/CENTRE` — стиль текста
|
|
15
|
+
* 2. `BEGIN_TEXT_COMMAND_DISPLAY_TEXT('STRING')` — открыть text command
|
|
16
|
+
* 3. `ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text)` — добавить содержимое
|
|
17
|
+
* 4. `END_TEXT_COMMAND_DISPLAY_TEXT(x, y, 0)` — отрисовать
|
|
18
|
+
*
|
|
19
|
+
* **Hot path:** вызывается каждый render-tick из `HudController.onRender`
|
|
20
|
+
* (ammo, nametags, etc). Все вызовы синхронны (V8-ops), общая стоимость —
|
|
21
|
+
* единицы микросекунд на текст.
|
|
22
|
+
*
|
|
23
|
+
* **Ограничение длины:** `ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME` усекает
|
|
24
|
+
* вход на 99 символов. Для типичных HUD-меток (ammo "30/120", имена игроков)
|
|
25
|
+
* не критично; для длинных строк нужно разбивать на чанки последовательными
|
|
26
|
+
* `ADD_*` вызовами. Сейчас не реализовано — добавим если понадобится.
|
|
27
|
+
*
|
|
28
|
+
* ### `world3dToScreen2d`
|
|
29
|
+
*
|
|
30
|
+
* `getScreenCoordFromWorldCoord` возвращает `{return, screenx, screeny}` —
|
|
31
|
+
* `return=false` означает, что точка вне frustum'а; маппим в `null` для
|
|
32
|
+
* совпадения с RageMP-семантикой.
|
|
33
|
+
*
|
|
34
|
+
* ### `getActiveScreenResolution`
|
|
35
|
+
*
|
|
36
|
+
* Маппится на `getActualScreenResolution` (GTA native `0x873C9F3104101DD3`),
|
|
37
|
+
* который возвращает физическое разрешение рендера — то же, что RageMP'шный
|
|
38
|
+
* `getActiveScreenResolution` (это один и тот же натив, переименованный по-
|
|
39
|
+
* разному в разных биндингах).
|
|
40
|
+
*
|
|
41
|
+
* ### `startScreenEffect` / `stopScreenEffect`
|
|
42
|
+
*
|
|
43
|
+
* Маппятся на `animpostfxPlay` / `animpostfxStop` (`ANIMPOSTFX_PLAY`/`STOP`) —
|
|
44
|
+
* это и есть GTA V натив для screen effect'ов (по-старому называвшийся
|
|
45
|
+
* `START_SCREEN_EFFECT`).
|
|
46
|
+
*/
|
|
47
|
+
export class CCMPGraphicsManager {
|
|
48
|
+
drawText(text, position, options) {
|
|
49
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
50
|
+
const font = (_a = options === null || options === void 0 ? void 0 : options.font) !== null && _a !== void 0 ? _a : 0;
|
|
51
|
+
const [scaleX, scaleY] = (_b = options === null || options === void 0 ? void 0 : options.scale) !== null && _b !== void 0 ? _b : [0.3, 0.3];
|
|
52
|
+
const r = (_d = (_c = options === null || options === void 0 ? void 0 : options.color) === null || _c === void 0 ? void 0 : _c.r) !== null && _d !== void 0 ? _d : 255;
|
|
53
|
+
const g = (_f = (_e = options === null || options === void 0 ? void 0 : options.color) === null || _e === void 0 ? void 0 : _e.g) !== null && _f !== void 0 ? _f : 255;
|
|
54
|
+
const b = (_h = (_g = options === null || options === void 0 ? void 0 : options.color) === null || _g === void 0 ? void 0 : _g.b) !== null && _h !== void 0 ? _h : 255;
|
|
55
|
+
const a = (_k = (_j = options === null || options === void 0 ? void 0 : options.color) === null || _j === void 0 ? void 0 : _j.a) !== null && _k !== void 0 ? _k : 255;
|
|
56
|
+
const outline = (_l = options === null || options === void 0 ? void 0 : options.outline) !== null && _l !== void 0 ? _l : true;
|
|
57
|
+
const centre = (_m = options === null || options === void 0 ? void 0 : options.centre) !== null && _m !== void 0 ? _m : false;
|
|
58
|
+
const hud = ccmp.natives.hud;
|
|
59
|
+
hud.setTextFont(font);
|
|
60
|
+
// Натив `SET_TEXT_SCALE(scale, size)` — первый параметр обычно игнорируется,
|
|
61
|
+
// эффективный размер задаётся вторым. RageMP передаёт оба из массива
|
|
62
|
+
// `[scaleX, scaleY]` — повторяем тот же контракт.
|
|
63
|
+
hud.setTextScale(scaleX, scaleY);
|
|
64
|
+
hud.setTextColour(r, g, b, a);
|
|
65
|
+
if (outline) {
|
|
66
|
+
hud.setTextOutline();
|
|
67
|
+
}
|
|
68
|
+
if (centre) {
|
|
69
|
+
hud.setTextCentre(true);
|
|
70
|
+
}
|
|
71
|
+
hud.beginTextCommandDisplayText("STRING");
|
|
72
|
+
hud.addTextComponentSubstringPlayerName(text);
|
|
73
|
+
// p2 — `unk_const_0` (введён в b2699); 0 — стандартное значение.
|
|
74
|
+
hud.endTextCommandDisplayText(position.x, position.y, 0);
|
|
75
|
+
}
|
|
76
|
+
world3dToScreen2d(position) {
|
|
77
|
+
const result = ccmp.natives.graphics.getScreenCoordFromWorldCoord(position.x, position.y, position.z);
|
|
78
|
+
if (!result.return) {
|
|
79
|
+
// Точка вне frustum'а — RageMP в таком случае возвращает `null`.
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return new Vector2D(result.screenx, result.screeny);
|
|
83
|
+
}
|
|
84
|
+
startScreenEffect(effectName, duration, looped) {
|
|
85
|
+
ccmp.natives.graphics.animpostfxPlay(effectName, duration, looped);
|
|
86
|
+
}
|
|
87
|
+
stopScreenEffect(effectName) {
|
|
88
|
+
ccmp.natives.graphics.animpostfxStop(effectName);
|
|
89
|
+
}
|
|
90
|
+
setPtfxAssetNextCall(assetName) {
|
|
91
|
+
ccmp.natives.graphics.useParticleFxAsset(assetName);
|
|
92
|
+
}
|
|
93
|
+
startParticleFxNonLoopedAtCoord(options) {
|
|
94
|
+
return ccmp.natives.graphics.startParticleFxNonLoopedAtCoord(options.effectName, options.position.x, options.position.y, options.position.z, options.rotation.x, options.rotation.y, options.rotation.z, options.scale, options.xAxis, options.yAxis, options.zAxis);
|
|
95
|
+
}
|
|
96
|
+
startParticleFxLoopedAtCoord(options) {
|
|
97
|
+
return ccmp.natives.graphics.startParticleFxLoopedAtCoord(options.effectName, options.position.x, options.position.y, options.position.z, options.rotation.x, options.rotation.y, options.rotation.z, options.scale, options.xAxis, options.yAxis, options.zAxis, options.p11);
|
|
98
|
+
}
|
|
99
|
+
stopParticleFxLooped(handle, p1) {
|
|
100
|
+
ccmp.natives.graphics.stopParticleFxLooped(handle, p1);
|
|
101
|
+
}
|
|
102
|
+
getSafeZoneSize() {
|
|
103
|
+
return ccmp.natives.graphics.getSafeZoneSize();
|
|
104
|
+
}
|
|
105
|
+
getActiveScreenResolution() {
|
|
106
|
+
// `getActualScreenResolution` (0x873C9F3104101DD3) === RageMP'шный
|
|
107
|
+
// `getActiveScreenResolution` — это один и тот же native под разными
|
|
108
|
+
// именами в разных биндингах.
|
|
109
|
+
const result = ccmp.natives.graphics.getActualScreenResolution();
|
|
110
|
+
return new Vector2D(result.x, result.y);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="@classic-mp/types/client" />
|
|
2
|
+
export class CCMPGuiManager {
|
|
3
|
+
constructor() {
|
|
4
|
+
this._warnedTakeScreenshot = false;
|
|
5
|
+
}
|
|
6
|
+
takeScreenshot(name, type, quality, compressionQuality) {
|
|
7
|
+
void name;
|
|
8
|
+
void type;
|
|
9
|
+
void quality;
|
|
10
|
+
void compressionQuality;
|
|
11
|
+
if (this._warnedTakeScreenshot) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
this._warnedTakeScreenshot = true;
|
|
15
|
+
console.warn("[CCMPGuiManager] takeScreenshot is not available in CCMP client JS.");
|
|
16
|
+
}
|
|
17
|
+
}
|