diff --git a/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java index 7dd1a99..68f19ef 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java @@ -5,8 +5,10 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 2 : 11 @ 2 : 9 +> CHANGE 2 : 13 @ 2 : 9 +~ import net.eaglerforge.gui.ModGUI; +~ import net.eaglerforge.gui.WIP_GuiMods; ~ import net.lax1dude.eaglercraft.v1_8.Mouse; ~ import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; ~ import net.lax1dude.eaglercraft.v1_8.sp.SingleplayerServerController; @@ -49,8 +51,10 @@ ~ this.buttonList.add(lanButton = new GuiButton(7, this.width / 2 + 2, this.height / 4 + 96 + b0, 98, 20, ~ I18n.format(LANServerController.isLANOpen() ? "menu.closeLan" : "menu.openToLan", new Object[0]))); -> CHANGE 4 : 9 @ 4 : 5 +> CHANGE 4 : 11 @ 4 : 5 +~ this.buttonList.add(new GuiButton(69420, this.width / 2 - 100, this.height / 4 + 73 + b0, +~ I18n.format("eaglerforge.menu.mods", new Object[0]))); ~ lanButton.enabled = SingleplayerServerController.isWorldRunning(); ~ if (!hasSentAutoSave) { ~ hasSentAutoSave = true; @@ -73,7 +77,14 @@ ~ this.mc.shutdownIntegratedServer(new GuiMultiplayer(new GuiMainMenu())); -> CHANGE 16 : 30 @ 16 : 17 +> INSERT 9 : 13 @ 9 + ++ case 69420: ++ // this.mc.displayGuiScreen(new GuiMods(this)); ++ ModGUI.displayGui(); ++ break; + +> CHANGE 7 : 21 @ 7 : 8 ~ if (!LANServerController.supported()) { ~ mc.displayGuiScreen(new GuiScreenLANNotSupported(this)); diff --git a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java index 0b7a05a..fa0b0ff 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java @@ -5,7 +5,10 @@ # Version: 1.0 # Author: lax1dude -> DELETE 2 @ 2 : 3 +> CHANGE 2 : 4 @ 2 : 3 + +~ import net.eaglerforge.gui.ModGUI; +~ > DELETE 3 @ 3 : 4 @@ -16,7 +19,7 @@ > CHANGE 2 : 30 @ 2 : 4 ~ -~ import net.eaglerforge.GuiMods; +~ import net.eaglerforge.gui.WIP_GuiMods; ~ import net.lax1dude.eaglercraft.v1_8.EagRuntime; ~ import net.lax1dude.eaglercraft.v1_8.EaglerInputStream; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; @@ -52,7 +55,9 @@ > DELETE 3 @ 3 : 5 -> DELETE 4 @ 4 : 11 +> DELETE 2 @ 2 : 3 + +> DELETE 1 @ 1 : 8 > DELETE 2 @ 2 : 3 @@ -214,10 +219,11 @@ ~ if (parGuiButton.id == 4) { ~ this.mc.displayGuiScreen(new GuiScreenEditProfile(this)); -> INSERT 1 : 4 @ 1 +> INSERT 1 : 5 @ 1 + if (parGuiButton.id == 69420) { -+ this.mc.displayGuiScreen(new GuiMods(this)); ++ // this.mc.displayGuiScreen(new WIP_GuiMods(this)); ++ ModGUI.displayGui(); + } > CHANGE 1 : 3 @ 1 : 3 diff --git a/patches/minecraft/net/minecraft/client/gui/ServerSelectionList.edit.java b/patches/minecraft/net/minecraft/client/gui/ServerSelectionList.edit.java index 0ff4b25..3eba377 100644 --- a/patches/minecraft/net/minecraft/client/gui/ServerSelectionList.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/ServerSelectionList.edit.java @@ -7,12 +7,11 @@ > DELETE 2 @ 2 : 3 -> INSERT 1 : 8 @ 1 +> INSERT 1 : 7 @ 1 + + import com.google.common.collect.Lists; + -+ import net.eaglerforge.GuiMods; + import net.lax1dude.eaglercraft.v1_8.sp.lan.LANServerController; + import net.lax1dude.eaglercraft.v1_8.sp.lan.LANServerList; + import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager; diff --git a/patches/minecraft/net/minecraft/entity/Entity.edit.java b/patches/minecraft/net/minecraft/entity/Entity.edit.java index bf149dc..99bbebc 100644 --- a/patches/minecraft/net/minecraft/entity/Entity.edit.java +++ b/patches/minecraft/net/minecraft/entity/Entity.edit.java @@ -5,10 +5,9 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 3 : 10 @ 3 : 5 +> CHANGE 3 : 9 @ 3 : 5 ~ -~ import net.eaglerforge.api.BaseData; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; ~ import net.lax1dude.eaglercraft.v1_8.HString; diff --git a/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java b/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java index 312208e..086d538 100644 --- a/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java +++ b/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java @@ -7,11 +7,9 @@ > DELETE 2 @ 2 : 5 -> CHANGE 4 : 14 @ 4 : 6 +> CHANGE 4 : 12 @ 4 : 6 ~ -~ import net.eaglerforge.api.BaseData; -~ import net.eaglerforge.api.ModData; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; ~ diff --git a/patches/minecraft/net/minecraft/entity/player/EntityPlayer.edit.java b/patches/minecraft/net/minecraft/entity/player/EntityPlayer.edit.java index be74a88..e5ca34c 100644 --- a/patches/minecraft/net/minecraft/entity/player/EntityPlayer.edit.java +++ b/patches/minecraft/net/minecraft/entity/player/EntityPlayer.edit.java @@ -7,11 +7,9 @@ > DELETE 2 @ 2 : 5 -> CHANGE 2 : 11 @ 2 : 3 +> CHANGE 2 : 9 @ 2 : 3 ~ -~ import net.eaglerforge.api.BaseData; -~ import net.eaglerforge.api.ModData; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; ~ ~ import com.google.common.base.Charsets; diff --git a/patches/resources/assets/minecraft/lang/en_US.edit.lang b/patches/resources/assets/minecraft/lang/en_US.edit.lang index bbb31f8..758ef34 100644 --- a/patches/resources/assets/minecraft/lang/en_US.edit.lang +++ b/patches/resources/assets/minecraft/lang/en_US.edit.lang @@ -12,7 +12,7 @@ ~ eaglercraft.recording.start=reen... ~ eaglercraft.soundCategory.voice=Voice -> INSERT 1 : 200 @ 1 +> INSERT 1 : 202 @ 1 + eaglercraft.resourcePack.prompt.title=What do you want to do with '%s'? + eaglercraft.resourcePack.prompt.text=Tip: Hold Shift to skip this screen when selecting a resource pack! @@ -209,9 +209,11 @@ + eaglercraft.command.clientStub=This command is client side! + + eaglerforge.menu.mods=Mods -+ eaglerforge.menu.mods.title=Loaded Mods ++ eaglerforge.menu.mods.title1=Available mods ++ eaglerforge.menu.mods.title2=Selected mods + eaglerforge.menu.mods.addmod=Add Mod + eaglerforge.menu.mods.removemod=Remove Mod ++ eaglerforge.menu.mods.info=(Only .js files) + > INSERT 163 : 350 @ 163 diff --git a/sources/main/java/net/eaglerforge/EaglerForge.java b/sources/main/java/net/eaglerforge/EaglerForge.java index 191f5a8..c9651c2 100644 --- a/sources/main/java/net/eaglerforge/EaglerForge.java +++ b/sources/main/java/net/eaglerforge/EaglerForge.java @@ -4,6 +4,8 @@ import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; import org.teavm.jso.JSBody; +import net.eaglerforge.gui.ModLoader; + public class EaglerForge { public static final Logger log = LogManager.getLogger(); @JSBody(params = { "message" }, script = "alert(message)") @@ -22,5 +24,6 @@ public class EaglerForge { public static void init() { log.info("Starting EaglerForge!"); log.info("Loading Mods..."); + ModLoader.loadLoader(); } } diff --git a/sources/main/java/net/eaglerforge/api/ModAPI.java b/sources/main/java/net/eaglerforge/api/ModAPI.java index 1f871a8..a46ebbd 100644 --- a/sources/main/java/net/eaglerforge/api/ModAPI.java +++ b/sources/main/java/net/eaglerforge/api/ModAPI.java @@ -1,5 +1,6 @@ package net.eaglerforge.api; +import net.eaglerforge.gui.ModGUI; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; import net.minecraft.client.ClientBrandRetriever; @@ -90,6 +91,7 @@ public class ModAPI { getModAPI().setCallbackVoidWithDataArg("drawStringWithShadow", (BaseData params) -> { mc.ingameGUI.getFontRenderer().drawStringWithShadow(params.getString("msg"), params.getFloat("x"), params.getFloat("y"), params.getInt("color")); }); + ModGUI.loadFont(); } static void globalsFunctor(ModAPI modAPI) { GlobalsListener.provideCallback((String name) -> { diff --git a/sources/main/java/net/eaglerforge/gui/ModGUI.java b/sources/main/java/net/eaglerforge/gui/ModGUI.java new file mode 100644 index 0000000..9bbf8e7 --- /dev/null +++ b/sources/main/java/net/eaglerforge/gui/ModGUI.java @@ -0,0 +1,25 @@ +package net.eaglerforge.gui; + +import org.teavm.jso.JSBody; + +public class ModGUI { + @JSBody(params = {}, script = "displayGui();") + public static native void displayGui(); + + @JSBody(params = {}, script = "var font = document.createElement(\"style\");\r\n" + // + "console.log('Loaded font!');\r\n" + // + "font.innerHTML = \"@font-face { font-family: Minecraftia; src: url(data:font/truetype;base64,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gICAAQD/AAAABQAAAAACAAOAAAMABwALAA8AEwAAITUhFSU1MxUlETMZATUzFT0BIRUBAAEA/oCA/wCAgAEAgICAgICAAYD+gAGAgICAgIAABQAAAAACAAOAAAMABwALAA8AEwAAMTUhFT0BMxU1ETMRATUzFSU1IRUBAICA/wCA/oABAICAgICAgAGA/oABgICAgICAAAAABQAAAQACAAKAAAMABwALAA8AEwAAETUzFSE1MxUlNSEVJTUzFSE1MxWAAQCA/oABAP6AgAEAgAEAgICAgICAgICAgICAAAAAAQAAAIACgAMAAAsAACURITUhETMRIRUhEQEA/wABAIABAP8AgAEAgAEA/wCA/wAAAQAA/4AAgAEAAAMAABURMxGAgAGA/oAAAQAAAYACgAIAAAMAABE1IRUCgAGAgIAAAQAAAAAAgAEAAAMAADERMxGAAQD/AAAABQAAAAACgAOAAAMABwALAA8AEwAAMTUzFTURMxkBNTMVNREzGQE1MxWAgICAgICAgAEA/wABAICAgAEA/wABAICAAAAFAAAAAAKAA4AAAwAHAA8AFwAbAAAzNSEVATUzFQERMxEzFSMVIREjNTM1MxEBNSEVgAGA/wCA/oCAgIABgICAgP4AAYCAgAGAgID/AAKA/oCAgAGAgID9gAKAgIAAAAABAAAAAAKAA4AACwAAMTUhESM1MzUzESEVAQCAgIABAIACAICA/QCAAAAAAAYAAAAAAoADgAAHAAsADwATABcAGwAAMREzFSE1MxEBNTMVPQEhFQE1MxUFETMRATUhFYABgID+AIABAP4AgAGAgP4AAYABAICA/wABAICAgICAAQCAgIABAP8AAQCAgAAAAAAHAAAAAAKAA4AAAwAHAAsADwATABcAGwAAMzUhFSU1MxUhETMRATUhFQE1MxUFETMRATUhFYABgP4AgAGAgP6AAQD+AIABgID+AAGAgICAgIABAP8AAQCAgAEAgICAAQD/AAEAgIAAAAMAAAAAAoADgAADAAcAEwAAEzUzFT0BMxUTESERMxUhESM1IRGAgICA/gCAAYCAAQACAICAgICA/YABAAEAgAGAgPyAAAAAAAQAAAAAAoADgAADAAcACwATAAAzNSEVJTUzFSERMxEBESEVIRUhFYABgP4AgAGAgP2AAoD+AAGAgICAgIABgP6AAYABgICAgAAAAAAFAAAAAAKAA4AAAwAHAA8AEwAXAAAzNSEVNREzESERMxUhFSEZATUzFT0BIRWAAYCA/YCAAYD+gIABAICAgAEA/wACAICA/wACAICAgICAAAMAAAAAAoADgAADAAcADwAAIREzGQE1MxU1ESEVIxEhEQEAgID+gIACgAGA/oABgICAgAEAgAEA/oAAAAcAAAAAAoADgAADAAcACwAPABMAFwAbAAAzNSEVJREzESERMxEBNSEVJREzESERMxEBNSEVgAGA/gCAAYCA/gABgP4AgAGAgP4AAYCAgIABAP8AAQD/AAEAgICAAQD/AAEA/wABAICAAAAAAAUAAAAAAoADgAADAAcACwATABcAADM1IRU9ATMVAREzEQE1ITUhETMRATUhFYABAID+AIABgP6AAYCA/gABgICAgICAAYABAP8A/wCAgAEA/gACAICAAAACAAAAAACAAwAAAwAHAAAxETMRAxEzEYCAgAEA/wACAAEA/wAAAAAAAgAA/4AAgAMAAAMABwAAFREzEQMRMxGAgICAAYD+gAKAAQD/AAAAAAcAAAAAAgADgAADAAcACwAPABMAFwAbAAAhNTMVJTUzFSU1MxUlNTMVPQEzFT0BMxU9ATMVAYCA/wCA/wCA/wCAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAgAAAIACgAKAAAMABwAAPQEhFQE1IRUCgP2AAoCAgIABgICAAAAAAAcAAAAAAgADgAADAAcACwAPABMAFwAbAAAxNTMVPQEzFT0BMxU9ATMVJTUzFSU1MxUlNTMVgICAgP8AgP8AgP8AgICAgICAgICAgICAgICAgICAgICAAAAGAAAAAAKAA4AAAwAHAAsADwATABcAACE1MxUDNTMVPQEzFQE1MxUFETMRATUhFQEAgICAgP4AgAGAgP4AAYCAgAEAgICAgIABAICAgAEA/wABAICAAAAABAAAAAADAAOAAAMABwAPABMAADM1IRUlETMRNxEhETMRMxEBNSEVgAIA/YCAgAEAgID9gAIAgICAAoD9gIABgP8AAYD+AAIAgIAAAAIAAAAAAoADgAALAA8AADERMxEhETMRIxEhGQE1IRWAAYCAgP6AAYADAP8AAQD9AAGA/oADAICAAAAAAAMAAAAAAoADgAADAAcAEwAAJREzEQM1MxUBESEVIRUhFSERIRUCAICAgP2AAgD+gAGA/oABgIABgP6AAgCAgP2AA4CAgID+gIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAAzNSEVPQEzFSERMxEBNTMVJTUhFYABgID9gIABgID+AAGAgICAgIACgP2AAgCAgICAgAACAAAAAAKAA4AAAwALAAAlETMRBREhFSERIRUCAID9gAIA/oABgIACgP2AgAOAgP2AgAAAAQAAAAACgAOAAAsAADERIRUhFSEVIREhFQKA/gABAP8AAgADgICAgP6AgAABAAAAAAKAA4AACQAAMREhFSEVIRUhEQKA/gABAP8AA4CAgID+AAAABAAAAAACgAOAAAMACQANABEAADM1IRU1ESE1IREhETMZATUhFYABgP8AAYD9gIACAICAgAGAgP4AAoD9gAKAgIAAAAABAAAAAAKAA4AACwAAMREzESERMxEjESERgAGAgID+gAOA/wABAPyAAgD+AAAAAAABAAAAAAGAA4AACwAAMTUzESM1IRUjETMVgIABgICAgAKAgID9gIAAAwAAAAACgAOAAAMABwALAAAzNSEVJTUzFSERMxGAAYD+AIABgICAgICAgAMA/QAABQAAAAACgAOAAAMABwALABMAFwAAIREzEQE1MxUDNTMVAREzESEVIREBNTMVAgCA/wCAgID+AIABAP8AAYCAAYD+gAGAgIABAICA/YADgP8AgP4AAwCAgAAAAAABAAAAAAKAA4AABQAAMREzESEVgAIAA4D9AIAAAwAAAAACgAOAAAMACwATAAABNTMVAREzFTMVIxEhESM1MzUzEQEAgP6AgICAAYCAgIACAICA/gADgICA/YACgICA/IAAAAAAAwAAAAACgAOAAAMACwATAAABNTMVAREzFTMVIxEhESM1MxEzEQEAgP6AgICAAYCAgIACAICA/gADgICA/YABgIABgPyAAAAABAAAAAACgAOAAAMABwALAA8AADM1IRUlETMRIREzEQE1IRWAAYD+AIABgID+AAGAgICAAoD9gAKA/YACgICAAAIAAAAAAoADgAADAA0AAAE1MxUBESEVIRUhFSERAgCA/YACAP6AAYD+gAKAgID9gAOAgICA/gAABgAAAAACgAOAAAMABwALAA8AEwAXAAAzNSEVMzUzFSU1MxUhETMRJREzEQE1IRWAAQCAgP8AgP4AgAGAgP4AAYCAgICAgICAAoD9gIACAP4AAgCAgAAAAAMAAAAAAoADgAADAAcAEQAAIREzEQM1MxUBESEVIRUhFSERAgCAgID9gAIA/oABgP6AAgD+AAKAgID9gAOAgICA/gAABgAAAAACgAOAAAMABwALAA8AEwAXAAAzNSEVJTUzFSERMxEBNSEVJTUzFT0BIRWAAYD+AIABgID+AAGA/gCAAgCAgICAgAGA/oABgICAgICAgICAAAAAAAEAAAAAAoADgAAHAAAhESE1IRUhEQEA/wACgP8AAwCAgP0AAAMAAAAAAoADgAADAAcACwAAMzUhFSURMxEhETMRgAGA/gCAAYCAgICAAwD9AAMA/QAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAAhNTMVJREzETMRMxEBETMRIREzEQEAgP8AgICA/gCAAYCAgICAAQD/AAEA/wABAAIA/gACAP4AAAAAAAMAAAAAAoADgAADAAsAEwAAATUzFQERMxEzFSMVITUjNTMRMxEBAID+gICAgAGAgICAAQCAgP8AA4D9gICAgIACgPyAAAAAAAkAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAAMREzESERMxEBNTMVMzUzFSU1MxUlNTMVMzUzFSU1MxUhNTMVgAGAgP4AgICA/wCA/wCAgID+AIABgIABgP6AAYD+gAGAgICAgICAgICAgICAgICAgIAABQAAAAACgAOAAAMABwALAA8AEwAAIREzEQE1MxUzNTMVJTUzFSE1MxUBAID/AICAgP4AgAGAgAKA/YACgICAgICAgICAgAAABQAAAAACgAOAAAUACQANABEAFwAAMREzFSEVATUzFT0BMxU9ATMVPQEhNSERgAH//gGAgID+AAKAAQCAgAEAgICAgICAgICAgID/AAAAAAABAAAAAAGAA4AABwAAMREhFSERIRUBgP8AAQADgID9gIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAAhNTMVJREzEQE1MxUlETMRATUzFQIAgP8AgP8AgP8AgP8AgICAgAEA/wABAICAgAEA/wABAICAAAAAAAEAAAAAAYADgAAHAAAxNSERITUhEQEA/wABgIACgID8gAAAAAUAAAIAAoADgAADAAcACwAPABMAABE1MxUhNTMVJTUzFTM1MxUlNTMVgAGAgP4AgICA/wCAAgCAgICAgICAgICAgIAAAQAAAAACgACAAAMAADE1IRUCgICAAAAAAgAAAgABAAOAAAMABwAAEzUzFSURMxGAgP8AgAIAgICAAQD/AAAAAAMAAAAAAoACgAADAA0AEQAAPQEzHQE1ITUhNSE1MxEBNSEVgAGA/oABgID+AAGAgICAgICAgID+AAIAgIAAAAADAAAAAAKAA4AAAwAHABEAACURMxEBNSEVAREzETMVIxEhFQIAgP6AAQD+AICAgAGAgAGA/oABgICA/gADgP6AgP8AgAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAAzNSEVPQEzFSERMxEBNTMVJTUhFYABgID9gIABgID+AAGAgICAgIABgP6AAQCAgICAgAADAAAAAAKAA4AAAwAHABEAADURMxkBNSEVATUhESM1MxEzEYABAP8AAYCAgICAAYD+gAGAgID+AIABAIABgPyAAAAAAAMAAAAAAoACgAADAA0AEQAAMzUhFSURMxUhNTMRIRURNSEVgAIA/YCAAYCA/gABgICAgAGAgID/AIABgICAAAACAAAAAAIAA4AACwAPAAAzESM1MzUzFSEVIRkBNSEVgICAgAEA/wABAAIAgICAgP4AAwCAgAAAAAMAAP+AAoACgAADAAcAEQAAFTUhFQERMxEBNSE1IREhNSERAgD+AIABgP6AAYD+gAIAgICAAYABAP8A/wCAgAEAgP2AAAAAAAMAAAAAAoADgAADAAcADwAAIREzEQE1IRUBETMRMxUjEQIAgP6AAQD+AICAgAIA/gACAICA/gADgP6AgP6AAAACAAAAAACAA4AAAwAHAAAxETMRAzUzFYCAgAKA/YADAICAAAAEAAD/gAKAA4AAAwAHAAsADwAAFzUhFSURMxEhETMRAzUzFYABgP4AgAGAgICAgICAgAEA/wACgP2AAwCAgAAABQAAAAACAAOAAAMABwALAA8AFwAAITUzFSU1MxUDNTMVPQEzFQERMxEzFSMRAYCA/wCAgICA/gCAgICAgICAgAEAgICAgID+AAOA/gCA/wAAAAAAAgAAAAABAAOAAAMABwAAMzUzFSURMxGAgP8AgICAgAMA/QAABAAAAAACgAKAAAMABwANABEAAAERMxETETMRIREhFSMRATUzFQEAgICA/YABAIABAIABAAEA/wD/AAIA/gACgID+AAIAgIAAAgAAAAACgAKAAAMACQAAIREzESERIRUhEQIAgP2AAgD+gAIA/gACgID+AAAEAAAAAAKAAoAAAwAHAAsADwAAMzUhFSURMxEhETMRATUhFYABgP4AgAGAgP4AAYCAgIABgP6AAYD+gAGAgIAAAwAA/4ACgAKAAAMADwATAAABETMRAREzFTMVIxUhFSEREzUhFQIAgP2AgICAAYD+gIABAAEAAQD/AP6AAwCAgICA/wACgICAAAAAAAMAAP+AAoACgAADAAcAEwAAGQEzGQE1IRUTESE1ITUjNTM1MxGAAQCA/oABgICAgAEAAQD/AAEAgID9gAEAgICAgP0AAAAAAAMAAAAAAoACgAADAAsADwAAATUzFQERMxUzFSMREzUhFQIAgP2AgICAgAEAAYCAgP6AAoCAgP6AAgCAgAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAAxNSEVPQEzFSU1IRUlNTMVPQEhFQIAgP4AAYD+AIACAICAgICAgICAgICAgICAAAIAAAAAAYADgAADAA8AACE1MxUlESM1MxEzETMVIxEBAID/AICAgICAgICAAYCAAQD/AID+gAAAAgAAAAACgAKAAAMACQAANREzERU1IREzEYABgICAAgD+AICAAgD9gAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAAhNTMVJTUzFTM1MxUlETMRIREzEQEAgP8AgICA/gCAAYCAgICAgICAgIABgP6AAYD+gAACAAAAAAKAAoAAAwANAAA1ETMRFTUzETMRMxEzEYCAgICAgAIA/gCAgAEA/wACAP2AAAAACQAAAAACgAKAAAMABwALAA8AEwAXABsAHwAjAAAxNTMVITUzFSU1MxUzNTMVJTUzFSU1MxUzNTMVJTUzFSE1MxWAAYCA/gCAgID/AID/AICAgP4AgAGAgICAgICAgICAgICAgICAgICAgICAgIAAAAMAAP+AAoACgAADAAcADwAAFTUhFQERMxEBNSE1IREzEQIA/gCAAYD+gAGAgICAgAGAAYD+gP8AgIABgP2AAAADAAAAAAKAAoAABwALABMAADE1MzUzFSEVATUzFT0BITUhFSMVgIABgP6AgP6AAoCAgICAgAEAgICAgICAgAAABQAAAAACAAOAAAMABwALAA8AEwAAITUhFSURMxEBNTMVNREzGQE1IRUBAAEA/oCA/wCAgAEAgICAAQD/AAEAgICAAQD/AAEAgIAAAAIAAAAAAIADgAADAAcAADERMxEDETMRgICAAYD+gAIAAYD+gAAAAAAFAAAAAAIAA4AAAwAHAAsADwATAAAxNSEVNREzGQE1MxUlETMRATUhFQEAgID/AID+gAEAgICAAQD/AAEAgICAAQD/AAEAgIAAAAAABAAAAoADAAOAAAMABwALAA8AABE1MxUhNSEVJTUhFSE1MxWAAQABAP4AAQABAIACgICAgICAgICAgAAAAgAAAAAAgAMAAAMABwAAMREzEQM1MxWAgIACAP4AAoCAgAAABAAAAAACgAOAAAMABwALAB8AAAE1MxUhETMRATUzFQE1IzUzESM1MzUzFTMVIxEzFSMVAgCA/YCAAYCA/oCAgICAgICAgIABAICAAYD+gAEAgID+AICAAYCAgICA/oCAgAAAAAMAAAAAAoADgAAPABMAFwAAMTUzESM1MxEzESEVIREhFQM1MxUlNSEVgICAgAEA/wABgICA/oABAIABAIABAP8AgP8AgAKAgICAgIAAAAAACAAAAIACAAMAAAMABwALAA8AEwAXABsAHwAAPQEzFSE1MxUlNSEVJTUzFSE1MxUlNSEVJTUzFSE1MxWAAQCA/oABAP6AgAEAgP6AAQD+gIABAICAgICAgICAgICAgICAgICAgICAgIAAAAAABQAAAAACgAOAABMAFwAbAB8AIwAAITUjNTM1IzUzNTMVMxUjFTMVIxUBNTMVMzUzFSU1MxUhNTMVAQCAgICAgICAgID/AICAgP4AgAGAgICAgICAgICAgIACgICAgICAgICAgAAAAAACAAAAAACAA4AAAwAHAAAxETMRAxEzEYCAgAGA/oACAAGA/oAAAAAACAAAAAACAAOAAAMABwALAA8AEwAXABsAHwAAMTUhFT0BMxUlNSEVJTUzFSE1MxUlNSEVJTUzFT0BIRUBgID+gAEA/oCAAQCA/oABAP6AgAGAgICAgICAgICAgICAgICAgICAgICAgAACAAADAAKAA4AAAwAHAAARNSEVMzUhFQEAgAEAAwCAgICAAAADAAAAAAMAAoAADQARABsAADM1IxEzETMVMzUzFTMVNREzESURIzUhFSMVIxWAgICAgICAgP4AgAIAgICAAYD/AICAgICAAYD+gIABAICAgIAAAAABAAACAAGAA4AACQAAETUzNSM1IRUzEYCAAQCAAgCAgICA/wAAAAAACgAAAAACgAKAAAMABwALAA8AEwAXABsAHwAjACcAACE1MxUzNTMVJTUzFTM1MxUlNTMVMzUzFSU1MxUzNTMVJTUzFTM1MxUBAICAgP4AgICA/gCAgID/AICAgP8AgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAEAAAAAAoABgAAFAAAhESE1IRECAP4AAoABAID+gAAAAQAAAgACgAKAAAMAABE1IRUCgAIAgIAAAwAAAQADAAOAAAMABwAZAAABNSMVIREzERU1MxEzNSE1IRUjFTM1MxEjFQIAgP6AgICA/wACAICAgIABgICAAYD+gICAAQCAgICAgP6AgAABAAADAAKAA4AAAwAAETUhFQKAAwCAgAAEAAACAAGAA4AAAwAHAAsADwAAEzUzFSU1MxUzNTMVJTUzFYCA/wCAgID/AIACAICAgICAgICAgIAAAAACAAAAAAMAA4AAAwAPAAAxNSEVAREhNSERIREhFSERAwD+AP8AAQABAAEA/wCAgAEAAQCAAQD/AID/AAABAAABAAIAA4AAEQAAGQEzNTM1ITUhFTMVIxUjFSEVgID/AAGAgICAAQABAAEAgICAgICAgIAAAAEAAAEAAgADgAAPAAARNSE1IzUzNSE1IRUzESMVAQCAgP8AAYCAgAEAgICAgICA/oCAAAACAAACAAEAA4AAAwAHAAARNTMVNREzEYCAAgCAgIABAP8AAAABAAAAgAOAA4AADwAAPQEzESERIREhESMVIRUjFYABAAEAAQCA/oCAgIACgP6AAYD+gICAgAAAAAIAAAAABAADgAADABEAAAERIxETESE1IxEzNSERIREjEQGAgID/AICAA4D/AIACAAEA/wD+AAGAgAEAgPyAAwD9AAAAAQAAAQABAAGAAAMAABE1IRUBAAEAgIAAAwAAAAABgAIAAAMABwANAAAxNSEVPQEzFSU1MzUzEQEAgP6AgICAgICAgICAgP8AAAAAAAEAAAIAAQADgAAFAAATESM1IRGAgAEAAgABAID+gAAABAAAAgABgAOAAAMABwALAA8AABM1MxUlNTMVMzUzFSU1MxWAgP8AgICA/wCAAgCAgICAgICAgICAAAAACgAAAAACgAKAAAMABwALAA8AEwAXABsAHwAjACcAADE1MxUzNTMVJTUzFTM1MxUlNTMVMzUzFSU1MxUzNTMVJTUzFTM1MxWAgID/AICAgP8AgICA/gCAgID+AICAgICAgICAgICAgICAgICAgICAgICAgICAgAAABwAAAAACgAOAAAMABwANABEAFQAZAB0AADE1MxU1ETMRBTUjESERATUzFTURMxElETMRJTUzFYCAAQCAAQD+gICA/gCAAYCAgICAAQD/AICAAQD+gAGAgICAAQD/AIABAP8AgICAAAAIAAAAAAKAA4AAAwAJAA0AEQAVABkAHQAhAAAxNTMVIREzFTMVJREzESU1MxUlNTMVNREzESURMxElNTMVgAEAgID+AIABAID+gICA/gCAAYCAgIABAICAgAEA/wCAgICAgICAAQD/AIABAP8AgICAAAAAAAUAAAAAAoADgAADAAkADQAbAB8AADE1MxUhNSMRIREBETMRAREjNTM1IxEhETMVIxEBNTMVgAGAgAEA/wCA/oCAgIABAICAAQCAgICAAQD+gAIAAQD/AP6AAQCAgAEA/oCA/wACgICAAAAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAMzUhFT0BMxUhETMZATUzFT0BMxUDNTMVgAGAgP2AgICAgICAgICAgAEA/wABAICAgICAAQCAgAAABAAAAAACgAUAAAsADwATABcAADERMxEhETMRIxEhGQE1IRUBNTMVJTUzFYABgICA/oABgP8AgP8AgAMA/wABAP0AAYD+gAMAgIABAICAgICAAAAABAAAAAACgAUAAAsADwATABcAADERMxEhETMRIxEhGQE1IRUBNTMVPQEzFYABgICA/oABgP8AgIADAP8AAQD9AAGA/oADAICAAQCAgICAgAAFAAAAAAKABQAACwAPABMAFwAbAAAxETMRIREzESMRIRkBNSEVATUzFTM1MxUlNTMVgAGAgID+gAGA/oCAgID/AIADAP8AAQD9AAGA/oADAICAAQCAgICAgICAAAMAAAAAAoAEgAALAA8AEwAAMREzESERMxEjESEZATUhFQE1IRWAAYCAgP6AAYD+gAGAAwD/AAEA/QABgP6AAwCAgAEAgIAAAAQAAAAAAoAEgAALAA8AEwAXAAAxETMRIREzESMRIRkBNSEVATUhFTM1IRWAAYCAgP6AAYD+AAEAgAEAAwD/AAEA/QABgP6AAwCAgAEAgICAgAAAAAMAAAAAAoAEgAALABMAFwAAMREzESERMxEjESEZAjMVMzUzEQE1MxWAAYCAgP6AgICA/wCAAwD/AAEA/QABgP6AAwABAICA/wABAICAAAAAAQAAAAACgAOAABUAADERMxUzNSM1IRUhFTMVIxEhFSERIxGAgIACAP8AgIABAP6AgAMAgICAgICA/oCAAgD+AAAAAAAHAAD/AAKAA4AABwALAA8AEwAXABsAHwAAATUjNSEVMxUDNTMVJTUhFT0BMxUhETMRATUzFSU1IRUBgIABAICAgP4AAYCA/YCAAYCA/gABgP8AgICAgAEAgICAgICAgIACAP4AAYCAgICAgAADAAAAAAKABQAACwAPABMAADERIRUhFSEVIREhFQE1MxUlNTMVAoD+AAEA/wACAP6AgP8AgAOAgICA/oCABACAgICAgAAAAAADAAAAAAKABQAACwAPABMAADERIRUhFSEVIREhFQE1MxU9ATMVAoD+AAEA/wACAP6AgIADgICAgP6AgAQAgICAgIAAAAQAAAAAAoAFAAALAA8AEwAXAAAxESEVIRUhFSERIRUBNTMVMzUzFSU1MxUCgP4AAQD/AAIA/gCAgID/AIADgICAgP6AgAQAgICAgICAgAAAAwAAAAACgASAAAsADwATAAAxESEVIRUhFSERIRUBNSEVMzUhFQKA/gABAP8AAgD9gAEAgAEAA4CAgID+gIAEAICAgIAAAAAAAwAAAAABAAQAAAMABwALAAAzETMRAzUzFSU1MxWAgICA/wCAAoD9gAMAgICAgIAAAwCAAAABgAQAAAMABwALAAAzETMRAzUzFT0BMxWAgICAgAKA/YADAICAgICAAAAABAAAAAABgAQAAAMABwALAA8AADMRMxEBNTMVMzUzFSU1MxWAgP8AgICA/wCAAoD9gAMAgICAgICAgAAAAwAAAAABgAOAAAMABwALAAAzETMRATUzFTM1MxWAgP8AgICAAoD9gAMAgICAgAAAAv+AAAACgAOAAAMAEwAAJREzEQURIzUzESEVIREhFSERIRUCAID9gICAAgD+gAEA/wABgIACgP2AgAGAgAGAgP8AgP8AgAAABAAAAAACgASAAAMACwATABcAAAE1MxUBETMVMxUjESERIzUzETMRATUhFQEAgP6AgICAAYCAgID+AAGAAgCAgP4AA4CAgP2AAYCAAYD8gAQAgIAABgAAAAACgAUAAAMABwALAA8AEwAXAAAzNSEVJREzESERMxEBNSEVATUzFSU1MxWAAYD+AIABgID+AAGA/wCA/wCAgICAAoD9gAKA/YACgICAAQCAgICAgAAAAAAGAAAAAAKABQAAAwAHAAsADwATABcAADM1IRUlETMRIREzEQE1IRUBNTMVPQEzFYABgP4AgAGAgP4AAYD/AICAgICAAoD9gAKA/YACgICAAQCAgICAgAAABgAAAAACgAUAAAMABwALAA8AFQAZAAAzNSEVJREzESERMxEBNTMVAzUhETMRATUzFYABgP4AgAGAgP4AgIABAID/AICAgIACgP2AAoD9gAOAgID/AIABAP6AAYCAgAAABQAAAAACgASAAAMABwALAA8AEwAAMzUhFSURMxEhETMRATUhFQE1IRWAAYD+AIABgID+AAGA/oABgICAgAKA/YACgP2AAoCAgAEAgIAAAAAGAAAAAAKABIAAAwAHAAsADwATABcAADM1IRUlETMRIREzEQE1IRUBNSEVMzUhFYABgP4AgAGAgP4AAYD+AAEAgAEAgICAAoD9gAKA/YACgICAAQCAgICAAAAAAAkAAACAAoADAAADAAcACwAPABMAFwAbAB8AIwAAPQEzFSE1MxUlNTMVMzUzFSU1MxUlNTMVMzUzFSU1MxUhNTMVgAGAgP4AgICA/wCA/wCAgID+AIABgICAgICAgICAgICAgICAgICAgICAgICAgAAFAAAAAAKAA4AAAwAHAA8AFwAbAAAzNSEVATUzFQERMxEzFSMVIREjNTM1MxEBNSEVgAGA/wCA/oCAgIABgICAgP4AAYCAgAGAgID/AAKA/oCAgAGAgID9gAKAgIAAAAAFAAAAAAKABIAAAwAHAAsADwATAAAzNSEVJREzESERMxEBNTMVJTUzFYABgP4AgAGAgP6AgP8AgICAgAMA/QADAP0AAwCAgICAgAAABQAAAAACgASAAAMABwALAA8AEwAAMzUhFSURMxEhETMRATUzFT0BMxWAAYD+AIABgID+gICAgICAAwD9AAMA/QADAICAgICAAAAAAAQAAAAAAoAEgAADAAcACwAPAAAzNSEVJREzESERMxEBNSEVgAGA/gCAAYCA/gABgICAgAMA/QADAP0AA4CAgAAFAAAAAAKA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AAACgAOAAAMABwALAA8AEwAXAAAzNSEVJREzESERMxEBNSEVPQEzFSU1IRWAAYD+AIABgID+AAGAgP4AAYCAgIABgP6AAYD+gAGAgICAgICAgIAAAAUAAAAAAoADgAADAAcACwAPABMAADM1IRUlETMRIREzEQE1IRUBNSEVgAGA/gCAAYCA/gABgP6AAYCAgIABgP6AAYD+gAGAgIABAICAAAAABgAAAAACgAOAAAMABwALAA8AEwAXAAAzNSEVJREzESERMxEBNSEVATUhFTM1IRWAAYD+AIABgID+AAGA/gABAIABAICAgAGA/oABgP6AAYCAgAEAgICAgAAAAAADAAAAAAMAA4AAAwAHAAsAACERIREBNSEVAREhEQEAAQD+AAMA/gABAAEA/wABgICAAQABAP8AAAMAAAAAAoACgAADAA0AFwAAATUzFQE1IxEzETMVIRU1ESM1ITUhFTMRAQCA/wCAgIABAID/AAGAgAEAgID/AIABgP8AgICAAQCAgID+gAAAAwAAAAACgAOAAAMACQANAAA1ETMRFTUhETMRATUhFYABgID9gAEAgAIA/gCAgAIA/YADAICAAAADAAAAAAKAA4AAAwAJAA0AADURMxEVNSERMxEBNSEVgAGAgP8AAQCAAgD+AICAAgD9gAMAgIAAAAMAAAAAAoADgAADAAkADQAANREzERU1IREzEQE1MxWAAYCA/oCAgAIA/gCAgAIA/YADAICAAAAABAAAAAACgAOAAAMACQANABEAADURMxEVNSERMxEBNTMVMzUzFYABgID+AICAgIACAP4AgIACAP2AAwCAgICAAAUAAP+AAoADgAADAAcADwATABcAABU1IRUBETMRATUhNSERMxEBNTMVPQEzFQIA/gCAAYD+gAGAgP6AgICAgIABgAGA/oD/AICAAYD9gAKAgICAgIAAAAACAAD/gAGAAwAAAwAPAAABNTMVAREzETMVIxUzFSMRAQCA/oCAgICAgAEAgID+gAOA/wCAgID/AAAAAAAFAAD/gAKAA4AAAwAHAA8AEwAXAAAVNSEVAREzEQE1ITUhETMRATUzFTM1MxUCAP4AgAGA/oABgID+AICAgICAgAGAAYD+gP8AgIABgP2AAwCAgICAAAAABwAAAAACgASAAAMABwALAA8AEwAXABsAACERMxEBNTMVMzUzFSU1MxUhNTMVATUhFTM1IRUBAID/AICAgP4AgAGAgP2AAQCAAQACgP2AAoCAgICAgICAgIABAICAgIAAAwAAAAACgAOAAAMACwARAAAhNSEVNREjNTMRMxEFESEVIREBAAEAgICA/YACAP6AgICAAQCAAQD9gIADgID9AAAAAAABAAABgAKAAgAAAwAAETUhFQKAAYCAgAACAAACAAEAA4AAAwAHAAARNTMVNREzEYCAAgCAgIABAP8AAAACAAACAAEAA4AAAwAHAAARNTMVNREzEYCAAgCAgIABAP8AAAACAAAAAAEAAYAAAwAHAAAxNTMVNREzEYCAgICAAQD/AAAAAAACAAACAAEAA4AAAwAHAAATNTMVJREzEYCA/wCAAgCAgIABAP8AAAAABAAAAgACAAOAAAMABwALAA8AABE1MxUzNTMVJREzETMRMxGAgID/AICAgAIAgICAgIABAP8AAQD/AAAABAAAAgACAAOAAAMABwALAA8AABE1MxUzNTMVJREzETMRMxGAgID/AICAgAIAgICAgIABAP8AAQD/AAAABAAAAAACAAGAAAMABwALAA8AADE1MxUzNTMVJREzETMRMxGAgID/AICAgICAgICAAQD/AAEA/wAAAAAAAQAAAAACgAOAAAsAACERITUhETMRIRUhEQEA/wABAIABAP8AAgCAAQD/AID+AAAAAQAAAQABgAKAAAsAABM1IzUzNTMVMxUjFYCAgICAgAEAgICAgICAAAMAAAAAAoABAAADAAcACwAAMREzETMRMxEzETMRgICAgIABAP8AAQD/AAEA/wAAAAUAAACAAYADAAADAAcACwAPABMAACU1MxUlNTMVJTUzFT0BMxU9ATMVAQCA/wCA/wCAgICAgICAgICAgICAgICAgIAABQAAAIABgAMAAAMABwALAA8AEwAAPQEzFT0BMxU9ATMVJTUzFSU1MxWAgID/AID/AICAgICAgICAgICAgICAgIAAAAABAAAAAAKAA4AAFwAAITUjNSMRMzUzNSEVIRUjFSEVIRUzFSEVAQCAgICAAYD/AIABgP6AgAEAgIABgICAgICAgICAgAAAAAABAAACAAMAA4AADwAAExEjNSEVMzUzFTMRITUjFYCAAYCAgID/AIACAAEAgICAgP8AgIAAAwAAAAACgAOAAA0AEQAVAAAzESM1MzUzFSERIxEhGQE1MxUzNTMVgICAgAGAgP8AgICAAgCAgID9gAIA/gADAICAgIAAAAAAAgAAAAACgAOAAAsAEQAAMxEjNTM1MxUzFSMRIREhNSERgICAgICAAQD/AAGAAgCAgICA/gADAID8gAAAAAAeAW4AAQAAAAAAAAAWAC4AAQAAAAAAAQALAF0AAQAAAAAAAgAHAHkAAQAAAAAAAwALAJkAAQAAAAAABAATAM0AAQAAAAAABQALAPkAAQAAAAAABgALAR0AAQAAAAAACAAMAUMAAQAAAAAACQAMAWoAAQAAAAAACgABAXsAAQAAAAAACwAaAbMAAQAAAAAADAAaAgQAAQAAAAAADQAoAnEAAQAAAAAADgAuAvgAAQAAAAAAEwApA3sAAwABBAkAAAAsAAAAAwABBAkAAQAWAEUAAwABBAkAAgAOAGkAAwABBAkAAwAWAIEAAwABBAkABAAmAKUAAwABBAkABQAWAOEAAwABBAkABgAWAQUAAwABBAkACAAYASkAAwABBAkACQAYAVAAAwABBAkACgACAXcAAwABBAkACwA0AX0AAwABBAkADAA0Ac4AAwABBAkADQBQAh8AAwABBAkADgBcApoAAwABBAkAEwBSAycAQwBvAHAAeQByAGkAZwBoAHQAIABBAG4AZAByAGUAdwAgAFQAeQBsAGUAcgAAQ29weXJpZ2h0IEFuZHJldyBUeWxlcgAATQBpAG4AZQBjAHIAYQBmAHQAaQBhAABNaW5lY3JhZnRpYQAAUgBlAGcAdQBsAGEAcgAAUmVndWxhcgAATQBpAG4AZQBjAHIAYQBmAHQAaQBhAABNaW5lY3JhZnRpYQAATQBpAG4AZQBjAHIAYQBmAHQAaQBhACAAUgBlAGcAdQBsAGEAcgAATWluZWNyYWZ0aWEgUmVndWxhcgAAVgBlAHIAcwBpAG8AbgAgADEALgAwAABWZXJzaW9uIDEuMAAATQBpAG4AZQBjAHIAYQBmAHQAaQBhAABNaW5lY3JhZnRpYQAAQQBuAGQAcgBlAHcAIABUAHkAbABlAHIAAEFuZHJldyBUeWxlcgAAQQBuAGQAcgBlAHcAIABUAHkAbABlAHIAAEFuZHJldyBUeWxlcgAACgAACgAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAbgBkAHIAZQB3AHQAeQBsAGUAcgAuAG4AZQB0AABodHRwOi8vd3d3LmFuZHJld3R5bGVyLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAbgBkAHIAZQB3AHQAeQBsAGUAcgAuAG4AZQB0AABodHRwOi8vd3d3LmFuZHJld3R5bGVyLm5ldAAAQwByAGUAYQB0AGkAdgBlACAAQwBvAG0AbQBvAG4AcwAgAEEAdAB0AHIAaQBiAHUAdABpAG8AbgAgAFMAaABhAHIAZQAgAEEAbABpAGsAZQAAQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZQAAaAB0AHQAcAA6AC8ALwBjAHIAZQBhAHQAaQB2AGUAYwBvAG0AbQBvAG4AcwAuAG8AcgBnAC8AbABpAGMAZQBuAHMAZQBzAC8AYgB5AC0AcwBhAC8AMwAuADAALwAAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLwAARgBpAHYAZQAgAGIAaQBnACAAcQB1AGEAYwBrAGkAbgBnACAAegBlAHAAaAB5AHIAcwAgAGoAbwBsAHQAIABtAHkAIAB3AGEAeAAgAGIAZQBkAABGaXZlIGJpZyBxdWFja2luZyB6ZXBoeXJzIGpvbHQgbXkgd2F4IGJlZAAAAAIAAAAAAAAAYgAzAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAQIBAwADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAowCEAIUAvQCWAOgAhgCOAIsAnQCpAKQBBACKANoAgwCTAQUBBgCNAQcAiADDAN4BCACeAKoA9QD0APYAogCtAMkAxwCuAGIAYwCQAGQAywBlAMgAygDPAMwAzQDOAOkAZgDTANAA0QCvAGcA8ACRANYA1ADVAGgA6wDtAIkAagBpAGsAbQBsAG4AoABvAHEAcAByAHMAdQB0AHYAdwDqAHgAegB5AHsAfQB8ALgAoQB/AH4AgACBAOwA7gC6ALsBCQCzALYAtwDEAQoAtAC1AMUAggCHAKsAvgC/AQsAjAEMAQ0GZ2x5cGgxBmdseXBoMgd1bmkwMEFEB3VuaTAwQjIHdW5pMDBCMwd1bmkwMEI1B3VuaTAwQjkHdW5pMUU5RQ1xdW90ZXJldmVyc2VkBEV1cm8HdW5pRkIwMQd1bmlGQjAyAAAAAAH//wACAAEAAAAOAAAAGAAgAAAAAgABAAEA0wABAAQAAAACAAAAAQAAAAEAAAAAAAEAAAAAyYlvMQAAAADK8HqtAAAAAMtPFqk=); }\";\r\n" + // + "document.head.appendChild(font);") + public static native void loadFont(); + + @JSBody(params = {}, script = "if (document.querySelector(\"#eaglerml_gui\")) {\r\n" + // + " document.querySelector(\"#eaglerml_gui\").remove();\r\n" + // + " }") + public static native void closeGui(); + + @JSBody(params = {}, script = "return !!document.querySelector(\"#eaglerml_gui\")") + public static native boolean isGuiOpen(); + + @JSBody(params = {}, script = "console.log('closed a screen')") + public static native void qlog(); +} \ No newline at end of file diff --git a/sources/main/java/net/eaglerforge/gui/ModLoader.java b/sources/main/java/net/eaglerforge/gui/ModLoader.java new file mode 100644 index 0000000..2b35d1c --- /dev/null +++ b/sources/main/java/net/eaglerforge/gui/ModLoader.java @@ -0,0 +1,27 @@ +package net.eaglerforge.gui; + +import org.teavm.jso.JSBody; + +public class ModLoader { + public static String[] Mods = {}; + + @JSBody(params = { "Mods" }, script = "window.ModLoader(Mods);") + public static native void loadMods(String[] Mods); + + @JSBody(params = {}, script = "loadLoader();") + public static native void loadLoader(); + + @JSBody(params = { "Mods" }, script = "localStorage.setItem('ml::Mods', JSON.stringify(Mods))") + private static native void saveMods(String[] Mods); + + @JSBody(params = {}, script = "try { return JSON.parse(localStorage.getItem('ml::Mods')||'[]') } catch(err) {return []}") + private static native String[] retrieveMods(); + + public static void saveModsToLocalStorage() { + saveMods(Mods); + }; + + public static void loadModsFromLocalStorage() { + Mods = retrieveMods(); + }; +} \ No newline at end of file diff --git a/sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java b/sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java new file mode 100644 index 0000000..95f6fac --- /dev/null +++ b/sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java @@ -0,0 +1,235 @@ +package net.eaglerforge.gui; + +// WIP -radmanplays + + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.google.common.collect.Lists; + +import net.lax1dude.eaglercraft.v1_8.EagRuntime; +import net.lax1dude.eaglercraft.v1_8.vfs.SYS; +import net.lax1dude.eaglercraft.v1_8.internal.FileChooserResult; +import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; +import net.lax1dude.eaglercraft.v1_8.log4j.Logger; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiOptionButton; +import net.minecraft.client.gui.GuiResourcePackAvailable; +import net.minecraft.client.gui.GuiResourcePackSelected; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.resources.ResourcePackListEntry; +import net.minecraft.client.resources.ResourcePackListEntryFound; +import net.minecraft.client.resources.ResourcePackRepository; + + +public class WIP_GuiMods extends GuiScreen { + private static final Logger logger = LogManager.getLogger(); + private final GuiScreen parentScreen; + private List availableResourcePacks; + private List selectedResourcePacks; + private GuiResourcePackAvailable availableResourcePacksList; + private GuiResourcePackSelected selectedResourcePacksList; + private boolean changed = false; + + public WIP_GuiMods(GuiScreen parentScreenIn) { + this.parentScreen = parentScreenIn; + } + + /**+ + * Adds the buttons (and other controls) to the screen in + * question. Called when the GUI is displayed and when the + * window resizes, the buttonList is cleared beforehand. + */ + public void initGui() { + GuiButton btn; + this.buttonList.add(btn = new GuiOptionButton(2, this.width / 2 - 154, this.height - 48, + I18n.format("eaglerforge.menu.mods.addmod" + + "", new Object[0]))); + btn.enabled = SYS.VFS != null; + this.buttonList.add( + new GuiOptionButton(1, this.width / 2 + 4, this.height - 48, I18n.format("gui.done", new Object[0]))); + if (!this.changed) { + this.availableResourcePacks = Lists.newArrayList(); + this.selectedResourcePacks = Lists.newArrayList(); + ResourcePackRepository resourcepackrepository = this.mc.getResourcePackRepository(); + resourcepackrepository.updateRepositoryEntriesAll(); + ArrayList arraylist = Lists.newArrayList(resourcepackrepository.getRepositoryEntriesAll()); + arraylist.removeAll(resourcepackrepository.getRepositoryEntries()); + + } + + this.availableResourcePacksList = new GuiResourcePackAvailable(this.mc, 200, this.height, + this.availableResourcePacks); + this.availableResourcePacksList.setSlotXBoundsFromLeft(this.width / 2 - 4 - 200); + this.availableResourcePacksList.registerScrollButtons(7, 8); + this.selectedResourcePacksList = new GuiResourcePackSelected(this.mc, 200, this.height, + this.selectedResourcePacks); + this.selectedResourcePacksList.setSlotXBoundsFromLeft(this.width / 2 + 4); + this.selectedResourcePacksList.registerScrollButtons(7, 8); + } + + /**+ + * Handles mouse input. + */ + public void handleMouseInput() throws IOException { + super.handleMouseInput(); + this.selectedResourcePacksList.handleMouseInput(); + this.availableResourcePacksList.handleMouseInput(); + } + + public boolean hasResourcePackEntry(ResourcePackListEntry parResourcePackListEntry) { + return this.selectedResourcePacks.contains(parResourcePackListEntry); + } + + /**+ + * Returns the list containing the resource pack entry, returns + * the selected list if it is selected, otherwise returns the + * available list + */ + public List getListContaining(ResourcePackListEntry parResourcePackListEntry) { + return this.hasResourcePackEntry(parResourcePackListEntry) ? this.selectedResourcePacks + : this.availableResourcePacks; + } + + /**+ + * Returns a list containing the available resource packs + */ + public List getAvailableResourcePacks() { + return this.availableResourcePacks; + } + + /**+ + * Returns a list containing the selected resource packs + */ + public List getSelectedResourcePacks() { + return this.selectedResourcePacks; + } + + /**+ + * Called by the controls from the buttonList when activated. + * (Mouse pressed for buttons) + */ + protected void actionPerformed(GuiButton parGuiButton) { + if (parGuiButton.enabled) { + if (parGuiButton.id == 2) { + if (SYS.VFS == null) + return; + EagRuntime.displayFileChooser("text/javascript", "js"); + } else if (parGuiButton.id == 1) { + if (this.changed) { + ArrayList arraylist = Lists.newArrayList(); + + for (ResourcePackListEntry resourcepacklistentry : this.selectedResourcePacks) { + if (resourcepacklistentry instanceof ResourcePackListEntryFound) { + arraylist.add(((ResourcePackListEntryFound) resourcepacklistentry).func_148318_i()); + } + } + + Collections.reverse(arraylist); + this.mc.getResourcePackRepository().setRepositories(arraylist); + this.mc.gameSettings.resourcePacks.clear(); + this.mc.gameSettings.field_183018_l.clear(); + + for (ResourcePackRepository.Entry resourcepackrepository$entry : (List) arraylist) { + this.mc.gameSettings.resourcePacks.add(resourcepackrepository$entry.getResourcePackName()); + if (resourcepackrepository$entry.func_183027_f() != 1) { + this.mc.gameSettings.field_183018_l.add(resourcepackrepository$entry.getResourcePackName()); + } + } + + this.mc.loadingScreen.eaglerShow(I18n.format("resourcePack.load.refreshing"), + I18n.format("resourcePack.load.pleaseWait")); + this.mc.gameSettings.saveOptions(); + this.mc.refreshResources(); + } + this.mc.displayGuiScreen(this.parentScreen); + } + + } + } + + public void updateScreen() { + FileChooserResult packFile = null; + if (EagRuntime.fileChooserHasResult()) { + packFile = EagRuntime.getFileChooserResult(); + } + if (packFile == null) + return; + logger.info("Loading resource pack: {}", packFile.fileName); + mc.loadingScreen.eaglerShow(I18n.format("resourcePack.load.loading"), packFile.fileName); + SYS.loadResourcePack(packFile.fileName, new ByteArrayInputStream(packFile.fileData), null); + + ArrayList arraylist = Lists.newArrayList(); + + for (ResourcePackListEntry resourcepacklistentry : this.selectedResourcePacks) { + if (resourcepacklistentry instanceof ResourcePackListEntryFound) { + arraylist.add(((ResourcePackListEntryFound) resourcepacklistentry).func_148318_i()); + } + } + + Collections.reverse(arraylist); + this.mc.getResourcePackRepository().setRepositories(arraylist); + this.mc.gameSettings.resourcePacks.clear(); + this.mc.gameSettings.field_183018_l.clear(); + + for (ResourcePackRepository.Entry resourcepackrepository$entry : (List) arraylist) { + this.mc.gameSettings.resourcePacks.add(resourcepackrepository$entry.getResourcePackName()); + if (resourcepackrepository$entry.func_183027_f() != 1) { + this.mc.gameSettings.field_183018_l.add(resourcepackrepository$entry.getResourcePackName()); + } + } + + this.mc.gameSettings.saveOptions(); + + boolean wasChanged = this.changed; + this.changed = false; + this.initGui(); + this.changed = wasChanged; + } + + /**+ + * Called when the mouse is clicked. Args : mouseX, mouseY, + * clickedButton + */ + protected void mouseClicked(int parInt1, int parInt2, int parInt3) { + super.mouseClicked(parInt1, parInt2, parInt3); + this.availableResourcePacksList.mouseClicked(parInt1, parInt2, parInt3); + this.selectedResourcePacksList.mouseClicked(parInt1, parInt2, parInt3); + } + + /**+ + * Called when a mouse button is released. Args : mouseX, + * mouseY, releaseButton + */ + protected void mouseReleased(int i, int j, int k) { + super.mouseReleased(i, j, k); + } + + /**+ + * Draws the screen and all the components in it. Args : mouseX, + * mouseY, renderPartialTicks + */ + public void drawScreen(int i, int j, float f) { + this.drawBackground(0); + this.availableResourcePacksList.drawScreen(i, j, f); + this.selectedResourcePacksList.drawScreen(i, j, f); + this.drawCenteredString(this.fontRendererObj, I18n.format("eaglerforge.menu.mods", new Object[0]), this.width / 2, + 16, 16777215); + this.drawCenteredString(this.fontRendererObj, I18n.format("eaglerforge.menu.mods.info", new Object[0]), + this.width / 2 - 77, this.height - 26, 0xFF0000); + super.drawScreen(i, j, f); + } + + /**+ + * Marks the selected resource packs list as changed to trigger + * a resource reload when the screen is closed + */ + public void markChanged() { + this.changed = true; + } +} \ No newline at end of file diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java index a86048b..396a253 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java @@ -2,7 +2,6 @@ package net.lax1dude.eaglercraft.v1_8; import java.math.BigInteger; -import static net.eaglerforge.GuiMods.ModsLoaded; public class EaglercraftVersion { @@ -50,7 +49,7 @@ public class EaglercraftVersion { // Miscellaneous variables: public static final String mainMenuStringA = "Minecraft* 1.8.8"; - public static final String mainMenuStringB = projectForkName + " " + projectForkVersion + " (" + ModsLoaded + " Mods loaded)"; + public static final String mainMenuStringB = projectForkName + " " + projectForkVersion + " (" + 0 + " Mods loaded)"; public static final String mainMenuStringC = ""; public static final String mainMenuStringD = "Resources Copyright Mojang AB"; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/log4j/Logger.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/log4j/Logger.java index 4e535be..cb3f25d 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/log4j/Logger.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/log4j/Logger.java @@ -3,7 +3,7 @@ package net.lax1dude.eaglercraft.v1_8.log4j; import java.text.SimpleDateFormat; import java.util.Date; -import net.eaglerforge.api.ModData; +/*import net.eaglerforge.api.ModData;*/ import net.lax1dude.eaglercraft.v1_8.EagRuntime; import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; @@ -22,7 +22,7 @@ import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; * POSSIBILITY OF SUCH DAMAGE. * */ -public class Logger extends ModData { +public class Logger /*extends ModData*/ { public final String loggerName; diff --git a/sources/setup/workspace_template/javascript/ModAPI.js b/sources/setup/workspace_template/javascript/ModAPI.js new file mode 100644 index 0000000..78f2b7b --- /dev/null +++ b/sources/setup/workspace_template/javascript/ModAPI.js @@ -0,0 +1,121 @@ +function initAPI(version) { + var ModAPI = {}; + ModAPI.events = {}; + ModAPI.events.types = ["event"]; + ModAPI.events.listeners = { "event": [] }; + ModAPI.globals = {}; + + ModAPI.addEventListener = function AddEventListener(name, callback) { + if (!callback) { + throw new Error("Invalid callback!"); + } + if (ModAPI.events.types.includes(name)) { + if (!Array.isArray(ModAPI.events.listeners[name])) { + ModAPI.events.listeners[name] = []; + } + ModAPI.events.listeners[name].push(callback); + console.log("Added new event listener."); + } else { + throw new Error("This event does not exist!"); + } + }; + + ModAPI.removeEventListener = function removeEventListener(name, func, slow) { + if (!func) { + throw new Error("Invalid callback!"); + } + if (!Array.isArray(ModAPI.events.listeners[name])) { + ModAPI.events.listeners[name] = []; + } + var targetArr = ModAPI.events.listeners[name]; + if (!slow) { + if (targetArr.indexOf(func) !== -1) { + targetArr.splice(targetArr.indexOf(func), 1); + console.log("Removed event listener."); + } + } else { + var functionString = func.toString(); + targetArr.forEach((f, i) => { + if (f.toString() === functionString) { + targetArr.splice(i, 1); + console.log("Removed event listener."); + } + }); + } + }; + + ModAPI.events.newEvent = function newEvent(name) { + ModAPI.events.types.push(name); + }; + + ModAPI.events.callEvent = function callEvent(name, data) { + if ( + !ModAPI.events.types.includes(name) || + !Array.isArray(ModAPI.events.listeners[name]) + ) { + if (!Array.isArray(ModAPI.events.listeners[name])) { + if (ModAPI.events.types.includes(name)) { + ModAPI.events.listeners.event.forEach((func) => { + func({ event: name, data: data }); + }); + return; + } + return; + } + console.error( + "The ModAPI has been called with an invalid event name: " + name + ); + console.error("Please report this bug to the repo."); + return; + } + ModAPI.events.listeners[name].forEach((func) => { + func(data); + }); + ModAPI.events.listeners.event.forEach((func) => { + func({ event: name, data: data }); + }); + + ModAPI.globals._initUpdate(); + }; + + ModAPI.updateComponent = function updateComponent(component) { + if ( + typeof component !== "string" || + ModAPI[component] === null || + ModAPI[component] === undefined + ) { + return; + } + if (!ModAPI.globals || !ModAPI.globals.onGlobalsUpdate) { + return; + } + if (!ModAPI.globals.toUpdate) { + ModAPI.globals.toUpdate = []; + } + if (ModAPI.globals.toUpdate.indexOf(component) === -1) { + ModAPI.globals.toUpdate.push(component); + } + }; + + ModAPI.require = function require(component) { + if (typeof component !== "string") { + return; + } + if (!ModAPI.globals || !ModAPI.globals.onRequire) { + return; + } + ModAPI.globals.onRequire(component); + }; + + ModAPI.globals._initUpdate = function _initUpdate() { + if (!ModAPI.globals.toUpdate) { + ModAPI.globals.toUpdate = []; + } + ModAPI.globals.toUpdate.forEach((id) => { + ModAPI.globals.onGlobalsUpdate(id); + }); + ModAPI.globals.toUpdate = []; + }; + + window.ModAPI = ModAPI; +} \ No newline at end of file diff --git a/sources/setup/workspace_template/javascript/ModGUI.js b/sources/setup/workspace_template/javascript/ModGUI.js new file mode 100644 index 0000000..57b1b44 --- /dev/null +++ b/sources/setup/workspace_template/javascript/ModGUI.js @@ -0,0 +1,169 @@ +function displayGui() { + function gui() { + if (document.querySelector("#eaglerpl_gui")) { + document.querySelector("#eaglerpl_gui").remove(); + } + localStorage.setItem( + "ml::Mods", + localStorage.getItem("ml::Mods") || "[]" + ); + try { + localStorage.setItem( + "ml::Mods", + JSON.stringify(JSON.parse(localStorage.getItem("ml::Mods"))) + ); + } catch (error) { + localStorage.setItem("ml::Mods", "[]"); + } + var Mods = JSON.parse(localStorage.getItem("ml::Mods")); + var container = document.createElement("div"); + container.id = "eaglerpl_gui"; + container.style = `width:100%; height: 100%; position: fixed; top: 0; left: 0; z-index: 10; color: white; font-family: Minecraftia, sans-serif; overflow-y: scroll; overflow-x: hidden; background-image: url(data:image/png;base64,UklGRhoBAABXRUJQVlA4TA0BAAAvn8AnAIWjtpEECdnA2N0DsTROy7xUqfrWw0jbyLkJKTz0+I20jTT/Bo89e1YR/Wfktm0Y+wNKLobT7QP/n/B7Z/naW26QHoTpHB7LFouyKHlzeHxfCStSuj9KdbC8z1IJ5iWiyQed48vtYJ+lUu0t4VwranS1XMIutSiLYlbb8G54uf2p3VPSfRZtSrlsPFjOzZZrd/us3B3uK+HcHJQql+xbLMrS/WqNpm6DeZ/VIPVYaN/KzUbp91nd9xl5pYu50dU2W417nbdTj5l2Ne92uM9qXNpyf6+oXkabHKXaZ1HS4Iaqpim+1KIJ+0M49/LjNbTGP5mrrMZEuc7Uzcb1ViOJ6TuOt4NGJs+zDgA=); background-color: rgb(60,60,60); background-blend-mode: multiply; background-size: 64px;`; + var title = document.createElement("h1"); + title.style = "text-shadow: 0px 0px 4px;"; + title.innerHTML = "Mod Manager"; + var closeButton = document.createElement("a"); + closeButton.style = `margin-left: 2rem; color: red;`; + closeButton.href = "javascript:void(0)"; + closeButton.addEventListener("click", () => { + document.querySelector("#eaglerpl_gui").remove(); + }); + closeButton.innerHTML = "[X]"; + title.appendChild(closeButton); + container.appendChild(title); + + var warningPoster = document.createElement("p"); + warningPoster.style = "font-size: 0.8rem; color: orangered;"; + warningPoster.innerHTML = + "Warning: Installing Mods gives them full control over the game. Be cautious when installing them.
Mods that have been removed also need a reload to stop running in the background."; + container.appendChild(warningPoster); + + var tipPoster = document.createElement("p"); + tipPoster.style = "font-size: 0.8rem; color: yellow;"; + tipPoster.innerHTML = + "Tip: if the mods say that they failed loading, try refreshing the gui"; + container.appendChild(tipPoster); + + var table = document.createElement("table"); + table.style = "table-layout: fixed; width: 100%"; + var headerRow = document.createElement("tr"); + headerRow.style = "background: rgb(50,50,50);"; + var urlBox = document.createElement("th"); + urlBox.style = "text-align: center;"; + urlBox.innerHTML = "URL"; + headerRow.appendChild(urlBox); + var statusBox = document.createElement("th"); + statusBox.style = "text-align: center; width: 15%;"; + statusBox.innerHTML = "Status"; + headerRow.appendChild(statusBox); + table.appendChild(headerRow); + + Mods.forEach((url) => { + var row = document.createElement("tr"); + row.style = `box-shadow: 0px 2px 0px grey;`; + var urlBox = document.createElement("td"); + urlBox.style = "user-select: text;"; + var textWrapper = document.createElement("div"); + textWrapper.style = `max-width: 100%; overflow-wrap: anywhere; max-height: 3rem; overflow-y: scroll;`; + textWrapper.innerText = url; + urlBox.append(textWrapper); + row.appendChild(urlBox); + var statusBox = document.createElement("td"); + statusBox.innerHTML = ((curl) => { + var targs = document.querySelectorAll("script[data-Mod]"); + for (let i = 0; i < targs.length; i++) { + const elem = targs[i]; + if (elem.getAttribute("data-Mod") === curl) { + return "LOADED"; + } + } + return "FAILED"; + })(url); + switch (statusBox.innerHTML) { + case "LOADED": + statusBox.style = "background-color: green; text-align: center;"; + break; + case "FAILED": + statusBox.style = "background-color: dimgrey; text-align: center;"; + break; + default: + break; + } + var binBtn = document.createElement("button"); + binBtn.style = + "background: transparent; text-align: center; color: yellow; cursor: pointer; font-family: 'Minecraftia', sans-serif; text-decoration: underline; border: 0; margin-left: 1rem; font-size: 1rem;"; + binBtn.innerHTML = "[X]"; + binBtn.addEventListener("click", () => { + if (!window.confirm("Delete Mod?") || Mods.indexOf(url) === -1) { + return; + } + Mods.splice(Mods.indexOf(url), 1); + localStorage.setItem("ml::Mods", JSON.stringify(Mods)); + gui(); + }); + statusBox.appendChild(binBtn); + row.appendChild(statusBox); + table.appendChild(row); + }); + + var addBtn = document.createElement("button"); + addBtn.style = + "background: transparent; text-align: center; color: yellow; cursor: pointer; font-family: 'Minecraftia', sans-serif; text-decoration: underline; border: 0; margin-right: 1rem; font-size: 1rem;"; + addBtn.innerHTML = "Add new"; + addBtn.addEventListener("click", () => { + var newMod = window.prompt("URL of Mod: ", "http://example.com/example.js"); + Mods.push( + newMod + ); + localStorage.setItem("ml::Mods", JSON.stringify(Mods)); + if(window.ModLoader){ + ModLoader([newMod]); + } + gui(); + }); + + var uploadBtn = document.createElement("button"); + uploadBtn.style = + "background: transparent; text-align: center; color: yellow; cursor: pointer; font-family: 'Minecraftia', sans-serif; text-decoration: underline; border: 0; font-size: 1rem;"; + uploadBtn.innerHTML = "Upload..."; + uploadBtn.addEventListener("click", function uploadBtnListener() { + var filePicker = document.createElement("input"); + filePicker.type = "file"; + filePicker.accept = ".js"; + filePicker.addEventListener("input", function onInput() { + if (filePicker.files[0]) { + var reader = new FileReader(); + reader.addEventListener("load", function onModRead() { + var newMod = reader.result.replace(";base64", `;fs=${encodeURIComponent(filePicker.files[0].name) || "unknown"};base64`); + Mods.push(newMod); + localStorage.setItem("ml::Mods", JSON.stringify(Mods)); + if(window.ModLoader){ + ModLoader([newMod]); + } + gui(); + }); + reader.readAsDataURL(filePicker.files[0]); + } + }); + filePicker.click(); + }); + + container.appendChild(table); + container.appendChild(addBtn); + container.appendChild(uploadBtn); + + var notice = document.createElement("a"); + notice.innerHTML = "Refresh GUI"; + notice.href = "javascript:void(0)"; + notice.addEventListener("click", function reloadListener() { + setTimeout(gui, 500); + this.remove(); + }); + notice.style = + "color: yellow; display: block; margin-top: 2rem; width: 0; white-space: nowrap;"; + container.appendChild(notice); + //ModAPI.events.callEvent("gui", {}); + document.body.appendChild(container); + } + gui(); +} diff --git a/sources/setup/workspace_template/javascript/ModLoader.js b/sources/setup/workspace_template/javascript/ModLoader.js new file mode 100644 index 0000000..d84ecdb --- /dev/null +++ b/sources/setup/workspace_template/javascript/ModLoader.js @@ -0,0 +1,131 @@ +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..." + ); + }; +} \ No newline at end of file diff --git a/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt b/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt index 7523dc8..e7641f0 100644 --- a/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt +++ b/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt @@ -36,6 +36,433 @@ Compile it yourself here: https://gitlab.com/lax1dude/eaglercraftx-1.8/ + + + + +