diff --git a/patches/minecraft/net/minecraft/client/Minecraft.edit.java b/patches/minecraft/net/minecraft/client/Minecraft.edit.java index b3360a0..3c1d03c 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.edit.java +++ b/patches/minecraft/net/minecraft/client/Minecraft.edit.java @@ -22,7 +22,7 @@ > DELETE 1 @ 1 : 4 -> CHANGE 1 : 60 @ 1 : 4 +> CHANGE 1 : 61 @ 1 : 4 ~ ~ import net.eaglerforge.EaglerForge; @@ -38,6 +38,7 @@ ~ ~ import net.lax1dude.eaglercraft.v1_8.Display; ~ import net.lax1dude.eaglercraft.v1_8.EagRuntime; +~ import net.lax1dude.eaglercraft.v1_8.EagUtils; ~ import net.lax1dude.eaglercraft.v1_8.EaglerXBungeeVersion; ~ import net.lax1dude.eaglercraft.v1_8.HString; ~ import net.lax1dude.eaglercraft.v1_8.IOUtils; @@ -450,7 +451,21 @@ ~ Util.func_181617_a((FutureTask) this.scheduledTasks.remove(0), logger); -> DELETE 18 @ 18 : 26 +> CHANGE 7 : 18 @ 7 : 8 + +~ if (this.timer.elapsedTicks > 1) { +~ long watchdog = System.currentTimeMillis(); +~ for (int j = 0; j < this.timer.elapsedTicks; ++j) { +~ this.runTick(); +~ long millis = System.currentTimeMillis(); +~ if (millis - watchdog > 50l) { +~ watchdog = millis; +~ EagUtils.sleep(0l); +~ } +~ } +~ } else if (this.timer.elapsedTicks == 1) { + +> DELETE 10 @ 10 : 18 > CHANGE 1 : 4 @ 1 : 5 @@ -523,9 +538,13 @@ + Mouse.tickCursorShape(); -> INSERT 5 : 6 @ 5 +> INSERT 5 : 10 @ 5 -+ Display.setVSync(this.gameSettings.enableVsync); ++ if (Display.isVSyncSupported()) { ++ Display.setVSync(this.gameSettings.enableVsync); ++ } else { ++ this.gameSettings.enableVsync = false; ++ } > DELETE 34 @ 34 : 52 @@ -788,7 +807,11 @@ ~ GameSettings g = theMinecraft.gameSettings; ~ return g.ambientOcclusion != 0 && !g.shadersAODisable; -> CHANGE 130 : 131 @ 130 : 131 +> CHANGE 2 : 3 @ 2 : 3 + +~ public void middleClickMouse() { + +> CHANGE 127 : 128 @ 127 : 128 ~ return EagRuntime.getVersion(); diff --git a/patches/minecraft/net/minecraft/client/audio/SoundHandler.edit.java b/patches/minecraft/net/minecraft/client/audio/SoundHandler.edit.java index 0ec2942..eca9fb6 100644 --- a/patches/minecraft/net/minecraft/client/audio/SoundHandler.edit.java +++ b/patches/minecraft/net/minecraft/client/audio/SoundHandler.edit.java @@ -30,7 +30,9 @@ > DELETE 7 @ 7 : 11 -> DELETE 3 @ 3 : 18 +> CHANGE 3 : 4 @ 3 : 18 + +~ private static final Logger tipLogger = LogManager.getLogger("EaglercraftX"); > CHANGE 3 : 4 @ 3 : 4 @@ -44,7 +46,14 @@ ~ for (Entry entry : (Set) map.entrySet()) { -> INSERT 14 : 24 @ 14 +> INSERT 12 : 16 @ 12 + ++ if (this.sndRegistry.getObject(new ResourceLocation("minecraft:sounds/music/game/calm1.ogg")) == null) { ++ tipLogger.info( ++ "Download this resource pack if you want music: https://bafybeiayojww5jfyzvlmtuk7l5ufkt7nlfto7mhwmzf2vs4bvsjd5ouiuq.ipfs.nftstorage.link/?filename=Music_For_Eaglercraft.zip"); ++ } + +> INSERT 2 : 12 @ 2 + public static class SoundMap { + diff --git a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java index 9acb53d..57d89cc 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java @@ -329,7 +329,7 @@ > CHANGE 1 : 3 @ 1 : 2 ~ this.drawString(this.fontRendererObj, s, 2, this.height - 20, -1); -~ s = EaglercraftVersion.mainMenuStringB; +~ s = EaglercraftVersion.getMainMenuStringB(); > CHANGE 1 : 3 @ 1 : 2 diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java b/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java index 1dfb3d3..c59f9a2 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java @@ -7,11 +7,12 @@ > DELETE 2 @ 2 : 3 -> INSERT 1 : 9 @ 1 +> INSERT 1 : 10 @ 1 + + import com.google.common.collect.Maps; + ++ import net.lax1dude.eaglercraft.v1_8.EagRuntime; + import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; + import net.lax1dude.eaglercraft.v1_8.opengl.OpenGlHelper; + import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer; @@ -32,12 +33,16 @@ + private RenderPlayer eaglerRenderer; -> CHANGE 82 : 88 @ 82 : 83 +> CHANGE 82 : 92 @ 82 : 83 ~ this.skinMap.put("slim", new RenderPlayer(this, true, false)); ~ this.skinMap.put("zombie", new RenderPlayer(this, false, true)); -~ this.eaglerRenderer = new RenderHighPoly(this, this.playerRenderer.getMainModel(), -~ this.playerRenderer.shadowSize); +~ if (EagRuntime.getConfiguration().isAllowFNAWSkins()) { +~ this.eaglerRenderer = new RenderHighPoly(this, this.playerRenderer.getMainModel(), +~ this.playerRenderer.shadowSize); +~ } else { +~ this.eaglerRenderer = this.playerRenderer; +~ } ~ this.skinMap.put("eagler", ~ Minecraft.getMinecraft().gameSettings.enableFNAWSkins ? this.eaglerRenderer : this.playerRenderer); diff --git a/patches/minecraft/net/minecraft/entity/ai/EntityAIBase.edit.java b/patches/minecraft/net/minecraft/entity/ai/EntityAIBase.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/ai/EntityAIBase.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/ai/EntityJumpHelper.edit.java b/patches/minecraft/net/minecraft/entity/ai/EntityJumpHelper.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/ai/EntityJumpHelper.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/ai/EntityLookHelper.edit.java b/patches/minecraft/net/minecraft/entity/ai/EntityLookHelper.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/ai/EntityLookHelper.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/ai/EntityMoveHelper.edit.java b/patches/minecraft/net/minecraft/entity/ai/EntityMoveHelper.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/ai/EntityMoveHelper.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/ai/EntitySenses.edit.java b/patches/minecraft/net/minecraft/entity/ai/EntitySenses.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/ai/EntitySenses.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityEnderCrystal.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityEnderCrystal.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/item/EntityEnderCrystal.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityEnderPearl.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityEnderPearl.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/item/EntityEnderPearl.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityFireworkRocket.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityFireworkRocket.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/item/EntityFireworkRocket.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/pathfinding/PathPoint.edit.java b/patches/minecraft/net/minecraft/pathfinding/PathPoint.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/pathfinding/PathPoint.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/server/management/ItemInWorldManager.edit.java b/patches/minecraft/net/minecraft/server/management/ItemInWorldManager.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/server/management/ItemInWorldManager.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/server/management/ServerConfigurationManager.edit.java b/patches/minecraft/net/minecraft/server/management/ServerConfigurationManager.edit.java index 99168d7..412e71c 100644 --- a/patches/minecraft/net/minecraft/server/management/ServerConfigurationManager.edit.java +++ b/patches/minecraft/net/minecraft/server/management/ServerConfigurationManager.edit.java @@ -53,9 +53,11 @@ > DELETE 1 @ 1 : 5 -> DELETE 2 @ 2 : 4 +> CHANGE 2 : 3 @ 2 : 5 -> CHANGE 3 : 5 @ 3 : 9 +~ this.maxPlayers = 100; + +> CHANGE 2 : 4 @ 2 : 8 ~ public void initializeConnectionToPlayer(IntegratedServerPlayerNetworkManager netManager, EntityPlayerMP playerIn) { ~ GameProfile gameprofile1 = playerIn.getGameProfile(); @@ -131,14 +133,12 @@ + } + -> CHANGE 4 : 11 @ 4 : 11 +> CHANGE 4 : 9 @ 4 : 11 ~ public String allowUserToConnect(GameProfile gameprofile) { -~ return this.playerEntityList.size() >= this.maxPlayers && !this.func_183023_f(gameprofile) -~ ? "The server is full!" -~ : (doesPlayerAlreadyExist(gameprofile) -~ ? "\"" + gameprofile.getName() + "\" is already playing on this world!" -~ : null); +~ return doesPlayerAlreadyExist(gameprofile) +~ ? "\"" + gameprofile.getName() + "\" is already playing on this world!" +~ : null; ~ } > CHANGE 1 : 7 @ 1 : 9 @@ -225,7 +225,7 @@ ~ worldIn.theItemInWorldManager.initializeGameType(parWorld.getWorldInfo().getGameType()); ~ } else { -~ parEntityPlayerMP2.theItemInWorldManager.setGameType(lanGamemode); +~ worldIn.theItemInWorldManager.setGameType(lanGamemode); ~ } > CHANGE 7 : 8 @ 7 : 8 diff --git a/patches/minecraft/net/minecraft/village/VillageDoorInfo.edit.java b/patches/minecraft/net/minecraft/village/VillageDoorInfo.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/village/VillageDoorInfo.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/world/WorldType.edit.java b/patches/minecraft/net/minecraft/world/WorldType.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/WorldType.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/world/demo/DemoWorldManager.edit.java b/patches/minecraft/net/minecraft/world/demo/DemoWorldManager.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/demo/DemoWorldManager.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderDebug.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderDebug.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderDebug.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/world/gen/layer/IntCache.edit.java b/patches/minecraft/net/minecraft/world/gen/layer/IntCache.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/gen/layer/IntCache.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/world/gen/structure/MapGenStructureData.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/MapGenStructureData.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/gen/structure/MapGenStructureData.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/world/gen/structure/StructureBoundingBox.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/StructureBoundingBox.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/gen/structure/StructureBoundingBox.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/patches/minecraft/net/minecraft/world/pathfinder/NodeProcessor.edit.java b/patches/minecraft/net/minecraft/world/pathfinder/NodeProcessor.edit.java new file mode 100644 index 0000000..7572609 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/pathfinder/NodeProcessor.edit.java @@ -0,0 +1,8 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> EOF diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java index ceda34c..8926416 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java @@ -64,8 +64,12 @@ public class PlatformApplication { String str = glfwGetClipboardString(win); return str == null ? "" : str; } - + public static void setLocalStorage(String name, byte[] data) { + setLocalStorage(name, data, true); + } + + public static void setLocalStorage(String name, byte[] data, boolean hooks) { if(data == null) { (new File("_eagstorage."+name+".dat")).delete(); }else { @@ -76,8 +80,12 @@ public class PlatformApplication { } } } - + public static byte[] getLocalStorage(String data) { + return getLocalStorage(data, true); + } + + public static byte[] getLocalStorage(String data, boolean hooks) { File f = new File("_eagstorage."+data+".dat"); if(!f.isFile()) { return null; diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java index d15647e..d864871 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java @@ -230,6 +230,10 @@ public class PlatformInput { glfwSwapBuffers(win); } + public static boolean isVSyncSupported() { + return true; + } + public static boolean wasResized() { boolean b = windowResized; windowResized = false; diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java index 3ce88b5..1380861 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java @@ -8,6 +8,7 @@ import org.json.JSONObject; import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; import net.lax1dude.eaglercraft.v1_8.EaglercraftVersion; import net.lax1dude.eaglercraft.v1_8.internal.IClientConfigAdapter; +import net.lax1dude.eaglercraft.v1_8.internal.IClientConfigAdapterHooks; import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayEntry; /** @@ -31,6 +32,8 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter { public final List defaultServers = new ArrayList(); + private final DesktopClientConfigAdapterHooks hooks = new DesktopClientConfigAdapterHooks(); + @Override public String getDefaultLocale() { return "en_US"; @@ -129,4 +132,32 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter { return false; } + @Override + public boolean isAllowFNAWSkins() { + return true; + } + + @Override + public String getLocalStorageNamespace() { + return EaglercraftVersion.localStorageNamespace; + } + + @Override + public IClientConfigAdapterHooks getHooks() { + return hooks; + } + + private static class DesktopClientConfigAdapterHooks implements IClientConfigAdapterHooks { + + @Override + public void callLocalStorageSavedHook(String key, String base64) { + + } + + @Override + public String callLocalStorageLoadHook(String key) { + return null; + } + + } } diff --git a/sources/main/java/net/eaglerforge/EaglerForge.java b/sources/main/java/net/eaglerforge/EaglerForge.java index 3e39465..1f630ab 100644 --- a/sources/main/java/net/eaglerforge/EaglerForge.java +++ b/sources/main/java/net/eaglerforge/EaglerForge.java @@ -4,6 +4,11 @@ import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; import net.minecraft.client.Minecraft; import org.teavm.jso.JSBody; +import org.teavm.jso.browser.Window; +import org.teavm.jso.dom.html.HTMLBodyElement; +import org.teavm.jso.dom.html.HTMLElement; +import org.teavm.jso.dom.html.HTMLImageElement; + import static net.minecraft.client.Minecraft.mojangLogo; @@ -20,19 +25,36 @@ public class EaglerForge { public static native void jsprompt(String message); @JSBody(params = { "message", "default_text" }, script = "prompt(message, default_text)") public static native void jspromptdt(String message, String default_text); - - @JSBody(script = "displayanvil()") - public static native void displayanvil(); - - @JSBody(script = "var img = document.getElementById('anvil');\n" + - "if (img) img.remove();") - public static native void removeanvil(); - - + + public static void displayanvil() { + HTMLImageElement img = (HTMLImageElement) Window.current().getDocument().createElement("img"); + img.setAttribute("id", "anvil"); + img.setSrc(src); + img.setAttribute("draggable", "false"); + img.getStyle().setProperty("position", "fixed"); + img.getStyle().setProperty("bottom", "0"); + img.getStyle().setProperty("right", "0"); + img.getStyle().setProperty("width", "200px"); + img.getStyle().setProperty("height", "auto"); + + HTMLBodyElement body = (HTMLBodyElement) Window.current().getDocument().getBody(); + body.appendChild(img); + } + + public static void removeanvil() { + HTMLElement element = Window.current().getDocument().getElementById("anvil"); + + if (element != null) { + element.getParentNode().removeChild(element); + } + } public static void init() { log.info("Starting EaglerForge!"); displayanvil(); log.info("Loading Mods..."); } -} + + public static String src = "data:image/gif;base64,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"; + +} \ No newline at end of file diff --git a/sources/main/java/net/eaglerforge/api/BaseData.java b/sources/main/java/net/eaglerforge/api/BaseData.java index 5aa041b..0ad427b 100644 --- a/sources/main/java/net/eaglerforge/api/BaseData.java +++ b/sources/main/java/net/eaglerforge/api/BaseData.java @@ -5,6 +5,17 @@ import org.teavm.jso.JSObject; import org.teavm.jso.JSFunctor; public abstract class BaseData implements JSObject { + @JSFunctor + public interface ClassFinderCallback extends JSObject { + BaseData onCallback(String classIdentifier); + } + + @JSBody(params = { "key", "value" }, script = "this[key]=value;") + public native void setCallbackClassFinder(String key, ClassFinderCallback value); + + + + @JSFunctor public interface VoidCallback extends JSObject { void onCallback(); @@ -20,6 +31,16 @@ public abstract class BaseData implements JSObject { JSObject onCallback(); } + @JSFunctor + public interface ReflectiveObjectCallback extends JSObject { + Object onCallback(); + } + + @JSFunctor + public interface DataReflectiveObjectCallback extends JSObject { + Object onCallback(BaseData data); + } + @JSFunctor public interface FloatCallback extends JSObject { float onCallback(); @@ -138,6 +159,9 @@ public abstract class BaseData implements JSObject { @JSBody(params = { "key", "value" }, script = "this[key]=value;") public native void set(String key, String value); + @JSBody(params = { "key", "value" }, script = "this[key]=value;") + public native void set(String key, Object value); + @JSBody(params = { "key", "value" }, script = "this[key]=value;") public native void set(String key, int value); @@ -162,6 +186,9 @@ public abstract class BaseData implements JSObject { @JSBody(params = { "key", "value" }, script = "this[key]=value;") public native void set(String key, BaseData value); + @JSBody(params = { "key", "value" }, script = "this[key]=value;") + public native void setReflective(String key, Object value); + @JSBody(params = { "key", "value" }, script = "this[key]=value;") public native void set(String key, String[] value); @@ -216,6 +243,12 @@ public abstract class BaseData implements JSObject { @JSBody(params = { "key", "value" }, script = "this[key]=value;") public native void setCallbackFloat(String key, FloatCallback value); + @JSBody(params = { "key", "value" }, script = "this[key]=value;") + public native void setCallbackReflective(String key, ReflectiveObjectCallback value); + + @JSBody(params = { "key", "value" }, script = "this[key]=value;") + public native void setCallbackReflectiveWithDataArg(String key, DataReflectiveObjectCallback value); + @JSBody(params = { "key", "value" }, script = "this[key]=value;") public native void setCallbackObject(String key, ObjectCallback value); @@ -300,6 +333,9 @@ public abstract class BaseData implements JSObject { @JSBody(params = { "key" }, script = "return this[key];") public native JSObject getObject(String key); + @JSBody(params = { "key" }, script = "return this[key];") + public native Object getReflective(String key); + @JSBody(params = { "key" }, script = "return this[key];") public native BaseData getBaseData(String key); @@ -357,4 +393,4 @@ public abstract class BaseData implements JSObject { @JSBody(params = { }, script = "if(this.getRef){ return this.getRef(); } else { return null; }") public native BaseData getRef(); -} \ No newline at end of file +} diff --git a/sources/main/java/net/eaglerforge/api/ModAPI.java b/sources/main/java/net/eaglerforge/api/ModAPI.java index b50299a..774ff43 100644 --- a/sources/main/java/net/eaglerforge/api/ModAPI.java +++ b/sources/main/java/net/eaglerforge/api/ModAPI.java @@ -1,6 +1,7 @@ package net.eaglerforge.api; import net.eaglerforge.gui.ModGUI; +import net.eaglerforge.reflect.PLReflect; import net.lax1dude.eaglercraft.v1_8.EagRuntime; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; @@ -310,6 +311,7 @@ public class ModAPI { setGlobal("mcinstance", mc); setMinecraftContext(mc); setGlobal("platform", PlatformAPI.makeModData()); + setGlobal("reflect", PLReflect.makeModData()); setGlobal("logger", LoggerAPI.makeModData()); //setGlobal("emptygui", EmptyGui.makeModData()); setGlobal("ScaledResolution", ScaledResolution.makeModData()); diff --git a/sources/main/java/net/eaglerforge/api/ModData.java b/sources/main/java/net/eaglerforge/api/ModData.java index fc7ea07..e2a560c 100644 --- a/sources/main/java/net/eaglerforge/api/ModData.java +++ b/sources/main/java/net/eaglerforge/api/ModData.java @@ -1,4 +1,4 @@ package net.eaglerforge.api; -public class ModData extends BaseData{ +public class ModData extends BaseData { } diff --git a/sources/main/java/net/eaglerforge/reflect/PLReflect.java b/sources/main/java/net/eaglerforge/reflect/PLReflect.java new file mode 100644 index 0000000..d056290 --- /dev/null +++ b/sources/main/java/net/eaglerforge/reflect/PLReflect.java @@ -0,0 +1,2483 @@ +package net.eaglerforge.reflect; + +import net.minecraft.world.storage.ISaveFormat; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.util.FrameTimer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.audio.SoundHandler; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.resources.LanguageManager; +import net.minecraft.client.resources.ResourcePackRepository; +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.util.Session; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.world.WorldSettings; +import net.minecraft.client.audio.MusicTicker; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.crash.CrashReport; +import net.minecraft.client.main.GameConfiguration; +import net.minecraft.util.IChatComponent; +import net.minecraft.entity.item.EntityItemFrame; +import net.minecraft.nbt.NBTBase; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.item.EnumRarity; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.item.EnumAction; +import net.minecraft.entity.Entity; +import net.minecraft.util.BlockPos; +import net.minecraft.entity.EntityLivingBase; +import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraft.nbt.NBTTagCompound; +import net.eaglerforge.api.ModData; +import net.minecraft.item.ItemStack; +import net.eaglerforge.api.BaseData; +import net.minecraft.item.Item; +import net.minecraft.block.Block; +import java.lang.String; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.eaglerforge.EaglerForge; + +import net.eaglerforge.api.*; +import java.util.ArrayList; +import java.lang.Exception; +import org.teavm.jso.JSBody; +import org.teavm.jso.JSObject; +import org.teavm.jso.JSFunctor; + +//AUTOGENERATED BY NOREFLECT +//Made by ZXMushroom63 + +public class PLReflect extends ModData { + public static PLReflect makeModData() { + PLReflect plReflectGlobal = new PLReflect(); + ArrayList reflectProfiles = new ArrayList(); + + // CLASSDEF FOR ItemStack + BaseData reflect_ItemStack = new ModData(); + + ArrayList reflect_ItemStack_constructors = new ArrayList(); + + BaseData reflect_ItemStack_constructor_ItemStack_0 = new ModData(); + reflect_ItemStack_constructor_ItemStack_0.set("returnType", "ItemStack"); + reflect_ItemStack_constructor_ItemStack_0.set("argnames", new String[] { "blockIn" }); + reflect_ItemStack_constructor_ItemStack_0.set("argtypes", new String[] { "Block" }); + reflect_ItemStack_constructor_ItemStack_0.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + return new ItemStack((Block) params.getReflective("blockIn")); + }); + + reflect_ItemStack_constructors.add(reflect_ItemStack_constructor_ItemStack_0); + + BaseData reflect_ItemStack_constructor_ItemStack_1 = new ModData(); + reflect_ItemStack_constructor_ItemStack_1.set("returnType", "ItemStack"); + reflect_ItemStack_constructor_ItemStack_1.set("argnames", new String[] { "blockIn", "amount" }); + reflect_ItemStack_constructor_ItemStack_1.set("argtypes", new String[] { "Block", "int" }); + reflect_ItemStack_constructor_ItemStack_1.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + return new ItemStack((Block) params.getReflective("blockIn"), (int) params.getInt("amount")); + }); + + reflect_ItemStack_constructors.add(reflect_ItemStack_constructor_ItemStack_1); + + BaseData reflect_ItemStack_constructor_ItemStack_2 = new ModData(); + reflect_ItemStack_constructor_ItemStack_2.set("returnType", "ItemStack"); + reflect_ItemStack_constructor_ItemStack_2.set("argnames", new String[] { "blockIn", "amount", "meta" }); + reflect_ItemStack_constructor_ItemStack_2.set("argtypes", new String[] { "Block", "int", "int" }); + reflect_ItemStack_constructor_ItemStack_2.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + return new ItemStack((Block) params.getReflective("blockIn"), (int) params.getInt("amount"), + (int) params.getInt("meta")); + }); + + reflect_ItemStack_constructors.add(reflect_ItemStack_constructor_ItemStack_2); + + BaseData reflect_ItemStack_constructor_ItemStack_3 = new ModData(); + reflect_ItemStack_constructor_ItemStack_3.set("returnType", "ItemStack"); + reflect_ItemStack_constructor_ItemStack_3.set("argnames", new String[] { "itemIn" }); + reflect_ItemStack_constructor_ItemStack_3.set("argtypes", new String[] { "Item" }); + reflect_ItemStack_constructor_ItemStack_3.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + return new ItemStack((Item) params.getReflective("itemIn")); + }); + + reflect_ItemStack_constructors.add(reflect_ItemStack_constructor_ItemStack_3); + + BaseData reflect_ItemStack_constructor_ItemStack_4 = new ModData(); + reflect_ItemStack_constructor_ItemStack_4.set("returnType", "ItemStack"); + reflect_ItemStack_constructor_ItemStack_4.set("argnames", new String[] { "itemIn", "amount" }); + reflect_ItemStack_constructor_ItemStack_4.set("argtypes", new String[] { "Item", "int" }); + reflect_ItemStack_constructor_ItemStack_4.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + return new ItemStack((Item) params.getReflective("itemIn"), (int) params.getInt("amount")); + }); + + reflect_ItemStack_constructors.add(reflect_ItemStack_constructor_ItemStack_4); + + BaseData reflect_ItemStack_constructor_ItemStack_5 = new ModData(); + reflect_ItemStack_constructor_ItemStack_5.set("returnType", "ItemStack"); + reflect_ItemStack_constructor_ItemStack_5.set("argnames", new String[] { "itemIn", "amount", "meta" }); + reflect_ItemStack_constructor_ItemStack_5.set("argtypes", new String[] { "Item", "int", "int" }); + reflect_ItemStack_constructor_ItemStack_5.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + return new ItemStack((Item) params.getReflective("itemIn"), (int) params.getInt("amount"), + (int) params.getInt("meta")); + }); + + reflect_ItemStack_constructors.add(reflect_ItemStack_constructor_ItemStack_5); + + BaseData[] reflect_ItemStack_constructors_arr = new BaseData[reflect_ItemStack_constructors.size()]; + for (int i = 0; i < reflect_ItemStack_constructors_arr.length; i++) { + reflect_ItemStack_constructors_arr[i] = reflect_ItemStack_constructors.get(i); + } + + ArrayList reflect_ItemStack_methods = new ArrayList(); + + BaseData reflect_ItemStack_method_loadModData_0 = new ModData(); + reflect_ItemStack_method_loadModData_0.set("methodName", "loadModData"); + reflect_ItemStack_method_loadModData_0.set("returnType", "ItemStack"); + reflect_ItemStack_method_loadModData_0.set("static", false); + reflect_ItemStack_method_loadModData_0.set("argnames", new String[] { "data" }); + reflect_ItemStack_method_loadModData_0.set("argtypes", new String[] { "BaseData" }); + reflect_ItemStack_method_loadModData_0.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).loadModData((BaseData) params.getReflective("data")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_loadModData_0); + + BaseData reflect_ItemStack_method_fromModData_1 = new ModData(); + reflect_ItemStack_method_fromModData_1.set("methodName", "fromModData"); + reflect_ItemStack_method_fromModData_1.set("returnType", "ItemStack"); + reflect_ItemStack_method_fromModData_1.set("static", true); + reflect_ItemStack_method_fromModData_1.set("argnames", new String[] { "data" }); + reflect_ItemStack_method_fromModData_1.set("argtypes", new String[] { "BaseData" }); + reflect_ItemStack_method_fromModData_1.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ItemStack.fromModData((BaseData) params.getReflective("data")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_fromModData_1); + + BaseData reflect_ItemStack_method_makeModData_2 = new ModData(); + reflect_ItemStack_method_makeModData_2.set("methodName", "makeModData"); + reflect_ItemStack_method_makeModData_2.set("returnType", "ItemStack"); + reflect_ItemStack_method_makeModData_2.set("static", false); + reflect_ItemStack_method_makeModData_2.set("argnames", new String[] {}); + reflect_ItemStack_method_makeModData_2.set("argtypes", new String[] {}); + reflect_ItemStack_method_makeModData_2.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ModData) ((ItemStack) params.getReflective("_self")).makeModData(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_makeModData_2); + + BaseData reflect_ItemStack_method_loadItemStackFromNBT_3 = new ModData(); + reflect_ItemStack_method_loadItemStackFromNBT_3.set("methodName", "loadItemStackFromNBT"); + reflect_ItemStack_method_loadItemStackFromNBT_3.set("returnType", "ItemStack"); + reflect_ItemStack_method_loadItemStackFromNBT_3.set("static", true); + reflect_ItemStack_method_loadItemStackFromNBT_3.set("argnames", new String[] { "nbt" }); + reflect_ItemStack_method_loadItemStackFromNBT_3.set("argtypes", new String[] { "NBTTagCompound" }); + reflect_ItemStack_method_loadItemStackFromNBT_3.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ItemStack.loadItemStackFromNBT((NBTTagCompound) params.getReflective("nbt")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_loadItemStackFromNBT_3); + + BaseData reflect_ItemStack_method_splitStack_4 = new ModData(); + reflect_ItemStack_method_splitStack_4.set("methodName", "splitStack"); + reflect_ItemStack_method_splitStack_4.set("returnType", "ItemStack"); + reflect_ItemStack_method_splitStack_4.set("static", false); + reflect_ItemStack_method_splitStack_4.set("argnames", new String[] { "amount" }); + reflect_ItemStack_method_splitStack_4.set("argtypes", new String[] { "int" }); + reflect_ItemStack_method_splitStack_4.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ((ItemStack) params.getReflective("_self")) + .splitStack((int) params.getInt("amount")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_splitStack_4); + + BaseData reflect_ItemStack_method_getItem_5 = new ModData(); + reflect_ItemStack_method_getItem_5.set("methodName", "getItem"); + reflect_ItemStack_method_getItem_5.set("returnType", "ItemStack"); + reflect_ItemStack_method_getItem_5.set("static", false); + reflect_ItemStack_method_getItem_5.set("argnames", new String[] {}); + reflect_ItemStack_method_getItem_5.set("argtypes", new String[] {}); + reflect_ItemStack_method_getItem_5.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (Item) ((ItemStack) params.getReflective("_self")).getItem(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getItem_5); + + BaseData reflect_ItemStack_method_getStrVsBlock_6 = new ModData(); + reflect_ItemStack_method_getStrVsBlock_6.set("methodName", "getStrVsBlock"); + reflect_ItemStack_method_getStrVsBlock_6.set("returnType", "ItemStack"); + reflect_ItemStack_method_getStrVsBlock_6.set("static", false); + reflect_ItemStack_method_getStrVsBlock_6.set("argnames", new String[] { "blockIn" }); + reflect_ItemStack_method_getStrVsBlock_6.set("argtypes", new String[] { "Block" }); + reflect_ItemStack_method_getStrVsBlock_6.setCallbackFloatWithDataArg("exec", (BaseData params) -> { + try { + return (float) ((ItemStack) params.getReflective("_self")) + .getStrVsBlock((Block) params.getReflective("blockIn")); + } catch (Exception _exception_reflect_) { + return 0.0f; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getStrVsBlock_6); + + BaseData reflect_ItemStack_method_useItemRightClick_7 = new ModData(); + reflect_ItemStack_method_useItemRightClick_7.set("methodName", "useItemRightClick"); + reflect_ItemStack_method_useItemRightClick_7.set("returnType", "ItemStack"); + reflect_ItemStack_method_useItemRightClick_7.set("static", false); + reflect_ItemStack_method_useItemRightClick_7.set("argnames", new String[] { "worldIn", "playerIn" }); + reflect_ItemStack_method_useItemRightClick_7.set("argtypes", new String[] { "World", "EntityPlayer" }); + reflect_ItemStack_method_useItemRightClick_7.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ((ItemStack) params.getReflective("_self")).useItemRightClick( + (World) params.getReflective("worldIn"), (EntityPlayer) params.getReflective("playerIn")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_useItemRightClick_7); + + BaseData reflect_ItemStack_method_onItemUseFinish_8 = new ModData(); + reflect_ItemStack_method_onItemUseFinish_8.set("methodName", "onItemUseFinish"); + reflect_ItemStack_method_onItemUseFinish_8.set("returnType", "ItemStack"); + reflect_ItemStack_method_onItemUseFinish_8.set("static", false); + reflect_ItemStack_method_onItemUseFinish_8.set("argnames", new String[] { "worldIn", "playerIn" }); + reflect_ItemStack_method_onItemUseFinish_8.set("argtypes", new String[] { "World", "EntityPlayer" }); + reflect_ItemStack_method_onItemUseFinish_8.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ((ItemStack) params.getReflective("_self")).onItemUseFinish( + (World) params.getReflective("worldIn"), (EntityPlayer) params.getReflective("playerIn")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_onItemUseFinish_8); + + BaseData reflect_ItemStack_method_writeToNBT_9 = new ModData(); + reflect_ItemStack_method_writeToNBT_9.set("methodName", "writeToNBT"); + reflect_ItemStack_method_writeToNBT_9.set("returnType", "ItemStack"); + reflect_ItemStack_method_writeToNBT_9.set("static", false); + reflect_ItemStack_method_writeToNBT_9.set("argnames", new String[] { "nbt" }); + reflect_ItemStack_method_writeToNBT_9.set("argtypes", new String[] { "NBTTagCompound" }); + reflect_ItemStack_method_writeToNBT_9.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (NBTTagCompound) ((ItemStack) params.getReflective("_self")) + .writeToNBT((NBTTagCompound) params.getReflective("nbt")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_writeToNBT_9); + + BaseData reflect_ItemStack_method_toNBT_10 = new ModData(); + reflect_ItemStack_method_toNBT_10.set("methodName", "toNBT"); + reflect_ItemStack_method_toNBT_10.set("returnType", "ItemStack"); + reflect_ItemStack_method_toNBT_10.set("static", false); + reflect_ItemStack_method_toNBT_10.set("argnames", new String[] {}); + reflect_ItemStack_method_toNBT_10.set("argtypes", new String[] {}); + reflect_ItemStack_method_toNBT_10.setCallbackStringWithDataArg("exec", (BaseData params) -> { + try { + return (String) ((ItemStack) params.getReflective("_self")).toNBT(); + } catch (Exception _exception_reflect_) { + return ""; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_toNBT_10); + + BaseData reflect_ItemStack_method_fromNBT_11 = new ModData(); + reflect_ItemStack_method_fromNBT_11.set("methodName", "fromNBT"); + reflect_ItemStack_method_fromNBT_11.set("returnType", "ItemStack"); + reflect_ItemStack_method_fromNBT_11.set("static", false); + reflect_ItemStack_method_fromNBT_11.set("argnames", new String[] { "nbt" }); + reflect_ItemStack_method_fromNBT_11.set("argtypes", new String[] { "String" }); + reflect_ItemStack_method_fromNBT_11.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).fromNBT((String) params.getString("nbt")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_fromNBT_11); + + BaseData reflect_ItemStack_method_readFromNBT_12 = new ModData(); + reflect_ItemStack_method_readFromNBT_12.set("methodName", "readFromNBT"); + reflect_ItemStack_method_readFromNBT_12.set("returnType", "ItemStack"); + reflect_ItemStack_method_readFromNBT_12.set("static", false); + reflect_ItemStack_method_readFromNBT_12.set("argnames", new String[] { "nbt" }); + reflect_ItemStack_method_readFromNBT_12.set("argtypes", new String[] { "NBTTagCompound" }); + reflect_ItemStack_method_readFromNBT_12.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).readFromNBT((NBTTagCompound) params.getReflective("nbt")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_readFromNBT_12); + + BaseData reflect_ItemStack_method_getMaxStackSize_13 = new ModData(); + reflect_ItemStack_method_getMaxStackSize_13.set("methodName", "getMaxStackSize"); + reflect_ItemStack_method_getMaxStackSize_13.set("returnType", "ItemStack"); + reflect_ItemStack_method_getMaxStackSize_13.set("static", false); + reflect_ItemStack_method_getMaxStackSize_13.set("argnames", new String[] {}); + reflect_ItemStack_method_getMaxStackSize_13.set("argtypes", new String[] {}); + reflect_ItemStack_method_getMaxStackSize_13.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) ((ItemStack) params.getReflective("_self")).getMaxStackSize(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getMaxStackSize_13); + + BaseData reflect_ItemStack_method_isStackable_14 = new ModData(); + reflect_ItemStack_method_isStackable_14.set("methodName", "isStackable"); + reflect_ItemStack_method_isStackable_14.set("returnType", "ItemStack"); + reflect_ItemStack_method_isStackable_14.set("static", false); + reflect_ItemStack_method_isStackable_14.set("argnames", new String[] {}); + reflect_ItemStack_method_isStackable_14.set("argtypes", new String[] {}); + reflect_ItemStack_method_isStackable_14.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).isStackable(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_isStackable_14); + + BaseData reflect_ItemStack_method_isItemStackDamageable_15 = new ModData(); + reflect_ItemStack_method_isItemStackDamageable_15.set("methodName", "isItemStackDamageable"); + reflect_ItemStack_method_isItemStackDamageable_15.set("returnType", "ItemStack"); + reflect_ItemStack_method_isItemStackDamageable_15.set("static", false); + reflect_ItemStack_method_isItemStackDamageable_15.set("argnames", new String[] {}); + reflect_ItemStack_method_isItemStackDamageable_15.set("argtypes", new String[] {}); + reflect_ItemStack_method_isItemStackDamageable_15.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).isItemStackDamageable(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_isItemStackDamageable_15); + + BaseData reflect_ItemStack_method_getHasSubtypes_16 = new ModData(); + reflect_ItemStack_method_getHasSubtypes_16.set("methodName", "getHasSubtypes"); + reflect_ItemStack_method_getHasSubtypes_16.set("returnType", "ItemStack"); + reflect_ItemStack_method_getHasSubtypes_16.set("static", false); + reflect_ItemStack_method_getHasSubtypes_16.set("argnames", new String[] {}); + reflect_ItemStack_method_getHasSubtypes_16.set("argtypes", new String[] {}); + reflect_ItemStack_method_getHasSubtypes_16.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).getHasSubtypes(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getHasSubtypes_16); + + BaseData reflect_ItemStack_method_isItemDamaged_17 = new ModData(); + reflect_ItemStack_method_isItemDamaged_17.set("methodName", "isItemDamaged"); + reflect_ItemStack_method_isItemDamaged_17.set("returnType", "ItemStack"); + reflect_ItemStack_method_isItemDamaged_17.set("static", false); + reflect_ItemStack_method_isItemDamaged_17.set("argnames", new String[] {}); + reflect_ItemStack_method_isItemDamaged_17.set("argtypes", new String[] {}); + reflect_ItemStack_method_isItemDamaged_17.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).isItemDamaged(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_isItemDamaged_17); + + BaseData reflect_ItemStack_method_getItemDamage_18 = new ModData(); + reflect_ItemStack_method_getItemDamage_18.set("methodName", "getItemDamage"); + reflect_ItemStack_method_getItemDamage_18.set("returnType", "ItemStack"); + reflect_ItemStack_method_getItemDamage_18.set("static", false); + reflect_ItemStack_method_getItemDamage_18.set("argnames", new String[] {}); + reflect_ItemStack_method_getItemDamage_18.set("argtypes", new String[] {}); + reflect_ItemStack_method_getItemDamage_18.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) ((ItemStack) params.getReflective("_self")).getItemDamage(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getItemDamage_18); + + BaseData reflect_ItemStack_method_getMetadata_19 = new ModData(); + reflect_ItemStack_method_getMetadata_19.set("methodName", "getMetadata"); + reflect_ItemStack_method_getMetadata_19.set("returnType", "ItemStack"); + reflect_ItemStack_method_getMetadata_19.set("static", false); + reflect_ItemStack_method_getMetadata_19.set("argnames", new String[] {}); + reflect_ItemStack_method_getMetadata_19.set("argtypes", new String[] {}); + reflect_ItemStack_method_getMetadata_19.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) ((ItemStack) params.getReflective("_self")).getMetadata(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getMetadata_19); + + BaseData reflect_ItemStack_method_setItemDamage_20 = new ModData(); + reflect_ItemStack_method_setItemDamage_20.set("methodName", "setItemDamage"); + reflect_ItemStack_method_setItemDamage_20.set("returnType", "ItemStack"); + reflect_ItemStack_method_setItemDamage_20.set("static", false); + reflect_ItemStack_method_setItemDamage_20.set("argnames", new String[] { "meta" }); + reflect_ItemStack_method_setItemDamage_20.set("argtypes", new String[] { "int" }); + reflect_ItemStack_method_setItemDamage_20.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).setItemDamage((int) params.getInt("meta")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setItemDamage_20); + + BaseData reflect_ItemStack_method_getMaxDamage_21 = new ModData(); + reflect_ItemStack_method_getMaxDamage_21.set("methodName", "getMaxDamage"); + reflect_ItemStack_method_getMaxDamage_21.set("returnType", "ItemStack"); + reflect_ItemStack_method_getMaxDamage_21.set("static", false); + reflect_ItemStack_method_getMaxDamage_21.set("argnames", new String[] {}); + reflect_ItemStack_method_getMaxDamage_21.set("argtypes", new String[] {}); + reflect_ItemStack_method_getMaxDamage_21.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) ((ItemStack) params.getReflective("_self")).getMaxDamage(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getMaxDamage_21); + + BaseData reflect_ItemStack_method_attemptDamageItem_22 = new ModData(); + reflect_ItemStack_method_attemptDamageItem_22.set("methodName", "attemptDamageItem"); + reflect_ItemStack_method_attemptDamageItem_22.set("returnType", "ItemStack"); + reflect_ItemStack_method_attemptDamageItem_22.set("static", false); + reflect_ItemStack_method_attemptDamageItem_22.set("argnames", new String[] { "amount", "rand" }); + reflect_ItemStack_method_attemptDamageItem_22.set("argtypes", new String[] { "int", "EaglercraftRandom" }); + reflect_ItemStack_method_attemptDamageItem_22.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).attemptDamageItem( + (int) params.getInt("amount"), (EaglercraftRandom) params.getReflective("rand")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_attemptDamageItem_22); + + BaseData reflect_ItemStack_method_damageItem_23 = new ModData(); + reflect_ItemStack_method_damageItem_23.set("methodName", "damageItem"); + reflect_ItemStack_method_damageItem_23.set("returnType", "ItemStack"); + reflect_ItemStack_method_damageItem_23.set("static", false); + reflect_ItemStack_method_damageItem_23.set("argnames", new String[] { "amount", "entityIn" }); + reflect_ItemStack_method_damageItem_23.set("argtypes", new String[] { "int", "EntityLivingBase" }); + reflect_ItemStack_method_damageItem_23.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).damageItem((int) params.getInt("amount"), + (EntityLivingBase) params.getReflective("entityIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_damageItem_23); + + BaseData reflect_ItemStack_method_hitEntity_24 = new ModData(); + reflect_ItemStack_method_hitEntity_24.set("methodName", "hitEntity"); + reflect_ItemStack_method_hitEntity_24.set("returnType", "ItemStack"); + reflect_ItemStack_method_hitEntity_24.set("static", false); + reflect_ItemStack_method_hitEntity_24.set("argnames", new String[] { "entityIn", "playerIn" }); + reflect_ItemStack_method_hitEntity_24.set("argtypes", new String[] { "EntityLivingBase", "EntityPlayer" }); + reflect_ItemStack_method_hitEntity_24.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).hitEntity( + (EntityLivingBase) params.getReflective("entityIn"), + (EntityPlayer) params.getReflective("playerIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_hitEntity_24); + + BaseData reflect_ItemStack_method_onBlockDestroyed_25 = new ModData(); + reflect_ItemStack_method_onBlockDestroyed_25.set("methodName", "onBlockDestroyed"); + reflect_ItemStack_method_onBlockDestroyed_25.set("returnType", "ItemStack"); + reflect_ItemStack_method_onBlockDestroyed_25.set("static", false); + reflect_ItemStack_method_onBlockDestroyed_25.set("argnames", + new String[] { "worldIn", "blockIn", "pos", "playerIn" }); + reflect_ItemStack_method_onBlockDestroyed_25.set("argtypes", + new String[] { "World", "Block", "BlockPos", "EntityPlayer" }); + reflect_ItemStack_method_onBlockDestroyed_25.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).onBlockDestroyed((World) params.getReflective("worldIn"), + (Block) params.getReflective("blockIn"), (BlockPos) params.getReflective("pos"), + (EntityPlayer) params.getReflective("playerIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_onBlockDestroyed_25); + + BaseData reflect_ItemStack_method_canHarvestBlock_26 = new ModData(); + reflect_ItemStack_method_canHarvestBlock_26.set("methodName", "canHarvestBlock"); + reflect_ItemStack_method_canHarvestBlock_26.set("returnType", "ItemStack"); + reflect_ItemStack_method_canHarvestBlock_26.set("static", false); + reflect_ItemStack_method_canHarvestBlock_26.set("argnames", new String[] { "blockIn" }); + reflect_ItemStack_method_canHarvestBlock_26.set("argtypes", new String[] { "Block" }); + reflect_ItemStack_method_canHarvestBlock_26.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")) + .canHarvestBlock((Block) params.getReflective("blockIn")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_canHarvestBlock_26); + + BaseData reflect_ItemStack_method_interactWithEntity_27 = new ModData(); + reflect_ItemStack_method_interactWithEntity_27.set("methodName", "interactWithEntity"); + reflect_ItemStack_method_interactWithEntity_27.set("returnType", "ItemStack"); + reflect_ItemStack_method_interactWithEntity_27.set("static", false); + reflect_ItemStack_method_interactWithEntity_27.set("argnames", new String[] { "playerIn", "entityIn" }); + reflect_ItemStack_method_interactWithEntity_27.set("argtypes", + new String[] { "EntityPlayer", "EntityLivingBase" }); + reflect_ItemStack_method_interactWithEntity_27.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).interactWithEntity( + (EntityPlayer) params.getReflective("playerIn"), + (EntityLivingBase) params.getReflective("entityIn")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_interactWithEntity_27); + + BaseData reflect_ItemStack_method_copy_28 = new ModData(); + reflect_ItemStack_method_copy_28.set("methodName", "copy"); + reflect_ItemStack_method_copy_28.set("returnType", "ItemStack"); + reflect_ItemStack_method_copy_28.set("static", false); + reflect_ItemStack_method_copy_28.set("argnames", new String[] {}); + reflect_ItemStack_method_copy_28.set("argtypes", new String[] {}); + reflect_ItemStack_method_copy_28.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ((ItemStack) params.getReflective("_self")).copy(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_copy_28); + + BaseData reflect_ItemStack_method_areItemStackTagsEqual_29 = new ModData(); + reflect_ItemStack_method_areItemStackTagsEqual_29.set("methodName", "areItemStackTagsEqual"); + reflect_ItemStack_method_areItemStackTagsEqual_29.set("returnType", "ItemStack"); + reflect_ItemStack_method_areItemStackTagsEqual_29.set("static", true); + reflect_ItemStack_method_areItemStackTagsEqual_29.set("argnames", new String[] { "stackA", "stackB" }); + reflect_ItemStack_method_areItemStackTagsEqual_29.set("argtypes", new String[] { "ItemStack", "ItemStack" }); + reflect_ItemStack_method_areItemStackTagsEqual_29.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ItemStack.areItemStackTagsEqual((ItemStack) params.getReflective("stackA"), + (ItemStack) params.getReflective("stackB")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_areItemStackTagsEqual_29); + + BaseData reflect_ItemStack_method_areItemStacksEqual_30 = new ModData(); + reflect_ItemStack_method_areItemStacksEqual_30.set("methodName", "areItemStacksEqual"); + reflect_ItemStack_method_areItemStacksEqual_30.set("returnType", "ItemStack"); + reflect_ItemStack_method_areItemStacksEqual_30.set("static", true); + reflect_ItemStack_method_areItemStacksEqual_30.set("argnames", new String[] { "stackA", "stackB" }); + reflect_ItemStack_method_areItemStacksEqual_30.set("argtypes", new String[] { "ItemStack", "ItemStack" }); + reflect_ItemStack_method_areItemStacksEqual_30.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ItemStack.areItemStacksEqual((ItemStack) params.getReflective("stackA"), + (ItemStack) params.getReflective("stackB")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_areItemStacksEqual_30); + + BaseData reflect_ItemStack_method_areItemsEqual_31 = new ModData(); + reflect_ItemStack_method_areItemsEqual_31.set("methodName", "areItemsEqual"); + reflect_ItemStack_method_areItemsEqual_31.set("returnType", "ItemStack"); + reflect_ItemStack_method_areItemsEqual_31.set("static", true); + reflect_ItemStack_method_areItemsEqual_31.set("argnames", new String[] { "stackA", "stackB" }); + reflect_ItemStack_method_areItemsEqual_31.set("argtypes", new String[] { "ItemStack", "ItemStack" }); + reflect_ItemStack_method_areItemsEqual_31.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ItemStack.areItemsEqual((ItemStack) params.getReflective("stackA"), + (ItemStack) params.getReflective("stackB")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_areItemsEqual_31); + + BaseData reflect_ItemStack_method_isItemEqual_32 = new ModData(); + reflect_ItemStack_method_isItemEqual_32.set("methodName", "isItemEqual"); + reflect_ItemStack_method_isItemEqual_32.set("returnType", "ItemStack"); + reflect_ItemStack_method_isItemEqual_32.set("static", false); + reflect_ItemStack_method_isItemEqual_32.set("argnames", new String[] { "other" }); + reflect_ItemStack_method_isItemEqual_32.set("argtypes", new String[] { "ItemStack" }); + reflect_ItemStack_method_isItemEqual_32.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")) + .isItemEqual((ItemStack) params.getReflective("other")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_isItemEqual_32); + + BaseData reflect_ItemStack_method_getUnlocalizedName_33 = new ModData(); + reflect_ItemStack_method_getUnlocalizedName_33.set("methodName", "getUnlocalizedName"); + reflect_ItemStack_method_getUnlocalizedName_33.set("returnType", "ItemStack"); + reflect_ItemStack_method_getUnlocalizedName_33.set("static", false); + reflect_ItemStack_method_getUnlocalizedName_33.set("argnames", new String[] {}); + reflect_ItemStack_method_getUnlocalizedName_33.set("argtypes", new String[] {}); + reflect_ItemStack_method_getUnlocalizedName_33.setCallbackStringWithDataArg("exec", (BaseData params) -> { + try { + return (String) ((ItemStack) params.getReflective("_self")).getUnlocalizedName(); + } catch (Exception _exception_reflect_) { + return ""; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getUnlocalizedName_33); + + BaseData reflect_ItemStack_method_copyItemStack_34 = new ModData(); + reflect_ItemStack_method_copyItemStack_34.set("methodName", "copyItemStack"); + reflect_ItemStack_method_copyItemStack_34.set("returnType", "ItemStack"); + reflect_ItemStack_method_copyItemStack_34.set("static", true); + reflect_ItemStack_method_copyItemStack_34.set("argnames", new String[] { "stack" }); + reflect_ItemStack_method_copyItemStack_34.set("argtypes", new String[] { "ItemStack" }); + reflect_ItemStack_method_copyItemStack_34.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ItemStack.copyItemStack((ItemStack) params.getReflective("stack")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_copyItemStack_34); + + BaseData reflect_ItemStack_method_toString_35 = new ModData(); + reflect_ItemStack_method_toString_35.set("methodName", "toString"); + reflect_ItemStack_method_toString_35.set("returnType", "ItemStack"); + reflect_ItemStack_method_toString_35.set("static", false); + reflect_ItemStack_method_toString_35.set("argnames", new String[] {}); + reflect_ItemStack_method_toString_35.set("argtypes", new String[] {}); + reflect_ItemStack_method_toString_35.setCallbackStringWithDataArg("exec", (BaseData params) -> { + try { + return (String) ((ItemStack) params.getReflective("_self")).toString(); + } catch (Exception _exception_reflect_) { + return ""; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_toString_35); + + BaseData reflect_ItemStack_method_updateAnimation_36 = new ModData(); + reflect_ItemStack_method_updateAnimation_36.set("methodName", "updateAnimation"); + reflect_ItemStack_method_updateAnimation_36.set("returnType", "ItemStack"); + reflect_ItemStack_method_updateAnimation_36.set("static", false); + reflect_ItemStack_method_updateAnimation_36.set("argnames", + new String[] { "worldIn", "entityIn", "inventorySlot", "isCurrentItem" }); + reflect_ItemStack_method_updateAnimation_36.set("argtypes", + new String[] { "World", "Entity", "int", "boolean" }); + reflect_ItemStack_method_updateAnimation_36.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).updateAnimation((World) params.getReflective("worldIn"), + (Entity) params.getReflective("entityIn"), (int) params.getInt("inventorySlot"), + (boolean) params.getBoolean("isCurrentItem")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_updateAnimation_36); + + BaseData reflect_ItemStack_method_onCrafting_37 = new ModData(); + reflect_ItemStack_method_onCrafting_37.set("methodName", "onCrafting"); + reflect_ItemStack_method_onCrafting_37.set("returnType", "ItemStack"); + reflect_ItemStack_method_onCrafting_37.set("static", false); + reflect_ItemStack_method_onCrafting_37.set("argnames", new String[] { "worldIn", "playerIn", "amount" }); + reflect_ItemStack_method_onCrafting_37.set("argtypes", new String[] { "World", "EntityPlayer", "int" }); + reflect_ItemStack_method_onCrafting_37.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).onCrafting((World) params.getReflective("worldIn"), + (EntityPlayer) params.getReflective("playerIn"), (int) params.getInt("amount")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_onCrafting_37); + + BaseData reflect_ItemStack_method_getIsItemStackEqual_38 = new ModData(); + reflect_ItemStack_method_getIsItemStackEqual_38.set("methodName", "getIsItemStackEqual"); + reflect_ItemStack_method_getIsItemStackEqual_38.set("returnType", "ItemStack"); + reflect_ItemStack_method_getIsItemStackEqual_38.set("static", false); + reflect_ItemStack_method_getIsItemStackEqual_38.set("argnames", new String[] { "parItemStack" }); + reflect_ItemStack_method_getIsItemStackEqual_38.set("argtypes", new String[] { "ItemStack" }); + reflect_ItemStack_method_getIsItemStackEqual_38.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")) + .getIsItemStackEqual((ItemStack) params.getReflective("parItemStack")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getIsItemStackEqual_38); + + BaseData reflect_ItemStack_method_getMaxItemUseDuration_39 = new ModData(); + reflect_ItemStack_method_getMaxItemUseDuration_39.set("methodName", "getMaxItemUseDuration"); + reflect_ItemStack_method_getMaxItemUseDuration_39.set("returnType", "ItemStack"); + reflect_ItemStack_method_getMaxItemUseDuration_39.set("static", false); + reflect_ItemStack_method_getMaxItemUseDuration_39.set("argnames", new String[] {}); + reflect_ItemStack_method_getMaxItemUseDuration_39.set("argtypes", new String[] {}); + reflect_ItemStack_method_getMaxItemUseDuration_39.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) ((ItemStack) params.getReflective("_self")).getMaxItemUseDuration(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getMaxItemUseDuration_39); + + BaseData reflect_ItemStack_method_getItemUseAction_40 = new ModData(); + reflect_ItemStack_method_getItemUseAction_40.set("methodName", "getItemUseAction"); + reflect_ItemStack_method_getItemUseAction_40.set("returnType", "ItemStack"); + reflect_ItemStack_method_getItemUseAction_40.set("static", false); + reflect_ItemStack_method_getItemUseAction_40.set("argnames", new String[] {}); + reflect_ItemStack_method_getItemUseAction_40.set("argtypes", new String[] {}); + reflect_ItemStack_method_getItemUseAction_40.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (EnumAction) ((ItemStack) params.getReflective("_self")).getItemUseAction(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getItemUseAction_40); + + BaseData reflect_ItemStack_method_onPlayerStoppedUsing_41 = new ModData(); + reflect_ItemStack_method_onPlayerStoppedUsing_41.set("methodName", "onPlayerStoppedUsing"); + reflect_ItemStack_method_onPlayerStoppedUsing_41.set("returnType", "ItemStack"); + reflect_ItemStack_method_onPlayerStoppedUsing_41.set("static", false); + reflect_ItemStack_method_onPlayerStoppedUsing_41.set("argnames", + new String[] { "worldIn", "playerIn", "timeLeft" }); + reflect_ItemStack_method_onPlayerStoppedUsing_41.set("argtypes", + new String[] { "World", "EntityPlayer", "int" }); + reflect_ItemStack_method_onPlayerStoppedUsing_41.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).onPlayerStoppedUsing( + (World) params.getReflective("worldIn"), (EntityPlayer) params.getReflective("playerIn"), + (int) params.getInt("timeLeft")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_onPlayerStoppedUsing_41); + + BaseData reflect_ItemStack_method_hasTagCompound_42 = new ModData(); + reflect_ItemStack_method_hasTagCompound_42.set("methodName", "hasTagCompound"); + reflect_ItemStack_method_hasTagCompound_42.set("returnType", "ItemStack"); + reflect_ItemStack_method_hasTagCompound_42.set("static", false); + reflect_ItemStack_method_hasTagCompound_42.set("argnames", new String[] {}); + reflect_ItemStack_method_hasTagCompound_42.set("argtypes", new String[] {}); + reflect_ItemStack_method_hasTagCompound_42.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).hasTagCompound(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_hasTagCompound_42); + + BaseData reflect_ItemStack_method_getTagCompound_43 = new ModData(); + reflect_ItemStack_method_getTagCompound_43.set("methodName", "getTagCompound"); + reflect_ItemStack_method_getTagCompound_43.set("returnType", "ItemStack"); + reflect_ItemStack_method_getTagCompound_43.set("static", false); + reflect_ItemStack_method_getTagCompound_43.set("argnames", new String[] {}); + reflect_ItemStack_method_getTagCompound_43.set("argtypes", new String[] {}); + reflect_ItemStack_method_getTagCompound_43.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (NBTTagCompound) ((ItemStack) params.getReflective("_self")).getTagCompound(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getTagCompound_43); + + BaseData reflect_ItemStack_method_getSubCompound_44 = new ModData(); + reflect_ItemStack_method_getSubCompound_44.set("methodName", "getSubCompound"); + reflect_ItemStack_method_getSubCompound_44.set("returnType", "ItemStack"); + reflect_ItemStack_method_getSubCompound_44.set("static", false); + reflect_ItemStack_method_getSubCompound_44.set("argnames", new String[] { "key", "create" }); + reflect_ItemStack_method_getSubCompound_44.set("argtypes", new String[] { "String", "boolean" }); + reflect_ItemStack_method_getSubCompound_44.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (NBTTagCompound) ((ItemStack) params.getReflective("_self")) + .getSubCompound((String) params.getString("key"), (boolean) params.getBoolean("create")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getSubCompound_44); + + BaseData reflect_ItemStack_method_getEnchantmentTagList_45 = new ModData(); + reflect_ItemStack_method_getEnchantmentTagList_45.set("methodName", "getEnchantmentTagList"); + reflect_ItemStack_method_getEnchantmentTagList_45.set("returnType", "ItemStack"); + reflect_ItemStack_method_getEnchantmentTagList_45.set("static", false); + reflect_ItemStack_method_getEnchantmentTagList_45.set("argnames", new String[] {}); + reflect_ItemStack_method_getEnchantmentTagList_45.set("argtypes", new String[] {}); + reflect_ItemStack_method_getEnchantmentTagList_45.setCallbackReflectiveWithDataArg("exec", + (BaseData params) -> { + try { + return (NBTTagList) ((ItemStack) params.getReflective("_self")).getEnchantmentTagList(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getEnchantmentTagList_45); + + BaseData reflect_ItemStack_method_setTagCompound_46 = new ModData(); + reflect_ItemStack_method_setTagCompound_46.set("methodName", "setTagCompound"); + reflect_ItemStack_method_setTagCompound_46.set("returnType", "ItemStack"); + reflect_ItemStack_method_setTagCompound_46.set("static", false); + reflect_ItemStack_method_setTagCompound_46.set("argnames", new String[] { "nbt" }); + reflect_ItemStack_method_setTagCompound_46.set("argtypes", new String[] { "NBTTagCompound" }); + reflect_ItemStack_method_setTagCompound_46.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")) + .setTagCompound((NBTTagCompound) params.getReflective("nbt")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setTagCompound_46); + + BaseData reflect_ItemStack_method_getDisplayName_47 = new ModData(); + reflect_ItemStack_method_getDisplayName_47.set("methodName", "getDisplayName"); + reflect_ItemStack_method_getDisplayName_47.set("returnType", "ItemStack"); + reflect_ItemStack_method_getDisplayName_47.set("static", false); + reflect_ItemStack_method_getDisplayName_47.set("argnames", new String[] {}); + reflect_ItemStack_method_getDisplayName_47.set("argtypes", new String[] {}); + reflect_ItemStack_method_getDisplayName_47.setCallbackStringWithDataArg("exec", (BaseData params) -> { + try { + return (String) ((ItemStack) params.getReflective("_self")).getDisplayName(); + } catch (Exception _exception_reflect_) { + return ""; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getDisplayName_47); + + BaseData reflect_ItemStack_method_setStackDisplayName_48 = new ModData(); + reflect_ItemStack_method_setStackDisplayName_48.set("methodName", "setStackDisplayName"); + reflect_ItemStack_method_setStackDisplayName_48.set("returnType", "ItemStack"); + reflect_ItemStack_method_setStackDisplayName_48.set("static", false); + reflect_ItemStack_method_setStackDisplayName_48.set("argnames", new String[] { "displayName" }); + reflect_ItemStack_method_setStackDisplayName_48.set("argtypes", new String[] { "String" }); + reflect_ItemStack_method_setStackDisplayName_48.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemStack) ((ItemStack) params.getReflective("_self")) + .setStackDisplayName((String) params.getString("displayName")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setStackDisplayName_48); + + BaseData reflect_ItemStack_method_setLore_49 = new ModData(); + reflect_ItemStack_method_setLore_49.set("methodName", "setLore"); + reflect_ItemStack_method_setLore_49.set("returnType", "ItemStack"); + reflect_ItemStack_method_setLore_49.set("static", false); + reflect_ItemStack_method_setLore_49.set("argnames", new String[] { "loreIn" }); + reflect_ItemStack_method_setLore_49.set("argtypes", new String[] { "String[]" }); + reflect_ItemStack_method_setLore_49.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).setLore((String[]) params.getReflective("loreIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setLore_49); + + BaseData reflect_ItemStack_method_getLore_50 = new ModData(); + reflect_ItemStack_method_getLore_50.set("methodName", "getLore"); + reflect_ItemStack_method_getLore_50.set("returnType", "ItemStack"); + reflect_ItemStack_method_getLore_50.set("static", false); + reflect_ItemStack_method_getLore_50.set("argnames", new String[] {}); + reflect_ItemStack_method_getLore_50.set("argtypes", new String[] {}); + reflect_ItemStack_method_getLore_50.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (String[]) ((ItemStack) params.getReflective("_self")).getLore(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getLore_50); + + BaseData reflect_ItemStack_method_clearCustomName_51 = new ModData(); + reflect_ItemStack_method_clearCustomName_51.set("methodName", "clearCustomName"); + reflect_ItemStack_method_clearCustomName_51.set("returnType", "ItemStack"); + reflect_ItemStack_method_clearCustomName_51.set("static", false); + reflect_ItemStack_method_clearCustomName_51.set("argnames", new String[] {}); + reflect_ItemStack_method_clearCustomName_51.set("argtypes", new String[] {}); + reflect_ItemStack_method_clearCustomName_51.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).clearCustomName(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_clearCustomName_51); + + BaseData reflect_ItemStack_method_hasDisplayName_52 = new ModData(); + reflect_ItemStack_method_hasDisplayName_52.set("methodName", "hasDisplayName"); + reflect_ItemStack_method_hasDisplayName_52.set("returnType", "ItemStack"); + reflect_ItemStack_method_hasDisplayName_52.set("static", false); + reflect_ItemStack_method_hasDisplayName_52.set("argnames", new String[] {}); + reflect_ItemStack_method_hasDisplayName_52.set("argtypes", new String[] {}); + reflect_ItemStack_method_hasDisplayName_52.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).hasDisplayName(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_hasDisplayName_52); + + BaseData reflect_ItemStack_method_hasEffect_53 = new ModData(); + reflect_ItemStack_method_hasEffect_53.set("methodName", "hasEffect"); + reflect_ItemStack_method_hasEffect_53.set("returnType", "ItemStack"); + reflect_ItemStack_method_hasEffect_53.set("static", false); + reflect_ItemStack_method_hasEffect_53.set("argnames", new String[] {}); + reflect_ItemStack_method_hasEffect_53.set("argtypes", new String[] {}); + reflect_ItemStack_method_hasEffect_53.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).hasEffect(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_hasEffect_53); + + BaseData reflect_ItemStack_method_getRarity_54 = new ModData(); + reflect_ItemStack_method_getRarity_54.set("methodName", "getRarity"); + reflect_ItemStack_method_getRarity_54.set("returnType", "ItemStack"); + reflect_ItemStack_method_getRarity_54.set("static", false); + reflect_ItemStack_method_getRarity_54.set("argnames", new String[] {}); + reflect_ItemStack_method_getRarity_54.set("argtypes", new String[] {}); + reflect_ItemStack_method_getRarity_54.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (EnumRarity) ((ItemStack) params.getReflective("_self")).getRarity(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getRarity_54); + + BaseData reflect_ItemStack_method_isItemEnchantable_55 = new ModData(); + reflect_ItemStack_method_isItemEnchantable_55.set("methodName", "isItemEnchantable"); + reflect_ItemStack_method_isItemEnchantable_55.set("returnType", "ItemStack"); + reflect_ItemStack_method_isItemEnchantable_55.set("static", false); + reflect_ItemStack_method_isItemEnchantable_55.set("argnames", new String[] {}); + reflect_ItemStack_method_isItemEnchantable_55.set("argtypes", new String[] {}); + reflect_ItemStack_method_isItemEnchantable_55.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).isItemEnchantable(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_isItemEnchantable_55); + + BaseData reflect_ItemStack_method_addEnchantment_56 = new ModData(); + reflect_ItemStack_method_addEnchantment_56.set("methodName", "addEnchantment"); + reflect_ItemStack_method_addEnchantment_56.set("returnType", "ItemStack"); + reflect_ItemStack_method_addEnchantment_56.set("static", false); + reflect_ItemStack_method_addEnchantment_56.set("argnames", new String[] { "ench", "level" }); + reflect_ItemStack_method_addEnchantment_56.set("argtypes", new String[] { "Enchantment", "int" }); + reflect_ItemStack_method_addEnchantment_56.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).addEnchantment((Enchantment) params.getReflective("ench"), + (int) params.getInt("level")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_addEnchantment_56); + + BaseData reflect_ItemStack_method_isItemEnchanted_57 = new ModData(); + reflect_ItemStack_method_isItemEnchanted_57.set("methodName", "isItemEnchanted"); + reflect_ItemStack_method_isItemEnchanted_57.set("returnType", "ItemStack"); + reflect_ItemStack_method_isItemEnchanted_57.set("static", false); + reflect_ItemStack_method_isItemEnchanted_57.set("argnames", new String[] {}); + reflect_ItemStack_method_isItemEnchanted_57.set("argtypes", new String[] {}); + reflect_ItemStack_method_isItemEnchanted_57.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).isItemEnchanted(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_isItemEnchanted_57); + + BaseData reflect_ItemStack_method_setTagInfo_58 = new ModData(); + reflect_ItemStack_method_setTagInfo_58.set("methodName", "setTagInfo"); + reflect_ItemStack_method_setTagInfo_58.set("returnType", "ItemStack"); + reflect_ItemStack_method_setTagInfo_58.set("static", false); + reflect_ItemStack_method_setTagInfo_58.set("argnames", new String[] { "key", "value" }); + reflect_ItemStack_method_setTagInfo_58.set("argtypes", new String[] { "String", "NBTBase" }); + reflect_ItemStack_method_setTagInfo_58.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).setTagInfo((String) params.getString("key"), + (NBTBase) params.getReflective("value")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setTagInfo_58); + + BaseData reflect_ItemStack_method_canEditBlocks_59 = new ModData(); + reflect_ItemStack_method_canEditBlocks_59.set("methodName", "canEditBlocks"); + reflect_ItemStack_method_canEditBlocks_59.set("returnType", "ItemStack"); + reflect_ItemStack_method_canEditBlocks_59.set("static", false); + reflect_ItemStack_method_canEditBlocks_59.set("argnames", new String[] {}); + reflect_ItemStack_method_canEditBlocks_59.set("argtypes", new String[] {}); + reflect_ItemStack_method_canEditBlocks_59.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).canEditBlocks(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_canEditBlocks_59); + + BaseData reflect_ItemStack_method_isOnItemFrame_60 = new ModData(); + reflect_ItemStack_method_isOnItemFrame_60.set("methodName", "isOnItemFrame"); + reflect_ItemStack_method_isOnItemFrame_60.set("returnType", "ItemStack"); + reflect_ItemStack_method_isOnItemFrame_60.set("static", false); + reflect_ItemStack_method_isOnItemFrame_60.set("argnames", new String[] {}); + reflect_ItemStack_method_isOnItemFrame_60.set("argtypes", new String[] {}); + reflect_ItemStack_method_isOnItemFrame_60.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")).isOnItemFrame(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_isOnItemFrame_60); + + BaseData reflect_ItemStack_method_setItemFrame_61 = new ModData(); + reflect_ItemStack_method_setItemFrame_61.set("methodName", "setItemFrame"); + reflect_ItemStack_method_setItemFrame_61.set("returnType", "ItemStack"); + reflect_ItemStack_method_setItemFrame_61.set("static", false); + reflect_ItemStack_method_setItemFrame_61.set("argnames", new String[] { "frame" }); + reflect_ItemStack_method_setItemFrame_61.set("argtypes", new String[] { "EntityItemFrame" }); + reflect_ItemStack_method_setItemFrame_61.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")) + .setItemFrame((EntityItemFrame) params.getReflective("frame")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setItemFrame_61); + + BaseData reflect_ItemStack_method_getItemFrame_62 = new ModData(); + reflect_ItemStack_method_getItemFrame_62.set("methodName", "getItemFrame"); + reflect_ItemStack_method_getItemFrame_62.set("returnType", "ItemStack"); + reflect_ItemStack_method_getItemFrame_62.set("static", false); + reflect_ItemStack_method_getItemFrame_62.set("argnames", new String[] {}); + reflect_ItemStack_method_getItemFrame_62.set("argtypes", new String[] {}); + reflect_ItemStack_method_getItemFrame_62.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (EntityItemFrame) ((ItemStack) params.getReflective("_self")).getItemFrame(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getItemFrame_62); + + BaseData reflect_ItemStack_method_getRepairCost_63 = new ModData(); + reflect_ItemStack_method_getRepairCost_63.set("methodName", "getRepairCost"); + reflect_ItemStack_method_getRepairCost_63.set("returnType", "ItemStack"); + reflect_ItemStack_method_getRepairCost_63.set("static", false); + reflect_ItemStack_method_getRepairCost_63.set("argnames", new String[] {}); + reflect_ItemStack_method_getRepairCost_63.set("argtypes", new String[] {}); + reflect_ItemStack_method_getRepairCost_63.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) ((ItemStack) params.getReflective("_self")).getRepairCost(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getRepairCost_63); + + BaseData reflect_ItemStack_method_setRepairCost_64 = new ModData(); + reflect_ItemStack_method_setRepairCost_64.set("methodName", "setRepairCost"); + reflect_ItemStack_method_setRepairCost_64.set("returnType", "ItemStack"); + reflect_ItemStack_method_setRepairCost_64.set("static", false); + reflect_ItemStack_method_setRepairCost_64.set("argnames", new String[] { "cost" }); + reflect_ItemStack_method_setRepairCost_64.set("argtypes", new String[] { "int" }); + reflect_ItemStack_method_setRepairCost_64.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).setRepairCost((int) params.getInt("cost")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setRepairCost_64); + + BaseData reflect_ItemStack_method_setItem_65 = new ModData(); + reflect_ItemStack_method_setItem_65.set("methodName", "setItem"); + reflect_ItemStack_method_setItem_65.set("returnType", "ItemStack"); + reflect_ItemStack_method_setItem_65.set("static", false); + reflect_ItemStack_method_setItem_65.set("argnames", new String[] { "newItem" }); + reflect_ItemStack_method_setItem_65.set("argtypes", new String[] { "Item" }); + reflect_ItemStack_method_setItem_65.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((ItemStack) params.getReflective("_self")).setItem((Item) params.getReflective("newItem")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_setItem_65); + + BaseData reflect_ItemStack_method_getChatComponent_66 = new ModData(); + reflect_ItemStack_method_getChatComponent_66.set("methodName", "getChatComponent"); + reflect_ItemStack_method_getChatComponent_66.set("returnType", "ItemStack"); + reflect_ItemStack_method_getChatComponent_66.set("static", false); + reflect_ItemStack_method_getChatComponent_66.set("argnames", new String[] {}); + reflect_ItemStack_method_getChatComponent_66.set("argtypes", new String[] {}); + reflect_ItemStack_method_getChatComponent_66.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (IChatComponent) ((ItemStack) params.getReflective("_self")).getChatComponent(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_getChatComponent_66); + + BaseData reflect_ItemStack_method_canDestroy_67 = new ModData(); + reflect_ItemStack_method_canDestroy_67.set("methodName", "canDestroy"); + reflect_ItemStack_method_canDestroy_67.set("returnType", "ItemStack"); + reflect_ItemStack_method_canDestroy_67.set("static", false); + reflect_ItemStack_method_canDestroy_67.set("argnames", new String[] { "blockIn" }); + reflect_ItemStack_method_canDestroy_67.set("argtypes", new String[] { "Block" }); + reflect_ItemStack_method_canDestroy_67.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")) + .canDestroy((Block) params.getReflective("blockIn")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_canDestroy_67); + + BaseData reflect_ItemStack_method_canPlaceOn_68 = new ModData(); + reflect_ItemStack_method_canPlaceOn_68.set("methodName", "canPlaceOn"); + reflect_ItemStack_method_canPlaceOn_68.set("returnType", "ItemStack"); + reflect_ItemStack_method_canPlaceOn_68.set("static", false); + reflect_ItemStack_method_canPlaceOn_68.set("argnames", new String[] { "blockIn" }); + reflect_ItemStack_method_canPlaceOn_68.set("argtypes", new String[] { "Block" }); + reflect_ItemStack_method_canPlaceOn_68.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((ItemStack) params.getReflective("_self")) + .canPlaceOn((Block) params.getReflective("blockIn")); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_ItemStack_methods.add(reflect_ItemStack_method_canPlaceOn_68); + + BaseData[] reflect_ItemStack_methods_arr = new BaseData[reflect_ItemStack_methods.size()]; + for (int i = 0; i < reflect_ItemStack_methods_arr.length; i++) { + reflect_ItemStack_methods_arr[i] = reflect_ItemStack_methods.get(i); + } + + reflect_ItemStack.set("constructors", reflect_ItemStack_constructors_arr); + reflect_ItemStack.set("methods", reflect_ItemStack_methods_arr); + reflect_ItemStack.set("className", "ItemStack"); + reflect_ItemStack.set("classId", "net.minecraft.item.ItemStack"); + reflect_ItemStack.set("class", ItemStack.class); + reflectProfiles.add(reflect_ItemStack); + + // CLASSDEF FOR Minecraft + BaseData reflect_Minecraft = new ModData(); + + ArrayList reflect_Minecraft_constructors = new ArrayList(); + + BaseData reflect_Minecraft_constructor_Minecraft_0 = new ModData(); + reflect_Minecraft_constructor_Minecraft_0.set("returnType", "Minecraft"); + reflect_Minecraft_constructor_Minecraft_0.set("argnames", new String[] { "gameConfig" }); + reflect_Minecraft_constructor_Minecraft_0.set("argtypes", new String[] { "GameConfiguration" }); + reflect_Minecraft_constructor_Minecraft_0.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + return new Minecraft((GameConfiguration) params.getReflective("gameConfig")); + }); + + reflect_Minecraft_constructors.add(reflect_Minecraft_constructor_Minecraft_0); + + BaseData[] reflect_Minecraft_constructors_arr = new BaseData[reflect_Minecraft_constructors.size()]; + for (int i = 0; i < reflect_Minecraft_constructors_arr.length; i++) { + reflect_Minecraft_constructors_arr[i] = reflect_Minecraft_constructors.get(i); + } + + ArrayList reflect_Minecraft_methods = new ArrayList(); + + BaseData reflect_Minecraft_method_run_0 = new ModData(); + reflect_Minecraft_method_run_0.set("methodName", "run"); + reflect_Minecraft_method_run_0.set("returnType", "Minecraft"); + reflect_Minecraft_method_run_0.set("static", false); + reflect_Minecraft_method_run_0.set("argnames", new String[] {}); + reflect_Minecraft_method_run_0.set("argtypes", new String[] {}); + reflect_Minecraft_method_run_0.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).run(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_run_0); + + BaseData reflect_Minecraft_method_getVersion_1 = new ModData(); + reflect_Minecraft_method_getVersion_1.set("methodName", "getVersion"); + reflect_Minecraft_method_getVersion_1.set("returnType", "Minecraft"); + reflect_Minecraft_method_getVersion_1.set("static", false); + reflect_Minecraft_method_getVersion_1.set("argnames", new String[] {}); + reflect_Minecraft_method_getVersion_1.set("argtypes", new String[] {}); + reflect_Minecraft_method_getVersion_1.setCallbackStringWithDataArg("exec", (BaseData params) -> { + try { + return (String) ((Minecraft) params.getReflective("_self")).getVersion(); + } catch (Exception _exception_reflect_) { + return ""; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getVersion_1); + + BaseData reflect_Minecraft_method_crashed_2 = new ModData(); + reflect_Minecraft_method_crashed_2.set("methodName", "crashed"); + reflect_Minecraft_method_crashed_2.set("returnType", "Minecraft"); + reflect_Minecraft_method_crashed_2.set("static", false); + reflect_Minecraft_method_crashed_2.set("argnames", new String[] { "crash" }); + reflect_Minecraft_method_crashed_2.set("argtypes", new String[] { "CrashReport" }); + reflect_Minecraft_method_crashed_2.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).crashed((CrashReport) params.getReflective("crash")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_crashed_2); + + BaseData reflect_Minecraft_method_displayCrashReport_3 = new ModData(); + reflect_Minecraft_method_displayCrashReport_3.set("methodName", "displayCrashReport"); + reflect_Minecraft_method_displayCrashReport_3.set("returnType", "Minecraft"); + reflect_Minecraft_method_displayCrashReport_3.set("static", false); + reflect_Minecraft_method_displayCrashReport_3.set("argnames", new String[] { "crashReportIn" }); + reflect_Minecraft_method_displayCrashReport_3.set("argtypes", new String[] { "CrashReport" }); + reflect_Minecraft_method_displayCrashReport_3.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .displayCrashReport((CrashReport) params.getReflective("crashReportIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_displayCrashReport_3); + + BaseData reflect_Minecraft_method_isUnicode_4 = new ModData(); + reflect_Minecraft_method_isUnicode_4.set("methodName", "isUnicode"); + reflect_Minecraft_method_isUnicode_4.set("returnType", "Minecraft"); + reflect_Minecraft_method_isUnicode_4.set("static", false); + reflect_Minecraft_method_isUnicode_4.set("argnames", new String[] {}); + reflect_Minecraft_method_isUnicode_4.set("argtypes", new String[] {}); + reflect_Minecraft_method_isUnicode_4.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isUnicode(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isUnicode_4); + + BaseData reflect_Minecraft_method_refreshResources_5 = new ModData(); + reflect_Minecraft_method_refreshResources_5.set("methodName", "refreshResources"); + reflect_Minecraft_method_refreshResources_5.set("returnType", "Minecraft"); + reflect_Minecraft_method_refreshResources_5.set("static", false); + reflect_Minecraft_method_refreshResources_5.set("argnames", new String[] {}); + reflect_Minecraft_method_refreshResources_5.set("argtypes", new String[] {}); + reflect_Minecraft_method_refreshResources_5.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).refreshResources(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_refreshResources_5); + + BaseData reflect_Minecraft_method_displayGuiScreen_6 = new ModData(); + reflect_Minecraft_method_displayGuiScreen_6.set("methodName", "displayGuiScreen"); + reflect_Minecraft_method_displayGuiScreen_6.set("returnType", "Minecraft"); + reflect_Minecraft_method_displayGuiScreen_6.set("static", false); + reflect_Minecraft_method_displayGuiScreen_6.set("argnames", new String[] { "guiScreenIn" }); + reflect_Minecraft_method_displayGuiScreen_6.set("argtypes", new String[] { "GuiScreen" }); + reflect_Minecraft_method_displayGuiScreen_6.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .displayGuiScreen((GuiScreen) params.getReflective("guiScreenIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_displayGuiScreen_6); + + BaseData reflect_Minecraft_method_shutdownIntegratedServer_7 = new ModData(); + reflect_Minecraft_method_shutdownIntegratedServer_7.set("methodName", "shutdownIntegratedServer"); + reflect_Minecraft_method_shutdownIntegratedServer_7.set("returnType", "Minecraft"); + reflect_Minecraft_method_shutdownIntegratedServer_7.set("static", false); + reflect_Minecraft_method_shutdownIntegratedServer_7.set("argnames", new String[] { "cont" }); + reflect_Minecraft_method_shutdownIntegratedServer_7.set("argtypes", new String[] { "GuiScreen" }); + reflect_Minecraft_method_shutdownIntegratedServer_7.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .shutdownIntegratedServer((GuiScreen) params.getReflective("cont")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_shutdownIntegratedServer_7); + + BaseData reflect_Minecraft_method_checkGLError_8 = new ModData(); + reflect_Minecraft_method_checkGLError_8.set("methodName", "checkGLError"); + reflect_Minecraft_method_checkGLError_8.set("returnType", "Minecraft"); + reflect_Minecraft_method_checkGLError_8.set("static", false); + reflect_Minecraft_method_checkGLError_8.set("argnames", new String[] { "message" }); + reflect_Minecraft_method_checkGLError_8.set("argtypes", new String[] { "String" }); + reflect_Minecraft_method_checkGLError_8.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).checkGLError((String) params.getString("message")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_checkGLError_8); + + BaseData reflect_Minecraft_method_shutdownMinecraftApplet_9 = new ModData(); + reflect_Minecraft_method_shutdownMinecraftApplet_9.set("methodName", "shutdownMinecraftApplet"); + reflect_Minecraft_method_shutdownMinecraftApplet_9.set("returnType", "Minecraft"); + reflect_Minecraft_method_shutdownMinecraftApplet_9.set("static", false); + reflect_Minecraft_method_shutdownMinecraftApplet_9.set("argnames", new String[] {}); + reflect_Minecraft_method_shutdownMinecraftApplet_9.set("argtypes", new String[] {}); + reflect_Minecraft_method_shutdownMinecraftApplet_9.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).shutdownMinecraftApplet(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_shutdownMinecraftApplet_9); + + BaseData reflect_Minecraft_method_updateDisplay_10 = new ModData(); + reflect_Minecraft_method_updateDisplay_10.set("methodName", "updateDisplay"); + reflect_Minecraft_method_updateDisplay_10.set("returnType", "Minecraft"); + reflect_Minecraft_method_updateDisplay_10.set("static", false); + reflect_Minecraft_method_updateDisplay_10.set("argnames", new String[] {}); + reflect_Minecraft_method_updateDisplay_10.set("argtypes", new String[] {}); + reflect_Minecraft_method_updateDisplay_10.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).updateDisplay(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_updateDisplay_10); + + BaseData reflect_Minecraft_method_getLimitFramerate_11 = new ModData(); + reflect_Minecraft_method_getLimitFramerate_11.set("methodName", "getLimitFramerate"); + reflect_Minecraft_method_getLimitFramerate_11.set("returnType", "Minecraft"); + reflect_Minecraft_method_getLimitFramerate_11.set("static", false); + reflect_Minecraft_method_getLimitFramerate_11.set("argnames", new String[] {}); + reflect_Minecraft_method_getLimitFramerate_11.set("argtypes", new String[] {}); + reflect_Minecraft_method_getLimitFramerate_11.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) ((Minecraft) params.getReflective("_self")).getLimitFramerate(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getLimitFramerate_11); + + BaseData reflect_Minecraft_method_isFramerateLimitBelowMax_12 = new ModData(); + reflect_Minecraft_method_isFramerateLimitBelowMax_12.set("methodName", "isFramerateLimitBelowMax"); + reflect_Minecraft_method_isFramerateLimitBelowMax_12.set("returnType", "Minecraft"); + reflect_Minecraft_method_isFramerateLimitBelowMax_12.set("static", false); + reflect_Minecraft_method_isFramerateLimitBelowMax_12.set("argnames", new String[] {}); + reflect_Minecraft_method_isFramerateLimitBelowMax_12.set("argtypes", new String[] {}); + reflect_Minecraft_method_isFramerateLimitBelowMax_12.setCallbackBooleanWithDataArg("exec", + (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isFramerateLimitBelowMax(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isFramerateLimitBelowMax_12); + + BaseData reflect_Minecraft_method_shutdown_13 = new ModData(); + reflect_Minecraft_method_shutdown_13.set("methodName", "shutdown"); + reflect_Minecraft_method_shutdown_13.set("returnType", "Minecraft"); + reflect_Minecraft_method_shutdown_13.set("static", false); + reflect_Minecraft_method_shutdown_13.set("argnames", new String[] {}); + reflect_Minecraft_method_shutdown_13.set("argtypes", new String[] {}); + reflect_Minecraft_method_shutdown_13.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).shutdown(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_shutdown_13); + + BaseData reflect_Minecraft_method_setIngameFocus_14 = new ModData(); + reflect_Minecraft_method_setIngameFocus_14.set("methodName", "setIngameFocus"); + reflect_Minecraft_method_setIngameFocus_14.set("returnType", "Minecraft"); + reflect_Minecraft_method_setIngameFocus_14.set("static", false); + reflect_Minecraft_method_setIngameFocus_14.set("argnames", new String[] {}); + reflect_Minecraft_method_setIngameFocus_14.set("argtypes", new String[] {}); + reflect_Minecraft_method_setIngameFocus_14.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).setIngameFocus(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_setIngameFocus_14); + + BaseData reflect_Minecraft_method_setIngameNotInFocus_15 = new ModData(); + reflect_Minecraft_method_setIngameNotInFocus_15.set("methodName", "setIngameNotInFocus"); + reflect_Minecraft_method_setIngameNotInFocus_15.set("returnType", "Minecraft"); + reflect_Minecraft_method_setIngameNotInFocus_15.set("static", false); + reflect_Minecraft_method_setIngameNotInFocus_15.set("argnames", new String[] {}); + reflect_Minecraft_method_setIngameNotInFocus_15.set("argtypes", new String[] {}); + reflect_Minecraft_method_setIngameNotInFocus_15.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).setIngameNotInFocus(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_setIngameNotInFocus_15); + + BaseData reflect_Minecraft_method_displayInGameMenu_16 = new ModData(); + reflect_Minecraft_method_displayInGameMenu_16.set("methodName", "displayInGameMenu"); + reflect_Minecraft_method_displayInGameMenu_16.set("returnType", "Minecraft"); + reflect_Minecraft_method_displayInGameMenu_16.set("static", false); + reflect_Minecraft_method_displayInGameMenu_16.set("argnames", new String[] {}); + reflect_Minecraft_method_displayInGameMenu_16.set("argtypes", new String[] {}); + reflect_Minecraft_method_displayInGameMenu_16.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).displayInGameMenu(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_displayInGameMenu_16); + + BaseData reflect_Minecraft_method_clickMouse_17 = new ModData(); + reflect_Minecraft_method_clickMouse_17.set("methodName", "clickMouse"); + reflect_Minecraft_method_clickMouse_17.set("returnType", "Minecraft"); + reflect_Minecraft_method_clickMouse_17.set("static", false); + reflect_Minecraft_method_clickMouse_17.set("argnames", new String[] {}); + reflect_Minecraft_method_clickMouse_17.set("argtypes", new String[] {}); + reflect_Minecraft_method_clickMouse_17.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).clickMouse(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_clickMouse_17); + + BaseData reflect_Minecraft_method_rightClickMouse_18 = new ModData(); + reflect_Minecraft_method_rightClickMouse_18.set("methodName", "rightClickMouse"); + reflect_Minecraft_method_rightClickMouse_18.set("returnType", "Minecraft"); + reflect_Minecraft_method_rightClickMouse_18.set("static", false); + reflect_Minecraft_method_rightClickMouse_18.set("argnames", new String[] {}); + reflect_Minecraft_method_rightClickMouse_18.set("argtypes", new String[] {}); + reflect_Minecraft_method_rightClickMouse_18.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).rightClickMouse(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_rightClickMouse_18); + + BaseData reflect_Minecraft_method_toggleFullscreen_19 = new ModData(); + reflect_Minecraft_method_toggleFullscreen_19.set("methodName", "toggleFullscreen"); + reflect_Minecraft_method_toggleFullscreen_19.set("returnType", "Minecraft"); + reflect_Minecraft_method_toggleFullscreen_19.set("static", false); + reflect_Minecraft_method_toggleFullscreen_19.set("argnames", new String[] {}); + reflect_Minecraft_method_toggleFullscreen_19.set("argtypes", new String[] {}); + reflect_Minecraft_method_toggleFullscreen_19.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).toggleFullscreen(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_toggleFullscreen_19); + + BaseData reflect_Minecraft_method_func_181535_r_20 = new ModData(); + reflect_Minecraft_method_func_181535_r_20.set("methodName", "func_181535_r"); + reflect_Minecraft_method_func_181535_r_20.set("returnType", "Minecraft"); + reflect_Minecraft_method_func_181535_r_20.set("static", false); + reflect_Minecraft_method_func_181535_r_20.set("argnames", new String[] {}); + reflect_Minecraft_method_func_181535_r_20.set("argtypes", new String[] {}); + reflect_Minecraft_method_func_181535_r_20.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (MusicTicker) ((Minecraft) params.getReflective("_self")).func_181535_r(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_func_181535_r_20); + + BaseData reflect_Minecraft_method_runTick_21 = new ModData(); + reflect_Minecraft_method_runTick_21.set("methodName", "runTick"); + reflect_Minecraft_method_runTick_21.set("returnType", "Minecraft"); + reflect_Minecraft_method_runTick_21.set("static", false); + reflect_Minecraft_method_runTick_21.set("argnames", new String[] {}); + reflect_Minecraft_method_runTick_21.set("argtypes", new String[] {}); + reflect_Minecraft_method_runTick_21.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).runTick(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_runTick_21); + + BaseData reflect_Minecraft_method_launchIntegratedServer_22 = new ModData(); + reflect_Minecraft_method_launchIntegratedServer_22.set("methodName", "launchIntegratedServer"); + reflect_Minecraft_method_launchIntegratedServer_22.set("returnType", "Minecraft"); + reflect_Minecraft_method_launchIntegratedServer_22.set("static", false); + reflect_Minecraft_method_launchIntegratedServer_22.set("argnames", + new String[] { "folderName", "worldName", "worldSettingsIn" }); + reflect_Minecraft_method_launchIntegratedServer_22.set("argtypes", + new String[] { "String", "String", "WorldSettings" }); + reflect_Minecraft_method_launchIntegratedServer_22.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).launchIntegratedServer( + (String) params.getString("folderName"), (String) params.getString("worldName"), + (WorldSettings) params.getReflective("worldSettingsIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_launchIntegratedServer_22); + + BaseData reflect_Minecraft_method_loadWorld_23 = new ModData(); + reflect_Minecraft_method_loadWorld_23.set("methodName", "loadWorld"); + reflect_Minecraft_method_loadWorld_23.set("returnType", "Minecraft"); + reflect_Minecraft_method_loadWorld_23.set("static", false); + reflect_Minecraft_method_loadWorld_23.set("argnames", new String[] { "worldClientIn" }); + reflect_Minecraft_method_loadWorld_23.set("argtypes", new String[] { "WorldClient" }); + reflect_Minecraft_method_loadWorld_23.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .loadWorld((WorldClient) params.getReflective("worldClientIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_loadWorld_23); + + BaseData reflect_Minecraft_method_loadWorld_24 = new ModData(); + reflect_Minecraft_method_loadWorld_24.set("methodName", "loadWorld"); + reflect_Minecraft_method_loadWorld_24.set("returnType", "Minecraft"); + reflect_Minecraft_method_loadWorld_24.set("static", false); + reflect_Minecraft_method_loadWorld_24.set("argnames", new String[] { "worldClientIn", "loadingMessage" }); + reflect_Minecraft_method_loadWorld_24.set("argtypes", new String[] { "WorldClient", "String" }); + reflect_Minecraft_method_loadWorld_24.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).loadWorld( + (WorldClient) params.getReflective("worldClientIn"), + (String) params.getString("loadingMessage")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_loadWorld_24); + + BaseData reflect_Minecraft_method_setDimensionAndSpawnPlayer_25 = new ModData(); + reflect_Minecraft_method_setDimensionAndSpawnPlayer_25.set("methodName", "setDimensionAndSpawnPlayer"); + reflect_Minecraft_method_setDimensionAndSpawnPlayer_25.set("returnType", "Minecraft"); + reflect_Minecraft_method_setDimensionAndSpawnPlayer_25.set("static", false); + reflect_Minecraft_method_setDimensionAndSpawnPlayer_25.set("argnames", new String[] { "dimension" }); + reflect_Minecraft_method_setDimensionAndSpawnPlayer_25.set("argtypes", new String[] { "int" }); + reflect_Minecraft_method_setDimensionAndSpawnPlayer_25.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .setDimensionAndSpawnPlayer((int) params.getInt("dimension")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_setDimensionAndSpawnPlayer_25); + + BaseData reflect_Minecraft_method_isDemo_26 = new ModData(); + reflect_Minecraft_method_isDemo_26.set("methodName", "isDemo"); + reflect_Minecraft_method_isDemo_26.set("returnType", "Minecraft"); + reflect_Minecraft_method_isDemo_26.set("static", false); + reflect_Minecraft_method_isDemo_26.set("argnames", new String[] {}); + reflect_Minecraft_method_isDemo_26.set("argtypes", new String[] {}); + reflect_Minecraft_method_isDemo_26.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isDemo(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isDemo_26); + + BaseData reflect_Minecraft_method_getNetHandler_27 = new ModData(); + reflect_Minecraft_method_getNetHandler_27.set("methodName", "getNetHandler"); + reflect_Minecraft_method_getNetHandler_27.set("returnType", "Minecraft"); + reflect_Minecraft_method_getNetHandler_27.set("static", false); + reflect_Minecraft_method_getNetHandler_27.set("argnames", new String[] {}); + reflect_Minecraft_method_getNetHandler_27.set("argtypes", new String[] {}); + reflect_Minecraft_method_getNetHandler_27.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (NetHandlerPlayClient) ((Minecraft) params.getReflective("_self")).getNetHandler(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getNetHandler_27); + + BaseData reflect_Minecraft_method_isGuiEnabled_28 = new ModData(); + reflect_Minecraft_method_isGuiEnabled_28.set("methodName", "isGuiEnabled"); + reflect_Minecraft_method_isGuiEnabled_28.set("returnType", "Minecraft"); + reflect_Minecraft_method_isGuiEnabled_28.set("static", true); + reflect_Minecraft_method_isGuiEnabled_28.set("argnames", new String[] {}); + reflect_Minecraft_method_isGuiEnabled_28.set("argtypes", new String[] {}); + reflect_Minecraft_method_isGuiEnabled_28.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) Minecraft.isGuiEnabled(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isGuiEnabled_28); + + BaseData reflect_Minecraft_method_isFancyGraphicsEnabled_29 = new ModData(); + reflect_Minecraft_method_isFancyGraphicsEnabled_29.set("methodName", "isFancyGraphicsEnabled"); + reflect_Minecraft_method_isFancyGraphicsEnabled_29.set("returnType", "Minecraft"); + reflect_Minecraft_method_isFancyGraphicsEnabled_29.set("static", true); + reflect_Minecraft_method_isFancyGraphicsEnabled_29.set("argnames", new String[] {}); + reflect_Minecraft_method_isFancyGraphicsEnabled_29.set("argtypes", new String[] {}); + reflect_Minecraft_method_isFancyGraphicsEnabled_29.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) Minecraft.isFancyGraphicsEnabled(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isFancyGraphicsEnabled_29); + + BaseData reflect_Minecraft_method_isAmbientOcclusionEnabled_30 = new ModData(); + reflect_Minecraft_method_isAmbientOcclusionEnabled_30.set("methodName", "isAmbientOcclusionEnabled"); + reflect_Minecraft_method_isAmbientOcclusionEnabled_30.set("returnType", "Minecraft"); + reflect_Minecraft_method_isAmbientOcclusionEnabled_30.set("static", true); + reflect_Minecraft_method_isAmbientOcclusionEnabled_30.set("argnames", new String[] {}); + reflect_Minecraft_method_isAmbientOcclusionEnabled_30.set("argtypes", new String[] {}); + reflect_Minecraft_method_isAmbientOcclusionEnabled_30.setCallbackBooleanWithDataArg("exec", + (BaseData params) -> { + try { + return (boolean) Minecraft.isAmbientOcclusionEnabled(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isAmbientOcclusionEnabled_30); + + BaseData reflect_Minecraft_method_middleClickMouse_31 = new ModData(); + reflect_Minecraft_method_middleClickMouse_31.set("methodName", "middleClickMouse"); + reflect_Minecraft_method_middleClickMouse_31.set("returnType", "Minecraft"); + reflect_Minecraft_method_middleClickMouse_31.set("static", false); + reflect_Minecraft_method_middleClickMouse_31.set("argnames", new String[] {}); + reflect_Minecraft_method_middleClickMouse_31.set("argtypes", new String[] {}); + reflect_Minecraft_method_middleClickMouse_31.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).middleClickMouse(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_middleClickMouse_31); + + BaseData reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32 = new ModData(); + reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32.set("methodName", + "addGraphicsAndWorldToCrashReport"); + reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32.set("returnType", "Minecraft"); + reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32.set("static", false); + reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32.set("argnames", new String[] { "theCrash" }); + reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32.set("argtypes", new String[] { "CrashReport" }); + reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32.setCallbackReflectiveWithDataArg("exec", + (BaseData params) -> { + try { + return (CrashReport) ((Minecraft) params.getReflective("_self")) + .addGraphicsAndWorldToCrashReport((CrashReport) params.getReflective("theCrash")); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_addGraphicsAndWorldToCrashReport_32); + + BaseData reflect_Minecraft_method_getMinecraft_33 = new ModData(); + reflect_Minecraft_method_getMinecraft_33.set("methodName", "getMinecraft"); + reflect_Minecraft_method_getMinecraft_33.set("returnType", "Minecraft"); + reflect_Minecraft_method_getMinecraft_33.set("static", true); + reflect_Minecraft_method_getMinecraft_33.set("argnames", new String[] {}); + reflect_Minecraft_method_getMinecraft_33.set("argtypes", new String[] {}); + reflect_Minecraft_method_getMinecraft_33.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (Minecraft) Minecraft.getMinecraft(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getMinecraft_33); + + BaseData reflect_Minecraft_method_isSnooperEnabled_34 = new ModData(); + reflect_Minecraft_method_isSnooperEnabled_34.set("methodName", "isSnooperEnabled"); + reflect_Minecraft_method_isSnooperEnabled_34.set("returnType", "Minecraft"); + reflect_Minecraft_method_isSnooperEnabled_34.set("static", false); + reflect_Minecraft_method_isSnooperEnabled_34.set("argnames", new String[] {}); + reflect_Minecraft_method_isSnooperEnabled_34.set("argtypes", new String[] {}); + reflect_Minecraft_method_isSnooperEnabled_34.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isSnooperEnabled(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isSnooperEnabled_34); + + BaseData reflect_Minecraft_method_setServerData_35 = new ModData(); + reflect_Minecraft_method_setServerData_35.set("methodName", "setServerData"); + reflect_Minecraft_method_setServerData_35.set("returnType", "Minecraft"); + reflect_Minecraft_method_setServerData_35.set("static", false); + reflect_Minecraft_method_setServerData_35.set("argnames", new String[] { "serverDataIn" }); + reflect_Minecraft_method_setServerData_35.set("argtypes", new String[] { "ServerData" }); + reflect_Minecraft_method_setServerData_35.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .setServerData((ServerData) params.getReflective("serverDataIn")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_setServerData_35); + + BaseData reflect_Minecraft_method_getCurrentServerData_36 = new ModData(); + reflect_Minecraft_method_getCurrentServerData_36.set("methodName", "getCurrentServerData"); + reflect_Minecraft_method_getCurrentServerData_36.set("returnType", "Minecraft"); + reflect_Minecraft_method_getCurrentServerData_36.set("static", false); + reflect_Minecraft_method_getCurrentServerData_36.set("argnames", new String[] {}); + reflect_Minecraft_method_getCurrentServerData_36.set("argtypes", new String[] {}); + reflect_Minecraft_method_getCurrentServerData_36.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ServerData) ((Minecraft) params.getReflective("_self")).getCurrentServerData(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getCurrentServerData_36); + + BaseData reflect_Minecraft_method_isIntegratedServerRunning_37 = new ModData(); + reflect_Minecraft_method_isIntegratedServerRunning_37.set("methodName", "isIntegratedServerRunning"); + reflect_Minecraft_method_isIntegratedServerRunning_37.set("returnType", "Minecraft"); + reflect_Minecraft_method_isIntegratedServerRunning_37.set("static", false); + reflect_Minecraft_method_isIntegratedServerRunning_37.set("argnames", new String[] {}); + reflect_Minecraft_method_isIntegratedServerRunning_37.set("argtypes", new String[] {}); + reflect_Minecraft_method_isIntegratedServerRunning_37.setCallbackBooleanWithDataArg("exec", + (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isIntegratedServerRunning(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isIntegratedServerRunning_37); + + BaseData reflect_Minecraft_method_isSingleplayer_38 = new ModData(); + reflect_Minecraft_method_isSingleplayer_38.set("methodName", "isSingleplayer"); + reflect_Minecraft_method_isSingleplayer_38.set("returnType", "Minecraft"); + reflect_Minecraft_method_isSingleplayer_38.set("static", false); + reflect_Minecraft_method_isSingleplayer_38.set("argnames", new String[] {}); + reflect_Minecraft_method_isSingleplayer_38.set("argtypes", new String[] {}); + reflect_Minecraft_method_isSingleplayer_38.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isSingleplayer(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isSingleplayer_38); + + BaseData reflect_Minecraft_method_stopIntegratedServer_39 = new ModData(); + reflect_Minecraft_method_stopIntegratedServer_39.set("methodName", "stopIntegratedServer"); + reflect_Minecraft_method_stopIntegratedServer_39.set("returnType", "Minecraft"); + reflect_Minecraft_method_stopIntegratedServer_39.set("static", true); + reflect_Minecraft_method_stopIntegratedServer_39.set("argnames", new String[] {}); + reflect_Minecraft_method_stopIntegratedServer_39.set("argtypes", new String[] {}); + reflect_Minecraft_method_stopIntegratedServer_39.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + Minecraft.stopIntegratedServer(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_stopIntegratedServer_39); + + BaseData reflect_Minecraft_method_getSystemTime_40 = new ModData(); + reflect_Minecraft_method_getSystemTime_40.set("methodName", "getSystemTime"); + reflect_Minecraft_method_getSystemTime_40.set("returnType", "Minecraft"); + reflect_Minecraft_method_getSystemTime_40.set("static", true); + reflect_Minecraft_method_getSystemTime_40.set("argnames", new String[] {}); + reflect_Minecraft_method_getSystemTime_40.set("argtypes", new String[] {}); + reflect_Minecraft_method_getSystemTime_40.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (long) Minecraft.getSystemTime(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getSystemTime_40); + + BaseData reflect_Minecraft_method_isFullScreen_41 = new ModData(); + reflect_Minecraft_method_isFullScreen_41.set("methodName", "isFullScreen"); + reflect_Minecraft_method_isFullScreen_41.set("returnType", "Minecraft"); + reflect_Minecraft_method_isFullScreen_41.set("static", false); + reflect_Minecraft_method_isFullScreen_41.set("argnames", new String[] {}); + reflect_Minecraft_method_isFullScreen_41.set("argtypes", new String[] {}); + reflect_Minecraft_method_isFullScreen_41.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isFullScreen(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isFullScreen_41); + + BaseData reflect_Minecraft_method_getSession_42 = new ModData(); + reflect_Minecraft_method_getSession_42.set("methodName", "getSession"); + reflect_Minecraft_method_getSession_42.set("returnType", "Minecraft"); + reflect_Minecraft_method_getSession_42.set("static", false); + reflect_Minecraft_method_getSession_42.set("argnames", new String[] {}); + reflect_Minecraft_method_getSession_42.set("argtypes", new String[] {}); + reflect_Minecraft_method_getSession_42.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (Session) ((Minecraft) params.getReflective("_self")).getSession(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getSession_42); + + BaseData reflect_Minecraft_method_getTextureManager_43 = new ModData(); + reflect_Minecraft_method_getTextureManager_43.set("methodName", "getTextureManager"); + reflect_Minecraft_method_getTextureManager_43.set("returnType", "Minecraft"); + reflect_Minecraft_method_getTextureManager_43.set("static", false); + reflect_Minecraft_method_getTextureManager_43.set("argnames", new String[] {}); + reflect_Minecraft_method_getTextureManager_43.set("argtypes", new String[] {}); + reflect_Minecraft_method_getTextureManager_43.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (TextureManager) ((Minecraft) params.getReflective("_self")).getTextureManager(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getTextureManager_43); + + BaseData reflect_Minecraft_method_getResourceManager_44 = new ModData(); + reflect_Minecraft_method_getResourceManager_44.set("methodName", "getResourceManager"); + reflect_Minecraft_method_getResourceManager_44.set("returnType", "Minecraft"); + reflect_Minecraft_method_getResourceManager_44.set("static", false); + reflect_Minecraft_method_getResourceManager_44.set("argnames", new String[] {}); + reflect_Minecraft_method_getResourceManager_44.set("argtypes", new String[] {}); + reflect_Minecraft_method_getResourceManager_44.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (IResourceManager) ((Minecraft) params.getReflective("_self")).getResourceManager(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getResourceManager_44); + + BaseData reflect_Minecraft_method_getResourcePackRepository_45 = new ModData(); + reflect_Minecraft_method_getResourcePackRepository_45.set("methodName", "getResourcePackRepository"); + reflect_Minecraft_method_getResourcePackRepository_45.set("returnType", "Minecraft"); + reflect_Minecraft_method_getResourcePackRepository_45.set("static", false); + reflect_Minecraft_method_getResourcePackRepository_45.set("argnames", new String[] {}); + reflect_Minecraft_method_getResourcePackRepository_45.set("argtypes", new String[] {}); + reflect_Minecraft_method_getResourcePackRepository_45.setCallbackReflectiveWithDataArg("exec", + (BaseData params) -> { + try { + return (ResourcePackRepository) ((Minecraft) params.getReflective("_self")) + .getResourcePackRepository(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getResourcePackRepository_45); + + BaseData reflect_Minecraft_method_getLanguageManager_46 = new ModData(); + reflect_Minecraft_method_getLanguageManager_46.set("methodName", "getLanguageManager"); + reflect_Minecraft_method_getLanguageManager_46.set("returnType", "Minecraft"); + reflect_Minecraft_method_getLanguageManager_46.set("static", false); + reflect_Minecraft_method_getLanguageManager_46.set("argnames", new String[] {}); + reflect_Minecraft_method_getLanguageManager_46.set("argtypes", new String[] {}); + reflect_Minecraft_method_getLanguageManager_46.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (LanguageManager) ((Minecraft) params.getReflective("_self")).getLanguageManager(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getLanguageManager_46); + + BaseData reflect_Minecraft_method_getTextureMapBlocks_47 = new ModData(); + reflect_Minecraft_method_getTextureMapBlocks_47.set("methodName", "getTextureMapBlocks"); + reflect_Minecraft_method_getTextureMapBlocks_47.set("returnType", "Minecraft"); + reflect_Minecraft_method_getTextureMapBlocks_47.set("static", false); + reflect_Minecraft_method_getTextureMapBlocks_47.set("argnames", new String[] {}); + reflect_Minecraft_method_getTextureMapBlocks_47.set("argtypes", new String[] {}); + reflect_Minecraft_method_getTextureMapBlocks_47.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (TextureMap) ((Minecraft) params.getReflective("_self")).getTextureMapBlocks(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getTextureMapBlocks_47); + + BaseData reflect_Minecraft_method_isJava64bit_48 = new ModData(); + reflect_Minecraft_method_isJava64bit_48.set("methodName", "isJava64bit"); + reflect_Minecraft_method_isJava64bit_48.set("returnType", "Minecraft"); + reflect_Minecraft_method_isJava64bit_48.set("static", false); + reflect_Minecraft_method_isJava64bit_48.set("argnames", new String[] {}); + reflect_Minecraft_method_isJava64bit_48.set("argtypes", new String[] {}); + reflect_Minecraft_method_isJava64bit_48.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isJava64bit(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isJava64bit_48); + + BaseData reflect_Minecraft_method_isGamePaused_49 = new ModData(); + reflect_Minecraft_method_isGamePaused_49.set("methodName", "isGamePaused"); + reflect_Minecraft_method_isGamePaused_49.set("returnType", "Minecraft"); + reflect_Minecraft_method_isGamePaused_49.set("static", false); + reflect_Minecraft_method_isGamePaused_49.set("argnames", new String[] {}); + reflect_Minecraft_method_isGamePaused_49.set("argtypes", new String[] {}); + reflect_Minecraft_method_isGamePaused_49.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).isGamePaused(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_isGamePaused_49); + + BaseData reflect_Minecraft_method_getSoundHandler_50 = new ModData(); + reflect_Minecraft_method_getSoundHandler_50.set("methodName", "getSoundHandler"); + reflect_Minecraft_method_getSoundHandler_50.set("returnType", "Minecraft"); + reflect_Minecraft_method_getSoundHandler_50.set("static", false); + reflect_Minecraft_method_getSoundHandler_50.set("argnames", new String[] {}); + reflect_Minecraft_method_getSoundHandler_50.set("argtypes", new String[] {}); + reflect_Minecraft_method_getSoundHandler_50.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (SoundHandler) ((Minecraft) params.getReflective("_self")).getSoundHandler(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getSoundHandler_50); + + BaseData reflect_Minecraft_method_dispatchKeypresses_51 = new ModData(); + reflect_Minecraft_method_dispatchKeypresses_51.set("methodName", "dispatchKeypresses"); + reflect_Minecraft_method_dispatchKeypresses_51.set("returnType", "Minecraft"); + reflect_Minecraft_method_dispatchKeypresses_51.set("static", false); + reflect_Minecraft_method_dispatchKeypresses_51.set("argnames", new String[] {}); + reflect_Minecraft_method_dispatchKeypresses_51.set("argtypes", new String[] {}); + reflect_Minecraft_method_dispatchKeypresses_51.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).dispatchKeypresses(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_dispatchKeypresses_51); + + BaseData reflect_Minecraft_method_getRenderViewEntity_52 = new ModData(); + reflect_Minecraft_method_getRenderViewEntity_52.set("methodName", "getRenderViewEntity"); + reflect_Minecraft_method_getRenderViewEntity_52.set("returnType", "Minecraft"); + reflect_Minecraft_method_getRenderViewEntity_52.set("static", false); + reflect_Minecraft_method_getRenderViewEntity_52.set("argnames", new String[] {}); + reflect_Minecraft_method_getRenderViewEntity_52.set("argtypes", new String[] {}); + reflect_Minecraft_method_getRenderViewEntity_52.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (Entity) ((Minecraft) params.getReflective("_self")).getRenderViewEntity(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getRenderViewEntity_52); + + BaseData reflect_Minecraft_method_setRenderViewEntity_53 = new ModData(); + reflect_Minecraft_method_setRenderViewEntity_53.set("methodName", "setRenderViewEntity"); + reflect_Minecraft_method_setRenderViewEntity_53.set("returnType", "Minecraft"); + reflect_Minecraft_method_setRenderViewEntity_53.set("static", false); + reflect_Minecraft_method_setRenderViewEntity_53.set("argnames", new String[] { "viewingEntity" }); + reflect_Minecraft_method_setRenderViewEntity_53.set("argtypes", new String[] { "Entity" }); + reflect_Minecraft_method_setRenderViewEntity_53.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .setRenderViewEntity((Entity) params.getReflective("viewingEntity")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_setRenderViewEntity_53); + + BaseData reflect_Minecraft_method_addScheduledTask_54 = new ModData(); + reflect_Minecraft_method_addScheduledTask_54.set("methodName", "addScheduledTask"); + reflect_Minecraft_method_addScheduledTask_54.set("returnType", "Minecraft"); + reflect_Minecraft_method_addScheduledTask_54.set("static", false); + reflect_Minecraft_method_addScheduledTask_54.set("argnames", new String[] { "runnableToSchedule" }); + reflect_Minecraft_method_addScheduledTask_54.set("argtypes", new String[] { "Runnable" }); + reflect_Minecraft_method_addScheduledTask_54.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")) + .addScheduledTask((Runnable) params.getReflective("runnableToSchedule")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_addScheduledTask_54); + + BaseData reflect_Minecraft_method_getBlockRendererDispatcher_55 = new ModData(); + reflect_Minecraft_method_getBlockRendererDispatcher_55.set("methodName", "getBlockRendererDispatcher"); + reflect_Minecraft_method_getBlockRendererDispatcher_55.set("returnType", "Minecraft"); + reflect_Minecraft_method_getBlockRendererDispatcher_55.set("static", false); + reflect_Minecraft_method_getBlockRendererDispatcher_55.set("argnames", new String[] {}); + reflect_Minecraft_method_getBlockRendererDispatcher_55.set("argtypes", new String[] {}); + reflect_Minecraft_method_getBlockRendererDispatcher_55.setCallbackReflectiveWithDataArg("exec", + (BaseData params) -> { + try { + return (BlockRendererDispatcher) ((Minecraft) params.getReflective("_self")) + .getBlockRendererDispatcher(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getBlockRendererDispatcher_55); + + BaseData reflect_Minecraft_method_getRenderManager_56 = new ModData(); + reflect_Minecraft_method_getRenderManager_56.set("methodName", "getRenderManager"); + reflect_Minecraft_method_getRenderManager_56.set("returnType", "Minecraft"); + reflect_Minecraft_method_getRenderManager_56.set("static", false); + reflect_Minecraft_method_getRenderManager_56.set("argnames", new String[] {}); + reflect_Minecraft_method_getRenderManager_56.set("argtypes", new String[] {}); + reflect_Minecraft_method_getRenderManager_56.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (RenderManager) ((Minecraft) params.getReflective("_self")).getRenderManager(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getRenderManager_56); + + BaseData reflect_Minecraft_method_getRenderItem_57 = new ModData(); + reflect_Minecraft_method_getRenderItem_57.set("methodName", "getRenderItem"); + reflect_Minecraft_method_getRenderItem_57.set("returnType", "Minecraft"); + reflect_Minecraft_method_getRenderItem_57.set("static", false); + reflect_Minecraft_method_getRenderItem_57.set("argnames", new String[] {}); + reflect_Minecraft_method_getRenderItem_57.set("argtypes", new String[] {}); + reflect_Minecraft_method_getRenderItem_57.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (RenderItem) ((Minecraft) params.getReflective("_self")).getRenderItem(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getRenderItem_57); + + BaseData reflect_Minecraft_method_getItemRenderer_58 = new ModData(); + reflect_Minecraft_method_getItemRenderer_58.set("methodName", "getItemRenderer"); + reflect_Minecraft_method_getItemRenderer_58.set("returnType", "Minecraft"); + reflect_Minecraft_method_getItemRenderer_58.set("static", false); + reflect_Minecraft_method_getItemRenderer_58.set("argnames", new String[] {}); + reflect_Minecraft_method_getItemRenderer_58.set("argtypes", new String[] {}); + reflect_Minecraft_method_getItemRenderer_58.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ItemRenderer) ((Minecraft) params.getReflective("_self")).getItemRenderer(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getItemRenderer_58); + + BaseData reflect_Minecraft_method_getDebugFPS_59 = new ModData(); + reflect_Minecraft_method_getDebugFPS_59.set("methodName", "getDebugFPS"); + reflect_Minecraft_method_getDebugFPS_59.set("returnType", "Minecraft"); + reflect_Minecraft_method_getDebugFPS_59.set("static", true); + reflect_Minecraft_method_getDebugFPS_59.set("argnames", new String[] {}); + reflect_Minecraft_method_getDebugFPS_59.set("argtypes", new String[] {}); + reflect_Minecraft_method_getDebugFPS_59.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) Minecraft.getDebugFPS(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getDebugFPS_59); + + BaseData reflect_Minecraft_method_func_181539_aj_60 = new ModData(); + reflect_Minecraft_method_func_181539_aj_60.set("methodName", "func_181539_aj"); + reflect_Minecraft_method_func_181539_aj_60.set("returnType", "Minecraft"); + reflect_Minecraft_method_func_181539_aj_60.set("static", false); + reflect_Minecraft_method_func_181539_aj_60.set("argnames", new String[] {}); + reflect_Minecraft_method_func_181539_aj_60.set("argtypes", new String[] {}); + reflect_Minecraft_method_func_181539_aj_60.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (FrameTimer) ((Minecraft) params.getReflective("_self")).func_181539_aj(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_func_181539_aj_60); + + BaseData reflect_Minecraft_method_func_181540_al_61 = new ModData(); + reflect_Minecraft_method_func_181540_al_61.set("methodName", "func_181540_al"); + reflect_Minecraft_method_func_181540_al_61.set("returnType", "Minecraft"); + reflect_Minecraft_method_func_181540_al_61.set("static", false); + reflect_Minecraft_method_func_181540_al_61.set("argnames", new String[] {}); + reflect_Minecraft_method_func_181540_al_61.set("argtypes", new String[] {}); + reflect_Minecraft_method_func_181540_al_61.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).func_181540_al(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_func_181540_al_61); + + BaseData reflect_Minecraft_method_func_181537_a_62 = new ModData(); + reflect_Minecraft_method_func_181537_a_62.set("methodName", "func_181537_a"); + reflect_Minecraft_method_func_181537_a_62.set("returnType", "Minecraft"); + reflect_Minecraft_method_func_181537_a_62.set("static", false); + reflect_Minecraft_method_func_181537_a_62.set("argnames", new String[] { "parFlag" }); + reflect_Minecraft_method_func_181537_a_62.set("argtypes", new String[] { "boolean" }); + reflect_Minecraft_method_func_181537_a_62.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).func_181537_a((boolean) params.getBoolean("parFlag")); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_func_181537_a_62); + + BaseData reflect_Minecraft_method_getGLMaximumTextureSize_63 = new ModData(); + reflect_Minecraft_method_getGLMaximumTextureSize_63.set("methodName", "getGLMaximumTextureSize"); + reflect_Minecraft_method_getGLMaximumTextureSize_63.set("returnType", "Minecraft"); + reflect_Minecraft_method_getGLMaximumTextureSize_63.set("static", true); + reflect_Minecraft_method_getGLMaximumTextureSize_63.set("argnames", new String[] {}); + reflect_Minecraft_method_getGLMaximumTextureSize_63.set("argtypes", new String[] {}); + reflect_Minecraft_method_getGLMaximumTextureSize_63.setCallbackIntWithDataArg("exec", (BaseData params) -> { + try { + return (int) Minecraft.getGLMaximumTextureSize(); + } catch (Exception _exception_reflect_) { + return 0; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getGLMaximumTextureSize_63); + + BaseData reflect_Minecraft_method_areKeysLocked_64 = new ModData(); + reflect_Minecraft_method_areKeysLocked_64.set("methodName", "areKeysLocked"); + reflect_Minecraft_method_areKeysLocked_64.set("returnType", "Minecraft"); + reflect_Minecraft_method_areKeysLocked_64.set("static", false); + reflect_Minecraft_method_areKeysLocked_64.set("argnames", new String[] {}); + reflect_Minecraft_method_areKeysLocked_64.set("argtypes", new String[] {}); + reflect_Minecraft_method_areKeysLocked_64.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).areKeysLocked(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_areKeysLocked_64); + + BaseData reflect_Minecraft_method_getModelManager_65 = new ModData(); + reflect_Minecraft_method_getModelManager_65.set("methodName", "getModelManager"); + reflect_Minecraft_method_getModelManager_65.set("returnType", "Minecraft"); + reflect_Minecraft_method_getModelManager_65.set("static", false); + reflect_Minecraft_method_getModelManager_65.set("argnames", new String[] {}); + reflect_Minecraft_method_getModelManager_65.set("argtypes", new String[] {}); + reflect_Minecraft_method_getModelManager_65.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ModelManager) ((Minecraft) params.getReflective("_self")).getModelManager(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getModelManager_65); + + BaseData reflect_Minecraft_method_getSaveLoader_66 = new ModData(); + reflect_Minecraft_method_getSaveLoader_66.set("methodName", "getSaveLoader"); + reflect_Minecraft_method_getSaveLoader_66.set("returnType", "Minecraft"); + reflect_Minecraft_method_getSaveLoader_66.set("static", false); + reflect_Minecraft_method_getSaveLoader_66.set("argnames", new String[] {}); + reflect_Minecraft_method_getSaveLoader_66.set("argtypes", new String[] {}); + reflect_Minecraft_method_getSaveLoader_66.setCallbackReflectiveWithDataArg("exec", (BaseData params) -> { + try { + return (ISaveFormat) ((Minecraft) params.getReflective("_self")).getSaveLoader(); + } catch (Exception _exception_reflect_) { + return null; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getSaveLoader_66); + + BaseData reflect_Minecraft_method_clearTitles_67 = new ModData(); + reflect_Minecraft_method_clearTitles_67.set("methodName", "clearTitles"); + reflect_Minecraft_method_clearTitles_67.set("returnType", "Minecraft"); + reflect_Minecraft_method_clearTitles_67.set("static", false); + reflect_Minecraft_method_clearTitles_67.set("argnames", new String[] {}); + reflect_Minecraft_method_clearTitles_67.set("argtypes", new String[] {}); + reflect_Minecraft_method_clearTitles_67.setCallbackVoidWithDataArg("exec", (BaseData params) -> { + try { + ((Minecraft) params.getReflective("_self")).clearTitles(); + } catch (Exception _exception_reflect_) { + return; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_clearTitles_67); + + BaseData reflect_Minecraft_method_getEnableFNAWSkins_68 = new ModData(); + reflect_Minecraft_method_getEnableFNAWSkins_68.set("methodName", "getEnableFNAWSkins"); + reflect_Minecraft_method_getEnableFNAWSkins_68.set("returnType", "Minecraft"); + reflect_Minecraft_method_getEnableFNAWSkins_68.set("static", false); + reflect_Minecraft_method_getEnableFNAWSkins_68.set("argnames", new String[] {}); + reflect_Minecraft_method_getEnableFNAWSkins_68.set("argtypes", new String[] {}); + reflect_Minecraft_method_getEnableFNAWSkins_68.setCallbackBooleanWithDataArg("exec", (BaseData params) -> { + try { + return (boolean) ((Minecraft) params.getReflective("_self")).getEnableFNAWSkins(); + } catch (Exception _exception_reflect_) { + return false; + } + }); + + reflect_Minecraft_methods.add(reflect_Minecraft_method_getEnableFNAWSkins_68); + + BaseData[] reflect_Minecraft_methods_arr = new BaseData[reflect_Minecraft_methods.size()]; + for (int i = 0; i < reflect_Minecraft_methods_arr.length; i++) { + reflect_Minecraft_methods_arr[i] = reflect_Minecraft_methods.get(i); + } + + reflect_Minecraft.set("constructors", reflect_Minecraft_constructors_arr); + reflect_Minecraft.set("methods", reflect_Minecraft_methods_arr); + reflect_Minecraft.set("className", "Minecraft"); + reflect_Minecraft.set("classId", "net.minecraft.client.Minecraft"); + reflect_Minecraft.set("class", Minecraft.class); + reflectProfiles.add(reflect_Minecraft); + + BaseData[] reflectProfilesArr = new BaseData[reflectProfiles.size()]; + for (int i = 0; i < reflectProfilesArr.length; i++) { + reflectProfilesArr[i] = reflectProfiles.get(i); + } + plReflectGlobal.set("classes", reflectProfilesArr); + + plReflectGlobal.setCallbackClassFinder("getClassByName", (String className) -> { + for (int i = 0; i < reflectProfilesArr.length; i++) { + if (reflectProfilesArr[i].getString("className").equals(className)) { + return reflectProfilesArr[i]; + } + } + return null; + }); + + plReflectGlobal.setCallbackClassFinder("getClassById", (String classId) -> { + for (int i = 0; i < reflectProfilesArr.length; i++) { + if (reflectProfilesArr[i].getString("classId").equals(classId)) { + return reflectProfilesArr[i]; + } + } + return null; + }); + + return plReflectGlobal; + } +} \ No newline at end of file diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java index 6f40077..956ae1e 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java @@ -49,6 +49,10 @@ public class Display { PlatformInput.setVSync(enable); } + public static boolean isVSyncSupported() { + return PlatformInput.isVSyncSupported(); + } + public static void update() { PlatformInput.update(); } 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 a87f0c2..60a0031 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java @@ -1,5 +1,6 @@ package net.lax1dude.eaglercraft.v1_8; +import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; import java.math.BigInteger; import static net.eaglerforge.api.ModLoader.returntotalloadedmods; @@ -12,7 +13,7 @@ public class EaglercraftVersion { /// Customize these to fit your fork: public static final String projectForkName = "EaglerForge"; - public static final String projectForkVersion = "v1.3.1"; + public static final String projectForkVersion = "v1.3.2"; public static final String projectForkVendor = "radmanplays"; public static final String projectForkURL = "https://github.com/eaglerforge/EaglerForge"; @@ -22,7 +23,7 @@ public class EaglercraftVersion { public static final String projectOriginName = "EaglercraftX"; public static final String projectOriginAuthor = "lax1dude"; public static final String projectOriginRevision = "1.8"; - public static final String projectOriginVersion = "u29"; + public static final String projectOriginVersion = "u31"; public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace @@ -43,9 +44,20 @@ public class EaglercraftVersion { // Miscellaneous variables: - public static int loadedmods = returntotalloadedmods(); public static final String mainMenuStringA = "Minecraft* 1.8.8"; - public static String mainMenuStringB = projectForkName + " " + projectForkVersion + " (" + loadedmods + " Mods loaded)"; + public static String getMainMenuStringB() { + int loadedmods = returntotalloadedmods(); + String mainMenuStringB = projectForkName + " " + projectForkVersion; + if(!PlatformRuntime.isDebugRuntime()) { + if(loadedmods == 1) { + mainMenuStringB = mainMenuStringB + " (" + loadedmods + " Mod loaded)"; + } else { + mainMenuStringB = mainMenuStringB + " (" + loadedmods + " Mods loaded)"; + } + } + + return mainMenuStringB; + } public static final String mainMenuStringC = ""; public static final String mainMenuStringD = "Resources Copyright Mojang AB"; @@ -61,4 +73,6 @@ public class EaglercraftVersion { public static final boolean forceDemoMode = false; + public static final String localStorageNamespace = "_eaglercraftX"; + } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapter.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapter.java index 684275c..d2e0492 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapter.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapter.java @@ -69,4 +69,11 @@ public interface IClientConfigAdapter { boolean isEnableSignatureBadge(); boolean isAllowVoiceClient(); + + boolean isAllowFNAWSkins(); + + String getLocalStorageNamespace(); + + IClientConfigAdapterHooks getHooks(); + } diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsServersArray.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapterHooks.java similarity index 73% rename from sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsServersArray.java rename to sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapterHooks.java index 3299302..397f8b5 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsServersArray.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapterHooks.java @@ -1,8 +1,4 @@ -package net.lax1dude.eaglercraft.v1_8.internal.teavm.opts; - -import org.teavm.jso.JSIndexer; -import org.teavm.jso.JSObject; -import org.teavm.jso.JSProperty; +package net.lax1dude.eaglercraft.v1_8.internal; /** * Copyright (c) 2024 lax1dude. All Rights Reserved. @@ -19,12 +15,10 @@ import org.teavm.jso.JSProperty; * POSSIBILITY OF SUCH DAMAGE. * */ -public interface JSEaglercraftXOptsServersArray extends JSObject { +public interface IClientConfigAdapterHooks { - @JSIndexer - JSEaglercraftXOptsServer get(int idx); + void callLocalStorageSavedHook(String key, String base64); - @JSProperty - int getLength(); + String callLocalStorageLoadHook(String key); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/BlockVertexIDs.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/BlockVertexIDs.java index fd41992..2a00144 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/BlockVertexIDs.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/BlockVertexIDs.java @@ -13,6 +13,21 @@ import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.util.ResourceLocation; +/** + * Copyright (c) 2023 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ public class BlockVertexIDs implements IResourceManagerReloadListener { private static final Logger logger = LogManager.getLogger("BlockVertexIDsCSV"); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/EaglerSkinTexture.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/EaglerSkinTexture.java index 2b746c1..bea6cf6 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/EaglerSkinTexture.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/EaglerSkinTexture.java @@ -61,7 +61,7 @@ public class EaglerSkinTexture implements ITextureObject { } System.arraycopy(pixels, 0, this.pixels, 0, pixels.length); if(textureId != -1) { - TextureUtil.uploadTextureImageAllocate(textureId, new ImageData(width, height, pixels, true), false, false); + TextureUtil.uploadTextureImageSub(textureId, new ImageData(width, height, pixels, true), 0, 0, false, false); } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java index fe319bc..d7343b1 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java @@ -73,14 +73,20 @@ public class GuiScreenEditProfile extends GuiScreen { } private void updateOptions() { + DefaultSkins[] arr = DefaultSkins.defaultSkinsMap; + if(!EagRuntime.getConfiguration().isAllowFNAWSkins()) { + DefaultSkins[] arrNoFNAW = new DefaultSkins[arr.length - 5]; + System.arraycopy(arr, 0, arrNoFNAW, 0, arrNoFNAW.length); + arr = arrNoFNAW; + } int numCustom = EaglerProfile.customSkins.size(); - String[] n = new String[numCustom + DefaultSkins.defaultSkinsMap.length]; + String[] n = new String[numCustom + arr.length]; for(int i = 0; i < numCustom; ++i) { n[i] = EaglerProfile.customSkins.get(i).name; } - int numDefault = DefaultSkins.defaultSkinsMap.length; + int numDefault = arr.length; for(int j = 0; j < numDefault; ++j) { - n[numCustom + j] = DefaultSkins.defaultSkinsMap[j].name; + n[numCustom + j] = arr[j].name; } dropDownOptions = n; } @@ -106,6 +112,10 @@ public class GuiScreenEditProfile extends GuiScreen { GlStateManager.translate(skinX + 2, skinY - 9, 0.0f); GlStateManager.scale(0.75f, 0.75f, 0.75f); + if(selectedSlot > dropDownOptions.length - 1) { + selectedSlot = 0; + } + int numberOfCustomSkins = EaglerProfile.customSkins.size(); int skid = selectedSlot - numberOfCustomSkins; SkinModel selectedSkinModel = skid < 0 ? EaglerProfile.customSkins.get(selectedSlot).model : DefaultSkins.getSkinFromId(skid).model; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportExportProfile.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportExportProfile.java index e709d2d..eed4aae 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportExportProfile.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportExportProfile.java @@ -56,11 +56,15 @@ public class GuiScreenImportExportProfile extends GuiScreen { FileChooserResult result = EagRuntime.getFileChooserResult(); if(result != null) { mc.loadingScreen.eaglerShow(I18n.format("settingsBackup.importing.1"), "settingsBackup.importing.2"); + ProfileImporter importer = new ProfileImporter(result.fileData); try { - ProfileImporter importer = new ProfileImporter(result.fileData); importer.readHeader(); mc.displayGuiScreen(new GuiScreenImportProfile(importer, back)); }catch(IOException ex) { + try { + importer.close(); + } catch (IOException e) { + } EagRuntime.debugPrintStackTrace(ex); mc.displayGuiScreen(new GuiScreenGenericErrorMessage("settingsBackup.importing.failed.1", "settingsBackup.importing.failed.2", back)); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportProfile.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportProfile.java index 7eecc81..825974a 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportProfile.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenImportProfile.java @@ -62,6 +62,14 @@ public class GuiScreenImportProfile extends GuiScreen { this.buttonList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 140, I18n.format("gui.cancel"))); } + @Override + public void onGuiClosed() { + try { + importer.close(); + } catch (IOException e) { + } + } + protected void actionPerformed(GuiButton par1GuiButton) { if(par1GuiButton.id == 0) { if(!doImportProfile && !doImportSettings && !doImportServers && !doImportResourcePacks) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java index c309239..7686683 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java @@ -69,98 +69,97 @@ public class ProfileExporter { osb.write(new byte[]{(byte)255,(byte)255,(byte)255,(byte)255}); // this will be replaced with the file count osb.write('G'); - OutputStream os = EaglerZLIB.newGZIPOutputStream(osb); - - os.write(new byte[]{(byte)72,(byte)69,(byte)65,(byte)68}); // HEAD - os.write(new byte[]{(byte)9,(byte)102,(byte)105,(byte)108,(byte)101,(byte)45,(byte)116,(byte)121, - (byte)112,(byte)101}); // 9 + file-type - os.write(new byte[]{(byte)0,(byte)0,(byte)0,(byte)14,(byte)101,(byte)112,(byte)107,(byte)47,(byte)112,(byte)114,(byte)111, - (byte)102,(byte)105,(byte)108,(byte)101,(byte)49,(byte)56,(byte)56}); // 14 + epk/profile188 - os.write('>'); - - os.write(new byte[]{(byte)72,(byte)69,(byte)65,(byte)68}); // HEAD - os.write(new byte[]{(byte)12,(byte)102,(byte)105,(byte)108,(byte)101,(byte)45,(byte)101,(byte)120, - (byte)112,(byte)111,(byte)114,(byte)116,(byte)115,(byte)0,(byte)0,(byte)0,(byte)1}); // 12 + file-exports + 1 - os.write((doExportProfile ? 1 : 0) | (doExportSettings ? 2 : 0) | (doExportServers ? 4 : 0) | (doExportResourcePacks ? 8 : 0)); - os.write('>'); - int fileCount = 2; - - if(doExportProfile) { - byte[] profileData = EaglerProfile.write(); - if(profileData == null) { - throw new IOException("Could not write profile data!"); - } - exportFileToEPK("_eaglercraftX.p", profileData, os); - ++fileCount; - } - - if(doExportSettings) { - logger.info("Exporting game settings..."); - byte[] gameSettings = Minecraft.getMinecraft().gameSettings.writeOptions(); - if(gameSettings == null) { - throw new IOException("Could not write game settings!"); - } - exportFileToEPK("_eaglercraftX.g", gameSettings, os); - ++fileCount; - logger.info("Exporting relay settings..."); - byte[] relays = RelayManager.relayManager.write(); - if(relays == null) { - throw new IOException("Could not write relay settings!"); - } - exportFileToEPK("_eaglercraftX.r", relays, os); - ++fileCount; - } - - if(doExportServers) { - logger.info("Exporting server list..."); - byte[] servers = ServerList.getServerList().writeServerList(); - if(servers == null) { - throw new IOException("Could not write server list!"); - } - exportFileToEPK("_eaglercraftX.s", servers, os); - ++fileCount; - } - - logger.info("Exporting certificates..."); - UpdateCertificate cert = UpdateService.getClientCertificate(); - if(cert != null) { - exportFileToEPK("certs/main.cert", cert.rawCertData, os); - ++fileCount; - } - Collection updatesExport = UpdateService.getAvailableUpdates(); - int cc = 0; - for(UpdateCertificate cert2 : updatesExport) { - exportFileToEPK("certs/c" + (cc++) + ".cert", cert2.rawCertData, os); - ++fileCount; - } - - if(doExportResourcePacks) { - logger.info("Exporting resource packs..."); - byte[] packManifest = (new VFile2(EaglerFolderResourcePack.RESOURCE_PACKS + "/manifest.json")).getAllBytes(); - if(packManifest != null) { - exportFileToEPK(EaglerFolderResourcePack.RESOURCE_PACKS + "/manifest.json", packManifest, os); + try(OutputStream os = EaglerZLIB.newGZIPOutputStream(osb)) { + os.write(new byte[]{(byte)72,(byte)69,(byte)65,(byte)68}); // HEAD + os.write(new byte[]{(byte)9,(byte)102,(byte)105,(byte)108,(byte)101,(byte)45,(byte)116,(byte)121, + (byte)112,(byte)101}); // 9 + file-type + os.write(new byte[]{(byte)0,(byte)0,(byte)0,(byte)14,(byte)101,(byte)112,(byte)107,(byte)47,(byte)112,(byte)114,(byte)111, + (byte)102,(byte)105,(byte)108,(byte)101,(byte)49,(byte)56,(byte)56}); // 14 + epk/profile188 + os.write('>'); + + os.write(new byte[]{(byte)72,(byte)69,(byte)65,(byte)68}); // HEAD + os.write(new byte[]{(byte)12,(byte)102,(byte)105,(byte)108,(byte)101,(byte)45,(byte)101,(byte)120, + (byte)112,(byte)111,(byte)114,(byte)116,(byte)115,(byte)0,(byte)0,(byte)0,(byte)1}); // 12 + file-exports + 1 + os.write((doExportProfile ? 1 : 0) | (doExportSettings ? 2 : 0) | (doExportServers ? 4 : 0) | (doExportResourcePacks ? 8 : 0)); + os.write('>'); + + + if(doExportProfile) { + byte[] profileData = EaglerProfile.write(); + if(profileData == null) { + throw new IOException("Could not write profile data!"); + } + exportFileToEPK("_eaglercraftX.p", profileData, os); ++fileCount; - VFile2 baseDir = new VFile2(EaglerFolderResourcePack.RESOURCE_PACKS); - List files = baseDir.listFiles(true); - logger.info("({} files to export)", files.size()); - for(int i = 0, l = files.size(); i < l; ++i) { - VFile2 f = files.get(i); - if(f.getPath().equals(EaglerFolderResourcePack.RESOURCE_PACKS + "/manifest.json")) { - continue; - } - exportFileToEPK(f.getPath(), f.getAllBytes(), os); + } + + if(doExportSettings) { + logger.info("Exporting game settings..."); + byte[] gameSettings = Minecraft.getMinecraft().gameSettings.writeOptions(); + if(gameSettings == null) { + throw new IOException("Could not write game settings!"); + } + exportFileToEPK("_eaglercraftX.g", gameSettings, os); + ++fileCount; + logger.info("Exporting relay settings..."); + byte[] relays = RelayManager.relayManager.write(); + if(relays == null) { + throw new IOException("Could not write relay settings!"); + } + exportFileToEPK("_eaglercraftX.r", relays, os); + ++fileCount; + } + + if(doExportServers) { + logger.info("Exporting server list..."); + byte[] servers = ServerList.getServerList().writeServerList(); + if(servers == null) { + throw new IOException("Could not write server list!"); + } + exportFileToEPK("_eaglercraftX.s", servers, os); + ++fileCount; + } + + logger.info("Exporting certificates..."); + UpdateCertificate cert = UpdateService.getClientCertificate(); + if(cert != null) { + exportFileToEPK("certs/main.cert", cert.rawCertData, os); + ++fileCount; + } + Collection updatesExport = UpdateService.getAvailableUpdates(); + int cc = 0; + for(UpdateCertificate cert2 : updatesExport) { + exportFileToEPK("certs/c" + (cc++) + ".cert", cert2.rawCertData, os); + ++fileCount; + } + + if(doExportResourcePacks) { + logger.info("Exporting resource packs..."); + byte[] packManifest = (new VFile2(EaglerFolderResourcePack.RESOURCE_PACKS + "/manifest.json")).getAllBytes(); + if(packManifest != null) { + exportFileToEPK(EaglerFolderResourcePack.RESOURCE_PACKS + "/manifest.json", packManifest, os); ++fileCount; - if(i > 0 && i % 100 == 0) { - logger.info("Exported {} files", i); + VFile2 baseDir = new VFile2(EaglerFolderResourcePack.RESOURCE_PACKS); + List files = baseDir.listFiles(true); + logger.info("({} files to export)", files.size()); + for(int i = 0, l = files.size(); i < l; ++i) { + VFile2 f = files.get(i); + if(f.getPath().equals(EaglerFolderResourcePack.RESOURCE_PACKS + "/manifest.json")) { + continue; + } + exportFileToEPK(f.getPath(), f.getAllBytes(), os); + ++fileCount; + if(i > 0 && i % 100 == 0) { + logger.info("Exported {} files", i); + } } } } + + os.write(new byte[]{(byte)69,(byte)78,(byte)68,(byte)36}); // END$ } - os.write(new byte[]{(byte)69,(byte)78,(byte)68,(byte)36}); // END$ - os.close(); - osb.write(new byte[]{(byte)58,(byte)58,(byte)58,(byte)89,(byte)69,(byte)69,(byte)58,(byte)62}); // :::YEE:> byte[] ret = osb.toByteArray(); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileImporter.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileImporter.java index e626b69..4758b1c 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileImporter.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileImporter.java @@ -1,5 +1,6 @@ package net.lax1dude.eaglercraft.v1_8.profile; +import java.io.Closeable; import java.io.IOException; import net.lax1dude.eaglercraft.v1_8.EagRuntime; @@ -29,7 +30,7 @@ import net.minecraft.client.multiplayer.ServerList; * POSSIBILITY OF SUCH DAMAGE. * */ -public class ProfileImporter { +public class ProfileImporter implements Closeable { private static final Logger logger = LogManager.getLogger("ProfileImporter"); @@ -148,4 +149,9 @@ public class ProfileImporter { } logger.info("Import complete!"); } + + @Override + public void close() throws IOException { + epkDecompiler.close(); + } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/RenderHighPoly.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/RenderHighPoly.java index 035d68e..515b1ea 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/RenderHighPoly.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/RenderHighPoly.java @@ -468,4 +468,13 @@ public class RenderHighPoly extends RenderPlayer { GlStateManager.popMatrix(); } } + + public void renderLivingAt(AbstractClientPlayer abstractclientplayer, double d0, double d1, double d2) { + if (abstractclientplayer.isEntityAlive() && abstractclientplayer.isPlayerSleeping()) { + super.renderLivingAt(abstractclientplayer, d0 - (double) abstractclientplayer.renderOffsetX, + d1 - (double) abstractclientplayer.renderOffsetY, d2 - (double) abstractclientplayer.renderOffsetZ); + } else { + super.renderLivingAt(abstractclientplayer, d0, d1, d2); + } + } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinModel.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinModel.java index 8dbb655..735deea 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinModel.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinModel.java @@ -46,7 +46,7 @@ public enum SkinModel { private SkinModel(int id, HighPolySkin highPoly) { this.id = id; this.width = 256; - this.height = 128; + this.height = 256; this.profileSkinType = "eagler"; this.sanitize = true; this.highPoly = highPoly; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiShareToLan.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiShareToLan.java index 9190a4e..cbf896f 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiShareToLan.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiShareToLan.java @@ -156,7 +156,6 @@ public class GuiShareToLan extends GuiScreen { this.mc.ingameGUI.getChatGUI().printChatMessage(new ChatComponentText(I18n.format("lanServer.opened") .replace("$relay$", LANServerController.getCurrentURI()).replace("$code$", code))); } else { - SingleplayerServerController.configureLAN(mc.theWorld.getWorldInfo().getGameType(), false); this.mc.displayGuiScreen(new GuiScreenNoRelays(this, "noRelay.titleFail")); } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientNetworkManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientNetworkManager.java index 418d182..d442f9f 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientNetworkManager.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientNetworkManager.java @@ -340,9 +340,11 @@ public class LANClientNetworkManager extends EaglercraftNetworkManager { } EaglerInputStream bi = new EaglerInputStream(fullData); int i = (bi.read() << 24) | (bi.read() << 16) | (bi.read() << 8) | bi.read(); - InputStream inflaterInputStream = EaglerZLIB.newInflaterInputStream(bi); fullData = new byte[i]; - int r = IOUtils.readFully(inflaterInputStream, fullData); + int r; + try(InputStream inflaterInputStream = EaglerZLIB.newInflaterInputStream(bi)) { + r = IOUtils.readFully(inflaterInputStream, fullData); + } if (i != r) { logger.warn("Decompressed packet expected size {} differs from actual size {}!", i, r); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java index c5d87ee..73fb100 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java @@ -479,7 +479,7 @@ public class EaglerIntegratedServerWorker { while(true) { mainLoop(); - EagUtils.sleep(1l); + EagUtils.sleep(0l); } }catch(Throwable tt) { if(tt instanceof ReportedException) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKDecompiler.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKDecompiler.java index 10f536e..fb07f6d 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKDecompiler.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKDecompiler.java @@ -1,6 +1,7 @@ package net.lax1dude.eaglercraft.v1_8.sp.server.export; import java.io.ByteArrayInputStream; +import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; @@ -24,7 +25,7 @@ import net.lax1dude.eaglercraft.v1_8.IOUtils; * POSSIBILITY OF SUCH DAMAGE. * */ -public class EPKDecompiler { +public class EPKDecompiler implements Closeable { public static class FileEntry { public final String type; @@ -178,4 +179,9 @@ public class EPKDecompiler { return new String(charIn); } + @Override + public void close() throws IOException { + zis.close(); + } + } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java index 5818c77..fc085c0 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java @@ -40,44 +40,45 @@ public class WorldConverterEPK { folderName += "_"; worldDir = EaglerIntegratedServerWorker.saveFormat.getSaveLoader(folderName, false).getWorldDirectory(); } - EPKDecompiler dc = new EPKDecompiler(archiveContents); - EPKDecompiler.FileEntry f = null; - int lastProgUpdate = 0; - int prog = 0; - String hasReadType = null; - boolean has152Format = false; - int cnt = 0; - while((f = dc.readFile()) != null) { - byte[] b = f.data; - if(hasReadType == null) { - if (f.type.equals("HEAD") && f.name.equals("file-type") - && ((hasReadType = EPKDecompiler.readASCII(f.data)).equals("epk/world188") - || (has152Format = hasReadType.equals("epk/world152")))) { - if(has152Format) { - logger.warn("World type detected as 1.5.2, it will be converted to 1.8.8 format"); + try(EPKDecompiler dc = new EPKDecompiler(archiveContents)) { + EPKDecompiler.FileEntry f = null; + int lastProgUpdate = 0; + int prog = 0; + String hasReadType = null; + boolean has152Format = false; + int cnt = 0; + while((f = dc.readFile()) != null) { + byte[] b = f.data; + if(hasReadType == null) { + if (f.type.equals("HEAD") && f.name.equals("file-type") + && ((hasReadType = EPKDecompiler.readASCII(f.data)).equals("epk/world188") + || (has152Format = hasReadType.equals("epk/world152")))) { + if(has152Format) { + logger.warn("World type detected as 1.5.2, it will be converted to 1.8.8 format"); + } + continue; + }else { + throw new IOException("file does not contain a singleplayer 1.5.2 or 1.8.8 world!"); } - continue; - }else { - throw new IOException("file does not contain a singleplayer 1.5.2 or 1.8.8 world!"); } - } - if(f.type.equals("FILE")) { - if(f.name.equals("level.dat") || f.name.equals("level.dat_old")) { - NBTTagCompound worldDatNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b)); - worldDatNBT.getCompoundTag("Data").setString("LevelName", newName); - worldDatNBT.getCompoundTag("Data").setLong("LastPlayed", System.currentTimeMillis()); - EaglerOutputStream tmp = new EaglerOutputStream(); - CompressedStreamTools.writeCompressed(worldDatNBT, tmp); - b = tmp.toByteArray(); - } - VFile2 ff = new VFile2(worldDir, f.name); - ff.setAllBytes(b); - prog += b.length; - ++cnt; - if(prog - lastProgUpdate > 25000) { - lastProgUpdate = prog; - logger.info("Extracted {} files, {} bytes from EPK...", cnt, prog); - EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.importing.1", prog); + if(f.type.equals("FILE")) { + if(f.name.equals("level.dat") || f.name.equals("level.dat_old")) { + NBTTagCompound worldDatNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b)); + worldDatNBT.getCompoundTag("Data").setString("LevelName", newName); + worldDatNBT.getCompoundTag("Data").setLong("LastPlayed", System.currentTimeMillis()); + EaglerOutputStream tmp = new EaglerOutputStream(); + CompressedStreamTools.writeCompressed(worldDatNBT, tmp); + b = tmp.toByteArray(); + } + VFile2 ff = new VFile2(worldDir, f.name); + ff.setAllBytes(b); + prog += b.length; + ++cnt; + if(prog - lastProgUpdate > 25000) { + lastProgUpdate = prog; + logger.info("Extracted {} files, {} bytes from EPK...", cnt, prog); + EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.importing.1", prog); + } } } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java index e027530..b7a6d5b 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java @@ -50,111 +50,113 @@ public class WorldConverterMCA { folderName += "_"; worldDir = EaglerIntegratedServerWorker.saveFormat.getSaveLoader(folderName, false).getWorldDirectory(); } - ZipInputStream zis = new ZipInputStream(new EaglerInputStream(archiveContents)); - ZipEntry folderNameFile = null; List fileNames = new ArrayList<>(); - while((folderNameFile = zis.getNextEntry()) != null) { - if (folderNameFile.getName().contains("__MACOSX/")) continue; - if (folderNameFile.isDirectory()) continue; - String lowerName = folderNameFile.getName().toLowerCase(); - if (!(lowerName.endsWith(".dat") || lowerName.endsWith(".dat_old") || lowerName.endsWith(".mca") || lowerName.endsWith(".mcr"))) continue; - fileNames.add(folderNameFile.getName().toCharArray()); + try(ZipInputStream zis = new ZipInputStream(new EaglerInputStream(archiveContents))) { + ZipEntry folderNameFile = null; + while((folderNameFile = zis.getNextEntry()) != null) { + if (folderNameFile.getName().contains("__MACOSX/")) continue; + if (folderNameFile.isDirectory()) continue; + String lowerName = folderNameFile.getName().toLowerCase(); + if (!(lowerName.endsWith(".dat") || lowerName.endsWith(".dat_old") || lowerName.endsWith(".mca") || lowerName.endsWith(".mcr"))) continue; + fileNames.add(folderNameFile.getName().toCharArray()); + } } final int[] i = new int[] { 0 }; while(fileNames.get(0).length > i[0] && fileNames.stream().allMatch(w -> w[i[0]] == fileNames.get(0)[i[0]])) i[0]++; int folderPrefixOffset = i[0]; - zis = new ZipInputStream(new EaglerInputStream(archiveContents)); - ZipEntry f = null; - int lastProgUpdate = 0; - int prog = 0; - byte[] bb = new byte[16384]; - while ((f = zis.getNextEntry()) != null) { - if (f.getName().contains("__MACOSX/")) continue; - if (f.isDirectory()) continue; - String lowerName = f.getName().toLowerCase(); - if (!(lowerName.endsWith(".dat") || lowerName.endsWith(".dat_old") || lowerName.endsWith(".mca") || lowerName.endsWith(".mcr") || lowerName.endsWith(".bmp"))) continue; - EaglerOutputStream baos = new EaglerOutputStream(); - int len; - while ((len = zis.read(bb)) != -1) { - baos.write(bb, 0, len); - } - baos.close(); - byte[] b = baos.toByteArray(); - String fileName = f.getName().substring(folderPrefixOffset); - if (fileName.equals("level.dat") || fileName.equals("level.dat_old")) { - NBTTagCompound worldDatNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b)); - - NBTTagCompound gameRulesNBT = worldDatNBT.getCompoundTag("Data").getCompoundTag("GameRules"); - gameRulesNBT.setString("loadSpawnChunks", (gameRules & 2) != 0 ? "true" : "false"); - String s = (gameRules & 1) != 0 ? "true" : "false"; - gameRulesNBT.setString("bedSpawnPoint", s); - gameRulesNBT.setString("clickToRide", "false"); - gameRulesNBT.setString("clickToSit", s); - gameRulesNBT.setString("colorCodes", s); - gameRulesNBT.setString("doSignEditing", s); - worldDatNBT.getCompoundTag("Data").setTag("GameRules", gameRulesNBT); - - worldDatNBT.getCompoundTag("Data").setString("LevelName", newName); - worldDatNBT.getCompoundTag("Data").setLong("LastPlayed", System.currentTimeMillis()); - EaglerOutputStream bo = new EaglerOutputStream(); - CompressedStreamTools.writeCompressed(worldDatNBT, bo); - b = bo.toByteArray(); - VFile2 ff = new VFile2(worldDir, fileName); - ff.setAllBytes(b); - prog += b.length; - } else if ((fileName.endsWith(".mcr") || fileName.endsWith(".mca")) && (fileName.startsWith("region/") || fileName.startsWith("DIM1/region/") || fileName.startsWith("DIM-1/region/"))) { - VFile2 chunkFolder = new VFile2(worldDir, fileName.startsWith("DIM1") ? "level1" : (fileName.startsWith("DIM-1") ? "level-1" : "level0")); - RegionFile mca = new RegionFile(new RandomAccessMemoryFile(b, b.length)); - int loadChunksCount = 0; - for(int j = 0; j < 32; ++j) { - for(int k = 0; k < 32; ++k) { - if(mca.isChunkSaved(j, k)) { - NBTTagCompound chunkNBT; - NBTTagCompound chunkLevel; - try { - chunkNBT = CompressedStreamTools.read(mca.getChunkDataInputStream(j, k)); - if(!chunkNBT.hasKey("Level", 10)) { - throw new IOException("Chunk is missing level data!"); + try(ZipInputStream zis = new ZipInputStream(new EaglerInputStream(archiveContents))) { + ZipEntry f = null; + int lastProgUpdate = 0; + int prog = 0; + byte[] bb = new byte[16384]; + while ((f = zis.getNextEntry()) != null) { + if (f.getName().contains("__MACOSX/")) continue; + if (f.isDirectory()) continue; + String lowerName = f.getName().toLowerCase(); + if (!(lowerName.endsWith(".dat") || lowerName.endsWith(".dat_old") || lowerName.endsWith(".mca") || lowerName.endsWith(".mcr") || lowerName.endsWith(".bmp"))) continue; + EaglerOutputStream baos = new EaglerOutputStream(); + int len; + while ((len = zis.read(bb)) != -1) { + baos.write(bb, 0, len); + } + baos.close(); + byte[] b = baos.toByteArray(); + String fileName = f.getName().substring(folderPrefixOffset); + if (fileName.equals("level.dat") || fileName.equals("level.dat_old")) { + NBTTagCompound worldDatNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b)); + + NBTTagCompound gameRulesNBT = worldDatNBT.getCompoundTag("Data").getCompoundTag("GameRules"); + gameRulesNBT.setString("loadSpawnChunks", (gameRules & 2) != 0 ? "true" : "false"); + String s = (gameRules & 1) != 0 ? "true" : "false"; + gameRulesNBT.setString("bedSpawnPoint", s); + gameRulesNBT.setString("clickToRide", "false"); + gameRulesNBT.setString("clickToSit", s); + gameRulesNBT.setString("colorCodes", s); + gameRulesNBT.setString("doSignEditing", s); + worldDatNBT.getCompoundTag("Data").setTag("GameRules", gameRulesNBT); + + worldDatNBT.getCompoundTag("Data").setString("LevelName", newName); + worldDatNBT.getCompoundTag("Data").setLong("LastPlayed", System.currentTimeMillis()); + EaglerOutputStream bo = new EaglerOutputStream(); + CompressedStreamTools.writeCompressed(worldDatNBT, bo); + b = bo.toByteArray(); + VFile2 ff = new VFile2(worldDir, fileName); + ff.setAllBytes(b); + prog += b.length; + } else if ((fileName.endsWith(".mcr") || fileName.endsWith(".mca")) && (fileName.startsWith("region/") || fileName.startsWith("DIM1/region/") || fileName.startsWith("DIM-1/region/"))) { + VFile2 chunkFolder = new VFile2(worldDir, fileName.startsWith("DIM1") ? "level1" : (fileName.startsWith("DIM-1") ? "level-1" : "level0")); + RegionFile mca = new RegionFile(new RandomAccessMemoryFile(b, b.length)); + int loadChunksCount = 0; + for(int j = 0; j < 32; ++j) { + for(int k = 0; k < 32; ++k) { + if(mca.isChunkSaved(j, k)) { + NBTTagCompound chunkNBT; + NBTTagCompound chunkLevel; + try { + chunkNBT = CompressedStreamTools.read(mca.getChunkDataInputStream(j, k)); + if(!chunkNBT.hasKey("Level", 10)) { + throw new IOException("Chunk is missing level data!"); + } + chunkLevel = chunkNBT.getCompoundTag("Level"); + }catch(Throwable t) { + logger.error("{}: Could not read chunk: {}, {}", fileName, j, k); + logger.error(t); + continue; } - chunkLevel = chunkNBT.getCompoundTag("Level"); - }catch(Throwable t) { - logger.error("{}: Could not read chunk: {}, {}", fileName, j, k); - logger.error(t); - continue; + int chunkX = chunkLevel.getInteger("xPos"); + int chunkZ = chunkLevel.getInteger("zPos"); + VFile2 chunkOut = new VFile2(chunkFolder, EaglerChunkLoader.getChunkPath(chunkX, chunkZ) + ".dat"); + if(chunkOut.exists()) { + logger.error("{}: Chunk already exists: {}", fileName, chunkOut.getPath()); + continue; + } + EaglerOutputStream bao = new EaglerOutputStream(); + CompressedStreamTools.writeCompressed(chunkNBT, bao); + b = bao.toByteArray(); + chunkOut.setAllBytes(b); + prog += b.length; + if (prog - lastProgUpdate > 25000) { + lastProgUpdate = prog; + EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.importing.2", prog); + } + ++loadChunksCount; } - int chunkX = chunkLevel.getInteger("xPos"); - int chunkZ = chunkLevel.getInteger("zPos"); - VFile2 chunkOut = new VFile2(chunkFolder, EaglerChunkLoader.getChunkPath(chunkX, chunkZ) + ".dat"); - if(chunkOut.exists()) { - logger.error("{}: Chunk already exists: {}", fileName, chunkOut.getPath()); - continue; - } - EaglerOutputStream bao = new EaglerOutputStream(); - CompressedStreamTools.writeCompressed(chunkNBT, bao); - b = bao.toByteArray(); - chunkOut.setAllBytes(b); - prog += b.length; - if (prog - lastProgUpdate > 25000) { - lastProgUpdate = prog; - EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.importing.2", prog); - } - ++loadChunksCount; } } + logger.info("{}: Imported {} chunks successfully ({} bytes)", fileName, loadChunksCount, prog); + } else if (fileName.startsWith("playerdata/") || fileName.startsWith("stats/")) { + //TODO: LAN player inventories + } else if (fileName.startsWith("data/") || fileName.startsWith("players/") || fileName.startsWith("eagler/skulls/")) { + VFile2 ff = new VFile2(worldDir, fileName); + ff.setAllBytes(b); + prog += b.length; + } else if (!fileName.equals("level.dat_mcr") && !fileName.equals("session.lock")) { + logger.info("Skipping file: {}", fileName); + } + if (prog - lastProgUpdate > 25000) { + lastProgUpdate = prog; + EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.importing.2", prog); } - logger.info("{}: Imported {} chunks successfully ({} bytes)", fileName, loadChunksCount, prog); - } else if (fileName.startsWith("playerdata/") || fileName.startsWith("stats/")) { - //TODO: LAN player inventories - } else if (fileName.startsWith("data/") || fileName.startsWith("players/") || fileName.startsWith("eagler/skulls/")) { - VFile2 ff = new VFile2(worldDir, fileName); - ff.setAllBytes(b); - prog += b.length; - } else if (!fileName.equals("level.dat_mcr") && !fileName.equals("session.lock")) { - logger.info("Skipping file: {}", fileName); - } - if (prog - lastProgUpdate > 25000) { - lastProgUpdate = prog; - EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.importing.2", prog); } } logger.info("MCA was successfully extracted into directory \"{}\"", worldDir.getPath()); @@ -172,129 +174,130 @@ public class WorldConverterMCA { public static byte[] exportWorld(String folderName) throws IOException { EaglerOutputStream bao = new EaglerOutputStream(); - ZipOutputStream zos = new ZipOutputStream(bao); - zos.setComment("contains backup of world '" + folderName + "'"); - VFile2 worldFolder = EaglerIntegratedServerWorker.saveFormat.getSaveLoader(folderName, false).getWorldDirectory(); - logger.info("Exporting world directory \"{}\" as MCA", worldFolder.getPath()); - VFile2 vf = new VFile2(worldFolder, "level.dat"); - byte[] b; - int lastProgUpdate = 0; - int prog = 0; - boolean safe = false; - if(vf.exists()) { - zos.putNextEntry(new ZipEntry(folderName + "/level.dat")); - b = vf.getAllBytes(); - zos.write(b); - prog += b.length; - safe = true; - } - vf = new VFile2(worldFolder, "level.dat_old"); - if(vf.exists()) { - zos.putNextEntry(new ZipEntry(folderName + "/level.dat_old")); - b = vf.getAllBytes(); - zos.write(b); - prog += b.length; - safe = true; - } - if (prog - lastProgUpdate > 25000) { - lastProgUpdate = prog; - EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); - } - String[] srcFolderNames = new String[] { "level0", "level-1", "level1" }; - String[] dstFolderNames = new String[] { "/region/", "/DIM-1/region/", "/DIM1/region/" }; - List fileList; - for(int i = 0; i < 3; ++i) { - vf = new VFile2(worldFolder, srcFolderNames[i]); - fileList = vf.listFiles(true); - String regionFolder = folderName + dstFolderNames[i]; - logger.info("Converting chunks in \"{}\" as MCA to \"{}\"...", vf.getPath(), regionFolder); - Map regionFiles = new HashMap(); - for(int k = 0, l = fileList.size(); k < l; ++k) { - VFile2 chunkFile = fileList.get(k); - NBTTagCompound chunkNBT; - NBTTagCompound chunkLevel; - try { - b = chunkFile.getAllBytes(); - chunkNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b)); - if(!chunkNBT.hasKey("Level", 10)) { - throw new IOException("Chunk is missing level data!"); + VFile2 worldFolder; + try(ZipOutputStream zos = new ZipOutputStream(bao)) { + zos.setComment("contains backup of world '" + folderName + "'"); + worldFolder = EaglerIntegratedServerWorker.saveFormat.getSaveLoader(folderName, false).getWorldDirectory(); + logger.info("Exporting world directory \"{}\" as MCA", worldFolder.getPath()); + VFile2 vf = new VFile2(worldFolder, "level.dat"); + byte[] b; + int lastProgUpdate = 0; + int prog = 0; + boolean safe = false; + if(vf.exists()) { + zos.putNextEntry(new ZipEntry(folderName + "/level.dat")); + b = vf.getAllBytes(); + zos.write(b); + prog += b.length; + safe = true; + } + vf = new VFile2(worldFolder, "level.dat_old"); + if(vf.exists()) { + zos.putNextEntry(new ZipEntry(folderName + "/level.dat_old")); + b = vf.getAllBytes(); + zos.write(b); + prog += b.length; + safe = true; + } + if (prog - lastProgUpdate > 25000) { + lastProgUpdate = prog; + EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); + } + String[] srcFolderNames = new String[] { "level0", "level-1", "level1" }; + String[] dstFolderNames = new String[] { "/region/", "/DIM-1/region/", "/DIM1/region/" }; + List fileList; + for(int i = 0; i < 3; ++i) { + vf = new VFile2(worldFolder, srcFolderNames[i]); + fileList = vf.listFiles(true); + String regionFolder = folderName + dstFolderNames[i]; + logger.info("Converting chunks in \"{}\" as MCA to \"{}\"...", vf.getPath(), regionFolder); + Map regionFiles = new HashMap(); + for(int k = 0, l = fileList.size(); k < l; ++k) { + VFile2 chunkFile = fileList.get(k); + NBTTagCompound chunkNBT; + NBTTagCompound chunkLevel; + try { + b = chunkFile.getAllBytes(); + chunkNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b)); + if(!chunkNBT.hasKey("Level", 10)) { + throw new IOException("Chunk is missing level data!"); + } + chunkLevel = chunkNBT.getCompoundTag("Level"); + }catch(IOException t) { + logger.error("Could not read chunk: {}", chunkFile.getPath()); + logger.error(t); + continue; } - chunkLevel = chunkNBT.getCompoundTag("Level"); - }catch(IOException t) { - logger.error("Could not read chunk: {}", chunkFile.getPath()); - logger.error(t); + int chunkX = chunkLevel.getInteger("xPos"); + int chunkZ = chunkLevel.getInteger("zPos"); + String regionFileName = "r." + (chunkX >> 5) + "." + (chunkZ >> 5) + ".mca"; + RegionFile rf = regionFiles.get(regionFileName); + if(rf == null) { + rf = new RegionFile(new RandomAccessMemoryFile(new byte[65536], 0)); + regionFiles.put(regionFileName, rf); + } + try(DataOutputStream dos = rf.getChunkDataOutputStream(chunkX & 31, chunkZ & 31)) { + CompressedStreamTools.write(chunkNBT, dos); + }catch(IOException t) { + logger.error("Could not write chunk to {}: {}", regionFileName, chunkFile.getPath()); + logger.error(t); + continue; + } + prog += b.length; + if (prog - lastProgUpdate > 25000) { + lastProgUpdate = prog; + EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); + } + } + if(regionFiles.isEmpty()) { + logger.info("No region files were generated"); continue; } - int chunkX = chunkLevel.getInteger("xPos"); - int chunkZ = chunkLevel.getInteger("zPos"); - String regionFileName = "r." + (chunkX >> 5) + "." + (chunkZ >> 5) + ".mca"; - RegionFile rf = regionFiles.get(regionFileName); - if(rf == null) { - rf = new RegionFile(new RandomAccessMemoryFile(new byte[65536], 0)); - regionFiles.put(regionFileName, rf); - } - try(DataOutputStream dos = rf.getChunkDataOutputStream(chunkX & 31, chunkZ & 31)) { - CompressedStreamTools.write(chunkNBT, dos); - }catch(IOException t) { - logger.error("Could not write chunk to {}: {}", regionFileName, chunkFile.getPath()); - logger.error(t); - continue; + for(Entry etr : regionFiles.entrySet()) { + String regionPath = regionFolder + etr.getKey(); + logger.info("Writing region file: {}", regionPath); + zos.putNextEntry(new ZipEntry(regionPath)); + zos.write(etr.getValue().getFile().getByteArray()); } + } + logger.info("Copying extra world data..."); + fileList = (new VFile2(worldFolder, "data")).listFiles(false); + for(int k = 0, l = fileList.size(); k < l; ++k) { + VFile2 dataFile = fileList.get(k); + zos.putNextEntry(new ZipEntry(folderName + "/data/" + dataFile.getName())); + b = dataFile.getAllBytes(); + zos.write(b); prog += b.length; if (prog - lastProgUpdate > 25000) { lastProgUpdate = prog; EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); } } - if(regionFiles.isEmpty()) { - logger.info("No region files were generated"); - continue; + fileList = (new VFile2(worldFolder, "players")).listFiles(false); + for(int k = 0, l = fileList.size(); k < l; ++k) { + VFile2 dataFile = fileList.get(k); + zos.putNextEntry(new ZipEntry(folderName + "/players/" + dataFile.getName())); + b = dataFile.getAllBytes(); + zos.write(b); + prog += b.length; + if (prog - lastProgUpdate > 25000) { + lastProgUpdate = prog; + EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); + } } - for(Entry etr : regionFiles.entrySet()) { - String regionPath = regionFolder + etr.getKey(); - logger.info("Writing region file: {}", regionPath); - zos.putNextEntry(new ZipEntry(regionPath)); - zos.write(etr.getValue().getFile().getByteArray()); + fileList = (new VFile2(worldFolder, "eagler/skulls")).listFiles(false); + for(int k = 0, l = fileList.size(); k < l; ++k) { + VFile2 dataFile = fileList.get(k); + zos.putNextEntry(new ZipEntry(folderName + "/eagler/skulls/" + dataFile.getName())); + b = dataFile.getAllBytes(); + zos.write(b); + prog += b.length; + if (prog - lastProgUpdate > 25000) { + lastProgUpdate = prog; + EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); + } } } - logger.info("Copying extra world data..."); - fileList = (new VFile2(worldFolder, "data")).listFiles(false); - for(int k = 0, l = fileList.size(); k < l; ++k) { - VFile2 dataFile = fileList.get(k); - zos.putNextEntry(new ZipEntry(folderName + "/data/" + dataFile.getName())); - b = dataFile.getAllBytes(); - zos.write(b); - prog += b.length; - if (prog - lastProgUpdate > 25000) { - lastProgUpdate = prog; - EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); - } - } - fileList = (new VFile2(worldFolder, "players")).listFiles(false); - for(int k = 0, l = fileList.size(); k < l; ++k) { - VFile2 dataFile = fileList.get(k); - zos.putNextEntry(new ZipEntry(folderName + "/players/" + dataFile.getName())); - b = dataFile.getAllBytes(); - zos.write(b); - prog += b.length; - if (prog - lastProgUpdate > 25000) { - lastProgUpdate = prog; - EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); - } - } - fileList = (new VFile2(worldFolder, "eagler/skulls")).listFiles(false); - for(int k = 0, l = fileList.size(); k < l; ++k) { - VFile2 dataFile = fileList.get(k); - zos.putNextEntry(new ZipEntry(folderName + "/eagler/skulls/" + dataFile.getName())); - b = dataFile.getAllBytes(); - zos.write(b); - prog += b.length; - if (prog - lastProgUpdate > 25000) { - lastProgUpdate = prog; - EaglerIntegratedServerWorker.sendProgress("singleplayer.busy.exporting.2", prog); - } - } - zos.close(); logger.info("World directory \"{}\" was successfully exported as MCA", worldFolder.getPath()); return bao.toByteArray(); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java index 3041090..bccbaee 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java @@ -243,9 +243,9 @@ public class IntegratedServerPlayerNetworkManager { temporaryOutputStream.write((len >> 16) & 0xFF); temporaryOutputStream.write((len >> 8) & 0xFF); temporaryOutputStream.write(len & 0xFF); - OutputStream os = EaglerZLIB.newDeflaterOutputStream(temporaryOutputStream); - temporaryBuffer.readBytes(os, len); - os.close(); + try(OutputStream os = EaglerZLIB.newDeflaterOutputStream(temporaryOutputStream)) { + temporaryBuffer.readBytes(os, len); + } compressedData = temporaryOutputStream.toByteArray(); }catch(IOException ex) { logger.error("Failed to compress packet {}!", pkt.getClass().getSimpleName()); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/RelayUpdateChecker.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/RelayUpdateChecker.java index be5cd15..2ee5eeb 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/RelayUpdateChecker.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/RelayUpdateChecker.java @@ -64,7 +64,7 @@ public class RelayUpdateChecker { for(net.lax1dude.eaglercraft.v1_8.sp.relay.RelayEntry etr : EagRuntime.getConfiguration().getRelays()) { relaysList.add(new RelayEntry(etr.address)); } - byte[] b = PlatformApplication.getLocalStorage("lastRelayUpdate"); + byte[] b = PlatformApplication.getLocalStorage("lastRelayUpdate", false); if(b != null) { try { lastUpdateCheck = (new DataInputStream(new EaglerInputStream(b))).readLong(); @@ -79,7 +79,7 @@ public class RelayUpdateChecker { try { EaglerOutputStream bao = new EaglerOutputStream(8); (new DataOutputStream(bao)).writeLong(lastUpdateCheck); - PlatformApplication.setLocalStorage("lastRelayUpdate", bao.toByteArray()); + PlatformApplication.setLocalStorage("lastRelayUpdate", bao.toByteArray(), false); } catch (IOException e) { } for (int i = 0, l = relaysList.size(); i < l; ++i) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java index 2bfdc43..a3bc785 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java @@ -148,7 +148,16 @@ public class UpdateCertificate { throw new CertificateInvalidException("SHA256 checksum of signature payload is invalid!"); } - return new UpdateCertificate(certData, EaglerZLIB.newGZIPInputStream(new EaglerInputStream(signaturePayload)), vers); + UpdateCertificate cert; + try(InputStream gis = EaglerZLIB.newGZIPInputStream(new EaglerInputStream(signaturePayload))) { + cert = new UpdateCertificate(certData, gis, vers); + } + + if(System.currentTimeMillis() < cert.sigTimestamp) { + throw new CertificateInvalidException("Update certificate timestamp is from the future!?"); + } + + return cert; } private UpdateCertificate(byte[] certData, InputStream is, int sigVers) throws IOException { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateService.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateService.java index 49aa9bb..32c1b68 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateService.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateService.java @@ -94,7 +94,7 @@ public class UpdateService { } } } - byte[] latestUpdate = PlatformApplication.getLocalStorage(EaglercraftVersion.updateLatestLocalStorageKey); + byte[] latestUpdate = PlatformApplication.getLocalStorage(EaglercraftVersion.updateLatestLocalStorageKey, false); if(latestUpdate != null) { addCertificateToSet(latestUpdate, false); } @@ -150,7 +150,7 @@ public class UpdateService { latestUpdateFound = cert; if (saveLatest) { PlatformApplication.setLocalStorage(EaglercraftVersion.updateLatestLocalStorageKey, - certificateData); + certificateData, false); } } }else if(EagRuntime.getConfiguration().isLogInvalidCerts()) { diff --git a/sources/resources/plugin_download.zip b/sources/resources/plugin_download.zip index 7b99d4b..22d2e39 100644 Binary files a/sources/resources/plugin_download.zip and b/sources/resources/plugin_download.zip differ diff --git a/sources/resources/plugin_version.json b/sources/resources/plugin_version.json index 56a0adb..8e05487 100644 --- a/sources/resources/plugin_version.json +++ b/sources/resources/plugin_version.json @@ -1 +1 @@ -{"pluginName":"EaglercraftXBungee","pluginVersion":"1.1.0","pluginButton":"Download \"EaglerXBungee-1.1.0.jar\"","pluginFilename":"EaglerXBungee.zip"} \ No newline at end of file +{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.1","pluginButton":"Download \"EaglerXBungee-1.2.1.jar\"","pluginFilename":"EaglerXBungee.zip"} \ No newline at end of file diff --git a/sources/resources/relay_download.zip b/sources/resources/relay_download.zip index 7b644bc..dc97f94 100644 Binary files a/sources/resources/relay_download.zip and b/sources/resources/relay_download.zip differ diff --git a/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt b/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt index 5eb9b4f..90cdc12 100644 --- a/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt +++ b/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt @@ -470,20 +470,6 @@ function displayGui() { } - -