function loadLoader() { window.ModLoader = function ModLoader(ModsArr) { if (!window.eaglerMLoaderMainRun) { var searchParams = new URLSearchParams(location.search); searchParams.getAll("Mod").forEach((ModToAdd) => { console.log( "EaglerML: Adding Mod to loadlist from search params: " + ModToAdd ); ModsArr.push(ModToAdd); }); if ( !!eaglercraftXOpts && !!eaglercraftXOpts.Mods && Array.isArray(eaglercraftXOpts.Mods) ) { eaglercraftXOpts.Mods.forEach((ModToAdd) => { console.log( "EaglerML: Adding Mod to loadlist from eaglercraftXOpts: " + ModToAdd ); ModsArr.push(ModToAdd); }); } window.eaglerMLoaderMainRun = true; } if (window.noLoadMods === true) { ModsArr.splice(0, ModsArr.length); } function checkModsLoaded(totalLoaded, identifier) { console.log( "EaglerML: Checking if Mods are finished :: " + totalLoaded + "/" + ModsArr.length ); if (totalLoaded >= ModsArr.length) { clearInterval(identifier); window.ModGracePeriod = false; if ( window.eaglerMLoaderMainRun && ModAPI && ModAPI.events && ModAPI.events.callEvent ) { ModAPI.events.callEvent("load", {}); } console.log( "EaglerML: Checking if Mods are finished :: All Mods loaded! Grace period off." ); } } function methodB(currentMod) { try { console.log("EaglerML: Loading " + currentMod + " via method B."); var script = document.createElement("script"); script.src = currentMod; script.setAttribute("data-Mod", currentMod); script.setAttribute("data-isMod", true); script.onerror = () => { console.log( "EaglerML: Failed to load " + currentMod + " via method B!" ); script.remove(); totalLoaded++; }; script.onload = () => { console.log( "EaglerML: Successfully loaded " + currentMod + " via method B." ); totalLoaded++; }; document.body.appendChild(script); } catch (error) { console.log( "EaglerML: Oh no! The Mod " + currentMod + " failed to load!" ); totalLoaded++; } } window.ModGracePeriod = true; var totalLoaded = 0; var loaderCheckInterval = null; ModsArr.forEach((c) => { let currentMod = c; console.log("EaglerML: Starting " + currentMod); try { var req = new XMLHttpRequest(); req.open("GET", currentMod); req.onload = function xhrLoadHandler() { console.log("EaglerML: Loading " + currentMod + " via method A."); var script = document.createElement("script"); try { script.src = "data:text/javascript," + encodeURIComponent(req.responseText); } catch (error) { methodB(currentMod); return; } script.setAttribute("data-Mod", currentMod); script.setAttribute("data-isMod", true); script.onerror = () => { console.log( "EaglerML: Failed to load " + currentMod + " via method A!" ); script.remove(); totalLoaded++; }; script.onload = () => { console.log( "EaglerML: Successfully loaded " + currentMod + " via method A." ); totalLoaded++; }; document.body.appendChild(script); }; req.onerror = function xhrErrorHandler() { methodB(currentMod); }; req.send(); } catch (error) { methodB(currentMod); } }); loaderCheckInterval = setInterval(() => { checkModsLoaded(totalLoaded, loaderCheckInterval); }, 500); console.log( "EaglerML: Starting to load " + ModsArr.length + " Mods..." ); window.returntotalloadedmods = function returntotalloadedmods(){ return totalLoaded } }; }