mirror of https://github.com/ioquake/ioq3.git
Add support for mods to web client
ioquake3.html?fs_game=missionpack will run Team Arena when not using --preload-file.
This commit is contained in:
parent
2660bb4a03
commit
7bfd5c90b8
|
@ -15,6 +15,17 @@
|
||||||
{"src": "baseq3/vm/ui.qvm", "dst": "/baseq3/vm"}
|
{"src": "baseq3/vm/ui.qvm", "dst": "/baseq3/vm"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"missionpack": {
|
||||||
|
"files": [
|
||||||
|
{"src": "missionpack/pak0.pk3", "dst": "/missionpack"},
|
||||||
|
{"src": "missionpack/pak1.pk3", "dst": "/missionpack"},
|
||||||
|
{"src": "missionpack/pak2.pk3", "dst": "/missionpack"},
|
||||||
|
{"src": "missionpack/pak3.pk3", "dst": "/missionpack"},
|
||||||
|
{"src": "missionpack/vm/cgame.qvm", "dst": "/missionpack/vm"},
|
||||||
|
{"src": "missionpack/vm/qagame.qvm", "dst": "/missionpack/vm"},
|
||||||
|
{"src": "missionpack/vm/ui.qvm", "dst": "/missionpack/vm"}
|
||||||
|
]
|
||||||
|
},
|
||||||
"demoq3": {
|
"demoq3": {
|
||||||
"_comment": "Copy baseq3/vm/*.qvm to demoq3/vm/ as the Quake 3 demo QVMs are not compatible. However the botfiles are not fully compatible with newer QVMs.",
|
"_comment": "Copy baseq3/vm/*.qvm to demoq3/vm/ as the Quake 3 demo QVMs are not compatible. However the botfiles are not fully compatible with newer QVMs.",
|
||||||
"files": [
|
"files": [
|
||||||
|
|
|
@ -34,11 +34,15 @@ if (window.location.protocol === 'file:') throw new Error(`Unfortunately browser
|
||||||
// First set up the command line arguments and the Emscripten filesystem.
|
// First set up the command line arguments and the Emscripten filesystem.
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
const com_basegame = urlParams.get('com_basegame') || BASEGAME;
|
const com_basegame = urlParams.get('com_basegame') || BASEGAME;
|
||||||
|
const fs_basegame = urlParams.get('fs_basegame') || '';
|
||||||
|
const fs_game = urlParams.get('fs_game') || '';
|
||||||
let generatedArguments = `
|
let generatedArguments = `
|
||||||
+set sv_pure 0
|
+set sv_pure 0
|
||||||
+set net_enabled 0
|
+set net_enabled 0
|
||||||
+set r_mode -2
|
+set r_mode -2
|
||||||
+set com_basegame "${com_basegame}"
|
+set com_basegame "${com_basegame}"
|
||||||
|
+set fs_basegame "${fs_basegame}"
|
||||||
|
+set fs_game "${fs_game}"
|
||||||
`;
|
`;
|
||||||
// Note that unfortunately "+" needs to be encoded as "%2b" in URL query strings or it will be stripped by the browser.
|
// Note that unfortunately "+" needs to be encoded as "%2b" in URL query strings or it will be stripped by the browser.
|
||||||
const queryArgs = urlParams.get('args');
|
const queryArgs = urlParams.get('args');
|
||||||
|
@ -81,21 +85,28 @@ ioquake3({
|
||||||
module.addRunDependency('setup-ioq3-filesystem');
|
module.addRunDependency('setup-ioq3-filesystem');
|
||||||
try {
|
try {
|
||||||
const config = await configPromise;
|
const config = await configPromise;
|
||||||
const gamedir = com_basegame;
|
const gamedirs = [com_basegame,fs_basegame,fs_game];
|
||||||
if (config[gamedir] === null
|
for (let g = 0; g < gamedirs.length; g++) {
|
||||||
|| config[gamedir].files === null) {
|
const gamedir = gamedirs[g];
|
||||||
console.warn(`Game directory '${gamedir}' cannot be used. It must have files listed in ${configFilename}.`);
|
if (gamedir === '') {
|
||||||
}
|
continue;
|
||||||
const files = config[gamedir].files;
|
}
|
||||||
const fetches = files.map(file => fetch(new URL(file.src, dataURL)));
|
if (config[gamedir] === null
|
||||||
for (let i = 0; i < files.length; i++) {
|
|| config[gamedir].files === null) {
|
||||||
const response = await fetches[i];
|
console.warn(`Game directory '${gamedir}' cannot be used. It must have files listed in ${configFilename}.`);
|
||||||
if (!response.ok) continue;
|
continue;
|
||||||
const data = await response.arrayBuffer();
|
}
|
||||||
let name = files[i].src.match(/[^/]+$/)[0];
|
const files = config[gamedir].files;
|
||||||
let dir = files[i].dst;
|
const fetches = files.map(file => fetch(new URL(file.src, dataURL)));
|
||||||
module.FS.mkdirTree(dir);
|
for (let i = 0; i < files.length; i++) {
|
||||||
module.FS.writeFile(`${dir}/${name}`, new Uint8Array(data));
|
const response = await fetches[i];
|
||||||
|
if (!response.ok) continue;
|
||||||
|
const data = await response.arrayBuffer();
|
||||||
|
let name = files[i].src.match(/[^/]+$/)[0];
|
||||||
|
let dir = files[i].dst;
|
||||||
|
module.FS.mkdirTree(dir);
|
||||||
|
module.FS.writeFile(`${dir}/${name}`, new Uint8Array(data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
module.removeRunDependency('setup-ioq3-filesystem');
|
module.removeRunDependency('setup-ioq3-filesystem');
|
||||||
|
|
Loading…
Reference in New Issue