@open-core/ragemp-adapter 0.1.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/README.md +51 -0
- package/dist/.tsbuildinfo/client.tsbuildinfo +1 -0
- package/dist/.tsbuildinfo/root.tsbuildinfo +1 -0
- package/dist/.tsbuildinfo/server.tsbuildinfo +1 -0
- package/dist/.tsbuildinfo/shared.tsbuildinfo +1 -0
- package/dist/client/create-ragemp-client-adapter.d.ts +9 -0
- package/dist/client/create-ragemp-client-adapter.js +48 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +25 -0
- package/dist/client/key-maps.d.ts +9 -0
- package/dist/client/key-maps.js +128 -0
- package/dist/client/native-chat.d.ts +2 -0
- package/dist/client/native-chat.js +50 -0
- package/dist/client/ragemp-blip-bridge.d.ts +12 -0
- package/dist/client/ragemp-blip-bridge.js +139 -0
- package/dist/client/ragemp-hasher.d.ts +4 -0
- package/dist/client/ragemp-hasher.js +20 -0
- package/dist/client/ragemp-local-player-bridge.d.ts +8 -0
- package/dist/client/ragemp-local-player-bridge.js +26 -0
- package/dist/client/ragemp-log-console.d.ts +11 -0
- package/dist/client/ragemp-log-console.js +75 -0
- package/dist/client/ragemp-marker-bridge.d.ts +11 -0
- package/dist/client/ragemp-marker-bridge.js +57 -0
- package/dist/client/ragemp-notification-bridge.d.ts +5 -0
- package/dist/client/ragemp-notification-bridge.js +70 -0
- package/dist/client/ragemp-platform-bridge.d.ts +141 -0
- package/dist/client/ragemp-platform-bridge.js +479 -0
- package/dist/client/ragemp-runtime-bridge.d.ts +30 -0
- package/dist/client/ragemp-runtime-bridge.js +119 -0
- package/dist/client/ragemp-runtime-globals.d.ts +5 -0
- package/dist/client/ragemp-runtime-globals.js +57 -0
- package/dist/client/ragemp-spawn-bridge.d.ts +15 -0
- package/dist/client/ragemp-spawn-bridge.js +107 -0
- package/dist/client/ragemp-webview-bridge.d.ts +22 -0
- package/dist/client/ragemp-webview-bridge.js +131 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +20 -0
- package/dist/server/create-ragemp-server-adapter.d.ts +9 -0
- package/dist/server/create-ragemp-server-adapter.js +54 -0
- package/dist/server/index.d.ts +11 -0
- package/dist/server/index.js +27 -0
- package/dist/server/ragemp-capabilities.d.ts +14 -0
- package/dist/server/ragemp-capabilities.js +36 -0
- package/dist/server/ragemp-engine-events.d.ts +11 -0
- package/dist/server/ragemp-engine-events.js +72 -0
- package/dist/server/ragemp-entity-server.d.ts +29 -0
- package/dist/server/ragemp-entity-server.js +122 -0
- package/dist/server/ragemp-exports.d.ts +7 -0
- package/dist/server/ragemp-exports.js +36 -0
- package/dist/server/ragemp-hasher.d.ts +7 -0
- package/dist/server/ragemp-hasher.js +23 -0
- package/dist/server/ragemp-npc-lifecycle-server.d.ts +9 -0
- package/dist/server/ragemp-npc-lifecycle-server.js +51 -0
- package/dist/server/ragemp-ped-server.d.ts +8 -0
- package/dist/server/ragemp-ped-server.js +37 -0
- package/dist/server/ragemp-player-appearance-lifecycle-server.d.ts +19 -0
- package/dist/server/ragemp-player-appearance-lifecycle-server.js +66 -0
- package/dist/server/ragemp-player-lifecycle-server.d.ts +7 -0
- package/dist/server/ragemp-player-lifecycle-server.js +40 -0
- package/dist/server/ragemp-player-server.d.ts +20 -0
- package/dist/server/ragemp-player-server.js +89 -0
- package/dist/server/ragemp-player-state-sync-server.d.ts +7 -0
- package/dist/server/ragemp-player-state-sync-server.js +29 -0
- package/dist/server/ragemp-playerinfo.d.ts +6 -0
- package/dist/server/ragemp-playerinfo.js +19 -0
- package/dist/server/ragemp-resourceinfo.d.ts +5 -0
- package/dist/server/ragemp-resourceinfo.js +25 -0
- package/dist/server/ragemp-tick.d.ts +7 -0
- package/dist/server/ragemp-tick.js +24 -0
- package/dist/server/ragemp-vehicle-lifecycle-server.d.ts +10 -0
- package/dist/server/ragemp-vehicle-lifecycle-server.js +57 -0
- package/dist/server/ragemp-vehicle-server.d.ts +15 -0
- package/dist/server/ragemp-vehicle-server.js +59 -0
- package/dist/shared/exports-registry.d.ts +29 -0
- package/dist/shared/exports-registry.js +87 -0
- package/dist/shared/transport/adapter.d.ts +8 -0
- package/dist/shared/transport/adapter.js +18 -0
- package/dist/shared/transport/helpers.d.ts +24 -0
- package/dist/shared/transport/helpers.js +70 -0
- package/dist/shared/transport/ragemp.events.d.ts +10 -0
- package/dist/shared/transport/ragemp.events.js +45 -0
- package/dist/shared/transport/ragemp.rpc.d.ts +27 -0
- package/dist/shared/transport/ragemp.rpc.js +181 -0
- package/package.json +64 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RageMPPlatformBridge = exports.RageMPPedAppearanceClient = void 0;
|
|
13
|
+
const tsyringe_1 = require("tsyringe");
|
|
14
|
+
const client_1 = require("@open-core/framework/contracts/client");
|
|
15
|
+
const kernel_1 = require("@open-core/framework/kernel");
|
|
16
|
+
function getMp() {
|
|
17
|
+
return mp;
|
|
18
|
+
}
|
|
19
|
+
function getGame() {
|
|
20
|
+
return mp.game;
|
|
21
|
+
}
|
|
22
|
+
function toMpVector3(position) {
|
|
23
|
+
return new (getMp().Vector3)(position.x, position.y, position.z);
|
|
24
|
+
}
|
|
25
|
+
function toCoreVector3(position) {
|
|
26
|
+
return { x: position.x, y: position.y, z: position.z };
|
|
27
|
+
}
|
|
28
|
+
function tryGetPed(handle) {
|
|
29
|
+
const runtime = getMp();
|
|
30
|
+
try {
|
|
31
|
+
return runtime.players.atHandle(handle) ?? runtime.peds.atHandle(handle);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function tryGetEntity(handle) {
|
|
38
|
+
const runtime = getMp();
|
|
39
|
+
try {
|
|
40
|
+
return runtime.players.atHandle(handle);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
try {
|
|
44
|
+
return runtime.vehicles.atHandle(handle);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
try {
|
|
48
|
+
return runtime.peds.atHandle(handle);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
try {
|
|
52
|
+
return runtime.objects.atHandle(handle);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
let RageMPPedAppearanceClient = class RageMPPedAppearanceClient extends client_1.IGtaPedAppearanceBridge {
|
|
62
|
+
setComponentVariation(ped, componentId, drawableId, textureId) {
|
|
63
|
+
getGame().ped.setComponentVariation(ped, componentId, drawableId, textureId, 0);
|
|
64
|
+
}
|
|
65
|
+
setPropIndex(ped, propId, drawableId, textureId) {
|
|
66
|
+
getGame().ped.setPropIndex(ped, propId, drawableId, textureId, true);
|
|
67
|
+
}
|
|
68
|
+
clearProp(ped, propId) {
|
|
69
|
+
getGame().ped.clearProp(ped, propId);
|
|
70
|
+
}
|
|
71
|
+
setDefaultComponentVariation(ped) {
|
|
72
|
+
getGame().ped.setDefaultComponentVariation(ped);
|
|
73
|
+
}
|
|
74
|
+
setHeadBlendData(ped, data) {
|
|
75
|
+
getGame().ped.setHeadBlendData(ped, data.shapeFirst, data.shapeSecond, data.shapeThird ?? 0, data.skinFirst, data.skinSecond, data.skinThird ?? 0, data.shapeMix, data.skinMix, data.thirdMix ?? 0, false);
|
|
76
|
+
}
|
|
77
|
+
setFaceFeature(ped, index, scale) {
|
|
78
|
+
getGame().ped.setFaceFeature(ped, index, scale);
|
|
79
|
+
}
|
|
80
|
+
setHeadOverlay(ped, overlayId, index, opacity) {
|
|
81
|
+
getGame().ped.setHeadOverlay(ped, overlayId, index, opacity);
|
|
82
|
+
}
|
|
83
|
+
setHeadOverlayColor(ped, overlayId, colorType, colorId, secondColorId) {
|
|
84
|
+
getGame().ped.setHeadOverlayColor(ped, overlayId, colorType, colorId, secondColorId);
|
|
85
|
+
}
|
|
86
|
+
setHairColor(ped, colorId, highlightColorId) {
|
|
87
|
+
getGame().ped.setHairColor(ped, colorId, highlightColorId);
|
|
88
|
+
}
|
|
89
|
+
setEyeColor(ped, colorId) {
|
|
90
|
+
getGame().ped.setEyeColor(ped, colorId);
|
|
91
|
+
}
|
|
92
|
+
addDecoration(ped, collectionHash, overlayHash) {
|
|
93
|
+
getGame().ped.addDecorationFromHashes(ped, collectionHash, overlayHash);
|
|
94
|
+
}
|
|
95
|
+
clearDecorations(ped) {
|
|
96
|
+
getGame().ped.clearDecorations(ped);
|
|
97
|
+
}
|
|
98
|
+
getDrawableVariation(ped, componentId) {
|
|
99
|
+
return getGame().ped.getDrawableVariation(ped, componentId);
|
|
100
|
+
}
|
|
101
|
+
getTextureVariation(ped, componentId) {
|
|
102
|
+
return getGame().ped.getTextureVariation(ped, componentId);
|
|
103
|
+
}
|
|
104
|
+
getPropIndex(ped, propId) {
|
|
105
|
+
return getGame().ped.getPropIndex(ped, propId);
|
|
106
|
+
}
|
|
107
|
+
getPropTextureIndex(ped, propId) {
|
|
108
|
+
return getGame().ped.getPropTextureIndex(ped, propId);
|
|
109
|
+
}
|
|
110
|
+
getNumDrawableVariations(ped, componentId) {
|
|
111
|
+
return getGame().ped.getNumberOfDrawableVariations(ped, componentId);
|
|
112
|
+
}
|
|
113
|
+
getNumTextureVariations(ped, componentId, drawableId) {
|
|
114
|
+
return getGame().ped.getNumberOfTextureVariations(ped, componentId, drawableId);
|
|
115
|
+
}
|
|
116
|
+
getNumPropDrawableVariations(ped, propId) {
|
|
117
|
+
return getGame().ped.getNumberOfPropDrawableVariations(ped, propId);
|
|
118
|
+
}
|
|
119
|
+
getNumPropTextureVariations(ped, propId, drawableId) {
|
|
120
|
+
return getGame().ped.getNumberOfPropTextureVariations(ped, propId, drawableId);
|
|
121
|
+
}
|
|
122
|
+
getNumOverlayValues(overlayId) {
|
|
123
|
+
return getGame().ped.getNumHeadOverlayValues(overlayId);
|
|
124
|
+
}
|
|
125
|
+
getNumHairColors() {
|
|
126
|
+
return getGame().ped.getNumHairColors();
|
|
127
|
+
}
|
|
128
|
+
getNumMakeupColors() {
|
|
129
|
+
return getGame().ped.getNumMakeupColors();
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
exports.RageMPPedAppearanceClient = RageMPPedAppearanceClient;
|
|
133
|
+
exports.RageMPPedAppearanceClient = RageMPPedAppearanceClient = __decorate([
|
|
134
|
+
(0, tsyringe_1.injectable)()
|
|
135
|
+
], RageMPPedAppearanceClient);
|
|
136
|
+
let RageMPPlatformBridge = class RageMPPlatformBridge extends client_1.IClientPlatformBridge {
|
|
137
|
+
constructor() {
|
|
138
|
+
super();
|
|
139
|
+
this.playerReady = false;
|
|
140
|
+
mp.events.add('playerReady', () => {
|
|
141
|
+
this.playerReady = true;
|
|
142
|
+
kernel_1.loggers.spawn.debug('RageMP playerReady fired');
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
getHashKey(value) {
|
|
146
|
+
return getGame().joaat(value);
|
|
147
|
+
}
|
|
148
|
+
getLocalPlayerPed() {
|
|
149
|
+
return getMp().players.local.handle ?? 0;
|
|
150
|
+
}
|
|
151
|
+
getEntityCoords(entity) {
|
|
152
|
+
return toCoreVector3(getGame().entity.getCoords(entity, true));
|
|
153
|
+
}
|
|
154
|
+
getWorldPositionOfEntityBone(entity, bone) {
|
|
155
|
+
const ped = tryGetPed(entity);
|
|
156
|
+
if (!ped)
|
|
157
|
+
return this.getEntityCoords(entity);
|
|
158
|
+
return toCoreVector3(ped.getBoneCoords(bone, 0, 0, 0));
|
|
159
|
+
}
|
|
160
|
+
getGameplayCamCoords() {
|
|
161
|
+
return toCoreVector3(getGame().cam.getGameplayCoord());
|
|
162
|
+
}
|
|
163
|
+
worldToScreen(position) {
|
|
164
|
+
const result = getGame().graphics.getScreenCoordFromWorldCoord(position.x, position.y, position.z);
|
|
165
|
+
return { onScreen: result.result, x: result.screenX, y: result.screenY };
|
|
166
|
+
}
|
|
167
|
+
isModelInCdimage(hash) {
|
|
168
|
+
return getGame().streaming.isModelInCdimage(hash);
|
|
169
|
+
}
|
|
170
|
+
isModelValid(hash) {
|
|
171
|
+
return getGame().streaming.isModelValid(hash);
|
|
172
|
+
}
|
|
173
|
+
isModelAVehicle(hash) {
|
|
174
|
+
return getGame().streaming.isModelAVehicle(hash);
|
|
175
|
+
}
|
|
176
|
+
isModelAPed(hash) {
|
|
177
|
+
return getGame().streaming.isModelAPed(hash);
|
|
178
|
+
}
|
|
179
|
+
requestModel(hash) {
|
|
180
|
+
getGame().streaming.requestModel(hash);
|
|
181
|
+
}
|
|
182
|
+
hasModelLoaded(hash) {
|
|
183
|
+
return getGame().streaming.hasModelLoaded(hash);
|
|
184
|
+
}
|
|
185
|
+
setModelAsNoLongerNeeded(hash) {
|
|
186
|
+
getGame().streaming.setModelAsNoLongerNeeded(hash);
|
|
187
|
+
}
|
|
188
|
+
requestAnimDict(dict) {
|
|
189
|
+
getGame().streaming.requestAnimDict(dict);
|
|
190
|
+
}
|
|
191
|
+
hasAnimDictLoaded(dict) {
|
|
192
|
+
return getGame().streaming.hasAnimDictLoaded(dict);
|
|
193
|
+
}
|
|
194
|
+
removeAnimDict(dict) {
|
|
195
|
+
getGame().streaming.removeAnimDict(dict);
|
|
196
|
+
}
|
|
197
|
+
doesEntityExist(entity) {
|
|
198
|
+
return getGame().entity.doesExist(entity);
|
|
199
|
+
}
|
|
200
|
+
setEntityAsMissionEntity(entity, mission, scriptHostObject) {
|
|
201
|
+
getGame().entity.setAsMissionEntity(entity, mission, scriptHostObject);
|
|
202
|
+
}
|
|
203
|
+
setBlockingOfNonTemporaryEvents(ped, toggle) {
|
|
204
|
+
getGame().ped.setBlockingOfNonTemporaryEvents(ped, toggle);
|
|
205
|
+
}
|
|
206
|
+
setPedRelationshipGroupHash(ped, groupHash) {
|
|
207
|
+
getGame().ped.setRelationshipGroupHash(ped, groupHash);
|
|
208
|
+
}
|
|
209
|
+
createPed(pedType, modelHash, position, heading, networked, scriptHostPed) {
|
|
210
|
+
return getGame().ped.createPed(pedType, modelHash, position.x, position.y, position.z, heading, networked, scriptHostPed);
|
|
211
|
+
}
|
|
212
|
+
deletePed(ped) {
|
|
213
|
+
tryGetPed(ped)?.destroy();
|
|
214
|
+
}
|
|
215
|
+
createObject(modelHash, position, networked, dynamic, _placeOnGround) {
|
|
216
|
+
return getGame().object.createObject(modelHash, position.x, position.y, position.z, networked, false, dynamic);
|
|
217
|
+
}
|
|
218
|
+
deleteEntity(entity) {
|
|
219
|
+
tryGetEntity(entity)?.destroy();
|
|
220
|
+
}
|
|
221
|
+
attachEntityToEntity(entity, target, boneIndex, offset, rotation) {
|
|
222
|
+
getGame().entity.attachToEntity(entity, target, boneIndex, offset.x, offset.y, offset.z, rotation.x, rotation.y, rotation.z, false, false, false, false, 0, true);
|
|
223
|
+
}
|
|
224
|
+
getPedBoneIndex(ped, bone) {
|
|
225
|
+
return getGame().ped.getBoneIndex(ped, bone);
|
|
226
|
+
}
|
|
227
|
+
taskPlayAnim(ped, dict, anim, blendInSpeed, blendOutSpeed, duration, flags, playbackRate) {
|
|
228
|
+
tryGetPed(ped)?.taskPlayAnim(dict, anim, blendInSpeed, blendOutSpeed, duration, flags, playbackRate, false, false, false);
|
|
229
|
+
}
|
|
230
|
+
stopAnimTask(ped, dict, anim, blendOutSpeed) {
|
|
231
|
+
tryGetPed(ped)?.stopAnimTask(dict, anim, blendOutSpeed);
|
|
232
|
+
}
|
|
233
|
+
clearPedTasks(ped) {
|
|
234
|
+
tryGetPed(ped)?.clearTasks();
|
|
235
|
+
}
|
|
236
|
+
clearPedTasksImmediately(ped) {
|
|
237
|
+
tryGetPed(ped)?.clearTasksImmediately();
|
|
238
|
+
}
|
|
239
|
+
freezeEntityPosition(entity, toggle) {
|
|
240
|
+
getGame().entity.freezePosition(entity, toggle);
|
|
241
|
+
}
|
|
242
|
+
setEntityInvincible(entity, toggle) {
|
|
243
|
+
getGame().entity.setInvincible(entity, toggle);
|
|
244
|
+
}
|
|
245
|
+
giveWeaponToPed(ped, weaponHash, ammoCount, _hidden, forceInHand) {
|
|
246
|
+
tryGetPed(ped)?.giveWeapon(weaponHash, ammoCount, forceInHand);
|
|
247
|
+
}
|
|
248
|
+
removeAllPedWeapons(ped, _includeCurrentWeapon) {
|
|
249
|
+
tryGetPed(ped)?.removeAllWeapons();
|
|
250
|
+
}
|
|
251
|
+
getClosestPed(position, radius) {
|
|
252
|
+
const ped = getGame().ped.getClosestPed(position.x, position.y, position.z, radius, true, true, true, false, -1);
|
|
253
|
+
return ped !== 0 ? ped : null;
|
|
254
|
+
}
|
|
255
|
+
getNearbyPeds(position, radius, excludeEntity) {
|
|
256
|
+
return getMp()
|
|
257
|
+
.peds.toArray()
|
|
258
|
+
.filter((ped) => {
|
|
259
|
+
if (excludeEntity !== undefined && ped.handle === excludeEntity)
|
|
260
|
+
return false;
|
|
261
|
+
const coords = ped.position;
|
|
262
|
+
return this.getDistanceBetweenCoords(position, toCoreVector3(coords), true) <= radius;
|
|
263
|
+
})
|
|
264
|
+
.map((ped) => ped.handle);
|
|
265
|
+
}
|
|
266
|
+
taskLookAtEntity(ped, entity, duration) {
|
|
267
|
+
tryGetPed(ped)?.taskLookAt(entity, duration, 2048, 3);
|
|
268
|
+
}
|
|
269
|
+
taskLookAtCoord(ped, position, duration) {
|
|
270
|
+
getGame().task.lookAtCoord(ped, position.x, position.y, position.z, duration, 2048, 3);
|
|
271
|
+
}
|
|
272
|
+
taskGoStraightToCoord(ped, position, speed) {
|
|
273
|
+
tryGetPed(ped)?.taskGoStraightToCoord(position.x, position.y, position.z, speed, -1, 0, 0);
|
|
274
|
+
}
|
|
275
|
+
setPedCombatAttributes() { }
|
|
276
|
+
createVehicle(modelHash, position, heading, networked, scriptHostVehicle) {
|
|
277
|
+
return getGame().vehicle.createVehicle(modelHash, position.x, position.y, position.z, heading, networked, scriptHostVehicle, false);
|
|
278
|
+
}
|
|
279
|
+
deleteVehicle(vehicle) {
|
|
280
|
+
tryGetEntity(vehicle)?.destroy();
|
|
281
|
+
}
|
|
282
|
+
setVehicleOnGroundProperly(vehicle) {
|
|
283
|
+
getMp().vehicles.atHandle(vehicle).setOnGroundProperly();
|
|
284
|
+
}
|
|
285
|
+
getVehicleColours(vehicle) {
|
|
286
|
+
const colors = getGame().vehicle.getColours(vehicle);
|
|
287
|
+
return [colors.colorPrimary, colors.colorSecondary];
|
|
288
|
+
}
|
|
289
|
+
setVehicleColours(vehicle, primary, secondary) {
|
|
290
|
+
getGame().vehicle.setColours(vehicle, primary, secondary);
|
|
291
|
+
}
|
|
292
|
+
setVehicleNumberPlateText(vehicle, plateText) {
|
|
293
|
+
getGame().vehicle.setNumberPlateText(vehicle, plateText);
|
|
294
|
+
}
|
|
295
|
+
taskWarpPedIntoVehicle(ped, vehicle, seatIndex) {
|
|
296
|
+
getGame().task.taskEnterVehicle(ped, vehicle, -1, seatIndex, 2, 1, 0);
|
|
297
|
+
}
|
|
298
|
+
taskLeaveVehicle(ped, vehicle, flags) {
|
|
299
|
+
tryGetPed(ped)?.taskLeaveVehicle(vehicle, flags);
|
|
300
|
+
}
|
|
301
|
+
getClosestVehicle(position, radius) {
|
|
302
|
+
const vehicle = getGame().vehicle.getClosestVehicle(position.x, position.y, position.z, radius, 0, 71);
|
|
303
|
+
return vehicle !== 0 ? vehicle : null;
|
|
304
|
+
}
|
|
305
|
+
isPedInAnyVehicle(ped) {
|
|
306
|
+
return getGame().ped.isInAnyVehicle(ped, false);
|
|
307
|
+
}
|
|
308
|
+
getVehiclePedIsIn(ped, lastVehicle) {
|
|
309
|
+
const vehicle = getGame().ped.getVehicleIsIn(ped, lastVehicle);
|
|
310
|
+
return vehicle !== 0 ? vehicle : null;
|
|
311
|
+
}
|
|
312
|
+
getPedInVehicleSeat(vehicle, seatIndex) {
|
|
313
|
+
const ped = getGame().vehicle.getPedInSeat(vehicle, seatIndex, false);
|
|
314
|
+
return ped !== 0 ? ped : null;
|
|
315
|
+
}
|
|
316
|
+
getEntitySpeed(entity) {
|
|
317
|
+
return getGame().entity.getSpeed(entity);
|
|
318
|
+
}
|
|
319
|
+
networkGetNetworkIdFromEntity(entity) {
|
|
320
|
+
return getGame().network.getNetworkIdFromEntity(entity);
|
|
321
|
+
}
|
|
322
|
+
networkDoesEntityExistWithNetworkId(networkId) {
|
|
323
|
+
return getGame().network.doesEntityExistWithNetworkId(networkId);
|
|
324
|
+
}
|
|
325
|
+
networkGetEntityFromNetworkId(networkId) {
|
|
326
|
+
return getGame().network.netToEnt(networkId);
|
|
327
|
+
}
|
|
328
|
+
getEntityHeading(entity) {
|
|
329
|
+
return getGame().entity.getHeading(entity);
|
|
330
|
+
}
|
|
331
|
+
getEntityModel(entity) {
|
|
332
|
+
return getGame().entity.getModel(entity);
|
|
333
|
+
}
|
|
334
|
+
setVehicleModKit(vehicle, kit) {
|
|
335
|
+
getGame().vehicle.setModKit(vehicle, kit);
|
|
336
|
+
}
|
|
337
|
+
setVehicleMod(vehicle, modType, modIndex, customTires) {
|
|
338
|
+
getGame().vehicle.setMod(vehicle, modType, modIndex, customTires);
|
|
339
|
+
}
|
|
340
|
+
toggleVehicleMod(vehicle, modType, toggle) {
|
|
341
|
+
getGame().vehicle.toggleMod(vehicle, modType, toggle);
|
|
342
|
+
}
|
|
343
|
+
setVehicleWheelType(vehicle, wheelType) {
|
|
344
|
+
getGame().vehicle.setWheelType(vehicle, wheelType);
|
|
345
|
+
}
|
|
346
|
+
setVehicleWindowTint(vehicle, tint) {
|
|
347
|
+
getGame().vehicle.setWindowTint(vehicle, tint);
|
|
348
|
+
}
|
|
349
|
+
setVehicleLivery(vehicle, livery) {
|
|
350
|
+
getGame().vehicle.setLivery(vehicle, livery);
|
|
351
|
+
}
|
|
352
|
+
setVehicleNumberPlateTextIndex(vehicle, index) {
|
|
353
|
+
getGame().vehicle.setNumberPlateTextIndex(vehicle, index);
|
|
354
|
+
}
|
|
355
|
+
setVehicleNeonLightEnabled(vehicle, index, enabled) {
|
|
356
|
+
getGame().vehicle.setNeonLightEnabled(vehicle, index, enabled);
|
|
357
|
+
}
|
|
358
|
+
setVehicleNeonLightsColour(vehicle, r, g, b) {
|
|
359
|
+
getGame().vehicle.setNeonLightsColour(vehicle, r, g, b);
|
|
360
|
+
}
|
|
361
|
+
setVehicleExtra(vehicle, extraId, disable) {
|
|
362
|
+
getGame().vehicle.setExtra(vehicle, extraId, disable);
|
|
363
|
+
}
|
|
364
|
+
getVehicleExtraColours(vehicle) {
|
|
365
|
+
const colors = getGame().vehicle.getExtraColours(vehicle);
|
|
366
|
+
return [colors.pearlescentColor, colors.wheelColor];
|
|
367
|
+
}
|
|
368
|
+
setVehicleExtraColours(vehicle, pearl, wheel) {
|
|
369
|
+
getGame().vehicle.setExtraColours(vehicle, pearl, wheel);
|
|
370
|
+
}
|
|
371
|
+
setVehicleFixed(vehicle) {
|
|
372
|
+
getGame().vehicle.setFixed(vehicle);
|
|
373
|
+
}
|
|
374
|
+
setVehicleDeformationFixed(vehicle) {
|
|
375
|
+
getGame().vehicle.setDeformationFixed(vehicle);
|
|
376
|
+
}
|
|
377
|
+
setVehicleUndriveable(vehicle, toggle) {
|
|
378
|
+
getGame().vehicle.setUndriveable(vehicle, toggle);
|
|
379
|
+
}
|
|
380
|
+
setVehicleEngineOn(vehicle, value, instantly, disableAutoStart) {
|
|
381
|
+
getGame().vehicle.setEngineOn(vehicle, value, instantly, disableAutoStart);
|
|
382
|
+
}
|
|
383
|
+
setVehicleEngineHealth(vehicle, health) {
|
|
384
|
+
getGame().vehicle.setEngineHealth(vehicle, health);
|
|
385
|
+
}
|
|
386
|
+
setVehiclePetrolTankHealth(vehicle, health) {
|
|
387
|
+
getGame().vehicle.setPetrolTankHealth(vehicle, health);
|
|
388
|
+
}
|
|
389
|
+
setVehicleFuelLevel(_vehicle, _level) { }
|
|
390
|
+
getVehicleFuelLevel(_vehicle) {
|
|
391
|
+
return 0;
|
|
392
|
+
}
|
|
393
|
+
setVehicleDoorsLocked(vehicle, doorLockStatus) {
|
|
394
|
+
getGame().vehicle.setDoorsLocked(vehicle, doorLockStatus);
|
|
395
|
+
}
|
|
396
|
+
setEntityHeading(entity, heading) {
|
|
397
|
+
getGame().entity.setHeading(entity, heading);
|
|
398
|
+
}
|
|
399
|
+
setEntityCoords(entity, position) {
|
|
400
|
+
getGame().entity.setCoords(entity, position.x, position.y, position.z, false, false, false, true);
|
|
401
|
+
}
|
|
402
|
+
setEntityCoordsNoOffset(entity, position) {
|
|
403
|
+
getGame().entity.setCoordsNoOffset(entity, position.x, position.y, position.z, false, false, false);
|
|
404
|
+
}
|
|
405
|
+
setEntityHealth(entity, health) {
|
|
406
|
+
getGame().entity.setHealth(entity, health, 0);
|
|
407
|
+
}
|
|
408
|
+
getEntityMaxHealth(entity) {
|
|
409
|
+
return getGame().entity.getMaxHealth(entity);
|
|
410
|
+
}
|
|
411
|
+
setPedArmour(ped, armour) {
|
|
412
|
+
getGame().ped.setArmour(ped, armour);
|
|
413
|
+
}
|
|
414
|
+
networkIsSessionStarted() {
|
|
415
|
+
return this.playerReady;
|
|
416
|
+
}
|
|
417
|
+
isScreenFadedOut() {
|
|
418
|
+
return getGame().cam.isScreenFadedOut();
|
|
419
|
+
}
|
|
420
|
+
isScreenFadingOut() {
|
|
421
|
+
return getGame().cam.isScreenFadingOut();
|
|
422
|
+
}
|
|
423
|
+
doScreenFadeOut(ms) {
|
|
424
|
+
getGame().cam.doScreenFadeOut(ms);
|
|
425
|
+
}
|
|
426
|
+
isScreenFadedIn() {
|
|
427
|
+
return getGame().cam.isScreenFadedIn();
|
|
428
|
+
}
|
|
429
|
+
isScreenFadingIn() {
|
|
430
|
+
return getGame().cam.isScreenFadingIn();
|
|
431
|
+
}
|
|
432
|
+
doScreenFadeIn(ms) {
|
|
433
|
+
getGame().cam.doScreenFadeIn(ms);
|
|
434
|
+
}
|
|
435
|
+
networkResurrectLocalPlayer(position, heading) {
|
|
436
|
+
getMp().players.local.position = toMpVector3(position);
|
|
437
|
+
getMp().players.local.heading = heading;
|
|
438
|
+
}
|
|
439
|
+
playerId() {
|
|
440
|
+
return 0;
|
|
441
|
+
}
|
|
442
|
+
setPlayerModel(_playerId, modelHash) {
|
|
443
|
+
getGame().player.setModel(modelHash);
|
|
444
|
+
}
|
|
445
|
+
requestCollisionAtCoord(position) {
|
|
446
|
+
getGame().streaming.requestCollisionAtCoord(position.x, position.y, position.z);
|
|
447
|
+
}
|
|
448
|
+
shutdownLoadingScreen() {
|
|
449
|
+
getGame().script.setNoLoadingScreen(true);
|
|
450
|
+
getGame().script.shutdownLoadingScreen();
|
|
451
|
+
}
|
|
452
|
+
shutdownLoadingScreenNui() { }
|
|
453
|
+
hasCollisionLoadedAroundEntity(_entity) {
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
resetEntityAlpha(entity) {
|
|
457
|
+
tryGetEntity(entity)?.resetAlpha();
|
|
458
|
+
}
|
|
459
|
+
setEntityAlpha(entity, alphaLevel) {
|
|
460
|
+
tryGetEntity(entity)?.setAlpha(alphaLevel);
|
|
461
|
+
}
|
|
462
|
+
setEntityVisible(entity, toggle) {
|
|
463
|
+
getGame().entity.setVisible(entity, toggle, false);
|
|
464
|
+
}
|
|
465
|
+
setEntityCollision(entity, toggle) {
|
|
466
|
+
getGame().entity.setCollision(entity, toggle, true);
|
|
467
|
+
}
|
|
468
|
+
getVehicleNumberPlateText(vehicle) {
|
|
469
|
+
return getGame().vehicle.getNumberPlateText(vehicle);
|
|
470
|
+
}
|
|
471
|
+
requestScriptAudioBank(_bank, _networked) {
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
exports.RageMPPlatformBridge = RageMPPlatformBridge;
|
|
476
|
+
exports.RageMPPlatformBridge = RageMPPlatformBridge = __decorate([
|
|
477
|
+
(0, tsyringe_1.injectable)(),
|
|
478
|
+
__metadata("design:paramtypes", [])
|
|
479
|
+
], RageMPPlatformBridge);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { IClientRuntimeBridge } from '@open-core/framework/contracts/client';
|
|
2
|
+
type CommandHandler = (...args: readonly unknown[]) => void;
|
|
3
|
+
type RuntimeHandler = (...args: readonly unknown[]) => void | Promise<void>;
|
|
4
|
+
type RuntimeExport = (...args: readonly unknown[]) => unknown;
|
|
5
|
+
/**
|
|
6
|
+
* RAGE Multiplayer implementation of the client runtime bridge.
|
|
7
|
+
*
|
|
8
|
+
* RageMP does not have NUI, key mappings, or resource exports in the same
|
|
9
|
+
* way as FiveM. Methods that have no direct equivalent are no-ops or fall
|
|
10
|
+
* back to sensible alternatives.
|
|
11
|
+
*/
|
|
12
|
+
export declare class RageMPRuntimeBridge extends IClientRuntimeBridge {
|
|
13
|
+
private readonly tickHandles;
|
|
14
|
+
private readonly commandHandlers;
|
|
15
|
+
private tickSeq;
|
|
16
|
+
private executeRegisteredCommand;
|
|
17
|
+
getCurrentResourceName(): string;
|
|
18
|
+
on(eventName: string, handler: RuntimeHandler): void;
|
|
19
|
+
registerCommand(commandName: string, handler: CommandHandler, _restricted: boolean): void;
|
|
20
|
+
registerKeyMapping(commandName: string, _description: string, inputMapper: string, key: string): void;
|
|
21
|
+
setTick(handler: () => void | Promise<void>): unknown;
|
|
22
|
+
clearTick(handle: unknown): void;
|
|
23
|
+
getGameTimer(): number;
|
|
24
|
+
registerNuiCallback(_eventName: string, _handler: (data: unknown, cb: (response: unknown) => void) => void | Promise<void>): void;
|
|
25
|
+
sendNuiMessage(_message: string): void;
|
|
26
|
+
setNuiFocus(_hasFocus: boolean, _hasCursor: boolean): void;
|
|
27
|
+
setNuiFocusKeepInput(_keepInput: boolean): void;
|
|
28
|
+
registerExport(exportName: string, handler: RuntimeExport): void;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.RageMPRuntimeBridge = void 0;
|
|
10
|
+
const tsyringe_1 = require("tsyringe");
|
|
11
|
+
const client_1 = require("@open-core/framework/contracts/client");
|
|
12
|
+
const exports_registry_1 = require("../shared/exports-registry");
|
|
13
|
+
const key_maps_1 = require("./key-maps");
|
|
14
|
+
/**
|
|
15
|
+
* RAGE Multiplayer implementation of the client runtime bridge.
|
|
16
|
+
*
|
|
17
|
+
* RageMP does not have NUI, key mappings, or resource exports in the same
|
|
18
|
+
* way as FiveM. Methods that have no direct equivalent are no-ops or fall
|
|
19
|
+
* back to sensible alternatives.
|
|
20
|
+
*/
|
|
21
|
+
let RageMPRuntimeBridge = class RageMPRuntimeBridge extends client_1.IClientRuntimeBridge {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
this.tickHandles = new Map();
|
|
25
|
+
this.commandHandlers = new Map();
|
|
26
|
+
this.tickSeq = 0;
|
|
27
|
+
}
|
|
28
|
+
executeRegisteredCommand(commandName, ...args) {
|
|
29
|
+
const handler = this.commandHandlers.get(commandName);
|
|
30
|
+
if (!handler)
|
|
31
|
+
return;
|
|
32
|
+
handler(...args);
|
|
33
|
+
}
|
|
34
|
+
getCurrentResourceName() {
|
|
35
|
+
// RageMP does not provide an equivalent to FiveM's GetCurrentResourceName().
|
|
36
|
+
// Client scripts are executed from the compiled bundle inside the resource
|
|
37
|
+
// folder (usually under `client_packages/<resourceName>/...`).
|
|
38
|
+
// To emulate FiveM behaviour in the adapter layer, we infer the resource
|
|
39
|
+
// name by parsing `__dirname` and extracting the folder located directly
|
|
40
|
+
// after `client_packages`. If the structure cannot be detected, we fall
|
|
41
|
+
// back to the last directory name.
|
|
42
|
+
if (typeof __dirname !== 'string')
|
|
43
|
+
return 'default';
|
|
44
|
+
const normalized = __dirname.replace(/\\/g, '/');
|
|
45
|
+
const parts = normalized.split('/');
|
|
46
|
+
const clientPackageLastIndex = parts.lastIndexOf('client_packages');
|
|
47
|
+
if (clientPackageLastIndex !== -1 && parts[clientPackageLastIndex + 1]) {
|
|
48
|
+
return parts[clientPackageLastIndex + 1];
|
|
49
|
+
}
|
|
50
|
+
// fallback: last folder name
|
|
51
|
+
return parts[parts.length - 1] || 'default';
|
|
52
|
+
}
|
|
53
|
+
on(eventName, handler) {
|
|
54
|
+
mp.events.add(eventName, (...args) => {
|
|
55
|
+
void handler(...args);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
registerCommand(commandName, handler, _restricted) {
|
|
59
|
+
if (commandName.startsWith('+') || commandName.startsWith('-')) {
|
|
60
|
+
this.commandHandlers.set(commandName, handler);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// RageMP does not support registering chat/console commands from the client.
|
|
64
|
+
}
|
|
65
|
+
registerKeyMapping(commandName, _description, inputMapper, key) {
|
|
66
|
+
let keyCode;
|
|
67
|
+
if (inputMapper === 'keyboard') {
|
|
68
|
+
keyCode = key_maps_1.KEYBOARD_KEY_MAP[key.toUpperCase()];
|
|
69
|
+
}
|
|
70
|
+
else if (inputMapper === 'mouse_button') {
|
|
71
|
+
keyCode = key_maps_1.MOUSE_KEY_MAP[key.toUpperCase()];
|
|
72
|
+
}
|
|
73
|
+
if (keyCode === undefined)
|
|
74
|
+
return;
|
|
75
|
+
mp.keys.bind(keyCode, true, () => {
|
|
76
|
+
this.executeRegisteredCommand(commandName);
|
|
77
|
+
});
|
|
78
|
+
mp.keys.bind(keyCode, false, () => {
|
|
79
|
+
this.executeRegisteredCommand(commandName.startsWith('+') ? `-${commandName.slice(1)}` : `-${commandName}`);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
setTick(handler) {
|
|
83
|
+
const handle = ++this.tickSeq;
|
|
84
|
+
const interval = setInterval(() => {
|
|
85
|
+
void handler();
|
|
86
|
+
}, 0);
|
|
87
|
+
this.tickHandles.set(handle, interval);
|
|
88
|
+
return handle;
|
|
89
|
+
}
|
|
90
|
+
clearTick(handle) {
|
|
91
|
+
const interval = this.tickHandles.get(handle);
|
|
92
|
+
if (interval !== undefined) {
|
|
93
|
+
clearInterval(interval);
|
|
94
|
+
this.tickHandles.delete(handle);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
getGameTimer() {
|
|
98
|
+
return mp.game.misc.getGameTimer();
|
|
99
|
+
}
|
|
100
|
+
registerNuiCallback(_eventName, _handler) {
|
|
101
|
+
// TODO: Still looking for a good way to implement this.
|
|
102
|
+
}
|
|
103
|
+
sendNuiMessage(_message) {
|
|
104
|
+
// TODO: Still looking for a good way to implement this.
|
|
105
|
+
}
|
|
106
|
+
setNuiFocus(_hasFocus, _hasCursor) {
|
|
107
|
+
// TODO: Still looking for a good way to implement this.
|
|
108
|
+
}
|
|
109
|
+
setNuiFocusKeepInput(_keepInput) {
|
|
110
|
+
// TODO: Still looking for a good way to implement this.
|
|
111
|
+
}
|
|
112
|
+
registerExport(exportName, handler) {
|
|
113
|
+
exports_registry_1.exportsRegistry.register(this.getCurrentResourceName(), exportName, handler);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
exports.RageMPRuntimeBridge = RageMPRuntimeBridge;
|
|
117
|
+
exports.RageMPRuntimeBridge = RageMPRuntimeBridge = __decorate([
|
|
118
|
+
(0, tsyringe_1.injectable)()
|
|
119
|
+
], RageMPRuntimeBridge);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function tryGetRageMP(): Mp | undefined;
|
|
2
|
+
export declare function hasRageMPRuntime(): boolean;
|
|
3
|
+
export declare function getRageMP(): Mp;
|
|
4
|
+
export declare function getRageMPGame(): GameMp;
|
|
5
|
+
export declare function waitForRageMPRuntime(timeoutMs?: number, intervalMs?: number): Promise<Mp>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tryGetRageMP = tryGetRageMP;
|
|
4
|
+
exports.hasRageMPRuntime = hasRageMPRuntime;
|
|
5
|
+
exports.getRageMP = getRageMP;
|
|
6
|
+
exports.getRageMPGame = getRageMPGame;
|
|
7
|
+
exports.waitForRageMPRuntime = waitForRageMPRuntime;
|
|
8
|
+
let cachedRuntime;
|
|
9
|
+
function resolveFromDirectGlobal() {
|
|
10
|
+
try {
|
|
11
|
+
return Function('return typeof mp !== "undefined" ? mp : undefined')();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function resolveFromObject(value) {
|
|
18
|
+
if (!value || typeof value !== 'object')
|
|
19
|
+
return undefined;
|
|
20
|
+
const candidate = value.mp;
|
|
21
|
+
return candidate && typeof candidate === 'object' ? candidate : undefined;
|
|
22
|
+
}
|
|
23
|
+
function tryGetRageMP() {
|
|
24
|
+
if (cachedRuntime)
|
|
25
|
+
return cachedRuntime;
|
|
26
|
+
const resolved = resolveFromDirectGlobal() ??
|
|
27
|
+
resolveFromObject(globalThis) ??
|
|
28
|
+
resolveFromObject(globalThis.global) ??
|
|
29
|
+
resolveFromObject(globalThis.window);
|
|
30
|
+
if (resolved) {
|
|
31
|
+
cachedRuntime = resolved;
|
|
32
|
+
}
|
|
33
|
+
return resolved;
|
|
34
|
+
}
|
|
35
|
+
function hasRageMPRuntime() {
|
|
36
|
+
return tryGetRageMP() !== undefined;
|
|
37
|
+
}
|
|
38
|
+
function getRageMP() {
|
|
39
|
+
const runtime = tryGetRageMP();
|
|
40
|
+
if (!runtime) {
|
|
41
|
+
throw new Error('RageMP client runtime `mp` is not available in this environment.');
|
|
42
|
+
}
|
|
43
|
+
return runtime;
|
|
44
|
+
}
|
|
45
|
+
function getRageMPGame() {
|
|
46
|
+
return getRageMP().game;
|
|
47
|
+
}
|
|
48
|
+
async function waitForRageMPRuntime(timeoutMs = 3000, intervalMs = 25) {
|
|
49
|
+
const started = Date.now();
|
|
50
|
+
while (Date.now() - started < timeoutMs) {
|
|
51
|
+
const runtime = tryGetRageMP();
|
|
52
|
+
if (runtime)
|
|
53
|
+
return runtime;
|
|
54
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
55
|
+
}
|
|
56
|
+
throw new Error('RageMP client runtime `mp` did not become available in time.');
|
|
57
|
+
}
|