rock-mod 0.21.0 → 0.23.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/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 +1 -1
- package/dist/client/entities/ccmp/camera/CCMPCamera.js +1 -1
- package/dist/client/entities/ccmp/camera/CCMPCameraManager.js +2 -1
- 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 +50 -0
- package/dist/client/entities/ccmp/object/CCMPObject.js +149 -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 +1 -1
- package/dist/client/entities/ccmp/ped/CCMPPed.js +21 -7
- package/dist/client/entities/ccmp/ped/CCMPPedsManager.d.ts +7 -0
- package/dist/client/entities/ccmp/ped/CCMPPedsManager.js +82 -10
- package/dist/client/entities/ccmp/player/CCMPPlayer.d.ts +15 -17
- package/dist/client/entities/ccmp/player/CCMPPlayer.js +86 -87
- package/dist/client/entities/ccmp/player/CCMPPlayersManager.d.ts +4 -3
- package/dist/client/entities/ccmp/player/CCMPPlayersManager.js +20 -7
- package/dist/client/entities/ccmp/vehicle/CCMPVehicle.d.ts +102 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehicle.js +311 -0
- package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.d.ts +11 -48
- package/dist/client/entities/ccmp/vehicle/CCMPVehiclesManager.js +154 -75
- package/dist/client/entities/common/baseObject/IBaseObject.d.ts +2 -1
- package/dist/client/entities/ragemp/entity/RageEntity.d.ts +4 -0
- package/dist/client/entities/ragemp/entity/RageEntity.js +34 -2
- package/dist/client/factories/ccmp/CCMPManagersFactory.d.ts +9 -7
- package/dist/client/factories/ccmp/CCMPManagersFactory.js +62 -22
- package/dist/client/game/ccmp/chat/CCMPChatManager.d.ts +2 -22
- package/dist/client/game/ccmp/chat/CCMPChatManager.js +6 -34
- package/dist/client/game/ccmp/storage/CCMPStorageManager.d.ts +0 -18
- package/dist/client/game/ccmp/storage/CCMPStorageManager.js +4 -36
- package/dist/client/game/ccmp/ui/CCMPUiManager.d.ts +0 -29
- package/dist/client/game/ccmp/ui/CCMPUiManager.js +5 -41
- package/dist/client/net/ccmp/CCMPNetManager.d.ts +0 -7
- package/dist/client/net/ccmp/CCMPNetManager.js +0 -26
- package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.d.ts +2 -2
- package/dist/client/net/ccmp/dataHandler/CCMPDataHandler.js +2 -2
- package/dist/client/net/ccmp/events/CCMPEventsBridge.d.ts +3 -1
- package/dist/client/net/ccmp/events/CCMPEventsBridge.js +33 -3
- package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.d.ts +21 -16
- package/dist/client/net/ccmp/events/CCMPSyncedMetaBridge.js +32 -22
- package/dist/client/net/common/dataHandler/IDataHandler.d.ts +2 -2
- package/dist/client/net/common/events/types.d.ts +4 -4
- package/dist/client/net/ragemp/dataHandler/RageDataHandler.d.ts +2 -2
- package/dist/server/entities/altv/colshape/AltVColshape.d.ts +2 -0
- package/dist/server/entities/altv/colshape/AltVColshape.js +6 -0
- package/dist/server/entities/ccmp/baseObject/CCMPBaseObjectsManager.js +4 -4
- package/dist/server/entities/ccmp/blip/CCMPBlip.d.ts +2 -0
- package/dist/server/entities/ccmp/blip/CCMPBlip.js +6 -0
- package/dist/server/entities/ccmp/colshape/CCMPColshape.d.ts +2 -0
- package/dist/server/entities/ccmp/colshape/CCMPColshape.js +6 -0
- package/dist/server/entities/ccmp/marker/CCMPMarker.d.ts +2 -0
- package/dist/server/entities/ccmp/marker/CCMPMarker.js +6 -0
- package/dist/server/entities/ccmp/object/CCMPObject.d.ts +1 -1
- package/dist/server/entities/ccmp/object/CCMPObject.js +3 -5
- package/dist/server/entities/ccmp/object/CCMPObjectsManager.js +1 -2
- package/dist/server/entities/ccmp/player/CCMPPlayersManager.js +15 -0
- package/dist/server/entities/ccmp/vehicle/CCMPVehicle.d.ts +29 -15
- package/dist/server/entities/ccmp/vehicle/CCMPVehicle.js +87 -44
- package/dist/server/entities/common/colshape/IColshape.d.ts +2 -0
- package/dist/server/entities/mock/colshape/MockColshape.d.ts +3 -0
- package/dist/server/entities/mock/colshape/MockColshape.js +8 -0
- package/dist/server/entities/ragemp/colshape/RageColshape.d.ts +2 -0
- package/dist/server/entities/ragemp/colshape/RageColshape.js +6 -0
- 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/net/ccmp/CCMPNetManager.js +0 -5
- package/dist/server/net/ccmp/events/CCMPEventsManager.d.ts +6 -2
- package/package.json +2 -2
|
@@ -5,8 +5,8 @@ export class RageEntity extends RageWorldObject {
|
|
|
5
5
|
return this.mpEntity.model;
|
|
6
6
|
}
|
|
7
7
|
get rotation() {
|
|
8
|
-
|
|
9
|
-
return new Vector3D(
|
|
8
|
+
var _a, _b;
|
|
9
|
+
return (_b = (_a = this._getNativeRotation()) !== null && _a !== void 0 ? _a : this._getEntityRotationProperty()) !== null && _b !== void 0 ? _b : new Vector3D(0, 0, this.heading);
|
|
10
10
|
}
|
|
11
11
|
constructor(options) {
|
|
12
12
|
super(options);
|
|
@@ -22,6 +22,9 @@ export class RageEntity extends RageWorldObject {
|
|
|
22
22
|
}
|
|
23
23
|
setRotation(value) {
|
|
24
24
|
this.mpEntity.rotation = new mp.Vector3(value);
|
|
25
|
+
if (this._hasValidHandle()) {
|
|
26
|
+
mp.game.entity.setRotation(this.handle, value.x, value.y, value.z, 2, true);
|
|
27
|
+
}
|
|
25
28
|
}
|
|
26
29
|
get forwardVector() {
|
|
27
30
|
const vector = this.mpEntity.getForwardVector();
|
|
@@ -88,4 +91,33 @@ export class RageEntity extends RageWorldObject {
|
|
|
88
91
|
isPlayingAnim(dictionary, name, taskFlag) {
|
|
89
92
|
return mp.game.entity.isPlayingAnim(this.handle, dictionary, name, taskFlag);
|
|
90
93
|
}
|
|
94
|
+
_getNativeRotation() {
|
|
95
|
+
if (!this._hasValidHandle())
|
|
96
|
+
return null;
|
|
97
|
+
try {
|
|
98
|
+
const rotation = mp.game.entity.getRotation(this.handle, 2);
|
|
99
|
+
if (!this._isVectorLike(rotation))
|
|
100
|
+
return null;
|
|
101
|
+
return new Vector3D(rotation.x, rotation.y, rotation.z);
|
|
102
|
+
}
|
|
103
|
+
catch (_a) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
_getEntityRotationProperty() {
|
|
108
|
+
const rotation = this.mpEntity.rotation;
|
|
109
|
+
if (!this._isVectorLike(rotation))
|
|
110
|
+
return null;
|
|
111
|
+
return new Vector3D(rotation.x, rotation.y, rotation.z);
|
|
112
|
+
}
|
|
113
|
+
_hasValidHandle() {
|
|
114
|
+
return typeof this.handle === "number" && this.handle > 0;
|
|
115
|
+
}
|
|
116
|
+
_isVectorLike(value) {
|
|
117
|
+
return (typeof value === "object" &&
|
|
118
|
+
value !== null &&
|
|
119
|
+
typeof value.x === "number" &&
|
|
120
|
+
typeof value.y === "number" &&
|
|
121
|
+
typeof value.z === "number");
|
|
122
|
+
}
|
|
91
123
|
}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { type IManagersFactory } from "../common/IManagersFactory";
|
|
2
2
|
type ManagerReturn<K extends keyof IManagersFactory> = IManagersFactory[K] extends (...args: never[]) => infer R ? R : never;
|
|
3
3
|
export declare class CCMPManagersFactory implements IManagersFactory {
|
|
4
|
-
/**
|
|
5
|
-
* Сохраняем созданный `CCMPNetManager` потому что другим менеджерам
|
|
6
|
-
* (например, `CCMPPlayersManager`) нужен доступ к его событиям. Порядок
|
|
7
|
-
* создания в `RockMod` гарантирует, что `createNetManager` вызывается
|
|
8
|
-
* первым — мы можем безопасно полагаться на наличие `_netManager` в
|
|
9
|
-
* последующих фабричных методах.
|
|
10
|
-
*/
|
|
11
4
|
private _netManager;
|
|
5
|
+
private _blipsManager;
|
|
6
|
+
private _colshapesManager;
|
|
7
|
+
private _markersManager;
|
|
8
|
+
private _objectsManager;
|
|
9
|
+
private _pedsManager;
|
|
10
|
+
private _playersManager;
|
|
11
|
+
private _vehiclesManager;
|
|
12
|
+
private _syncedMetaBridgeRegistered;
|
|
12
13
|
createNetManager(): ManagerReturn<"createNetManager">;
|
|
13
14
|
private _requireNetManager;
|
|
15
|
+
private _registerSyncedMetaBridgeIfReady;
|
|
14
16
|
createBlipsManager(): ManagerReturn<"createBlipsManager">;
|
|
15
17
|
createColshapesManager(): ManagerReturn<"createColshapesManager">;
|
|
16
18
|
createMarkersManager(): ManagerReturn<"createMarkersManager">;
|
|
@@ -8,6 +8,10 @@ import { CCMPControlsManager } from "../../game/ccmp/controls/CCMPControlsManage
|
|
|
8
8
|
import { CCMPPlayersManager } from "../../entities/ccmp/player/CCMPPlayersManager";
|
|
9
9
|
import { CCMPPedsManager } from "../../entities/ccmp/ped/CCMPPedsManager";
|
|
10
10
|
import { CCMPVehiclesManager } from "../../entities/ccmp/vehicle/CCMPVehiclesManager";
|
|
11
|
+
import { CCMPObjectsManager } from "../../entities/ccmp/object/CCMPObjectsManager";
|
|
12
|
+
import { CCMPMarkersManager } from "../../entities/ccmp/marker/CCMPMarkersManager";
|
|
13
|
+
import { CCMPBlipsManager } from "../../entities/ccmp/blip/CCMPBlipsManager";
|
|
14
|
+
import { CCMPColshapesManager } from "../../entities/ccmp/colshape/CCMPColshapesManager";
|
|
11
15
|
import { CCMPUtilsManager } from "../../utils/ccmp/CCMPUtilsManager";
|
|
12
16
|
import { CCMPGraphicsManager } from "../../game/ccmp/graphics/CCMPGraphicsManager";
|
|
13
17
|
import { CCMPUiManager } from "../../game/ccmp/ui/CCMPUiManager";
|
|
@@ -25,14 +29,15 @@ import { CCMPGameplayManager } from "../../game/ccmp/gameplay/CCMPGameplayManage
|
|
|
25
29
|
import { createNotImplementedProxy } from "./createNotImplementedProxy";
|
|
26
30
|
export class CCMPManagersFactory {
|
|
27
31
|
constructor() {
|
|
28
|
-
/**
|
|
29
|
-
* Сохраняем созданный `CCMPNetManager` потому что другим менеджерам
|
|
30
|
-
* (например, `CCMPPlayersManager`) нужен доступ к его событиям. Порядок
|
|
31
|
-
* создания в `RockMod` гарантирует, что `createNetManager` вызывается
|
|
32
|
-
* первым — мы можем безопасно полагаться на наличие `_netManager` в
|
|
33
|
-
* последующих фабричных методах.
|
|
34
|
-
*/
|
|
35
32
|
this._netManager = null;
|
|
33
|
+
this._blipsManager = null;
|
|
34
|
+
this._colshapesManager = null;
|
|
35
|
+
this._markersManager = null;
|
|
36
|
+
this._objectsManager = null;
|
|
37
|
+
this._pedsManager = null;
|
|
38
|
+
this._playersManager = null;
|
|
39
|
+
this._vehiclesManager = null;
|
|
40
|
+
this._syncedMetaBridgeRegistered = false;
|
|
36
41
|
}
|
|
37
42
|
createNetManager() {
|
|
38
43
|
this._netManager = new CCMPNetManager();
|
|
@@ -41,41 +46,76 @@ export class CCMPManagersFactory {
|
|
|
41
46
|
_requireNetManager(forMethod) {
|
|
42
47
|
if (!this._netManager) {
|
|
43
48
|
throw new Error(`CCMPManagersFactory.${forMethod}: ` +
|
|
44
|
-
"createNetManager()
|
|
45
|
-
"фабричных методов в RockMod-конструкторе.");
|
|
49
|
+
"createNetManager() was not called yet. This violates RockMod manager factory order.");
|
|
46
50
|
}
|
|
47
51
|
return this._netManager;
|
|
48
52
|
}
|
|
53
|
+
_registerSyncedMetaBridgeIfReady() {
|
|
54
|
+
if (this._syncedMetaBridgeRegistered ||
|
|
55
|
+
!this._netManager ||
|
|
56
|
+
!this._blipsManager ||
|
|
57
|
+
!this._colshapesManager ||
|
|
58
|
+
!this._markersManager ||
|
|
59
|
+
!this._objectsManager ||
|
|
60
|
+
!this._pedsManager ||
|
|
61
|
+
!this._playersManager ||
|
|
62
|
+
!this._vehiclesManager) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
new CCMPSyncedMetaBridge(this._netManager.events, {
|
|
66
|
+
blips: this._blipsManager,
|
|
67
|
+
colshapes: this._colshapesManager,
|
|
68
|
+
markers: this._markersManager,
|
|
69
|
+
objects: this._objectsManager,
|
|
70
|
+
peds: this._pedsManager,
|
|
71
|
+
players: this._playersManager,
|
|
72
|
+
vehicles: this._vehiclesManager,
|
|
73
|
+
}).register();
|
|
74
|
+
this._syncedMetaBridgeRegistered = true;
|
|
75
|
+
}
|
|
49
76
|
createBlipsManager() {
|
|
50
|
-
|
|
77
|
+
const netManager = this._requireNetManager("createBlipsManager");
|
|
78
|
+
this._blipsManager = new CCMPBlipsManager(netManager.events);
|
|
79
|
+
this._registerSyncedMetaBridgeIfReady();
|
|
80
|
+
return this._blipsManager;
|
|
51
81
|
}
|
|
52
82
|
createColshapesManager() {
|
|
53
|
-
|
|
83
|
+
const netManager = this._requireNetManager("createColshapesManager");
|
|
84
|
+
this._colshapesManager = new CCMPColshapesManager(netManager.events);
|
|
85
|
+
this._registerSyncedMetaBridgeIfReady();
|
|
86
|
+
return this._colshapesManager;
|
|
54
87
|
}
|
|
55
88
|
createMarkersManager() {
|
|
56
|
-
|
|
89
|
+
const netManager = this._requireNetManager("createMarkersManager");
|
|
90
|
+
this._markersManager = new CCMPMarkersManager(netManager.events);
|
|
91
|
+
this._registerSyncedMetaBridgeIfReady();
|
|
92
|
+
return this._markersManager;
|
|
57
93
|
}
|
|
58
94
|
createObjectsManager() {
|
|
59
|
-
|
|
95
|
+
const netManager = this._requireNetManager("createObjectsManager");
|
|
96
|
+
this._objectsManager = new CCMPObjectsManager(netManager.events);
|
|
97
|
+
this._registerSyncedMetaBridgeIfReady();
|
|
98
|
+
return this._objectsManager;
|
|
60
99
|
}
|
|
61
100
|
createPedsManager() {
|
|
62
|
-
|
|
101
|
+
const netManager = this._requireNetManager("createPedsManager");
|
|
102
|
+
this._pedsManager = new CCMPPedsManager(netManager.events);
|
|
103
|
+
this._registerSyncedMetaBridgeIfReady();
|
|
104
|
+
return this._pedsManager;
|
|
63
105
|
}
|
|
64
106
|
createPlayersManager() {
|
|
65
107
|
const netManager = this._requireNetManager("createPlayersManager");
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
// — для эмиссии `rm::syncedMetaChange` (на который уже подписан
|
|
70
|
-
// `CCMPDataHandler`, инстанцированный в `CCMPNetManager`).
|
|
71
|
-
new CCMPSyncedMetaBridge(netManager.events, playersManager).register();
|
|
72
|
-
return playersManager;
|
|
108
|
+
this._playersManager = new CCMPPlayersManager(netManager.events);
|
|
109
|
+
this._registerSyncedMetaBridgeIfReady();
|
|
110
|
+
return this._playersManager;
|
|
73
111
|
}
|
|
74
112
|
createUtilsManager() {
|
|
75
113
|
return new CCMPUtilsManager();
|
|
76
114
|
}
|
|
77
115
|
createVehiclesManager() {
|
|
78
|
-
|
|
116
|
+
this._vehiclesManager = new CCMPVehiclesManager();
|
|
117
|
+
this._registerSyncedMetaBridgeIfReady();
|
|
118
|
+
return this._vehiclesManager;
|
|
79
119
|
}
|
|
80
120
|
createBrowserManager() {
|
|
81
121
|
return new CCMPBrowserManager();
|
|
@@ -1,26 +1,6 @@
|
|
|
1
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
2
|
export declare class CCMPChatManager implements IChatManager {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
show(state: boolean): void;
|
|
3
|
+
activate(_state: boolean): void;
|
|
4
|
+
show(_state: boolean): void;
|
|
24
5
|
push(text: string): void;
|
|
25
|
-
private _warnOnce;
|
|
26
6
|
}
|
|
@@ -1,41 +1,13 @@
|
|
|
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
1
|
export class CCMPChatManager {
|
|
20
|
-
|
|
21
|
-
|
|
2
|
+
activate(_state) {
|
|
3
|
+
void _state;
|
|
4
|
+
// CCMP currently does not expose chat activation controls to JS.
|
|
22
5
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
show(state) {
|
|
27
|
-
this._warnOnce("show", state);
|
|
6
|
+
show(_state) {
|
|
7
|
+
void _state;
|
|
8
|
+
// CCMP currently does not expose chat visibility controls to JS.
|
|
28
9
|
}
|
|
29
10
|
push(text) {
|
|
30
11
|
ccmp.notify(text);
|
|
31
12
|
}
|
|
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
13
|
}
|
|
@@ -1,23 +1,5 @@
|
|
|
1
1
|
import { type IStorageManager } from "../../common/storage/IStorageManager";
|
|
2
|
-
/**
|
|
3
|
-
* In-memory реализация `IStorageManager` под CCMP.
|
|
4
|
-
*
|
|
5
|
-
* RageMP даёт `mp.storage.data` — персистентное JSON-K/V на диске между
|
|
6
|
-
* сессиями. У CCMP нативного аналога client-side storage пока нет. Этот
|
|
7
|
-
* MVP — обычный `Map` в памяти процесса:
|
|
8
|
-
* - Данные доступны в рамках одной сессии.
|
|
9
|
-
* - Не переживают переподключение/перезапуск игры.
|
|
10
|
-
*
|
|
11
|
-
* Этого достаточно для `CacheController` геймода: пустой кэш заставит
|
|
12
|
-
* перезапросить данные с сервера, чуть менее эффективно но функционально.
|
|
13
|
-
*
|
|
14
|
-
* Долгосрочно: добавить persistent storage в CCMP-клиент (Rust) — файл в
|
|
15
|
-
* `%APPDATA%/ccmp/storage/<server>.json` через `Deno.core.ops`, тогда
|
|
16
|
-
* заменить этот класс на адаптер к ops.
|
|
17
|
-
*/
|
|
18
2
|
export declare class CCMPStorageManager implements IStorageManager {
|
|
19
|
-
private readonly _data;
|
|
20
|
-
constructor();
|
|
21
3
|
getData<T>(key: string): T | null;
|
|
22
4
|
setData<T>(key: string, value: T): void;
|
|
23
5
|
removeData(key: string): void;
|
|
@@ -1,46 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory реализация `IStorageManager` под CCMP.
|
|
3
|
-
*
|
|
4
|
-
* RageMP даёт `mp.storage.data` — персистентное JSON-K/V на диске между
|
|
5
|
-
* сессиями. У CCMP нативного аналога client-side storage пока нет. Этот
|
|
6
|
-
* MVP — обычный `Map` в памяти процесса:
|
|
7
|
-
* - Данные доступны в рамках одной сессии.
|
|
8
|
-
* - Не переживают переподключение/перезапуск игры.
|
|
9
|
-
*
|
|
10
|
-
* Этого достаточно для `CacheController` геймода: пустой кэш заставит
|
|
11
|
-
* перезапросить данные с сервера, чуть менее эффективно но функционально.
|
|
12
|
-
*
|
|
13
|
-
* Долгосрочно: добавить persistent storage в CCMP-клиент (Rust) — файл в
|
|
14
|
-
* `%APPDATA%/ccmp/storage/<server>.json` через `Deno.core.ops`, тогда
|
|
15
|
-
* заменить этот класс на адаптер к ops.
|
|
16
|
-
*/
|
|
17
1
|
export class CCMPStorageManager {
|
|
18
|
-
constructor() {
|
|
19
|
-
this._data = new Map();
|
|
20
|
-
console.warn("[rock-mod] CCMPStorageManager uses in-memory storage; data will not persist between sessions");
|
|
21
|
-
}
|
|
22
2
|
getData(key) {
|
|
23
|
-
|
|
24
|
-
if (!this._data.has(key)) {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
return (_a = this._data.get(key)) !== null && _a !== void 0 ? _a : null;
|
|
3
|
+
return ccmp.storage.getItem(key);
|
|
28
4
|
}
|
|
29
5
|
setData(key, value) {
|
|
30
|
-
|
|
6
|
+
ccmp.storage.setItem(key, value);
|
|
31
7
|
}
|
|
32
8
|
removeData(key) {
|
|
33
|
-
|
|
9
|
+
ccmp.storage.removeItem(key);
|
|
34
10
|
}
|
|
35
11
|
clearData(prefix) {
|
|
36
|
-
|
|
37
|
-
this._data.clear();
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
for (const key of [...this._data.keys()]) {
|
|
41
|
-
if (key.startsWith(prefix)) {
|
|
42
|
-
this._data.delete(key);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
12
|
+
ccmp.storage.clear(prefix);
|
|
45
13
|
}
|
|
46
14
|
}
|
|
@@ -1,34 +1,6 @@
|
|
|
1
1
|
import { type IUiManager } from "../../common/ui/IUiManager";
|
|
2
2
|
import { type IVector3D } from "../../../../shared/common/utils";
|
|
3
|
-
/**
|
|
4
|
-
* Реализация `IUiManager` под CCMP. Большинство методов — прямой passthrough
|
|
5
|
-
* к `ccmp.natives.hud.*` (cрезом GTA V нативов HUD-намespace'а).
|
|
6
|
-
*
|
|
7
|
-
* **Hot path:** `hideHudComponentThisFrame(componentIndex)` вызывается каждый
|
|
8
|
-
* render-tick из `HudService.render` → `_hideHudComponents`. CCMP-native —
|
|
9
|
-
* синхронный V8-op, стоимость незначительная.
|
|
10
|
-
*
|
|
11
|
-
* ### Пробелы в CCMP-нативах
|
|
12
|
-
*
|
|
13
|
-
* `getLabelText(labelName)` — GTA V натив `_GET_LABEL_TEXT` (0x7B5280EBA9840C72)
|
|
14
|
-
* **не экспонирован** в CCMP-биндингах (см. `@classic-mp/types/natives`).
|
|
15
|
-
* Этот натив резолвит локализационный label из game GXT-таблиц — без него
|
|
16
|
-
* мы не можем достать перевод. Возвращаем сам `labelName` как fallback и
|
|
17
|
-
* один раз варнём в консоль — UI-консьюмер (скорее всего, что-то вроде
|
|
18
|
-
* weapon-display или street-name) получит непереведённый ключ, что лучше
|
|
19
|
-
* пустой строки или падения.
|
|
20
|
-
*
|
|
21
|
-
* TODO: при появлении `getLabelText` в `@classic-mp/types/natives.hud` или
|
|
22
|
-
* `natives.localization` — заменить fallback на реальный вызов.
|
|
23
|
-
*
|
|
24
|
-
* ### `deleteWaypoint` под CCMP
|
|
25
|
-
*
|
|
26
|
-
* RageMP-натив `deleteWaypoint()` — алиас для `SET_WAYPOINT_OFF` (
|
|
27
|
-
* `0xA7E4E2D361C2627F`). CCMP экспонирует его как `setWaypointOff`.
|
|
28
|
-
*/
|
|
29
3
|
export declare class CCMPUiManager implements IUiManager {
|
|
30
|
-
/** Глобальный набор для one-time варнингов, чтобы не флудить лог. */
|
|
31
|
-
private static readonly _warnedMethods;
|
|
32
4
|
getStreetNameFromHashKey(hash: number): string;
|
|
33
5
|
getLabelText(labelName: string): string;
|
|
34
6
|
hideHudComponentThisFrame(componentIndex: number): void;
|
|
@@ -37,5 +9,4 @@ export declare class CCMPUiManager implements IUiManager {
|
|
|
37
9
|
setWaypoint(x: number, y: number): void;
|
|
38
10
|
deleteWaypoint(): void;
|
|
39
11
|
getBlipInfoIdCoord(blip: number): IVector3D;
|
|
40
|
-
private static _warnOnce;
|
|
41
12
|
}
|
|
@@ -1,40 +1,15 @@
|
|
|
1
1
|
/// <reference types="@classic-mp/types/client" />
|
|
2
2
|
import { Vector3D } from "../../../../shared/common/utils";
|
|
3
|
-
/**
|
|
4
|
-
* Реализация `IUiManager` под CCMP. Большинство методов — прямой passthrough
|
|
5
|
-
* к `ccmp.natives.hud.*` (cрезом GTA V нативов HUD-намespace'а).
|
|
6
|
-
*
|
|
7
|
-
* **Hot path:** `hideHudComponentThisFrame(componentIndex)` вызывается каждый
|
|
8
|
-
* render-tick из `HudService.render` → `_hideHudComponents`. CCMP-native —
|
|
9
|
-
* синхронный V8-op, стоимость незначительная.
|
|
10
|
-
*
|
|
11
|
-
* ### Пробелы в CCMP-нативах
|
|
12
|
-
*
|
|
13
|
-
* `getLabelText(labelName)` — GTA V натив `_GET_LABEL_TEXT` (0x7B5280EBA9840C72)
|
|
14
|
-
* **не экспонирован** в CCMP-биндингах (см. `@classic-mp/types/natives`).
|
|
15
|
-
* Этот натив резолвит локализационный label из game GXT-таблиц — без него
|
|
16
|
-
* мы не можем достать перевод. Возвращаем сам `labelName` как fallback и
|
|
17
|
-
* один раз варнём в консоль — UI-консьюмер (скорее всего, что-то вроде
|
|
18
|
-
* weapon-display или street-name) получит непереведённый ключ, что лучше
|
|
19
|
-
* пустой строки или падения.
|
|
20
|
-
*
|
|
21
|
-
* TODO: при появлении `getLabelText` в `@classic-mp/types/natives.hud` или
|
|
22
|
-
* `natives.localization` — заменить fallback на реальный вызов.
|
|
23
|
-
*
|
|
24
|
-
* ### `deleteWaypoint` под CCMP
|
|
25
|
-
*
|
|
26
|
-
* RageMP-натив `deleteWaypoint()` — алиас для `SET_WAYPOINT_OFF` (
|
|
27
|
-
* `0xA7E4E2D361C2627F`). CCMP экспонирует его как `setWaypointOff`.
|
|
28
|
-
*/
|
|
29
3
|
export class CCMPUiManager {
|
|
30
4
|
getStreetNameFromHashKey(hash) {
|
|
31
5
|
return ccmp.natives.hud.getStreetNameFromHashKey(hash);
|
|
32
6
|
}
|
|
33
7
|
getLabelText(labelName) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
8
|
+
if (!ccmp.natives.hud.doesTextLabelExist(labelName)) {
|
|
9
|
+
return labelName;
|
|
10
|
+
}
|
|
11
|
+
const text = ccmp.natives.hud.getFilenameForAudioConversation(labelName);
|
|
12
|
+
return text && text !== "NULL" ? text : labelName;
|
|
38
13
|
}
|
|
39
14
|
hideHudComponentThisFrame(componentIndex) {
|
|
40
15
|
ccmp.natives.hud.hideHudComponentThisFrame(componentIndex);
|
|
@@ -49,21 +24,10 @@ export class CCMPUiManager {
|
|
|
49
24
|
ccmp.natives.hud.setNewWaypoint(x, y);
|
|
50
25
|
}
|
|
51
26
|
deleteWaypoint() {
|
|
52
|
-
// RageMP `deleteWaypoint()` === GTA `SET_WAYPOINT_OFF`. CCMP экспонирует
|
|
53
|
-
// под именем `setWaypointOff`.
|
|
54
27
|
ccmp.natives.hud.setWaypointOff();
|
|
55
28
|
}
|
|
56
29
|
getBlipInfoIdCoord(blip) {
|
|
57
30
|
const { x, y, z } = ccmp.natives.hud.getBlipInfoIdCoord(blip);
|
|
58
31
|
return new Vector3D(x, y, z);
|
|
59
32
|
}
|
|
60
|
-
static _warnOnce(method, message) {
|
|
61
|
-
if (CCMPUiManager._warnedMethods.has(method)) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
CCMPUiManager._warnedMethods.add(method);
|
|
65
|
-
console.warn(message);
|
|
66
|
-
}
|
|
67
33
|
}
|
|
68
|
-
/** Глобальный набор для one-time варнингов, чтобы не флудить лог. */
|
|
69
|
-
CCMPUiManager._warnedMethods = new Set();
|
|
@@ -2,13 +2,6 @@ import { type INetManager } from "../common/INetManager";
|
|
|
2
2
|
import { CCMPDataHandler } from "./dataHandler/CCMPDataHandler";
|
|
3
3
|
import { CCMPEventsManager } from "./events/CCMPEventsManager";
|
|
4
4
|
import { CCMPRPCManager } from "./rpc/CCMPRPCManager";
|
|
5
|
-
/**
|
|
6
|
-
* Корневой сетевой менеджер CCMP-клиента.
|
|
7
|
-
*
|
|
8
|
-
* Симметричен `RageNetManager` (`src/client/net/ragemp/RageNetManager.ts`), но
|
|
9
|
-
* без `IEntityPoolRouter` — CCMP entity pool ещё не реализован, а events+RPC
|
|
10
|
-
* milestone от него не зависит.
|
|
11
|
-
*/
|
|
12
5
|
export declare class CCMPNetManager implements INetManager {
|
|
13
6
|
private readonly _eventsManager;
|
|
14
7
|
private readonly _rpcManager;
|
|
@@ -4,13 +4,6 @@ import { CCMPEventsBridge } from "./events/CCMPEventsBridge";
|
|
|
4
4
|
import { CCMPEventsManager } from "./events/CCMPEventsManager";
|
|
5
5
|
import { CCMPRenderTicker } from "./events/CCMPRenderTicker";
|
|
6
6
|
import { CCMPRPCManager } from "./rpc/CCMPRPCManager";
|
|
7
|
-
/**
|
|
8
|
-
* Корневой сетевой менеджер CCMP-клиента.
|
|
9
|
-
*
|
|
10
|
-
* Симметричен `RageNetManager` (`src/client/net/ragemp/RageNetManager.ts`), но
|
|
11
|
-
* без `IEntityPoolRouter` — CCMP entity pool ещё не реализован, а events+RPC
|
|
12
|
-
* milestone от него не зависит.
|
|
13
|
-
*/
|
|
14
7
|
export class CCMPNetManager {
|
|
15
8
|
get events() {
|
|
16
9
|
return this._eventsManager;
|
|
@@ -22,29 +15,10 @@ export class CCMPNetManager {
|
|
|
22
15
|
return this._dataHandler;
|
|
23
16
|
}
|
|
24
17
|
constructor() {
|
|
25
|
-
// Прямой ping на сервер — не зависит от console-обёртки и других
|
|
26
|
-
// менеджеров. Серверная сторона (`CCMPNetManager`) логирует через
|
|
27
|
-
// `rm::clientLog` handler с уровнем info. Если в серверном stdout не
|
|
28
|
-
// видно "[client:<id>] [rock-mod] CCMP client net manager constructed" —
|
|
29
|
-
// значит client-бандл не загрузился / не дошёл до этого места.
|
|
30
|
-
try {
|
|
31
|
-
ccmp.emitServer("rm::clientLog", {
|
|
32
|
-
level: "info",
|
|
33
|
-
args: ["[rock-mod] CCMP client net manager constructed"],
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
catch (_a) {
|
|
37
|
-
// Если сетевой канал не готов, эта диагностическая строка теряется.
|
|
38
|
-
}
|
|
39
|
-
// Console forwarder ставим первым: чтобы любые `console.*` из
|
|
40
|
-
// конструкторов других менеджеров/модулей уже зеркалились на сервер.
|
|
41
18
|
this._consoleForwarder = new CCMPConsoleForwarder();
|
|
42
19
|
this._consoleForwarder.install();
|
|
43
20
|
this._eventsManager = new CCMPEventsManager();
|
|
44
21
|
this._rpcManager = new CCMPRPCManager();
|
|
45
|
-
// DataHandler сначала, чтобы он успел подписаться на internal-bus до
|
|
46
|
-
// первых эмиссий `rm::syncedMetaChange` от `CCMPSyncedMetaBridge`
|
|
47
|
-
// (создаётся позже в `CCMPManagersFactory.createPlayersManager`).
|
|
48
22
|
this._dataHandler = new CCMPDataHandler(this._eventsManager);
|
|
49
23
|
this._bridge = new CCMPEventsBridge(this._eventsManager);
|
|
50
24
|
this._renderTicker = new CCMPRenderTicker();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type IBaseObject } from "../../../entities";
|
|
2
2
|
import { type IDataHandler } from "../../common/dataHandler/IDataHandler";
|
|
3
3
|
import { type CCMPEventsManager } from "../events/CCMPEventsManager";
|
|
4
|
-
type DataHandlerCallback = (
|
|
4
|
+
type DataHandlerCallback = (object: IBaseObject, value: unknown, oldValue?: unknown) => void;
|
|
5
5
|
/**
|
|
6
6
|
* Реализация `IDataHandler` под CCMP поверх `rm::syncedMetaChange`.
|
|
7
7
|
*
|
|
@@ -16,14 +16,14 @@ export class CCMPDataHandler {
|
|
|
16
16
|
constructor(events) {
|
|
17
17
|
this._handlers = new Map();
|
|
18
18
|
events.onInternal({
|
|
19
|
-
[ClientInternalEventName.SyncedMetaChange]: (
|
|
19
|
+
[ClientInternalEventName.SyncedMetaChange]: (object, key, value, oldValue) => {
|
|
20
20
|
const callbacks = this._handlers.get(key);
|
|
21
21
|
if (!callbacks || callbacks.length === 0) {
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
for (const callback of [...callbacks]) {
|
|
25
25
|
try {
|
|
26
|
-
callback(
|
|
26
|
+
callback(object, value, oldValue);
|
|
27
27
|
}
|
|
28
28
|
catch (error) {
|
|
29
29
|
console.error(`[CCMPDataHandler] callback for key "${key}" failed:`, error);
|
|
@@ -8,7 +8,9 @@ import { type CCMPEventsManager } from "./CCMPEventsManager";
|
|
|
8
8
|
* Rock-Mod `CCMPPlayer` instance before emitting internal `rm::*` events.
|
|
9
9
|
*/
|
|
10
10
|
export declare class CCMPEventsBridge implements IEventsBridge {
|
|
11
|
-
|
|
11
|
+
private readonly _events;
|
|
12
|
+
constructor(_events: CCMPEventsManager);
|
|
12
13
|
registerRawEvents(): void;
|
|
13
14
|
registerServerEvents(): void;
|
|
15
|
+
private _resolveVehicleEventPayload;
|
|
14
16
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ClientInternalEventName } from "../../../net/common/events/types";
|
|
2
|
+
import { RockMod } from "../../../RockMod";
|
|
1
3
|
/**
|
|
2
4
|
* Legacy bridge slot for CCMP raw events.
|
|
3
5
|
*
|
|
@@ -6,14 +8,42 @@
|
|
|
6
8
|
* Rock-Mod `CCMPPlayer` instance before emitting internal `rm::*` events.
|
|
7
9
|
*/
|
|
8
10
|
export class CCMPEventsBridge {
|
|
9
|
-
constructor(
|
|
10
|
-
|
|
11
|
+
constructor(_events) {
|
|
12
|
+
this._events = _events;
|
|
11
13
|
}
|
|
12
14
|
registerRawEvents() {
|
|
13
|
-
|
|
15
|
+
this._events.register("playerEnterVehicle", (payload) => {
|
|
16
|
+
const event = this._resolveVehicleEventPayload(payload);
|
|
17
|
+
if (!event)
|
|
18
|
+
return;
|
|
19
|
+
this._events.emitInternal(ClientInternalEventName.PlayerEnterVehicle, event.vehicle, event.seat);
|
|
20
|
+
});
|
|
21
|
+
this._events.register("playerLeaveVehicle", (payload) => {
|
|
22
|
+
const event = this._resolveVehicleEventPayload(payload);
|
|
23
|
+
if (!event)
|
|
24
|
+
return;
|
|
25
|
+
this._events.emitInternal(ClientInternalEventName.PlayerLeaveVehicle, event.vehicle, event.seat);
|
|
26
|
+
});
|
|
14
27
|
}
|
|
15
28
|
registerServerEvents() {
|
|
16
29
|
// No-op: ранее тут жил handler для cooperation `rm::clientReady`-ответа.
|
|
17
30
|
// Теперь это responsibility `CCMPPlayersManager`.
|
|
18
31
|
}
|
|
32
|
+
_resolveVehicleEventPayload(payload) {
|
|
33
|
+
var _a;
|
|
34
|
+
const ccmpPayload = payload;
|
|
35
|
+
const ccmpVehicleId = (_a = ccmpPayload === null || ccmpPayload === void 0 ? void 0 : ccmpPayload.vehicle) === null || _a === void 0 ? void 0 : _a.id;
|
|
36
|
+
if (typeof ccmpVehicleId !== "number" || !Number.isFinite(ccmpVehicleId)) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const rawSeat = Number(ccmpPayload === null || ccmpPayload === void 0 ? void 0 : ccmpPayload.seat);
|
|
40
|
+
const seat = Number.isFinite(rawSeat) ? rawSeat : -1;
|
|
41
|
+
try {
|
|
42
|
+
const vehicle = RockMod.instance.vehicles.registerById(ccmpVehicleId);
|
|
43
|
+
return { vehicle, seat };
|
|
44
|
+
}
|
|
45
|
+
catch (_b) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
19
49
|
}
|