mirror of
https://github.com/Eaglercraft-Archive/Eaglercraftx-1.8.8-src.git
synced 2025-06-27 18:38:14 -05:00
Update #44 - WebAssembly GC support, fix more WebRTC bugs
This commit is contained in:
180
sources/wasm-gc-teavm-loader/js/library.js
Normal file
180
sources/wasm-gc-teavm-loader/js/library.js
Normal file
@ -0,0 +1,180 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
addToLibrary({
|
||||
getJSPISupported: function() {
|
||||
return (typeof WebAssembly.Suspending !== "undefined");
|
||||
},
|
||||
getEPWLength: function() {
|
||||
return epwFile.byteLength;
|
||||
},
|
||||
memcpyFromEPW: function(dest, off, len) {
|
||||
HEAPU8.set(new Uint8Array(epwFile, off, len), dest);
|
||||
},
|
||||
initResult: function(bufLen) {
|
||||
const id = results.length;
|
||||
results.push(new Uint8Array(bufLen));
|
||||
return id;
|
||||
},
|
||||
memcpyToResult: function(bufId, src, off, len) {
|
||||
results[bufId].set(new Uint8Array(HEAPU8.buffer, src, len), off);
|
||||
},
|
||||
memcpyFromEPWToResult: function(bufId, dest, off, len) {
|
||||
results[bufId].set(new Uint8Array(epwFile, off, len), dest);
|
||||
},
|
||||
initEPWStringResult: function(off, len) {
|
||||
const id = results.length;
|
||||
results.push(UTF8Decoder.decode(new Uint8Array(epwFile, off, len)));
|
||||
return id;
|
||||
},
|
||||
resultFailed: function(msg) {
|
||||
const parentElement = createCrashParentElement();
|
||||
|
||||
const messageContainer = document.createElement("div");
|
||||
messageContainer.setAttribute("style", "z-index:100;position:absolute;top:10%;left:10%;right:10%;bottom:10%;background-color:white;border:2px solid #cccccc;overflow-x:hidden;overflow-y:scroll;");
|
||||
messageContainer.classList.add("_eaglercraftX_loader_failed_container");
|
||||
|
||||
const failMsg = UTF8ToString(msg);
|
||||
console.error("LoaderMain: [FAILED] " + failMsg);
|
||||
|
||||
const failureMsgElement = document.createElement("h2");
|
||||
failureMsgElement.style.color = "#AA0000";
|
||||
failureMsgElement.style.padding = "25px";
|
||||
failureMsgElement.style.fontFamily = "sans-serif";
|
||||
failureMsgElement.style["marginBlock"] = "0px";
|
||||
failureMsgElement.appendChild(document.createTextNode(failMsg));
|
||||
messageContainer.appendChild(failureMsgElement);
|
||||
|
||||
const failureMsgElement2 = document.createElement("h4");
|
||||
failureMsgElement2.style.color = "#AA0000";
|
||||
failureMsgElement2.style.padding = "25px";
|
||||
failureMsgElement2.style.fontFamily = "sans-serif";
|
||||
failureMsgElement2.style["marginBlock"] = "0px";
|
||||
failureMsgElement2.appendChild(document.createTextNode("Try again later"));
|
||||
messageContainer.appendChild(failureMsgElement2);
|
||||
|
||||
parentElement.appendChild(messageContainer);
|
||||
},
|
||||
resultSuccess: function(result) {
|
||||
const idx = result >> 2;
|
||||
|
||||
const eagRuntimeJSURL = URL.createObjectURL(new Blob([results[HEAP32[idx]]], { type: "text/javascript;charset=utf-8" }));
|
||||
const classesWASMURL = URL.createObjectURL(new Blob([results[HEAP32[idx + 1]]], { type: "application/wasm" }));
|
||||
const classesDeobfTEADBGURL = URL.createObjectURL(new Blob([results[HEAP32[idx + 2]]], { type: "application/octet-stream" }));
|
||||
const classesDeobfWASMURL = URL.createObjectURL(new Blob([results[HEAP32[idx + 3]]], { type: "application/wasm" }));
|
||||
|
||||
const pressAnyKey = URL.createObjectURL(new Blob([results[HEAP32[idx + 4]]], { type: results[HEAP32[idx + 5]] }));
|
||||
const crashImg = URL.createObjectURL(new Blob([results[HEAP32[idx + 6]]], { type: results[HEAP32[idx + 7]] }));
|
||||
const faviconImg = URL.createObjectURL(new Blob([results[HEAP32[idx + 8]]], { type: results[HEAP32[idx + 9]] }));
|
||||
|
||||
const numEPKs = HEAP32[idx + 10];
|
||||
const epkFiles = new Array(numEPKs);
|
||||
for(var i = 0, j; i < numEPKs; ++i) {
|
||||
j = idx + 11 + i * 3;
|
||||
epkFiles[i] = {
|
||||
data: results[HEAP32[j]],
|
||||
name: results[HEAP32[j + 1]],
|
||||
path: results[HEAP32[j + 2]]
|
||||
};
|
||||
}
|
||||
|
||||
results.length = 0;
|
||||
|
||||
window.__eaglercraftXLoaderContext = {
|
||||
getEaglercraftXOpts: function() {
|
||||
return optsObj;
|
||||
},
|
||||
getEagRuntimeJSURL: function() {
|
||||
return eagRuntimeJSURL;
|
||||
},
|
||||
getClassesWASMURL: function() {
|
||||
return classesWASMURL;
|
||||
},
|
||||
getClassesDeobfWASMURL: function() {
|
||||
return classesDeobfWASMURL;
|
||||
},
|
||||
getClassesTEADBGURL: function() {
|
||||
return classesDeobfTEADBGURL;
|
||||
},
|
||||
getEPKFiles: function() {
|
||||
return epkFiles;
|
||||
},
|
||||
getRootElement: function() {
|
||||
return rootElement;
|
||||
},
|
||||
getMainArgs: function() {
|
||||
return [];
|
||||
},
|
||||
getImageURL: function(idx) {
|
||||
switch(idx) {
|
||||
case 0:
|
||||
return splashURL;
|
||||
case 1:
|
||||
return pressAnyKey;
|
||||
case 2:
|
||||
return crashImg;
|
||||
case 3:
|
||||
return faviconImg;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
},
|
||||
runMain: function(fn) {
|
||||
setTimeout(fn, 10);
|
||||
}
|
||||
};
|
||||
|
||||
const scriptElement = document.createElement("script");
|
||||
scriptElement.type = "text/javascript";
|
||||
scriptElement.src = eagRuntimeJSURL;
|
||||
document.head.appendChild(scriptElement);
|
||||
},
|
||||
resultJSPIUnsupported: function(result) {
|
||||
const idx = result >> 2;
|
||||
|
||||
const crashImgData = results[HEAP32[idx]];
|
||||
const crashImgMIME = results[HEAP32[idx + 1]];
|
||||
const crashImg = crashImgData ? URL.createObjectURL(new Blob([crashImgData], { type: (crashImgMIME || "image/png") })) : null;
|
||||
|
||||
const markupData = results[HEAP32[idx + 2]];
|
||||
const markup = markupData ? UTF8Decoder.decode(markupData) : "<h1>Failed to load error screen</h1>";
|
||||
|
||||
const parentElement = createCrashParentElement();
|
||||
|
||||
const img = document.createElement("img");
|
||||
img.setAttribute("style", "z-index:100;position:absolute;top:10px;left:calc(50% - 151px);");
|
||||
img.src = crashImg;
|
||||
parentElement.appendChild(img);
|
||||
|
||||
const iframeContainer = document.createElement("div");
|
||||
iframeContainer.setAttribute("style", "z-index:100;position:absolute;top:135px;left:10%;right:10%;bottom:50px;background-color:white;border:2px solid #cccccc;");
|
||||
iframeContainer.classList.add("_eaglercraftX_jspi_unsupported_container");
|
||||
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.classList.add("_eaglercraftX_jspi_unsupported_frame");
|
||||
iframe.setAttribute("style", "border:none;width:100%;height:100%;");
|
||||
iframe.srcdoc = markup;
|
||||
|
||||
iframeContainer.appendChild(iframe);
|
||||
parentElement.appendChild(iframeContainer);
|
||||
},
|
||||
dbgLog: function(msg) {
|
||||
console.log("LoaderMain: [INFO] " + UTF8ToString(msg));
|
||||
},
|
||||
dbgErr: function(msg) {
|
||||
console.error("LoaderMain: [ERROR] " + UTF8ToString(msg));
|
||||
}
|
||||
});
|
61
sources/wasm-gc-teavm-loader/js/pre.js
Normal file
61
sources/wasm-gc-teavm-loader/js/pre.js
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2024 lax1dude. All Rights Reserved.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
Module["locateFile"] = function(path) {
|
||||
if(path === "loader.wasm") {
|
||||
return window.__eaglercraftXLoaderContextPre.loaderWASMURL;
|
||||
}else {
|
||||
return path;
|
||||
}
|
||||
};
|
||||
|
||||
const rootElement = window.__eaglercraftXLoaderContextPre.rootElement;
|
||||
const optsObj = window.__eaglercraftXLoaderContextPre.eaglercraftXOpts;
|
||||
const epwFile = window.__eaglercraftXLoaderContextPre.theEPWFileBuffer;
|
||||
const splashURL = window.__eaglercraftXLoaderContextPre.splashURL;
|
||||
|
||||
const results = [ null ];
|
||||
|
||||
function createCrashParentElement() {
|
||||
var oldSplash = null;
|
||||
|
||||
var node;
|
||||
while(node = rootElement.lastChild) {
|
||||
if(!oldSplash) {
|
||||
oldSplash = node;
|
||||
}
|
||||
rootElement.removeChild(node);
|
||||
}
|
||||
|
||||
const parentElement = document.createElement("div");
|
||||
parentElement.classList.add("_eaglercraftX_wrapper_element");
|
||||
parentElement.setAttribute("style", "position:relative;width:100%;height:100%;overflow:hidden;");
|
||||
|
||||
if(oldSplash) {
|
||||
oldSplash.classList.add("_eaglercraftX_early_splash_element");
|
||||
oldSplash.style.position = "absolute";
|
||||
oldSplash.style.top = "0px";
|
||||
oldSplash.style.left = "0px";
|
||||
oldSplash.style.right = "0px";
|
||||
oldSplash.style.bottom = "0px";
|
||||
oldSplash.style.zIndex = "2";
|
||||
parentElement.appendChild(oldSplash);
|
||||
}
|
||||
|
||||
rootElement.appendChild(parentElement);
|
||||
|
||||
return parentElement;
|
||||
}
|
Reference in New Issue
Block a user