mirror of
				https://github.com/eaglerforge/EaglerForge-old.git
				synced 2025-06-05 17:20:57 -05:00 
			
		
		
		
	add mod loader
This commit is contained in:
		
							parent
							
								
									f3ea418cfe
								
							
						
					
					
						commit
						00d76e5f27
					
				| @ -5,8 +5,10 @@ | |||||||
| # Version: 1.0 | # Version: 1.0 | ||||||
| # Author: lax1dude | # 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.Mouse; | ||||||
| ~ import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; | ~ import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; | ||||||
| ~ import net.lax1dude.eaglercraft.v1_8.sp.SingleplayerServerController; | ~ 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, | ~ 		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]))); | ~ 				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(); | ~ 		lanButton.enabled = SingleplayerServerController.isWorldRunning(); | ||||||
| ~ 		if (!hasSentAutoSave) { | ~ 		if (!hasSentAutoSave) { | ||||||
| ~ 			hasSentAutoSave = true; | ~ 			hasSentAutoSave = true; | ||||||
| @ -73,7 +77,14 @@ | |||||||
| 
 | 
 | ||||||
| ~ 				this.mc.shutdownIntegratedServer(new GuiMultiplayer(new GuiMainMenu())); | ~ 				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()) { | ~ 			if (!LANServerController.supported()) { | ||||||
| ~ 				mc.displayGuiScreen(new GuiScreenLANNotSupported(this)); | ~ 				mc.displayGuiScreen(new GuiScreenLANNotSupported(this)); | ||||||
|  | |||||||
| @ -5,7 +5,10 @@ | |||||||
| # Version: 1.0 | # Version: 1.0 | ||||||
| # Author: lax1dude | # Author: lax1dude | ||||||
| 
 | 
 | ||||||
| > DELETE  2  @  2 : 3 | > CHANGE  2 : 4  @  2 : 3 | ||||||
|  | 
 | ||||||
|  | ~ import net.eaglerforge.gui.ModGUI; | ||||||
|  | ~  | ||||||
| 
 | 
 | ||||||
| > DELETE  3  @  3 : 4 | > DELETE  3  @  3 : 4 | ||||||
| 
 | 
 | ||||||
| @ -16,7 +19,7 @@ | |||||||
| > CHANGE  2 : 30  @  2 : 4 | > 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.EagRuntime; | ||||||
| ~ import net.lax1dude.eaglercraft.v1_8.EaglerInputStream; | ~ import net.lax1dude.eaglercraft.v1_8.EaglerInputStream; | ||||||
| ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; | ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; | ||||||
| @ -52,7 +55,9 @@ | |||||||
| 
 | 
 | ||||||
| > DELETE  3  @  3 : 5 | > DELETE  3  @  3 : 5 | ||||||
| 
 | 
 | ||||||
| > DELETE  4  @  4 : 11 | > DELETE  2  @  2 : 3 | ||||||
|  | 
 | ||||||
|  | > DELETE  1  @  1 : 8 | ||||||
| 
 | 
 | ||||||
| > DELETE  2  @  2 : 3 | > DELETE  2  @  2 : 3 | ||||||
| 
 | 
 | ||||||
| @ -214,10 +219,11 @@ | |||||||
| ~ 		if (parGuiButton.id == 4) { | ~ 		if (parGuiButton.id == 4) { | ||||||
| ~ 			this.mc.displayGuiScreen(new GuiScreenEditProfile(this)); | ~ 			this.mc.displayGuiScreen(new GuiScreenEditProfile(this)); | ||||||
| 
 | 
 | ||||||
| > INSERT  1 : 4  @  1 | > INSERT  1 : 5  @  1 | ||||||
| 
 | 
 | ||||||
| + 		if (parGuiButton.id == 69420) { | + 		if (parGuiButton.id == 69420) { | ||||||
| + 			this.mc.displayGuiScreen(new GuiMods(this)); | + 			// this.mc.displayGuiScreen(new WIP_GuiMods(this)); | ||||||
|  | + 			ModGUI.displayGui(); | ||||||
| + 		} | + 		} | ||||||
| 
 | 
 | ||||||
| > CHANGE  1 : 3  @  1 : 3 | > CHANGE  1 : 3  @  1 : 3 | ||||||
|  | |||||||
| @ -7,12 +7,11 @@ | |||||||
| 
 | 
 | ||||||
| > DELETE  2  @  2 : 3 | > DELETE  2  @  2 : 3 | ||||||
| 
 | 
 | ||||||
| > INSERT  1 : 8  @  1 | > INSERT  1 : 7  @  1 | ||||||
| 
 | 
 | ||||||
| +  | +  | ||||||
| + import com.google.common.collect.Lists; | + 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.LANServerController; | ||||||
| + import net.lax1dude.eaglercraft.v1_8.sp.lan.LANServerList; | + import net.lax1dude.eaglercraft.v1_8.sp.lan.LANServerList; | ||||||
| + import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager; | + import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager; | ||||||
|  | |||||||
| @ -5,10 +5,9 @@ | |||||||
| # Version: 1.0 | # Version: 1.0 | ||||||
| # Author: lax1dude | # 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.EaglercraftRandom; | ||||||
| ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; | ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; | ||||||
| ~ import net.lax1dude.eaglercraft.v1_8.HString; | ~ import net.lax1dude.eaglercraft.v1_8.HString; | ||||||
|  | |||||||
| @ -7,11 +7,9 @@ | |||||||
| 
 | 
 | ||||||
| > DELETE  2  @  2 : 5 | > 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.EaglercraftRandom; | ||||||
| ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; | ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; | ||||||
| ~  | ~  | ||||||
|  | |||||||
| @ -7,11 +7,9 @@ | |||||||
| 
 | 
 | ||||||
| > DELETE  2  @  2 : 5 | > 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 net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; | ||||||
| ~  | ~  | ||||||
| ~ import com.google.common.base.Charsets; | ~ import com.google.common.base.Charsets; | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ | |||||||
| ~ eaglercraft.recording.start=reen... | ~ eaglercraft.recording.start=reen... | ||||||
| ~ eaglercraft.soundCategory.voice=Voice | ~ 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.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! | + 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! | + eaglercraft.command.clientStub=This command is client side! | ||||||
| +  | +  | ||||||
| + eaglerforge.menu.mods=Mods | + 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.addmod=Add Mod | ||||||
| + eaglerforge.menu.mods.removemod=Remove Mod | + eaglerforge.menu.mods.removemod=Remove Mod | ||||||
|  | + eaglerforge.menu.mods.info=(Only .js files) | ||||||
| +  | +  | ||||||
| 
 | 
 | ||||||
| > INSERT  163 : 350  @  163 | > INSERT  163 : 350  @  163 | ||||||
|  | |||||||
| @ -4,6 +4,8 @@ import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; | |||||||
| import net.lax1dude.eaglercraft.v1_8.log4j.Logger; | import net.lax1dude.eaglercraft.v1_8.log4j.Logger; | ||||||
| import org.teavm.jso.JSBody; | import org.teavm.jso.JSBody; | ||||||
| 
 | 
 | ||||||
|  | import net.eaglerforge.gui.ModLoader; | ||||||
|  | 
 | ||||||
| public class EaglerForge { | public class EaglerForge { | ||||||
|     public static final Logger log = LogManager.getLogger(); |     public static final Logger log = LogManager.getLogger(); | ||||||
|     @JSBody(params = { "message" }, script = "alert(message)") |     @JSBody(params = { "message" }, script = "alert(message)") | ||||||
| @ -22,5 +24,6 @@ public class EaglerForge { | |||||||
|     public static void init() { |     public static void init() { | ||||||
|         log.info("Starting EaglerForge!"); |         log.info("Starting EaglerForge!"); | ||||||
|         log.info("Loading Mods..."); |         log.info("Loading Mods..."); | ||||||
|  |         ModLoader.loadLoader(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| package net.eaglerforge.api; | package net.eaglerforge.api; | ||||||
| 
 | 
 | ||||||
|  | import net.eaglerforge.gui.ModGUI; | ||||||
| import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; | import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; | ||||||
| import net.lax1dude.eaglercraft.v1_8.log4j.Logger; | import net.lax1dude.eaglercraft.v1_8.log4j.Logger; | ||||||
| import net.minecraft.client.ClientBrandRetriever; | import net.minecraft.client.ClientBrandRetriever; | ||||||
| @ -90,6 +91,7 @@ public class ModAPI { | |||||||
|         getModAPI().setCallbackVoidWithDataArg("drawStringWithShadow", (BaseData params) -> { |         getModAPI().setCallbackVoidWithDataArg("drawStringWithShadow", (BaseData params) -> { | ||||||
|             mc.ingameGUI.getFontRenderer().drawStringWithShadow(params.getString("msg"), params.getFloat("x"), params.getFloat("y"), params.getInt("color")); |             mc.ingameGUI.getFontRenderer().drawStringWithShadow(params.getString("msg"), params.getFloat("x"), params.getFloat("y"), params.getInt("color")); | ||||||
|         }); |         }); | ||||||
|  |         ModGUI.loadFont(); | ||||||
|     } |     } | ||||||
|     static void globalsFunctor(ModAPI modAPI) { |     static void globalsFunctor(ModAPI modAPI) { | ||||||
|         GlobalsListener.provideCallback((String name) -> { |         GlobalsListener.provideCallback((String name) -> { | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								sources/main/java/net/eaglerforge/gui/ModGUI.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								sources/main/java/net/eaglerforge/gui/ModGUI.java
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										27
									
								
								sources/main/java/net/eaglerforge/gui/ModLoader.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								sources/main/java/net/eaglerforge/gui/ModLoader.java
									
									
									
									
									
										Normal file
									
								
							| @ -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(); | ||||||
|  |     }; | ||||||
|  | } | ||||||
							
								
								
									
										235
									
								
								sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java
									
									
									
									
									
										Normal file
									
								
							| @ -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<ResourcePackListEntry> availableResourcePacks; | ||||||
|  | 	private List<ResourcePackListEntry> 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<ResourcePackListEntry> getListContaining(ResourcePackListEntry parResourcePackListEntry) { | ||||||
|  | 		return this.hasResourcePackEntry(parResourcePackListEntry) ? this.selectedResourcePacks | ||||||
|  | 				: this.availableResourcePacks; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/**+ | ||||||
|  | 	 * Returns a list containing the available resource packs | ||||||
|  | 	 */ | ||||||
|  | 	public List<ResourcePackListEntry> getAvailableResourcePacks() { | ||||||
|  | 		return this.availableResourcePacks; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/**+ | ||||||
|  | 	 * Returns a list containing the selected resource packs | ||||||
|  | 	 */ | ||||||
|  | 	public List<ResourcePackListEntry> 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<ResourcePackRepository.Entry>) 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<ResourcePackRepository.Entry>) 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; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -2,7 +2,6 @@ package net.lax1dude.eaglercraft.v1_8; | |||||||
| 
 | 
 | ||||||
| import java.math.BigInteger; | import java.math.BigInteger; | ||||||
| 
 | 
 | ||||||
| import static net.eaglerforge.GuiMods.ModsLoaded; |  | ||||||
| 
 | 
 | ||||||
| public class EaglercraftVersion { | public class EaglercraftVersion { | ||||||
| 	 | 	 | ||||||
| @ -50,7 +49,7 @@ public class EaglercraftVersion { | |||||||
| 	// Miscellaneous variables: | 	// Miscellaneous variables: | ||||||
| 
 | 
 | ||||||
| 	public static final String mainMenuStringA = "Minecraft* 1.8.8"; | 	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 mainMenuStringC = ""; | ||||||
| 	public static final String mainMenuStringD = "Resources Copyright Mojang AB"; | 	public static final String mainMenuStringD = "Resources Copyright Mojang AB"; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ package net.lax1dude.eaglercraft.v1_8.log4j; | |||||||
| import java.text.SimpleDateFormat; | import java.text.SimpleDateFormat; | ||||||
| import java.util.Date; | 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.EagRuntime; | ||||||
| import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; | import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; | ||||||
| 
 | 
 | ||||||
| @ -22,7 +22,7 @@ import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; | |||||||
|  * POSSIBILITY OF SUCH DAMAGE. |  * POSSIBILITY OF SUCH DAMAGE. | ||||||
|  *  |  *  | ||||||
|  */ |  */ | ||||||
| public class Logger extends ModData { | public class Logger /*extends ModData*/ { | ||||||
| 	 | 	 | ||||||
| 	public final String loggerName; | 	public final String loggerName; | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										121
									
								
								sources/setup/workspace_template/javascript/ModAPI.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								sources/setup/workspace_template/javascript/ModAPI.js
									
									
									
									
									
										Normal file
									
								
							| @ -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; | ||||||
|  | } | ||||||
							
								
								
									
										169
									
								
								sources/setup/workspace_template/javascript/ModGUI.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								sources/setup/workspace_template/javascript/ModGUI.js
									
									
									
									
									
										Normal file
									
								
							| @ -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.<br>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(); | ||||||
|  | } | ||||||
							
								
								
									
										131
									
								
								sources/setup/workspace_template/javascript/ModLoader.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								sources/setup/workspace_template/javascript/ModLoader.js
									
									
									
									
									
										Normal file
									
								
							| @ -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..." | ||||||
|  |     ); | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -36,6 +36,433 @@ Compile it yourself here: https://gitlab.com/lax1dude/eaglercraftx-1.8/ | |||||||
| <meta property="og:title" content="EaglercraftX 1.8 Offline" /> | <meta property="og:title" content="EaglercraftX 1.8 Offline" /> | ||||||
| <meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" /> | <meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" /> | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
|  | 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; | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | <script type="text/javascript"> | ||||||
|  | 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..." | ||||||
|  |     ); | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | <script type="text/javascript"> | ||||||
|  | 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.<br>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(); | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | <script type="text/javascript"> | ||||||
| "use strict"; | "use strict"; | ||||||
| const relayId = Math.floor(Math.random() * 3); | const relayId = Math.floor(Math.random() * 3); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,12 +5,15 @@ | |||||||
| 		<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | 		<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||||
| 		<meta name="description" content="EaglercraftX 1.8 test directory HTML page" /> | 		<meta name="description" content="EaglercraftX 1.8 test directory HTML page" /> | ||||||
| 		<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" /> | 		<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" /> | ||||||
| 		<title>EaglercraftX 1.8</title> | 		<title>EaglerForge prerelease</title> | ||||||
| 		<meta property="og:locale" content="en-US" /> | 		<meta property="og:locale" content="en-US" /> | ||||||
| 		<meta property="og:type" content="website" /> | 		<meta property="og:type" content="website" /> | ||||||
| 		<meta property="og:title" content="EaglercraftX 1.8" /> | 		<meta property="og:title" content="EaglercraftX 1.8" /> | ||||||
| 		<meta property="og:description" content="test directory HTML page" /> | 		<meta property="og:description" content="test directory HTML page" /> | ||||||
| 		<link type="image/png" rel="shortcut icon" href="favicon.png" /> | 		<link type="image/png" rel="shortcut icon" href="favicon.png" /> | ||||||
|  | 		<script type="text/javascript" src="ModAPI.js"></script> | ||||||
|  |                 <script type="text/javascript" src="ModLoader.js"></script> | ||||||
|  | 		<script type="text/javascript" src="ModGUI.js"></script> | ||||||
| 		<script type="text/javascript" src="classes.js"></script> | 		<script type="text/javascript" src="classes.js"></script> | ||||||
| 		<script type="text/javascript"> | 		<script type="text/javascript"> | ||||||
| 			"use strict"; | 			"use strict"; | ||||||
|  | |||||||
| @ -576,7 +576,7 @@ public class PlatformInput { | |||||||
| 				lockKeys(); | 				lockKeys(); | ||||||
| 				lockKeys = true; | 				lockKeys = true; | ||||||
| 			} | 			} | ||||||
| 			requestFullscreen(canvas); | 			requestFullscreenonbody(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -599,6 +599,9 @@ public class PlatformInput { | |||||||
| 	@JSBody(params = { "element" }, script = "element.requestFullscreen();") | 	@JSBody(params = { "element" }, script = "element.requestFullscreen();") | ||||||
| 	private	 static native void requestFullscreen(HTMLElement element); | 	private	 static native void requestFullscreen(HTMLElement element); | ||||||
| 
 | 
 | ||||||
|  | 	@JSBody(params = { }, script = "let gamebody = document.getElementById('game_frame');\n" + "gamebody.requestFullscreen();") | ||||||
|  | 	private	 static native void requestFullscreenonbody(); | ||||||
|  | 
 | ||||||
| 	public static void showCursor(EnumCursorType cursor) { | 	public static void showCursor(EnumCursorType cursor) { | ||||||
| 		switch(cursor) { | 		switch(cursor) { | ||||||
| 		case DEFAULT: | 		case DEFAULT: | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user