diff --git a/patches/minecraft/delete.txt b/patches/minecraft/delete.txt index fe8e690..aa1178f 100644 --- a/patches/minecraft/delete.txt +++ b/patches/minecraft/delete.txt @@ -1,4 +1,4 @@ -# 143 files to delete: +# 144 files to delete: net/minecraft/client/renderer/VertexBufferUploader.java net/minecraft/realms/DisconnectedRealmsScreen.java net/minecraft/client/stream/Metadata.java @@ -65,6 +65,7 @@ net/minecraft/client/shader/ShaderGroup.java net/minecraft/server/management/UserListWhitelist.java net/minecraft/client/shader/ShaderLoader.java net/minecraft/realms/RealmsEditBox.java +net/minecraft/client/resources/ResourceIndex.java net/minecraft/server/management/UserListEntry.java net/minecraft/network/NettyEncryptionTranslator.java net/minecraft/client/audio/SoundManager.java diff --git a/patches/minecraft/net/minecraft/block/Block.edit.java b/patches/minecraft/net/minecraft/block/Block.edit.java index 34be1c7..1173942 100644 --- a/patches/minecraft/net/minecraft/block/Block.edit.java +++ b/patches/minecraft/net/minecraft/block/Block.edit.java @@ -101,17 +101,7 @@ + } + -> CHANGE 132 : 133 @ 132 : 133 - -~ return this.fullCube && (!this.noRender); - -> INSERT 67 : 70 @ 67 - -+ if (this.noRender || this.forceRender) { -+ return this.forceRender; -+ } - -> CHANGE 47 : 48 @ 47 : 48 +> CHANGE 247 : 248 @ 247 : 248 ~ public void randomTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom random) { diff --git a/patches/minecraft/net/minecraft/client/ClientBrandRetriever.edit.java b/patches/minecraft/net/minecraft/client/ClientBrandRetriever.edit.java index ad415d7..31000e9 100644 --- a/patches/minecraft/net/minecraft/client/ClientBrandRetriever.edit.java +++ b/patches/minecraft/net/minecraft/client/ClientBrandRetriever.edit.java @@ -5,13 +5,8 @@ # Version: 1.0 # Author: lax1dude -> INSERT 2 : 4 @ 2 +> CHANGE 4 : 5 @ 4 : 5 -+ import static net.lax1dude.eaglercraft.v1_8.EaglercraftVersion.projectForkName; -+ - -> CHANGE 2 : 3 @ 2 : 3 - -~ return projectForkName; +~ return "eagler"; > EOF diff --git a/patches/minecraft/net/minecraft/client/Minecraft.edit.java b/patches/minecraft/net/minecraft/client/Minecraft.edit.java index cf460dd..701910e 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 : 58 @ 1 : 4 +> CHANGE 1 : 57 @ 1 : 4 ~ ~ import net.eaglerforge.EaglerForge; @@ -30,7 +30,6 @@ ~ import net.eaglerforge.api.ModAPI; ~ import net.eaglerforge.api.ModData; ~ import net.eaglerforge.api.ModLoader; -~ import net.eaglerforge.gui.EmptyGui; ~ import net.lax1dude.eaglercraft.v1_8.internal.PlatformInput; ~ ~ import org.apache.commons.lang3.Validate; @@ -138,14 +137,13 @@ > CHANGE 1 : 2 @ 1 : 2 -~ public class Minecraft extends ModData implements IThreadListener { +~ public class Minecraft extends BaseData implements IThreadListener { -> CHANGE 2 : 4 @ 2 : 10 +> CHANGE 2 : 3 @ 2 : 9 ~ public static final boolean isRunningOnMac = false; -~ public ServerData currentServerData; -> DELETE 11 @ 11 : 13 +> DELETE 12 @ 12 : 14 > INSERT 11 : 12 @ 11 @@ -751,7 +749,7 @@ > CHANGE 2 : 3 @ 2 : 6 -~ return "true"; +~ return "Definitely Not; You're an eagler"; > DELETE 36 @ 36 : 41 diff --git a/patches/minecraft/net/minecraft/client/entity/EntityOtherPlayerMP.edit.java b/patches/minecraft/net/minecraft/client/entity/EntityOtherPlayerMP.edit.java index 484d1b9..4165fda 100644 --- a/patches/minecraft/net/minecraft/client/entity/EntityOtherPlayerMP.edit.java +++ b/patches/minecraft/net/minecraft/client/entity/EntityOtherPlayerMP.edit.java @@ -13,12 +13,15 @@ > DELETE 1 @ 1 : 2 -> INSERT 1 : 3 @ 1 +> INSERT 1 : 2 @ 1 -+ import net.minecraft.nbt.JsonToNBT; + import net.minecraft.nbt.NBTTagCompound; -> INSERT 23 : 64 @ 23 +> INSERT 5 : 6 @ 5 + ++ import net.minecraft.nbt.JsonToNBT; + +> INSERT 18 : 59 @ 18 + @Override + public ModData makeModData() { diff --git a/patches/minecraft/net/minecraft/client/gui/GuiIngame.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiIngame.edit.java index 8d6f610..8661a1e 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiIngame.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiIngame.edit.java @@ -5,10 +5,13 @@ # Version: 1.0 # Author: lax1dude -> INSERT 2 : 7 @ 2 +> INSERT 2 : 10 @ 2 + import java.util.ArrayList; + import java.util.Collection; ++ ++ import net.eaglerforge.api.ModAPI; ++ import net.eaglerforge.api.ModData; + import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; + import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite; + @@ -60,7 +63,12 @@ + j -= 10; + } -> INSERT 19 : 30 @ 19 +> INSERT 14 : 16 @ 14 + ++ ModAPI.callEvent("drawhud", new ModData()); ++ + +> INSERT 5 : 16 @ 5 + public void renderGameOverlayCrosshairs(int scaledResWidth, int scaledResHeight) { + if (this.showCrosshair()) { diff --git a/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java index 0b60a99..37ed9f6 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiIngameMenu.edit.java @@ -5,9 +5,8 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 2 : 12 @ 2 : 9 +> CHANGE 2 : 11 @ 2 : 9 -~ import net.eaglerforge.gui.ModGUI; ~ import net.lax1dude.eaglercraft.v1_8.Mouse; ~ import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; ~ import net.lax1dude.eaglercraft.v1_8.sp.SingleplayerServerController; @@ -18,11 +17,12 @@ ~ import net.lax1dude.eaglercraft.v1_8.update.GuiUpdateCheckerOverlay; ~ import net.minecraft.client.audio.PositionedSoundRecord; -> CHANGE 4 : 7 @ 4 : 5 +> CHANGE 4 : 8 @ 4 : 5 ~ import net.minecraft.util.ChatComponentText; ~ import net.minecraft.util.EnumChatFormatting; ~ import net.minecraft.util.ResourceLocation; +~ import net.eaglerforge.gui.ModGUI; > DELETE 2 @ 2 : 4 @@ -50,10 +50,8 @@ ~ this.buttonList.add(lanButton = new GuiButton(7, this.width / 2 + 2, this.height / 4 + 96 + b0, 98, 20, ~ I18n.format(LANServerController.isLANOpen() ? "menu.closeLan" : "menu.openToLan", new Object[0]))); -> CHANGE 4 : 11 @ 4 : 5 +> CHANGE 4 : 9 @ 4 : 5 -~ this.buttonList.add(new GuiButton(69420, this.width / 2 - 100, this.height / 4 + 73 + b0, -~ I18n.format("eaglerforge.menu.mods", new Object[0]))); ~ lanButton.enabled = SingleplayerServerController.isWorldRunning(); ~ if (!hasSentAutoSave) { ~ hasSentAutoSave = true; diff --git a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java index 58a73c7..9acb53d 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java @@ -5,11 +5,7 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 2 : 5 @ 2 : 3 - -~ import static net.eaglerforge.api.ModLoader.returntotalloadedmods; -~ import static net.lax1dude.eaglercraft.v1_8.EaglercraftVersion.*; -~ +> DELETE 2 @ 2 : 3 > DELETE 3 @ 3 : 4 @@ -17,9 +13,10 @@ + import java.util.Arrays; -> CHANGE 2 : 29 @ 2 : 4 +> CHANGE 2 : 30 @ 2 : 4 ~ +~ import net.eaglerforge.gui.ModGUI; ~ import net.lax1dude.eaglercraft.v1_8.EagRuntime; ~ import net.lax1dude.eaglercraft.v1_8.EaglerInputStream; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; @@ -57,10 +54,7 @@ > DELETE 2 @ 2 : 3 -> CHANGE 1 : 3 @ 1 : 8 - -~ import net.eaglerforge.gui.ModGUI; -~ import org.teavm.jso.JSBody; +> DELETE 1 @ 1 : 8 > DELETE 2 @ 2 : 3 @@ -169,8 +163,9 @@ ~ I18n.format("menu.editProfile", new Object[0]))); ~ -> CHANGE 1 : 5 @ 1 : 2 +> CHANGE 1 : 6 @ 1 : 2 +~ ~ if (isFork) { ~ this.openGLWarning1 = EaglercraftVersion.mainMenuStringE; ~ this.openGLWarning2 = EaglercraftVersion.mainMenuStringF; diff --git a/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java index 1ea2001..54c3566 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java @@ -9,9 +9,10 @@ > DELETE 1 @ 1 : 3 -> INSERT 4 : 20 @ 4 +> INSERT 4 : 21 @ 4 + ++ import net.eaglerforge.gui.ModGUI; + import org.apache.commons.lang3.StringUtils; + + import com.google.common.base.Splitter; @@ -53,20 +54,22 @@ ~ for (int l = 0, m = this.labelList.size(); l < m; ++l) { -> INSERT 3 : 33 @ 3 +> CHANGE 3 : 14 @ 3 : 10 + +~ long millis = System.currentTimeMillis(); +~ long closeKeyTimeout = millis - showingCloseKey; +~ if (closeKeyTimeout < 3000l) { +~ int alpha1 = 0xC0000000; +~ int alpha2 = 0xFF000000; +~ if (closeKeyTimeout > 2500l) { +~ float f = (float) (3000l - closeKeyTimeout) * 0.002f; +~ if (f < 0.03f) +~ f = 0.03f; +~ alpha1 = (int) (f * 192.0f) << 24; +~ alpha2 = (int) (f * 255.0f) << 24; + +> INSERT 1 : 17 @ 1 -+ long millis = System.currentTimeMillis(); -+ long closeKeyTimeout = millis - showingCloseKey; -+ if (closeKeyTimeout < 3000l) { -+ int alpha1 = 0xC0000000; -+ int alpha2 = 0xFF000000; -+ if (closeKeyTimeout > 2500l) { -+ float f = (float) (3000l - closeKeyTimeout) * 0.002f; -+ if (f < 0.03f) -+ f = 0.03f; -+ alpha1 = (int) (f * 192.0f) << 24; -+ alpha2 = (int) (f * 255.0f) << 24; -+ } + String str; + int k = getCloseKey(); + if (k == KeyboardConstants.KEY_GRAVE) { @@ -83,10 +86,8 @@ + fontRendererObj.drawStringWithShadow(str, x + 2, y + 2, 0xFFAAAA | alpha2); + if (closeKeyTimeout > 2500l) + GlStateManager.disableBlend(); -+ } -+ -> CHANGE 2 : 14 @ 2 : 4 +> CHANGE 4 : 23 @ 4 : 9 ~ protected int getCloseKey() { ~ if (this instanceof GuiContainer) { @@ -100,16 +101,26 @@ ~ if (((this.mc.theWorld == null || this.mc.thePlayer.getHealth() <= 0.0F) && parInt1 == 1) ~ || parInt1 == this.mc.gameSettings.keyBindClose.getKeyCode() ~ || (parInt1 == 1 && (this.mc.gameSettings.keyBindClose.getKeyCode() == 0 || this.mc.areKeysLocked()))) { +~ if (!ModGUI.isGuiOpen()) { +~ this.mc.displayGuiScreen((GuiScreen) null); +~ if (this.mc.currentScreen == null) { +~ this.mc.setIngameFocus(); +~ } +~ } else { +~ ModGUI.closeGui(); -> INSERT 4 : 6 @ 4 +> CHANGE 1 : 3 @ 1 : 3 -+ } else if (parInt1 == 1) { -+ showingCloseKey = System.currentTimeMillis(); +~ } else if (parInt1 == 1) { +~ showingCloseKey = System.currentTimeMillis(); -> DELETE 1 @ 1 : 2 +> INSERT 1 : 2 @ 1 -> CHANGE 3 : 4 @ 3 : 13 ++ } +> CHANGE 1 : 3 @ 1 : 2 + +~ public static String getClipboardString() { ~ return EagRuntime.getClipboard(); > CHANGE 4 : 5 @ 4 : 11 diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java b/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java index f090ce9..ef37860 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java +++ b/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java @@ -17,4 +17,9 @@ > DELETE 10 @ 10 : 12 +> CHANGE 50 : 52 @ 50 : 52 + +~ for (int j = 0, k = this.chunkListing.size(); j < k; ++j) { +~ this.chunkListing.get(j).func_150804_b(System.currentTimeMillis() - i > 5L); + > EOF diff --git a/patches/minecraft/net/minecraft/client/multiplayer/WorldClient.edit.java b/patches/minecraft/net/minecraft/client/multiplayer/WorldClient.edit.java index d66c10e..7bf823c 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/WorldClient.edit.java +++ b/patches/minecraft/net/minecraft/client/multiplayer/WorldClient.edit.java @@ -17,11 +17,7 @@ > DELETE 5 @ 5 : 6 -> CHANGE 11 : 12 @ 11 : 15 - -~ import net.minecraft.util.*; - -> CHANGE 196 : 197 @ 196 : 197 +> CHANGE 211 : 212 @ 211 : 212 ~ EaglercraftRandom random = new EaglercraftRandom(); @@ -29,8 +25,4 @@ ~ return "Non-integrated multiplayer server"; -> INSERT 44 : 45 @ 44 - -+ - > EOF diff --git a/patches/minecraft/net/minecraft/client/network/NetHandlerPlayClient.edit.java b/patches/minecraft/net/minecraft/client/network/NetHandlerPlayClient.edit.java index a81a34c..ffb4316 100644 --- a/patches/minecraft/net/minecraft/client/network/NetHandlerPlayClient.edit.java +++ b/patches/minecraft/net/minecraft/client/network/NetHandlerPlayClient.edit.java @@ -9,12 +9,9 @@ > DELETE 4 @ 4 : 6 -> INSERT 1 : 22 @ 1 +> INSERT 1 : 19 @ 1 + -+ import net.eaglerforge.api.BaseData; -+ import net.eaglerforge.api.ModAPI; -+ import net.eaglerforge.api.ModData; + import net.lax1dude.eaglercraft.v1_8.EagRuntime; + import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; + import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; @@ -59,11 +56,7 @@ > DELETE 32 @ 32 : 34 -> CHANGE 1 : 2 @ 1 : 2 - -~ public class NetHandlerPlayClient extends ModData implements INetHandlerPlayClient { - -> CHANGE 1 : 2 @ 1 : 2 +> CHANGE 3 : 4 @ 3 : 4 ~ private final EaglercraftNetworkManager netManager; @@ -155,22 +148,7 @@ > DELETE 7 @ 7 : 8 -> CHANGE 23 : 37 @ 23 : 24 - -~ ModData eventData = new ModData(); -~ eventData.set("preventDefault", false); -~ eventData.set("type", packetIn.type); -~ eventData.set("chat", packetIn.chatComponent.getFormattedText()); -~ BaseData newEvent = ModAPI.callEvent("packetchat", eventData); -~ if (newEvent.has("preventDefault") && newEvent.getBoolean("preventDefault") == true) { -~ return; -~ } -~ packetIn.type = newEvent.has("type") ? newEvent.getByte("type") : packetIn.type; -~ if (newEvent.has("chat") -~ && (newEvent.getString("chat").length() != packetIn.chatComponent.getFormattedText().length())) { -~ packetIn.chatComponent = new ChatComponentText(newEvent.getString("chat")); -~ } -~ +> DELETE 23 @ 23 : 24 > DELETE 9 @ 9 : 10 diff --git a/patches/minecraft/net/minecraft/client/resources/ResourceIndex.edit.java b/patches/minecraft/net/minecraft/client/resources/ResourceIndex.edit.java deleted file mode 100644 index 40d7ab0..0000000 --- a/patches/minecraft/net/minecraft/client/resources/ResourceIndex.edit.java +++ /dev/null @@ -1,48 +0,0 @@ - -# Eagler Context Redacted Diff -# Copyright (c) 2024 lax1dude. All rights reserved. - -# Version: 1.0 -# Author: lax1dude - -> DELETE 2 @ 2 : 18 - -> CHANGE 1 : 3 @ 1 : 3 - -~ // private static final Logger logger = LogManager.getLogger(); -~ // private final Map resourceMap = Maps.newHashMap(); - -> CHANGE 1 : 25 @ 1 : 6 - -~ // public ResourceIndex(File parFile, String parString1) { -~ /* -~ * if (parString1 != null) { File file1 = new File(parFile, "objects"); File -~ * file2 = new File(parFile, "indexes/" + parString1 + ".json"); BufferedReader -~ * bufferedreader = null; -~ * -~ * try { bufferedreader = Files.newReader(file2, Charsets.UTF_8); JsonObject -~ * jsonobject = (new JsonParser()).parse(bufferedreader).getAsJsonObject(); -~ * JsonObject jsonobject1 = JsonUtils.getJsonObject(jsonobject, "objects", -~ * (JsonObject) null); if (jsonobject1 != null) { for (Entry entry : -~ * jsonobject1.entrySet()) { JsonObject jsonobject2 = (JsonObject) -~ * entry.getValue(); String s = (String) entry.getKey(); String[] astring = -~ * s.split("/", 2); String s1 = astring.length == 1 ? astring[0] : astring[0] + -~ * ":" + astring[1]; String s2 = JsonUtils.getString(jsonobject2, "hash"); File -~ * file3 = new File(file1, s2.substring(0, 2) + "/" + s2); -~ * this.resourceMap.put(s1, file3); } } } catch (JsonParseException var20) { -~ * logger.error("Unable to parse resource index file: " + file2); } catch -~ * (FileNotFoundException var21) { -~ * logger.error("Can\'t find the resource index file: " + file2); } finally { -~ * IOUtils.closeQuietly(bufferedreader); } -~ * -~ * } -~ */ -~ // } - -> CHANGE 1 : 4 @ 1 : 30 - -~ // public Map getResourceMap() { -~ // return this.resourceMap; -~ // } - -> EOF diff --git a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java index b69812a..b7267c2 100644 --- a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java +++ b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java @@ -438,21 +438,19 @@ + return s + I18n.format("options.off"); + } -> INSERT 6 : 14 @ 6 +> CHANGE 6 : 12 @ 6 : 10 -+ byte[] options = EagRuntime.getStorage("g"); -+ if (options == null) { -+ return; -+ } -+ loadOptions(options); -+ } -+ -+ public void loadOptions(byte[] data) { +~ byte[] options = EagRuntime.getStorage("g"); +~ if (options == null) { +~ return; +~ } +~ loadOptions(options); +~ } -> DELETE 1 @ 1 : 4 - -> CHANGE 1 : 3 @ 1 : 2 +> CHANGE 1 : 5 @ 1 : 2 +~ public void loadOptions(byte[] data) { +~ try { ~ BufferedReader bufferedreader = new BufferedReader( ~ new InputStreamReader(EaglerZLIB.newGZIPInputStream(new EaglerInputStream(data)))); @@ -654,9 +652,8 @@ + deferredShaderConf.writeOptions(printwriter); + -> INSERT 1 : 3 @ 1 +> INSERT 1 : 2 @ 1 -+ + return bao.toByteArray(); > INSERT 2 : 3 @ 2 diff --git a/patches/minecraft/net/minecraft/creativetab/CreativeTabs.edit.java b/patches/minecraft/net/minecraft/creativetab/CreativeTabs.edit.java index 6d88f89..a31eab7 100644 --- a/patches/minecraft/net/minecraft/creativetab/CreativeTabs.edit.java +++ b/patches/minecraft/net/minecraft/creativetab/CreativeTabs.edit.java @@ -9,4 +9,19 @@ + +> CHANGE 166 : 168 @ 166 : 168 + +~ for (int i = 0; i < this.enchantmentTypes.length; ++i) { +~ if (this.enchantmentTypes[i] == enchantmentType) { + +> CHANGE 22 : 24 @ 22 : 23 + +~ for (int i = 0; i < Enchantment.enchantmentsBookList.length; ++i) { +~ Enchantment enchantment = Enchantment.enchantmentsBookList[i]; + +> CHANGE 3 : 5 @ 3 : 5 + +~ for (int j = 0; j < enchantmentType.length && !flag; ++j) { +~ if (enchantment.type == enchantmentType[j]) { + > EOF diff --git a/patches/minecraft/net/minecraft/enchantment/EnchantmentHelper.edit.java b/patches/minecraft/net/minecraft/enchantment/EnchantmentHelper.edit.java index 0a4fe29..0fa0250 100644 --- a/patches/minecraft/net/minecraft/enchantment/EnchantmentHelper.edit.java +++ b/patches/minecraft/net/minecraft/enchantment/EnchantmentHelper.edit.java @@ -19,26 +19,54 @@ ~ private static final EaglercraftRandom enchantmentRand = new EaglercraftRandom(); -> CHANGE 211 : 213 @ 211 : 212 +> CHANGE 76 : 78 @ 76 : 78 + +~ for (int k = 0; k < stacks.length; ++k) { +~ int j = getEnchantmentLevel(enchID, stacks[k]); + +> CHANGE 26 : 28 @ 26 : 28 + +~ for (int k = 0; k < stacks.length; ++k) { +~ applyEnchantmentModifier(modifier, stacks[k]); + +> CHANGE 96 : 99 @ 96 : 97 + +~ ItemStack[] stacks = parEntityLivingBase.getInventory(); +~ for (int k = 0; k < stacks.length; ++k) { +~ ItemStack itemstack = stacks[k]; + +> CHANGE 8 : 10 @ 8 : 9 ~ public static int calcItemStackEnchantability(EaglercraftRandom parRandom, int parInt1, int parInt2, ~ ItemStack parItemStack) { -> CHANGE 14 : 15 @ 14 : 15 +> CHANGE 14 : 16 @ 14 : 16 ~ public static ItemStack addRandomEnchantment(EaglercraftRandom parRandom, ItemStack parItemStack, int parInt1) { +~ List list = buildEnchantmentList(parRandom, parItemStack, parInt1); -> CHANGE 7 : 8 @ 7 : 8 +> CHANGE 6 : 8 @ 6 : 7 -~ for (EnchantmentData enchantmentdata : (List) list) { +~ for (int i = 0, l = list.size(); i < l; ++i) { +~ EnchantmentData enchantmentdata = list.get(i); > CHANGE 11 : 13 @ 11 : 12 ~ public static List buildEnchantmentList(EaglercraftRandom randomIn, ItemStack itemStackIn, ~ int parInt1) { -> CHANGE 30 : 31 @ 30 : 31 +> CHANGE 14 : 15 @ 14 : 15 -~ for (EnchantmentData enchantmentdata1 : (List) arraylist) { +~ ArrayList arraylist = null; + +> CHANGE 15 : 17 @ 15 : 16 + +~ for (int m = 0, n = arraylist.size(); m < n; ++m) { +~ EnchantmentData enchantmentdata1 = arraylist.get(m); + +> CHANGE 30 : 32 @ 30 : 31 + +~ for (int j = 0; j < Enchantment.enchantmentsBookList.length; ++j) { +~ Enchantment enchantment = Enchantment.enchantmentsBookList[j]; > EOF diff --git a/patches/minecraft/net/minecraft/entity/Entity.edit.java b/patches/minecraft/net/minecraft/entity/Entity.edit.java index 8d34377..4e57b9c 100644 --- a/patches/minecraft/net/minecraft/entity/Entity.edit.java +++ b/patches/minecraft/net/minecraft/entity/Entity.edit.java @@ -34,26 +34,11 @@ ~ public abstract class Entity extends ModData implements ICommandSender { -> CHANGE 12 : 17 @ 12 : 17 - -~ public static double posX; -~ public static double posY; -~ public static double posZ; -~ public static double motionX; -~ public static double motionY; - -> CHANGE 27 : 29 @ 27 : 29 +> CHANGE 44 : 45 @ 44 : 45 ~ protected EaglercraftRandom rand; -~ public static int ticksExisted; -> CHANGE 10 : 13 @ 10 : 13 - -~ public static int chunkCoordX; -~ public static int chunkCoordY; -~ public static int chunkCoordZ; - -> CHANGE 13 : 14 @ 13 : 14 +> CHANGE 27 : 28 @ 27 : 28 ~ protected EaglercraftUUID entityUniqueID; diff --git a/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java index f7abcc6..ce06b6a 100644 --- a/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java +++ b/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java @@ -5,10 +5,8 @@ # Version: 1.0 # Author: lax1dude -> INSERT 2 : 5 @ 2 +> INSERT 2 : 3 @ 2 -+ import net.eaglerforge.api.BaseData; -+ import net.eaglerforge.api.ModData; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DynamicLightManager; > INSERT 90 : 101 @ 90 diff --git a/patches/minecraft/net/minecraft/init/Blocks.edit.java b/patches/minecraft/net/minecraft/init/Blocks.edit.java index 4efa736..5d1c7f5 100644 --- a/patches/minecraft/net/minecraft/init/Blocks.edit.java +++ b/patches/minecraft/net/minecraft/init/Blocks.edit.java @@ -5,8 +5,9 @@ # Version: 1.0 # Author: lax1dude -> INSERT 2 : 3 @ 2 +> INSERT 2 : 4 @ 2 ++ import net.eaglerforge.api.BaseData; + import net.eaglerforge.api.ModData; > DELETE 32 @ 32 : 33 @@ -233,4 +234,8 @@ ~ ~ static void doBootstrap() { +> INSERT 203 : 204 @ 203 + ++ + > EOF diff --git a/patches/minecraft/net/minecraft/inventory/Container.edit.java b/patches/minecraft/net/minecraft/inventory/Container.edit.java index ffb6dc7..7f92d03 100644 --- a/patches/minecraft/net/minecraft/inventory/Container.edit.java +++ b/patches/minecraft/net/minecraft/inventory/Container.edit.java @@ -7,71 +7,17 @@ > DELETE 2 @ 2 : 4 -> INSERT 3 : 9 @ 3 +> INSERT 3 : 7 @ 3 + + import com.google.common.collect.Lists; + import com.google.common.collect.Sets; + -+ import net.eaglerforge.api.BaseData; -+ import net.eaglerforge.api.ModData; > DELETE 2 @ 2 : 5 -> CHANGE 5 : 6 @ 5 : 6 - -~ public abstract class Container extends ModData { - -> INSERT 1 : 42 @ 1 - -+ -+ public void loadModData(BaseData data) { -+ BaseData[] parItemStacks = data.getBaseDataArr("inventoryItemStacks"); -+ for (int i = 0; i < parItemStacks.length && i < inventoryItemStacks.size(); i++) { -+ if (inventoryItemStacks.get(i) != null) { -+ inventoryItemStacks.get(i).loadModData(parItemStacks[i]); -+ } else if (parItemStacks[i] != null && parItemStacks[i].getRef() instanceof ItemStack) { -+ inventoryItemStacks.set(i, (ItemStack) parItemStacks[i].getRef()); -+ } -+ } -+ } -+ -+ public ModData makeModData() { -+ ModData data = new ModData(); -+ ModData[] parBaseDatas = new ModData[inventoryItemStacks.size()]; -+ for (int i = 0; i < inventoryItemStacks.size(); i++) { -+ if (inventoryItemStacks.get(i) != null) { -+ parBaseDatas[i] = inventoryItemStacks.get(i).makeModData(); -+ } -+ } -+ data.set("inventoryItemStacks", parBaseDatas); -+ data.setCallbackVoid("reload", () -> { -+ loadModData(data); -+ }); -+ data.setCallbackObject("getRef", () -> { -+ return this; -+ }); -+ data.setCallbackObjectArr("getPlayerList", () -> { -+ ModData[] parPlayerList = new ModData[playerList.size()]; -+ int i = 0; -+ for (EntityPlayer player : playerList) { -+ if (player != null) { -+ parPlayerList[i] = player.makeModData(); -+ } -+ i++; -+ } -+ return parPlayerList; -+ }); -+ return data; -+ } -+ - -> CHANGE 12 : 13 @ 12 : 13 +> CHANGE 19 : 20 @ 19 : 20 ~ this.inventoryItemStacks.add((ItemStack) null); -> INSERT 521 : 522 @ 521 - -+ - > EOF diff --git a/patches/minecraft/net/minecraft/item/ItemStack.edit.java b/patches/minecraft/net/minecraft/item/ItemStack.edit.java index c60cb15..a616fd5 100644 --- a/patches/minecraft/net/minecraft/item/ItemStack.edit.java +++ b/patches/minecraft/net/minecraft/item/ItemStack.edit.java @@ -9,11 +9,8 @@ > DELETE 3 @ 3 : 4 -> INSERT 1 : 12 @ 1 +> INSERT 1 : 9 @ 1 -+ -+ import net.eaglerforge.api.BaseData; -+ import net.eaglerforge.api.ModData; + import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; + import net.lax1dude.eaglercraft.v1_8.HString; + import java.util.Set; @@ -23,229 +20,13 @@ + import com.google.common.collect.Multimap; + -> CHANGE 13 : 14 @ 13 : 20 +> DELETE 13 @ 13 : 17 -~ import net.minecraft.nbt.*; - -> CHANGE 10 : 11 @ 10 : 11 - -~ public final class ItemStack extends ModData { - -> INSERT 16 : 168 @ 16 - -+ public void loadModData(BaseData data) { -+ stackSize = data.getInt("amount"); -+ animationsToGo = data.getInt("animationsToGo"); -+ itemDamage = data.getInt("itemDamage"); -+ if (itemFrame != null) { -+ itemFrame.loadModData(data.getBaseData("itemFrame")); -+ } -+ if (canDestroyCacheBlock != null) { -+ canDestroyCacheBlock.loadModData(data.getBaseData("canDestroyCacheBlock")); -+ } -+ if (canPlaceOnCacheBlock != null) { -+ canPlaceOnCacheBlock.loadModData(data.getBaseData("canPlaceOnCacheBlock")); -+ } -+ canDestroyCacheResult = data.getBoolean("canDestroyCacheResult"); -+ canPlaceOnCacheResult = data.getBoolean("canPlaceOnCacheResult"); -+ } -+ -+ public static ItemStack fromModData(BaseData data) { -+ return new ItemStack(Item.getItemById(data.getInt("itemId")), data.getInt("amount"), data.getInt("itemDamage")); -+ } -+ -+ public ModData makeModData() { -+ ModData data = new ModData(); -+ data.set("amount", stackSize); -+ data.set("animationsToGo", animationsToGo); -+ data.set("itemId", item.getIdFromItem(item)); -+ data.set("itemDamage", itemDamage); -+ if (itemFrame != null) { -+ data.set("itemFrame", itemFrame.makeModData()); -+ } -+ data.setCallbackObject("getRef", () -> { -+ return this; -+ }); -+ if (canDestroyCacheBlock != null) { -+ data.set("canDestroyCacheBlock", canDestroyCacheBlock.makeModData()); -+ } -+ data.set("canDestroyCacheResult", canDestroyCacheResult); -+ if (canPlaceOnCacheBlock != null) { -+ data.set("canPlaceOnCacheBlock", canPlaceOnCacheBlock.makeModData()); -+ } -+ data.set("canPlaceOnCacheResult", canPlaceOnCacheResult); -+ -+ data.setCallbackVoid("reload", () -> { -+ loadModData(data); -+ }); -+ data.setCallbackObject("getItem", () -> { -+ return getItem().makeModData(); -+ }); -+ data.setCallbackInt("getMaxStackSize", () -> { -+ return getMaxStackSize(); -+ }); -+ data.setCallbackBoolean("isStackable", () -> { -+ return isStackable(); -+ }); -+ data.setCallbackBoolean("isItemStackDamageable", () -> { -+ return isItemStackDamageable(); -+ }); -+ data.setCallbackBoolean("getHasSubtypes", () -> { -+ return getHasSubtypes(); -+ }); -+ data.setCallbackBoolean("isItemDamaged", () -> { -+ return isItemDamaged(); -+ }); -+ data.setCallbackInt("getItemDamage", () -> { -+ return getItemDamage(); -+ }); -+ data.setCallbackInt("getMetadata", () -> { -+ return getMetadata(); -+ }); -+ data.setCallbackVoidWithDataArg("setItemDamage", (BaseData params) -> { -+ setItemDamage(params.getInt("meta")); -+ }); -+ data.setCallbackInt("getMaxDamage", () -> { -+ return getMaxDamage(); -+ }); -+ data.setCallbackObject("copy", () -> { -+ return copy().makeModData(); -+ }); -+ data.setCallbackString("getUnlocalizedName", () -> { -+ return getUnlocalizedName(); -+ }); -+ data.setCallbackString("toString", () -> { -+ return toString(); -+ }); -+ data.setCallbackInt("getMaxItemUseDuration", () -> { -+ return getMaxItemUseDuration(); -+ }); -+ data.setCallbackString("getDisplayName", () -> { -+ return getDisplayName(); -+ }); -+ data.setCallbackObjectWithDataArg("setDisplayName", (BaseData params) -> { -+ return setStackDisplayName(params.getString("displayName")).makeModData(); -+ }); -+ data.setCallbackVoid("clearCustomName", () -> { -+ clearCustomName(); -+ }); -+ data.setCallbackBoolean("hasDisplayName", () -> { -+ return hasDisplayName(); -+ }); -+ data.setCallbackBoolean("hasEffect", () -> { -+ return hasEffect(); -+ }); -+ data.setCallbackBoolean("isItemEnchantable", () -> { -+ return isItemEnchantable(); -+ }); -+ data.setCallbackVoidWithDataArg("addEnchantment", (BaseData params) -> { -+ if (params.getBaseData("ench") instanceof Enchantment) { -+ addEnchantment((Enchantment) params.getBaseData("ench"), params.getInt("level")); -+ } -+ }); -+ data.setCallbackBoolean("isItemEnchanted", () -> { -+ return isItemEnchanted(); -+ }); -+ data.setCallbackBoolean("canEditBlocks", () -> { -+ return canEditBlocks(); -+ }); -+ data.setCallbackBoolean("isOnItemFrame", () -> { -+ return isOnItemFrame(); -+ }); -+ data.setCallbackInt("getRepairCost", () -> { -+ return getRepairCost(); -+ }); -+ data.setCallbackVoidWithDataArg("setRepairCost", (BaseData params) -> { -+ setRepairCost(params.getInt("cost")); -+ }); -+ data.setCallbackVoidWithDataArg("setItem", (BaseData params) -> { -+ if (params.getBaseData("newItem") instanceof Item) { -+ setItem((Item) params.getBaseData("newItem")); -+ } -+ }); -+ data.setCallbackBooleanWithDataArg("canDestroy", (BaseData params) -> { -+ return canDestroy(Block.getBlockById(params.getInt("blockId"))); -+ }); -+ data.setCallbackBooleanWithDataArg("canPlaceOn", (BaseData params) -> { -+ return canPlaceOn(Block.getBlockById(params.getInt("blockId"))); -+ }); -+ data.setCallbackString("toNBT", () -> { -+ return toNBT(); -+ }); -+ data.setCallbackVoidWithDataArg("fromNBT", (BaseData params) -> { -+ fromNBT(params.getString("nbt")); -+ }); -+ data.setCallbackStringArr("getLore", () -> { -+ return getLore(); -+ }); -+ data.setCallbackVoidWithDataArg("setLore", (BaseData params) -> { -+ setLore(params.getStringArr("lore")); -+ }); -+ -+ return data; -+ } -+ - -> INSERT 91 : 106 @ 91 - -+ public String toNBT() { -+ NBTTagCompound nbt = new NBTTagCompound(); -+ nbt = writeToNBT(nbt); -+ return nbt.toString(); -+ } -+ -+ public void fromNBT(String nbt) { -+ try { -+ NBTTagCompound nbtParsed = JsonToNBT.getTagFromJson(nbt); -+ this.readFromNBT(nbtParsed); -+ } catch (Exception e) { -+ // Swallowing the error! -+ } -+ } -+ - -> CHANGE 64 : 65 @ 64 : 65 +> CHANGE 185 : 186 @ 185 : 186 ~ public boolean attemptDamageItem(int amount, EaglercraftRandom rand) { -> INSERT 210 : 244 @ 210 - -+ public void setLore(String[] loreIn) { -+ if (this.stackTagCompound == null) { -+ this.stackTagCompound = new NBTTagCompound(); -+ } -+ if (!this.stackTagCompound.hasKey("display", 10)) { -+ this.stackTagCompound.setTag("display", new NBTTagCompound()); -+ } -+ NBTTagCompound display = this.stackTagCompound.getCompoundTag("display"); -+ NBTTagList lore = new NBTTagList(); -+ for (String strIn : loreIn) { -+ lore.appendTag(new NBTTagString(strIn)); -+ } -+ display.setTag("Lore", lore); -+ } -+ -+ public String[] getLore() { -+ if (this.stackTagCompound == null) { -+ return new String[0]; -+ } -+ if (!this.stackTagCompound.hasKey("display", 10)) { -+ return new String[0]; -+ } -+ NBTTagCompound display = this.stackTagCompound.getCompoundTag("display"); -+ if (!display.hasKey("Lore", 9)) { -+ return new String[0]; -+ } -+ NBTTagList lore = (NBTTagList) display.getTag("Lore"); -+ String[] outStrArr = new String[lore.tagCount()]; -+ for (int i = 0; i < outStrArr.length; i++) { -+ outStrArr[i] = lore.getStringTagAt(i); -+ } -+ return outStrArr; -+ } -+ - -> CHANGE 39 : 40 @ 39 : 40 +> CHANGE 249 : 250 @ 249 : 250 ~ s = s + HString.format("#%04d/%d%s", diff --git a/patches/minecraft/net/minecraft/network/play/server/S02PacketChat.edit.java b/patches/minecraft/net/minecraft/network/play/server/S02PacketChat.edit.java index 0c94b17..6d88f89 100644 --- a/patches/minecraft/net/minecraft/network/play/server/S02PacketChat.edit.java +++ b/patches/minecraft/net/minecraft/network/play/server/S02PacketChat.edit.java @@ -9,9 +9,4 @@ + -> CHANGE 6 : 8 @ 6 : 8 - -~ public IChatComponent chatComponent; -~ public byte type; - > EOF diff --git a/patches/minecraft/net/minecraft/util/AxisAlignedBB.edit.java b/patches/minecraft/net/minecraft/util/AxisAlignedBB.edit.java index 926f26d..786fe35 100644 --- a/patches/minecraft/net/minecraft/util/AxisAlignedBB.edit.java +++ b/patches/minecraft/net/minecraft/util/AxisAlignedBB.edit.java @@ -5,11 +5,10 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 2 : 5 @ 2 : 6 +> CHANGE 2 : 4 @ 2 : 6 ~ import net.eaglerforge.api.BaseData; ~ import net.eaglerforge.api.ModData; -~ import org.teavm.jso.JSObject; > CHANGE 1 : 8 @ 1 : 8 diff --git a/patches/minecraft/net/minecraft/util/Vec3.edit.java b/patches/minecraft/net/minecraft/util/Vec3.edit.java index 989fa48..d059c9f 100644 --- a/patches/minecraft/net/minecraft/util/Vec3.edit.java +++ b/patches/minecraft/net/minecraft/util/Vec3.edit.java @@ -5,11 +5,10 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 2 : 5 @ 2 : 4 +> CHANGE 2 : 4 @ 2 : 4 ~ import net.eaglerforge.api.BaseData; ~ import net.eaglerforge.api.ModData; -~ import org.teavm.jso.JSObject; > CHANGE 1 : 5 @ 1 : 5 @@ -18,7 +17,7 @@ ~ public double yCoord; ~ public double zCoord; -> INSERT 142 : 216 @ 142 +> INSERT 142 : 215 @ 142 + + public void loadModData(BaseData data) { @@ -93,6 +92,5 @@ + + return data; + } -+ > EOF diff --git a/patches/minecraft/net/minecraft/util/Vec4b.edit.java b/patches/minecraft/net/minecraft/util/Vec4b.edit.java index aa3eca5..847df6c 100644 --- a/patches/minecraft/net/minecraft/util/Vec4b.edit.java +++ b/patches/minecraft/net/minecraft/util/Vec4b.edit.java @@ -41,4 +41,8 @@ + } + +> INSERT 37 : 38 @ 37 + ++ + > EOF diff --git a/patches/minecraft/net/minecraft/world/World.edit.java b/patches/minecraft/net/minecraft/world/World.edit.java index 2d8251d..cca38b1 100644 --- a/patches/minecraft/net/minecraft/world/World.edit.java +++ b/patches/minecraft/net/minecraft/world/World.edit.java @@ -146,4 +146,8 @@ + .getBoolean("loadSpawnChunks")) + return false; +> INSERT 6 : 7 @ 6 + ++ + > EOF diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/FolderResourcePack.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/FolderResourcePack.java deleted file mode 100644 index 1a5cec5..0000000 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/FolderResourcePack.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -import com.google.common.collect.Sets; -import net.minecraft.client.resources.AbstractResourcePack; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.Set; - -/** - * Copyright (c) 2022-2023 lax1dude, ayunami2000. 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 FolderResourcePack extends AbstractResourcePack { - public FolderResourcePack(String resourcePackFileIn, String prefix) { - super(resourcePackFileIn); - } - - protected InputStream getInputStreamByName(String name) { - return new BufferedInputStream(new ByteArrayInputStream(new byte[0])); - } - - protected boolean hasResourceName(String name) { - return false; - } - - public Set getResourceDomains() { - return Sets.newHashSet(); - } -} \ No newline at end of file diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/SYS.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/SYS.java deleted file mode 100644 index 856bef1..0000000 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/SYS.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -/** - * Copyright (c) 2022-2023 lax1dude, ayunami2000. 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 SYS { - - public static final Object VFS = null; - - public static final void loadRemoteResourcePack(String url, String hash, Consumer cb, Consumer ast, Runnable loading) { - return; - } - - public static final boolean loadResourcePack(String name, InputStream data, String hash) { - return false; - } - - public static final List getResourcePackNames() { - return new ArrayList<>(); - } - - public static final void deleteResourcePack(String packName) { - // - } -} diff --git a/sources/main/java/net/eaglerforge/api/BaseData.java b/sources/main/java/net/eaglerforge/api/BaseData.java index fec89db..5aa041b 100644 --- a/sources/main/java/net/eaglerforge/api/BaseData.java +++ b/sources/main/java/net/eaglerforge/api/BaseData.java @@ -1,7 +1,5 @@ package net.eaglerforge.api; -import java.util.Map; - import org.teavm.jso.JSBody; import org.teavm.jso.JSObject; import org.teavm.jso.JSFunctor; diff --git a/sources/main/java/net/eaglerforge/api/LoggerAPI.java b/sources/main/java/net/eaglerforge/api/LoggerAPI.java index 72805f5..a054e28 100644 --- a/sources/main/java/net/eaglerforge/api/LoggerAPI.java +++ b/sources/main/java/net/eaglerforge/api/LoggerAPI.java @@ -1,6 +1,5 @@ package net.eaglerforge.api; -import net.lax1dude.eaglercraft.v1_8.EagRuntime; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; diff --git a/sources/main/java/net/eaglerforge/api/ModAPI.java b/sources/main/java/net/eaglerforge/api/ModAPI.java index 0e09764..c152a5a 100644 --- a/sources/main/java/net/eaglerforge/api/ModAPI.java +++ b/sources/main/java/net/eaglerforge/api/ModAPI.java @@ -4,16 +4,14 @@ import net.eaglerforge.gui.EmptyGui; import net.eaglerforge.gui.ModGUI; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; +import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; import net.minecraft.client.ClientBrandRetriever; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityTNTPrimed; import net.minecraft.util.ChatComponentText; import me.otterdev.UwUAPI; import org.teavm.jso.JSBody; import org.teavm.jso.JSObject; -import net.eaglerforge.EaglerForge; import net.minecraft.enchantment.Enchantment; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -87,7 +85,7 @@ public class ModAPI { newEvent("postmotionupdate"); newEvent("motionupdate"); newEvent("premotionupdate"); - + newEvent("sendchatmessage"); newEvent("update"); /*newEvent("packetjoingame"); @@ -188,7 +186,6 @@ public class ModAPI { newEvent("sendpacketcustompayload"); newEvent("sendpacketspectate"); newEvent("sendpacketresourcepackstatus");*/ - newEvent("packetchat"); globalsFunctor(this); globalsRequireFunctor(this); globalsUpdateFunctor(this); @@ -218,6 +215,7 @@ public class ModAPI { setGlobal("logger", LoggerAPI.makeModData()); setGlobal("emptygui", EmptyGui.makeModData()); setGlobal("ScaledResolution", ScaledResolution.makeModData()); + setGlobal("GlStateManager", GlStateManager.makeModData()); getModAPI().setCallbackString("currentScreen", () -> { return mc.currentScreen.toString(); }); @@ -227,9 +225,15 @@ public class ModAPI { getModAPI().setCallbackInt("getdisplayWidth", () -> { return mc.displayWidth; }); + getModAPI().setCallbackInt("getdisplayWidth", () -> { + return mc.displayWidth; + }); getModAPI().setCallbackInt("getFONT_HEIGHT", () -> { return mc.fontRendererObj.FONT_HEIGHT; }); + getModAPI().setCallbackIntWithDataArg("getStringWidth", (BaseData params) -> { + return mc.fontRendererObj.getStringWidth(params.getString("string")); + }); getModAPI().setCallbackVoidWithDataArg("drawStringWithShadow", (BaseData params) -> { mc.fontRendererObj.drawStringWithShadow(params.getString("msg"), params.getFloat("x"), params.getFloat("y"), params.getInt("color")); }); diff --git a/sources/main/java/net/eaglerforge/api/PlatformAPI.java b/sources/main/java/net/eaglerforge/api/PlatformAPI.java index dbe412a..2395aa6 100644 --- a/sources/main/java/net/eaglerforge/api/PlatformAPI.java +++ b/sources/main/java/net/eaglerforge/api/PlatformAPI.java @@ -2,7 +2,6 @@ package net.eaglerforge.api; import net.lax1dude.eaglercraft.v1_8.EagRuntime; import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; -import net.minecraft.client.Minecraft; import org.teavm.jso.JSBody; // this is me.otterdev.PlatformAPI but modified to have more features and be more optimized diff --git a/sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java b/sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java index 95f6fac..1f8187d 100644 --- a/sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java +++ b/sources/main/java/net/eaglerforge/gui/WIP_GuiMods.java @@ -12,7 +12,6 @@ import java.util.List; import com.google.common.collect.Lists; import net.lax1dude.eaglercraft.v1_8.EagRuntime; -import net.lax1dude.eaglercraft.v1_8.vfs.SYS; import net.lax1dude.eaglercraft.v1_8.internal.FileChooserResult; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; @@ -50,7 +49,6 @@ public class WIP_GuiMods extends GuiScreen { this.buttonList.add(btn = new GuiOptionButton(2, this.width / 2 - 154, this.height - 48, I18n.format("eaglerforge.menu.mods.addmod" + "", new Object[0]))); - btn.enabled = SYS.VFS != null; this.buttonList.add( new GuiOptionButton(1, this.width / 2 + 4, this.height - 48, I18n.format("gui.done", new Object[0]))); if (!this.changed) { @@ -117,8 +115,6 @@ public class WIP_GuiMods extends GuiScreen { protected void actionPerformed(GuiButton parGuiButton) { if (parGuiButton.enabled) { if (parGuiButton.id == 2) { - if (SYS.VFS == null) - return; EagRuntime.displayFileChooser("text/javascript", "js"); } else if (parGuiButton.id == 1) { if (this.changed) { @@ -162,7 +158,6 @@ public class WIP_GuiMods extends GuiScreen { return; logger.info("Loading resource pack: {}", packFile.fileName); mc.loadingScreen.eaglerShow(I18n.format("resourcePack.load.loading"), packFile.fileName); - SYS.loadResourcePack(packFile.fileName, new ByteArrayInputStream(packFile.fileData), null); ArrayList arraylist = Lists.newArrayList(); 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 f2f1f1f..5e70a9f 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java @@ -30,7 +30,7 @@ public class EaglercraftVersion { // Updating configuration - public static final boolean enableUpdateService = true; + public static final boolean enableUpdateService = false; public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client"; public static final int updateBundlePackageVersionInt = 26; @@ -46,7 +46,7 @@ public class EaglercraftVersion { public static int loadedmods = returntotalloadedmods(); public static final String mainMenuStringA = "Minecraft* 1.8.8"; - public static String mainMenuStringB = projectForkName + " " + projectForkVersion + " (" + 0 + " Mods loaded)"; + public static String mainMenuStringB = projectForkName + " " + projectForkVersion + " (" + loadedmods + " Mods loaded)"; public static final String mainMenuStringC = ""; public static final String mainMenuStringD = "Resources Copyright Mojang AB"; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java index 28051cc..21ec7b8 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java @@ -1,5 +1,7 @@ package net.lax1dude.eaglercraft.v1_8.opengl; +import net.eaglerforge.api.BaseData; +import net.eaglerforge.api.ModData; import net.lax1dude.eaglercraft.v1_8.internal.buffer.FloatBuffer; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; @@ -25,7 +27,7 @@ import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*; * POSSIBILITY OF SUCH DAMAGE. * */ -public class GlStateManager { +public class GlStateManager extends ModData { static final Logger logger = LogManager.getLogger("GlStateManager"); @@ -1186,4 +1188,43 @@ public class GlStateManager { public static void recompileShaders() { FixedFunctionPipeline.flushCache(); } + + public static ModData makeModData() { + ModData GlStateManagerglobal = new ModData(); + GlStateManagerglobal.setCallbackVoid("reload", () -> { + loadModData(GlStateManagerglobal); + }); + GlStateManagerglobal.setCallbackVoid("pushMatrix", () -> { + pushMatrix(); + }); + GlStateManagerglobal.setCallbackVoid("popMatrix", () -> { + popMatrix(); + }); + GlStateManagerglobal.setCallbackVoidWithDataArg("scale", (BaseData params) -> { + scale(params.getFloat("x"),params.getFloat("y"),params.getFloat("z")); + }); + GlStateManagerglobal.setCallbackVoidWithDataArg("translate", (BaseData params) -> { + translate(params.getFloat("x"),params.getFloat("y"),params.getFloat("z")); + }); + GlStateManagerglobal.setCallbackVoidWithDataArg("recompileShaders", (BaseData params) -> { + recompileShaders(); + }); + GlStateManagerglobal.setCallbackVoidWithDataArg("color", (BaseData params) -> { + color(params.getFloat("colorRed"),params.getFloat("colorGreen"),params.getFloat("colorBlue"),params.getFloat("colorAlpha")); + }); + GlStateManagerglobal.setCallbackVoidWithDataArg("rotate", (BaseData params) -> { + rotate(params.getFloat("angle"),params.getFloat("x"),params.getFloat("y"),params.getFloat("z")); + }); + GlStateManagerglobal.setCallbackVoidWithDataArg("matrixMode", (BaseData params) -> { + matrixMode(params.getInt("mode")); + }); + return GlStateManagerglobal; + } + public static void loadModData(BaseData data) { + stateDepthMask = data.getBoolean("stateDepthMask"); + stateCull = data.getBoolean("stateCull"); + stateFog = data.getBoolean("stateFog"); + stateGlobalBlend = data.getBoolean("stateGlobalBlend"); + stateLighting = data.getBoolean("stateLighting"); + } } \ No newline at end of file diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/vfs/FolderResourcePack.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/vfs/FolderResourcePack.java deleted file mode 100644 index f478d07..0000000 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/vfs/FolderResourcePack.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.vfs; - -/** - * Copyright (c) 2022-2023 lax1dude, ayunami2000. 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 FolderResourcePack extends net.lax1dude.eaglercraft.v1_8.internal.vfs.FolderResourcePack { - public FolderResourcePack(String resourcePackFileIn, String prefix) { - super(resourcePackFileIn, prefix); - } -} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/vfs/SYS.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/vfs/SYS.java deleted file mode 100644 index a4a64d4..0000000 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/vfs/SYS.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.vfs; - -/** - * Copyright (c) 2022-2023 lax1dude, ayunami2000. 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 SYS extends net.lax1dude.eaglercraft.v1_8.internal.vfs.SYS { -} diff --git a/sources/setup/workspace_template/CompileJS.bat b/sources/setup/workspace_template/CompileJS.bat new file mode 100644 index 0000000..7969fc9 --- /dev/null +++ b/sources/setup/workspace_template/CompileJS.bat @@ -0,0 +1,4 @@ +@echo off +title gradlew generateJavascript +gradlew generateJavascript +pause \ No newline at end of file diff --git a/sources/setup/workspace_template/CompileJS.sh b/sources/setup/workspace_template/CompileJS.sh new file mode 100644 index 0000000..4d6d4ca --- /dev/null +++ b/sources/setup/workspace_template/CompileJS.sh @@ -0,0 +1,3 @@ +#!/bin/sh +chmod +x gradlew +./gradlew generateJavascript \ No newline at end of file diff --git a/sources/setup/workspace_template/build.gradle b/sources/setup/workspace_template/build.gradle index 1600fac..34d3181 100644 --- a/sources/setup/workspace_template/build.gradle +++ b/sources/setup/workspace_template/build.gradle @@ -21,15 +21,12 @@ dependencies { teavm(teavm.libs.jso) teavm(teavm.libs.jsoApis) } -dependencies { - implementation teavm.libs.jsoApis -} teavm.js { - obfuscated = false; + obfuscated = true sourceMap = true targetFileName = "../classes.js" - optimization = org.teavm.gradle.api.OptimizationLevel.AGGRESSIVE; + optimization = org.teavm.gradle.api.OptimizationLevel.AGGRESSIVE outOfProcess = false fastGlobalAnalysis = false processMemory = 512 diff --git a/sources/setup/workspace_template/desktopRuntime/libwebrtc-java.so b/sources/setup/workspace_template/desktopRuntime/libwebrtc-java.so new file mode 100644 index 0000000..4ffd25a Binary files /dev/null and b/sources/setup/workspace_template/desktopRuntime/libwebrtc-java.so differ diff --git a/sources/setup/workspace_template/desktopRuntime/webrtc-java-0.8.0.jar b/sources/setup/workspace_template/desktopRuntime/webrtc-java-0.8.0.jar new file mode 100644 index 0000000..f6eac1a Binary files /dev/null and b/sources/setup/workspace_template/desktopRuntime/webrtc-java-0.8.0.jar differ diff --git a/sources/setup/workspace_template/desktopRuntime/webrtc-java.dll b/sources/setup/workspace_template/desktopRuntime/webrtc-java.dll new file mode 100644 index 0000000..00b5ad5 Binary files /dev/null and b/sources/setup/workspace_template/desktopRuntime/webrtc-java.dll differ diff --git a/sources/setup/workspace_template/gradle.properties b/sources/setup/workspace_template/gradle.properties new file mode 100644 index 0000000..a36eb1c --- /dev/null +++ b/sources/setup/workspace_template/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx2G -Xms2G \ No newline at end of file diff --git a/sources/setup/workspace_template/javascript/ModAPI.js b/sources/setup/workspace_template/javascript/ModAPI.js index 78f2b7b..424f149 100644 --- a/sources/setup/workspace_template/javascript/ModAPI.js +++ b/sources/setup/workspace_template/javascript/ModAPI.js @@ -4,6 +4,7 @@ function initAPI(version) { ModAPI.events.types = ["event"]; ModAPI.events.listeners = { "event": [] }; ModAPI.globals = {}; + ModAPI.version = version; ModAPI.addEventListener = function AddEventListener(name, callback) { if (!callback) { diff --git a/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt b/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt index c344dfb..dea715b 100644 --- a/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt +++ b/sources/setup/workspace_template/javascript/OfflineDownloadTemplate.txt @@ -42,6 +42,7 @@ function initAPI(version) { ModAPI.events.types = ["event"]; ModAPI.events.listeners = { "event": [] }; ModAPI.globals = {}; + ModAPI.version = version; ModAPI.addEventListener = function AddEventListener(name, callback) { if (!callback) { diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/BooleanResult.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/BooleanResult.java deleted file mode 100644 index c08510a..0000000 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/BooleanResult.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -/** - * Copyright (c) 2022-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 BooleanResult { - - public static final BooleanResult TRUE = new BooleanResult(true); - public static final BooleanResult FALSE = new BooleanResult(false); - - public final boolean bool; - - private BooleanResult(boolean b) { - bool = b; - } - - public static BooleanResult _new(boolean b) { - return b ? TRUE : FALSE; - } - -} \ No newline at end of file diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/FolderResourcePack.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/FolderResourcePack.java deleted file mode 100644 index 2309875..0000000 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/FolderResourcePack.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -import com.google.common.collect.Sets; -import net.minecraft.client.resources.AbstractResourcePack; - -import java.io.InputStream; -import java.util.List; -import java.util.Set; - -/** - * Copyright (c) 2022-2023 lax1dude, ayunami2000. 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 FolderResourcePack extends AbstractResourcePack { - private final String prefix; - - public FolderResourcePack(String resourcePackFileIn, String prefix) { - super(resourcePackFileIn); - this.prefix = prefix; - } - - protected InputStream getInputStreamByName(String name) { - return SYS.VFS.getFile(prefix + this.resourcePackFile + "/" + name).getInputStream(); - } - - protected boolean hasResourceName(String name) { - return SYS.VFS.fileExists(prefix + this.resourcePackFile + "/" + name); - } - - public Set getResourceDomains() { - Set set = Sets.newHashSet(); - String pfx = prefix + this.resourcePackFile + "/assets/"; - List files = SYS.VFS.listFiles(pfx); - - for (String file : files) { - String s = file.substring(pfx.length()); - int ind = s.indexOf('/'); - if (ind != -1) s = s.substring(0, ind); - if (!s.equals(s.toLowerCase())) { - this.logNameNotLowercase(s); - } else { - set.add(s); - } - } - - return set; - } -} \ No newline at end of file diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/SYS.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/SYS.java deleted file mode 100644 index ed909c3..0000000 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/SYS.java +++ /dev/null @@ -1,194 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -import net.lax1dude.eaglercraft.v1_8.EagRuntime; -import net.lax1dude.eaglercraft.v1_8.crypto.SHA1Digest; -import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; -import net.lax1dude.eaglercraft.v1_8.internal.teavm.ArrayBufferInputStream; -import net.lax1dude.eaglercraft.v1_8.internal.vfs.VirtualFilesystem.VFSHandle; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.function.Consumer; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -/** - * Copyright (c) 2022-2023 lax1dude, ayunami2000. 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 SYS { - - public static final VirtualFilesystem VFS; - - static { - VFSHandle vh = VirtualFilesystem.openVFS("_net_lax1dude_eaglercraft_v1_8_VirtualFilesystem_"); - - if(vh.vfs == null) { - System.err.println("Could not init filesystem!"); - } - - VFS = vh.vfs; - - List srp = getResourcePackNames(true); - for (String name : srp) { - if (System.currentTimeMillis() - Long.parseLong(name.substring(name.lastIndexOf('_') + 1)) >= 604800000L) { - deleteResourcePack(name, true); - } - } - } - - public static final void loadRemoteResourcePack(String url, String hash, Consumer cb, Consumer ast, Runnable loading) { - if (!hash.matches("^[a-f0-9]{40}$")) { - cb.accept(null); - return; - } - List srpPre = getResourcePackNames(true); - String alreadyHere = srpPre.stream().filter(s -> s.startsWith(hash + "_")).findFirst().orElse(null); - if (alreadyHere != null) { - cb.accept(alreadyHere); - return; - } - PlatformRuntime.downloadRemoteURI(url, ab -> { - ast.accept(() -> { - if (ab == null) { - cb.accept(null); - return; - } - List srp = getResourcePackNames(true); - // delete old server resource packs - todo: test - if (srp.size() > 5) { - srp.sort(Comparator.comparingLong(val -> Long.parseLong(val.substring(val.lastIndexOf('_') + 1)))); - for (int i = 0; i < srp.size() - 5; i++) { - deleteResourcePack(srp.get(i), true); - } - } - String packName = hash + "_" + System.currentTimeMillis(); - loading.run(); - boolean success = loadResourcePack(packName + ".zip", new ArrayBufferInputStream(ab), hash); - if (success) { - cb.accept(packName); - return; - } - cb.accept(null); - }); - }); - } - - public static final boolean loadResourcePack(String name, InputStream is, String hash) { - BufferedInputStream bis = new BufferedInputStream(is); - - bis.mark(Integer.MAX_VALUE); - - if (hash != null) { - try { - SHA1Digest digest = new SHA1Digest(); - byte[] buffer = new byte[16000]; - int read = 0; - - while ((read = bis.read(buffer)) > 0) { - digest.update(buffer, 0, read); - } - - byte[] sha1sum = new byte[20]; - digest.doFinal(sha1sum, 0); - bis.reset(); - if (!hash.equals((new BigInteger(1, sha1sum)).toString(16))) { - return false; - } - } catch (IOException e) { - EagRuntime.debugPrintStackTrace(e); - return false; - } - } - - String packName = name.substring(0, name.lastIndexOf('.')).replace('/', '_'); - try { - int prefixLen = Integer.MAX_VALUE; - ZipInputStream ziss = new ZipInputStream(bis); - ZipEntry zipEntryy; - while ((zipEntryy = ziss.getNextEntry()) != null) { - String zn; - if (!zipEntryy.isDirectory() && ((zn = zipEntryy.getName()).equals("pack.mcmeta") || zn.endsWith("/pack.mcmeta"))) { - int currPrefixLen = zn.length() - 11; - if (prefixLen > currPrefixLen) { - prefixLen = currPrefixLen; - } - } - } - if (prefixLen == Integer.MAX_VALUE) { - prefixLen = 0; - } - - bis.reset(); - - ZipInputStream zis = new ZipInputStream(bis); - byte[] bb = new byte[16000]; - ZipEntry zipEntry; - while ((zipEntry = zis.getNextEntry()) != null) { - if (zipEntry.isDirectory()) continue; - if (zipEntry.getName().length() <= prefixLen) continue; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int len; - while ((len = zis.read(bb)) != -1) { - baos.write(bb, 0, len); - } - baos.close(); - SYS.VFS.getFile((hash == null ? "resourcepacks/" : "srp/") + packName + "/" + zipEntry.getName().substring(prefixLen)).setAllBytes(baos.toByteArray()); - } - zis.closeEntry(); - zis.close(); - return true; - } catch (IOException e) { - EagRuntime.debugPrintStackTrace(e); - return false; - } - } - - public static final List getResourcePackNames() { - return getResourcePackNames(false); - } - - private static final List getResourcePackNames(boolean srp) { - List res = new ArrayList<>(); - List resourcePackFiles = SYS.VFS.listFiles(srp ? "srp/" : "resourcepacks/"); - for (String path : resourcePackFiles) { - String trimmed = path.substring(srp ? 4 : 14); - trimmed = trimmed.substring(0, trimmed.indexOf('/')); - boolean hasIt = false; - for (String alreadyHas : res) { - if (trimmed.equals(alreadyHas)) { - hasIt = true; - break; - } - } - if (hasIt) continue; - res.add(trimmed); - } - return res; - } - - public static final void deleteResourcePack(String packName) { - deleteResourcePack(packName, false); - } - - private static final void deleteResourcePack(String packName, boolean srp) { - SYS.VFS.deleteFiles((srp ? "srp/" : "resourcepacks/") + packName); - } -} diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VFSIterator.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VFSIterator.java deleted file mode 100644 index 01a3fd1..0000000 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VFSIterator.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -/** - * Copyright (c) 2022 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 interface VFSIterator { - - public static class BreakLoop extends RuntimeException { - public BreakLoop() { - super("iterator loop break request"); - } - } - - public default void end() { - throw new BreakLoop(); - } - - public void next(VIteratorFile entry); - -} diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VFile.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VFile.java deleted file mode 100644 index c1712ba..0000000 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VFile.java +++ /dev/null @@ -1,242 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Copyright (c) 2022 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 VFile { - - public static final String pathSeperator = "/"; - public static final String[] altPathSeperator = new String[] { "\\" }; - - public static String normalizePath(String p) { - for(int i = 0; i < altPathSeperator.length; ++i) { - p = p.replace(altPathSeperator[i], pathSeperator); - } - if(p.startsWith(pathSeperator)) { - p = p.substring(1); - } - if(p.endsWith(pathSeperator)) { - p = p.substring(0, p.length() - pathSeperator.length()); - } - return p; - } - - public static String[] splitPath(String p) { - String[] pth = normalizePath(p).split(pathSeperator); - for(int i = 0; i < pth.length; ++i) { - pth[i] = pth[i].trim(); - } - return pth; - } - - protected String path; - - public static String createPath(Object... p) { - ArrayList r = new ArrayList(); - for(int i = 0; i < p.length; ++i) { - if(p[i] == null) { - continue; - } - String gg = p[i].toString(); - if(gg == null) { - continue; - } - String[] parts = splitPath(gg); - for(int j = 0; j < parts.length; ++j) { - if(parts[j] == null || parts[j].equals(".")) { - continue; - }else if(parts[j].equals("..") && r.size() > 0) { - int k = r.size() - 1; - if(!r.get(k).equals("..")) { - r.remove(k); - }else { - r.add(".."); - } - }else { - r.add(parts[j]); - } - } - } - if(r.size() > 0) { - StringBuilder s = new StringBuilder(); - for(int i = 0; i < r.size(); ++i) { - if(i > 0) { - s.append(pathSeperator); - } - s.append(r.get(i)); - } - return s.toString(); - }else { - return null; - } - } - - public VFile(Object... p) { - this.path = createPath(p); - } - - public InputStream getInputStream() { - return isRelative() ? null : SYS.VFS.getFile(path).getInputStream(); - } - - public OutputStream getOutputStream() { - return isRelative() ? null : SYS.VFS.getFile(path).getOutputStream(); - } - - public String toString() { - return path; - } - - public boolean isRelative() { - return path == null || path.contains(".."); - } - - public boolean canRead() { - return !isRelative() && SYS.VFS.fileExists(path); - } - - public String getPath() { - return path.equals("unnamed") ? null : path; - } - - public String getName() { - if(path == null) { - return null; - } - int i = path.indexOf(pathSeperator); - return i == -1 ? path : path.substring(i + 1); - } - - public boolean canWrite() { - return !isRelative(); - } - - public String getParent() { - if(path == null) { - return null; - } - int i = path.indexOf(pathSeperator); - return i == -1 ? ".." : path.substring(0, i); - } - - public int hashCode() { - return path == null ? 0 : path.hashCode(); - } - - public boolean equals(Object o) { - return path != null && o != null && (o instanceof VFile) && path.equals(((VFile)o).path); - } - - public boolean exists() { - return !isRelative() && SYS.VFS.fileExists(path); - } - - public boolean delete() { - return !isRelative() && SYS.VFS.deleteFile(path); - } - - public boolean renameTo(String p, boolean copy) { - if(!isRelative() && SYS.VFS.renameFile(path, p, copy)) { - path = p; - return true; - } - return false; - } - - public int length() { - return isRelative() ? -1 : SYS.VFS.getFile(path).getSize(); - } - - public void getBytes(int fileOffset, byte[] array, int offset, int length) { - if(isRelative()) { - throw new ArrayIndexOutOfBoundsException("File is relative"); - } - SYS.VFS.getFile(path).getBytes(fileOffset, array, offset, length); - } - - public void setCacheEnabled() { - if(isRelative()) { - throw new RuntimeException("File is relative"); - } - SYS.VFS.getFile(path).setCacheEnabled(); - } - - public byte[] getAllBytes() { - if(isRelative()) { - return null; - } - return SYS.VFS.getFile(path).getAllBytes(); - } - - public String getAllChars() { - if(isRelative()) { - return null; - } - return SYS.VFS.getFile(path).getAllChars(); - } - - public String[] getAllLines() { - if(isRelative()) { - return null; - } - return SYS.VFS.getFile(path).getAllLines(); - } - - public byte[] getAllBytes(boolean copy) { - if(isRelative()) { - return null; - } - return SYS.VFS.getFile(path).getAllBytes(copy); - } - - public boolean setAllChars(String bytes) { - if(isRelative()) { - return false; - } - return SYS.VFS.getFile(path).setAllChars(bytes); - } - - public boolean setAllBytes(byte[] bytes) { - if(isRelative()) { - return false; - } - return SYS.VFS.getFile(path).setAllBytes(bytes); - } - - public boolean setAllBytes(byte[] bytes, boolean copy) { - if(isRelative()) { - return false; - } - return SYS.VFS.getFile(path).setAllBytes(bytes, copy); - } - - public List list() { - if(isRelative()) { - return Arrays.asList(path); - } - return SYS.VFS.listFiles(path); - } - - public int deleteAll() { - return isRelative() ? 0 : SYS.VFS.deleteFiles(path); - } - -} diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VIteratorFile.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VIteratorFile.java deleted file mode 100644 index c0c0881..0000000 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VIteratorFile.java +++ /dev/null @@ -1,299 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.List; - -import org.teavm.interop.Async; -import org.teavm.interop.AsyncCallback; -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; -import org.teavm.jso.dom.events.Event; -import org.teavm.jso.dom.events.EventListener; -import org.teavm.jso.indexeddb.IDBCursor; -import org.teavm.jso.indexeddb.IDBRequest; -import org.teavm.jso.typedarrays.ArrayBuffer; -import org.teavm.jso.typedarrays.Uint8Array; - -import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMUtils; - -/** - * Copyright (c) 2022 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. - * - */ - -/** - * Do not use an instance of this class outside of the VFSIterator.next() method - */ -public class VIteratorFile extends VFile { - - static final VIteratorFile instance = new VIteratorFile(); - - private VIteratorFile() { - super(""); - this.idx = -1; - this.cur = null; - this.vfs = null; - } - - private static class VirtualIteratorOutputStream extends ByteArrayOutputStream { - - private final VIteratorFile itr; - - protected VirtualIteratorOutputStream(VIteratorFile itr) { - this.itr = itr; - } - - public void close() throws IOException { - if(!itr.setAllBytes(super.toByteArray(), false)) { - throw new IOException("Could not close stream and write to \"" + itr.path + "\" on VFS \"" + itr.vfs.database + "\" (the file was probably deleted)"); - } - } - - } - - private int idx; - private IDBCursor cur; - private VirtualFilesystem vfs; - private boolean wasDeleted; - - @JSBody(params = { "k" }, script = "return ((typeof k) === \"string\") ? k : (((typeof k) === \"undefined\") ? null : (((typeof k[0]) === \"string\") ? k[0] : null));") - private static native String readKey(JSObject k); - - static VIteratorFile create(int idx, VirtualFilesystem vfs, IDBCursor cur) { - String k = readKey(cur.getKey()); - if(k == null) { - return null; - } - instance.update(idx, k, vfs, cur); - return instance; - } - - public VFile makeVFile() { - return new VFile(path); - } - - private void update(int idx, String path, VirtualFilesystem vfs, IDBCursor cur) { - this.idx = idx; - this.path = path; - this.vfs = vfs; - this.cur = cur; - this.wasDeleted = false; - } - - public InputStream getInputStream() { - return !wasDeleted ? new ByteArrayInputStream(getAllBytes()) : null; - } - - public OutputStream getOutputStream() { - return !wasDeleted ? new VirtualIteratorOutputStream(this) : null; - } - - public String toString() { - return path; - } - - public boolean isRelative() { - return false; - } - - public boolean canRead() { - return !wasDeleted; - } - - public String getPath() { - return path; - } - - public String getName() { - if(path == null) { - return null; - } - int i = path.indexOf(pathSeperator); - return i == -1 ? path : path.substring(i + 1); - } - - public boolean canWrite() { - return !wasDeleted; - } - - public String getParent() { - if(path == null) { - return null; - } - int i = path.indexOf(pathSeperator); - return i == -1 ? ".." : path.substring(0, i); - } - - public int hashCode() { - return path == null ? 0 : path.hashCode(); - } - - public boolean equals(Object o) { - return path != null && o != null && (o instanceof VFile) && path.equals(((VFile)o).path); - } - - public boolean exists() { - return !wasDeleted; - } - - public boolean delete() { - return wasDeleted = AsyncHandlers.awaitRequest(cur.delete()).bool; - } - - public boolean renameTo(String p) { - byte[] data = getAllBytes(); - String op = path; - path = p; - if(!setAllBytes(data)) { - path = op; - return false; - } - path = op; - if(!delete()) { - return false; - } - path = p; - return true; - } - - public int length() { - JSObject obj = cur.getValue(); - - if(obj == null) { - throw new RuntimeException("Value of entry is missing"); - } - - ArrayBuffer arr = readRow(obj); - - if(arr == null) { - throw new RuntimeException("Value of the fucking value of the entry is missing"); - } - - return arr.getByteLength(); - } - - public void getBytes(int fileOffset, byte[] array, int offset, int length) { - JSObject obj = cur.getValue(); - - if(obj == null) { - throw new ArrayIndexOutOfBoundsException("Value of entry is missing"); - } - - ArrayBuffer arr = readRow(obj); - - if(arr == null) { - throw new ArrayIndexOutOfBoundsException("Value of the fucking value of the entry is missing"); - } - - Uint8Array a = Uint8Array.create(arr); - - if(a.getLength() < fileOffset + length) { - throw new ArrayIndexOutOfBoundsException("file '" + path + "' size was "+a.getLength()+" but user tried to read index "+(fileOffset + length - 1)); - } - - for(int i = 0; i < length; ++i) { - array[i + offset] = (byte)a.get(i + fileOffset); - } - } - - public void setCacheEnabled() { - // no - } - - @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? null : ((typeof obj.data === 'undefined') ? null : obj.data);") - private static native ArrayBuffer readRow(JSObject obj); - - public byte[] getAllBytes() { - JSObject obj = cur.getValue(); - - if(obj == null) { - return null; - } - - ArrayBuffer arr = readRow(obj); - - if(arr == null) { - return null; - } - - return TeaVMUtils.wrapUnsignedByteArray(Uint8Array.create(arr)); - } - - public String getAllChars() { - return VirtualFilesystem.utf8(getAllBytes()); - } - - public String[] getAllLines() { - return VirtualFilesystem.lines(VirtualFilesystem.utf8(getAllBytes())); - } - - public byte[] getAllBytes(boolean copy) { - return getAllBytes(); - } - - public boolean setAllChars(String bytes) { - return setAllBytes(VirtualFilesystem.utf8(bytes)); - } - - public List list() { - throw new RuntimeException("Cannot perform list all in VFS callback"); - } - - public int deleteAll() { - throw new RuntimeException("Cannot perform delete all in VFS callback"); - } - - @JSBody(params = { "pat", "dat" }, script = "return { path: pat, data: dat };") - private static native JSObject writeRow(String name, ArrayBuffer data); - - public boolean setAllBytes(byte[] bytes) { - ArrayBuffer a = ArrayBuffer.create(bytes.length); - Uint8Array ar = Uint8Array.create(a); - ar.set(bytes); - JSObject obj = writeRow(path, a); - BooleanResult r = AsyncHandlers.awaitRequest(cur.update(obj)); - return r.bool; - } - - public boolean setAllBytes(byte[] bytes, boolean copy) { - return setAllBytes(bytes); - } - - public static class AsyncHandlers { - - @Async - public static native BooleanResult awaitRequest(IDBRequest r); - - private static void awaitRequest(IDBRequest r, final AsyncCallback cb) { - r.addEventListener("success", new EventListener() { - @Override - public void handleEvent(Event evt) { - cb.complete(BooleanResult._new(true)); - } - }); - r.addEventListener("error", new EventListener() { - @Override - public void handleEvent(Event evt) { - cb.complete(BooleanResult._new(false)); - } - }); - } - - } - -} diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VirtualFilesystem.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VirtualFilesystem.java deleted file mode 100644 index 7acb417..0000000 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/vfs/VirtualFilesystem.java +++ /dev/null @@ -1,702 +0,0 @@ -package net.lax1dude.eaglercraft.v1_8.internal.vfs; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - -import net.lax1dude.eaglercraft.v1_8.EaglerInputStream; -import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMUtils; - -import org.teavm.interop.Async; -import org.teavm.interop.AsyncCallback; -import org.teavm.jso.JSBody; -import org.teavm.jso.JSObject; -import org.teavm.jso.dom.events.EventListener; -import org.teavm.jso.indexeddb.EventHandler; -import org.teavm.jso.indexeddb.IDBCountRequest; -import org.teavm.jso.indexeddb.IDBCursor; -import org.teavm.jso.indexeddb.IDBCursorRequest; -import org.teavm.jso.indexeddb.IDBDatabase; -import org.teavm.jso.indexeddb.IDBFactory; -import org.teavm.jso.indexeddb.IDBGetRequest; -import org.teavm.jso.indexeddb.IDBObjectStoreParameters; -import org.teavm.jso.indexeddb.IDBOpenDBRequest; -import org.teavm.jso.indexeddb.IDBRequest; -import org.teavm.jso.indexeddb.IDBTransaction; -import org.teavm.jso.indexeddb.IDBVersionChangeEvent; -import org.teavm.jso.typedarrays.ArrayBuffer; -import org.teavm.jso.typedarrays.Uint8Array; - -/** - * Copyright (c) 2022 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 VirtualFilesystem { - - protected static class VirtualOutputStream extends ByteArrayOutputStream { - private final VFSFile file; - - protected VirtualOutputStream(VFSFile file) { - this.file = file; - } - - public void close() throws IOException { - if(!file.setAllBytes(super.toByteArray(), false)) { - throw new IOException("Could not close stream and write to \"" + file.filePath + "\" on VFS \"" + file.virtualFilesystem.database + "\" (the file was probably deleted)"); - } - } - } - - public static class VFSFile { - - public final VirtualFilesystem virtualFilesystem; - protected boolean cacheEnabled; - protected String filePath; - protected int fileSize = -1; - protected boolean hasBeenDeleted = false; - protected boolean hasBeenAccessed = false; - protected boolean exists = false; - - protected byte[] cache = null; - protected long cacheHit; - - protected VFSFile(VirtualFilesystem vfs, String filePath, boolean cacheEnabled) { - this.virtualFilesystem = vfs; - this.filePath = filePath; - this.cacheHit = System.currentTimeMillis(); - if(cacheEnabled) { - setCacheEnabled(); - } - } - - public boolean equals(Object o) { - return (o instanceof VFSFile) && ((VFSFile)o).filePath.equals(filePath); - } - - public int hashCode() { - return filePath.hashCode(); - } - - public String getPath() { - return filePath; - } - - public int getSize() { - cacheHit = System.currentTimeMillis(); - if(fileSize < 0) { - if(cacheEnabled) { - byte[] b = getAllBytes(false); - if(b != null) { - fileSize = b.length; - } - }else { - ArrayBuffer dat = AsyncHandlers.readWholeFile(virtualFilesystem.indexeddb, filePath); - if(dat != null) { - fileSize = dat.getByteLength(); - } - } - } - return fileSize; - } - - public InputStream getInputStream() { - byte[] dat = getAllBytes(false); - if(dat == null) { - return null; - } - return new EaglerInputStream(dat); - } - - public OutputStream getOutputStream() { - return new VirtualOutputStream(this); - } - - public void getBytes(int fileOffset, byte[] array, int offset, int length) { - if(hasBeenDeleted) { - throw new ArrayIndexOutOfBoundsException("file '" + filePath + "' has been deleted"); - }else if(hasBeenAccessed && !exists) { - throw new ArrayIndexOutOfBoundsException("file '" + filePath + "' does not exist"); - } - cacheHit = System.currentTimeMillis(); - if(cacheEnabled && cache != null) { - System.arraycopy(cache, fileOffset, array, offset, length); - }else { - ArrayBuffer aa = AsyncHandlers.readWholeFile(virtualFilesystem.indexeddb, filePath); - hasBeenAccessed = true; - if(aa != null) { - exists = true; - }else { - exists = false; - throw new ArrayIndexOutOfBoundsException("file '" + filePath + "' does not exist"); - } - Uint8Array a = Uint8Array.create(aa); - this.fileSize = a.getByteLength(); - if(cacheEnabled) { - cache = new byte[fileSize]; - for(int i = 0; i < fileSize; ++i) { - cache[i] = (byte)a.get(i); - } - } - if(a.getLength() < fileOffset + length) { - throw new ArrayIndexOutOfBoundsException("file '" + filePath + "' size was "+a.getLength()+" but user tried to read index "+(fileOffset + length - 1)); - } - for(int i = 0; i < length; ++i) { - array[i + offset] = (byte)a.get(i + fileOffset); - } - } - } - - public void setCacheEnabled() { - if(!cacheEnabled && !hasBeenDeleted && !(hasBeenAccessed && !exists)) { - cacheHit = System.currentTimeMillis(); - cache = getAllBytes(false); - cacheEnabled = true; - } - } - - public byte[] getAllBytes() { - return getAllBytes(false); - } - - public String getAllChars() { - return utf8(getAllBytes(false)); - } - - public String[] getAllLines() { - return lines(getAllChars()); - } - - public byte[] getAllBytes(boolean copy) { - if(hasBeenDeleted || (hasBeenAccessed && !exists)) { - return null; - } - cacheHit = System.currentTimeMillis(); - if(cacheEnabled && cache != null) { - byte[] b = cache; - if(copy) { - b = new byte[cache.length]; - System.arraycopy(cache, 0, b, 0, cache.length); - } - return b; - }else { - hasBeenAccessed = true; - ArrayBuffer b = AsyncHandlers.readWholeFile(virtualFilesystem.indexeddb, filePath); - if(b != null) { - exists = true; - }else { - exists = false; - return null; - } - Uint8Array a = Uint8Array.create(b); - this.fileSize = a.getByteLength(); - byte[] array = TeaVMUtils.wrapUnsignedByteArray(a); - if(cacheEnabled) { - if(copy) { - cache = new byte[fileSize]; - System.arraycopy(b, 0, cache, 0, cache.length); - }else { - cache = array; - } - } - return array; - } - } - - public boolean setAllChars(String bytes) { - return setAllBytes(utf8(bytes), true); - } - - public boolean setAllBytes(byte[] bytes) { - return setAllBytes(bytes, true); - } - - public boolean setAllBytes(byte[] bytes, boolean copy) { - if(hasBeenDeleted || bytes == null) { - return false; - } - cacheHit = System.currentTimeMillis(); - this.fileSize = bytes.length; - if(cacheEnabled) { - byte[] copz = bytes; - if(copy) { - copz = new byte[bytes.length]; - System.arraycopy(bytes, 0, copz, 0, bytes.length); - } - cache = copz; - return sync(); - }else { - boolean s = AsyncHandlers.writeWholeFile(virtualFilesystem.indexeddb, filePath, TeaVMUtils.unwrapUnsignedByteArray(bytes).getBuffer()).bool; - hasBeenAccessed = true; - exists = exists || s; - return s; - } - } - - public boolean sync() { - if(cacheEnabled && cache != null && !hasBeenDeleted) { - cacheHit = System.currentTimeMillis(); - boolean tryWrite = AsyncHandlers.writeWholeFile(virtualFilesystem.indexeddb, filePath, TeaVMUtils.unwrapUnsignedByteArray(cache).getBuffer()).bool; - hasBeenAccessed = true; - exists = exists || tryWrite; - return tryWrite; - } - return false; - } - - public boolean delete() { - if(!hasBeenDeleted && !(hasBeenAccessed && !exists)) { - cacheHit = System.currentTimeMillis(); - if(!AsyncHandlers.deleteFile(virtualFilesystem.indexeddb, filePath).bool) { - hasBeenAccessed = true; - return false; - } - virtualFilesystem.fileMap.remove(filePath); - hasBeenDeleted = true; - hasBeenAccessed = true; - exists = false; - return true; - } - return false; - } - - public boolean rename(String newName, boolean copy) { - if(!hasBeenDeleted && !(hasBeenAccessed && !exists)) { - cacheHit = System.currentTimeMillis(); - ArrayBuffer arr = AsyncHandlers.readWholeFile(virtualFilesystem.indexeddb, filePath); - hasBeenAccessed = true; - if(arr != null) { - exists = true; - if(!AsyncHandlers.writeWholeFile(virtualFilesystem.indexeddb, newName, arr).bool) { - return false; - } - if(!copy && !AsyncHandlers.deleteFile(virtualFilesystem.indexeddb, filePath).bool) { - return false; - } - }else { - exists = false; - } - if(!copy) { - virtualFilesystem.fileMap.remove(filePath); - filePath = newName; - virtualFilesystem.fileMap.put(newName, this); - } - return true; - } - return false; - } - - public boolean exists() { - if(hasBeenDeleted) { - return false; - } - cacheHit = System.currentTimeMillis(); - if(hasBeenAccessed) { - return exists; - } - exists = AsyncHandlers.fileExists(virtualFilesystem.indexeddb, filePath).bool; - hasBeenAccessed = true; - return exists; - } - - } - - private final HashMap fileMap = new HashMap(); - - public final String database; - private final IDBDatabase indexeddb; - - public static class VFSHandle { - - public final boolean failedInit; - public final boolean failedLocked; - public final String failedError; - public final VirtualFilesystem vfs; - - public VFSHandle(boolean init, boolean locked, String error, VirtualFilesystem db) { - failedInit = init; - failedLocked = locked; - failedError = error; - vfs = db; - } - - public String toString() { - if(failedInit) { - return "IDBFactory threw an exception, IndexedDB is most likely not supported in this browser." + (failedError == null ? "" : "\n\n" + failedError); - } - if(failedLocked) { - return "The filesystem requested is already in use on a different tab."; - } - if(failedError != null) { - return "The IDBFactory.open() request failed, reason: " + failedError; - } - return "Virtual Filesystem Object: " + vfs.database; - } - - } - - public static VFSHandle openVFS(String db) { - DatabaseOpen evt = AsyncHandlers.openDB(db); - if(evt.failedInit) { - return new VFSHandle(true, false, evt.failedError, null); - } - if(evt.failedLocked) { - return new VFSHandle(false, true, null, null); - } - if(evt.failedError != null) { - return new VFSHandle(false, false, evt.failedError, null); - } - return new VFSHandle(false, false, null, new VirtualFilesystem(db, evt.database)); - } - - private VirtualFilesystem(String db, IDBDatabase idb) { - database = db; - indexeddb = idb; - } - - public void close() { - indexeddb.close(); - } - - public VFSFile getFile(String path) { - return getFile(path, false); - } - - public VFSFile getFile(String path, boolean cache) { - VFSFile f = fileMap.get(path); - if(f == null) { - fileMap.put(path, f = new VFSFile(this, path, cache)); - }else { - if(cache) { - f.setCacheEnabled(); - } - } - return f; - } - - public boolean renameFile(String oldName, String newName, boolean copy) { - return getFile(oldName).rename(newName, copy); - } - - public boolean deleteFile(String path) { - return getFile(path).delete(); - } - - public boolean fileExists(String path) { - return getFile(path).exists(); - } - - public List listFiles(String prefix) { - final ArrayList list = new ArrayList(); - AsyncHandlers.iterateFiles(indexeddb, this, prefix, false, (v) -> { - list.add(v.getPath()); - }); - return list; - } - - public int deleteFiles(String prefix) { - return AsyncHandlers.deleteFiles(indexeddb, prefix); - } - - public int iterateFiles(String prefix, boolean rw, VFSIterator itr) { - return AsyncHandlers.iterateFiles(indexeddb, this, prefix, rw, itr); - } - - public int renameFiles(String oldPrefix, String newPrefix, boolean copy) { - List filesToCopy = listFiles(oldPrefix); - int i = 0; - for(String str : filesToCopy) { - String f = VFile.createPath(newPrefix, str.substring(oldPrefix.length())); - if(!renameFile(str, f, copy)) { - System.err.println("Could not " + (copy ? "copy" : "rename") + " file \"" + str + "\" to \"" + f + "\" for some reason"); - }else { - ++i; - } - } - return i; - } - - public void flushCache(long age) { - long curr = System.currentTimeMillis(); - Iterator files = fileMap.values().iterator(); - while(files.hasNext()) { - if(curr - files.next().cacheHit > age) { - files.remove(); - } - } - } - - protected static class DatabaseOpen { - - protected final boolean failedInit; - protected final boolean failedLocked; - protected final String failedError; - - protected final IDBDatabase database; - - protected DatabaseOpen(boolean init, boolean locked, String error, IDBDatabase db) { - failedInit = init; - failedLocked = locked; - failedError = error; - database = db; - } - - } - - @JSBody(script = "return ((typeof indexedDB) !== 'undefined') ? indexedDB : null;") - protected static native IDBFactory createIDBFactory(); - - protected static class AsyncHandlers { - - @Async - protected static native DatabaseOpen openDB(String name); - - private static void openDB(String name, final AsyncCallback cb) { - IDBFactory i = createIDBFactory(); - if(i == null) { - cb.complete(new DatabaseOpen(false, false, "window.indexedDB was null or undefined", null)); - return; - } - final IDBOpenDBRequest f = i.open(name, 1); - f.setOnBlocked(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(new DatabaseOpen(false, true, null, null)); - } - }); - f.setOnSuccess(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(new DatabaseOpen(false, false, null, f.getResult())); - } - }); - f.setOnError(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(new DatabaseOpen(false, false, "open error", null)); - } - }); - f.setOnUpgradeNeeded(new EventListener() { - @Override - public void handleEvent(IDBVersionChangeEvent evt) { - f.getResult().createObjectStore("filesystem", IDBObjectStoreParameters.create().keyPath("path")); - } - }); - } - - @Async - protected static native BooleanResult deleteFile(IDBDatabase db, String name); - - private static void deleteFile(IDBDatabase db, String name, final AsyncCallback cb) { - IDBTransaction tx = db.transaction("filesystem", "readwrite"); - final IDBRequest r = tx.objectStore("filesystem").delete(makeTheFuckingKeyWork(name)); - - r.setOnSuccess(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(BooleanResult._new(true)); - } - }); - r.setOnError(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(BooleanResult._new(false)); - } - }); - } - - @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? null : ((typeof obj.data === 'undefined') ? null : obj.data);") - protected static native ArrayBuffer readRow(JSObject obj); - - @JSBody(params = { "obj" }, script = "return [obj];") - private static native JSObject makeTheFuckingKeyWork(String k); - - @Async - protected static native ArrayBuffer readWholeFile(IDBDatabase db, String name); - - private static void readWholeFile(IDBDatabase db, String name, final AsyncCallback cb) { - IDBTransaction tx = db.transaction("filesystem", "readonly"); - final IDBGetRequest r = tx.objectStore("filesystem").get(makeTheFuckingKeyWork(name)); - r.setOnSuccess(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(readRow(r.getResult())); - } - }); - r.setOnError(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(null); - } - }); - - } - - @JSBody(params = { "k" }, script = "return ((typeof k) === \"string\") ? k : (((typeof k) === \"undefined\") ? null : (((typeof k[0]) === \"string\") ? k[0] : null));") - private static native String readKey(JSObject k); - - @JSBody(params = { "k" }, script = "return ((typeof k) === \"undefined\") ? null : (((typeof k.path) === \"undefined\") ? null : (((typeof k.path) === \"string\") ? k[0] : null));") - private static native String readRowKey(JSObject r); - - @Async - protected static native Integer iterateFiles(IDBDatabase db, final VirtualFilesystem vfs, final String prefix, boolean rw, final VFSIterator itr); - - private static void iterateFiles(IDBDatabase db, final VirtualFilesystem vfs, final String prefix, boolean rw, final VFSIterator itr, final AsyncCallback cb) { - IDBTransaction tx = db.transaction("filesystem", rw ? "readwrite" : "readonly"); - final IDBCursorRequest r = tx.objectStore("filesystem").openCursor(); - final int[] res = new int[1]; - r.setOnSuccess(new EventHandler() { - @Override - public void handleEvent() { - IDBCursor c = r.getResult(); - if(c == null || c.getKey() == null || c.getValue() == null) { - cb.complete(res[0]); - return; - } - String k = readKey(c.getKey()); - if(k != null) { - if(k.startsWith(prefix)) { - int ci = res[0]++; - try { - itr.next(VIteratorFile.create(ci, vfs, c)); - }catch(VFSIterator.BreakLoop ex) { - cb.complete(res[0]); - return; - } - } - } - c.doContinue(); - } - }); - r.setOnError(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(res[0] > 0 ? res[0] : -1); - } - }); - } - - @Async - protected static native Integer deleteFiles(IDBDatabase db, final String prefix); - - private static void deleteFiles(IDBDatabase db, final String prefix, final AsyncCallback cb) { - IDBTransaction tx = db.transaction("filesystem", "readwrite"); - final IDBCursorRequest r = tx.objectStore("filesystem").openCursor(); - final int[] res = new int[1]; - r.setOnSuccess(new EventHandler() { - @Override - public void handleEvent() { - IDBCursor c = r.getResult(); - if(c == null || c.getKey() == null || c.getValue() == null) { - cb.complete(res[0]); - return; - } - String k = readKey(c.getKey()); - if(k != null) { - if(k.startsWith(prefix)) { - c.delete(); - ++res[0]; - } - } - c.doContinue(); - } - }); - r.setOnError(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(res[0] > 0 ? res[0] : -1); - } - }); - } - - @Async - protected static native BooleanResult fileExists(IDBDatabase db, String name); - - private static void fileExists(IDBDatabase db, String name, final AsyncCallback cb) { - IDBTransaction tx = db.transaction("filesystem", "readonly"); - final IDBCountRequest r = tx.objectStore("filesystem").count(makeTheFuckingKeyWork(name)); - r.setOnSuccess(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(BooleanResult._new(r.getResult() > 0)); - } - }); - r.setOnError(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(BooleanResult._new(false)); - } - }); - } - - @JSBody(params = { "pat", "dat" }, script = "return { path: pat, data: dat };") - protected static native JSObject writeRow(String name, ArrayBuffer data); - - @Async - protected static native BooleanResult writeWholeFile(IDBDatabase db, String name, ArrayBuffer data); - - private static void writeWholeFile(IDBDatabase db, String name, ArrayBuffer data, final AsyncCallback cb) { - IDBTransaction tx = db.transaction("filesystem", "readwrite"); - final IDBRequest r = tx.objectStore("filesystem").put(writeRow(name, data)); - - r.setOnSuccess(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(BooleanResult._new(true)); - } - }); - r.setOnError(new EventHandler() { - @Override - public void handleEvent() { - cb.complete(BooleanResult._new(false)); - } - }); - } - - } - - public static byte[] utf8(String str) { - if(str == null) return null; - return str.getBytes(Charset.forName("UTF-8")); - } - - public static String utf8(byte[] str) { - if(str == null) return null; - return new String(str, Charset.forName("UTF-8")); - } - - public static String CRLFtoLF(String str) { - if(str == null) return null; - str = str.indexOf('\r') != -1 ? str.replace("\r", "") : str; - str = str.trim(); - if(str.endsWith("\n")) { - str = str.substring(0, str.length() - 1); - } - if(str.startsWith("\n")) { - str = str.substring(1); - } - return str; - } - - public static String[] lines(String str) { - if(str == null) return null; - return CRLFtoLF(str).split("\n"); - } - -} \ No newline at end of file