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
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { BaseObjectType } from "../../../../shared/entities";
|
|
2
|
+
import { Vector3D } from "../../../../shared/common/utils";
|
|
3
|
+
export class CCMPVehicle {
|
|
4
|
+
constructor(_ccmpVehicle, _onDestroy = () => { }) {
|
|
5
|
+
this._ccmpVehicle = _ccmpVehicle;
|
|
6
|
+
this._onDestroy = _onDestroy;
|
|
7
|
+
this._destroyed = false;
|
|
8
|
+
}
|
|
9
|
+
get id() {
|
|
10
|
+
return this._ccmpVehicle.id;
|
|
11
|
+
}
|
|
12
|
+
get remoteId() {
|
|
13
|
+
return this._ccmpVehicle.remoteId;
|
|
14
|
+
}
|
|
15
|
+
get type() {
|
|
16
|
+
return BaseObjectType.Vehicle;
|
|
17
|
+
}
|
|
18
|
+
get isExists() {
|
|
19
|
+
if (this._destroyed)
|
|
20
|
+
return false;
|
|
21
|
+
if (this._ccmpVehicle.isRemote)
|
|
22
|
+
return this._getRemoteVehicleExists();
|
|
23
|
+
return this._ccmpVehicle.isExists;
|
|
24
|
+
}
|
|
25
|
+
get handle() {
|
|
26
|
+
return this._normalizeHandle(this._ccmpVehicle.handle);
|
|
27
|
+
}
|
|
28
|
+
destroy() {
|
|
29
|
+
if (this._destroyed)
|
|
30
|
+
return;
|
|
31
|
+
this._destroyed = true;
|
|
32
|
+
this._ccmpVehicle.destroy();
|
|
33
|
+
this._onDestroy(this);
|
|
34
|
+
}
|
|
35
|
+
get position() {
|
|
36
|
+
const { x, y, z } = this._ccmpVehicle.position;
|
|
37
|
+
return new Vector3D(x, y, z);
|
|
38
|
+
}
|
|
39
|
+
get dimension() {
|
|
40
|
+
return this._ccmpVehicle.dimension;
|
|
41
|
+
}
|
|
42
|
+
setPosition(value) {
|
|
43
|
+
this._ccmpVehicle.setPosition(value);
|
|
44
|
+
}
|
|
45
|
+
setDimension(value) {
|
|
46
|
+
this._ccmpVehicle.setDimension(value);
|
|
47
|
+
}
|
|
48
|
+
setCoords(xPos, yPos, zPos, xAxis, yAxis, zAxis, clearArea) {
|
|
49
|
+
this._ccmpVehicle.setCoords(xPos, yPos, zPos, xAxis, yAxis, zAxis, clearArea);
|
|
50
|
+
}
|
|
51
|
+
get model() {
|
|
52
|
+
return this._ccmpVehicle.model;
|
|
53
|
+
}
|
|
54
|
+
get heading() {
|
|
55
|
+
return this._ccmpVehicle.heading;
|
|
56
|
+
}
|
|
57
|
+
setHeading(heading) {
|
|
58
|
+
this._ccmpVehicle.setHeading(heading);
|
|
59
|
+
}
|
|
60
|
+
setModel(value) {
|
|
61
|
+
this._ccmpVehicle.setModel(value);
|
|
62
|
+
}
|
|
63
|
+
get rotation() {
|
|
64
|
+
const { x, y, z } = this._ccmpVehicle.rotation;
|
|
65
|
+
return new Vector3D(x, y, z);
|
|
66
|
+
}
|
|
67
|
+
get forwardVector() {
|
|
68
|
+
const { x, y, z } = this._ccmpVehicle.forwardVector;
|
|
69
|
+
return new Vector3D(x, y, z);
|
|
70
|
+
}
|
|
71
|
+
setRotation(value) {
|
|
72
|
+
this._ccmpVehicle.setRotation(value);
|
|
73
|
+
}
|
|
74
|
+
freezePosition(freeze) {
|
|
75
|
+
this._ccmpVehicle.freezePosition(freeze);
|
|
76
|
+
}
|
|
77
|
+
setCollision(collision, keepPhysics) {
|
|
78
|
+
this._ccmpVehicle.setCollision(collision, keepPhysics);
|
|
79
|
+
}
|
|
80
|
+
setInvincible(invincible) {
|
|
81
|
+
this._ccmpVehicle.setInvincible(invincible);
|
|
82
|
+
}
|
|
83
|
+
setVisible(visible) {
|
|
84
|
+
this._ccmpVehicle.setVisible(visible);
|
|
85
|
+
}
|
|
86
|
+
setAlpha(alpha) {
|
|
87
|
+
this._ccmpVehicle.setAlpha(alpha);
|
|
88
|
+
}
|
|
89
|
+
get alpha() {
|
|
90
|
+
return this._ccmpVehicle.alpha;
|
|
91
|
+
}
|
|
92
|
+
resetAlpha() {
|
|
93
|
+
this._ccmpVehicle.resetAlpha();
|
|
94
|
+
}
|
|
95
|
+
getOffsetFromInWorldCoords(offsetX, offsetY, offsetZ) {
|
|
96
|
+
const { x, y, z } = this._ccmpVehicle.getOffsetFromInWorldCoords(offsetX, offsetY, offsetZ);
|
|
97
|
+
return new Vector3D(x, y, z);
|
|
98
|
+
}
|
|
99
|
+
getBoneIndexByName(boneName) {
|
|
100
|
+
return this._ccmpVehicle.getBoneIndexByName(boneName);
|
|
101
|
+
}
|
|
102
|
+
getWorldPositionOfBone(boneIndex) {
|
|
103
|
+
const { x, y, z } = this._ccmpVehicle.getWorldPositionOfBone(boneIndex);
|
|
104
|
+
return new Vector3D(x, y, z);
|
|
105
|
+
}
|
|
106
|
+
getVariable(name) {
|
|
107
|
+
const remoteId = this.remoteId;
|
|
108
|
+
if (remoteId === null)
|
|
109
|
+
return null;
|
|
110
|
+
const value = ccmp.entities.getStreamSyncedMeta(ccmp.entities.ENTITY_TYPE.Vehicle, remoteId, name);
|
|
111
|
+
return value === undefined ? null : value;
|
|
112
|
+
}
|
|
113
|
+
getSyncedMeta(key) {
|
|
114
|
+
const remoteId = this.remoteId;
|
|
115
|
+
if (remoteId === null)
|
|
116
|
+
return undefined;
|
|
117
|
+
return ccmp.entities.getStreamSyncedMeta(ccmp.entities.ENTITY_TYPE.Vehicle, remoteId, key);
|
|
118
|
+
}
|
|
119
|
+
hasSyncedMeta(key) {
|
|
120
|
+
const remoteId = this.remoteId;
|
|
121
|
+
if (remoteId === null)
|
|
122
|
+
return false;
|
|
123
|
+
return ccmp.entities.hasStreamSyncedMeta(ccmp.entities.ENTITY_TYPE.Vehicle, remoteId, key);
|
|
124
|
+
}
|
|
125
|
+
getSyncedMetaKeys() {
|
|
126
|
+
const remoteId = this.remoteId;
|
|
127
|
+
if (remoteId === null)
|
|
128
|
+
return [];
|
|
129
|
+
return ccmp.entities.getStreamSyncedMetaKeys(ccmp.entities.ENTITY_TYPE.Vehicle, remoteId);
|
|
130
|
+
}
|
|
131
|
+
attachToEntity(target, boneIndex, offset, rotation, p9, useSoftPinning, collision, isPed, vertexIndex, fixedRot) {
|
|
132
|
+
this._ccmpVehicle.attachToEntity(target, boneIndex, offset, rotation, p9, useSoftPinning, collision, isPed, vertexIndex, fixedRot);
|
|
133
|
+
}
|
|
134
|
+
detach(useDetachVelocity, collision) {
|
|
135
|
+
this._ccmpVehicle.detach(useDetachVelocity, collision);
|
|
136
|
+
}
|
|
137
|
+
getSpeed() {
|
|
138
|
+
return this._ccmpVehicle.getSpeed();
|
|
139
|
+
}
|
|
140
|
+
isPlayingAnim(dictionary, name, taskFlag) {
|
|
141
|
+
return this._ccmpVehicle.isPlayingAnim(dictionary, name, taskFlag);
|
|
142
|
+
}
|
|
143
|
+
get bodyHealth() {
|
|
144
|
+
return this._ccmpVehicle.bodyHealth;
|
|
145
|
+
}
|
|
146
|
+
get engineHealth() {
|
|
147
|
+
return this._ccmpVehicle.engineHealth;
|
|
148
|
+
}
|
|
149
|
+
get numberPlate() {
|
|
150
|
+
return this._ccmpVehicle.numberPlate;
|
|
151
|
+
}
|
|
152
|
+
get isDead() {
|
|
153
|
+
return this._ccmpVehicle.isDead;
|
|
154
|
+
}
|
|
155
|
+
setBodyHealth(value) {
|
|
156
|
+
this._ccmpVehicle.setBodyHealth(value);
|
|
157
|
+
}
|
|
158
|
+
setEngineHealth(value) {
|
|
159
|
+
this._ccmpVehicle.setEngineHealth(value);
|
|
160
|
+
}
|
|
161
|
+
setNumberPlate(value) {
|
|
162
|
+
this._ccmpVehicle.setNumberPlate(value);
|
|
163
|
+
}
|
|
164
|
+
explode() {
|
|
165
|
+
this._ccmpVehicle.explode();
|
|
166
|
+
}
|
|
167
|
+
getPedInSeat(seat) {
|
|
168
|
+
return this._ccmpVehicle.getPedInSeat(seat);
|
|
169
|
+
}
|
|
170
|
+
setUndriveable(toggle) {
|
|
171
|
+
this._ccmpVehicle.setUndriveable(toggle);
|
|
172
|
+
}
|
|
173
|
+
get maxNumberOfPassengers() {
|
|
174
|
+
return this._ccmpVehicle.maxNumberOfPassengers;
|
|
175
|
+
}
|
|
176
|
+
get gear() {
|
|
177
|
+
return this._ccmpVehicle.gear;
|
|
178
|
+
}
|
|
179
|
+
get speed() {
|
|
180
|
+
return this._ccmpVehicle.speed;
|
|
181
|
+
}
|
|
182
|
+
get isEngineRunning() {
|
|
183
|
+
return this._ccmpVehicle.isEngineRunning;
|
|
184
|
+
}
|
|
185
|
+
setEngineOn(toggle, instantly, otherwise) {
|
|
186
|
+
this._ccmpVehicle.setEngineOn(toggle, instantly, otherwise);
|
|
187
|
+
}
|
|
188
|
+
get lightsState() {
|
|
189
|
+
return this._ccmpVehicle.lightsState;
|
|
190
|
+
}
|
|
191
|
+
get isLocked() {
|
|
192
|
+
return this._ccmpVehicle.isLocked;
|
|
193
|
+
}
|
|
194
|
+
setIsLocked(value) {
|
|
195
|
+
this._ccmpVehicle.setIsLocked(value);
|
|
196
|
+
}
|
|
197
|
+
setCustomPrimaryColour(color) {
|
|
198
|
+
this._ccmpVehicle.setCustomPrimaryColour(color);
|
|
199
|
+
}
|
|
200
|
+
setCustomSecondaryColour(color) {
|
|
201
|
+
this._ccmpVehicle.setCustomSecondaryColour(color);
|
|
202
|
+
}
|
|
203
|
+
get customPrimaryColour() {
|
|
204
|
+
return this._ccmpVehicle.customPrimaryColour;
|
|
205
|
+
}
|
|
206
|
+
get customSecondaryColour() {
|
|
207
|
+
return this._ccmpVehicle.customSecondaryColour;
|
|
208
|
+
}
|
|
209
|
+
setMod(modType, modIndex) {
|
|
210
|
+
this._ccmpVehicle.setMod(modType, modIndex);
|
|
211
|
+
}
|
|
212
|
+
getMod(modType) {
|
|
213
|
+
return this._ccmpVehicle.getMod(modType);
|
|
214
|
+
}
|
|
215
|
+
getNumMods(modType) {
|
|
216
|
+
return this._ccmpVehicle.getNumMods(modType);
|
|
217
|
+
}
|
|
218
|
+
setNeonLightEnabled(index, toggle) {
|
|
219
|
+
this._ccmpVehicle.setNeonLightEnabled(index, toggle);
|
|
220
|
+
}
|
|
221
|
+
setNeonLightsColour(color) {
|
|
222
|
+
this._ccmpVehicle.setNeonLightsColour(color);
|
|
223
|
+
}
|
|
224
|
+
setWindowTint(tintType) {
|
|
225
|
+
this._ccmpVehicle.setWindowTint(tintType);
|
|
226
|
+
}
|
|
227
|
+
get windowTint() {
|
|
228
|
+
return this._ccmpVehicle.windowTint;
|
|
229
|
+
}
|
|
230
|
+
setWheelType(wheelType) {
|
|
231
|
+
this._ccmpVehicle.setWheelType(wheelType);
|
|
232
|
+
}
|
|
233
|
+
get wheelType() {
|
|
234
|
+
return this._ccmpVehicle.wheelType;
|
|
235
|
+
}
|
|
236
|
+
setNumberPlateTextIndex(index) {
|
|
237
|
+
this._ccmpVehicle.setNumberPlateTextIndex(index);
|
|
238
|
+
}
|
|
239
|
+
get numberPlateTextIndex() {
|
|
240
|
+
return this._ccmpVehicle.numberPlateTextIndex;
|
|
241
|
+
}
|
|
242
|
+
setDoorOpen(doorIndex, loose, openInstantly) {
|
|
243
|
+
this._ccmpVehicle.setDoorOpen(doorIndex, loose, openInstantly);
|
|
244
|
+
}
|
|
245
|
+
setDoorShut(doorIndex, instantly) {
|
|
246
|
+
this._ccmpVehicle.setDoorShut(doorIndex, instantly);
|
|
247
|
+
}
|
|
248
|
+
setHandling(field, value) {
|
|
249
|
+
this._ccmpVehicle.setHandling(field, value);
|
|
250
|
+
}
|
|
251
|
+
getHandling(field) {
|
|
252
|
+
return this._ccmpVehicle.getHandling(field);
|
|
253
|
+
}
|
|
254
|
+
setEnginePowerMultiplier(value) {
|
|
255
|
+
this._ccmpVehicle.setEnginePowerMultiplier(value);
|
|
256
|
+
}
|
|
257
|
+
setEngineTorqueMultiplier(value) {
|
|
258
|
+
this._ccmpVehicle.setEngineTorqueMultiplier(value);
|
|
259
|
+
}
|
|
260
|
+
modifyTopSpeed(value) {
|
|
261
|
+
this._ccmpVehicle.modifyTopSpeed(value);
|
|
262
|
+
}
|
|
263
|
+
setCheatPowerIncrease(value) {
|
|
264
|
+
this._ccmpVehicle.setCheatPowerIncrease(value);
|
|
265
|
+
}
|
|
266
|
+
toggleMod(modType, toggle) {
|
|
267
|
+
this._ccmpVehicle.toggleMod(modType, toggle);
|
|
268
|
+
}
|
|
269
|
+
setTyreSmokeColor(r, g, b) {
|
|
270
|
+
this._ccmpVehicle.setTyreSmokeColor(r, g, b);
|
|
271
|
+
}
|
|
272
|
+
setModColor1(paintType, color, p3) {
|
|
273
|
+
this._ccmpVehicle.setModColor1(paintType, color, p3);
|
|
274
|
+
}
|
|
275
|
+
setExtraColours(pearlescentColor, wheelColor) {
|
|
276
|
+
this._ccmpVehicle.setExtraColours(pearlescentColor, wheelColor);
|
|
277
|
+
}
|
|
278
|
+
setHeadlightColor(colorIndex) {
|
|
279
|
+
this._ccmpVehicle.setHeadlightColor(colorIndex);
|
|
280
|
+
}
|
|
281
|
+
setDashboardColor(colorIndex) {
|
|
282
|
+
this._ccmpVehicle.setDashboardColor(colorIndex);
|
|
283
|
+
}
|
|
284
|
+
setInteriorColor(colorIndex) {
|
|
285
|
+
this._ccmpVehicle.setInteriorColor(colorIndex);
|
|
286
|
+
}
|
|
287
|
+
getMaxBraking() {
|
|
288
|
+
return this._ccmpVehicle.getMaxBraking();
|
|
289
|
+
}
|
|
290
|
+
getAcceleration() {
|
|
291
|
+
return this._ccmpVehicle.getAcceleration();
|
|
292
|
+
}
|
|
293
|
+
getMaxTraction() {
|
|
294
|
+
return this._ccmpVehicle.getMaxTraction();
|
|
295
|
+
}
|
|
296
|
+
getModelMaxSpeed() {
|
|
297
|
+
return this._ccmpVehicle.getModelMaxSpeed();
|
|
298
|
+
}
|
|
299
|
+
_normalizeHandle(value) {
|
|
300
|
+
const handle = Number(value);
|
|
301
|
+
return Number.isFinite(handle) && handle > 0 ? Math.trunc(handle) : 0;
|
|
302
|
+
}
|
|
303
|
+
_getRemoteVehicleExists() {
|
|
304
|
+
try {
|
|
305
|
+
return this._ccmpVehicle.isExists;
|
|
306
|
+
}
|
|
307
|
+
catch (_a) {
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
@@ -1,54 +1,11 @@
|
|
|
1
1
|
import { type IVehicle } from "../../common/vehicle/IVehicle";
|
|
2
2
|
import { type IVehicleCreateOptions, type IVehiclesManager } from "../../common/vehicle/IVehiclesManager";
|
|
3
3
|
import { type IWorldObjectsIterator } from "../../common/worldObject/IWorldObjectsIterator";
|
|
4
|
-
/**
|
|
5
|
-
* Реализация `IVehiclesManager` под CCMP — **пустой пул** + native helper.
|
|
6
|
-
*
|
|
7
|
-
* ### Почему пусто
|
|
8
|
-
*
|
|
9
|
-
* RageMP даёт `mp.vehicles.toArray()`/`mp.vehicles.at(id)` — JS-side pool из
|
|
10
|
-
* stream'нутых-в-радиус транспортных средств, заполняемый рантаймом. CCMP
|
|
11
|
-
* такого пула на client-side не экспонирует:
|
|
12
|
-
* - `ccmp.natives.vehicle.createVehicle` создаёт локальный handle без id /
|
|
13
|
-
* replication / managed lifecycle.
|
|
14
|
-
* - `ccmp.vehicles.*` (server-side) спавнит реплицируемые vehicle-сущности,
|
|
15
|
-
* но клиент видит их данные через game state, а не как managed-IVehicle-
|
|
16
|
-
* инстансы в JS-pool'е.
|
|
17
|
-
*
|
|
18
|
-
* Поэтому iterator всегда пустой, `find*` возвращает null, `get*` и `deleteById` кидают.
|
|
19
|
-
*
|
|
20
|
-
* ### Hot path: `iterator.all()` на каждый render-tick
|
|
21
|
-
*
|
|
22
|
-
* Геймод-консьюмер `VehiclePartsInteractionController.syncVehicleProximity` →
|
|
23
|
-
* `VehiclePartsInteractionService.syncState` → `VehicleService.getNearbyVehicles`
|
|
24
|
-
* → `VehicleRepository.getNearby` → `VehicleRepository.getAll` → `iterator.all()`.
|
|
25
|
-
* До этой реализации `VehiclesManager` был `createNotImplementedProxy`, и каждый
|
|
26
|
-
* frame падал `CCMPVehiclesManager.iterator.all: not implemented yet`. Теперь
|
|
27
|
-
* iterator возвращает пустой итератор — interaction-сервис тихо деградирует
|
|
28
|
-
* (нет vehicles в радиусе → нет UI-хинтов / интеракций).
|
|
29
|
-
*
|
|
30
|
-
* ### `create(...)` под CCMP
|
|
31
|
-
*
|
|
32
|
-
* Не реализован осознанно: `VehicleRepository.create(...)` в геймоде ожидает
|
|
33
|
-
* `IRockModVehicle` с id/remoteId/position/etc, а CCMP-натив `createVehicle`
|
|
34
|
-
* возвращает только handle без id-mapping'а. Для корректной поддержки нужен
|
|
35
|
-
* полноценный `CCMPVehicle`-класс и интеграция с server-side `ccmp.vehicles.*`
|
|
36
|
-
* — отдельная задача. Сейчас бросаем понятную ошибку.
|
|
37
|
-
*
|
|
38
|
-
* ### `getDisplayNameFromVehicleModel`
|
|
39
|
-
*
|
|
40
|
-
* Этот метод **реализован** — натив `getDisplayNameFromVehicleModel`
|
|
41
|
-
* (`0xB215AAC32D25D019`) экспонирован в `ccmp.natives.vehicle.*` и работает
|
|
42
|
-
* без vehicle-pool'а (принимает только modelHash, возвращает GXT-ключ или
|
|
43
|
-
* "CARNOTFOUND" для unknown-моделей).
|
|
44
|
-
*
|
|
45
|
-
* TODO: когда понадобится spawning vehicles из клиента (миссии, тестовые
|
|
46
|
-
* объекты) — реализовать через `ccmp.natives.vehicle.createVehicle` + локальный
|
|
47
|
-
* id-counter + `CCMPVehicle`-обёртку. Для синхронизированных vehicles нужна
|
|
48
|
-
* server-side фабрика с `ccmp.vehicles.create` и net-events для распространения
|
|
49
|
-
* id-mapping'а.
|
|
50
|
-
*/
|
|
51
4
|
export declare class CCMPVehiclesManager implements IVehiclesManager {
|
|
5
|
+
private readonly _vehicles;
|
|
6
|
+
private readonly _vehiclesByRemoteId;
|
|
7
|
+
private readonly _iterator;
|
|
8
|
+
constructor();
|
|
52
9
|
create(options: IVehicleCreateOptions): IVehicle;
|
|
53
10
|
getDisplayNameFromVehicleModel(modelHash: number): string;
|
|
54
11
|
syncWithMpPool(): void;
|
|
@@ -60,5 +17,11 @@ export declare class CCMPVehiclesManager implements IVehiclesManager {
|
|
|
60
17
|
getByRemoteID(remoteId: number): IVehicle;
|
|
61
18
|
deleteById(id: number): IVehicle;
|
|
62
19
|
get iterator(): IWorldObjectsIterator<IVehicle>;
|
|
63
|
-
private
|
|
20
|
+
private _register;
|
|
21
|
+
private _unregister;
|
|
22
|
+
private _findRegistered;
|
|
23
|
+
private _registerLifecycleEvents;
|
|
24
|
+
private _filter;
|
|
25
|
+
private _pruneDestroyed;
|
|
26
|
+
private _getNativeVehiclesApi;
|
|
64
27
|
}
|
|
@@ -1,105 +1,184 @@
|
|
|
1
1
|
/// <reference types="@classic-mp/types/client" />
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
* ### Почему пусто
|
|
7
|
-
*
|
|
8
|
-
* RageMP даёт `mp.vehicles.toArray()`/`mp.vehicles.at(id)` — JS-side pool из
|
|
9
|
-
* stream'нутых-в-радиус транспортных средств, заполняемый рантаймом. CCMP
|
|
10
|
-
* такого пула на client-side не экспонирует:
|
|
11
|
-
* - `ccmp.natives.vehicle.createVehicle` создаёт локальный handle без id /
|
|
12
|
-
* replication / managed lifecycle.
|
|
13
|
-
* - `ccmp.vehicles.*` (server-side) спавнит реплицируемые vehicle-сущности,
|
|
14
|
-
* но клиент видит их данные через game state, а не как managed-IVehicle-
|
|
15
|
-
* инстансы в JS-pool'е.
|
|
16
|
-
*
|
|
17
|
-
* Поэтому iterator всегда пустой, `find*` возвращает null, `get*` и `deleteById` кидают.
|
|
18
|
-
*
|
|
19
|
-
* ### Hot path: `iterator.all()` на каждый render-tick
|
|
20
|
-
*
|
|
21
|
-
* Геймод-консьюмер `VehiclePartsInteractionController.syncVehicleProximity` →
|
|
22
|
-
* `VehiclePartsInteractionService.syncState` → `VehicleService.getNearbyVehicles`
|
|
23
|
-
* → `VehicleRepository.getNearby` → `VehicleRepository.getAll` → `iterator.all()`.
|
|
24
|
-
* До этой реализации `VehiclesManager` был `createNotImplementedProxy`, и каждый
|
|
25
|
-
* frame падал `CCMPVehiclesManager.iterator.all: not implemented yet`. Теперь
|
|
26
|
-
* iterator возвращает пустой итератор — interaction-сервис тихо деградирует
|
|
27
|
-
* (нет vehicles в радиусе → нет UI-хинтов / интеракций).
|
|
28
|
-
*
|
|
29
|
-
* ### `create(...)` под CCMP
|
|
30
|
-
*
|
|
31
|
-
* Не реализован осознанно: `VehicleRepository.create(...)` в геймоде ожидает
|
|
32
|
-
* `IRockModVehicle` с id/remoteId/position/etc, а CCMP-натив `createVehicle`
|
|
33
|
-
* возвращает только handle без id-mapping'а. Для корректной поддержки нужен
|
|
34
|
-
* полноценный `CCMPVehicle`-класс и интеграция с server-side `ccmp.vehicles.*`
|
|
35
|
-
* — отдельная задача. Сейчас бросаем понятную ошибку.
|
|
36
|
-
*
|
|
37
|
-
* ### `getDisplayNameFromVehicleModel`
|
|
38
|
-
*
|
|
39
|
-
* Этот метод **реализован** — натив `getDisplayNameFromVehicleModel`
|
|
40
|
-
* (`0xB215AAC32D25D019`) экспонирован в `ccmp.natives.vehicle.*` и работает
|
|
41
|
-
* без vehicle-pool'а (принимает только modelHash, возвращает GXT-ключ или
|
|
42
|
-
* "CARNOTFOUND" для unknown-моделей).
|
|
43
|
-
*
|
|
44
|
-
* TODO: когда понадобится spawning vehicles из клиента (миссии, тестовые
|
|
45
|
-
* объекты) — реализовать через `ccmp.natives.vehicle.createVehicle` + локальный
|
|
46
|
-
* id-counter + `CCMPVehicle`-обёртку. Для синхронизированных vehicles нужна
|
|
47
|
-
* server-side фабрика с `ccmp.vehicles.create` и net-events для распространения
|
|
48
|
-
* id-mapping'а.
|
|
49
|
-
*/
|
|
2
|
+
import { RockMod } from "../../../RockMod";
|
|
3
|
+
import { ClientInternalEventName } from "../../../net/common/events/types";
|
|
4
|
+
import { CCMPVehicle } from "./CCMPVehicle";
|
|
50
5
|
export class CCMPVehiclesManager {
|
|
51
6
|
constructor() {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// `VehiclePartsInteractionController.syncVehicleProximity` → `VehicleRepository.getNearby`
|
|
55
|
-
// теперь тихо деградирует вместо падения на каждом render-tick'е.
|
|
7
|
+
this._vehicles = new Map();
|
|
8
|
+
this._vehiclesByRemoteId = new Map();
|
|
56
9
|
this._iterator = {
|
|
57
|
-
all: () =>
|
|
58
|
-
dimension: () =>
|
|
59
|
-
range2D: () =>
|
|
60
|
-
|
|
10
|
+
all: () => this._filter(() => true),
|
|
11
|
+
dimension: (value) => this._filter((vehicle) => vehicle.dimension === value),
|
|
12
|
+
range2D: (center, range) => this._filter((vehicle) => {
|
|
13
|
+
const position = vehicle.position;
|
|
14
|
+
const squaredDistance = (position.x - center.x) ** 2 + (position.y - center.y) ** 2;
|
|
15
|
+
return squaredDistance <= range * range;
|
|
16
|
+
}),
|
|
17
|
+
range3D: (center, range) => this._filter((vehicle) => vehicle.position.isInRange(center, range)),
|
|
61
18
|
};
|
|
19
|
+
this._registerLifecycleEvents();
|
|
20
|
+
this.syncWithMpPool();
|
|
62
21
|
}
|
|
63
22
|
create(options) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
23
|
+
var _a;
|
|
24
|
+
const ccmpVehicle = (_a = this._getNativeVehiclesApi()) === null || _a === void 0 ? void 0 : _a.create(options.model, options.position, options.rotation, {
|
|
25
|
+
dimension: options.dimension,
|
|
26
|
+
engine: options.engine,
|
|
27
|
+
locked: options.locked,
|
|
28
|
+
});
|
|
29
|
+
if (!ccmpVehicle) {
|
|
30
|
+
throw new Error(`CCMPVehiclesManager.create: ccmp.vehicles.create failed for model "${options.model}"`);
|
|
31
|
+
}
|
|
32
|
+
return this._register(ccmpVehicle);
|
|
68
33
|
}
|
|
69
34
|
getDisplayNameFromVehicleModel(modelHash) {
|
|
70
|
-
|
|
35
|
+
var _a, _b;
|
|
36
|
+
return (_b = (_a = this._getNativeVehiclesApi()) === null || _a === void 0 ? void 0 : _a.getDisplayNameFromModel(modelHash)) !== null && _b !== void 0 ? _b : "";
|
|
71
37
|
}
|
|
72
|
-
// -- IEntitiesManager -----------------------------------------------------
|
|
73
38
|
syncWithMpPool() {
|
|
74
|
-
|
|
39
|
+
this._pruneDestroyed();
|
|
40
|
+
const ccmpVehicles = this._getNativeVehiclesApi();
|
|
41
|
+
if (!ccmpVehicles)
|
|
42
|
+
return;
|
|
43
|
+
for (const ccmpVehicle of ccmpVehicles.all) {
|
|
44
|
+
this._register(ccmpVehicle);
|
|
45
|
+
}
|
|
75
46
|
}
|
|
76
47
|
registerById(id) {
|
|
77
|
-
|
|
78
|
-
|
|
48
|
+
var _a, _b;
|
|
49
|
+
const existingVehicle = this.findByID(id);
|
|
50
|
+
if (existingVehicle)
|
|
51
|
+
return existingVehicle;
|
|
52
|
+
const ccmpVehicle = (_b = (_a = this._getNativeVehiclesApi()) === null || _a === void 0 ? void 0 : _a.getById(id)) !== null && _b !== void 0 ? _b : null;
|
|
53
|
+
if (!ccmpVehicle) {
|
|
54
|
+
throw new Error(`CCMPVehiclesManager.registerById(${id}): vehicle not found.`);
|
|
55
|
+
}
|
|
56
|
+
return this._register(ccmpVehicle);
|
|
79
57
|
}
|
|
80
58
|
unregisterById(id) {
|
|
81
|
-
|
|
82
|
-
"разрегистрировать vehicle по id невозможно.");
|
|
59
|
+
return this.deleteById(id);
|
|
83
60
|
}
|
|
84
|
-
// -- IBaseObjectsManager / IWorldObjectsManager ---------------------------
|
|
85
61
|
findByID(id) {
|
|
86
|
-
|
|
87
|
-
|
|
62
|
+
var _a, _b, _c;
|
|
63
|
+
const vehicle = (_a = this._vehicles.get(id)) !== null && _a !== void 0 ? _a : null;
|
|
64
|
+
if (vehicle && vehicle.isExists)
|
|
65
|
+
return vehicle;
|
|
66
|
+
if (vehicle)
|
|
67
|
+
this._unregister(vehicle);
|
|
68
|
+
const ccmpVehicle = (_c = (_b = this._getNativeVehiclesApi()) === null || _b === void 0 ? void 0 : _b.getById(id)) !== null && _c !== void 0 ? _c : null;
|
|
69
|
+
if (!ccmpVehicle)
|
|
70
|
+
return null;
|
|
71
|
+
return this._register(ccmpVehicle);
|
|
88
72
|
}
|
|
89
73
|
getByID(id) {
|
|
90
|
-
|
|
74
|
+
const vehicle = this.findByID(id);
|
|
75
|
+
if (!vehicle) {
|
|
76
|
+
throw new Error(`CCMPVehiclesManager.getByID(${id}): vehicle not found.`);
|
|
77
|
+
}
|
|
78
|
+
return vehicle;
|
|
91
79
|
}
|
|
92
80
|
findByRemoteID(remoteId) {
|
|
93
|
-
|
|
94
|
-
|
|
81
|
+
var _a, _b, _c;
|
|
82
|
+
const vehicle = (_a = this._vehiclesByRemoteId.get(remoteId)) !== null && _a !== void 0 ? _a : null;
|
|
83
|
+
if (vehicle && vehicle.isExists)
|
|
84
|
+
return vehicle;
|
|
85
|
+
if (vehicle)
|
|
86
|
+
this._unregister(vehicle);
|
|
87
|
+
const ccmpVehicle = (_c = (_b = this._getNativeVehiclesApi()) === null || _b === void 0 ? void 0 : _b.getByRemoteId(remoteId)) !== null && _c !== void 0 ? _c : null;
|
|
88
|
+
if (!ccmpVehicle)
|
|
89
|
+
return null;
|
|
90
|
+
return this._register(ccmpVehicle);
|
|
95
91
|
}
|
|
96
92
|
getByRemoteID(remoteId) {
|
|
97
|
-
|
|
93
|
+
const vehicle = this.findByRemoteID(remoteId);
|
|
94
|
+
if (!vehicle) {
|
|
95
|
+
throw new Error(`CCMPVehiclesManager.getByRemoteID(${remoteId}): vehicle not found.`);
|
|
96
|
+
}
|
|
97
|
+
return vehicle;
|
|
98
98
|
}
|
|
99
99
|
deleteById(id) {
|
|
100
|
-
|
|
100
|
+
const vehicle = this.getByID(id);
|
|
101
|
+
vehicle.destroy();
|
|
102
|
+
return vehicle;
|
|
101
103
|
}
|
|
102
104
|
get iterator() {
|
|
103
105
|
return this._iterator;
|
|
104
106
|
}
|
|
107
|
+
_register(ccmpVehicle) {
|
|
108
|
+
const existingVehicle = this._findRegistered(ccmpVehicle);
|
|
109
|
+
if (existingVehicle && existingVehicle.isExists)
|
|
110
|
+
return existingVehicle;
|
|
111
|
+
if (existingVehicle)
|
|
112
|
+
this._unregister(existingVehicle);
|
|
113
|
+
const vehicle = new CCMPVehicle(ccmpVehicle, (destroyedVehicle) => {
|
|
114
|
+
this._unregister(destroyedVehicle);
|
|
115
|
+
});
|
|
116
|
+
this._vehicles.set(vehicle.id, vehicle);
|
|
117
|
+
if (vehicle.remoteId !== null) {
|
|
118
|
+
this._vehiclesByRemoteId.set(vehicle.remoteId, vehicle);
|
|
119
|
+
}
|
|
120
|
+
return vehicle;
|
|
121
|
+
}
|
|
122
|
+
_unregister(vehicle) {
|
|
123
|
+
this._vehicles.delete(vehicle.id);
|
|
124
|
+
if (vehicle.remoteId !== null) {
|
|
125
|
+
this._vehiclesByRemoteId.delete(vehicle.remoteId);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
_findRegistered(ccmpVehicle) {
|
|
129
|
+
var _a, _b, _c;
|
|
130
|
+
return ((_c = (_b = (ccmpVehicle.remoteId === null ? null : ((_a = this._vehiclesByRemoteId.get(ccmpVehicle.remoteId)) !== null && _a !== void 0 ? _a : null))) !== null && _b !== void 0 ? _b : this._vehicles.get(ccmpVehicle.id)) !== null && _c !== void 0 ? _c : null);
|
|
131
|
+
}
|
|
132
|
+
_registerLifecycleEvents() {
|
|
133
|
+
const eventsApi = ccmp;
|
|
134
|
+
eventsApi.on("vehicleCreated", (ccmpVehicle) => {
|
|
135
|
+
if (!ccmpVehicle)
|
|
136
|
+
return;
|
|
137
|
+
const vehicle = this._register(ccmpVehicle);
|
|
138
|
+
RockMod.instance.net.events.emitInternal(ClientInternalEventName.EntityCreated, vehicle);
|
|
139
|
+
});
|
|
140
|
+
eventsApi.on("vehicleDestroyed", (ccmpVehicle) => {
|
|
141
|
+
var _a;
|
|
142
|
+
if (!ccmpVehicle)
|
|
143
|
+
return;
|
|
144
|
+
const vehicle = (_a = this._findRegistered(ccmpVehicle)) !== null && _a !== void 0 ? _a : this._register(ccmpVehicle);
|
|
145
|
+
RockMod.instance.net.events.emitInternal(ClientInternalEventName.EntityDestroyed, vehicle);
|
|
146
|
+
this._unregister(vehicle);
|
|
147
|
+
});
|
|
148
|
+
eventsApi.on("vehicleStreamIn", (ccmpVehicle) => {
|
|
149
|
+
if (!ccmpVehicle)
|
|
150
|
+
return;
|
|
151
|
+
const vehicle = this._register(ccmpVehicle);
|
|
152
|
+
RockMod.instance.net.events.emitInternal(ClientInternalEventName.EntityStreamIn, vehicle);
|
|
153
|
+
});
|
|
154
|
+
eventsApi.on("vehicleStreamOut", (ccmpVehicle) => {
|
|
155
|
+
var _a;
|
|
156
|
+
if (!ccmpVehicle)
|
|
157
|
+
return;
|
|
158
|
+
const vehicle = (_a = this._findRegistered(ccmpVehicle)) !== null && _a !== void 0 ? _a : this._register(ccmpVehicle);
|
|
159
|
+
RockMod.instance.net.events.emitInternal(ClientInternalEventName.EntityStreamOut, vehicle);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
*_filter(predicate) {
|
|
163
|
+
for (const vehicle of this._vehicles.values()) {
|
|
164
|
+
if (!vehicle.isExists) {
|
|
165
|
+
this._unregister(vehicle);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (predicate(vehicle)) {
|
|
169
|
+
yield vehicle;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
_pruneDestroyed() {
|
|
174
|
+
for (const vehicle of this._vehicles.values()) {
|
|
175
|
+
if (!vehicle.isExists) {
|
|
176
|
+
this._unregister(vehicle);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
_getNativeVehiclesApi() {
|
|
181
|
+
var _a;
|
|
182
|
+
return (_a = ccmp.vehicles) !== null && _a !== void 0 ? _a : null;
|
|
183
|
+
}
|
|
105
184
|
}
|
|
@@ -5,7 +5,8 @@ export interface IBaseObjectOptions {
|
|
|
5
5
|
}
|
|
6
6
|
export interface IBaseObject {
|
|
7
7
|
get id(): number;
|
|
8
|
-
|
|
8
|
+
/** Server/network id for remote objects; null for client-only objects. */
|
|
9
|
+
get remoteId(): number | null;
|
|
9
10
|
get type(): BaseObjectType;
|
|
10
11
|
get isExists(): boolean;
|
|
11
12
|
get handle(): number;
|
|
@@ -31,4 +31,8 @@ export declare abstract class RageEntity<T extends EntityMp> extends RageWorldOb
|
|
|
31
31
|
detach(useDetachVelocity: boolean, collision: boolean): void;
|
|
32
32
|
getSpeed(): number;
|
|
33
33
|
isPlayingAnim(dictionary: string, name: string, taskFlag: number): boolean;
|
|
34
|
+
private _getNativeRotation;
|
|
35
|
+
private _getEntityRotationProperty;
|
|
36
|
+
private _hasValidHandle;
|
|
37
|
+
private _isVectorLike;
|
|
34
38
|
}
|