universal-game-modder 0.1.4
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/ACCEPTABLE_USE.md +49 -0
- package/CHANGELOG.md +119 -0
- package/LICENSE +21 -0
- package/LICENSE-EULA.md +62 -0
- package/README.md +162 -0
- package/VERIFICATION.md +132 -0
- package/dist/backends/child-pool.js +91 -0
- package/dist/backends/mcp-child.js +102 -0
- package/dist/backends/mcp-child.js.map +1 -0
- package/dist/core/config.d.ts +10 -0
- package/dist/core/config.js +48 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/engine-detector.d.ts +13 -0
- package/dist/core/engine-detector.js +247 -0
- package/dist/core/engine-detector.js.map +1 -0
- package/dist/core/event-bus.js +18 -0
- package/dist/core/file-classifier.js +394 -0
- package/dist/core/model-db.js +517 -0
- package/dist/core/model-db.js.map +1 -0
- package/dist/core/router.d.ts +6 -0
- package/dist/core/router.js +143 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/session.js +114 -0
- package/dist/decoders/audio-export.js +57 -0
- package/dist/decoders/mesh-export.d.ts +20 -0
- package/dist/decoders/mesh-export.js +174 -0
- package/dist/decoders/mesh-export.js.map +1 -0
- package/dist/decoders/native/disassembler.js +85 -0
- package/dist/decoders/native/disassembler.js.map +1 -0
- package/dist/decoders/png-encode.d.ts +17 -0
- package/dist/decoders/png-encode.js +33 -0
- package/dist/decoders/texture-decode.js +278 -0
- package/dist/decoders/texture-decode.js.map +1 -0
- package/dist/decoders/unity/audioclip.d.ts +55 -0
- package/dist/decoders/unity/audioclip.js +87 -0
- package/dist/decoders/unity/audioclip.js.map +1 -0
- package/dist/decoders/unity/binary-reader.d.ts +45 -0
- package/dist/decoders/unity/binary-reader.js +141 -0
- package/dist/decoders/unity/binary-reader.js.map +1 -0
- package/dist/decoders/unity/mesh.js +198 -0
- package/dist/decoders/unity/mesh.js.map +1 -0
- package/dist/decoders/unity/ress-reader.d.ts +33 -0
- package/dist/decoders/unity/ress-reader.js +82 -0
- package/dist/decoders/unity/ress-reader.js.map +1 -0
- package/dist/decoders/unity/serialized-file.d.ts +65 -0
- package/dist/decoders/unity/serialized-file.js +144 -0
- package/dist/decoders/unity/texture2d.js +185 -0
- package/dist/decoders/unity/vertex-data.d.ts +54 -0
- package/dist/decoders/unity/vertex-data.js +174 -0
- package/dist/decoders/unity/vertex-data.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +23 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +66 -0
- package/dist/tools/decode-tools.d.ts +29 -0
- package/dist/tools/decode-tools.js +441 -0
- package/dist/tools/delegates/jar-editor.d.ts +2 -0
- package/dist/tools/delegates/jar-editor.js +276 -0
- package/dist/tools/delegates/unity-decompiler.d.ts +2 -0
- package/dist/tools/delegates/unity-decompiler.js +291 -0
- package/dist/tools/delegates/unreal-assets.d.ts +2 -0
- package/dist/tools/delegates/unreal-assets.js +122 -0
- package/dist/tools/detection-tools.d.ts +2 -0
- package/dist/tools/detection-tools.js +164 -0
- package/dist/tools/detection-tools.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.js +30 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/native/index.d.ts +2 -0
- package/dist/tools/native/index.js +1201 -0
- package/dist/tools/native-comprehension-tools.js +298 -0
- package/dist/tools/native-comprehension-tools.js.map +1 -0
- package/dist/tools/unpack-tools.d.ts +2 -0
- package/dist/tools/unpack-tools.js +382 -0
- package/dist/tools/workflow-tools.d.ts +2 -0
- package/dist/tools/workflow-tools.js +434 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-utils.d.ts +15 -0
- package/dist/utils/path-utils.js +24 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/utils/steam-finder.d.ts +8 -0
- package/dist/utils/steam-finder.js +32 -0
- package/dist/web/web-server.d.ts +1 -0
- package/dist/web/web-server.js +369 -0
- package/licenses/THIRD-PARTY-NOTICES.md +35 -0
- package/llms-install.md +34 -0
- package/package.json +69 -0
- package/server.json +20 -0
- package/setup.ps1 +34 -0
- package/ugm.config.json +9 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
import { eventBus } from '../core/event-bus.js';
|
|
5
|
+
export class McpChild {
|
|
6
|
+
config;
|
|
7
|
+
client = null;
|
|
8
|
+
transport = null;
|
|
9
|
+
connected = false;
|
|
10
|
+
connecting = false;
|
|
11
|
+
pid;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
get name() {
|
|
16
|
+
return this.config.name;
|
|
17
|
+
}
|
|
18
|
+
get isConnected() {
|
|
19
|
+
return this.connected;
|
|
20
|
+
}
|
|
21
|
+
async ensureConnected() {
|
|
22
|
+
if (this.connected)
|
|
23
|
+
return;
|
|
24
|
+
if (this.connecting) {
|
|
25
|
+
// Wait for ongoing connection
|
|
26
|
+
while (this.connecting) {
|
|
27
|
+
await new Promise(r => setTimeout(r, 50));
|
|
28
|
+
}
|
|
29
|
+
if (this.connected)
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.connecting = true;
|
|
33
|
+
try {
|
|
34
|
+
logger.info(`Spawning child MCP server: ${this.config.name}`, {
|
|
35
|
+
command: this.config.command,
|
|
36
|
+
args: this.config.args,
|
|
37
|
+
});
|
|
38
|
+
this.transport = new StdioClientTransport({
|
|
39
|
+
command: this.config.command,
|
|
40
|
+
args: this.config.args || [],
|
|
41
|
+
env: { ...process.env, ...this.config.env },
|
|
42
|
+
stderr: 'pipe',
|
|
43
|
+
});
|
|
44
|
+
this.client = new Client({ name: `ugm-${this.config.name}`, version: '1.0.0' }, { capabilities: {} });
|
|
45
|
+
await this.client.connect(this.transport);
|
|
46
|
+
this.connected = true;
|
|
47
|
+
eventBus.emit('child:status', {
|
|
48
|
+
name: this.config.name,
|
|
49
|
+
pid: this.pid,
|
|
50
|
+
status: 'spawned',
|
|
51
|
+
});
|
|
52
|
+
logger.info(`Child MCP server connected: ${this.config.name}`);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
56
|
+
logger.error(`Failed to connect child: ${this.config.name}`, msg);
|
|
57
|
+
eventBus.emit('child:status', {
|
|
58
|
+
name: this.config.name,
|
|
59
|
+
status: 'error',
|
|
60
|
+
error: msg,
|
|
61
|
+
});
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
this.connecting = false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async callTool(toolName, args) {
|
|
69
|
+
await this.ensureConnected();
|
|
70
|
+
if (!this.client)
|
|
71
|
+
throw new Error(`Child ${this.config.name} not connected`);
|
|
72
|
+
const result = await this.client.callTool({ name: toolName, arguments: args });
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
async listTools() {
|
|
76
|
+
await this.ensureConnected();
|
|
77
|
+
if (!this.client)
|
|
78
|
+
throw new Error(`Child ${this.config.name} not connected`);
|
|
79
|
+
const result = await this.client.listTools();
|
|
80
|
+
return result.tools;
|
|
81
|
+
}
|
|
82
|
+
async close() {
|
|
83
|
+
if (this.client && this.connected) {
|
|
84
|
+
try {
|
|
85
|
+
await this.client.close();
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Ignore close errors
|
|
89
|
+
}
|
|
90
|
+
this.connected = false;
|
|
91
|
+
eventBus.emit('child:status', {
|
|
92
|
+
name: this.config.name,
|
|
93
|
+
status: 'exited',
|
|
94
|
+
exitCode: 0,
|
|
95
|
+
});
|
|
96
|
+
logger.info(`Child MCP server closed: ${this.config.name}`);
|
|
97
|
+
}
|
|
98
|
+
this.client = null;
|
|
99
|
+
this.transport = null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=mcp-child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-child.js","sourceRoot":"","sources":["../../src/backends/mcp-child.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { resolve, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const DEFAULTS = {
|
|
5
|
+
unityDecompilerExe: '',
|
|
6
|
+
unrealAssetExe: '',
|
|
7
|
+
pythonExe: 'python',
|
|
8
|
+
jarEditorScript: '',
|
|
9
|
+
webPort: 7777,
|
|
10
|
+
steamPaths: [],
|
|
11
|
+
modTemplatesDir: '',
|
|
12
|
+
};
|
|
13
|
+
let cachedConfig = null;
|
|
14
|
+
/**
|
|
15
|
+
* Config resolution order (privacy fix, 2026-09-02 -- Gatekeeper finding):
|
|
16
|
+
* 1. $UGM_CONFIG explicit path, wins outright
|
|
17
|
+
* 2. ugm.config.local.json developer / machine-specific paths (git-ignored, NEVER shipped)
|
|
18
|
+
* 3. ugm.config.json the tracked, shippable file -- placeholders only
|
|
19
|
+
* 4. built-in defaults
|
|
20
|
+
* Every loaded file is merged OVER the defaults, so a partial file is fine.
|
|
21
|
+
*/
|
|
22
|
+
export function loadConfig() {
|
|
23
|
+
if (cachedConfig)
|
|
24
|
+
return cachedConfig;
|
|
25
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
26
|
+
const __dirname = dirname(__filename);
|
|
27
|
+
const projectRoot = resolve(__dirname, '..', '..');
|
|
28
|
+
const candidates = [
|
|
29
|
+
process.env.UGM_CONFIG,
|
|
30
|
+
resolve(projectRoot, 'ugm.config.local.json'),
|
|
31
|
+
resolve(projectRoot, 'ugm.config.json'),
|
|
32
|
+
].filter((p) => !!p);
|
|
33
|
+
for (const configPath of candidates) {
|
|
34
|
+
if (!existsSync(configPath))
|
|
35
|
+
continue;
|
|
36
|
+
try {
|
|
37
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
38
|
+
cachedConfig = { ...DEFAULTS, ...JSON.parse(raw) };
|
|
39
|
+
return cachedConfig;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
// unreadable / malformed -> try the next candidate
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
cachedConfig = { ...DEFAULTS };
|
|
46
|
+
return cachedConfig;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAYpC,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C,MAAM,UAAU,UAAU;IACxB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,+CAA+C;IAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAC5C,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oBAAoB;QACpB,YAAY,GAAG;YACb,kBAAkB,EAAE,EAAE;YACtB,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,QAAQ;YACnB,eAAe,EAAE,EAAE;YACnB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,EAAE;YACd,eAAe,EAAE,EAAE;SACpB,CAAC;QACF,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EngineType } from './session.js';
|
|
2
|
+
export interface EngineDetectionResult {
|
|
3
|
+
engine: EngineType;
|
|
4
|
+
runtime: string;
|
|
5
|
+
confidence: 'verified' | 'inferred' | 'uncertain';
|
|
6
|
+
details: string;
|
|
7
|
+
primaryAssembly?: string;
|
|
8
|
+
metadataPath?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Detect the game engine from a directory path.
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectEngine(gamePath: string): EngineDetectionResult;
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'fs';
|
|
2
|
+
import { join, basename, sep } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Recursively search for files matching patterns (shallow, max 3 levels deep).
|
|
5
|
+
*/
|
|
6
|
+
function findFiles(dir, patterns, maxDepth = 3, currentDepth = 0) {
|
|
7
|
+
if (currentDepth >= maxDepth)
|
|
8
|
+
return [];
|
|
9
|
+
const results = [];
|
|
10
|
+
try {
|
|
11
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
12
|
+
for (const entry of entries) {
|
|
13
|
+
const fullPath = join(dir, entry.name);
|
|
14
|
+
const nameLower = entry.name.toLowerCase();
|
|
15
|
+
if (entry.isFile()) {
|
|
16
|
+
for (const pattern of patterns) {
|
|
17
|
+
if (nameLower === pattern.toLowerCase() || matchGlob(nameLower, pattern.toLowerCase())) {
|
|
18
|
+
results.push(fullPath);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else if (entry.isDirectory() && !nameLower.startsWith('.')) {
|
|
23
|
+
results.push(...findFiles(fullPath, patterns, maxDepth, currentDepth + 1));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Permission denied or similar
|
|
29
|
+
}
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
32
|
+
function matchGlob(name, pattern) {
|
|
33
|
+
if (pattern.startsWith('*.')) {
|
|
34
|
+
return name.endsWith(pattern.slice(1));
|
|
35
|
+
}
|
|
36
|
+
return name === pattern;
|
|
37
|
+
}
|
|
38
|
+
function fileExists(dir, name) {
|
|
39
|
+
return existsSync(join(dir, name));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Find a file anywhere in the directory tree (limited depth).
|
|
43
|
+
*/
|
|
44
|
+
function findFileAnywhere(dir, name, maxDepth = 4) {
|
|
45
|
+
const results = findFiles(dir, [name], maxDepth);
|
|
46
|
+
return results.length > 0 ? results[0] : null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Detect the game engine from a directory path.
|
|
50
|
+
*/
|
|
51
|
+
export function detectEngine(gamePath) {
|
|
52
|
+
if (!existsSync(gamePath)) {
|
|
53
|
+
return { engine: null, runtime: 'unknown', confidence: 'uncertain', details: `Path does not exist: ${gamePath}` };
|
|
54
|
+
}
|
|
55
|
+
// --- Unity Detection ---
|
|
56
|
+
// Unity is identified by its definitive data markers, NOT by UnityPlayer.dll alone:
|
|
57
|
+
// some Unity builds (older Mono titles, certain packagings) ship without UnityPlayer.dll
|
|
58
|
+
// while still carrying GameAssembly.dll / Assembly-CSharp.dll / a *_Data directory.
|
|
59
|
+
const unityPlayer = findFileAnywhere(gamePath, 'UnityPlayer.dll', 2);
|
|
60
|
+
const gameAssembly = findFileAnywhere(gamePath, 'GameAssembly.dll', 2);
|
|
61
|
+
const globalMetadata = findFileAnywhere(gamePath, 'global-metadata.dat', 4);
|
|
62
|
+
const assemblyCSharp = findFileAnywhere(gamePath, 'Assembly-CSharp.dll', 4);
|
|
63
|
+
// A "*_Data" directory sitting beside the executable is the Unity player layout.
|
|
64
|
+
let unityDataDir = null;
|
|
65
|
+
try {
|
|
66
|
+
for (const entry of readdirSync(gamePath, { withFileTypes: true })) {
|
|
67
|
+
if (entry.isDirectory() && entry.name.endsWith('_Data')) {
|
|
68
|
+
unityDataDir = join(gamePath, entry.name);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Permission denied or similar
|
|
75
|
+
}
|
|
76
|
+
const isUnity = Boolean(unityPlayer || gameAssembly || assemblyCSharp || unityDataDir);
|
|
77
|
+
if (isUnity) {
|
|
78
|
+
// IL2CPP: the native assembly plus its metadata blob.
|
|
79
|
+
if (gameAssembly && globalMetadata) {
|
|
80
|
+
return {
|
|
81
|
+
engine: 'unity-il2cpp',
|
|
82
|
+
runtime: 'IL2CPP',
|
|
83
|
+
confidence: 'verified',
|
|
84
|
+
details: `Unity IL2CPP game. GameAssembly.dll found at ${gameAssembly}`,
|
|
85
|
+
primaryAssembly: gameAssembly,
|
|
86
|
+
metadataPath: globalMetadata,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Mono: managed Assembly-CSharp.dll.
|
|
90
|
+
if (assemblyCSharp) {
|
|
91
|
+
return {
|
|
92
|
+
engine: 'unity-mono',
|
|
93
|
+
runtime: 'Mono',
|
|
94
|
+
confidence: 'verified',
|
|
95
|
+
details: `Unity Mono game. Assembly-CSharp.dll found at ${assemblyCSharp}`,
|
|
96
|
+
primaryAssembly: assemblyCSharp,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// IL2CPP assembly present but metadata not located: still IL2CPP, lower confidence.
|
|
100
|
+
if (gameAssembly) {
|
|
101
|
+
return {
|
|
102
|
+
engine: 'unity-il2cpp',
|
|
103
|
+
runtime: 'IL2CPP',
|
|
104
|
+
confidence: 'inferred',
|
|
105
|
+
details: `Unity IL2CPP game. GameAssembly.dll found at ${gameAssembly}, but global-metadata.dat was not located.`,
|
|
106
|
+
primaryAssembly: gameAssembly,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Unity layout confirmed, runtime undetermined.
|
|
110
|
+
return {
|
|
111
|
+
engine: 'unity-mono',
|
|
112
|
+
runtime: 'unknown',
|
|
113
|
+
confidence: 'inferred',
|
|
114
|
+
details: unityPlayer
|
|
115
|
+
? 'UnityPlayer.dll found but could not locate Assembly-CSharp.dll or GameAssembly.dll'
|
|
116
|
+
: `Unity data directory found at ${unityDataDir}, but could not locate Assembly-CSharp.dll or GameAssembly.dll`,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// --- Unreal Detection ---
|
|
120
|
+
// Real Unreal titles name their shipping binary "<GameName>-Win64-Shipping.exe"
|
|
121
|
+
// (e.g. Subnautica2-Win64-Shipping.exe), NOT a literal "UE4-/UE5-" prefix, and it lives at
|
|
122
|
+
// <Game>/Binaries/Win64/ -- depth 3 from the install root. Match the pattern, search deep enough.
|
|
123
|
+
const shippingBinaries = findFiles(gamePath, ['*-win64-shipping.exe', '*-win32-shipping.exe', '*-winGDK-shipping.exe'], 4);
|
|
124
|
+
if (shippingBinaries.length > 0) {
|
|
125
|
+
return {
|
|
126
|
+
engine: 'unreal',
|
|
127
|
+
runtime: 'Native',
|
|
128
|
+
confidence: 'verified',
|
|
129
|
+
details: `Unreal Engine game detected via shipping binary ${basename(shippingBinaries[0])}`,
|
|
130
|
+
primaryAssembly: shippingBinaries[0],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Content/Paks is the canonical Unreal cooked-content layout.
|
|
134
|
+
const unrealPaksDir = findFiles(gamePath, ['*.pak'], 4).find((f) => f.toLowerCase().split(sep).join('/').includes('content/paks'));
|
|
135
|
+
if (unrealPaksDir) {
|
|
136
|
+
return {
|
|
137
|
+
engine: 'unreal',
|
|
138
|
+
runtime: 'Native',
|
|
139
|
+
confidence: 'verified',
|
|
140
|
+
details: `Unreal Engine game detected via Content/Paks layout (${basename(unrealPaksDir)})`,
|
|
141
|
+
primaryAssembly: unrealPaksDir,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Check for Engine/Binaries directory
|
|
145
|
+
if (existsSync(join(gamePath, 'Engine', 'Binaries'))) {
|
|
146
|
+
return {
|
|
147
|
+
engine: 'unreal',
|
|
148
|
+
runtime: 'Native',
|
|
149
|
+
confidence: 'verified',
|
|
150
|
+
details: 'Unreal Engine game detected via Engine/Binaries directory',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Check for .pak files (common in Unreal)
|
|
154
|
+
const pakFiles = findFiles(gamePath, ['*.pak'], 3);
|
|
155
|
+
if (pakFiles.length > 0 && !findFileAnywhere(gamePath, 'UnityPlayer.dll', 2)) {
|
|
156
|
+
// Look for additional Unreal markers
|
|
157
|
+
const hasUnrealExe = findFiles(gamePath, ['*.exe'], 2).some(f => {
|
|
158
|
+
const name = basename(f).toLowerCase();
|
|
159
|
+
return name.includes('shipping') || name.includes('ue4') || name.includes('ue5');
|
|
160
|
+
});
|
|
161
|
+
if (hasUnrealExe || existsSync(join(gamePath, 'Engine'))) {
|
|
162
|
+
return {
|
|
163
|
+
engine: 'unreal',
|
|
164
|
+
runtime: 'Native',
|
|
165
|
+
confidence: 'inferred',
|
|
166
|
+
details: `Likely Unreal Engine game. Found ${pakFiles.length} .pak files`,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// --- Godot Detection ---
|
|
171
|
+
const pckFiles = findFiles(gamePath, ['*.pck'], 2);
|
|
172
|
+
if (pckFiles.length > 0) {
|
|
173
|
+
return {
|
|
174
|
+
engine: 'godot',
|
|
175
|
+
runtime: 'GDScript',
|
|
176
|
+
confidence: 'verified',
|
|
177
|
+
details: `Godot game detected. Found ${pckFiles.length} .pck file(s): ${pckFiles[0]}`,
|
|
178
|
+
primaryAssembly: pckFiles[0],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// Godot with embedded PCK (no .pck file, but Godot DLLs present)
|
|
182
|
+
const godotDlls = findFiles(gamePath, ['*.dll'], 2).filter(f => {
|
|
183
|
+
const name = basename(f).toLowerCase();
|
|
184
|
+
return name.includes('godot') || name.startsWith('libgd');
|
|
185
|
+
});
|
|
186
|
+
if (godotDlls.length > 0) {
|
|
187
|
+
// Resources are embedded in the exe
|
|
188
|
+
const exeFiles = findFiles(gamePath, ['*.exe'], 1);
|
|
189
|
+
const mainExe = exeFiles.find(f => !basename(f).toLowerCase().includes('crash'));
|
|
190
|
+
return {
|
|
191
|
+
engine: 'godot',
|
|
192
|
+
runtime: 'GDScript (embedded PCK)',
|
|
193
|
+
confidence: 'verified',
|
|
194
|
+
details: `Godot game detected via DLLs: ${godotDlls.map(f => basename(f)).join(', ')}. Resources embedded in executable.`,
|
|
195
|
+
primaryAssembly: mainExe || exeFiles[0],
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// --- Java Detection ---
|
|
199
|
+
const jarFiles = findFiles(gamePath, ['*.jar'], 2);
|
|
200
|
+
if (jarFiles.length > 0) {
|
|
201
|
+
return {
|
|
202
|
+
engine: 'java',
|
|
203
|
+
runtime: 'JVM',
|
|
204
|
+
confidence: 'inferred',
|
|
205
|
+
details: `Java game detected. Found ${jarFiles.length} .jar file(s)`,
|
|
206
|
+
primaryAssembly: jarFiles[0],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// --- Electron/NW.js Detection ---
|
|
210
|
+
if (fileExists(gamePath, 'electron.exe') || fileExists(gamePath, 'nw.exe')) {
|
|
211
|
+
const runtime = fileExists(gamePath, 'electron.exe') ? 'Electron' : 'NW.js';
|
|
212
|
+
return {
|
|
213
|
+
engine: 'electron',
|
|
214
|
+
runtime,
|
|
215
|
+
confidence: 'verified',
|
|
216
|
+
details: `${runtime}-based game detected`,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// --- Lua Detection ---
|
|
220
|
+
const luaDlls = findFiles(gamePath, ['lua51.dll', 'lua52.dll', 'lua53.dll', 'lua54.dll'], 2);
|
|
221
|
+
if (luaDlls.length > 0) {
|
|
222
|
+
return {
|
|
223
|
+
engine: 'lua',
|
|
224
|
+
runtime: 'Lua',
|
|
225
|
+
confidence: 'inferred',
|
|
226
|
+
details: `Lua-scripted game detected. Found: ${basename(luaDlls[0])}`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// --- Native/Unknown ---
|
|
230
|
+
const exeFiles = findFiles(gamePath, ['*.exe'], 1);
|
|
231
|
+
if (exeFiles.length > 0) {
|
|
232
|
+
return {
|
|
233
|
+
engine: 'native',
|
|
234
|
+
runtime: 'Native',
|
|
235
|
+
confidence: 'uncertain',
|
|
236
|
+
details: `Unknown engine. Found ${exeFiles.length} executable(s). Use analyze_pe_full for deeper inspection.`,
|
|
237
|
+
primaryAssembly: exeFiles[0],
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
engine: null,
|
|
242
|
+
runtime: 'unknown',
|
|
243
|
+
confidence: 'uncertain',
|
|
244
|
+
details: 'Could not detect any known game engine in this directory.',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=engine-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-detector.js","sourceRoot":"","sources":["../../src/core/engine-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAY,MAAM,IAAI,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAY3C;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,QAAkB,EAAE,QAAQ,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC;IAChF,IAAI,YAAY,IAAI,QAAQ;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAE3C,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,SAAS,KAAK,OAAO,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;wBACvF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe;IAC9C,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,KAAK,OAAO,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY;IAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW,EAAE,IAAY,EAAE,QAAQ,GAAG,CAAC;IAC/D,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,QAAQ,EAAE,EAAE,CAAC;IACpH,CAAC;IAED,0BAA0B;IAC1B,oFAAoF;IACpF,yFAAyF;IACzF,oFAAoF;IACpF,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;IAE5E,iFAAiF;IACjF,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACnE,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxD,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,IAAI,cAAc,IAAI,YAAY,CAAC,CAAC;IACvF,IAAI,OAAO,EAAE,CAAC;QACZ,sDAAsD;QACtD,IAAI,YAAY,IAAI,cAAc,EAAE,CAAC;YACnC,OAAO;gBACL,MAAM,EAAE,cAAc;gBACtB,OAAO,EAAE,QAAQ;gBACjB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,gDAAgD,YAAY,EAAE;gBACvE,eAAe,EAAE,YAAY;gBAC7B,YAAY,EAAE,cAAc;aAC7B,CAAC;QACJ,CAAC;QAED,qCAAqC;QACrC,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO;gBACL,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,iDAAiD,cAAc,EAAE;gBAC1E,eAAe,EAAE,cAAc;aAChC,CAAC;QACJ,CAAC;QAED,oFAAoF;QACpF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;gBACL,MAAM,EAAE,cAAc;gBACtB,OAAO,EAAE,QAAQ;gBACjB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,gDAAgD,YAAY,4CAA4C;gBACjH,eAAe,EAAE,YAAY;aAC9B,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,WAAW;gBAClB,CAAC,CAAC,oFAAoF;gBACtF,CAAC,CAAC,iCAAiC,YAAY,gEAAgE;SAClH,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,gFAAgF;IAChF,2FAA2F;IAC3F,kGAAkG;IAClG,MAAM,gBAAgB,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3H,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,mDAAmD,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE;YAC3F,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACjE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAC9D,CAAC;IACF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,wDAAwD,QAAQ,CAAC,aAAa,CAAC,GAAG;YAC3F,eAAe,EAAE,aAAa;SAC/B,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,2DAA2D;SACrE,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7E,qCAAqC;QACrC,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QACH,IAAI,YAAY,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,QAAQ;gBACjB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,oCAAoC,QAAQ,CAAC,MAAM,aAAa;aAC1E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,UAAU;YACnB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,8BAA8B,QAAQ,CAAC,MAAM,kBAAkB,QAAQ,CAAC,CAAC,CAAC,EAAE;YACrF,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,oCAAoC;QACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,OAAO;YACL,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,yBAAyB;YAClC,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,iCAAiC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC;YACzH,eAAe,EAAE,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,6BAA6B,QAAQ,CAAC,MAAM,eAAe;YACpE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5E,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,OAAO;YACP,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,GAAG,OAAO,sBAAsB;SAC1C,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,sCAAsC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;SACtE,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,WAAW;YACvB,OAAO,EAAE,yBAAyB,QAAQ,CAAC,MAAM,4DAA4D;YAC7G,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,SAAS;QAClB,UAAU,EAAE,WAAW;QACvB,OAAO,EAAE,2DAA2D;KACrE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
class UgmEventBus {
|
|
3
|
+
emitter = new EventEmitter();
|
|
4
|
+
constructor() {
|
|
5
|
+
this.emitter.setMaxListeners(50);
|
|
6
|
+
}
|
|
7
|
+
on(event, listener) {
|
|
8
|
+
this.emitter.on(event, listener);
|
|
9
|
+
}
|
|
10
|
+
off(event, listener) {
|
|
11
|
+
this.emitter.off(event, listener);
|
|
12
|
+
}
|
|
13
|
+
emit(event, data) {
|
|
14
|
+
this.emitter.emit(event, data);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export const eventBus = new UgmEventBus();
|
|
18
|
+
//# sourceMappingURL=event-bus.js.map
|