@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,15 @@
|
|
|
1
|
+
import { IClientSpawnBridge, type RespawnRequest, type SpawnRequest, type TeleportRequest } from '@open-core/framework/contracts/client';
|
|
2
|
+
import { IClientPlatformBridge, IClientRuntimeBridge } from '@open-core/framework/contracts/client';
|
|
3
|
+
export declare class RageMPClientSpawnBridge extends IClientSpawnBridge {
|
|
4
|
+
private readonly platform;
|
|
5
|
+
private readonly runtime;
|
|
6
|
+
private playerReady;
|
|
7
|
+
constructor(platform: IClientPlatformBridge, runtime: IClientRuntimeBridge);
|
|
8
|
+
waitUntilReady(timeoutMs?: number): Promise<void>;
|
|
9
|
+
spawn(request: SpawnRequest): Promise<void>;
|
|
10
|
+
respawn(request: RespawnRequest): Promise<void>;
|
|
11
|
+
teleport(request: TeleportRequest): Promise<void>;
|
|
12
|
+
private closeLoadingScreens;
|
|
13
|
+
private setPlayerModel;
|
|
14
|
+
private ensurePed;
|
|
15
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.RageMPClientSpawnBridge = void 0;
|
|
16
|
+
const tsyringe_1 = require("tsyringe");
|
|
17
|
+
const client_1 = require("@open-core/framework/contracts/client");
|
|
18
|
+
const client_2 = require("@open-core/framework/contracts/client");
|
|
19
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
20
|
+
const READY_TIMEOUT_MS = 15000;
|
|
21
|
+
const PED_TIMEOUT_MS = 10000;
|
|
22
|
+
const MODEL_LOAD_TIMEOUT_MS = 10000;
|
|
23
|
+
let RageMPClientSpawnBridge = class RageMPClientSpawnBridge extends client_1.IClientSpawnBridge {
|
|
24
|
+
constructor(platform, runtime) {
|
|
25
|
+
super();
|
|
26
|
+
this.platform = platform;
|
|
27
|
+
this.runtime = runtime;
|
|
28
|
+
this.playerReady = false;
|
|
29
|
+
mp.events.add('playerReady', () => {
|
|
30
|
+
this.playerReady = true;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async waitUntilReady(timeoutMs = READY_TIMEOUT_MS) {
|
|
34
|
+
const started = this.runtime.getGameTimer();
|
|
35
|
+
while (!this.playerReady) {
|
|
36
|
+
if (this.runtime.getGameTimer() - started > timeoutMs) {
|
|
37
|
+
throw new Error('PLAYER_READY_TIMEOUT');
|
|
38
|
+
}
|
|
39
|
+
await delay(0);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async spawn(request) {
|
|
43
|
+
this.closeLoadingScreens();
|
|
44
|
+
await this.setPlayerModel(request.model);
|
|
45
|
+
await this.ensurePed();
|
|
46
|
+
mp.players.local.position = new mp.Vector3(request.position.x, request.position.y, request.position.z);
|
|
47
|
+
mp.players.local.heading = request.heading ?? 0;
|
|
48
|
+
}
|
|
49
|
+
async respawn(request) {
|
|
50
|
+
await this.ensurePed();
|
|
51
|
+
mp.players.local.position = new mp.Vector3(request.position.x, request.position.y, request.position.z);
|
|
52
|
+
mp.players.local.heading = request.heading ?? 0;
|
|
53
|
+
}
|
|
54
|
+
async teleport(request) {
|
|
55
|
+
await this.ensurePed();
|
|
56
|
+
mp.players.local.position = new mp.Vector3(request.position.x, request.position.y, request.position.z);
|
|
57
|
+
if (typeof request.heading === 'number') {
|
|
58
|
+
mp.players.local.heading = request.heading;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
closeLoadingScreens() {
|
|
62
|
+
try {
|
|
63
|
+
this.platform.shutdownLoadingScreen();
|
|
64
|
+
}
|
|
65
|
+
catch { }
|
|
66
|
+
try {
|
|
67
|
+
this.platform.shutdownLoadingScreenNui();
|
|
68
|
+
}
|
|
69
|
+
catch { }
|
|
70
|
+
}
|
|
71
|
+
async setPlayerModel(model) {
|
|
72
|
+
const modelHash = this.platform.getHashKey(model);
|
|
73
|
+
if (!this.platform.isModelInCdimage(modelHash) || !this.platform.isModelValid(modelHash)) {
|
|
74
|
+
throw new Error('MODEL_INVALID');
|
|
75
|
+
}
|
|
76
|
+
this.platform.requestModel(modelHash);
|
|
77
|
+
const started = this.runtime.getGameTimer();
|
|
78
|
+
while (!this.platform.hasModelLoaded(modelHash)) {
|
|
79
|
+
if (this.runtime.getGameTimer() - started > MODEL_LOAD_TIMEOUT_MS) {
|
|
80
|
+
throw new Error('MODEL_LOAD_TIMEOUT');
|
|
81
|
+
}
|
|
82
|
+
await delay(0);
|
|
83
|
+
}
|
|
84
|
+
this.platform.setPlayerModel(this.platform.playerId(), modelHash);
|
|
85
|
+
this.platform.setModelAsNoLongerNeeded(modelHash);
|
|
86
|
+
}
|
|
87
|
+
async ensurePed() {
|
|
88
|
+
const started = this.runtime.getGameTimer();
|
|
89
|
+
let ped = this.platform.getLocalPlayerPed();
|
|
90
|
+
while (ped === 0) {
|
|
91
|
+
if (this.runtime.getGameTimer() - started > PED_TIMEOUT_MS) {
|
|
92
|
+
throw new Error('PED_TIMEOUT');
|
|
93
|
+
}
|
|
94
|
+
await delay(0);
|
|
95
|
+
ped = this.platform.getLocalPlayerPed();
|
|
96
|
+
}
|
|
97
|
+
return ped;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
exports.RageMPClientSpawnBridge = RageMPClientSpawnBridge;
|
|
101
|
+
exports.RageMPClientSpawnBridge = RageMPClientSpawnBridge = __decorate([
|
|
102
|
+
(0, tsyringe_1.injectable)(),
|
|
103
|
+
__param(0, (0, tsyringe_1.inject)(client_2.IClientPlatformBridge)),
|
|
104
|
+
__param(1, (0, tsyringe_1.inject)(client_2.IClientRuntimeBridge)),
|
|
105
|
+
__metadata("design:paramtypes", [client_2.IClientPlatformBridge,
|
|
106
|
+
client_2.IClientRuntimeBridge])
|
|
107
|
+
], RageMPClientSpawnBridge);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IClientWebViewBridge } from '@open-core/framework/contracts/client';
|
|
2
|
+
import type { WebViewCapabilities, WebViewDefinition, WebViewFocusOptions, WebViewMessage } from '@open-core/framework/contracts/client';
|
|
3
|
+
export declare class RageMPClientWebViewBridge extends IClientWebViewBridge {
|
|
4
|
+
private readonly views;
|
|
5
|
+
private readonly handlers;
|
|
6
|
+
private eventRegistered;
|
|
7
|
+
getCapabilities(): WebViewCapabilities;
|
|
8
|
+
create(definition: WebViewDefinition): void;
|
|
9
|
+
destroy(viewId: string): void;
|
|
10
|
+
exists(viewId: string): boolean;
|
|
11
|
+
show(viewId: string): void;
|
|
12
|
+
hide(viewId: string): void;
|
|
13
|
+
focus(viewId: string, options?: WebViewFocusOptions): void;
|
|
14
|
+
blur(viewId: string): void;
|
|
15
|
+
send(viewId: string, event: string, payload: unknown): void;
|
|
16
|
+
onMessage(handler: (message: WebViewMessage) => void | Promise<void>): () => void;
|
|
17
|
+
markAsChat(viewId: string): void;
|
|
18
|
+
execute(viewId: string, code: string): void;
|
|
19
|
+
call(viewId: string, eventName: string, ...args: unknown[]): void;
|
|
20
|
+
callProc<T = unknown>(viewId: string, procName: string, ...args: unknown[]): Promise<T | undefined>;
|
|
21
|
+
private ensureEventsRegistered;
|
|
22
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
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.RageMPClientWebViewBridge = void 0;
|
|
10
|
+
const tsyringe_1 = require("tsyringe");
|
|
11
|
+
const client_1 = require("@open-core/framework/contracts/client");
|
|
12
|
+
const RAGEMP_WEBVIEW_EVENT = '__opencore:webview:message';
|
|
13
|
+
const RAGEMP_WEBVIEW_CAPABILITIES = {
|
|
14
|
+
supportsFocus: true,
|
|
15
|
+
supportsCursor: true,
|
|
16
|
+
supportsInputPassthrough: true,
|
|
17
|
+
supportsBidirectionalMessaging: true,
|
|
18
|
+
supportsExecute: true,
|
|
19
|
+
supportsHeadless: true,
|
|
20
|
+
};
|
|
21
|
+
function js(value) {
|
|
22
|
+
return JSON.stringify(value);
|
|
23
|
+
}
|
|
24
|
+
let RageMPClientWebViewBridge = class RageMPClientWebViewBridge extends client_1.IClientWebViewBridge {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
this.views = new Map();
|
|
28
|
+
this.handlers = new Set();
|
|
29
|
+
this.eventRegistered = false;
|
|
30
|
+
}
|
|
31
|
+
getCapabilities() { return RAGEMP_WEBVIEW_CAPABILITIES; }
|
|
32
|
+
create(definition) {
|
|
33
|
+
const existing = this.views.get(definition.id);
|
|
34
|
+
if (existing)
|
|
35
|
+
existing.destroy();
|
|
36
|
+
const browser = mp.browsers.new(definition.url);
|
|
37
|
+
browser.active = definition.visible ?? false;
|
|
38
|
+
browser.inputEnabled = definition.focused ?? false;
|
|
39
|
+
browser.mouseInputEnabled = definition.cursor ?? false;
|
|
40
|
+
this.views.set(definition.id, browser);
|
|
41
|
+
this.ensureEventsRegistered();
|
|
42
|
+
mp.events.add('browserDomReady', (readyBrowser) => {
|
|
43
|
+
if (readyBrowser !== browser)
|
|
44
|
+
return;
|
|
45
|
+
browser.execute(`window.__OpenCoreWebView = {
|
|
46
|
+
emit: function(event, payload) {
|
|
47
|
+
if (typeof mp !== 'undefined' && typeof mp.trigger === 'function') {
|
|
48
|
+
mp.trigger(${js(RAGEMP_WEBVIEW_EVENT)}, ${js(definition.id)}, event, JSON.stringify(payload ?? null));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};`);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
destroy(viewId) {
|
|
55
|
+
const browser = this.views.get(viewId);
|
|
56
|
+
if (!browser)
|
|
57
|
+
return;
|
|
58
|
+
browser.destroy();
|
|
59
|
+
this.views.delete(viewId);
|
|
60
|
+
}
|
|
61
|
+
exists(viewId) { return this.views.has(viewId); }
|
|
62
|
+
show(viewId) {
|
|
63
|
+
const browser = this.views.get(viewId);
|
|
64
|
+
if (!browser)
|
|
65
|
+
return;
|
|
66
|
+
browser.active = true;
|
|
67
|
+
}
|
|
68
|
+
hide(viewId) {
|
|
69
|
+
const browser = this.views.get(viewId);
|
|
70
|
+
if (!browser)
|
|
71
|
+
return;
|
|
72
|
+
browser.active = false;
|
|
73
|
+
}
|
|
74
|
+
focus(viewId, options = {}) {
|
|
75
|
+
const browser = this.views.get(viewId);
|
|
76
|
+
if (!browser)
|
|
77
|
+
return;
|
|
78
|
+
browser.inputEnabled = true;
|
|
79
|
+
browser.mouseInputEnabled = options.cursor ?? true;
|
|
80
|
+
mp.gui.cursor.show(true, options.cursor ?? true);
|
|
81
|
+
}
|
|
82
|
+
blur(viewId) {
|
|
83
|
+
const browser = this.views.get(viewId);
|
|
84
|
+
if (!browser)
|
|
85
|
+
return;
|
|
86
|
+
browser.inputEnabled = false;
|
|
87
|
+
browser.mouseInputEnabled = false;
|
|
88
|
+
mp.gui.cursor.show(false, false);
|
|
89
|
+
}
|
|
90
|
+
send(viewId, event, payload) {
|
|
91
|
+
const browser = this.views.get(viewId);
|
|
92
|
+
if (!browser)
|
|
93
|
+
return;
|
|
94
|
+
browser.execute(`window.postMessage({ __opencoreWebView: true, action: ${js(event)}, data: ${js(payload)} }, '*');`);
|
|
95
|
+
}
|
|
96
|
+
onMessage(handler) {
|
|
97
|
+
this.ensureEventsRegistered();
|
|
98
|
+
this.handlers.add(handler);
|
|
99
|
+
return () => this.handlers.delete(handler);
|
|
100
|
+
}
|
|
101
|
+
markAsChat(viewId) {
|
|
102
|
+
this.views.get(viewId)?.markAsChat();
|
|
103
|
+
}
|
|
104
|
+
execute(viewId, code) {
|
|
105
|
+
this.views.get(viewId)?.execute(code);
|
|
106
|
+
}
|
|
107
|
+
call(viewId, eventName, ...args) {
|
|
108
|
+
this.views.get(viewId)?.call(eventName, ...args);
|
|
109
|
+
}
|
|
110
|
+
callProc(viewId, procName, ...args) {
|
|
111
|
+
const browser = this.views.get(viewId);
|
|
112
|
+
if (!browser)
|
|
113
|
+
return Promise.resolve(undefined);
|
|
114
|
+
return browser.callProc(procName, ...args);
|
|
115
|
+
}
|
|
116
|
+
ensureEventsRegistered() {
|
|
117
|
+
if (this.eventRegistered)
|
|
118
|
+
return;
|
|
119
|
+
this.eventRegistered = true;
|
|
120
|
+
mp.events.add(RAGEMP_WEBVIEW_EVENT, async (viewId, event, payloadJson) => {
|
|
121
|
+
const payload = payloadJson ? JSON.parse(payloadJson) : null;
|
|
122
|
+
for (const handler of this.handlers) {
|
|
123
|
+
await handler({ viewId, event, payload });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
exports.RageMPClientWebViewBridge = RageMPClientWebViewBridge;
|
|
129
|
+
exports.RageMPClientWebViewBridge = RageMPClientWebViewBridge = __decorate([
|
|
130
|
+
(0, tsyringe_1.injectable)()
|
|
131
|
+
], RageMPClientWebViewBridge);
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./shared/transport/adapter"), exports);
|
|
18
|
+
__exportStar(require("./shared/transport/ragemp.events"), exports);
|
|
19
|
+
__exportStar(require("./shared/transport/ragemp.rpc"), exports);
|
|
20
|
+
__exportStar(require("./shared/exports-registry"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type OpenCoreServerAdapter } from '@open-core/framework/server';
|
|
2
|
+
/**
|
|
3
|
+
* Creates the external RAGE Multiplayer server adapter.
|
|
4
|
+
*/
|
|
5
|
+
export declare function RageMPServerAdapter(): OpenCoreServerAdapter;
|
|
6
|
+
/**
|
|
7
|
+
* Backward-compatible factory name for external consumers.
|
|
8
|
+
*/
|
|
9
|
+
export declare const createRageMPServerAdapter: typeof RageMPServerAdapter;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRageMPServerAdapter = void 0;
|
|
4
|
+
exports.RageMPServerAdapter = RageMPServerAdapter;
|
|
5
|
+
const server_1 = require("@open-core/framework/server");
|
|
6
|
+
const adapter_1 = require("../shared/transport/adapter");
|
|
7
|
+
const ragemp_capabilities_1 = require("./ragemp-capabilities");
|
|
8
|
+
const ragemp_engine_events_1 = require("./ragemp-engine-events");
|
|
9
|
+
const ragemp_entity_server_1 = require("./ragemp-entity-server");
|
|
10
|
+
const ragemp_exports_1 = require("./ragemp-exports");
|
|
11
|
+
const ragemp_hasher_1 = require("./ragemp-hasher");
|
|
12
|
+
const ragemp_npc_lifecycle_server_1 = require("./ragemp-npc-lifecycle-server");
|
|
13
|
+
const ragemp_ped_server_1 = require("./ragemp-ped-server");
|
|
14
|
+
const ragemp_player_appearance_lifecycle_server_1 = require("./ragemp-player-appearance-lifecycle-server");
|
|
15
|
+
const ragemp_player_lifecycle_server_1 = require("./ragemp-player-lifecycle-server");
|
|
16
|
+
const ragemp_playerinfo_1 = require("./ragemp-playerinfo");
|
|
17
|
+
const ragemp_player_state_sync_server_1 = require("./ragemp-player-state-sync-server");
|
|
18
|
+
const ragemp_player_server_1 = require("./ragemp-player-server");
|
|
19
|
+
const ragemp_resourceinfo_1 = require("./ragemp-resourceinfo");
|
|
20
|
+
const ragemp_tick_1 = require("./ragemp-tick");
|
|
21
|
+
const ragemp_vehicle_lifecycle_server_1 = require("./ragemp-vehicle-lifecycle-server");
|
|
22
|
+
const ragemp_vehicle_server_1 = require("./ragemp-vehicle-server");
|
|
23
|
+
const server_2 = require("@open-core/framework/contracts/server");
|
|
24
|
+
/**
|
|
25
|
+
* Creates the external RAGE Multiplayer server adapter.
|
|
26
|
+
*/
|
|
27
|
+
function RageMPServerAdapter() {
|
|
28
|
+
return (0, server_1.defineServerAdapter)({
|
|
29
|
+
name: 'ragemp',
|
|
30
|
+
register(ctx) {
|
|
31
|
+
ctx.bindMessagingTransport(new adapter_1.RageMPMessagingTransport());
|
|
32
|
+
ctx.bindSingleton(server_2.IPlatformContext, ragemp_capabilities_1.RageMPPlatformContext);
|
|
33
|
+
ctx.bindInstance(server_2.IEngineEvents, (0, ragemp_engine_events_1.resolveSharedEngineEvents)());
|
|
34
|
+
ctx.bindSingleton(server_2.IExports, ragemp_exports_1.RageMPExports);
|
|
35
|
+
ctx.bindSingleton(server_2.IResourceInfo, ragemp_resourceinfo_1.RageMPResourceInfo);
|
|
36
|
+
ctx.bindSingleton(server_2.ITick, ragemp_tick_1.RageMPTick);
|
|
37
|
+
ctx.bindSingleton(server_2.IPlayerInfo, ragemp_playerinfo_1.RageMPPlayerInfo);
|
|
38
|
+
ctx.bindSingleton(server_2.IEntityServer, ragemp_entity_server_1.RageMPEntityServer);
|
|
39
|
+
ctx.bindSingleton(server_2.IPedServer, ragemp_ped_server_1.RageMPPedServer);
|
|
40
|
+
ctx.bindSingleton(server_2.INpcLifecycleServer, ragemp_npc_lifecycle_server_1.RageMPNpcLifecycleServer);
|
|
41
|
+
ctx.bindSingleton(server_2.IPlayerAppearanceLifecycleServer, ragemp_player_appearance_lifecycle_server_1.RageMPPlayerAppearanceLifecycleServer);
|
|
42
|
+
ctx.bindSingleton(server_2.IPlayerStateSyncServer, ragemp_player_state_sync_server_1.RageMPPlayerStateSyncServer);
|
|
43
|
+
ctx.bindSingleton(server_2.IVehicleServer, ragemp_vehicle_server_1.RageMPVehicleServer);
|
|
44
|
+
ctx.bindSingleton(server_2.IVehicleLifecycleServer, ragemp_vehicle_lifecycle_server_1.RageMPVehicleLifecycleServer);
|
|
45
|
+
ctx.bindSingleton(server_2.IPlayerLifecycleServer, ragemp_player_lifecycle_server_1.RageMPPlayerLifecycleServer);
|
|
46
|
+
ctx.bindSingleton(server_2.IPlayerServer, ragemp_player_server_1.RageMPPlayerServer);
|
|
47
|
+
ctx.bindSingleton(server_2.IHasher, ragemp_hasher_1.RageMPHasher);
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Backward-compatible factory name for external consumers.
|
|
53
|
+
*/
|
|
54
|
+
exports.createRageMPServerAdapter = RageMPServerAdapter;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './create-ragemp-server-adapter';
|
|
2
|
+
export * from './ragemp-capabilities';
|
|
3
|
+
export * from './ragemp-engine-events';
|
|
4
|
+
export * from './ragemp-entity-server';
|
|
5
|
+
export * from './ragemp-exports';
|
|
6
|
+
export * from './ragemp-hasher';
|
|
7
|
+
export * from './ragemp-playerinfo';
|
|
8
|
+
export * from './ragemp-player-server';
|
|
9
|
+
export * from './ragemp-resourceinfo';
|
|
10
|
+
export * from './ragemp-tick';
|
|
11
|
+
export * from './ragemp-vehicle-server';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./create-ragemp-server-adapter"), exports);
|
|
18
|
+
__exportStar(require("./ragemp-capabilities"), exports);
|
|
19
|
+
__exportStar(require("./ragemp-engine-events"), exports);
|
|
20
|
+
__exportStar(require("./ragemp-entity-server"), exports);
|
|
21
|
+
__exportStar(require("./ragemp-exports"), exports);
|
|
22
|
+
__exportStar(require("./ragemp-hasher"), exports);
|
|
23
|
+
__exportStar(require("./ragemp-playerinfo"), exports);
|
|
24
|
+
__exportStar(require("./ragemp-player-server"), exports);
|
|
25
|
+
__exportStar(require("./ragemp-resourceinfo"), exports);
|
|
26
|
+
__exportStar(require("./ragemp-tick"), exports);
|
|
27
|
+
__exportStar(require("./ragemp-vehicle-server"), exports);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IPlatformContext } from '@open-core/framework/contracts/server';
|
|
2
|
+
/**
|
|
3
|
+
* RAGE Multiplayer platform context implementation.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RageMPPlatformContext extends IPlatformContext {
|
|
6
|
+
readonly platformName = "ragemp";
|
|
7
|
+
readonly displayName = "RAGE Multiplayer";
|
|
8
|
+
readonly identifierTypes: readonly ["ip", "socialclub", "hwid"];
|
|
9
|
+
readonly maxPlayers = 5000;
|
|
10
|
+
readonly gameProfile = "gta5";
|
|
11
|
+
readonly defaultSpawnModel = "mp_m_freemode_01";
|
|
12
|
+
readonly defaultVehicleType = "sultan";
|
|
13
|
+
readonly enableServerVehicleCreation = true;
|
|
14
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
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.RageMPPlatformContext = void 0;
|
|
10
|
+
const contracts_1 = require("@open-core/framework/contracts");
|
|
11
|
+
const server_1 = require("@open-core/framework/contracts/server");
|
|
12
|
+
const tsyringe_1 = require("tsyringe");
|
|
13
|
+
/**
|
|
14
|
+
* RAGE Multiplayer platform context implementation.
|
|
15
|
+
*/
|
|
16
|
+
let RageMPPlatformContext = class RageMPPlatformContext extends server_1.IPlatformContext {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.platformName = 'ragemp';
|
|
20
|
+
this.displayName = 'RAGE Multiplayer';
|
|
21
|
+
this.identifierTypes = [
|
|
22
|
+
contracts_1.IdentifierTypes.IP,
|
|
23
|
+
contracts_1.IdentifierTypes.SOCIAL_CLUB,
|
|
24
|
+
contracts_1.IdentifierTypes.HWID,
|
|
25
|
+
];
|
|
26
|
+
this.maxPlayers = 5000;
|
|
27
|
+
this.gameProfile = 'gta5';
|
|
28
|
+
this.defaultSpawnModel = 'mp_m_freemode_01';
|
|
29
|
+
this.defaultVehicleType = 'sultan';
|
|
30
|
+
this.enableServerVehicleCreation = true;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.RageMPPlatformContext = RageMPPlatformContext;
|
|
34
|
+
exports.RageMPPlatformContext = RageMPPlatformContext = __decorate([
|
|
35
|
+
(0, tsyringe_1.injectable)()
|
|
36
|
+
], RageMPPlatformContext);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IEngineEvents, type RuntimeEventMap, type RuntimeEventName } from '@open-core/framework/contracts/server';
|
|
2
|
+
type EngineHandler = (...args: readonly unknown[]) => void;
|
|
3
|
+
export declare class RageMPEngineEvents extends IEngineEvents {
|
|
4
|
+
constructor();
|
|
5
|
+
getRuntimeEventMap(): RuntimeEventMap;
|
|
6
|
+
onRuntime(eventName: RuntimeEventName, handler?: EngineHandler): void;
|
|
7
|
+
on(eventName: string, handler?: EngineHandler): void;
|
|
8
|
+
emit(eventName: string, ...args: readonly unknown[]): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveSharedEngineEvents(): RageMPEngineEvents;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RageMPEngineEvents = void 0;
|
|
4
|
+
exports.resolveSharedEngineEvents = resolveSharedEngineEvents;
|
|
5
|
+
const server_1 = require("@open-core/framework/contracts/server");
|
|
6
|
+
const EVENT_MAP = {
|
|
7
|
+
...server_1.DEFAULT_RUNTIME_EVENT_MAP,
|
|
8
|
+
[server_1.RUNTIME_EVENTS.playerJoining]: 'playerJoin',
|
|
9
|
+
[server_1.RUNTIME_EVENTS.playerDropped]: 'playerQuit',
|
|
10
|
+
};
|
|
11
|
+
function isPlayerMp(value) {
|
|
12
|
+
return typeof value === 'object' && value !== null && 'id' in value;
|
|
13
|
+
}
|
|
14
|
+
// TODO: Refactor runtime event handling to use a single engine listener per event.
|
|
15
|
+
// The listener should forward events to an internal dispatcher/event bus so that
|
|
16
|
+
// multiple framework handlers do not register duplicate mp.events listeners.
|
|
17
|
+
class RageMPEngineEvents extends server_1.IEngineEvents {
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.onRuntime(server_1.RUNTIME_EVENTS.playerCommand, (player, command) => {
|
|
21
|
+
if (!isPlayerMp(player) || typeof command !== 'string')
|
|
22
|
+
return;
|
|
23
|
+
const [commandName, ...args] = command.trim().split(/\s+/);
|
|
24
|
+
if (!commandName)
|
|
25
|
+
return;
|
|
26
|
+
this.emit('core:execute-command', player, commandName, args);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
getRuntimeEventMap() {
|
|
30
|
+
return EVENT_MAP;
|
|
31
|
+
}
|
|
32
|
+
onRuntime(eventName, handler) {
|
|
33
|
+
if (!handler)
|
|
34
|
+
return;
|
|
35
|
+
const mpEvent = this.getRuntimeEventMap()[eventName] ?? eventName;
|
|
36
|
+
mp.events.add(mpEvent, (player, ...args) => {
|
|
37
|
+
const license = player.rgscId;
|
|
38
|
+
if (eventName === server_1.RUNTIME_EVENTS.playerJoining) {
|
|
39
|
+
handler(player.id, { license });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (eventName === server_1.RUNTIME_EVENTS.playerDropped) {
|
|
43
|
+
handler(player.id);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
handler(player, ...args);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
on(eventName, handler) {
|
|
50
|
+
if (!handler)
|
|
51
|
+
return;
|
|
52
|
+
mp.events.add(eventName, (...args) => {
|
|
53
|
+
handler(...args);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
emit(eventName, ...args) {
|
|
57
|
+
mp.events.call(eventName, ...args);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.RageMPEngineEvents = RageMPEngineEvents;
|
|
61
|
+
// In RageMP every package runs as an independent bundle in the same Node.js
|
|
62
|
+
// process. Each bundle would instantiate its own RageMPEngineEvents, causing
|
|
63
|
+
// listeners like `playerCommand` to be registered multiple times.
|
|
64
|
+
// Storing the instance on `global` ensures a single shared instance.
|
|
65
|
+
const ENGINE_EVENTS_GLOBAL_KEY = '__opencore_engine_events__';
|
|
66
|
+
function resolveSharedEngineEvents() {
|
|
67
|
+
const globalContext = global;
|
|
68
|
+
if (!globalContext[ENGINE_EVENTS_GLOBAL_KEY]) {
|
|
69
|
+
globalContext[ENGINE_EVENTS_GLOBAL_KEY] = new RageMPEngineEvents();
|
|
70
|
+
}
|
|
71
|
+
return globalContext[ENGINE_EVENTS_GLOBAL_KEY];
|
|
72
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type EntityStateBag, IEntityServer, type SetPositionOptions } from '@open-core/framework/contracts/server';
|
|
2
|
+
import { Vector3 } from '@open-core/framework/kernel';
|
|
3
|
+
/**
|
|
4
|
+
* RAGE Multiplayer implementation of server-side entity operations.
|
|
5
|
+
*
|
|
6
|
+
* The framework handle maps to the RageMP entity.id (server-side integer ID).
|
|
7
|
+
*/
|
|
8
|
+
export declare class RageMPEntityServer extends IEntityServer {
|
|
9
|
+
doesExist(handle: number): boolean;
|
|
10
|
+
getCoords(handle: number): Vector3;
|
|
11
|
+
setPosition(handle: number, position: Vector3, _options?: SetPositionOptions): void;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Use setPosition() for cross-platform compatibility.
|
|
14
|
+
*/
|
|
15
|
+
setCoords(handle: number, x: number, y: number, z: number): void;
|
|
16
|
+
getHeading(handle: number): number;
|
|
17
|
+
setHeading(handle: number, heading: number): void;
|
|
18
|
+
getModel(handle: number): number;
|
|
19
|
+
delete(handle: number): void;
|
|
20
|
+
setOrphanMode(_handle: number, _mode: number): void;
|
|
21
|
+
setDimension(handle: number, dimension: number): void;
|
|
22
|
+
getDimension(handle: number): number;
|
|
23
|
+
getStateBag(handle: number): EntityStateBag;
|
|
24
|
+
getHealth(handle: number): number;
|
|
25
|
+
setHealth(handle: number, health: number): void;
|
|
26
|
+
getArmor(handle: number): number;
|
|
27
|
+
setArmor(handle: number, armor: number): void;
|
|
28
|
+
private findEntity;
|
|
29
|
+
}
|