17 Commits

Author SHA1 Message Date
CakeLancelot
3fc6cabe33 Disable telemetry in player dll
Co-authored-by: gsemaj <gsemaj@proton.me>
2023-09-19 08:59:13 -05:00
CakeLancelot
71e4694ff6 Misc comment cleanup, correct holiday date range, simplify JSON loading 2023-09-19 08:57:50 -05:00
CakeLancelot
76f4a05287 Move server-selector over to path.join(), fix issues with cache swapping
Before, swapping would continually fail if a cache tried to be stored at a directory that already existed. The skipping mechanism likely also didn't work as intended. Both have been fixed now.
Additionally:
* Added .editorconfig file 
* Ran prettier format
* Misc. refactoring
2023-09-19 08:57:29 -05:00
CakeLancelot
97144aad59 Remove initial setup window
Now that we only copy a few json files for the initial setup, the process is so fast the progress window isn't really needed anymore
2023-09-17 13:02:19 -05:00
CakeLancelot
4a465ca689 README: include preleases for release badge 2023-09-17 09:42:41 -05:00
CakeLancelot
43f0c8c684 Revise loader DLL to work under Wine, loading screen beta text, cleanup 2023-09-16 20:57:13 -05:00
CakeLancelot
d4dc403e90 Remove now unnecessary attributes from game-client.js 2023-09-14 15:13:23 -05:00
CakeLancelot
ab5de9488d Fix DNS resolution
not sure why this works but resolve4 doesn't
2023-09-14 06:44:11 -05:00
CakeLancelot
dabb8bf484 Use extra-plugin-dirs in Electron to load plugin, add fusion manifest.
This has the advantage of being self contained (doesn't conflict with Unity 3.x - 5.x loader, so we can use the original one) and **disabling auto updates actually works**.

We can also eliminate any code used to install and verify unity, since it's all self contained.

Also added fusion manifest file to set process as DPI aware, and set ACP to UTF-8 on Windows 10 1903 and above.

Bumped version to 1.4.2
2023-09-14 05:29:34 -05:00
CakeLancelot
043bf219e7 Consistency pass and small tweaks
**Formatting going forward**
Variables: camelCase (capitalization of two letter abbreviations is OK, e.g. playerID)
Classes: PascalCase
CSS: kebab-case
Files: kebab-case

**Other miscellaneous changes**
* The WebPlayer crashing as well as failing to load the config file are now fatal  errors and will quit the app
* Moved some style attributes from index.html into openfusion.css
2023-09-03 05:12:30 -05:00
CakeLancelot
7131026b2f Misc tweaks
loadURL() -> loadUrl() in index.js
Move Bootstrap files
2023-09-02 23:03:00 -05:00
7dd018e336 Use local fonts for Bootstrap
bootstrap.min.css was fetching a css snippet for the Roboto font
remotely. Inlined the snippet and modified it to load the font files
locally.
2023-09-03 01:44:09 +02:00
CakeLancelot
e19098a13e README update 2023-07-11 19:40:51 -05:00
CakeLancelot
48e2052748 Fix call to nonexistent function in URL redirection
Gotta love runtime errors
2023-04-23 15:37:44 -05:00
CakeLancelot
7b3de1fe52 Bump fs-extra version to 2.0.0
This is the latest version that supports ES5
2023-02-17 20:07:52 -06:00
CakeLancelot
675a5fce50 Update repo URL in package.json 2023-02-11 16:08:25 +00:00
CakeLancelot
2bf916ea58 Fix bug in WebPlayer installation logic
Also run prettier
2023-02-09 12:52:57 -06:00
53 changed files with 397 additions and 406 deletions

19
.editorconfig Normal file
View File

@@ -0,0 +1,19 @@
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
# 4 space indentation
[*.js, *.css, *.html, *.json]
indent_style = space
indent_size = 4
# Don't enforce anything in vendored code
[*.min.*]
end_of_line = unset
insert_final_newline = unset
indent_style = unset
indent_style = unset

View File

@@ -1,3 +1,52 @@
# OpenFusionClient # OpenFusionClient
Electron app for joining OpenFusion servers [![Current Release](https://img.shields.io/github/v/release/OpenFusionProject/OpenFusionClient?include_prereleases)](https://github.com/OpenFusionProject/OpenFusionClient/releases/latest) [![Discord](https://img.shields.io/badge/chat-on%20discord-7289da.svg?logo=discord)](https://discord.gg/DYavckB)[![License](https://img.shields.io/github/license/OpenFusionProject/OpenFusionClient)](https://github.com/OpenFusionProject/OpenFusionClient/blob/master/LICENSE.md)
An Electron app that allows you to easily join FusionFall servers.
It automatically installs FF's custom build of Unity Web Player, manages text files such as `assetInfo.php`/`loginInfo.php`, and embeds the game, all in a few clicks!
For an overview of how the game client worked originally, please see [this section in the OpenFusion README](https://github.com/OpenFusionProject/OpenFusion#architecture).
## Disclaimer
This repository does not contain any code from the actual FusionFall game client. **Think of it more as a launcher:** it abstracts away having to use a NPAPI plugin capable web browser, along with having to host a HTTP server for it to connect to.
In addition, if you are interested in contributing: do note that **this project likely cannot utilize more modern Javascript techniques**. In order to use NPAPI plugins, a very old version of Electron was needed (0.31.0). This limits the project to only a portion of ES5 in non-strict mode, and a reduced subset of Node/Electron APIs.
## Usage
Provided that you have npm installed, clone the repository, then run install like so:
```
git clone https://github.com/OpenFusionProject/OpenFusionClient.git
npm install
```
After that has completed you can then test OpenFusionClient:
```
npm run start
```
If you would like to package it as a standalone win32 application:
```
npm run pack
```
You can then compress the application directory into a zip file and installer for distribution:
```
npm run dist
```
Before opening a PR or running pack/dist, please do a code formatting pass:
```
npm run prettier
```
## License
MIT unless specified otherwise

File diff suppressed because one or more lines are too long

30
assets/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -47,6 +47,11 @@ img {
} }
body { body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
clear: both;
user-select: none; user-select: none;
background-color: #000; background-color: #000;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
@@ -129,3 +134,12 @@ button > i {
#server-table .server-listing-entry { #server-table .server-listing-entry {
cursor: pointer; cursor: pointer;
} }
#client {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
background: #000;
clear: both;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 176 B

After

Width:  |  Height:  |  Size: 176 B

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -1,10 +1,8 @@
// You're kind of ruining the surprise by reading this, but whatever // You're kind of ruining the surprise by reading this, but whatever
var today = new Date(); var today = new Date();
// Check Christmas season: Date constructor in Javascript uses an index var christmasBegin = new Date(today.getFullYear(), 11, 21);
// so 11 is Dec. of this year, and 12 is Jan. of the next var christmasEnd = new Date(today.getFullYear(), 11, 31);
var christmasBegin = new Date(today.getFullYear(), 11, 23);
var christmasEnd = new Date(today.getFullYear(), 12, 8);
var sf; var sf;
if (today >= christmasBegin && today <= christmasEnd) { if (today >= christmasBegin && today <= christmasEnd) {

View File

@@ -5,7 +5,7 @@ var gameRunning = false;
// Uncomment and enter credentials to skip login screen // Uncomment and enter credentials to skip login screen
function authDoCallback(param) { function authDoCallback(param) {
/*var unity = document.getElementById('Unity_embed'); /*var unity = document.getElementById('unityEmbed');
unity.SendMessage("GlobalManager", "SetTEGid", "player"); unity.SendMessage("GlobalManager", "SetTEGid", "player");
unity.SendMessage("GlobalManager", "SetAuthid", "0"); unity.SendMessage("GlobalManager", "SetAuthid", "0");
unity.SendMessage("GlobalManager", "DoAuth", 0);*/ unity.SendMessage("GlobalManager", "DoAuth", 0);*/
@@ -33,7 +33,7 @@ function PayPage(param) {
function onResize() { function onResize() {
if (gameRunning == true) { if (gameRunning == true) {
var unity = document.getElementById("Unity_embed"); var unity = document.getElementById("unityEmbed");
unity.style.width = window.innerWidth + "px"; unity.style.width = window.innerWidth + "px";
unity.style.height = window.innerHeight + "px"; unity.style.height = window.innerHeight + "px";
} }
@@ -56,38 +56,29 @@ function launchGame() {
"codebase", "codebase",
"undefined/UnityWebPlayer.cab#version=2,0,0,0" "undefined/UnityWebPlayer.cab#version=2,0,0,0"
); );
object.setAttribute("id", "Unity_object"); object.setAttribute("id", "unityObject");
object.setAttribute("width", "1264"); object.setAttribute("width", "1264");
object.setAttribute("height", "661"); object.setAttribute("height", "661");
var embed = document.createElement("embed"); var embed = document.createElement("embed");
embed.setAttribute("type", "application/vnd.unity"); embed.setAttribute("type", "application/vnd.ffuwp");
embed.setAttribute( embed.setAttribute(
"pluginspage", "pluginspage",
"http://www.unity3d.com/unity-web-player-2.x" "http://www.unity3d.com/unity-web-player-2.x"
); );
embed.setAttribute("id", "Unity_embed"); embed.setAttribute("id", "unityEmbed");
embed.setAttribute("width", "1280"); embed.setAttribute("width", "1280");
embed.setAttribute("height", "680"); embed.setAttribute("height", "680");
embed.setAttribute("src", window.asseturl + "main.unity3d"); embed.setAttribute("src", window.assetUrl + "main.unity3d");
embed.setAttribute("disablecontdparaextmenu", "true");
embed.setAttribute("bordercolor", "000000"); embed.setAttribute("bordercolor", "000000");
embed.setAttribute("backgroundcolor", "000000"); embed.setAttribute("backgroundcolor", "000000");
embed.setAttribute("disableContextMenu", true); embed.setAttribute("disableContextMenu", true);
embed.setAttribute("textcolor", "ccffff"); embed.setAttribute("textcolor", "ccffff");
embed.setAttribute("logoimage", "assets/img/unity_dexlabs.png"); embed.setAttribute("logoimage", "assets/img/unity-dexlabs.png");
embed.setAttribute("progressbarimage", "assets/img/unity_loadingbar.png"); embed.setAttribute("progressbarimage", "assets/img/unity-loadingbar.png");
embed.setAttribute( embed.setAttribute(
"progressframeimage", "progressframeimage",
"assets/img/unity_loadingframe.png" "assets/img/unity-loadingframe.png"
);
embed.setAttribute(
"autoupdateurlsignature",
"42180ee5edc4e3d4dd706bcc17cedd8d6ec7b7ac463071fd34ab97fe181f1a78df31db5feb4526677e4f69ef53acaff44471591e68b87f041c80fd54765f0d5725b08aa28f5acf7716ffb2a04e971269f35925c7e38d57dd78f6a206530caaa3da7e32f07f19810efc0ebf29a4eae976a925ad9cc5beb4dd51564c67dc489033"
);
embed.setAttribute(
"autoupdateurl",
"http://wp-cartoonnetwork.unity3d.com/ff/big/beta-20111013/autodownload_webplugin_beta"
); );
var div = document.getElementById("client"); var div = document.getElementById("client");

View File

@@ -1,10 +1,15 @@
var remote = require("remote"); var remote = require("remote");
var remotefs = remote.require("fs-extra"); var remotefs = remote.require("fs-extra");
var dns = remote.require("dns"); var dns = remote.require("dns");
var path = remote.require("path");
var userdir = remote.require("app").getPath("userData"); var userData = remote.require("app").getPath("userData");
var versionarray; var configPath = path.join(userData, "config.json");
var serverarray; var serversPath = path.join(userData, "servers.json");
var versionsPath = path.join(userData, "versions.json");
var versionArray;
var serverArray;
var config; var config;
function enableServerListButtons() { function enableServerListButtons() {
@@ -26,26 +31,24 @@ function disableServerListButtons() {
} }
function getAppVersion() { function getAppVersion() {
appversion = remote.require("app").getVersion(); appVersion = remote.require("app").getVersion();
// simplify version, ex. 1.4.0 -> 1.4, // Simplify version, ex. 1.4.0 -> 1.4,
// but only if a revision number isn't present // but only if a revision number isn't present
if(appversion.endsWith(".0")){ if (appVersion.endsWith(".0")) {
return appversion.substr(0, appversion.length - 2) return appVersion.substr(0, appVersion.length - 2);
} else { } else {
return appversion return appVersion;
} }
} }
function setAppVersionText() { function setAppVersionText() {
$("#of-aboutversionnumber").text("Version " + getAppVersion()); $("#of-aboutversionnumber").text("Version " + getAppVersion());
$("#of-versionnumber").text("v" + getAppVersion()); $("#of-versionnumber").text("v" + getAppVersion());
} }
function addServer() { function addServer() {
var jsontomodify = JSON.parse( var jsonToModify = remotefs.readJsonSync(serversPath);
remotefs.readFileSync(userdir + "\\servers.json")
);
var server = {}; var server = {};
server["uuid"] = uuidv4(); server["uuid"] = uuidv4();
@@ -60,20 +63,15 @@ function addServer() {
server["version"] = $("#addserver-versionselect option:selected").text(); server["version"] = $("#addserver-versionselect option:selected").text();
//server['endpoint'] = //server['endpoint'] =
jsontomodify["servers"].push(server); jsonToModify["servers"].push(server);
remotefs.writeFileSync( remotefs.writeFileSync(serversPath, JSON.stringify(jsonToModify, null, 4));
userdir + "\\servers.json",
JSON.stringify(jsontomodify, null, 4)
);
loadServerList(); loadServerList();
} }
function editServer() { function editServer() {
var jsontomodify = JSON.parse( var jsonToModify = remotefs.readJsonSync(serversPath);
remotefs.readFileSync(userdir + "\\servers.json") $.each(jsonToModify["servers"], function (key, value) {
);
$.each(jsontomodify["servers"], function (key, value) {
if (value["uuid"] == getSelectedServer()) { if (value["uuid"] == getSelectedServer()) {
value["description"] = value["description"] =
$("#editserver-descinput").val().length == 0 $("#editserver-descinput").val().length == 0
@@ -89,69 +87,57 @@ function editServer() {
} }
}); });
remotefs.writeFileSync( remotefs.writeFileSync(serversPath, JSON.stringify(jsonToModify, null, 4));
userdir + "\\servers.json",
JSON.stringify(jsontomodify, null, 4)
);
loadServerList(); loadServerList();
} }
function deleteServer() { function deleteServer() {
var jsontomodify = JSON.parse( var jsonToModify = remotefs.readJsonSync(serversPath);
remotefs.readFileSync(userdir + "\\servers.json") var result = jsonToModify["servers"].filter(function (obj) {
);
var result = jsontomodify["servers"].filter(function (obj) {
return obj.uuid === getSelectedServer(); return obj.uuid === getSelectedServer();
})[0]; })[0];
var resultindex = jsontomodify["servers"].indexOf(result); var resultindex = jsonToModify["servers"].indexOf(result);
jsontomodify["servers"].splice(resultindex, 1); jsonToModify["servers"].splice(resultindex, 1);
remotefs.writeFileSync( remotefs.writeFileSync(serversPath, JSON.stringify(jsonToModify, null, 4));
userdir + "\\servers.json",
JSON.stringify(jsontomodify, null, 4)
);
loadServerList(); loadServerList();
} }
function restoreDefaultServers() { function restoreDefaultServers() {
remotefs.copySync( remotefs.copySync(
__dirname + "\\defaults\\servers.json", path.join(__dirname, "/defaults/servers.json"),
userdir + "\\servers.json" serversPath
); );
loadServerList(); loadServerList();
} }
function loadGameVersions() { function loadGameVersions() {
var versionjson = JSON.parse( var versionJson = remotefs.readJsonSync(versionsPath);
remotefs.readFileSync(userdir + "\\versions.json") versionArray = versionJson["versions"];
); $.each(versionArray, function (key, value) {
versionarray = versionjson["versions"];
$.each(versionarray, function (key, value) {
$(new Option(value.name, "val")).appendTo("#addserver-versionselect"); $(new Option(value.name, "val")).appendTo("#addserver-versionselect");
$(new Option(value.name, "val")).appendTo("#editserver-versionselect"); $(new Option(value.name, "val")).appendTo("#editserver-versionselect");
}); });
} }
function loadConfig() { function loadConfig() {
// load config object globally // Load config object globally
config = JSON.parse(remotefs.readFileSync(userdir + "\\config.json")); config = remotefs.readJsonSync(configPath);
} }
function loadServerList() { function loadServerList() {
var serverjson = JSON.parse( var serverJson = remotefs.readJsonSync(serversPath);
remotefs.readFileSync(userdir + "\\servers.json") serverArray = serverJson["servers"];
);
serverarray = serverjson["servers"];
$(".server-listing-entry").remove(); // Clear out old stuff, if any $(".server-listing-entry").remove(); // Clear out old stuff, if any
disableServerListButtons(); // Disable buttons until another server is selected disableServerListButtons(); // Disable buttons until another server is selected
if (serverarray.length > 0) { if (serverArray.length > 0) {
// Servers were found in the JSON // Servers were found in the JSON
$("#server-listing-placeholder").attr("hidden", true); $("#server-listing-placeholder").attr("hidden", true);
$.each(serverarray, function (key, value) { $.each(serverArray, function (key, value) {
// Create the row, and populate the cells // Create the row, and populate the cells
var row = document.createElement("tr"); var row = document.createElement("tr");
row.className = "server-listing-entry"; row.className = "server-listing-entry";
@@ -172,63 +158,66 @@ function loadServerList() {
} }
} }
function performCacheSwap(newversion) { function performCacheSwap(newVersion) {
var cacheroot = userdir + "\\..\\..\\LocalLow\\Unity\\Web Player\\Cache"; var cacheRoot = path.join(
var currentcache = cacheroot + "\\Fusionfall"; userData,
var newcache = cacheroot + "\\" + newversion; "/../../LocalLow/Unity/Web Player/Cache"
var record = userdir + "\\.lastver"; );
var currentCache = path.join(cacheRoot, "FusionFall");
var newCache = path.join(cacheRoot, newVersion);
var record = path.join(userData, ".lastver");
var lastVersion = remotefs.readFileSync(record, (encoding = "utf8"));
// if cache renaming would result in a no-op (ex. launching the same version // Make note of what version we are launching for next launch
// two times), then skip it. this avoids permissions errors with multiple clients remotefs.writeFileSync(record, newVersion);
// If cache renaming would result in a no-op (ex. launching the same version
// two times), then skip it. This avoids permissions errors with multiple clients
// (file/folder is already open in another process) // (file/folder is already open in another process)
var skip = false; var skip = false;
if (remotefs.existsSync(currentcache)) { if (remotefs.existsSync(currentCache)) {
// cache already exists, find out what version it belongs to // Cache already exists, find out what version it belongs to
if (remotefs.existsSync(record)) { if (remotefs.existsSync(record)) {
lastversion = remotefs.readFileSync(record); if (lastVersion != newVersion) {
if (lastversion != newversion) { // Remove the directory we're trying to store the
// existing cache to if it already exists for whatever
// reason, as it would cause an EPERM error otherwise.
// This is a no-op if the directory doesn't exist
remotefs.removeSync(path.join(cacheRoot, lastVersion));
// Store old cache to named directory
remotefs.renameSync( remotefs.renameSync(
currentcache, currentCache,
cacheroot + "\\" + lastversion path.join(cacheRoot, lastVersion)
); );
} else { } else {
console.log( console.log("Cached version unchanged, skipping rename");
"Cached version unchanged, renaming will be skipped"
);
skip = true; skip = true;
} }
console.log("Current cache is " + lastversion); console.log("Current cache is " + lastVersion);
} else {
console.log(
"Couldn't find last version record; cache may get overwritten"
);
} }
} }
if (remotefs.existsSync(newcache) || !skip) { if (remotefs.existsSync(newCache) && !skip) {
// rename saved cache to FusionFall // Rename saved cache to FusionFall
remotefs.renameSync(newcache, currentcache); remotefs.renameSync(newCache, currentCache);
console.log("Current cache swapped to " + newversion); console.log("Current cache swapped to " + newVersion);
} }
// make note of what version we are launching for next launch
remotefs.writeFileSync(record, newversion);
} }
// For writing loginInfo.php, assetInfo.php, etc. // For writing loginInfo.php, assetInfo.php, etc.
function setGameInfo(serverUUID) { function setGameInfo(serverUUID) {
var result = serverarray.filter(function (obj) { var result = serverArray.filter(function (obj) {
return obj.uuid === serverUUID; return obj.uuid === serverUUID;
})[0]; })[0];
var gameversion = versionarray.filter(function (obj) { var gameVersion = versionArray.filter(function (obj) {
return obj.name === result.version; return obj.name === result.version;
})[0]; })[0];
// if cache swapping property exists AND is `true`, run cache swapping logic // If cache swapping property exists AND is `true`, run cache swapping logic
if (config["cache-swapping"]) { if (config["cache-swapping"]) {
try { try {
performCacheSwap(gameversion.name); performCacheSwap(gameVersion.name);
} catch (ex) { } catch (ex) {
console.log( console.log(
"Error when swapping cache, it may get overwritten:\n" + ex "Error when swapping cache, it may get overwritten:\n" + ex
@@ -236,33 +225,36 @@ function setGameInfo(serverUUID) {
} }
} }
window.asseturl = gameversion.url; // gameclient.js needs to access this window.assetUrl = gameVersion.url; // game-client.js needs to access this
remotefs.writeFileSync(__dirname + "\\assetInfo.php", asseturl); remotefs.writeFileSync(path.join(__dirname, "assetInfo.php"), assetUrl);
if (result.hasOwnProperty("endpoint")) { if (result.hasOwnProperty("endpoint")) {
var httpendpoint = result.endpoint.replace("https://", "http://"); var httpEndpoint = result.endpoint.replace("https://", "http://");
remotefs.writeFileSync( remotefs.writeFileSync(
__dirname + "\\rankurl.txt", path.join(__dirname, "rankurl.txt"),
httpendpoint + "getranks" httpEndpoint + "getranks"
); );
// Write these out too // Write these out too
remotefs.writeFileSync( remotefs.writeFileSync(
__dirname + "\\sponsor.php", path.join(__dirname, "sponsor.php"),
httpendpoint + "upsell/sponsor.png" httpEndpoint + "upsell/sponsor.png"
); );
remotefs.writeFileSync( remotefs.writeFileSync(
__dirname + "\\images.php", path.join(__dirname, "images.php"),
httpendpoint + "upsell/" httpEndpoint + "upsell/"
); );
} else { } else {
// Remove/default the endpoint related stuff, this server won't be using it // Remove/default the endpoint related stuff, this server won't be using it
if (remotefs.existsSync(__dirname + "\\rankurl.txt")) { if (remotefs.existsSync(path.join(__dirname, "rankurl.txt"))) {
remotefs.unlinkSync(__dirname + "\\rankurl.txt"); remotefs.unlinkSync(path.join(__dirname, "rankurl.txt"));
remotefs.writeFileSync( remotefs.writeFileSync(
__dirname + "\\sponsor.php", path.join(__dirname, "sponsor.php"),
"assets/img/welcome.png" "assets/img/welcome.png"
); );
remotefs.writeFileSync(__dirname + "\\images.php", "assets/img/"); remotefs.writeFileSync(
path.join(__dirname, "images.php"),
"assets/img/"
);
} }
} }
@@ -280,10 +272,10 @@ function setGameInfo(serverUUID) {
// DNS resolution. there is no synchronous version for some stupid reason // DNS resolution. there is no synchronous version for some stupid reason
if (!address.match(/^[0-9.]+$/)) if (!address.match(/^[0-9.]+$/))
dns.resolve4(address, function (err, res) { dns.lookup(address, (family = 4), function (err, resolvedAddress) {
if (!err) { if (!err) {
console.log("Resolved " + address + " to " + res[0]); console.log("Resolved " + address + " to " + resolvedAddress);
address = res[0]; address = resolvedAddress;
} else { } else {
console.log("Err: " + err.code); console.log("Err: " + err.code);
} }
@@ -298,7 +290,7 @@ function setGameInfo(serverUUID) {
function prepConnection(address, port) { function prepConnection(address, port) {
var full = address + ":" + port; var full = address + ":" + port;
console.log("Will connect to " + full); console.log("Will connect to " + full);
remotefs.writeFileSync(__dirname + "\\loginInfo.php", full); remotefs.writeFileSync(path.join(__dirname, "loginInfo.php"), full);
launchGame(); launchGame();
} }
@@ -341,10 +333,10 @@ $("#server-table").on("dblclick", ".server-listing-entry", function (event) {
}); });
$("#of-editservermodal").on("show.bs.modal", function (e) { $("#of-editservermodal").on("show.bs.modal", function (e) {
var jsontomodify = JSON.parse( var jsonToModify = remotefs.readJsonSync(
remotefs.readFileSync(userdir + "\\servers.json") path.join(userData, "servers.json")
); );
$.each(jsontomodify["servers"], function (key, value) { $.each(jsonToModify["servers"], function (key, value) {
if (value["uuid"] == getSelectedServer()) { if (value["uuid"] == getSelectedServer()) {
$("#editserver-descinput")[0].value = value["description"]; $("#editserver-descinput")[0].value = value["description"];
$("#editserver-ipinput")[0].value = value["ip"]; $("#editserver-ipinput")[0].value = value["ip"];
@@ -361,7 +353,7 @@ $("#of-editservermodal").on("show.bs.modal", function (e) {
}); });
$("#of-deleteservermodal").on("show.bs.modal", function (e) { $("#of-deleteservermodal").on("show.bs.modal", function (e) {
var result = serverarray.filter(function (obj) { var result = serverArray.filter(function (obj) {
return obj.uuid === getSelectedServer(); return obj.uuid === getSelectedServer();
})[0]; })[0];
$("#deleteserver-servername").html(result.description); $("#deleteserver-servername").html(result.description);

View File

@@ -0,0 +1,8 @@
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
<activeCodePage>UTF-8</activeCodePage>
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<plist> <plist>
<dict> <dict>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>2.5.5b4</string> <string>2.5.5b4</string>
<key>UnityBuildNumber</key> <key>UnityBuildNumber</key>
<string>50</string> <string>50</string>
</dict> </dict>
</plist> </plist>

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<plist> <plist>
<dict> <dict>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>3.5.2f2</string> <string>2.5.5b4</string>
<key>UnityBuildNumber</key> <key>UnityBuildNumber</key>
<string>4c6ee796dacc</string> <string>50</string>
</dict> </dict>
</plist> </plist>

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<plist> <plist>
<dict> <dict>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>2.5.5b4</string> <string>2.5.5b4</string>
<key>UnityBuildNumber</key> <key>UnityBuildNumber</key>
<string>50</string> <string>50</string>
<key>monoVersion</key> <key>monoVersion</key>
<string>fusion-2.x.x</string> <string>fusion-2.x.x</string>
<key>monoMinimumRevision</key> <key>monoMinimumRevision</key>
<string>2.0.0f6</string> <string>2.0.0f6</string>
</dict> </dict>
</plist> </plist>

View File

@@ -1,16 +1,16 @@
const fs = require('fs'); const fs = require('fs');
const defaultdir = './dist/win-ia32-unpacked/resources/default_app' const defaultDir = './dist/win-ia32-unpacked/resources/default_app'
const exefile = './dist/win-ia32-unpacked/OpenFusionClient.exe' const exeFile = './dist/win-ia32-unpacked/OpenFusionClient.exe'
exports.default = function() { exports.default = function() {
// remove leftover files from default electron app // remove leftover files from default electron app
fs.rm(dir, { recursive: true }, (err) => { fs.rm(defaultDir, { recursive: true }, (err) => {
if (err) { if (err) {
throw err; throw err;
} }
}); });
// patch executable for large address awareness // patch executable for large address awareness
fs.open(exefile, "r+", (err, fd) => { fs.open(exeFile, "r+", (err, fd) => {
if(!err) { if(!err) {
fs.write( fs.write(
fd, new Uint8Array([0x22]), 0, 1, 0x166, fd, new Uint8Array([0x22]), 0, 1, 0x166,

Binary file not shown.

View File

@@ -3,27 +3,18 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta <meta
name="viewport" http-equiv="Content-Type"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no" contentType="text/html; charset=UTF-8"
/> />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OpenFusion: Server Selector</title> <title>OpenFusion: Server Selector</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css" /> <link rel="stylesheet" href="assets/css/bootstrap.min.css" />
<link rel="stylesheet" href="assets/fonts/fontawesome-all.min.css" /> <link rel="stylesheet" href="assets/fonts/fontawesome-all.min.css" />
<link rel="stylesheet" href="assets/css/openfusion.css" /> <link rel="stylesheet" href="assets/css/openfusion.css" />
<link rel="stylesheet" href="assets/css/styles.css" /> <link rel="stylesheet" href="assets/css/styles.css" />
</head> </head>
<body <body onresize="onResize()">
style="
background: rgb(0, 0, 0);
width: 100%;
height: 100%;
margin: 0;
padding: 0;
clear: both;
"
onresize="onResize()"
>
<section id="of-serverselector"> <section id="of-serverselector">
<div class="container" id="serverselector-container"> <div class="container" id="serverselector-container">
<div class="row text-center mt-3" id="of-logoheader"> <div class="row text-center mt-3" id="of-logoheader">
@@ -151,7 +142,12 @@
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p id="of-aboutversionnumber" class="text-monospace">APP_VERSION_NUMBER</p> <p
id="of-aboutversionnumber"
class="text-monospace"
>
APP_VERSION_NUMBER
</p>
<p> <p>
©2020-2023 OpenFusion Contributors<br />OpenFusion ©2020-2023 OpenFusion Contributors<br />OpenFusion
is licensed under MIT.<br /> is licensed under MIT.<br />
@@ -459,28 +455,18 @@
</div> </div>
</section> </section>
<section> <section>
<div <div id="client"></div>
id="client"
style="
width: 100%;
height: 100%;
margin: 0;
padding: 0;
background: #000;
clear: both;
"
></div>
</section> </section>
<script <script
src="assets/js/jquery.min.js" src="assets/js/jquery.min.js"
onload="window.$ = window.jQuery = module.exports;" onload="window.$ = window.jQuery = module.exports;"
></script> ></script>
<script src="assets/bootstrap/js/bootstrap.min.js"></script> <script src="assets/js/bootstrap.min.js"></script>
<script src="assets/js/bs-init.js"></script> <script src="assets/js/bs-init.js"></script>
<script src="assets/js/uuidv4.min.js"></script> <script src="assets/js/uuidv4.min.js"></script>
<script src="assets/js/serverselector.js"></script> <script src="assets/js/server-selector.js"></script>
<script src="assets/js/gameclient.js"></script> <script src="assets/js/game-client.js"></script>
<script src="assets/js/snowflakes.min.js"></script> <script src="assets/js/snowflakes.min.js"></script>
<script src="assets/js/eastereggs.js"></script> <script src="assets/js/easter-eggs.js"></script>
</body> </body>
</html> </html>

178
index.js
View File

@@ -1,108 +1,56 @@
var app = require("app"); // Module to control application life. var app = require("app"); // Module to control application life.
var ipc = require("ipc");
var fs = require("fs-extra");
var os = require("os");
var dialog = require("dialog"); var dialog = require("dialog");
var BrowserWindow = require("browser-window"); var fs = require("fs-extra");
var ipc = require("ipc");
var os = require("os");
var path = require("path");
var BrowserWindow = require("browser-window");
var mainWindow = null; var mainWindow = null;
app.commandLine.appendSwitch("--enable-npapi"); var unityHomeDir = path.join(__dirname, "../../WebPlayer");
// If running in non-packaged / development mode, this dir will be slightly different
function verifyUnity() { if (process.env.npm_node_execpath) {
var dllpath = unityHomeDir = path.join(app.getAppPath(), "/build/WebPlayer");
app.getPath("appData") +
"\\..\\LocalLow\\Unity\\WebPlayer\\player\\fusion-2.x.x\\webplayer_win.dll";
if (fs.existsSync(dllpath)) {
var buff = fs.readFileSync(dllpath);
var hash = require("crypto")
.createHash("md5")
.update(buff)
.digest("hex");
if (hash == "e5028405b4483de9e5e5fe9cd5f1e98f") {
return true;
}
}
return false;
} }
function installUnity(callback) { process.env["UNITY_HOME_DIR"] = unityHomeDir;
var utilsdir = __dirname + "\\..\\..\\utils"; process.env["UNITY_DISABLE_PLUGIN_UPDATES"] = "yes";
// if running in non-packaged / development mode, this dir will be slightly different app.commandLine.appendSwitch("enable-npapi");
if (process.env.npm_node_execpath) { app.commandLine.appendSwitch(
utilsdir = app.getAppPath() + "\\build\\utils"; "load-plugin",
} path.join(unityHomeDir, "/loader/npUnity3D32.dll")
);
app.commandLine.appendSwitch("no-proxy-server");
// run the installer silently var userData = app.getPath("userData");
var child = require("child_process").spawn( var configPath = path.join(userData, "config.json");
utilsdir + "\\UnityWebPlayer.exe", var serversPath = path.join(userData, "servers.json");
["/quiet", "/S"] var versionsPath = path.join(userData, "versions.json");
);
child.on("exit", function () {
// overwrite 3.5.2 loader/player with FF's custom version
var dstfolder =
app.getPath("appData") + "..\\LocalLow\\Unity\\WebPlayer";
fs.copySync(utilsdir + "\\WebPlayer", dstfolder, {
clobber: true,
});
// avoids error reporter popping up when closing Electron
fs.removeSync(dstfolder + "\\UnityBugReporter.exe");
console.log("Unity Web Player installed successfully.");
callback();
});
}
function initialSetup(firstTime) { function initialSetup(firstTime) {
// Display a small window to inform the user that the app is working if (!firstTime) {
setupWindow = new BrowserWindow({ // Migration from pre-1.4
width: 275, // Back everything up, just in case
height: 450, fs.copySync(configPath, configPath + ".bak");
resizable: false, fs.copySync(serversPath, serversPath + ".bak");
center: true, fs.copySync(versionsPath, versionsPath + ".bak");
frame: false, } else {
}); // First-time setup
setupWindow.loadUrl("file://" + __dirname + "/initialsetup.html"); // Copy default servers
installUnity(function () {
if (!firstTime) {
// migration from pre-1.4
// Back everything up, just in case
fs.copySync(
app.getPath("userData") + "\\config.json",
app.getPath("userData") + "\\config.json.bak"
);
fs.copySync(
app.getPath("userData") + "\\servers.json",
app.getPath("userData") + "\\servers.json.bak"
);
fs.copySync(
app.getPath("userData") + "\\versions.json",
app.getPath("userData") + "\\versions.json.bak"
);
} else {
// first-time setup
// Copy default servers
fs.copySync(
__dirname + "\\defaults\\servers.json",
app.getPath("userData") + "\\servers.json"
);
}
// Copy default versions and config
fs.copySync( fs.copySync(
__dirname + "\\defaults\\versions.json", path.join(__dirname, "/defaults/servers.json"),
app.getPath("userData") + "\\versions.json" serversPath
);
fs.copySync(
__dirname + "\\defaults\\config.json",
app.getPath("userData") + "\\config.json"
); );
}
console.log("JSON files copied."); // Copy default versions and config
setupWindow.destroy(); fs.copySync(path.join(__dirname, "/defaults/versions.json"), versionsPath);
showMainWindow(); fs.copySync(path.join(__dirname, "/defaults/config.json"), configPath);
});
console.log("JSON files copied.");
showMainWindow();
} }
ipc.on("exit", function (id) { ipc.on("exit", function (id) {
@@ -116,26 +64,26 @@ app.on("window-all-closed", function () {
app.on("ready", function () { app.on("ready", function () {
// Check just in case the user forgot to extract the zip. // Check just in case the user forgot to extract the zip.
zip_check = app.getPath("exe").includes(os.tmpdir()); zipCheck = app.getPath("exe").includes(os.tmpdir());
if (zip_check) { if (zipCheck) {
errormsg = var errorMessage =
"It has been detected that OpenFusionClient is running from the TEMP folder.\n\n" + "It has been detected that OpenFusionClient is running from the TEMP folder.\n\n" +
"Please extract the entire Client folder to a location of your choice before starting OpenFusionClient."; "Please extract the entire Client folder to a location of your choice before starting OpenFusionClient.";
dialog.showErrorBox("Error!", errormsg); dialog.showErrorBox("Error!", errorMessage);
return; return;
} }
// Create the browser window. // Create the browser window.
mainWindow = new BrowserWindow({ mainWindow = new BrowserWindow({
width: 1280, width: 1280,
height: 720, height: 720,
show: false, show: false,
"web-preferences": { plugins: true }, "web-preferences": {
plugins: true,
},
}); });
mainWindow.setMinimumSize(640, 480); mainWindow.setMinimumSize(640, 480);
// Check for first run // Check for first run
var configPath = app.getPath("userData") + "\\config.json";
try { try {
if (!fs.existsSync(configPath)) { if (!fs.existsSync(configPath)) {
console.log("Config file not found. Running initial setup."); console.log("Config file not found. Running initial setup.");
@@ -146,20 +94,20 @@ app.on("ready", function () {
console.log("Pre-1.4 config detected. Running migration."); console.log("Pre-1.4 config detected. Running migration.");
initialSetup(false); initialSetup(false);
} else { } else {
if (verifyUnity()) { showMainWindow();
showMainWindow();
} else {
installUnity(showMainWindow);
}
} }
} }
} catch (ex) { } catch (ex) {
console.log("An error occurred while checking for the config"); dialog.showErrorBox(
"Error!",
"An error occurred while checking for the config. Make sure you have sufficent permissions."
);
app.quit();
} }
// Makes it so external links are opened in the system browser, not Electron // Makes it so external links are opened in the system browser, not Electron
mainWindow.webContents.on("new-window", function (e, url) { mainWindow.webContents.on("new-window", function (event, url) {
e.preventDefault(); event.preventDefault();
require("shell").openExternal(url); require("shell").openExternal(url);
}); });
@@ -183,19 +131,23 @@ function showMainWindow() {
}); });
mainWindow.webContents.on("plugin-crashed", function () { mainWindow.webContents.on("plugin-crashed", function () {
console.log("Unity Web Player crashed."); var errorMessage =
"Unity Web Player has crashed - please re-open the application.\n" +
"If this error persists, please read the FAQ or ask for support in our Discord server.";
dialog.showErrorBox("Error!", errorMessage);
mainWindow.destroy();
app.quit();
}); });
mainWindow.webContents.on("will-navigate", function (evt, url) { mainWindow.webContents.on("will-navigate", function (event, url) {
evt.preventDefault(); event.preventDefault();
// TODO: showMessageBox rather than showErrorBox?
switch (url) { switch (url) {
case "https://audience.fusionfall.com/ff/regWizard.do?_flowId=fusionfall-registration-flow": case "https://audience.fusionfall.com/ff/regWizard.do?_flowId=fusionfall-registration-flow":
errormsg = var errorMessage =
"The register page is currently unimplemented.\n\n" + "The register page is currently unimplemented.\n\n" +
'You can still create an account: type your desired username and password into the provided boxes and click "Log In". ' + 'You can still create an account: type your desired username and password into the provided boxes and click "Log In". ' +
"Your account will then be automatically created on the server. \nBe sure to remember these details!"; "Your account will then be automatically created on the server. \nBe sure to remember these details!";
dialog.showErrorBox("Sorry!", errormsg); dialog.showErrorBox("Sorry!", errorMessage);
break; break;
case "https://audience.fusionfall.com/ff/login.do": case "https://audience.fusionfall.com/ff/login.do":
dialog.showErrorBox( dialog.showErrorBox(
@@ -207,7 +159,7 @@ function showMainWindow() {
require("shell").openExternal("https://discord.gg/DYavckB"); require("shell").openExternal("https://discord.gg/DYavckB");
break; break;
default: default:
mainWindow.webContents.loadURL(url); mainWindow.loadUrl(url);
} }
}); });
} }

View File

@@ -1,40 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>OpenFusion: Initial Setup</title>
</head>
<body
style="
overflow: hidden;
background-color: #000;
user-select: none;
-webkit-user-select: none;
"
>
<center>
<div>
<img src="assets/img/of-3.png" width="256" />
<div>
<img src="assets/img/spinner.gif" width="50px" />
</div>
<div style="margin-top: 15px">
<p
style="
text-shadow: 1px 1px 8px #4349c4;
color: #4a76b7;
font-size: 18px;
font-family: -apple-system, BlinkMacSystemFont,
'Segoe UI', Roboto, 'Helvetica Neue', Arial,
'Noto Sans', sans-serif, 'Apple Color Emoji',
'Segoe UI Emoji', 'Segoe UI Symbol',
'Noto Color Emoji';
"
>
OpenFusion is setting up...<br />Please wait - this
should take <br />less than a minute.
</p>
</div>
</div>
</center>
</body>
</html>

84
package-lock.json generated
View File

@@ -1,16 +1,16 @@
{ {
"name": "OpenFusionClient", "name": "OpenFusionClient",
"version": "1.4.0", "version": "1.4.1",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "OpenFusionClient", "name": "OpenFusionClient",
"version": "1.4.0", "version": "1.4.1",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fs-extra": "^0.30.0" "fs-extra": "2.0.0"
}, },
"devDependencies": { "devDependencies": {
"electron-builder": "^22.14.13", "electron-builder": "^22.14.13",
@@ -746,7 +746,8 @@
"node_modules/balanced-match": { "node_modules/balanced-match": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
}, },
"node_modules/base64-js": { "node_modules/base64-js": {
"version": "1.5.1", "version": "1.5.1",
@@ -830,6 +831,7 @@
"version": "1.1.11", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": { "dependencies": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@@ -1333,7 +1335,8 @@
"node_modules/concat-map": { "node_modules/concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
}, },
"node_modules/concat-stream": { "node_modules/concat-stream": {
"version": "1.6.2", "version": "1.6.2",
@@ -2021,15 +2024,12 @@
} }
}, },
"node_modules/fs-extra": { "node_modules/fs-extra": {
"version": "0.30.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.0.0.tgz",
"integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "integrity": "sha512-DERmRq6uGnu7I4uFJiWQBe5pYy67v2oKowEi8jYA/52u/ZO9xXBP2HAGacD9Nus0UT/WhJFZTq8cWbxZqOHVUg==",
"dependencies": { "dependencies": {
"graceful-fs": "^4.1.2", "graceful-fs": "^4.1.2",
"jsonfile": "^2.1.0", "jsonfile": "^2.1.0"
"klaw": "^1.0.0",
"path-is-absolute": "^1.0.0",
"rimraf": "^2.2.8"
} }
}, },
"node_modules/fs-extra/node_modules/jsonfile": { "node_modules/fs-extra/node_modules/jsonfile": {
@@ -2095,6 +2095,7 @@
"version": "6.0.4", "version": "6.0.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
"integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
"dev": true,
"dependencies": { "dependencies": {
"inflight": "^1.0.4", "inflight": "^1.0.4",
"inherits": "2", "inherits": "2",
@@ -2406,6 +2407,7 @@
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"dependencies": { "dependencies": {
"once": "^1.3.0", "once": "^1.3.0",
"wrappy": "1" "wrappy": "1"
@@ -2414,7 +2416,8 @@
"node_modules/inherits": { "node_modules/inherits": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
}, },
"node_modules/ini": { "node_modules/ini": {
"version": "1.3.8", "version": "1.3.8",
@@ -2711,14 +2714,6 @@
"json-buffer": "3.0.0" "json-buffer": "3.0.0"
} }
}, },
"node_modules/klaw": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
"integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
"optionalDependencies": {
"graceful-fs": "^4.1.9"
}
},
"node_modules/klaw-sync": { "node_modules/klaw-sync": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
@@ -2915,6 +2910,7 @@
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"dependencies": { "dependencies": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
}, },
@@ -3052,6 +3048,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"dependencies": { "dependencies": {
"wrappy": "1" "wrappy": "1"
} }
@@ -3215,6 +3212,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@@ -3603,6 +3601,7 @@
"version": "2.4.5", "version": "2.4.5",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
"integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
"dev": true,
"dependencies": { "dependencies": {
"glob": "^6.0.1" "glob": "^6.0.1"
}, },
@@ -4379,7 +4378,8 @@
"node_modules/wrappy": { "node_modules/wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
}, },
"node_modules/write-file-atomic": { "node_modules/write-file-atomic": {
"version": "3.0.3", "version": "3.0.3",
@@ -5049,7 +5049,8 @@
"balanced-match": { "balanced-match": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
}, },
"base64-js": { "base64-js": {
"version": "1.5.1", "version": "1.5.1",
@@ -5109,6 +5110,7 @@
"version": "1.1.11", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@@ -5485,7 +5487,8 @@
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
}, },
"concat-stream": { "concat-stream": {
"version": "1.6.2", "version": "1.6.2",
@@ -6054,15 +6057,12 @@
} }
}, },
"fs-extra": { "fs-extra": {
"version": "0.30.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.0.0.tgz",
"integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "integrity": "sha512-DERmRq6uGnu7I4uFJiWQBe5pYy67v2oKowEi8jYA/52u/ZO9xXBP2HAGacD9Nus0UT/WhJFZTq8cWbxZqOHVUg==",
"requires": { "requires": {
"graceful-fs": "^4.1.2", "graceful-fs": "^4.1.2",
"jsonfile": "^2.1.0", "jsonfile": "^2.1.0"
"klaw": "^1.0.0",
"path-is-absolute": "^1.0.0",
"rimraf": "^2.2.8"
}, },
"dependencies": { "dependencies": {
"jsonfile": { "jsonfile": {
@@ -6121,6 +6121,7 @@
"version": "6.0.4", "version": "6.0.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
"integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
"dev": true,
"requires": { "requires": {
"inflight": "^1.0.4", "inflight": "^1.0.4",
"inherits": "2", "inherits": "2",
@@ -6349,6 +6350,7 @@
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": { "requires": {
"once": "^1.3.0", "once": "^1.3.0",
"wrappy": "1" "wrappy": "1"
@@ -6357,7 +6359,8 @@
"inherits": { "inherits": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
}, },
"ini": { "ini": {
"version": "1.3.8", "version": "1.3.8",
@@ -6580,14 +6583,6 @@
"json-buffer": "3.0.0" "json-buffer": "3.0.0"
} }
}, },
"klaw": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
"integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
"requires": {
"graceful-fs": "^4.1.9"
}
},
"klaw-sync": { "klaw-sync": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
@@ -6738,6 +6733,7 @@
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@@ -6848,6 +6844,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@@ -6971,7 +6968,8 @@
"path-is-absolute": { "path-is-absolute": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
}, },
"path-key": { "path-key": {
"version": "2.0.1", "version": "2.0.1",
@@ -7272,6 +7270,7 @@
"version": "2.4.5", "version": "2.4.5",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
"integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
"dev": true,
"requires": { "requires": {
"glob": "^6.0.1" "glob": "^6.0.1"
} }
@@ -7882,7 +7881,8 @@
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
}, },
"write-file-atomic": { "write-file-atomic": {
"version": "3.0.3", "version": "3.0.3",

View File

@@ -1,6 +1,6 @@
{ {
"name": "OpenFusionClient", "name": "OpenFusionClient",
"version": "1.4.1", "version": "1.4.3",
"description": "OpenFusionClient", "description": "OpenFusionClient",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@@ -20,7 +20,7 @@
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/OpenFusionProject/Client.git" "url": "https://github.com/OpenFusionProject/OpenFusionClient.git"
}, },
"build": { "build": {
"appId": "xyz.openfusion.client", "appId": "xyz.openfusion.client",
@@ -63,13 +63,17 @@
"extraFiles": [ "extraFiles": [
"LICENSE.md", "LICENSE.md",
{ {
"from": "build/utils", "from": "build/OpenFusionClient.exe.manifest",
"to": "utils" "to": "OpenFusionClient.exe.manifest"
},
{
"from": "build/WebPlayer",
"to": "WebPlayer"
} }
], ],
"afterPack": "./build/afterpack.js" "afterPack": "./build/after-pack.js"
}, },
"dependencies": { "dependencies": {
"fs-extra": "^0.30.0" "fs-extra": "2.0.0"
} }
} }