From 6ce1c2ff8aaf8deeae1a0bda8de20a2d80d2a75c Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Fri, 21 Aug 2026 01:13:12 +0100 Subject: [PATCH 01/17] Update to 26.3-snapshot-9 All rendering is broken, but as long as you have nothing doing any custom rendering you can load into a world and play fine --- gradle/libs.versions.toml | 4 +- .../meteorclient/commands/Command.java | 2 +- .../commands/commands/SaveMapCommand.java | 73 +++--- .../commands/commands/SayCommand.java | 3 +- .../gui/DefaultSettingsWidgetFactory.java | 26 +- .../meteorclient/gui/WidgetScreen.java | 25 +- .../gui/renderer/packer/TexturePacker.java | 4 +- .../gui/screens/ContainerInventoryScreen.java | 4 +- .../gui/screens/ModulesScreen.java | 8 +- .../gui/screens/ProxiesScreen.java | 29 ++- .../settings/EntityTypeListSettingScreen.java | 2 +- .../DynamicRegistryListSettingScreen.java | 2 +- .../gui/tabs/builtin/ProfilesTab.java | 66 ++--- .../gui/themes/meteor/MeteorGuiTheme.java | 4 +- .../themes/meteor/widgets/WMeteorModule.java | 8 +- .../meteorclient/gui/widgets/WTopBar.java | 4 +- .../gui/widgets/containers/WSection.java | 4 +- .../gui/widgets/containers/WView.java | 4 +- .../gui/widgets/containers/WWindow.java | 4 +- .../gui/widgets/input/WBlockPosEdit.java | 2 +- .../gui/widgets/input/WTextBox.java | 59 +++-- .../gui/widgets/pressable/WPressable.java | 6 +- .../mixin/AbstractContainerScreenMixin.java | 6 +- .../mixin/AvatarRendererMixin.java | 9 +- .../mixin/BannerRendererMixin.java | 7 +- .../mixin/BookEditScreenMixin.java | 8 +- .../mixin/BookViewScreenMixin.java | 3 +- .../mixin/ChatComponentMixin.java | 2 +- .../mixin/ClientPacketListenerMixin.java | 8 +- .../mixin/CloudRendererMixin.java | 6 +- .../mixin/EnchantTableRendererMixin.java | 5 +- .../mixin/EndCrystalRendererMixin.java | 8 +- .../mixin/EntityRendererMixin.java | 2 +- .../mixin/FirstPersonHandsAndItemsMixin.java | 60 +++++ ...FirstPersonHandsAndItemsRendererMixin.java | 64 +++++ ...Mixin.java => FrontendGpuDeviceMixin.java} | 10 +- .../meteorclient/mixin/GameRendererMixin.java | 20 +- .../mixin/GlCommandEncoderMixin.java | 32 ++- .../meteorclient/mixin/GlDeviceMixin.java | 4 +- .../mixin/GuiGraphicsExtractorMixin.java | 11 +- .../mixin/ItemInHandRendererMixin.java | 107 -------- .../meteorclient/mixin/ItemRendererMixin.java | 2 +- .../mixin/KeyboardHandlerMixin.java | 16 +- .../mixin/LevelExtractorMixin.java | 2 +- .../mixin/LevelRendererMixin.java | 20 +- .../meteorclient/mixin/LightmapMixin.java | 2 +- .../mixin/LightningBoltRendererMixin.java | 10 +- .../meteorclient/mixin/LivingEntityMixin.java | 19 +- .../mixin/LivingEntityRendererMixin.java | 9 +- .../mixin/LivingEntitySwingStateMixin.java | 26 ++ .../meteorclient/mixin/LocalPlayerMixin.java | 22 +- .../meteorclient/mixin/MinecraftAccessor.java | 6 +- .../meteorclient/mixin/MinecraftMixin.java | 2 + .../mixin/ModelBlockRendererMixin.java | 4 +- .../meteorclient/mixin/MouseHandlerMixin.java | 4 +- .../mixin/PipelineCacheAccessor.java | 20 ++ .../meteorclient/mixin/PlayerMixin.java | 10 - .../mixin/ProjectileUtilMixin.java | 2 +- .../mixin/RenderPipelineMixin.java | 2 +- .../mixin/ScreenEffectRendererMixin.java | 7 +- .../meteorclient/mixin/ScreenMixin.java | 6 +- .../mixin/ShaderManagerMixin.java | 8 +- .../meteorclient/mixin/SkyRendererMixin.java | 8 +- .../meteorclient/mixin/TitleScreenMixin.java | 4 +- .../meteorclient/mixin/VulkanDeviceMixin.java | 4 +- .../mixin/sodium/MeshVertexConsumerMixin.java | 73 +++--- .../mixininterface/IGpuDevice.java | 3 +- .../ExtendedRenderPipelineBuilder.java | 2 +- .../renderer/FixedUniformStorage.java | 12 +- .../renderer/FullScreenRenderer.java | 4 +- .../meteorclient/renderer/MeshBuilder.java | 16 +- .../meteorclient/renderer/MeshRenderer.java | 23 +- .../meteorclient/renderer/MeshUniforms.java | 11 +- .../renderer/MeteorRenderPipelines.java | 37 ++- .../renderer/MeteorVertexFormats.java | 5 +- .../meteorclient/renderer/Renderer2D.java | 4 +- .../meteorclient/renderer/Renderer3D.java | 2 +- .../meteorclient/renderer/Texture.java | 6 +- .../meteorclient/renderer/text/Font.java | 4 +- .../meteorclient/settings/FileSetting.java | 21 +- .../meteorclient/settings/KeybindSetting.java | 4 +- .../systems/accounts/Account.java | 12 +- .../accounts/types/TheAlteningAccount.java | 8 +- .../systems/hud/elements/CombatHud.java | 3 +- .../hud/elements/keyboard/KeyboardHud.java | 191 +++++++-------- .../systems/hud/screens/HudEditorScreen.java | 30 +-- .../meteorclient/systems/modules/Modules.java | 12 +- .../systems/modules/combat/AntiBed.java | 5 +- .../systems/modules/combat/AttributeSwap.java | 5 +- .../systems/modules/combat/AutoCity.java | 6 +- .../systems/modules/combat/AutoWeapon.java | 3 +- .../systems/modules/combat/BedAura.java | 8 +- .../systems/modules/combat/Burrow.java | 4 +- .../systems/modules/combat/Criticals.java | 8 +- .../systems/modules/combat/CrystalAura.java | 8 +- .../systems/modules/combat/KillAura.java | 16 +- .../systems/modules/combat/Offhand.java | 9 +- .../systems/modules/combat/Surround.java | 7 +- .../systems/modules/misc/InventoryTweaks.java | 5 +- .../systems/modules/misc/Notebot.java | 4 +- .../modules/movement/EntityControl.java | 6 +- .../systems/modules/movement/GUIMove.java | 18 +- .../systems/modules/movement/Scaffold.java | 2 +- .../movement/elytrafly/ElytraFlightMode.java | 4 +- .../systems/modules/player/AntiAFK.java | 2 +- .../systems/modules/player/GhostHand.java | 2 +- .../modules/player/InstantRebreak.java | 5 +- .../modules/player/MiddleClickExtra.java | 4 +- .../modules/render/BetterTooltips.java | 8 +- .../systems/modules/render/Blur.java | 16 +- .../systems/modules/render/CameraTweaks.java | 4 +- .../systems/modules/render/FreeLook.java | 18 +- .../systems/modules/render/Freecam.java | 5 +- .../systems/modules/render/HandView.java | 2 +- .../systems/modules/render/ItemPhysics.java | 2 +- .../systems/modules/render/Zoom.java | 4 +- .../systems/modules/world/AutoBreed.java | 2 +- .../systems/modules/world/AutoSign.java | 15 +- .../systems/modules/world/AutoSmelter.java | 9 +- .../systems/modules/world/BuildHeight.java | 4 +- .../systems/modules/world/Collisions.java | 2 +- .../systems/modules/world/EndermanLook.java | 8 +- .../systems/modules/world/Excavator.java | 4 +- .../systems/modules/world/HighwayBuilder.java | 2 +- .../systems/modules/world/Nuker.java | 8 +- .../systems/modules/world/VeinMiner.java | 2 +- .../utils/OutlineRenderCommandQueue.java | 24 +- .../meteorclient/utils/Utils.java | 84 +------ .../utils/entity/EntityUtils.java | 6 +- .../simulator/ProjectileEntitySimulator.java | 3 +- .../meteorclient/utils/misc/CursorStyle.java | 30 --- .../meteorclient/utils/misc/Keybind.java | 231 ++++++++++++------ .../meteorclient/utils/misc/input/Input.java | 23 +- .../utils/misc/input/KeyAction.java | 6 +- .../utils/misc/input/KeyBinds.java | 5 +- .../utils/network/PacketUtils.java | 2 +- .../utils/player/PlayerUtils.java | 2 +- .../CustomBannerGuiElementRenderer.java | 9 +- .../MeshBuilderVertexConsumerProvider.java | 10 + .../meteorclient/utils/render/PeekScreen.java | 4 +- .../utils/render/PlayerHeadTexture.java | 4 +- .../utils/render/SimpleBlockRenderer.java | 11 +- .../utils/render/WireframeEntityRenderer.java | 14 +- .../utils/render/postprocess/ChamsShader.java | 13 +- .../render/postprocess/EntityShader.java | 2 +- .../render/postprocess/OutlineUniforms.java | 11 +- .../render/postprocess/PostProcessShader.java | 24 +- .../utils/tooltip/BundleTooltipComponent.java | 2 +- .../meteorclient/utils/world/BlockUtils.java | 12 +- .../meteor-client-sodium.mixins.json | 1 - src/main/resources/meteor-client.classtweaker | 16 +- src/main/resources/meteor-client.mixins.json | 7 +- 152 files changed, 1137 insertions(+), 1078 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java rename src/main/java/meteordevelopment/meteorclient/mixin/{GpuDeviceMixin.java => FrontendGpuDeviceMixin.java} (76%) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/ItemInHandRendererMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java delete mode 100644 src/main/java/meteordevelopment/meteorclient/utils/misc/CursorStyle.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1ce3365df8c..5522abc4893 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] # Fabric (https://fabricmc.net/develop) jdk = "25" -minecraft = "26.2" +minecraft = "26.3-snapshot-9" fabric-loader = "0.19.3" -fabric-api = "0.154.2+26.2" +fabric-api = "0.158.0+26.3" # Plugins # Loom (https://github.com/FabricMC/fabric-loom) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index b1ebaf8bcdd..468e6a60827 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -23,7 +23,7 @@ import java.util.List; public abstract class Command { - protected static CommandBuildContext REGISTRY_ACCESS = Commands.createValidationContext(VanillaRegistries.createLookup()); + protected static CommandBuildContext REGISTRY_ACCESS = Commands.createValidationContext(VanillaRegistries.createWorldLookup()); protected static final int SINGLE_SUCCESS = com.mojang.brigadier.Command.SINGLE_SUCCESS; protected static final Minecraft mc = MeteorClient.mc; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index 96c5699a5d5..db87ba20b9f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -21,32 +21,28 @@ import net.minecraft.world.item.MapItem; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.jspecify.annotations.Nullable; -import org.lwjgl.BufferUtils; -import org.lwjgl.PointerBuffer; +import org.lwjgl.sdl.SDLDialog; +import org.lwjgl.sdl.SDL_DialogFileFilter; +import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; -import org.lwjgl.util.tinyfd.TinyFileDialogs; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; -import java.nio.ByteBuffer; public class SaveMapCommand extends Command { private static final SimpleCommandExceptionType MAP_NOT_FOUND = new SimpleCommandExceptionType(Component.literal("You must be holding a filled map.")); private static final SimpleCommandExceptionType OOPS = new SimpleCommandExceptionType(Component.literal("Something went wrong.")); - private final PointerBuffer filters; + private final SDL_DialogFileFilter.Buffer filters; public SaveMapCommand() { super("save-map", "Saves a map to an image.", "sm"); - filters = BufferUtils.createPointerBuffer(1); - - ByteBuffer pngFilter = MemoryUtil.memASCII("*.png"); - - filters.put(pngFilter); - filters.rewind(); + MemoryStack stack = MemoryStack.stackPush(); + filters = SDL_DialogFileFilter.malloc(1, stack); + filters.name(stack.UTF8("NBT Files")).pattern(stack.UTF8("nbt")); } @Override @@ -68,29 +64,40 @@ private void saveMap(int scale) throws CommandSyntaxException { MapItemSavedData state = getMapState(); if (map == null || state == null) throw MAP_NOT_FOUND.create(); - File path = getPath(); - if (path == null) throw OOPS.create(); + SDLDialog.SDL_ShowSaveFileDialog((_, file, _) -> { + if (file == 0) return; + + long filePointer = MemoryUtil.memGetAddress(file); + if (filePointer == 0) return; + + String str = MemoryUtil.memUTF8(filePointer); + System.out.println(str); - MapTextureManagerAccessor textureManager = (MapTextureManagerAccessor) mc.getMapTextureManager(); - MapTextureManager.MapInstance texture = textureManager.meteor$invokeGetOrCreateMapInstance(map.get(DataComponents.MAP_ID), state); - if (texture.texture.getPixels() == null) throw OOPS.create(); + if (str.isBlank()) return; + if (!str.endsWith(".png")) str += ".png"; + File path = new File(str); - try { - if (scale == 128) texture.texture.getPixels().writeToFile(path); - else { - int[] data = texture.texture.getPixels().makePixelArray(); - BufferedImage image = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB); - image.setRGB(0, 0, image.getWidth(), image.getHeight(), data, 0, 128); + MapTextureManagerAccessor textureManager = (MapTextureManagerAccessor) mc.getMapTextureManager(); + MapTextureManager.MapInstance texture = textureManager.meteor$invokeGetOrCreateMapInstance(map.get(DataComponents.MAP_ID), state); + if (texture.texture.getPixels() == null) return; - BufferedImage scaledImage = new BufferedImage(scale, scale, 2); - scaledImage.createGraphics().drawImage(image, 0, 0, scale, scale, null); + try { + if (scale == 128) texture.texture.getPixels().writeToFile(path); + else { + int[] data = texture.texture.getPixels().makePixelArray(); + BufferedImage image = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB); + image.setRGB(0, 0, image.getWidth(), image.getHeight(), data, 0, 128); - ImageIO.write(scaledImage, "png", path); + BufferedImage scaledImage = new BufferedImage(scale, scale, 2); + scaledImage.createGraphics().drawImage(image, 0, 0, scale, scale, null); + + ImageIO.write(scaledImage, "png", path); + } + } catch (IOException e) { + error("Error writing map texture"); + MeteorClient.LOG.error(e.toString()); } - } catch (IOException e) { - error("Error writing map texture"); - MeteorClient.LOG.error(e.toString()); - } + }, 0, 0, filters, ""); } private @Nullable MapItemSavedData getMapState() { @@ -100,14 +107,6 @@ private void saveMap(int scale) throws CommandSyntaxException { return MapItem.getSavedData(map.get(DataComponents.MAP_ID), mc.level); } - private @Nullable File getPath() { - String path = TinyFileDialogs.tinyfd_saveFileDialog("Save image", null, filters, null); - if (path == null) return null; - if (!path.endsWith(".png")) path += ".png"; - - return new File(path); - } - private @Nullable ItemStack getMap() { ItemStack itemStack = mc.player.getMainHandItem(); if (itemStack.getItem() == Items.FILLED_MAP) return itemStack; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java index f85bbd4afdc..7e36c630c81 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java @@ -20,6 +20,7 @@ import org.meteordev.starscript.Script; import java.time.Instant; +import java.util.Optional; public class SayCommand extends Command { public SayCommand() { @@ -41,7 +42,7 @@ public void build(LiteralArgumentBuilder builder) { ClientPacketListener handler = mc.getConnection(); LastSeenMessagesTracker.Update lastSeenMessages = ((ClientPacketListenerAccessor) handler).meteor$getLastSeenMessages().generateAndApplyUpdate(); MessageSignature messageSignatureData = ((ClientPacketListenerAccessor) handler).meteor$getSignedMessageEncoder().pack(new SignedMessageBody(message, instant, l, lastSeenMessages.lastSeen())); - handler.send(new ServerboundChatPacket(message, instant, l, messageSignatureData, lastSeenMessages.update())); + handler.send(new ServerboundChatPacket(message, instant, l, Optional.ofNullable(messageSignatureData), lastSeenMessages.update())); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index e085d15736b..cff70d4b1ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -28,7 +28,8 @@ import meteordevelopment.meteorclient.utils.render.color.SettingColor; import net.minecraft.client.resources.language.I18n; import org.apache.commons.lang3.Strings; -import org.lwjgl.util.tinyfd.TinyFileDialogs; +import org.lwjgl.sdl.SDLDialog; +import org.lwjgl.system.MemoryUtil; import java.io.File; import java.util.ArrayList; @@ -486,22 +487,23 @@ private void fileW(WTable table, FileSetting setting) { WLabel fileName = list.add(theme.label((setting.get() != null && setting.get().exists()) ? setting.get().getName() : "No file selected.")).widget(); - selectFile.action = () -> { - String path = TinyFileDialogs.tinyfd_openFileDialog( - "Select File", - null, - setting.filters, - null, - false - ); + selectFile.action = () -> SDLDialog.SDL_ShowOpenFileDialog((_, file, _) -> { + if (file == 0) return; - if (path != null) { + long filePointer = MemoryUtil.memGetAddress(file); + if (filePointer == 0) return; + + String path = MemoryUtil.memUTF8(filePointer); + System.out.println(path); + + if (!path.isEmpty()) { setting.set(new File(path)); fileName.set(setting.get().getName()); } - }; - reset(table, setting, () -> fileName.set((setting.get() != null && setting.get().exists()) ? setting.get().getName() : "No file selected.")); + reset(table, setting, () -> fileName.set((setting.get() != null && setting.get().exists()) ? setting.get().getName() : "No file selected.")); + }, 0L, 0, setting.filters, "", false); + } // Other diff --git a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java index 11cd804bb8d..49b7c0ab4af 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.gui; -import com.mojang.blaze3d.platform.MacosUtil; +import com.mojang.blaze3d.platform.cursor.CursorTypes; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.gui.renderer.GuiDebugRenderer; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; @@ -16,7 +16,6 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.CursorStyle; import meteordevelopment.meteorclient.utils.misc.input.Input; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.Screen; @@ -25,7 +24,9 @@ import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; +import org.apache.commons.lang3.SystemUtils; import org.jspecify.annotations.NonNull; +import org.lwjgl.sdl.SDLMouse; import java.util.ArrayList; import java.util.List; @@ -33,10 +34,10 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import static com.mojang.blaze3d.platform.InputConstants.*; import static meteordevelopment.meteorclient.MeteorClient.mc; import static meteordevelopment.meteorclient.utils.Utils.getWindowHeight; import static meteordevelopment.meteorclient.utils.Utils.getWindowWidth; -import static org.lwjgl.glfw.GLFW.*; public abstract class WidgetScreen extends Screen { private static final GuiRenderer RENDERER = new GuiRenderer(); @@ -151,7 +152,7 @@ public boolean mouseReleased(@NonNull MouseButtonEvent click) { mouseX *= s; mouseY *= s; - if (debug && click.button() == GLFW_MOUSE_BUTTON_RIGHT) + if (debug && click.button() == MOUSE_BUTTON_RIGHT) DEBUG_RENDERER.mouseReleased(root, new MouseButtonEvent(mouseX, mouseY, click.buttonInfo()), 0); return root.mouseReleased(new MouseButtonEvent(mouseX, mouseY, click.buttonInfo())); @@ -184,12 +185,12 @@ public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmou public boolean keyReleased(@NonNull KeyEvent input) { if (locked) return false; - if ((input.modifiers() == GLFW_MOD_CONTROL || input.modifiers() == GLFW_MOD_SUPER) && input.key() == GLFW_KEY_9) { + if ((input.modifiers() == MOD_CONTROL || input.modifiers() == MOD_SUPER) && input.key() == KEY_9) { debug = !debug; return true; } - if ((input.key() == GLFW_KEY_ENTER || input.key() == GLFW_KEY_KP_ENTER) && enterAction != null) { + if ((input.key() == KEY_RETURN || input.key() == KEY_NUMPADENTER) && enterAction != null) { enterAction.run(); return true; } @@ -205,7 +206,7 @@ public boolean keyPressed(@NonNull KeyEvent input) { if (shouldReturn) return true; // Select next text box if TAB was pressed - if (input.key() == GLFW_KEY_TAB) { + if (input.key() == KEY_TAB) { AtomicReference firstTextBox = new AtomicReference<>(null); AtomicBoolean done = new AtomicBoolean(false); AtomicBoolean foundFocused = new AtomicBoolean(false); @@ -236,10 +237,10 @@ public boolean keyPressed(@NonNull KeyEvent input) { return true; } - boolean control = MacosUtil.IS_MACOS ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; + boolean control = SystemUtils.IS_OS_MAC ? input.modifiers() == MOD_SUPER : input.modifiers() == MOD_CONTROL; - return (control && input.key() == GLFW_KEY_C && toClipboard()) - || (control && input.key() == GLFW_KEY_V && fromClipboard()); + return (control && input.key() == KEY_C && toClipboard()) + || (control && input.key() == KEY_V && fromClipboard()); } public void keyRepeated(KeyEvent input) { @@ -331,7 +332,7 @@ public void removed() { closed = true; onClosed(); - Input.setCursorStyle(CursorStyle.Default); + Input.setCursorStyle(CursorTypes.ARROW); loopWidgets(root, widget -> { if (widget instanceof WTextBox textBox && textBox.isFocused()) textBox.setFocused(false); @@ -354,7 +355,7 @@ public void removed() { // Restore mouse position to where it was when the screen was closed if (parent != null) { - glfwSetCursorPos(mc.getWindow().handle(), restoreX, restoreY); + SDLMouse.SDL_WarpMouseInWindow(mc.getWindow().handle(), (float) restoreX, (float) restoreY); } }; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/TexturePacker.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/TexturePacker.java index 7e3d4f196a3..0522ac03d35 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/TexturePacker.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/TexturePacker.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.gui.renderer.packer; -import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.platform.TextureUtil; -import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.textures.FilterMode; import meteordevelopment.meteorclient.renderer.Texture; import net.minecraft.resources.Identifier; import org.lwjgl.BufferUtils; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java index 057f134c75b..b8e9a7b3f73 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui.screens; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.utils.Utils; @@ -21,7 +22,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.component.BundleContents; import org.jspecify.annotations.NonNull; -import org.lwjgl.glfw.GLFW; import java.util.ArrayList; import java.util.Collections; @@ -151,7 +151,7 @@ public boolean keyPressed(@NonNull KeyEvent input) { return tooltips.openContent(stack); } - if (input.key() == GLFW.GLFW_KEY_ESCAPE || mc.options.keyInventory.matches(input)) { + if (input.key() == InputConstants.KEY_ESCAPE || mc.options.keyInventory.matches(input)) { onClose(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index c2ba7d7ecd5..1f405535217 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.gui.screens; -import com.mojang.blaze3d.platform.MacosUtil; import com.mojang.datafixers.util.Pair; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.tabs.TabScreen; @@ -24,15 +23,16 @@ import meteordevelopment.meteorclient.utils.render.DisplayItemUtils; import net.minecraft.client.input.KeyEvent; import net.minecraft.world.item.Items; +import org.apache.commons.lang3.SystemUtils; import org.jspecify.annotations.NonNull; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.mojang.blaze3d.platform.InputConstants.*; import static meteordevelopment.meteorclient.utils.Utils.getWindowHeight; import static meteordevelopment.meteorclient.utils.Utils.getWindowWidth; -import static org.lwjgl.glfw.GLFW.*; public class ModulesScreen extends TabScreen { private WCategoryController controller; @@ -155,9 +155,9 @@ protected WWindow createSearch(WContainer c) { public boolean keyPressed(@NonNull KeyEvent value) { if (locked) return false; - boolean cntrl = MacosUtil.IS_MACOS ? value.modifiers() == GLFW_MOD_SUPER : value.modifiers() == GLFW_MOD_CONTROL; + boolean cntrl = SystemUtils.IS_OS_MAC ? value.modifiers() == MOD_SUPER : value.modifiers() == MOD_CONTROL; - if (cntrl && value.key() == GLFW_KEY_F) { + if (cntrl && value.key() == KEY_F) { if (searchWindow != null) searchWindow.setExpanded(true); if (searchTextBox != null) { searchTextBox.setFocused(true); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java index 0c8087a4f89..864ce1eab75 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java @@ -21,13 +21,12 @@ import meteordevelopment.meteorclient.systems.proxies.Proxy; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import org.lwjgl.BufferUtils; -import org.lwjgl.PointerBuffer; +import org.lwjgl.sdl.SDLDialog; +import org.lwjgl.sdl.SDL_DialogFileFilter; +import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; -import org.lwjgl.util.tinyfd.TinyFileDialogs; import java.io.File; -import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -60,21 +59,25 @@ public void initWidgets() { newBtn.action = () -> mc.gui.setScreen(new EditProxyScreen(theme, null, this::reload)); // Import - PointerBuffer filters = BufferUtils.createPointerBuffer(1); + MemoryStack stack = MemoryStack.stackPush(); + SDL_DialogFileFilter.Buffer filters = SDL_DialogFileFilter.malloc(1, stack); + filters.name(stack.UTF8("Txt Files")).pattern(stack.UTF8("txt")); - ByteBuffer txtFilter = MemoryUtil.memASCII("*.txt"); + WButton importBtn = l.add(theme.button("Import")).expandX().widget(); + importBtn.action = () -> SDLDialog.SDL_ShowOpenFileDialog((_, fileptr, _) -> { + if (fileptr == 0) return; - filters.put(txtFilter); - filters.rewind(); + long filePointer = MemoryUtil.memGetAddress(fileptr); + if (filePointer == 0) return; - WButton importBtn = l.add(theme.button("Import")).expandX().widget(); - importBtn.action = () -> { - String selectedFile = TinyFileDialogs.tinyfd_openFileDialog("Import Proxies", null, filters, null, false); - if (selectedFile != null) { + String selectedFile = MemoryUtil.memUTF8(filePointer); + System.out.println(selectedFile); + + if (!selectedFile.isEmpty()){ File file = new File(selectedFile); mc.gui.setScreen(new ProxiesImportScreen(theme, file)); } - }; + }, 0L, 0, filters, "", false); l.add(refreshButton).expandX(); refreshButton.action = () -> Proxies.get().checkProxies(true); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java index c7178a03e04..a59e7505c2a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.gui.screens.settings; -import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.renderpearl.api.textures.FilterMode; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WindowScreen; import meteordevelopment.meteorclient.gui.utils.Cell; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java index 9a2a8d0fdc8..1a11df90153 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/DynamicRegistryListSettingScreen.java @@ -37,7 +37,7 @@ private static Iterable> createUniverse(Collection (HolderLookup.Provider) networkHandler.registryAccess()) - .orElseGet(VanillaRegistries::createLookup) + .orElseGet(VanillaRegistries::createWorldLookup) .lookup(registryKey) .ifPresent(registry -> registry.listElementIds().forEach(set::add)); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java index c70ff9ae97d..10943e7be76 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -29,16 +29,16 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import org.apache.commons.io.FilenameUtils; -import org.lwjgl.BufferUtils; -import org.lwjgl.PointerBuffer; +import org.lwjgl.sdl.SDLDialog; +import org.lwjgl.sdl.SDLError; +import org.lwjgl.sdl.SDL_DialogFileFilter; +import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; -import org.lwjgl.util.tinyfd.TinyFileDialogs; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.nio.ByteBuffer; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -47,15 +47,12 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class ProfilesTab extends Tab { - private static final PointerBuffer filters; + private static final SDL_DialogFileFilter.Buffer filters; static { - filters = BufferUtils.createPointerBuffer(1); - - ByteBuffer pngFilter = MemoryUtil.memASCII("*.nbt"); - - filters.put(pngFilter); - filters.rewind(); + MemoryStack stack = MemoryStack.stackPush(); + filters = SDL_DialogFileFilter.malloc(1, stack); + filters.name(stack.UTF8("NBT Files")).pattern(stack.UTF8("nbt")); } public ProfilesTab() { @@ -94,11 +91,21 @@ public void initWidgets() { // Import WButton importBtn = l.add(theme.button("Import")).expandX().widget(); importBtn.tooltip = "Import profile"; - importBtn.action = () -> { + importBtn.action = () -> SDLDialog.SDL_ShowOpenFileDialog((_, file, _) -> { try { - Profile imported = importProfile(); - if (imported != null) - MeteorClient.LOG.info("Successfully imported profile '{}'.", imported.name.get()); + if (file == 0) throw new IOException("Dialog Error: " + SDLError.SDL_GetError()); + + long filePointer = MemoryUtil.memGetAddress(file); + if (filePointer == 0) return; + + String path = MemoryUtil.memUTF8(filePointer); + System.out.println(path); + File profileFile = new File(path); + + Profile profile = importProfile(profileFile); + + if (profile != null) + MeteorClient.LOG.info("Successfully imported profile '{}'.", profile.name.get()); reload(); } catch (Exception e) { MeteorClient.LOG.error("Error importing profile", e); @@ -109,7 +116,7 @@ public void initWidgets() { .dontShowAgainCheckboxVisible(false) .show(); } - }; + }, 0L, 0, filters, "", false); } private void initTable(WTable table) { @@ -142,11 +149,7 @@ private void initTable(WTable table) { } } - private Profile importProfile() throws IOException { - String file = TinyFileDialogs.tinyfd_openFileDialog("Select profile to import", null, filters, null, false); - if (file == null) return null; - File profileFile = new File(file); - + private Profile importProfile(File profileFile) throws IOException { CompoundTag nbt = NbtIo.read(profileFile.toPath()); if (nbt == null) return null; @@ -283,20 +286,28 @@ public void initWidgets() { WContainer settingsContainer = add(theme.verticalList()).expandX().minWidth(400).widget(); - settingsContainer.add(theme.horizontalSeparator()).expandX().widget(); + settingsContainer.add(theme.horizontalSeparator()).expandX(); WCheckbox hud = addBool(settingsContainer, profile.settings.get("hud", Boolean.class)); WCheckbox macros = addBool(settingsContainer, profile.settings.get("macros", Boolean.class)); WCheckbox modules = addBool(settingsContainer, profile.settings.get("modules", Boolean.class)); WCheckbox waypoints = addBool(settingsContainer, profile.settings.get("waypoints", Boolean.class)); - add(theme.horizontalSeparator()).expandX().widget(); + add(theme.horizontalSeparator()).expandX(); WButton export = add(theme.button("Export profile")).expandX().widget(); - export.action = () -> { - exportProfile(profile, hud.checked, macros.checked, modules.checked, waypoints.checked); + export.action = () -> SDLDialog.SDL_ShowSaveFileDialog((_, file, _) -> { + if (file == 0) return; + + long filePointer = MemoryUtil.memGetAddress(file); + if (filePointer == 0) return; + + String path = MemoryUtil.memUTF8(filePointer); + System.out.println(path); + + exportProfile(path, profile, hud.checked, macros.checked, modules.checked, waypoints.checked); onClose(); - }; + }, 0, 0, filters, ""); } private WCheckbox addBool(WContainer container, Setting setting) { @@ -309,8 +320,7 @@ private WCheckbox addBool(WContainer container, Setting setting) { return c; } - private void exportProfile(Profile profile, boolean hud, boolean macros, boolean modules, boolean waypoints) { - String path = TinyFileDialogs.tinyfd_saveFileDialog("Save profile", profile.name.get(), filters, null); + private void exportProfile(String path, Profile profile, boolean hud, boolean macros, boolean modules, boolean waypoints) { if (path == null) return; Path p = Path.of(path.endsWith(".nbt") ? path : path + ".nbt"); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java index e24349798b8..c71fb631cfb 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.gui.themes.meteor; -import com.mojang.blaze3d.platform.MacosUtil; import meteordevelopment.meteorclient.gui.DefaultSettingsWidgetFactory; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WidgetScreen; @@ -31,6 +30,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import org.apache.commons.lang3.SystemUtils; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -380,7 +380,7 @@ public TextRenderer textRenderer() { public double scale(double value) { double scaled = value * scale.get(); - if (MacosUtil.IS_MACOS) { + if (SystemUtils.IS_OS_MAC) { scaled /= (double) mc.getWindow().getWidth() / mc.getWindow().getWidth(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java index 52381815b66..386154f0bb0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/WMeteorModule.java @@ -13,9 +13,9 @@ import meteordevelopment.meteorclient.systems.modules.Module; import net.minecraft.util.Mth; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_LEFT; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_RIGHT; import static meteordevelopment.meteorclient.MeteorClient.mc; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; public class WMeteorModule extends WPressable implements MeteorWidget { private final Module module; @@ -58,8 +58,8 @@ protected void onCalculateSize() { @Override protected void onPressed(int button) { - if (button == GLFW_MOUSE_BUTTON_LEFT) module.toggle(); - else if (button == GLFW_MOUSE_BUTTON_RIGHT) mc.gui.setScreen(theme.moduleScreen(module)); + if (button == MOUSE_BUTTON_LEFT) module.toggle(); + else if (button == MOUSE_BUTTON_RIGHT) mc.gui.setScreen(theme.moduleScreen(module)); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java index 13e908a763a..e64a887b40b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java @@ -13,9 +13,9 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.utils.render.color.Color; import net.minecraft.client.gui.screens.Screen; +import org.lwjgl.sdl.SDLMouse; import static meteordevelopment.meteorclient.MeteorClient.mc; -import static org.lwjgl.glfw.GLFW.glfwSetCursorPos; public abstract class WTopBar extends WHorizontalList { protected abstract Color getButtonColor(boolean pressed, boolean hovered); @@ -57,7 +57,7 @@ protected void onPressed(int button) { double mouseY = mc.mouseHandler.ypos(); tab.openScreen(theme); - glfwSetCursorPos(mc.getWindow().handle(), mouseX, mouseY); + SDLMouse.SDL_WarpMouseInWindow(mc.getWindow().handle(), (float) mouseX, (float) mouseY); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java index acdac7e1dfc..532e21b5528 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java @@ -11,7 +11,7 @@ import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.util.Mth; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_LEFT; public abstract class WSection extends WVerticalList { public Runnable action; @@ -124,7 +124,7 @@ public WHeader(String title) { @Override public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { - if (mouseOver && click.button() == GLFW_MOUSE_BUTTON_LEFT && !doubled) { + if (mouseOver && click.button() == MOUSE_BUTTON_LEFT && !doubled) { onClick(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java index 15a14e5f68e..44ea22245c8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java @@ -11,7 +11,7 @@ import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.util.Mth; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_LEFT; public abstract class WView extends WVerticalList { public double maxHeight = Double.MAX_VALUE; @@ -74,7 +74,7 @@ protected void onCalculateWidgetPositions() { @Override public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { - if (handleMouseOver && click.button() == GLFW_MOUSE_BUTTON_LEFT && !doubled) { + if (handleMouseOver && click.button() == MOUSE_BUTTON_LEFT && !doubled) { setFocused(true); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java index 4b84785762d..2cbaa74d7ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java @@ -15,9 +15,9 @@ import java.util.function.Consumer; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_RIGHT; import static meteordevelopment.meteorclient.utils.Utils.getWindowHeight; import static meteordevelopment.meteorclient.utils.Utils.getWindowWidth; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; public abstract class WWindow extends WVerticalList { public double padding = 8; @@ -191,7 +191,7 @@ protected void onCalculateSize() { @Override public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (mouseOver && !doubled) { - if (click.button() == GLFW_MOUSE_BUTTON_RIGHT) setExpanded(!expanded); + if (click.button() == MOUSE_BUTTON_RIGHT) setExpanded(!expanded); else { dragging = true; dragged = false; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java index 2525d9ed283..59fc03aab00 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java @@ -56,7 +56,7 @@ public void init() { WButton here = add(theme.confirmedButton("Set Here", "Confirm")).expandX().widget(); here.action = () -> { lastValue = value; - set(new BlockPos(mc.player.blockPosition())); + set(BlockPos.containing(mc.player.position())); newValueCheck(); clear(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java index 12f5409d223..0f10db85ffb 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.gui.widgets.input; -import com.mojang.blaze3d.platform.MacosUtil; import it.unimi.dsi.fastutil.doubles.DoubleArrayList; import it.unimi.dsi.fastutil.doubles.DoubleList; import meteordevelopment.meteorclient.gui.GuiKeyEvents; @@ -24,8 +23,8 @@ import java.lang.reflect.InvocationTargetException; import java.util.List; +import static com.mojang.blaze3d.platform.InputConstants.*; import static meteordevelopment.meteorclient.MeteorClient.mc; -import static org.lwjgl.glfw.GLFW.*; public abstract class WTextBox extends WWidget { private static final Renderer DEFAULT_RENDERER = (renderer, x, y, text, color) -> renderer.text(text, x, y, color, false); @@ -110,7 +109,7 @@ protected double maxTextWidth() { @Override public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (mouseOver) { - if (click.button() == GLFW_MOUSE_BUTTON_RIGHT) { + if (click.button() == MOUSE_BUTTON_RIGHT) { if (!text.isEmpty()) { text = ""; cursor = 0; @@ -119,7 +118,7 @@ public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { runAction(); } - } else if (click.button() == GLFW_MOUSE_BUTTON_LEFT) { + } else if (click.button() == MOUSE_BUTTON_LEFT) { selecting = true; double overflowWidth = getOverflowWidthForRender(); @@ -240,32 +239,32 @@ public boolean onMouseReleased(MouseButtonEvent click) { public boolean onKeyPressed(KeyEvent input) { if (!focused) return false; - boolean control = MacosUtil.IS_MACOS ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; + boolean control = SystemUtils.IS_OS_MAC ? input.modifiers() == MOD_SUPER : input.modifiers() == MOD_CONTROL; - if (control && input.key() == GLFW_KEY_C) { + if (control && input.key() == KEY_C) { if (cursor != selectionStart || cursor != selectionEnd) { mc.keyboardHandler.setClipboard(text.substring(selectionStart, selectionEnd)); } return true; - } else if (control && input.key() == GLFW_KEY_X) { + } else if (control && input.key() == KEY_X) { if (cursor != selectionStart || cursor != selectionEnd) { mc.keyboardHandler.setClipboard(text.substring(selectionStart, selectionEnd)); clearSelection(); } return true; - } else if (control && input.key() == GLFW_KEY_A) { + } else if (control && input.key() == KEY_A) { cursor = text.length(); selectionStart = 0; selectionEnd = cursor; - } else if (input.modifiers() == ((MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) | GLFW_MOD_SHIFT) && input.key() == GLFW_KEY_A) { + } else if (input.modifiers() == ((SystemUtils.IS_OS_MAC ? MOD_SUPER : MOD_CONTROL) | MOD_SHIFT) && input.key() == KEY_A) { resetSelection(); - } else if (input.key() == GLFW_KEY_ENTER || input.key() == GLFW_KEY_KP_ENTER) { + } else if (input.key() == KEY_RETURN || input.key() == KEY_NUMPADENTER) { setFocused(false); if (actionOnUnfocused != null) actionOnUnfocused.run(); return true; - } else if (input.key() == GLFW_KEY_TAB && completionsW != null) { + } else if (input.key() == KEY_TAB && completionsW != null) { String completion = ((ICompletionItem) completionsW.cells.get(getSelectedCompletion()).widget()).getCompletion(); StringBuilder sb = new StringBuilder(text.length() + completion.length() + 1); @@ -299,12 +298,12 @@ public boolean onKeyPressed(KeyEvent input) { public boolean onKeyRepeated(KeyEvent input) { if (!focused) return false; - boolean control = MacosUtil.IS_MACOS ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; - boolean shift = input.modifiers() == GLFW_MOD_SHIFT; - boolean controlShift = input.modifiers() == ((SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) | GLFW_MOD_SHIFT); - boolean altShift = input.modifiers() == ((SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT) | GLFW_MOD_SHIFT); + boolean control = SystemUtils.IS_OS_MAC ? input.modifiers() == MOD_SUPER : input.modifiers() == MOD_CONTROL; + boolean shift = input.modifiers() == MOD_SHIFT; + boolean controlShift = input.modifiers() == ((SystemUtils.IS_OS_WINDOWS ? MOD_ALT : SystemUtils.IS_OS_MAC ? MOD_SUPER : MOD_CONTROL) | MOD_SHIFT); + boolean altShift = input.modifiers() == ((SystemUtils.IS_OS_WINDOWS ? MOD_CONTROL : MOD_ALT) | MOD_SHIFT); - if (control && input.key() == GLFW_KEY_V) { + if (control && input.key() == KEY_V) { clearSelection(); String preText = text; @@ -328,13 +327,13 @@ public boolean onKeyRepeated(KeyEvent input) { if (!text.equals(preText)) runAction(); return true; - } else if (input.key() == GLFW_KEY_BACKSPACE) { + } else if (input.key() == KEY_BACKSPACE) { if (cursor > 0 && cursor == selectionStart && cursor == selectionEnd) { String preText = text; - int count = (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) + int count = (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_ALT : SystemUtils.IS_OS_MAC ? MOD_SUPER : MOD_CONTROL)) ? cursor - : (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) + : (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_CONTROL : MOD_ALT)) ? countToNextSpace(true) : 1; @@ -348,14 +347,14 @@ public boolean onKeyRepeated(KeyEvent input) { } return true; - } else if (input.key() == GLFW_KEY_DELETE) { + } else if (input.key() == KEY_DELETE) { if (cursor == selectionStart && cursor == selectionEnd) { if (cursor < text.length()) { String preText = text; - int count = input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) + int count = input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_ALT : SystemUtils.IS_OS_MAC ? MOD_SUPER : MOD_CONTROL) ? text.length() - cursor - : (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) + : (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_CONTROL : MOD_ALT)) ? countToNextSpace(false) : 1; @@ -367,15 +366,15 @@ public boolean onKeyRepeated(KeyEvent input) { clearSelection(); } return true; - } else if (input.key() == GLFW_KEY_LEFT) { + } else if (input.key() == KEY_LEFT) { if (cursor > 0) { // sets the cursor to just after the next leftmost space - if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) { + if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_CONTROL : MOD_ALT)) { cursor -= countToNextSpace(true); resetSelection(); } // sets the cursor to the beginning of the text box - else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) { + else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_ALT : SystemUtils.IS_OS_MAC ? MOD_SUPER : MOD_CONTROL)) { cursor = 0; resetSelection(); } @@ -431,15 +430,15 @@ else if (shift) { } return true; - } else if (input.key() == GLFW_KEY_RIGHT) { + } else if (input.key() == KEY_RIGHT) { if (cursor < text.length()) { // sets the cursor to just before the next rightmost space - if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) { + if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_CONTROL : MOD_ALT)) { cursor += countToNextSpace(false); resetSelection(); } // sets the cursor to the end of the text box - else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) { + else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? MOD_ALT : SystemUtils.IS_OS_MAC ? MOD_SUPER : MOD_CONTROL)) { cursor = text.length(); resetSelection(); } @@ -494,7 +493,7 @@ else if (shift) { } return true; - } else if (input.key() == GLFW_KEY_DOWN && completionsW != null) { + } else if (input.key() == KEY_DOWN && completionsW != null) { int currentI = getSelectedCompletion(); if (currentI == Math.min(5, completions.size() - 1)) { @@ -508,7 +507,7 @@ else if (shift) { } return true; - } else if (input.key() == GLFW_KEY_UP && completionsW != null) { + } else if (input.key() == KEY_UP && completionsW != null) { int currentI = getSelectedCompletion(); if (currentI == 0) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WPressable.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WPressable.java index ac58f20c63e..b99369fb007 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WPressable.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WPressable.java @@ -8,8 +8,8 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import net.minecraft.client.input.MouseButtonEvent; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_LEFT; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_RIGHT; public abstract class WPressable extends WWidget { public Runnable action; @@ -18,7 +18,7 @@ public abstract class WPressable extends WWidget { @Override public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { - if (mouseOver && (click.button() == GLFW_MOUSE_BUTTON_LEFT || click.button() == GLFW_MOUSE_BUTTON_RIGHT)) + if (mouseOver && (click.button() == MOUSE_BUTTON_LEFT || click.button() == MOUSE_BUTTON_RIGHT)) pressed = true; return pressed; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenMixin.java index c0daddc283f..28df5b4e4f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenMixin.java @@ -23,8 +23,8 @@ import net.minecraft.world.inventory.ContainerInput; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.jspecify.annotations.Nullable; import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -32,8 +32,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_LEFT; import static meteordevelopment.meteorclient.MeteorClient.mc; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; @Mixin(AbstractContainerScreen.class) public abstract class AbstractContainerScreenMixin extends Screen implements MenuAccess { @@ -89,7 +89,7 @@ private void onInit(CallbackInfo ci) { // Inventory Tweaks @Inject(method = "mouseDragged", at = @At("TAIL")) private void onMouseDragged(MouseButtonEvent event, double dx, double dy, CallbackInfoReturnable cir) { - if (event.button() != GLFW_MOUSE_BUTTON_LEFT || doubleclick || !Modules.get().get(InventoryTweaks.class).mouseDragItemMove()) + if (event.button() != MOUSE_BUTTON_LEFT || doubleclick || !Modules.get().get(InventoryTweaks.class).mouseDragItemMove()) return; Slot slot = getHoveredSlot(event.x(), event.y()); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java index 54dbd67e015..1b9e6109683 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java @@ -21,7 +21,8 @@ import net.minecraft.client.renderer.entity.state.AvatarRenderState; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.rendertype.RenderTypes; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.UvMapping; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.Avatar; import org.spongepowered.asm.mixin.Mixin; @@ -77,10 +78,10 @@ public AvatarRendererMixin(EntityRendererProvider.Context ctx, PlayerModel model // Chams - Hand Color - @WrapWithCondition(method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModelPart(Lnet/minecraft/client/model/geom/ModelPart;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IILnet/minecraft/client/renderer/texture/TextureAtlasSprite;)V")) - private boolean renderArm$color(SubmitNodeCollector instance, ModelPart modelPart, PoseStack matrixStack, RenderType renderLayer, int light, int uv, TextureAtlasSprite sprite) { + @WrapWithCondition(method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModelPart(Lnet/minecraft/client/model/geom/ModelPart;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IILnet/minecraft/client/renderer/texture/UvMapping;)V")) + private boolean renderArm$color(SubmitNodeCollector instance, ModelPart modelPart, PoseStack poseStack, RenderType renderType, int light, int uv, UvMapping uvMapping) { if (chams.isActive() && chams.hand.get()) { - instance.submitModelPart(modelPart, matrixStack, renderLayer, light, uv, null, chams.handColor.get().getPacked(), null); + instance.submitModelPart(modelPart, poseStack, renderType, light, OverlayTexture.NO_OVERLAY, uvMapping); return false; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BannerRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BannerRendererMixin.java index bca35781f14..6694e8ff84c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BannerRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BannerRendererMixin.java @@ -62,19 +62,18 @@ private void injectRender2(BannerRenderState state, PoseStack poseStack, SubmitN } @Unique - private static void renderPillar(PoseStack matrices, SubmitNodeCollector submitNodeCollector, int light, BannerModel model, SpriteGetter sprites, ModelFeatureRenderer.CrumblingOverlay breakProgress) { + private static void renderPillar(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int light, BannerModel model, SpriteGetter sprites, ModelFeatureRenderer.CrumblingOverlay breakProgress) { SpriteId sprite = Sheets.BANNER_BASE; submitNodeCollector.submitModel( model, Unit.INSTANCE, - matrices, + poseStack, light, OverlayTexture.NO_OVERLAY, -1, sprite, sprites, - 0, - breakProgress + 0 ); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java index 0231425cc7e..7e0e10cca16 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java @@ -13,7 +13,6 @@ import net.minecraft.client.gui.screens.inventory.BookEditScreen; import net.minecraft.nbt.*; import net.minecraft.network.chat.Component; -import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -69,9 +68,9 @@ private void onInit(CallbackInfo ci) { } try { - GLFW.glfwSetClipboardString(mc.getWindow().handle(), Base64.getEncoder().encodeToString(bytes.array)); + mc.keyboardHandler.setClipboard(Base64.getEncoder().encodeToString(bytes.array)); } catch (OutOfMemoryError exception) { - GLFW.glfwSetClipboardString(mc.getWindow().handle(), exception.toString()); + mc.keyboardHandler.setClipboard(exception.toString()); } }) .pos(4, 4) @@ -81,8 +80,7 @@ private void onInit(CallbackInfo ci) { addRenderableWidget( new Button.Builder(Component.literal("Paste"), _ -> { - String clipboard = GLFW.glfwGetClipboardString(mc.getWindow().handle()); - if (clipboard == null) return; + String clipboard = mc.keyboardHandler.getClipboard(); byte[] bytes; try { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookViewScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookViewScreenMixin.java index 3f43e0c54fc..e7f77bf5ea3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookViewScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookViewScreenMixin.java @@ -21,7 +21,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import org.lwjgl.glfw.GLFW; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; import org.spongepowered.asm.mixin.Mixin; @@ -83,7 +82,7 @@ private void onInit(CallbackInfo ci) { if (size > available) { ChatUtils.error("Could not copy to clipboard: Out of memory."); } else { - GLFW.glfwSetClipboardString(mc.getWindow().handle(), encoded); + mc.keyboardHandler.setClipboard(encoded); } }) .pos(4, 4) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java index f9f5992608a..ceb30a85d01 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java @@ -94,7 +94,7 @@ private GuiMessage onAddMessage_modifyGuiMessage(GuiMessage line) { } @Inject(at = @At("HEAD"), method = "addMessage", cancellable = true) - private void onAddMessage(Component message, MessageSignature signature, GuiMessageSource source, GuiMessageTag indicator, CallbackInfo ci, @Local(argsOnly = true, name = "contents") LocalRef contents, @Local(argsOnly = true, name = "tag") LocalRef tag) { + private void onAddMessage(Component message, MessageSignature signature, GuiMessageSource source, GuiMessageTag indicator, CallbackInfo ci, @Local(argsOnly = true) LocalRef contents, @Local(argsOnly = true) LocalRef tag) { ReceiveMessageEvent event = MeteorClient.EVENT_BUS.post(ReceiveMessageEvent.get(message, indicator, nextId)); if (event.isCancelled()) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java index 1e4f8f9bda2..94a88032a58 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java @@ -92,7 +92,7 @@ private void onHandleSoundEvent(ClientboundSoundPacket packet, CallbackInfo ci) @Inject(method = "handleLevelChunkWithLight", at = @At("TAIL")) private void onHandleLevelChunkWithLight(ClientboundLevelChunkWithLightPacket packet, CallbackInfo ci) { - LevelChunk chunk = minecraft.level.getChunk(packet.getX(), packet.getZ()); + LevelChunk chunk = minecraft.level.getChunk(packet.x(), packet.z()); MeteorClient.EVENT_BUS.post(new ChunkDataEvent(chunk)); } @@ -106,9 +106,9 @@ private void onHandleContainerContent(ClientboundContainerSetContentPacket packe MeteorClient.EVENT_BUS.post(InventoryEvent.get(packet)); } - @Inject(method = "handleRemoveEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientboundRemoveEntitiesPacket;getEntityIds()Lit/unimi/dsi/fastutil/ints/IntList;")) + @Inject(method = "handleRemoveEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientboundRemoveEntitiesPacket;entityIds()Lit/unimi/dsi/fastutil/ints/IntList;")) private void onHandleRemoveEntities(ClientboundRemoveEntitiesPacket packet, CallbackInfo ci) { - for (int id : packet.getEntityIds()) { + for (int id : packet.entityIds()) { MeteorClient.EVENT_BUS.post(EntityDestroyEvent.get(minecraft.level.getEntity(id))); } } @@ -159,7 +159,7 @@ private void onHandleMovePlayerReturn(ClientboundPlayerPositionPacket packet, Ca } @Inject(method = "sendChat", at = @At("HEAD"), cancellable = true) - private void onSendChatMessage(String message, CallbackInfo ci, @Local(argsOnly = true, name = "content") LocalRef messageRef) { + private void onSendChatMessage(String message, CallbackInfo ci, @Local(argsOnly = true) LocalRef messageRef) { if (!message.startsWith(Config.get().prefix.get()) && !(BaritoneUtils.IS_AVAILABLE && message.startsWith(BaritoneUtils.getPrefix()))) { SendMessageEvent event = MeteorClient.EVENT_BUS.post(SendMessageEvent.get(message)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CloudRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CloudRendererMixin.java index d9f2b724f86..6a470f3d111 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CloudRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CloudRendererMixin.java @@ -5,11 +5,11 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.renderpearl.api.commands.RenderPass; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Ambience; import net.minecraft.client.CloudStatus; import net.minecraft.client.renderer.CloudRenderer; -import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,8 +17,8 @@ @Mixin(CloudRenderer.class) public abstract class CloudRendererMixin { - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRenderClouds(int color, CloudStatus cloudStatus, float bottomY, int range, Vec3 cameraPosition, long gameTime, float partialTicks, CallbackInfo ci) { + @Inject(method = "render(Lnet/minecraft/client/CloudStatus;Lcom/mojang/renderpearl/api/commands/RenderPass;)V", at = @At("HEAD"), cancellable = true) + private void onRenderClouds(CloudStatus cloudStatus, RenderPass renderPass, CallbackInfo ci) { Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.endSky.get()) ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantTableRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantTableRendererMixin.java index 9f321888790..d5e2710b3a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantTableRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantTableRendererMixin.java @@ -12,7 +12,6 @@ import net.minecraft.client.model.Model; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.blockentity.EnchantTableRenderer; -import net.minecraft.client.renderer.feature.ModelFeatureRenderer; import net.minecraft.client.resources.model.sprite.SpriteGetter; import net.minecraft.client.resources.model.sprite.SpriteId; import org.spongepowered.asm.mixin.Mixin; @@ -20,8 +19,8 @@ @Mixin(EnchantTableRenderer.class) public abstract class EnchantTableRendererMixin { - @WrapWithCondition(method = "submit(Lnet/minecraft/client/renderer/blockentity/state/EnchantTableRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;IIILnet/minecraft/client/resources/model/sprite/SpriteId;Lnet/minecraft/client/resources/model/sprite/SpriteGetter;ILnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;)V")) - private boolean onRenderBookModelRenderProxy(SubmitNodeCollector instance, Model model, Object state, PoseStack poseStack, int lightCoords, int overlayCoords, int tintedColor, SpriteId spriteId, SpriteGetter spriteGetter, int outlineColor, ModelFeatureRenderer.CrumblingOverlay crumblingOverlay) { + @WrapWithCondition(method = "submit(Lnet/minecraft/client/renderer/blockentity/state/EnchantTableRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;IIILnet/minecraft/client/resources/model/sprite/SpriteId;Lnet/minecraft/client/resources/model/sprite/SpriteGetter;I)V")) + private boolean onRenderBookModelRenderProxy(SubmitNodeCollector instance, Model model, Object state, PoseStack poseStack, int lightCoords, int overlayCoords, int tintedColor, SpriteId spriteId, SpriteGetter spriteGetter, int outlineColor) { return !Modules.get().get(NoRender.class).noEnchTableBook(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalRendererMixin.java index 36e586b9da0..f846e4183e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalRendererMixin.java @@ -13,7 +13,6 @@ import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.entity.EndCrystalRenderer; import net.minecraft.client.renderer.entity.state.EndCrystalRenderState; -import net.minecraft.client.renderer.feature.ModelFeatureRenderer; import net.minecraft.client.renderer.rendertype.RenderTypes; import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.resources.Identifier; @@ -55,8 +54,8 @@ private void onInit(CallbackInfo ci) { // Chams - Color - @WrapWithCondition(method = "submit(Lnet/minecraft/client/renderer/entity/state/EndCrystalRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/resources/Identifier;IIILnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;)V")) - private boolean render$color(SubmitNodeCollector instance, Model model, S state, PoseStack poseStack, Identifier identifier, int lightCoords, int overlayCoords, int outlineColor, ModelFeatureRenderer.CrumblingOverlay crumblingOverlay) { + @WrapWithCondition(method = "submit(Lnet/minecraft/client/renderer/entity/state/EndCrystalRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/resources/Identifier;III)V")) + private boolean render$color(SubmitNodeCollector instance, Model model, S state, PoseStack poseStack, Identifier identifier, int lightCoords, int overlayCoords, int outlineColor) { if (chams.isActive() && chams.crystals.get()) { var renderType = RenderTypes.entityTranslucent((chams.isActive() && chams.crystals.get() && !chams.crystalsTexture.get()) ? Chams.BLANK : END_CRYSTAL_LOCATION); @@ -69,8 +68,7 @@ private void onInit(CallbackInfo ci) { overlayCoords, chams.crystalsColor.get().getPacked(), null, - outlineColor, - null + outlineColor ); return false; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index 66978871b63..b5cdee1d8ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -57,7 +57,7 @@ private void onRenderLabel(T entity, CallbackInfoReturnable cir) { } @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) - private void shouldRender(T entity, Frustum culler, double camX, double camY, double camZ, CallbackInfoReturnable cir) { + private void shouldRender(T entity, Frustum culler, double camX, double camY, double camZ, float partialTicks, CallbackInfoReturnable cir) { if (noRender.noEntity(entity)) cir.setReturnValue(false); if (noRender.noFallingBlocks() && entity instanceof FallingBlockEntity) cir.setReturnValue(false); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java new file mode 100644 index 00000000000..a877f8cc6b3 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java @@ -0,0 +1,60 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.HandView; +import net.minecraft.client.player.FirstPersonHandsAndItems; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(FirstPersonHandsAndItems.class) +public abstract class FirstPersonHandsAndItemsMixin { + @Shadow + protected abstract boolean shouldInstantlyReplaceVisibleItem(ItemStack currentlyVisibleItem, ItemStack expectedItem, LocalPlayer player); + + @Shadow + private ItemStack mainHandItem; + + @Shadow + private float mainHandHeight; + + @Shadow + private ItemStack offHandItem; + + @Shadow + private float offHandHeight; + + @ModifyReturnValue(method = "shouldInstantlyReplaceVisibleItem", at = @At("RETURN")) + private boolean modifySkipSwapAnimation(boolean original) { + return original || Modules.get().get(HandView.class).skipSwapping(); + } + + @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 2), index = 0) + private float modifyEquipProgressMainhand(float value, @Local(argsOnly = true) LocalPlayer player) { + HandView handView = Modules.get().get(HandView.class); + if (handView.swordSlash() && mc.player.getMainHandItem().is(ItemTags.SWORDS)) return value; + + float f = mc.player.getItemSwapScale(1f); + float modified = handView.oldAnimations() ? 1 : f * f * f; + + return (shouldInstantlyReplaceVisibleItem(mainHandItem, player.getMainHandItem(), player) ? modified : 0) - mainHandHeight; + } + + @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 3), index = 0) + private float modifyEquipProgressOffhand(float value, @Local(argsOnly = true) LocalPlayer player) { + return (shouldInstantlyReplaceVisibleItem(offHandItem, player.getOffhandItem(), player) ? 1 : 0) - offHandHeight; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java new file mode 100644 index 00000000000..bea27d87a10 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java @@ -0,0 +1,64 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.mojang.blaze3d.vertex.PoseStack; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.render.ArmRenderEvent; +import meteordevelopment.meteorclient.events.render.HeldItemRendererEvent; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.HandView; +import net.minecraft.client.renderer.FirstPersonHandsAndItemsRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.state.level.FirstPersonHandsAndItemsRenderState; +import net.minecraft.client.renderer.state.level.PlayerRenderState; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(FirstPersonHandsAndItemsRenderer.class) +public abstract class FirstPersonHandsAndItemsRendererMixin { + @ModifyExpressionValue(method = "submitHandsWithItems", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;swingAnimation:F")) + private float modifySwing(float attackValue, final float partialTicks, final PoseStack poseStack, final SubmitNodeCollector submitNodeCollector, final PlayerRenderState playerState, final FirstPersonHandsAndItemsRenderState state) { + HandView module = Modules.get().get(HandView.class); + InteractionHand hand = state.attackHand; + + if (module.isActive()) { + if (module.swordSlash() && hand == InteractionHand.MAIN_HAND && state.mainHandItem.is(ItemTags.SWORDS)) { + return 0f; + } + if (hand == InteractionHand.OFF_HAND && !state.offHandItem.isEmpty()) { + return attackValue + module.offSwing.get().floatValue(); + } + if (hand == InteractionHand.MAIN_HAND && !state.mainHandItem.isEmpty()) { + return attackValue + module.mainSwing.get().floatValue(); + } + } + + return attackValue; + } + + @Inject(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/item/ItemStackRenderState;submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;III)V", shift = At.Shift.BEFORE)) + private void onRenderItem(PlayerRenderState playerState, FirstPersonHandsAndItemsRenderState state, float partialTicks, float xRot, InteractionHand hand, float attack, ItemStack itemStack, float inverseArmHeight, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(HeldItemRendererEvent.get(hand, poseStack)); + } + + @Inject(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/FirstPersonHandsAndItemsRenderer;renderPlayerArm(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;IFFLnet/minecraft/world/entity/HumanoidArm;Lnet/minecraft/client/renderer/state/level/PlayerRenderState;)V")) + private void onRenderArm(PlayerRenderState playerState, FirstPersonHandsAndItemsRenderState state, float partialTicks, float xRot, InteractionHand hand, float attack, ItemStack itemStack, float inverseArmHeight, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(ArmRenderEvent.get(hand, poseStack)); + } + + @Inject(method = "applyEatTransform", at = @At(value = "INVOKE", target = "Ljava/lang/Math;pow(DD)D", shift = At.Shift.BEFORE), cancellable = true) + private void cancelTransformations(PoseStack poseStack, float partialTicks, HumanoidArm arm, float useItemRemainingTicks, int useDuration, CallbackInfo ci) { + if (Modules.get().get(HandView.class).disableFoodAnimation()) ci.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GpuDeviceMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FrontendGpuDeviceMixin.java similarity index 76% rename from src/main/java/meteordevelopment/meteorclient/mixin/GpuDeviceMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/FrontendGpuDeviceMixin.java index efa887201b7..99f1523517a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GpuDeviceMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FrontendGpuDeviceMixin.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.mixin; -import com.mojang.blaze3d.systems.GpuDevice; -import com.mojang.blaze3d.systems.GpuDeviceBackend; -import com.mojang.blaze3d.systems.RenderPassBackend; +import com.mojang.renderpearl.backend.api.GpuDeviceBackend; +import com.mojang.renderpearl.backend.api.RenderPassBackend; +import com.mojang.renderpearl.frontend.FrontendGpuDevice; import meteordevelopment.meteorclient.mixininterface.IGpuDevice; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -@Mixin(GpuDevice.class) -public abstract class GpuDeviceMixin implements IGpuDevice { +@Mixin(FrontendGpuDevice.class) +public abstract class FrontendGpuDeviceMixin implements IGpuDevice { @Shadow @Final private GpuDeviceBackend backend; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index 1d8ade21d54..5c5cddd3100 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -9,6 +9,7 @@ import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.renderpearl.api.textures.GpuTextureView; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.MixinPlugin; import meteordevelopment.meteorclient.events.render.Render3DEvent; @@ -24,16 +25,14 @@ import meteordevelopment.meteorclient.utils.render.NametagUtils; import meteordevelopment.meteorclient.utils.render.RenderUtils; import net.minecraft.client.Camera; -import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.client.renderer.state.GameRenderState; import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.state.level.PlayerRenderState; import net.minecraft.util.profiling.Profiler; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.spongepowered.asm.mixin.Final; @@ -89,8 +88,8 @@ public abstract class GameRendererMixin { return result; } - @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=hand")) - private void onRenderLevel(DeltaTracker deltaTracker, CallbackInfo ci, @Local(name = "projectionMatrix") Matrix4f projectionMatrix, @Local(name = "modelViewMatrix") Matrix4fc modelViewMatrix, @Local(name = "worldPartialTicks") float worldPartialTicks, @Local(name = "bobStack") PoseStack bobStack) { + @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GameRenderer;render3dHud(Lnet/minecraft/client/renderer/state/level/CameraRenderState;Lnet/minecraft/client/renderer/state/level/PlayerRenderState;Lnet/minecraft/client/renderer/state/OptionsRenderState;Z)V")) + private void onRenderLevel(CallbackInfo ci, @Local(name = "projectionMatrix") Matrix4f projectionMatrix, @Local(name = "cameraState") CameraRenderState cameraState, @Local(name = "worldPartialTicks") float worldPartialTicks, @Local(name = "bobStack") PoseStack bobStack) { if (!Utils.canUpdate()) return; Profiler.get().push(MeteorClient.MOD_ID + "_render"); @@ -104,7 +103,7 @@ private void onRenderLevel(DeltaTracker deltaTracker, CallbackInfo ci, @Local(na Render3DEvent event = Render3DEvent.get(bobStack, renderer, depthRenderer, worldPartialTicks, mainCamera.position().x, mainCamera.position().y, mainCamera.position().z); // Update model view matrix - + Matrix4fc modelViewMatrix = cameraState.viewRotationMatrix; RenderSystem.getModelViewStack().pushMatrix().mul(modelViewMatrix); matrices.pushPose(); @@ -143,20 +142,13 @@ private void onRenderLevelTail(CallbackInfo ci) { MeteorClient.EVENT_BUS.post(RenderAfterWorldEvent.get()); } - @Inject(method = "displayItemActivation", at = @At("HEAD"), cancellable = true) - private void onDisplayItemActivation(ItemStack itemStack, CallbackInfo ci) { - if (itemStack.getItem() == Items.TOTEM_OF_UNDYING && Modules.get().get(NoRender.class).noTotemAnimation()) { - ci.cancel(); - } - } - @ModifyExpressionValue(method = "renderLevel", at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(FF)F", ordinal = 0)) private float applyCameraTransformationsMathHelperLerpProxy(float original) { return Modules.get().get(NoRender.class).noNausea() ? 0 : original; } @Inject(method = "renderItemInHand", at = @At("HEAD"), cancellable = true) - private void renderItemInHand(CameraRenderState cameraState, float deltaPartialTick, Matrix4fc modelViewMatrix, CallbackInfo ci) { + private void renderItemInHand(CameraRenderState cameraState, PlayerRenderState playerState, GpuTextureView depthTextureView, CallbackInfo ci) { if (!Modules.get().get(Freecam.class).renderHands() || !Modules.get().get(Zoom.class).renderHands()) { ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java index 1a1f8b934f8..3b7d1f62fc6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java @@ -5,22 +5,17 @@ package meteordevelopment.meteorclient.mixin; -import com.mojang.blaze3d.opengl.GlCommandEncoder; -import com.mojang.blaze3d.opengl.GlDevice; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.systems.RenderPassBackend; +import com.mojang.renderpearl.backend.api.RenderPassBackend; +import com.mojang.renderpearl.backend.opengl.GlCommandEncoder; +import com.mojang.renderpearl.backend.opengl.GlDevice; import meteordevelopment.meteorclient.mixininterface.IGpuDevice; -import meteordevelopment.meteorclient.mixininterface.IRenderPipeline; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import static org.lwjgl.opengl.GL11C.*; - @Mixin(GlCommandEncoder.class) public abstract class GlCommandEncoderMixin { @Shadow @@ -28,18 +23,19 @@ public abstract class GlCommandEncoderMixin { private GlDevice device; @SuppressWarnings("deprecation") - @Inject(method = "createRenderPass(Lcom/mojang/blaze3d/systems/RenderPassDescriptor;)Lcom/mojang/blaze3d/systems/RenderPassBackend;", at = @At("RETURN")) + @Inject(method = "createRenderPass", at = @At("RETURN")) private void createRenderPass$iGpuDevice(CallbackInfoReturnable cir) { ((IGpuDevice) device).meteor$onCreateRenderPass(cir.getReturnValue()); } - @Inject(method = "applyPipelineState", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlStateManager;_polygonMode(II)V")) - private void setPipelineAndApplyState$lineSmooth(RenderPipeline pipeline, CallbackInfo ci) { - if (((IRenderPipeline) pipeline).meteor$getLineSmooth()) { - glEnable(GL_LINE_SMOOTH); - glLineWidth(1); - } else { - glDisable(GL_LINE_SMOOTH); - } - } + // todo ? +// @Inject(method = "applyPipelineState", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlStateManager;_polygonMode(II)V")) +// private void setPipelineAndApplyState$lineSmooth(RenderPipeline pipeline, CallbackInfo ci) { +// if (((IRenderPipeline) pipeline).meteor$getLineSmooth()) { +// glEnable(GL_LINE_SMOOTH); +// glLineWidth(1); +// } else { +// glDisable(GL_LINE_SMOOTH); +// } +// } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GlDeviceMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GlDeviceMixin.java index e9e7b9b11dd..af5ebd5d851 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GlDeviceMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GlDeviceMixin.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.mixin; -import com.mojang.blaze3d.opengl.GlDevice; -import com.mojang.blaze3d.systems.RenderPassBackend; +import com.mojang.renderpearl.backend.api.RenderPassBackend; +import com.mojang.renderpearl.backend.opengl.GlDevice; import meteordevelopment.meteorclient.mixininterface.IGpuDevice; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java index d478a2754f0..d5c7469ec0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java @@ -11,8 +11,9 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; -import net.minecraft.network.chat.Component; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; import net.minecraft.resources.Identifier; +import net.minecraft.util.FormattedCharSequence; import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -26,13 +27,13 @@ @Mixin(value = GuiGraphicsExtractor.class) public abstract class GuiGraphicsExtractorMixin { - @Inject(method = "setTooltipForNextFrame(Lnet/minecraft/client/gui/Font;Ljava/util/List;Ljava/util/Optional;IILnet/minecraft/resources/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V", shift = At.Shift.BEFORE)) - private void onDrawTooltip(Font font, List texts, Optional optionalImage, int xo, int yo, @Nullable Identifier style, CallbackInfo ci, @Local(name = "components") List components) { - if (optionalImage.isPresent() && optionalImage.get() instanceof MeteorTooltipData meteorTooltipData) + @Inject(method = "setTooltipForNextFrame(Lnet/minecraft/client/gui/Font;Ljava/util/List;Ljava/util/Optional;Lnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;IIZLnet/minecraft/resources/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V", shift = At.Shift.BEFORE)) + private void onDrawTooltip(Font font, List tooltip, Optional component, ClientTooltipPositioner positioner, int xo, int yo, boolean replaceExisting, @Nullable Identifier style, CallbackInfo ci, @Local(name = "components") List components) { + if (component.isPresent() && component.get() instanceof MeteorTooltipData meteorTooltipData) components.add(meteorTooltipData.getComponent()); } - @ModifyReceiver(method = "setTooltipForNextFrame(Lnet/minecraft/client/gui/Font;Ljava/util/List;Ljava/util/Optional;IILnet/minecraft/resources/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V")) + @ModifyReceiver(method = "setTooltipForNextFrame(Lnet/minecraft/client/gui/Font;Ljava/util/List;Ljava/util/Optional;Lnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;IIZLnet/minecraft/resources/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V")) private Optional onDrawTooltip_modifyIfPresentReceiver(Optional data, Consumer action) { if (data.isPresent() && data.get() instanceof MeteorTooltipData) return Optional.empty(); return data; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemInHandRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemInHandRendererMixin.java deleted file mode 100644 index 34f7d52ea68..00000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemInHandRendererMixin.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.mojang.blaze3d.vertex.PoseStack; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.render.ArmRenderEvent; -import meteordevelopment.meteorclient.events.render.HeldItemRendererEvent; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.HandView; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.ItemInHandRenderer; -import net.minecraft.client.renderer.SubmitNodeCollector; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.HumanoidArm; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Objects; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(ItemInHandRenderer.class) -public abstract class ItemInHandRendererMixin { - @Shadow - private float mainHandHeight; - - @Shadow - private float offHandHeight; - - @Shadow - private ItemStack mainHandItem; - - @Shadow - private ItemStack offHandItem; - - @Shadow - protected abstract boolean shouldInstantlyReplaceVisibleItem(ItemStack currentlyVisibleItem, ItemStack expectedItem); - - @ModifyExpressionValue(method = "submitHandsWithItems(FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/player/LocalPlayer;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;getAttackAnim(F)F")) - private float modifySwing(float attackValue) { - HandView module = Modules.get().get(HandView.class); - InteractionHand hand = Objects.requireNonNullElse(mc.player.swingingArm, InteractionHand.MAIN_HAND); - - if (module.isActive()) { - if (module.swordSlash() && hand == InteractionHand.MAIN_HAND && mainHandItem.is(ItemTags.SWORDS)) { - return 0f; - } - if (hand == InteractionHand.OFF_HAND && !offHandItem.isEmpty()) { - return attackValue + module.offSwing.get().floatValue(); - } - if (hand == InteractionHand.MAIN_HAND && !mainHandItem.isEmpty()) { - return attackValue + module.mainSwing.get().floatValue(); - } - } - - return attackValue; - } - - @ModifyReturnValue(method = "shouldInstantlyReplaceVisibleItem", at = @At("RETURN")) - private boolean modifySkipSwapAnimation(boolean original) { - return original || Modules.get().get(HandView.class).skipSwapping(); - } - - @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 2), index = 0) - private float modifyEquipProgressMainhand(float value) { - HandView handView = Modules.get().get(HandView.class); - if (handView.swordSlash() && mc.player.getMainHandItem().is(ItemTags.SWORDS)) return value; - - float f = mc.player.getItemSwapScale(1f); - float modified = handView.oldAnimations() ? 1 : f * f * f; - - return (shouldInstantlyReplaceVisibleItem(mainHandItem, mc.player.getMainHandItem()) ? modified : 0) - mainHandHeight; - } - - @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 3), index = 0) - private float modifyEquipProgressOffhand(float value) { - return (shouldInstantlyReplaceVisibleItem(offHandItem, mc.player.getOffhandItem()) ? 1 : 0) - offHandHeight; - } - - @Inject(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemInHandRenderer;renderItem(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemDisplayContext;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V", shift = At.Shift.BEFORE)) - private void onRenderItem(AbstractClientPlayer player, float frameInterp, float xRot, InteractionHand hand, float attack, ItemStack itemStack, float inverseArmHeight, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(HeldItemRendererEvent.get(hand, poseStack)); - } - - @Inject(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemInHandRenderer;renderPlayerArm(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;IFFLnet/minecraft/world/entity/HumanoidArm;)V")) - private void onRenderArm(AbstractClientPlayer player, float frameInterp, float xRot, InteractionHand hand, float attack, ItemStack itemStack, float inverseArmHeight, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(ArmRenderEvent.get(hand, poseStack)); - } - - @Inject(method = "applyEatTransform", at = @At(value = "INVOKE", target = "Ljava/lang/Math;pow(DD)D", shift = At.Shift.BEFORE), cancellable = true) - private void cancelTransformations(PoseStack poseStack, float frameInterp, HumanoidArm arm, ItemStack itemStack, Player player, CallbackInfo ci) { - if (Modules.get().get(HandView.class).disableFoodAnimation()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java index 543eaccef5f..908e701b1d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java @@ -15,7 +15,7 @@ @Mixin(ItemFeatureRenderer.class) public abstract class ItemRendererMixin { - @ModifyExpressionValue(method = "prepareFoilSubmit", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/ItemFeatureRenderer$Submit;foilType()Lnet/minecraft/client/renderer/item/ItemStackRenderState$FoilType;")) + @ModifyExpressionValue(method = "prepareMainSubmit", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/ItemFeatureRenderer$Submit;foilType()Lnet/minecraft/client/renderer/item/ItemStackRenderState$FoilType;")) private ItemStackRenderState.FoilType modifyEnchant(ItemStackRenderState.FoilType foilType) { if (Modules.get().get(NoRender.class).noEnchantGlint()) { return ItemStackRenderState.FoilType.NONE; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardHandlerMixin.java index 1af2e207239..2bd5180779a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardHandlerMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.meteor.CharTypedEvent; import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; @@ -17,7 +18,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.input.CharacterEvent; import net.minecraft.client.input.KeyEvent; -import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -34,22 +34,22 @@ public abstract class KeyboardHandlerMixin { @Inject(method = "keyPress", at = @At("HEAD"), cancellable = true) public void onKey(long handle, int action, KeyEvent event, CallbackInfo ci) { int modifiers = event.modifiers(); - if (event.key() != GLFW.GLFW_KEY_UNKNOWN) { + if (event.key() != InputConstants.UNKNOWN.getValue()) { // on Linux/X11 the modifier is not active when the key is pressed and still active when the key is released // https://github.com/glfw/glfw/issues/1630 - if (action == GLFW.GLFW_PRESS) { + if (action == InputConstants.PRESS) { modifiers |= Input.getModifier(event.key()); - } else if (action == GLFW.GLFW_RELEASE) { + } else if (action == InputConstants.RELEASE) { modifiers &= ~Input.getModifier(event.key()); } - if (minecraft.gui.screen() instanceof WidgetScreen widgetScreen && action == GLFW.GLFW_REPEAT) { - widgetScreen.keyRepeated(new KeyEvent(event.key(), event.scancode(), modifiers)); + if (minecraft.gui.screen() instanceof WidgetScreen widgetScreen && action == InputConstants.REPEAT) { + widgetScreen.keyRepeated(new KeyEvent(event.key(), event.keycode(), modifiers)); } if (GuiKeyEvents.canUseKeys) { - Input.setKeyState(event.key(), action != GLFW.GLFW_RELEASE); - if (MeteorClient.EVENT_BUS.post(KeyInputEvent.get(new KeyEvent(event.key(), event.scancode(), modifiers), KeyAction.get(action))).isCancelled()) + Input.setKeyState(event.key(), action != InputConstants.RELEASE); + if (MeteorClient.EVENT_BUS.post(KeyInputEvent.get(new KeyEvent(event.key(), event.keycode(), modifiers), KeyAction.get(action))).isCancelled()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java index 380d5a7729f..1305c32de09 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java @@ -86,7 +86,7 @@ private void onSetLevel(ClientLevel level, CallbackInfo ci) { method = "isEntityVisible", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/renderer/LevelRenderer;isSectionCompiledAndVisible(Lnet/minecraft/core/BlockPos;)Z" + target = "Lnet/minecraft/client/renderer/LevelRenderer;isSectionCompiledAndVisible(Lnet/minecraft/core/BlockPos;J)Z" ) ) private boolean isEntityVisible$forceRender(boolean original) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererMixin.java index ee2c6eb2389..d48a6a501e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererMixin.java @@ -6,11 +6,11 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.mojang.blaze3d.resource.ResourceHandle; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; import it.unimi.dsi.fastutil.Stack; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; @@ -23,7 +23,6 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.postprocess.EntityShader; import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders; -import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelTargetBundle; import net.minecraft.client.renderer.RenderBuffers; @@ -33,14 +32,9 @@ import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.world.entity.Entity; -import org.joml.Matrix4fc; import org.joml.Vector4f; import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -78,7 +72,7 @@ private boolean modifyMobEffectBlocksSky(boolean original) { // Entity Shaders @Inject(method = "render", at = @At("HEAD")) - private void onRenderLevelHead(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci) { + private void onRenderLevelHead(GraphicsResourceAllocator resourceAllocator, boolean renderOutline, CameraRenderState cameraState, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, boolean consistentDepthRequired, CallbackInfo ci) { PostProcessShaders.beginRender(); } @@ -130,7 +124,7 @@ private void draw(LevelRenderState worldState, PoseStack matrices, EntityShader meteor$pushEntityOutlineFramebuffer(shader.framebuffer); try { try (var frame = renderDispatcher.prepareFrame(outlineRenderCommandQueue)) { - frame.executeOutline(); + executeOutline(frame); } } finally { outlineRenderCommandQueue.submitsPerOrder.clear(); @@ -138,7 +132,7 @@ private void draw(LevelRenderState worldState, PoseStack matrices, EntityShader } } - @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher$PreparedFrame;executeOutline()V", shift = At.Shift.AFTER)) + @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;executeOutline(Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher$PreparedFrame;)V", shift = At.Shift.AFTER)) private void addMainPass$submitEntityVertices(CallbackInfo ci) { PostProcessShaders.submitEntityVertices(); } @@ -165,6 +159,10 @@ private void onResize(int width, int height, CallbackInfo ci) { @Shadow @Final private RenderBuffers renderBuffers; + + @Shadow + protected abstract void executeOutline(FeatureRenderDispatcher.PreparedFrame featureFrame); + @Unique private Stack framebufferStack; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightmapMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightmapMixin.java index 5b379980967..8f934ac5417 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LightmapMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LightmapMixin.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.mixin; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.GpuTexture; +import com.mojang.renderpearl.api.textures.GpuTexture; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Fullbright; import meteordevelopment.meteorclient.systems.modules.render.Xray; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightningBoltRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightningBoltRendererMixin.java index eddb5ed1c46..168927b3092 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LightningBoltRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LightningBoltRendererMixin.java @@ -22,16 +22,16 @@ public abstract class LightningBoltRendererMixin { * @author Walaryne */ @Inject(method = "quad", at = @At(value = "HEAD"), cancellable = true) - private static void onSetLightningVertex(Matrix4fc pose, VertexConsumer buffer, float xo0, float zo0, int h, float xo1, float zo1, float boltRed, float boltGreen, float boltBlue, float rr1, float rr2, boolean px1, boolean pz1, boolean px2, boolean pz2, CallbackInfo ci) { + private static void onSetLightningVertex(Matrix4fc pose, VertexConsumer buffer, float segmentStartX, float segmentStartZ, float segmentEndX, float segmentEndZ, int currentSegment, float topRadius, float bottomRadius, boolean rightXPositive, boolean rightZPositive, boolean leftXPositive, boolean leftZPositive, CallbackInfo ci) { Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.changeLightningColor.get()) { Color color = ambience.lightningColor.get(); - buffer.addVertex(pose, xo0 + (px1 ? rr2 : -rr2), (float) (h * 16), zo0 + (pz1 ? rr2 : -rr2)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); - buffer.addVertex(pose, h + (px1 ? rr1 : -rr1), (float) ((h + 1) * 16), zo1 + (pz1 ? rr1 : -rr1)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); - buffer.addVertex(pose, h + (px2 ? rr1 : -rr1), (float) ((h + 1) * 16), zo1 + (pz2 ? rr1 : -rr1)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); - buffer.addVertex(pose, xo0 + (px2 ? rr2 : -rr2), (float) (h * 16), zo0 + (pz2 ? rr2 : -rr2)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); + buffer.addVertex(pose, segmentStartX + (rightXPositive ? bottomRadius : -bottomRadius), currentSegment * 16, segmentStartZ + (rightZPositive ? bottomRadius : -bottomRadius)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); + buffer.addVertex(pose, segmentEndX + (rightXPositive ? topRadius : -topRadius), (currentSegment + 1) * 16, segmentEndZ + (rightZPositive ? topRadius : -topRadius)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); + buffer.addVertex(pose, segmentEndX + (leftXPositive ? topRadius : -topRadius), (currentSegment + 1) * 16, segmentEndZ + (leftZPositive ? topRadius : -topRadius)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); + buffer.addVertex(pose, segmentStartX + (leftXPositive ? bottomRadius : -bottomRadius), currentSegment * 16, segmentStartZ + (leftZPositive ? bottomRadius : -bottomRadius)).setColor(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index 43b2d20b1a1..d36e5e411e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -8,6 +8,7 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.entity.DropItemsEvent; import meteordevelopment.meteorclient.events.entity.player.CanWalkOnFluidEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.HighJump; @@ -20,11 +21,13 @@ import meteordevelopment.meteorclient.systems.modules.render.NoRender; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; +import net.minecraft.util.Prediction; import net.minecraft.world.InteractionHand; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.material.FluidState; @@ -56,7 +59,7 @@ private void spawnItemParticles(ItemStack itemStack, int count, CallbackInfo ci) if (noRender.noEatParticles() && itemStack.getComponents().has(DataComponents.FOOD)) ci.cancel(); } - @ModifyVariable(method = "swing(Lnet/minecraft/world/InteractionHand;)V", at = @At("HEAD"), argsOnly = true, name = "hand") + @ModifyVariable(method = "swing", at = @At("HEAD"), argsOnly = true, name = "hand") private InteractionHand setHand(InteractionHand hand) { if ((Object) this != mc.player) return hand; @@ -69,13 +72,6 @@ private InteractionHand setHand(InteractionHand hand) { return hand; } - @ModifyExpressionValue(method = "getCurrentSwingDuration", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/component/SwingAnimation;duration()I")) - private int getHandSwingDuration(int original) { - if ((Object) this != mc.player) return original; - - return Modules.get().get(HandView.class).isActive() && mc.options.getCameraType().isFirstPerson() ? Modules.get().get(HandView.class).swingSpeed.get() : original; - } - @ModifyReturnValue(method = "isFallFlying", at = @At("RETURN")) private boolean isGlidingHook(boolean original) { if ((Object) this != mc.player) return original; @@ -138,4 +134,11 @@ private boolean modifyIsSprinting(boolean original) { // only add the extra velocity if you're actually moving, otherwise you'll jump in place and move forward return original && (Math.abs(mc.player.zza) > 1.0E-5F || Math.abs(mc.player.xxa) > 1.0E-5F); } + + @Inject(method = "drop", at = @At("HEAD"), cancellable = true) + private void onDropItem(ItemStack itemStack, boolean thrownFromHand, Prediction prediction, CallbackInfoReturnable cir) { + if (level().isClientSide() && !itemStack.isEmpty()) { + if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(itemStack)).isCancelled()) cir.setReturnValue(null); + } + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index 60a6236b70c..426f1997e92 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -20,11 +20,10 @@ import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; -import net.minecraft.client.renderer.feature.ModelFeatureRenderer; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.rendertype.RenderTypes; import net.minecraft.client.renderer.state.level.CameraRenderState; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.UvMapping; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -66,13 +65,13 @@ private PlayerTeam hasLabelClientPlayerEntityGetScoreboardTeamProxy(PlayerTeam t // Chams - player color - @WrapWithCondition(method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IIILnet/minecraft/client/renderer/texture/TextureAtlasSprite;ILnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;)V")) - private boolean render$render(SubmitNodeCollector instance, Model model, TState state, PoseStack matrixStack, RenderType renderLayer, int light, int overlay, int mixColor, TextureAtlasSprite sprite, int outlineColor, ModelFeatureRenderer.CrumblingOverlay crumblingOverlayCommand) { + @WrapWithCondition(method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IIILnet/minecraft/client/renderer/texture/UvMapping;I)V")) + private boolean render$render(SubmitNodeCollector instance, Model model, TState state, PoseStack poseStack, RenderType renderType, int lightCoords, int overlayCoords, int tintedColor, UvMapping uvMapping, int outlineColor) { if (!chams.isActive() || !chams.players.get() || !(((IEntityRenderState) state).meteor$getEntity() instanceof Player player)) return true; if (chams.ignoreSelf.get() && player == mc.player) return true; - instance.submitModel(model, state, matrixStack, renderLayer, light, overlay, PlayerUtils.getPlayerColor(player, chams.playersColor.get()).getPacked(), sprite, outlineColor, null); + instance.submitModel(model, state, poseStack, renderType, lightCoords, overlayCoords, PlayerUtils.getPlayerColor(player, chams.playersColor.get()).getPacked(), uvMapping, outlineColor); return false; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java new file mode 100644 index 00000000000..755d24f0aad --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java @@ -0,0 +1,26 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.HandView; +import net.minecraft.world.entity.LivingEntity; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(LivingEntity.SwingState.class) +public class LivingEntitySwingStateMixin { + @ModifyExpressionValue(method = "getAnimation", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/LivingEntity$SwingState;animation:F", opcode = Opcodes.GETFIELD)) + private float getHandSwingDuration(float original) { + if ((Object) this != mc.player) return original; + + return Modules.get().get(HandView.class).isActive() && mc.options.getCameraType().isFirstPerson() ? Modules.get().get(HandView.class).swingSpeed.get().floatValue() : original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java index 3ab6e67eeaf..0ccb0017be8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java @@ -19,6 +19,7 @@ import meteordevelopment.meteorclient.systems.modules.player.LiquidInteract; import meteordevelopment.meteorclient.systems.modules.player.NoMiningTrace; import meteordevelopment.meteorclient.systems.modules.player.Portals; +import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.multiplayer.ClientLevel; @@ -28,6 +29,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PlayerRideableJumping; import net.minecraft.world.entity.player.Input; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import org.objectweb.asm.Opcodes; @@ -48,9 +51,9 @@ public LocalPlayerMixin(ClientLevel world, GameProfile profile) { } @Inject(method = "drop", at = @At("HEAD"), cancellable = true) - private void onDrop(boolean all, CallbackInfoReturnable cir) { + private void onDrop(boolean all, CallbackInfo ci) { if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(getMainHandItem())).isCancelled()) - cir.setReturnValue(false); + ci.cancel(); } @ModifyExpressionValue(method = "handlePortalTransitionEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;screen()Lnet/minecraft/client/gui/screens/Screen;", ordinal = 0)) @@ -86,7 +89,7 @@ private void onMoveTowardsClosestSpace(double x, double z, CallbackInfo ci) { } } - @ModifyExpressionValue(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/client/player/ClientInput;keyPresses:Lnet/minecraft/world/entity/player/Input;", opcode = Opcodes.GETFIELD)) + @ModifyExpressionValue(method = "sendChanges", at = @At(value = "FIELD", target = "Lnet/minecraft/client/player/ClientInput;keyPresses:Lnet/minecraft/world/entity/player/Input;", opcode = Opcodes.GETFIELD)) private Input isSneaking(Input original) { if (Modules.get().get(Sneak.class).doPacket() || Modules.get().get(NoSlow.class).airStrict()) { return new Input( @@ -132,13 +135,20 @@ private static HitResult onUpdateTargetedEntity(HitResult original, @Local(name } @ModifyExpressionValue(method = "pick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;pick(DFZ)Lnet/minecraft/world/phys/HitResult;")) - private static HitResult modifyPick(HitResult original, @Local(argsOnly = true, name = "cameraEntity") Entity cameraEntity, @Local(argsOnly = true, name = "partialTicks") float partialTicks, @Local(name = "maxDistance") double maxDistance) { + private static HitResult modifyPick(HitResult original, final Entity cameraEntity, final double blockInteractionRange, final double entityInteractionRange, final float partialTicks, @Local(name = "maxDistance") double maxDistance) { if (!Modules.get().isActive(LiquidInteract.class)) return original; if (original.getType() != HitResult.Type.MISS) return original; return cameraEntity.pick(maxDistance, partialTicks, true); } + @Inject(method = "displayItemActivation", at = @At("HEAD"), cancellable = true) + private void onDisplayItemActivation(ItemStack itemStack, CallbackInfo ci) { + if (itemStack.getItem() == Items.TOTEM_OF_UNDYING && Modules.get().get(NoRender.class).noTotemAnimation()) { + ci.cancel(); + } + } + // Sprint @ModifyExpressionValue(method = "canStartSprinting", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;hasForwardImpulse()Z")) @@ -172,7 +182,7 @@ private void onSendPositionHead(CallbackInfo ci) { MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Pre.get()); } - @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientPacketListener;send(Lnet/minecraft/network/protocol/Packet;)V", ordinal = 1)) + @Inject(method = "sendChanges", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientPacketListener;send(Lnet/minecraft/network/protocol/Packet;)V", ordinal = 1)) private void onTickHasVehicleBeforeSendPackets(CallbackInfo ci) { MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Pre.get()); } @@ -182,7 +192,7 @@ private void onSendPositionTail(CallbackInfo ci) { MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Post.get()); } - @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientPacketListener;send(Lnet/minecraft/network/protocol/Packet;)V", ordinal = 1, shift = At.Shift.AFTER)) + @Inject(method = "sendChanges", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientPacketListener;send(Lnet/minecraft/network/protocol/Packet;)V", ordinal = 1, shift = At.Shift.AFTER)) private void onTickHasVehicleAfterSendPackets(CallbackInfo ci) { MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Post.get()); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftAccessor.java index 95a5a4b644e..09f062893f7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftAccessor.java @@ -6,12 +6,12 @@ package meteordevelopment.meteorclient.mixin; import com.mojang.authlib.minecraft.UserApiService; -import com.mojang.authlib.yggdrasil.ProfileResult; +import com.mojang.authlib.services.ProfileResult; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.social.PlayerSocialManager; import net.minecraft.client.ResourceLoadStateTracker; -import net.minecraft.client.multiplayer.ProfileKeyPairManager; import net.minecraft.client.User; +import net.minecraft.client.gui.screens.social.PlayerSocialManager; +import net.minecraft.client.multiplayer.ProfileKeyPairManager; import net.minecraft.client.multiplayer.chat.report.ReportingContext; import net.minecraft.client.resources.SkinManager; import net.minecraft.server.Services; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftMixin.java index bc52a0ca002..30ca66bafe6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftMixin.java @@ -292,6 +292,8 @@ private void afterHandleInputEvents(CallbackInfo ci) { // Freecam @Inject(method = "pick", at = @At("HEAD"), cancellable = true) private void updateTargetedEntityInvoke(float partialTicks, CallbackInfo ci) { + if (Modules.get() == null) return; + Freecam freecam = Modules.get().get(Freecam.class); boolean highwayBuilder = Modules.get().isActive(HighwayBuilder.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ModelBlockRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ModelBlockRendererMixin.java index e0af487d2c2..01c3587fb1d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ModelBlockRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ModelBlockRendererMixin.java @@ -72,8 +72,10 @@ public abstract class ModelBlockRendererMixin { materialInfo.sprite(), ChunkSectionLayer.TRANSLUCENT, materialInfo.itemRenderType(), + materialInfo.itemGlintRenderType(), + materialInfo.itemGlintSpecialRenderType(), materialInfo.tintIndex(), - materialInfo.shade(), + materialInfo.shadeDirectionOverride(), materialInfo.lightEmission() ); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MouseHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MouseHandlerMixin.java index 12c36a8ccfa..c349cdd6791 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MouseHandlerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MouseHandlerMixin.java @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static org.lwjgl.glfw.GLFW.GLFW_RELEASE; +import static com.mojang.blaze3d.platform.InputConstants.RELEASE; @Mixin(MouseHandler.class) public abstract class MouseHandlerMixin { @@ -38,7 +38,7 @@ public abstract class MouseHandlerMixin { @Inject(method = "onButton", at = @At("HEAD"), cancellable = true) private void onMouseButton(long handle, MouseButtonInfo rawButtonInfo, int action, CallbackInfo ci) { - Input.setButtonState(rawButtonInfo.button(), action != GLFW_RELEASE); + Input.setButtonState(rawButtonInfo.button(), action != RELEASE); MouseButtonEvent click = new MouseButtonEvent(getScaledXPos(minecraft.getWindow()), getScaledYPos(minecraft.getWindow()), rawButtonInfo); if (MeteorClient.EVENT_BUS.post(MouseClickEvent.get(click, KeyAction.get(action))).isCancelled()) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java new file mode 100644 index 00000000000..5876c6dfabb --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java @@ -0,0 +1,20 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.mojang.blaze3d.pipeline.PipelineCache; +import com.mojang.renderpearl.api.pipeline.CompiledRenderPipeline; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(PipelineCache.class) +public interface PipelineCacheAccessor { + @Accessor("cache") + Map getCache(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMixin.java index bd239ef916d..8ac78b5cb0c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMixin.java @@ -8,7 +8,6 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.entity.DropItemsEvent; import meteordevelopment.meteorclient.events.entity.player.ClipAtLedgeEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.Flight; @@ -20,10 +19,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Abilities; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; @@ -53,13 +50,6 @@ protected void clipAtLedge(CallbackInfoReturnable cir) { if (event.isSet()) cir.setReturnValue(event.isClip()); } - @Inject(method = "drop", at = @At("HEAD"), cancellable = true) - private void onDropItem(ItemStack itemStack, boolean thrownFromHand, CallbackInfoReturnable cir) { - if (level().isClientSide() && !itemStack.isEmpty()) { - if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(itemStack)).isCancelled()) cir.setReturnValue(null); - } - } - @Inject(method = "isSpectator", at = @At("HEAD"), cancellable = true) private void onIsSpectator(CallbackInfoReturnable cir) { if (mc.getConnection() == null) cir.setReturnValue(false); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java index 41cf9b0c892..9f018acd1d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java @@ -18,7 +18,7 @@ @Mixin(ProjectileUtil.class) public abstract class ProjectileUtilMixin { @ModifyExpressionValue( - method = "getManyEntityHitResult(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;FLnet/minecraft/world/level/ClipContext$Block;Z)Ljava/util/Collection;", + method = "getManyEntityHitResult(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/Vec3;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;FLnet/minecraft/world/level/ClipContext$Block;ZZ)Ljava/util/Collection;", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;getBoundingBox()Lnet/minecraft/world/phys/AABB;") ) private static AABB modifyHitboxMargin(AABB original, @Local(name = "entity") Entity entity) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RenderPipelineMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderPipelineMixin.java index 577229067bd..cb5735401d9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RenderPipelineMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RenderPipelineMixin.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.mixin; -import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; import meteordevelopment.meteorclient.mixininterface.IRenderPipeline; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenEffectRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenEffectRendererMixin.java index 13596ea5a3a..e5ad6c9f532 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenEffectRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenEffectRendererMixin.java @@ -8,10 +8,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ScreenEffectRenderer; import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.state.level.PlayerRenderState; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -25,12 +26,12 @@ private static void onRenderFireOverlay(PoseStack poseStack, SubmitNodeCollector } @Inject(method = "submitWater", at = @At("HEAD"), cancellable = true) - private static void onRenderUnderwaterOverlay(Minecraft minecraft, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CallbackInfo ci) { + private static void onRenderUnderwaterOverlay(PlayerRenderState.WaterOverlay waterOverlay, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noLiquidOverlay()) ci.cancel(); } @Inject(method = "submitBlockSprite", at = @At("HEAD"), cancellable = true) - private static void render(TextureAtlasSprite sprite, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int color, CallbackInfo ci) { + private static void render(Identifier atlasLocation, float u0, float v0, float u1, float v1, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int color, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noInWallOverlay()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java index 2b359b9a994..dd8385b0d85 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -27,14 +27,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import static org.lwjgl.glfw.GLFW.*; +import static com.mojang.blaze3d.platform.InputConstants.*; @Mixin(value = Screen.class, priority = 500) // needs to be before baritone public abstract class ScreenMixin { @Unique private static boolean meteor$isArray(int key) { - return key == GLFW_KEY_RIGHT || key == GLFW_KEY_LEFT || key == GLFW_KEY_DOWN || key == GLFW_KEY_UP; + return key == KEY_RIGHT || key == KEY_LEFT || key == KEY_DOWN || key == KEY_UP; } @Inject(method = "extractTransparentBackground", at = @At("HEAD"), cancellable = true) @@ -63,7 +63,7 @@ private static void onDefaultHandleClickEvent(ClickEvent event, Minecraft minecr private void onKeyPressed(KeyEvent event, CallbackInfoReturnable cir) { if ((Object) (this) instanceof ChatScreen) return; GUIMove guiMove = Modules.get().get(GUIMove.class); - if ((guiMove.disableArrows() && meteor$isArray(event.key())) || (guiMove.disableSpace() && event.key() == GLFW_KEY_SPACE)) { + if ((guiMove.disableArrows() && meteor$isArray(event.key())) || (guiMove.disableSpace() && event.key() == KEY_SPACE)) { cir.setReturnValue(true); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java index bad493d0d5f..d553a829a64 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java @@ -5,6 +5,8 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.pipeline.PipelineCache; import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines; import net.minecraft.client.renderer.ShaderManager; import org.spongepowered.asm.mixin.Mixin; @@ -14,8 +16,8 @@ @Mixin(ShaderManager.class) public abstract class ShaderManagerMixin { - @Inject(method = "apply(Lnet/minecraft/client/renderer/ShaderManager$Configs;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", at = @At("TAIL")) - private void meteor$reloadPipelines(CallbackInfo ci) { - MeteorRenderPipelines.precompile(); + @Inject(method = "apply(Lnet/minecraft/client/renderer/ShaderManager$Configs;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ShaderManager$CompilationCache;close()V")) + private void meteor$reloadPipelines(CallbackInfo ci, @Local PipelineCache pipelineCache) { + MeteorRenderPipelines.precompile(pipelineCache); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java index fea23d26c49..608d61f418d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java @@ -7,12 +7,12 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Ambience; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.DynamicUniforms; +import net.minecraft.client.renderer.DynamicGpuData; import net.minecraft.client.renderer.SkyRenderer; import net.minecraft.client.renderer.state.level.SkyRenderState; import net.minecraft.world.level.dimension.DimensionType; @@ -33,8 +33,8 @@ private void updateRenderState(ClientLevel level, float partialTicks, Camera cam if (ambience.customSkyColor.get()) state.skyColor = ambience.skyColor().getPacked(); } - @WrapOperation(method = "renderEndSky", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/DynamicUniforms;writeTransform(Lorg/joml/Matrix4f;)Lcom/mojang/blaze3d/buffers/GpuBufferSlice;")) - private GpuBufferSlice modifyEndSkyColor(DynamicUniforms instance, Matrix4f modelView, Operation original) { + @WrapOperation(method = "renderEndSky", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/DynamicGpuData;writeTransform(Lorg/joml/Matrix4f;)Lcom/mojang/renderpearl/api/buffers/GpuBufferSlice;")) + private GpuBufferSlice modifyEndSkyColor(DynamicGpuData instance, Matrix4f modelView, Operation original) { Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.endSky.get() && ambience.customSkyColor.get()) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java index 09f5e976df6..cd9c564b464 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.player.TitleScreenCredits; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -12,7 +13,6 @@ import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.network.chat.Component; -import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -32,7 +32,7 @@ private void onExtractRenderState(GuiGraphicsExtractor graphics, int mouseX, int @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) private void onMouseClicked(MouseButtonEvent event, boolean doubleClick, CallbackInfoReturnable cir) { - if (Config.get().titleScreenCredits.get() && event.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) { + if (Config.get().titleScreenCredits.get() && event.button() == InputConstants.MOUSE_BUTTON_LEFT) { if (TitleScreenCredits.onClicked(event.x(), event.y())) cir.setReturnValue(true); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/VulkanDeviceMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/VulkanDeviceMixin.java index 8fb1ea0bc85..4453bdaa672 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/VulkanDeviceMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/VulkanDeviceMixin.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.mixin; -import com.mojang.blaze3d.systems.RenderPassBackend; -import com.mojang.blaze3d.vulkan.VulkanDevice; +import com.mojang.renderpearl.backend.api.RenderPassBackend; +import com.mojang.renderpearl.backend.vulkan.VulkanDevice; import meteordevelopment.meteorclient.mixininterface.IGpuDevice; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java index e57513a46cc..f43ef6a0e5d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java @@ -1,36 +1,37 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixin.sodium; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.blaze3d.vertex.VertexFormatElement; -import meteordevelopment.meteorclient.utils.render.MeshBuilderVertexConsumerProvider; -import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; -import org.lwjgl.system.MemoryStack; -import org.lwjgl.system.MemoryUtil; -import org.spongepowered.asm.mixin.Mixin; - -@Mixin(value = MeshBuilderVertexConsumerProvider.MeshBuilderVertexConsumer.class, remap = false) -public abstract class MeshVertexConsumerMixin implements VertexConsumer, VertexBufferWriter { - @Override - public void push(MemoryStack stack, long ptr, int count, VertexFormat format) { - VertexFormatElement positionElement = format.getElement(DefaultVertexFormat.POSITION_SEMANTIC_NAME); - if (positionElement == null) return; - int positionOffset = positionElement.offset(); - - for (int i = 0; i < count; i++) { - long positionPtr = ptr + (long) format.getVertexSize() * i + positionOffset; - - float x = MemoryUtil.memGetFloat(positionPtr); - float y = MemoryUtil.memGetFloat(positionPtr + 4); - float z = MemoryUtil.memGetFloat(positionPtr + 8); - - addVertex(x, y, z); - } - } -} +///* +// * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). +// * Copyright (c) Meteor Development. +// */ +// +//package meteordevelopment.meteorclient.mixin.sodium; +// fixme this class will probably work when sodium updates +// they are using VertexFormat from blaze3d while now it has been moved to renderpearl +//import com.mojang.blaze3d.vertex.DefaultVertexFormat; +//import com.mojang.blaze3d.vertex.VertexConsumer; +//import com.mojang.renderpearl.api.vertex.VertexFormat; +//import com.mojang.renderpearl.api.vertex.VertexFormatElement; +//import meteordevelopment.meteorclient.utils.render.MeshBuilderVertexConsumerProvider; +//import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; +//import org.lwjgl.system.MemoryStack; +//import org.lwjgl.system.MemoryUtil; +//import org.spongepowered.asm.mixin.Mixin; +// +//@Mixin(value = MeshBuilderVertexConsumerProvider.MeshBuilderVertexConsumer.class, remap = false) +//public abstract class MeshVertexConsumerMixin implements VertexConsumer, VertexBufferWriter { +// @Override +// public void push(MemoryStack stack, long ptr, int count, VertexFormat format) { +// VertexFormatElement positionElement = format.getElement(DefaultVertexFormat.POSITION_SEMANTIC_NAME); +// if (positionElement == null) return; +// int positionOffset = positionElement.offset(); +// +// for (int i = 0; i < count; i++) { +// long positionPtr = ptr + (long) format.getVertexSize() * i + positionOffset; +// +// float x = MemoryUtil.memGetFloat(positionPtr); +// float y = MemoryUtil.memGetFloat(positionPtr + 4); +// float z = MemoryUtil.memGetFloat(positionPtr + 8); +// +// addVertex(x, y, z); +// } +// } +//} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IGpuDevice.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IGpuDevice.java index cdb967a2756..32841474cdd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IGpuDevice.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IGpuDevice.java @@ -5,7 +5,8 @@ package meteordevelopment.meteorclient.mixininterface; -import com.mojang.blaze3d.systems.RenderPassBackend; + +import com.mojang.renderpearl.backend.api.RenderPassBackend; public interface IGpuDevice { /** diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/ExtendedRenderPipelineBuilder.java b/src/main/java/meteordevelopment/meteorclient/renderer/ExtendedRenderPipelineBuilder.java index 86fa6d99624..493bb3ddba2 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/ExtendedRenderPipelineBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/ExtendedRenderPipelineBuilder.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; import meteordevelopment.meteorclient.mixininterface.IRenderPipeline; import org.jspecify.annotations.NonNull; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java b/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java index 9c92355ca07..8b763dfa507 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java @@ -5,11 +5,11 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.buffers.GpuBuffer; -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.renderer.DynamicUniformStorage; +import com.mojang.renderpearl.api.buffers.GpuBuffer; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; +import com.mojang.renderpearl.api.device.GpuDevice; +import net.minecraft.client.renderer.DynamicGpuDataStorage; import net.minecraft.client.renderer.MappableRingBuffer; import net.minecraft.util.Mth; @@ -19,9 +19,9 @@ * UBO storage with a constant size. Exceeding this size causes an {@link IndexOutOfBoundsException} to be thrown. * * @author Crosby - * @see DynamicUniformStorage + * @see DynamicGpuDataStorage */ -public class FixedUniformStorage { +public class FixedUniformStorage { private final MappableRingBuffer buffer; private final int blockSize; private final int capacity; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java index d0f488b5f45..79a0a1291ee 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.PrimitiveTopology; -import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.renderpearl.api.buffers.GpuBuffer; +import com.mojang.renderpearl.api.pipeline.PrimitiveTopology; import meteordevelopment.meteorclient.utils.PreInit; public class FullScreenRenderer { diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java index 8aa14bf874f..5a2d743794c 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.IndexType; -import com.mojang.blaze3d.buffers.GpuBuffer; -import com.mojang.blaze3d.PrimitiveTopology; -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.renderpearl.api.buffers.GpuBuffer; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; +import com.mojang.renderpearl.api.commands.CommandEncoder; +import com.mojang.renderpearl.api.pipeline.IndexType; +import com.mojang.renderpearl.api.pipeline.PrimitiveTopology; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.vertex.VertexFormat; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.fabricmc.loader.api.FabricLoader; @@ -30,7 +30,6 @@ public class MeshBuilder { public double alpha = 1; - private final VertexFormat format; private final int primitiveVerticesSize; private final int primitiveIndicesCount; @@ -57,7 +56,6 @@ public MeshBuilder(RenderPipeline pipeline) { } public MeshBuilder(VertexFormat format, PrimitiveTopology drawMode) { - this.format = format; primitiveVerticesSize = format.getVertexSize(); primitiveIndicesCount = drawMode.primitiveLength; } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java index cae0732a1f8..e91491b225d 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.IndexType; -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.systems.CommandEncoder; -import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.GpuSampler; -import com.mojang.blaze3d.textures.GpuTextureView; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; +import com.mojang.renderpearl.api.commands.CommandEncoder; +import com.mojang.renderpearl.api.commands.RenderPass; +import com.mojang.renderpearl.api.pipeline.IndexType; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.textures.GpuSampler; +import com.mojang.renderpearl.api.textures.GpuTextureView; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.RenderUtils; @@ -145,7 +145,6 @@ public void end() { int indexCount = mesh != null ? mesh.getIndicesCount() : (int) (indexBuffer != null ? indexBuffer.length() / indexType.bytes : -1); - // todo hope this is alright @minegame take a look please (lossy conversion from long to int) if (indexCount > 0) { @@ -176,16 +175,16 @@ public void end() { encoder.createRenderPass(() -> "Meteor MeshRenderer", colorAttachment, clearColor, depthAttachment, OptionalDouble.empty()) : encoder.createRenderPass(() -> "Meteor MeshRenderer", colorAttachment, clearColor)) { - pass.setPipeline(pipeline); + pass.setPipeline(RenderSystem.getCompiledPipeline(pipeline)); pass.setUniform("MeshData", meshData); for (var entry : uniforms.entrySet()) { pass.setUniform(entry.getKey(), entry.getValue()); } - for (var entry : samplers.entrySet()) { - pass.bindTexture(entry.getKey(), entry.getValue().textureView, entry.getValue().sampler); - } +// for (var entry : samplers.entrySet()) { +// pass.bindTexture(entry.getKey(), entry.getValue().textureView, entry.getValue().sampler); +// } pass.setVertexBuffer(0, vertexBuffer); pass.setIndexBuffer(indexBuffer.buffer(), indexType); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java index 780583c6945..a910f1faac3 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java @@ -5,10 +5,11 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; -import net.minecraft.client.renderer.DynamicUniformStorage; +import com.mojang.renderpearl.api.buffers.GpuBuffer; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; +import net.minecraft.client.renderer.DynamicGpuDataStorage; import org.joml.Matrix4f; import org.jspecify.annotations.NonNull; @@ -22,7 +23,7 @@ public class MeshUniforms { private static final Data DATA = new Data(); - private static final DynamicUniformStorage STORAGE = new DynamicUniformStorage<>("Meteor - Mesh UBO", SIZE, 16); + private static final DynamicGpuDataStorage STORAGE = new DynamicGpuDataStorage<>("Meteor - Mesh UBO", SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { STORAGE.endFrame(); @@ -32,10 +33,10 @@ public static GpuBufferSlice write(Matrix4f proj, Matrix4f modelView) { DATA.proj = proj; DATA.modelView = modelView; - return STORAGE.writeUniform(DATA); + return STORAGE.writeData(DATA); } - private static final class Data implements DynamicUniformStorage.DynamicUniform { + private static final class Data implements DynamicGpuDataStorage.DynamicGpuData { private Matrix4f proj; private Matrix4f modelView; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java index 639a8dd5c11..5248cce5954 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java @@ -5,18 +5,13 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.pipeline.BindGroupLayout; -import com.mojang.blaze3d.pipeline.BlendFunction; -import com.mojang.blaze3d.PrimitiveTopology; -import com.mojang.blaze3d.pipeline.ColorTargetState; -import com.mojang.blaze3d.pipeline.DepthStencilState; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.CompareOp; -import com.mojang.blaze3d.shaders.UniformType; -import com.mojang.blaze3d.systems.GpuDevice; +import com.mojang.blaze3d.pipeline.PipelineCache; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.renderpearl.api.device.GpuDevice; +import com.mojang.renderpearl.api.pipeline.*; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.mixin.PipelineCacheAccessor; import net.minecraft.client.Minecraft; import net.minecraft.server.packs.resources.ResourceManager; import org.apache.commons.io.IOUtils; @@ -116,7 +111,7 @@ public abstract class MeteorRenderPipelines { .withVertexBinding(0, MeteorVertexFormats.POS2_TEXTURE_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_tex_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_tex_color.frag")) - .withBindGroupLayout(BindGroupLayout.builder().withSampler("u_Texture").build()) + .withBindGroupLayout(BindGroupLayout.builder()/*.withSampler("u_Texture")*/.build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -128,7 +123,7 @@ public abstract class MeteorRenderPipelines { .withVertexBinding(0, MeteorVertexFormats.POS2_TEXTURE_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/text.vert")) .withFragmentShader(MeteorClient.identifier("shaders/text.frag")) - .withBindGroupLayout(BindGroupLayout.builder().withSampler("u_Texture").build()) + .withBindGroupLayout(BindGroupLayout.builder()/*.withSampler("u_Texture")*/.build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -143,7 +138,7 @@ public abstract class MeteorRenderPipelines { .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vert")) .withFragmentShader(MeteorClient.identifier("shaders/post-process/outline.frag")) .withBindGroupLayout(BindGroupLayout.builder() - .withSampler("u_Texture") + /*.withSampler("u_Texture")*/ .withUniform("PostData", UniformType.UNIFORM_BUFFER) .withUniform("OutlineData", UniformType.UNIFORM_BUFFER) .build()) @@ -159,8 +154,8 @@ public abstract class MeteorRenderPipelines { .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vert")) .withFragmentShader(MeteorClient.identifier("shaders/post-process/image.frag")) .withBindGroupLayout(BindGroupLayout.builder() - .withSampler("u_Texture") - .withSampler("u_TextureI") + /*.withSampler("u_Texture")*/ +// .withSampler("u_TextureI") .withUniform("PostData", UniformType.UNIFORM_BUFFER) .withUniform("ImageData", UniformType.UNIFORM_BUFFER) .build()) @@ -178,7 +173,7 @@ public abstract class MeteorRenderPipelines { .withVertexShader(MeteorClient.identifier("shaders/blur.vert")) .withFragmentShader(MeteorClient.identifier("shaders/blur_down.frag")) .withBindGroupLayout(BindGroupLayout.builder() - .withSampler("u_Texture") + /*.withSampler("u_Texture")*/ .withUniform("BlurData", UniformType.UNIFORM_BUFFER) .build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) @@ -193,7 +188,7 @@ public abstract class MeteorRenderPipelines { .withVertexShader(MeteorClient.identifier("shaders/blur.vert")) .withFragmentShader(MeteorClient.identifier("shaders/blur_up.frag")) .withBindGroupLayout(BindGroupLayout.builder() - .withSampler("u_Texture") + /*.withSampler("u_Texture")*/ .withUniform("BlurData", UniformType.UNIFORM_BUFFER) .build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) @@ -207,7 +202,7 @@ public abstract class MeteorRenderPipelines { .withVertexBinding(0, MeteorVertexFormats.POS2).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/passthrough.vert")) .withFragmentShader(MeteorClient.identifier("shaders/passthrough.frag")) - .withBindGroupLayout(BindGroupLayout.builder().withSampler("u_Texture").build()) + .withBindGroupLayout(BindGroupLayout.builder()/*.withSampler("u_Texture")*/.build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) @@ -219,12 +214,14 @@ private static RenderPipeline add(RenderPipeline pipeline) { return pipeline; } - public static void precompile() { + public static void precompile(PipelineCache cache) { + PipelineCacheAccessor pipelineAccessor = (PipelineCacheAccessor) cache; + GpuDevice device = RenderSystem.getDevice(); ResourceManager resources = Minecraft.getInstance().getResourceManager(); for (RenderPipeline pipeline : PIPELINES) { - device.precompilePipeline(pipeline, (identifier, _) -> { + CompiledRenderPipeline newPipeline = device.compilePipeline(pipeline, (identifier, _) -> { var resource = resources.getResource(identifier).get(); try (var in = resource.open()) { @@ -233,6 +230,8 @@ public static void precompile() { throw new RuntimeException(e); } }); + + pipelineAccessor.getCache().put(pipeline, newPipeline); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java index b1865d2d73f..48f7f91503f 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java @@ -5,8 +5,9 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.GpuFormat; -import com.mojang.blaze3d.vertex.VertexFormat; + +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.vertex.VertexFormat; public abstract class MeteorVertexFormats { // Step rate = 0 means per-vertex (not instanced) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java index ae11cd29e06..1889aa9ab22 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.textures.GpuSampler; -import com.mojang.blaze3d.textures.GpuTextureView; +import com.mojang.renderpearl.api.textures.GpuSampler; +import com.mojang.renderpearl.api.textures.GpuTextureView; import meteordevelopment.meteorclient.gui.renderer.packer.TextureRegion; import meteordevelopment.meteorclient.utils.PreInit; import meteordevelopment.meteorclient.utils.render.color.Color; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java index 2cf69e3ec9c..0ff77befc48 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.world.Dir; import net.minecraft.client.Minecraft; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java b/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java index a8a0326e658..42a193e31d1 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.renderer; -import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.platform.TextureUtil; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.AddressMode; -import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.textures.AddressMode; +import com.mojang.renderpearl.api.textures.FilterMode; import net.minecraft.client.renderer.texture.AbstractTexture; import org.jspecify.annotations.NonNull; import org.lwjgl.BufferUtils; diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java index dc13364ee4e..7697eea072a 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/Font.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.renderer.text; -import com.mojang.blaze3d.GpuFormat; -import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.textures.FilterMode; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import meteordevelopment.meteorclient.renderer.MeshBuilder; import meteordevelopment.meteorclient.renderer.Texture; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/FileSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/FileSetting.java index 8ac9478ad6b..c750c9c400c 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/FileSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/FileSetting.java @@ -6,17 +6,16 @@ package meteordevelopment.meteorclient.settings; import net.minecraft.nbt.CompoundTag; -import org.lwjgl.BufferUtils; -import org.lwjgl.PointerBuffer; -import org.lwjgl.system.MemoryUtil; +import org.lwjgl.sdl.SDL_DialogFileFilter; +import org.lwjgl.system.MemoryStack; import java.io.File; import java.util.function.Consumer; public class FileSetting extends Setting { - public final PointerBuffer filters; + public final SDL_DialogFileFilter.Buffer filters; - public FileSetting(String name, String description, File defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible, PointerBuffer filters) { + public FileSetting(String name, String description, File defaultValue, Consumer onChanged, Consumer> onModuleActivated, IVisible visible, SDL_DialogFileFilter.Buffer filters) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); this.filters = filters; @@ -52,21 +51,23 @@ protected File load(CompoundTag tag) { } public static class Builder extends SettingBuilder { - private PointerBuffer filter; + private SDL_DialogFileFilter.Buffer filter; public Builder() { super(null); } - public FileSetting.Builder filter(PointerBuffer filter) { + public FileSetting.Builder filter(SDL_DialogFileFilter.Buffer filter) { this.filter = filter; return this; } public FileSetting.Builder filter(String... filters) { - this.filter = BufferUtils.createPointerBuffer(filters.length); - for (String filter : filters) this.filter.put(MemoryUtil.memASCII(filter)); - this.filter.flip(); + MemoryStack stack = MemoryStack.stackPush(); + filter = SDL_DialogFileFilter.malloc(filters.length, stack); + for (int i = 0; i < filters.length; i++) { + filter.get(i).name(stack.UTF8("Filter " + i)).pattern(stack.UTF8(filters[i])); + } return this; } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java index 2f84997edc7..dfa3057a8bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.settings; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; @@ -14,7 +15,6 @@ import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.nbt.CompoundTag; -import org.lwjgl.glfw.GLFW; import java.util.function.Consumer; @@ -32,7 +32,7 @@ public KeybindSetting(String name, String description, Keybind defaultValue, Con @EventHandler(priority = EventPriority.HIGHEST) private void onKeyBinding(KeyInputEvent event) { if (widget == null) return; - if (event.action == KeyAction.Press && event.key() == GLFW.GLFW_KEY_ESCAPE && widget.onClear()) event.cancel(); + if (event.action == KeyAction.Press && event.key() == InputConstants.KEY_ESCAPE && widget.onClear()) event.cancel(); else if (event.action == KeyAction.Release && widget.onAction(true, event.key(), event.modifiers())) event.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index c6ae60c569d..9cb3136412b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -6,9 +6,9 @@ package meteordevelopment.meteorclient.systems.accounts; import com.mojang.authlib.minecraft.UserApiService; -import com.mojang.authlib.yggdrasil.FriendsService; -import com.mojang.authlib.yggdrasil.ServicesKeyType; -import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.mojang.authlib.services.FriendsService; +import com.mojang.authlib.services.MinecraftServicesDiscoveryService; +import com.mojang.authlib.services.ServicesKeyType; import meteordevelopment.meteorclient.mixin.FileCacheAccessor; import meteordevelopment.meteorclient.mixin.MinecraftAccessor; import meteordevelopment.meteorclient.mixin.SkinManagerAccessor; @@ -47,7 +47,7 @@ protected Account(AccountType type, String name) { public abstract boolean fetchInfo(); public boolean login() { - YggdrasilAuthenticationService authenticationService = new YggdrasilAuthenticationService(mc.getProxy()); + MinecraftServicesDiscoveryService authenticationService = MinecraftServicesDiscoveryService.create(mc.getProxy()); applyLoginEnvironment(authenticationService); return true; @@ -70,7 +70,7 @@ public static void setSession(User session) { MinecraftAccessor mca = (MinecraftAccessor) mc; mca.meteor$setUser(session); - YggdrasilAuthenticationService yggdrasilAuthenticationService = new YggdrasilAuthenticationService(mc.getProxy()); + MinecraftServicesDiscoveryService yggdrasilAuthenticationService = MinecraftServicesDiscoveryService.create(mc.getProxy()); UserApiService apiService = yggdrasilAuthenticationService.createUserApiService(session.getAccessToken()); FriendsService friendsService = yggdrasilAuthenticationService.createFriendsService(session.getAccessToken()); @@ -82,7 +82,7 @@ public static void setSession(User session) { mca.meteor$setProfileFuture(CompletableFuture.supplyAsync(() -> mc.services().sessionService().fetchProfile(mc.getUser().getProfileId(), true), Util.ioPool())); } - public static void applyLoginEnvironment(YggdrasilAuthenticationService authService) { + public static void applyLoginEnvironment(MinecraftServicesDiscoveryService authService) { MinecraftAccessor mca = (MinecraftAccessor) mc; SignatureValidator.from(authService.getServicesKeySet(), ServicesKeyType.PROFILE_KEY); SkinManager.TextureCache skinCache = ((SkinManagerAccessor) mc.getSkinManager()).meteor$getSkinTextures(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java index 85a0986d95e..23d60e33a41 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.systems.accounts.types; import com.mojang.authlib.Environment; -import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.mojang.authlib.services.MinecraftServicesDiscoveryService; import com.mojang.util.UndashedUuid; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.accounts.Account; @@ -23,8 +23,8 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class TheAlteningAccount extends Account implements TokenAccount { - private static final Environment ENVIRONMENT = new Environment("http://sessionserver.thealtening.com", "http://authserver.thealtening.com", "https://api.mojang.com", "The Altening"); - private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(mc.getProxy(), ENVIRONMENT); + private static final Environment ENVIRONMENT = new Environment("thealtening.com", "The Altening"); // todo figure this out + private static final MinecraftServicesDiscoveryService SERVICE = MinecraftServicesDiscoveryService.create(mc.getProxy(), true, ENVIRONMENT); private String token; private String accessToken; @@ -69,7 +69,7 @@ public boolean login() { } private AuthResponse authenticate() { - return Http.post(ENVIRONMENT.servicesHost() + "/authenticate") + return Http.post(ENVIRONMENT.discoveryUrl() + "/authenticate") // todo i will eat my sock if this actually works .bodyJson(new AuthRequest("MINECRAFT", token, "Meteor on Crack!", UUID.randomUUID().toString(), true)) .sendJson(AuthResponse.class); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java index 17672515be9..995a3b2bd1f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -33,7 +33,6 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BedItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.Enchantment; @@ -327,7 +326,7 @@ public void render(HudRenderer renderer) { if (itemStack.is(ItemTags.SWORDS) || itemStack.getItem() == Items.END_CRYSTAL || itemStack.getItem() == Items.RESPAWN_ANCHOR - || itemStack.getItem() instanceof BedItem) threat = true; + || itemStack.is(ItemTags.BEDS)) threat = true; } if (threat) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java index 5c2a353d116..b731eb87ff2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java @@ -38,13 +38,13 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; -import org.lwjgl.glfw.GLFW; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; +import static com.mojang.blaze3d.platform.InputConstants.*; import static meteordevelopment.meteorclient.MeteorClient.mc; public class KeyboardHud extends HudElement { @@ -260,7 +260,7 @@ private Color getKeyColor(Key key, SettingColor out) { @EventHandler(priority = EventPriority.HIGH) private void onKey(KeyInputEvent event) { for (Key key : keys) { - if (key.matches(event.input.key(), event.input.scancode(), true)) { + if (key.matches(event.input.key(), event.input.keycode(), true)) { key.update(event.action); } } @@ -277,15 +277,11 @@ private void onMouseClick(MouseClickEvent event) { public KeyboardHud() { super(INFO); - if (mc.options != null) - onPresetChanged(preset.get()); + onPresetChanged(preset.get()); MeteorClient.EVENT_BUS.subscribe(this); } private void onPresetChanged(Preset preset) { - if (mc.options == null) - return; - keys.clear(); double u = 35; // base key unit size double g = spacing.get() * 2; // gap between keys (spacing setting) @@ -332,117 +328,117 @@ private void buildAnsiLayout(LayoutContext l) { double row0 = l.uy(0), row1 = l.uy(1), row2 = l.uy(2), row3 = l.uy(3), row4 = l.uy(4), row5 = l.uy(5); // Row 0: ESC, F1-F12, Print/Scroll/Pause - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_ESCAPE), 0, row0)); + keys.add(l.key(Keybind.fromKey(KEY_ESCAPE), 0, row0)); for (int i = 0; i < 4; i++) - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_F1 + i), l.ux(2d + i), row0)); + keys.add(l.key(Keybind.fromKey(KEY_F1 + i), l.ux(2d + i), row0)); for (int i = 0; i < 4; i++) - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_F5 + i), l.ux(6.5 + i), row0)); + keys.add(l.key(Keybind.fromKey(KEY_F5 + i), l.ux(6.5 + i), row0)); for (int i = 0; i < 4; i++) - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_F9 + i), l.ux(11d + i), row0)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PRINT_SCREEN), l.ux(15.5), row0)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_SCROLL_LOCK), l.ux(16.5), row0)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PAUSE), l.ux(17.5), row0)); + keys.add(l.key(Keybind.fromKey(KEY_F9 + i), l.ux(11d + i), row0)); + keys.add(l.key(Keybind.fromKey(KEY_PRINTSCREEN), l.ux(15.5), row0)); + keys.add(l.key(Keybind.fromKey(KEY_SCROLLLOCK), l.ux(16.5), row0)); + keys.add(l.key(Keybind.fromKey(KEY_PAUSE), l.ux(17.5), row0)); // Row 1: ` 1-0 - = BS, Ins/Home/PgUp - int[] row1Keys = {GLFW.GLFW_KEY_GRAVE_ACCENT, GLFW.GLFW_KEY_1, GLFW.GLFW_KEY_2, GLFW.GLFW_KEY_3, GLFW.GLFW_KEY_4, GLFW.GLFW_KEY_5, GLFW.GLFW_KEY_6, GLFW.GLFW_KEY_7, GLFW.GLFW_KEY_8, GLFW.GLFW_KEY_9, GLFW.GLFW_KEY_0, GLFW.GLFW_KEY_MINUS, GLFW.GLFW_KEY_EQUAL}; + int[] row1Keys = {KEY_GRAVE, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUALS}; for (int i = 0; i < row1Keys.length; i++) keys.add(l.key(Keybind.fromKey(row1Keys[i]), l.ux(i), row1)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_BACKSPACE), l.ux(13), row1, KeyDimensions.BACKSPACE)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_INSERT), l.ux(15.5), row1)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_HOME), l.ux(16.5), row1)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PAGE_UP), l.ux(17.5), row1)); + keys.add(l.key(Keybind.fromKey(KEY_BACKSPACE), l.ux(13), row1, KeyDimensions.BACKSPACE)); + keys.add(l.key(Keybind.fromKey(KEY_INSERT), l.ux(15.5), row1)); + keys.add(l.key(Keybind.fromKey(KEY_HOME), l.ux(16.5), row1)); + keys.add(l.key(Keybind.fromKey(KEY_PAGEUP), l.ux(17.5), row1)); // Row 2: Tab QWERTY..., Del/End/PgDn - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_TAB), 0, row2, KeyDimensions.TAB)); - int[] row2Keys = {GLFW.GLFW_KEY_Q, GLFW.GLFW_KEY_W, GLFW.GLFW_KEY_E, GLFW.GLFW_KEY_R, GLFW.GLFW_KEY_T, GLFW.GLFW_KEY_Y, GLFW.GLFW_KEY_U, GLFW.GLFW_KEY_I, GLFW.GLFW_KEY_O, GLFW.GLFW_KEY_P, GLFW.GLFW_KEY_LEFT_BRACKET, GLFW.GLFW_KEY_RIGHT_BRACKET}; + keys.add(l.key(Keybind.fromKey(KEY_TAB), 0, row2, KeyDimensions.TAB)); + int[] row2Keys = {KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LBRACKET, KEY_RBRACKET}; double tabEnd = l.px(KeyDimensions.TAB) + l.keyGap; for (int i = 0; i < row2Keys.length; i++) keys.add(l.key(Keybind.fromKey(row2Keys[i]), tabEnd + l.ux(i), row2)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_BACKSLASH), tabEnd + l.ux(12), row2, KeyDimensions.TAB)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_DELETE), l.ux(15.5), row2)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_END), l.ux(16.5), row2)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PAGE_DOWN), l.ux(17.5), row2)); + keys.add(l.key(Keybind.fromKey(KEY_BACKSLASH), tabEnd + l.ux(12), row2, KeyDimensions.TAB)); + keys.add(l.key(Keybind.fromKey(KEY_DELETE), l.ux(15.5), row2)); + keys.add(l.key(Keybind.fromKey(KEY_END), l.ux(16.5), row2)); + keys.add(l.key(Keybind.fromKey(KEY_PAGEDOWN), l.ux(17.5), row2)); // Row 3: Caps ASDF..., Enter - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_CAPS_LOCK), 0, row3, KeyDimensions.CAPS_LOCK)); - int[] row3Keys = {GLFW.GLFW_KEY_A, GLFW.GLFW_KEY_S, GLFW.GLFW_KEY_D, GLFW.GLFW_KEY_F, GLFW.GLFW_KEY_G, GLFW.GLFW_KEY_H, GLFW.GLFW_KEY_J, GLFW.GLFW_KEY_K, GLFW.GLFW_KEY_L, GLFW.GLFW_KEY_SEMICOLON, GLFW.GLFW_KEY_APOSTROPHE}; + keys.add(l.key(Keybind.fromKey(KEY_CAPSLOCK), 0, row3, KeyDimensions.CAPS_LOCK)); + int[] row3Keys = {KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, KEY_APOSTROPHE}; double capsEnd = l.px(KeyDimensions.CAPS_LOCK) + l.keyGap; for (int i = 0; i < row3Keys.length; i++) keys.add(l.key(Keybind.fromKey(row3Keys[i]), capsEnd + l.ux(i), row3)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_ENTER), capsEnd + l.ux(11), row3, KeyDimensions.ENTER_ANSI)); + keys.add(l.key(Keybind.fromKey(KEY_RETURN), capsEnd + l.ux(11), row3, KeyDimensions.ENTER_ANSI)); // Row 4: LShift ZXCV..., RShift, Up - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_SHIFT), 0, row4, KeyDimensions.LEFT_SHIFT_ANSI)); - int[] row4Keys = {GLFW.GLFW_KEY_Z, GLFW.GLFW_KEY_X, GLFW.GLFW_KEY_C, GLFW.GLFW_KEY_V, GLFW.GLFW_KEY_B, GLFW.GLFW_KEY_N, GLFW.GLFW_KEY_M, GLFW.GLFW_KEY_COMMA, GLFW.GLFW_KEY_PERIOD, GLFW.GLFW_KEY_SLASH}; + keys.add(l.key(Keybind.fromKey(KEY_LSHIFT), 0, row4, KeyDimensions.LEFT_SHIFT_ANSI)); + int[] row4Keys = {KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_SLASH}; double lShiftEnd = l.px(KeyDimensions.LEFT_SHIFT_ANSI) + l.keyGap; for (int i = 0; i < row4Keys.length; i++) keys.add(l.key(Keybind.fromKey(row4Keys[i]), lShiftEnd + l.ux(i), row4)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_SHIFT), lShiftEnd + l.ux(10), row4, KeyDimensions.RIGHT_SHIFT)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_UP), l.ux(16.5), row4)); + keys.add(l.key(Keybind.fromKey(KEY_RSHIFT), lShiftEnd + l.ux(10), row4, KeyDimensions.RIGHT_SHIFT)); + keys.add(l.key(Keybind.fromKey(KEY_UP), l.ux(16.5), row4)); // Row 5: Ctrl/Win/Alt/Space/Alt/Win/Menu/Ctrl, Arrows double xPos = 0; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_CONTROL), xPos, row5, KeyDimensions.CTRL)); + keys.add(l.key(Keybind.fromKey(KEY_LCONTROL), xPos, row5, KeyDimensions.CTRL)); xPos += l.px(KeyDimensions.CTRL) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_SUPER), xPos, row5, KeyDimensions.GUI)); - xPos += l.px(KeyDimensions.GUI) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_ALT), xPos, row5, KeyDimensions.ALT)); +// keys.add(l.key(Keybind.fromKey(KEY_LSUPER), xPos, row5, KeyDimensions.GUI)); +// xPos += l.px(KeyDimensions.GUI) + l.keyGap; + keys.add(l.key(Keybind.fromKey(KEY_LALT), xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_SPACE), xPos, row5, KeyDimensions.SPACEBAR)); + keys.add(l.key(Keybind.fromKey(KEY_SPACE), xPos, row5, KeyDimensions.SPACEBAR)); xPos += l.px(KeyDimensions.SPACEBAR) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_ALT), xPos, row5, KeyDimensions.ALT)); + keys.add(l.key(Keybind.fromKey(KEY_RALT), xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_SUPER), xPos, row5, KeyDimensions.GUI)); - xPos += l.px(KeyDimensions.GUI) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_MENU), xPos, row5, KeyDimensions.MENU)); - xPos += l.px(KeyDimensions.MENU) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_CONTROL), xPos, row5, KeyDimensions.CTRL)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT), l.ux(15.5), row5)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_DOWN), l.ux(16.5), row5)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT), l.ux(17.5), row5)); +// keys.add(l.key(Keybind.fromKey(KEY_RSUPER), xPos, row5, KeyDimensions.GUI)); +// xPos += l.px(KeyDimensions.GUI) + l.keyGap; +// keys.add(l.key(Keybind.fromKey(KEY_MENU), xPos, row5, KeyDimensions.MENU)); +// xPos += l.px(KeyDimensions.MENU) + l.keyGap; + keys.add(l.key(Keybind.fromKey(KEY_RCONTROL), xPos, row5, KeyDimensions.CTRL)); + keys.add(l.key(Keybind.fromKey(KEY_LEFT), l.ux(15.5), row5)); + keys.add(l.key(Keybind.fromKey(KEY_DOWN), l.ux(16.5), row5)); + keys.add(l.key(Keybind.fromKey(KEY_RIGHT), l.ux(17.5), row5)); } private void buildIsoLayout(LayoutContext l) { double row0 = l.uy(0), row1 = l.uy(1), row2 = l.uy(2), row3 = l.uy(3), row4 = l.uy(4), row5 = l.uy(5); // Row 0: ESC, F1-F12, Print/Scroll/Pause - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_ESCAPE), 0, row0)); + keys.add(l.key(Keybind.fromKey(KEY_ESCAPE), 0, row0)); for (int i = 0; i < 4; i++) - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_F1 + i), l.ux(2d + i), row0)); + keys.add(l.key(Keybind.fromKey(KEY_F1 + i), l.ux(2d + i), row0)); for (int i = 0; i < 4; i++) - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_F5 + i), l.ux(6.5 + i), row0)); + keys.add(l.key(Keybind.fromKey(KEY_F5 + i), l.ux(6.5 + i), row0)); for (int i = 0; i < 4; i++) - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_F9 + i), l.ux(11d + i), row0)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PRINT_SCREEN), l.ux(15.5), row0)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_SCROLL_LOCK), l.ux(16.5), row0)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PAUSE), l.ux(17.5), row0)); + keys.add(l.key(Keybind.fromKey(KEY_F9 + i), l.ux(11d + i), row0)); + keys.add(l.key(Keybind.fromKey(KEY_PRINTSCREEN), l.ux(15.5), row0)); + keys.add(l.key(Keybind.fromKey(KEY_SCROLLLOCK), l.ux(16.5), row0)); + keys.add(l.key(Keybind.fromKey(KEY_PAUSE), l.ux(17.5), row0)); // Row 1: ` 1-0 - = BS, Ins/Home/PgUp - int[] row1Keys = {GLFW.GLFW_KEY_GRAVE_ACCENT, GLFW.GLFW_KEY_1, GLFW.GLFW_KEY_2, GLFW.GLFW_KEY_3, GLFW.GLFW_KEY_4, GLFW.GLFW_KEY_5, GLFW.GLFW_KEY_6, GLFW.GLFW_KEY_7, GLFW.GLFW_KEY_8, GLFW.GLFW_KEY_9, GLFW.GLFW_KEY_0, GLFW.GLFW_KEY_MINUS, GLFW.GLFW_KEY_EQUAL}; + int[] row1Keys = {KEY_GRAVE, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUALS}; for (int i = 0; i < row1Keys.length; i++) keys.add(l.key(Keybind.fromKey(row1Keys[i]), l.ux(i), row1)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_BACKSPACE), l.ux(13), row1, KeyDimensions.BACKSPACE)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_INSERT), l.ux(15.5), row1)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_HOME), l.ux(16.5), row1)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PAGE_UP), l.ux(17.5), row1)); + keys.add(l.key(Keybind.fromKey(KEY_BACKSPACE), l.ux(13), row1, KeyDimensions.BACKSPACE)); + keys.add(l.key(Keybind.fromKey(KEY_INSERT), l.ux(15.5), row1)); + keys.add(l.key(Keybind.fromKey(KEY_HOME), l.ux(16.5), row1)); + keys.add(l.key(Keybind.fromKey(KEY_PAGEUP), l.ux(17.5), row1)); // Row 2: Tab QWERTY... brackets - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_TAB), 0, row2, KeyDimensions.TAB)); - int[] row2Keys = {GLFW.GLFW_KEY_Q, GLFW.GLFW_KEY_W, GLFW.GLFW_KEY_E, GLFW.GLFW_KEY_R, GLFW.GLFW_KEY_T, GLFW.GLFW_KEY_Y, GLFW.GLFW_KEY_U, GLFW.GLFW_KEY_I, GLFW.GLFW_KEY_O, GLFW.GLFW_KEY_P, GLFW.GLFW_KEY_LEFT_BRACKET, GLFW.GLFW_KEY_RIGHT_BRACKET}; + keys.add(l.key(Keybind.fromKey(KEY_TAB), 0, row2, KeyDimensions.TAB)); + int[] row2Keys = {KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LBRACKET, KEY_RBRACKET}; double tabEnd = l.px(KeyDimensions.TAB) + l.keyGap; for (int i = 0; i < row2Keys.length; i++) keys.add(l.key(Keybind.fromKey(row2Keys[i]), tabEnd + l.ux(i), row2)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_DELETE), l.ux(15.5), row2)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_END), l.ux(16.5), row2)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_PAGE_DOWN), l.ux(17.5), row2)); + keys.add(l.key(Keybind.fromKey(KEY_DELETE), l.ux(15.5), row2)); + keys.add(l.key(Keybind.fromKey(KEY_END), l.ux(16.5), row2)); + keys.add(l.key(Keybind.fromKey(KEY_PAGEDOWN), l.ux(17.5), row2)); // Row 3: Caps ASDF..., ISO # key - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_CAPS_LOCK), 0, row3, KeyDimensions.CAPS_LOCK)); - int[] row3Keys = {GLFW.GLFW_KEY_A, GLFW.GLFW_KEY_S, GLFW.GLFW_KEY_D, GLFW.GLFW_KEY_F, GLFW.GLFW_KEY_G, GLFW.GLFW_KEY_H, GLFW.GLFW_KEY_J, GLFW.GLFW_KEY_K, GLFW.GLFW_KEY_L, GLFW.GLFW_KEY_SEMICOLON, GLFW.GLFW_KEY_APOSTROPHE}; + keys.add(l.key(Keybind.fromKey(KEY_CAPSLOCK), 0, row3, KeyDimensions.CAPS_LOCK)); + int[] row3Keys = {KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, KEY_APOSTROPHE}; double capsEnd = l.px(KeyDimensions.CAPS_LOCK) + l.keyGap; for (int i = 0; i < row3Keys.length; i++) keys.add(l.key(Keybind.fromKey(row3Keys[i]), capsEnd + l.ux(i), row3)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_BACKSLASH), capsEnd + l.ux(11), row3)); + keys.add(l.key(Keybind.fromKey(KEY_BACKSLASH), capsEnd + l.ux(11), row3)); // ISO Enter double topBarStartX = tabEnd + l.ux(12); @@ -450,41 +446,41 @@ private void buildIsoLayout(LayoutContext l) { double enterStemWidth = l.px(KeyDimensions.ENTER_ISO_WIDTH); double enterStemHeight = l.px(KeyDimensions.ENTER_ISO_HEIGHT); double enterStemX = mainBlockRightEdge - enterStemWidth; - keys.add(new IsoEnterKey(Keybind.fromKey(GLFW.GLFW_KEY_ENTER), enterStemX, row2, enterStemWidth, enterStemHeight, topBarStartX)); + keys.add(new IsoEnterKey(Keybind.fromKey(KEY_RETURN), enterStemX, row2, enterStemWidth, enterStemHeight, topBarStartX)); // Row 4: LShift, ISO \| key, ZXCV..., RShift, Up - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_SHIFT), 0, row4, KeyDimensions.LEFT_SHIFT_ISO)); + keys.add(l.key(Keybind.fromKey(KEY_LSHIFT), 0, row4, KeyDimensions.LEFT_SHIFT_ISO)); double lShiftEnd = l.px(KeyDimensions.LEFT_SHIFT_ISO) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_WORLD_2), lShiftEnd, row4)); +// keys.add(l.key(Keybind.fromKey(KEY_WORLD_2), lShiftEnd, row4)); - int[] row4Keys = {GLFW.GLFW_KEY_Z, GLFW.GLFW_KEY_X, GLFW.GLFW_KEY_C, GLFW.GLFW_KEY_V, GLFW.GLFW_KEY_B, GLFW.GLFW_KEY_N, GLFW.GLFW_KEY_M, GLFW.GLFW_KEY_COMMA, GLFW.GLFW_KEY_PERIOD, GLFW.GLFW_KEY_SLASH}; + int[] row4Keys = {KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_SLASH}; for (int i = 0; i < row4Keys.length; i++) keys.add(l.key(Keybind.fromKey(row4Keys[i]), lShiftEnd + l.ux(1d + i), row4)); double rShiftX = lShiftEnd + l.ux(11); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_SHIFT), rShiftX, row4, KeyDimensions.RIGHT_SHIFT)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_UP), l.ux(16.5), row4)); + keys.add(l.key(Keybind.fromKey(KEY_RSHIFT), rShiftX, row4, KeyDimensions.RIGHT_SHIFT)); + keys.add(l.key(Keybind.fromKey(KEY_UP), l.ux(16.5), row4)); // Row 5: Ctrl/Win/Alt/Space/AltGr/Win/Menu/Ctrl, Arrows double xPos = 0; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_CONTROL), xPos, row5, KeyDimensions.CTRL)); + keys.add(l.key(Keybind.fromKey(KEY_LCONTROL), xPos, row5, KeyDimensions.CTRL)); xPos += l.px(KeyDimensions.CTRL) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_SUPER), xPos, row5, KeyDimensions.GUI)); - xPos += l.px(KeyDimensions.GUI) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_ALT), xPos, row5, KeyDimensions.ALT)); +// keys.add(l.key(Keybind.fromKey(KEY_LSUPER), xPos, row5, KeyDimensions.GUI)); +// xPos += l.px(KeyDimensions.GUI) + l.keyGap; + keys.add(l.key(Keybind.fromKey(KEY_LALT), xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_SPACE), xPos, row5, KeyDimensions.SPACEBAR)); + keys.add(l.key(Keybind.fromKey(KEY_SPACE), xPos, row5, KeyDimensions.SPACEBAR)); xPos += l.px(KeyDimensions.SPACEBAR) + l.keyGap; - keys.add(l.keyNamed(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_ALT), "AltGr", xPos, row5, KeyDimensions.ALT)); + keys.add(l.keyNamed(Keybind.fromKey(KEY_RALT), "AltGr", xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_SUPER), xPos, row5, KeyDimensions.GUI)); - xPos += l.px(KeyDimensions.GUI) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_MENU), xPos, row5, KeyDimensions.MENU)); - xPos += l.px(KeyDimensions.MENU) + l.keyGap; - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT_CONTROL), xPos, row5, KeyDimensions.CTRL)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_LEFT), l.ux(15.5), row5)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_DOWN), l.ux(16.5), row5)); - keys.add(l.key(Keybind.fromKey(GLFW.GLFW_KEY_RIGHT), l.ux(17.5), row5)); +// keys.add(l.key(Keybind.fromKey(KEY_RSUPER), xPos, row5, KeyDimensions.GUI)); +// xPos += l.px(KeyDimensions.GUI) + l.keyGap; +// keys.add(l.key(Keybind.fromKey(KEY_MEN), xPos, row5, KeyDimensions.MENU)); +// xPos += l.px(KeyDimensions.MENU) + l.keyGap; + keys.add(l.key(Keybind.fromKey(KEY_RCONTROL), xPos, row5, KeyDimensions.CTRL)); + keys.add(l.key(Keybind.fromKey(KEY_LEFT), l.ux(15.5), row5)); + keys.add(l.key(Keybind.fromKey(KEY_DOWN), l.ux(16.5), row5)); + keys.add(l.key(Keybind.fromKey(KEY_RIGHT), l.ux(17.5), row5)); } private void calculateSize() { @@ -546,9 +542,7 @@ private static String getShortName(String name) { @Override public void render(HudRenderer renderer) { if (keys.isEmpty()) { - if (mc.options != null) { - onPresetChanged(preset.get()); - } + onPresetChanged(preset.get()); return; } @@ -667,7 +661,7 @@ public static class Key { private float delta; public Key() { - this.keybind = Keybind.fromKey(GLFW.GLFW_KEY_SPACE); + this.keybind = Keybind.fromKey(KEY_SPACE); this.width = 60; this.height = 40; } @@ -712,14 +706,14 @@ public String getName() { return "?"; } - public boolean matches(int input, int scancode, boolean key) { + public boolean matches(int input, int keycode, boolean key) { if (keybind != null) { return keybind.isKey() == key && keybind.getValue() == input; } else { InputConstants.Key inputKey = ((KeyMappingAccessor) binding).meteor$getKey(); boolean isKey = inputKey.getType() != InputConstants.Type.MOUSE; - return isKey == key && inputKey.getType() == InputConstants.Type.SCANCODE - ? scancode == inputKey.getValue() + return isKey == key && inputKey.getType() == InputConstants.Type.KEYBOARD + ? keycode == inputKey.getValue() : input == inputKey.getValue(); } } @@ -736,17 +730,16 @@ public void update(KeyAction action) { } public boolean isNativelyPressed() { - long window = mc.getWindow().handle(); if (keybind != null) { if (!keybind.isSet()) return false; return keybind.isKey() - ? GLFW.glfwGetKey(window, keybind.getValue()) != GLFW.GLFW_RELEASE - : GLFW.glfwGetMouseButton(window, keybind.getValue()) != GLFW.GLFW_RELEASE; + ? Type.KEYBOARD.getOrCreate(keybind.getValue()).getValue() != RELEASE + : Type.MOUSE.getOrCreate(keybind.getValue()).getValue() != RELEASE; } else { int key = ((KeyMappingAccessor) binding).meteor$getKey().getValue(); return key >= 0 && key < 8 - ? GLFW.glfwGetMouseButton(window, key) != GLFW.GLFW_RELEASE - : GLFW.glfwGetKey(window, key) != GLFW.GLFW_RELEASE; + ? Type.MOUSE.getOrCreate(key).getValue() != RELEASE + : Type.KEYBOARD.getOrCreate(key).getValue() != RELEASE; } } @@ -915,7 +908,7 @@ public void initWidgets() { sgGeneral.add(new KeybindSetting.Builder() .name("custom-key") .description("The key to display.") - .defaultValue(Keybind.fromKey(GLFW.GLFW_KEY_SPACE)) + .defaultValue(Keybind.fromKey(KEY_SPACE)) .onChanged(k -> { this.key.keybind = k; this.screen.reload(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java index 093bc2c6776..aa81b29248d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.hud.screens; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.gui.tabs.builtin.HudTab; @@ -21,7 +22,6 @@ import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.util.Mth; import org.jspecify.annotations.NonNull; -import org.lwjgl.glfw.GLFW; import java.util.ArrayList; import java.util.Iterator; @@ -77,7 +77,7 @@ public boolean mouseClicked(@NonNull MouseButtonEvent click, boolean doubled) { mouseX *= s; mouseY *= s; - if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) { + if (click.button() == InputConstants.MOUSE_BUTTON_LEFT) { pressed = true; selectionSnapBox = null; @@ -126,7 +126,7 @@ public boolean mouseReleased(@NonNull MouseButtonEvent click) { mouseX *= s; mouseY *= s; - if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) pressed = false; + if (click.button() == InputConstants.MOUSE_BUTTON_LEFT) pressed = false; if (addedHoveredToSelectionWhenClickedElement != null) { selection.remove(addedHoveredToSelectionWhenClickedElement); @@ -134,12 +134,12 @@ public boolean mouseReleased(@NonNull MouseButtonEvent click) { } if (moved) { - if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT && !dragging) fillSelection((int) mouseX, (int) mouseY); + if (click.button() == InputConstants.MOUSE_BUTTON_LEFT && !dragging) fillSelection((int) mouseX, (int) mouseY); } else { - if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) { + if (click.button() == InputConstants.MOUSE_BUTTON_LEFT) { HudElement hovered = getHovered((int) mouseX, (int) mouseY); if (hovered != null) hovered.toggle(); - } else if (click.button() == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { + } else if (click.button() == InputConstants.MOUSE_BUTTON_RIGHT) { HudElement hovered = getHovered((int) mouseX, (int) mouseY); if (hovered != null) mc.gui.setScreen(new HudElementScreen(theme, hovered)); @@ -147,7 +147,7 @@ public boolean mouseReleased(@NonNull MouseButtonEvent click) { } } - if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) { + if (click.button() == InputConstants.MOUSE_BUTTON_LEFT) { snapper.unsnap(); moved = dragging = false; } @@ -158,10 +158,10 @@ public boolean mouseReleased(@NonNull MouseButtonEvent click) { @Override public boolean keyPressed(@NonNull KeyEvent input) { if (!pressed) { - if (input.key() == GLFW.GLFW_KEY_ENTER || input.key() == GLFW.GLFW_KEY_KP_ENTER) { + if (input.key() == InputConstants.KEY_RETURN || input.key() == InputConstants.KEY_NUMPADENTER) { HudElement hovered = getHovered(lastMouseX, lastMouseY); if (hovered != null) hovered.toggle(); - } else if (input.key() == GLFW.GLFW_KEY_DELETE) { + } else if (input.key() == InputConstants.KEY_DELETE) { HudElement hovered = getHovered(lastMouseX, lastMouseY); if (hovered != null) hovered.remove(); @@ -170,14 +170,14 @@ public boolean keyPressed(@NonNull KeyEvent input) { selection.clear(); } } else if (!selection.isEmpty()) { - int pixels = (Input.isKeyPressed(GLFW.GLFW_KEY_LEFT_CONTROL) || Input.isKeyPressed(GLFW.GLFW_KEY_RIGHT_CONTROL)) ? 10 : 1; + int pixels = (Input.isKeyPressed(InputConstants.KEY_LCONTROL) || Input.isKeyPressed(InputConstants.KEY_RCONTROL)) ? 10 : 1; int dx = 0, dy = 0; switch (input.key()) { - case GLFW.GLFW_KEY_UP -> dy = -pixels; - case GLFW.GLFW_KEY_DOWN -> dy = pixels; - case GLFW.GLFW_KEY_RIGHT -> dx = pixels; - case GLFW.GLFW_KEY_LEFT -> dx = -pixels; + case InputConstants.KEY_UP -> dy = -pixels; + case InputConstants.KEY_DOWN -> dy = pixels; + case InputConstants.KEY_RIGHT -> dx = pixels; + case InputConstants.KEY_LEFT -> dx = -pixels; } // manually move selection to bypass snapping @@ -336,6 +336,8 @@ private void renderSplitLine(Renderer2D renderer, double x, double y, double des } public static boolean isOpen() { + if (!Utils.canUpdate()) return false; + Screen s = mc.gui.screen(); return s instanceof HudEditorScreen || s instanceof AddHudElementScreen || s instanceof HudElementPresetsScreen || s instanceof HudElementScreen || s instanceof HudTab.HudScreen; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 22a61c2894b..b7b7c300eeb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules; +import com.mojang.blaze3d.platform.InputConstants; import com.mojang.datafixers.util.Pair; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; @@ -47,7 +48,6 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import org.jspecify.annotations.Nullable; -import org.lwjgl.glfw.GLFW; import java.io.File; import java.util.*; @@ -62,7 +62,7 @@ public class Modules extends System { private final Map> groups = new Reference2ReferenceOpenHashMap<>(); private final Set active = new ReferenceOpenHashSet<>(); - private Module moduleToBind; + private @Nullable Module moduleToBind; private boolean awaitingKeyRelease = false; public Modules() { @@ -214,7 +214,7 @@ void removeActive(Module module) { // Binding - public void setModuleToBind(Module moduleToBind) { + public void setModuleToBind(@Nullable Module moduleToBind) { this.moduleToBind = moduleToBind; } @@ -244,7 +244,7 @@ private boolean onBinding(boolean isKey, int value, int modifiers) { if (!isBinding()) return false; if (awaitingKeyRelease) { - if (!isKey || (value != GLFW.GLFW_KEY_ENTER && value != GLFW.GLFW_KEY_KP_ENTER)) return false; + if (!isKey || (value != InputConstants.KEY_RETURN && value != InputConstants.KEY_NUMPADENTER)) return false; awaitingKeyRelease = false; return false; @@ -253,7 +253,7 @@ private boolean onBinding(boolean isKey, int value, int modifiers) { if (moduleToBind.keybind.canBindTo(isKey, value, modifiers)) { moduleToBind.keybind.set(isKey, value, modifiers); moduleToBind.info("Bound to (highlight)%s(default).", moduleToBind.keybind); - } else if (value == GLFW.GLFW_KEY_ESCAPE) { + } else if (value == InputConstants.KEY_ESCAPE) { moduleToBind.keybind.set(Keybind.none()); moduleToBind.info("Removed bind."); } else return false; @@ -277,7 +277,7 @@ private void onMouseClick(MouseClickEvent event) { } private void onAction(boolean isKey, int value, int modifiers, boolean isPress) { - if (mc.gui.screen() != null || Input.isKeyPressed(GLFW.GLFW_KEY_F3)) return; + if (mc.gui.screen() != null || Input.isKeyPressed(InputConstants.KEY_F3)) return; for (Module module : moduleInstances.values()) { if (module.keybind.matches(isKey, value, modifiers) && (isPress || (module.toggleOnBindRelease && module.isActive()))) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java index af774fc405a..21c87d083e6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AntiBed.java @@ -19,8 +19,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; -import net.minecraft.world.InteractionHand; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.BedBlock; @@ -95,6 +94,6 @@ private void sendMinePackets(BlockPos blockPos) { private void sendStopPackets(BlockPos blockPos) { mc.getConnection().send(new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, blockPos, Direction.UP)); - mc.getConnection().send(new ServerboundSwingPacket(InteractionHand.MAIN_HAND)); + mc.getConnection().send(new ServerboundPunchPacket()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java index 55f34abc0fe..cea34a31bd7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AttributeSwap.java @@ -23,7 +23,6 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.MaceItem; import net.minecraft.world.item.TridentItem; @@ -403,8 +402,8 @@ private int getSmartSlot(Entity target) { ItemStack currentStack = mc.player.getMainHandItem(); if (target != null && smartShieldBreak.get() && target instanceof LivingEntity living && living.isBlocking()) { - if (currentStack.getItem() instanceof AxeItem) return -1; - int axeSlot = InvUtils.findInHotbar(item -> item.getItem() instanceof AxeItem).slot(); + if (currentStack.is(ItemTags.AXES)) return -1; + int axeSlot = InvUtils.findInHotbar(item -> item.is(ItemTags.AXES)).slot(); if (axeSlot != -1) return axeSlot; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java index fd7652df7b3..cf1c6e1acab 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoCity.java @@ -24,7 +24,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Items; @@ -216,8 +216,8 @@ public void mine(boolean done) { mc.gameMode.startPrediction(mc.level, sequence -> new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, targetPos, direction, sequence)); mc.gameMode.startPrediction(mc.level, sequence -> new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, targetPos, direction, sequence)); - if (swingHand.get()) mc.player.swing(InteractionHand.MAIN_HAND); - else mc.getConnection().send(new ServerboundSwingPacket(InteractionHand.MAIN_HAND)); + if (swingHand.get()) mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getItemInHand(InteractionHand.MAIN_HAND).getAttackAnimation(), false); + else mc.getConnection().send(new ServerboundPunchPacket()); if (switchMode.get() == SwitchMode.Silent) InvUtils.swapBack(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java index f23a48947b3..1e083b2c9db 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AutoWeapon.java @@ -14,7 +14,6 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.ItemStack; public class AutoWeapon extends Module { @@ -68,7 +67,7 @@ private int getBestWeapon(LivingEntity target) { damageS = currentDamageS; slotS = i; } - } else if (stack.getItem() instanceof AxeItem + } else if (stack.is(ItemTags.AXES) && (!antiBreak.get() || (stack.getMaxDamage() - stack.getDamageValue()) > 10)) { currentDamageA = DamageUtils.getAttackDamage(mc.player, target, stack); if (currentDamageA > damageA) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java index ba40ccadafd..3fc3469033a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/BedAura.java @@ -26,9 +26,9 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.tags.ItemTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BedItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.phys.BlockHitResult; @@ -225,7 +225,7 @@ private void onTick(TickEvent.Post event) { // Auto move if (autoMove.get()) { - FindItemResult bed = InvUtils.find(itemStack -> itemStack.getItem() instanceof BedItem); + FindItemResult bed = InvUtils.find(itemStack -> itemStack.is(ItemTags.BEDS)); if (bed.found() && bed.slot() != autoMoveSlot.get() - 1) { InvUtils.move().from(bed.slot()).toHotbar(autoMoveSlot.get() - 1); @@ -248,7 +248,7 @@ private void onTick(TickEvent.Post event) { } private BlockPos findPlace(Player target) { - if (!InvUtils.find(itemStack -> itemStack.getItem() instanceof BedItem).found()) return null; + if (!InvUtils.find(itemStack -> itemStack.is(ItemTags.BEDS)).found()) return null; for (int index = 0; index < 3; index++) { int i = index == 0 ? 1 : index == 1 ? 0 : 2; @@ -301,7 +301,7 @@ private BlockPos findBreak() { private boolean placeBed(BlockPos pos) { if (pos == null) return false; - FindItemResult bed = InvUtils.findInHotbar(itemStack -> itemStack.getItem() instanceof BedItem); + FindItemResult bed = InvUtils.findInHotbar(itemStack -> itemStack.is(ItemTags.BEDS)); if (bed.getHand() == null && !autoSwitch.get()) return false; double yaw = switch (direction) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java index 014dc2bf229..f7504d45772 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Burrow.java @@ -22,7 +22,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Items; @@ -200,7 +200,7 @@ private void burrow() { InvUtils.swap(block.slot(), true); mc.gameMode.useItemOn(mc.player, InteractionHand.MAIN_HAND, new BlockHitResult(Utils.vec3(blockPos), Direction.UP, blockPos, false)); - mc.player.connection.send(new ServerboundSwingPacket(InteractionHand.MAIN_HAND)); + mc.player.connection.send(new ServerboundPunchPacket()); InvUtils.swapBack(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java index aa0fa5da881..924248462d1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Criticals.java @@ -18,7 +18,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.network.protocol.game.ServerboundAttackPacket; import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.MaceItem; @@ -61,7 +61,7 @@ public class Criticals extends Module { ); private ServerboundAttackPacket attackPacket; - private ServerboundSwingPacket swingPacket; + private ServerboundPunchPacket swingPacket; private boolean sendPackets; private int sendTimer; private double lastY; @@ -130,11 +130,11 @@ private void onSendPacket(PacketEvent.Send event) { } } } - } else if (event.packet instanceof ServerboundSwingPacket serverboundSwingPacket && mode.get() != Mode.Packet) { + } else if (event.packet instanceof ServerboundPunchPacket serverboundPunchPacket && mode.get() != Mode.Packet) { if (skipCrit()) return; if (sendPackets && swingPacket == null) { - swingPacket = serverboundSwingPacket; + swingPacket = serverboundPunchPacket; event.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java index b4070ed90ad..2352cc70f10 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/CrystalAura.java @@ -874,8 +874,8 @@ private void attackCrystal(Entity entity) { InteractionHand hand = InvUtils.findInHotbar(Items.END_CRYSTAL).getHand(); if (hand == null) hand = InteractionHand.MAIN_HAND; - if (swingMode.get().client()) mc.player.swing(hand); - if (swingMode.get().packet()) mc.getConnection().send(new ServerboundSwingPacket(hand)); + if (swingMode.get().client()) mc.player.swing(hand, mc.player.getItemInHand(hand).getAttackAnimation(), false); + if (swingMode.get().packet()) mc.getConnection().send(new ServerboundPunchPacket()); attacks++; } @@ -1037,8 +1037,8 @@ private void placeCrystal(BlockHitResult result, double damage, BlockPos support // Place crystal mc.gameMode.startPrediction(mc.level, sequence -> new ServerboundUseItemOnPacket(hand, result, sequence)); - if (swingMode.get().client()) mc.player.swing(hand); - if (swingMode.get().packet()) mc.getConnection().send(new ServerboundSwingPacket(hand)); + if (swingMode.get().client()) mc.player.swing(hand, mc.player.getItemInHand(hand).getAttackAnimation(), false); + if (swingMode.get().packet()) mc.getConnection().send(new ServerboundPunchPacket()); placing = true; placingTimer = 4; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java index 44b7ab9c135..9737faa6cfb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/KillAura.java @@ -13,11 +13,7 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.utils.entity.EntityAgeTest; -import meteordevelopment.meteorclient.utils.entity.EntityUtils; -import meteordevelopment.meteorclient.utils.entity.SortPriority; -import meteordevelopment.meteorclient.utils.entity.Target; -import meteordevelopment.meteorclient.utils.entity.TargetUtils; +import meteordevelopment.meteorclient.utils.entity.*; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; @@ -33,7 +29,7 @@ import net.minecraft.world.entity.animal.frog.Frog; import net.minecraft.world.entity.animal.parrot.Parrot; import net.minecraft.world.entity.animal.wolf.Wolf; -import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.monster.Enderman; import net.minecraft.world.entity.monster.Zoglin; import net.minecraft.world.entity.monster.hoglin.Hoglin; import net.minecraft.world.entity.monster.piglin.Piglin; @@ -335,7 +331,7 @@ private void onTick(TickEvent.Pre event) { weaponResult = InvUtils.find(this::acceptableWeapon, 0, 8); if (shouldShieldBreak()) { - FindItemResult axeResult = InvUtils.find(itemStack -> itemStack.getItem() instanceof AxeItem, 0, 8); + FindItemResult axeResult = InvUtils.find(itemStack -> itemStack.is(ItemTags.AXES), 0, 8); if (axeResult.found()) weaponResult = axeResult; } @@ -419,7 +415,7 @@ private boolean entityCheck(Entity entity) { ) return false; } if (ignorePassive.get()) { - if (entity instanceof EnderMan enderman && !enderman.isCreepy()) return false; + if (entity instanceof Enderman enderman && !enderman.isCreepy()) return false; if ((entity instanceof Piglin || entity instanceof ZombifiedPiglin || entity instanceof Wolf) && !((Mob) entity).isAggressive()) return false; } @@ -465,13 +461,13 @@ private void attack(Entity target) { Rotations.rotate(Rotations.getYaw(target), Rotations.getPitch(target, Target.Body)); mc.gameMode.attack(mc.player, target); - mc.player.swing(InteractionHand.MAIN_HAND); + mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getAttackAnimation(), false); hitTimer = 0; } private boolean acceptableWeapon(ItemStack stack) { - if (shouldShieldBreak()) return stack.getItem() instanceof AxeItem; + if (shouldShieldBreak()) return stack.is(ItemTags.AXES); if (attackWhenHolding.get() == AttackItems.All) return true; if (weapons.get().contains(Items.DIAMOND_SWORD) && stack.is(ItemTags.SWORDS)) return true; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java index 4342c648a34..f2933dc2ec3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Offhand.java @@ -19,11 +19,10 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.Items; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_RIGHT; import static meteordevelopment.orbit.EventPriority.HIGHEST; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT; public class Offhand extends Module { private final SettingGroup sgCombat = settings.createGroup("Combat"); @@ -191,7 +190,7 @@ else if (ticks > delayTicks.get()) { } // Always Gap - else if ((mc.player.getMainHandItem().is(ItemTags.SWORDS) || mc.player.getMainHandItem().getItem() instanceof AxeItem) && alwaysSwordGap.get()) + else if ((mc.player.getMainHandItem().is(ItemTags.SWORDS) || mc.player.getMainHandItem().is(ItemTags.AXES)) && alwaysSwordGap.get()) currentItem = Item.EGap; // Potion Click @@ -206,7 +205,7 @@ else if (potionClick.get()) { } // Always Pot - else if ((mc.player.getMainHandItem().is(ItemTags.SWORDS) || mc.player.getMainHandItem().getItem() instanceof AxeItem) && alwaysPot.get()) + else if ((mc.player.getMainHandItem().is(ItemTags.SWORDS) || mc.player.getMainHandItem().is(ItemTags.AXES)) && alwaysPot.get()) currentItem = Item.Potion; @@ -242,7 +241,7 @@ else if ((isClicking || !autoTotem.isLocked() && !item.isOffhand())) { @EventHandler private void onMouseClick(MouseClickEvent event) { // Detects if the User is right-clicking - isClicking = mc.gui.screen() == null && !Modules.get().get(AutoTotem.class).isLocked() && !usableItem() && !mc.player.isUsingItem() && event.action == KeyAction.Press && event.button() == GLFW_MOUSE_BUTTON_RIGHT; + isClicking = mc.gui.screen() == null && !Modules.get().get(AutoTotem.class).isLocked() && !usableItem() && !mc.player.isUsingItem() && event.action == KeyAction.Press && event.button() == MOUSE_BUTTON_RIGHT; } private boolean usableItem() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index 51079d973d7..62886fc86eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -27,9 +27,8 @@ import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket; import net.minecraft.network.protocol.game.ServerboundAttackPacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.server.level.BlockDestructionProgress; -import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.level.block.Block; @@ -39,8 +38,8 @@ import java.util.ArrayList; import java.util.List; -import java.util.function.Predicate; import java.util.SortedSet; +import java.util.function.Predicate; public class Surround extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -401,7 +400,7 @@ private boolean place(BlockPos placePos, FindItemResult block) { mc.player.connection.send(new ServerboundAttackPacket(crystal.getId())); } - mc.getConnection().send(new ServerboundSwingPacket(InteractionHand.MAIN_HAND)); + mc.getConnection().send(new ServerboundPunchPacket()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java index 16e27fa130b..c1088019d98 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/InventoryTweaks.java @@ -36,11 +36,12 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.DecoratedPotBlock; -import org.lwjgl.glfw.GLFW; import java.util.List; import java.util.concurrent.ThreadLocalRandom; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_MIDDLE; + public class InventoryTweaks extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgSorting = settings.createGroup("Sorting"); @@ -98,7 +99,7 @@ public class InventoryTweaks extends Module { .name("sorting-key") .description("Key to trigger the sort.") .visible(sortingEnabled::get) - .defaultValue(Keybind.fromButton(GLFW.GLFW_MOUSE_BUTTON_MIDDLE)) + .defaultValue(Keybind.fromButton(MOUSE_BUTTON_MIDDLE)) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java index 77111133509..ed8cda76d5a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/Notebot.java @@ -834,7 +834,7 @@ private void tuneBlocks() { } if (swingArm.get()) { - mc.player.swing(InteractionHand.MAIN_HAND); + mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getAttackAnimation(), false); } int iterations = 0; @@ -904,7 +904,7 @@ private void onTickPlay() { // Swing arm if (swingArm.get()) { - mc.player.swing(InteractionHand.MAIN_HAND); + mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getAttackAnimation(), false); } // Play notes diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java index 14ae044a418..5a91344a1f3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/EntityControl.java @@ -174,7 +174,7 @@ public void onActivate() { private void onPreTick(TickEvent.Pre event) { if (sentPacket && mc.player.getVehicle() != null) { ServerboundMoveVehiclePacket packet = ServerboundMoveVehiclePacket.fromEntity(mc.player.getVehicle()); - ((IVec3) packet.position()).meteor$setY(lastPacketY); + ((IVec3) packet.movingTo().position()).meteor$setY(lastPacketY); mc.getConnection().send(packet); sentPacket = false; } @@ -214,9 +214,9 @@ private void onEntityMove(EntityMoveEvent event) { private void onSendPacket(PacketEvent.Send event) { if (!(event.packet instanceof ServerboundMoveVehiclePacket packet) || !antiKick.get()) return; - double currentY = packet.position().y; + double currentY = packet.movingTo().position().y; if (delayLeft <= 0 && !sentPacket && shouldFlyDown(currentY) && EntityUtils.isOnAir(mc.player.getVehicle()) && !mc.player.getVehicle().isFlyingVehicle()) { - ((IVec3) packet.position()).meteor$setY(lastPacketY - 0.03130D); + ((IVec3) packet.movingTo().position()).meteor$setY(lastPacketY - 0.03130D); sentPacket = true; delayLeft = delay.get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java index 350f08a31de..c03896a0e47 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/GUIMove.java @@ -24,7 +24,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.item.CreativeModeTabs; -import static org.lwjgl.glfw.GLFW.*; +import static com.mojang.blaze3d.platform.InputConstants.*; public class GUIMove extends Module { public enum Screens { @@ -147,10 +147,10 @@ private void onRender3D(Render3DEvent event) { float yaw = mc.player.getYRot(); float pitch = mc.player.getXRot(); - if (Input.isKeyPressed(GLFW_KEY_LEFT)) yaw -= rotationDelta; - if (Input.isKeyPressed(GLFW_KEY_RIGHT)) yaw += rotationDelta; - if (Input.isKeyPressed(GLFW_KEY_UP)) pitch -= rotationDelta; - if (Input.isKeyPressed(GLFW_KEY_DOWN)) pitch += rotationDelta; + if (Input.isKeyPressed(KEY_LEFT)) yaw -= rotationDelta; + if (Input.isKeyPressed(KEY_RIGHT)) yaw += rotationDelta; + if (Input.isKeyPressed(KEY_UP)) pitch -= rotationDelta; + if (Input.isKeyPressed(KEY_DOWN)) pitch += rotationDelta; pitch = Mth.clamp(pitch, -90, 90); @@ -159,10 +159,10 @@ private void onRender3D(Render3DEvent event) { } else { double dy = 0, dx = 0; - if (Input.isKeyPressed(GLFW_KEY_LEFT)) dy = -rotationDelta; - if (Input.isKeyPressed(GLFW_KEY_RIGHT)) dy = rotationDelta; - if (Input.isKeyPressed(GLFW_KEY_UP)) dx = -rotationDelta; - if (Input.isKeyPressed(GLFW_KEY_DOWN)) dx = rotationDelta; + if (Input.isKeyPressed(KEY_LEFT)) dy = -rotationDelta; + if (Input.isKeyPressed(KEY_RIGHT)) dy = rotationDelta; + if (Input.isKeyPressed(KEY_UP)) dx = -rotationDelta; + if (Input.isKeyPressed(KEY_DOWN)) dx = rotationDelta; freecam.changeLookDirection(dy, dx); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java index fa603ad9b22..feeeb56a776 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/Scaffold.java @@ -227,7 +227,7 @@ private void onTick(TickEvent.Pre event) { if (!BlockUtils.canPlace(bp)) continue; if (mc.player.getEyePosition().distanceToSqr(Vec3.atCenterOf(bp.relative(BlockUtils.getClosestPlaceSide(bp)))) > 36) continue; - blockPosArray.add(new BlockPos(bp)); + blockPosArray.add(bp.immutable()); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java index 3b4f302bd8e..2ff3709abbe 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/movement/elytrafly/ElytraFlightMode.java @@ -125,12 +125,12 @@ public void handleAutopilot() { if (itemResult.isOffhand()) { mc.gameMode.useItem(mc.player, InteractionHand.OFF_HAND); - mc.player.swing(InteractionHand.OFF_HAND); + mc.player.swing(InteractionHand.OFF_HAND, mc.player.getOffhandItem().getInteractAnimation(), false); } else { InvUtils.swap(itemResult.slot(), true); mc.gameMode.useItem(mc.player, InteractionHand.MAIN_HAND); - mc.player.swing(InteractionHand.MAIN_HAND); + mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getInteractAnimation(), false); InvUtils.swapBack(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java index d5fbc94826b..7340e540089 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiAFK.java @@ -185,7 +185,7 @@ private void onTick(TickEvent.Pre event) { // Swing if (swing.get() && random.nextInt(99) == 0) { - mc.player.swing(mc.player.getUsedItemHand()); + mc.player.swing(mc.player.getUsedItemHand(), mc.player.getItemInHand(mc.player.getUsedItemHand()).getInteractAnimation(), false); } // Sneak diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java index 03ecefe17fc..17eb07c87bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/GhostHand.java @@ -49,7 +49,7 @@ private void onTick(DoItemUseEvent event) { for (InteractionHand hand : InteractionHand.values()) { InteractionResult result = mc.gameMode.useItemOn(mc.player, hand, new BlockHitResult(new Vec3(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), Direction.UP, pos, true)); if (result instanceof InteractionResult.Success || result instanceof InteractionResult.Fail) { - mc.player.swing(hand); + mc.player.swing(hand, mc.player.getItemInHand(hand).getInteractAnimation(), false); event.cancel(); return; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java index 0fb4ba42926..80d93645f1c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/InstantRebreak.java @@ -19,9 +19,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.tags.ItemTags; -import net.minecraft.world.InteractionHand; public class InstantRebreak extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -110,7 +109,7 @@ private void onTick(TickEvent.Pre event) { Rotations.rotate(Rotations.getYaw(blockPos), Rotations.getPitch(blockPos), this::sendPacket); else sendPacket(); - mc.getConnection().send(new ServerboundSwingPacket(InteractionHand.MAIN_HAND)); + mc.getConnection().send(new ServerboundPunchPacket()); } } else { ticks++; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java index 156665a8a8f..a79b8d19e28 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/MiddleClickExtra.java @@ -28,7 +28,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.GameType; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_MIDDLE; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_MIDDLE; public class MiddleClickExtra extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -103,7 +103,7 @@ public void onDeactivate() { @EventHandler private void onMouseClick(MouseClickEvent event) { - if (event.action != KeyAction.Press || event.button() != GLFW_MOUSE_BUTTON_MIDDLE || mc.gui.screen() != null) + if (event.action != KeyAction.Press || event.button() != MOUSE_BUTTON_MIDDLE || mc.gui.screen() != null) return; if (disabledByCreative()) return; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java index eb3ddcb4b18..f28d818d9c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/BetterTooltips.java @@ -59,8 +59,8 @@ import java.util.Optional; import java.util.function.Consumer; -import static org.lwjgl.glfw.GLFW.GLFW_KEY_LEFT_ALT; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_MIDDLE; +import static com.mojang.blaze3d.platform.InputConstants.KEY_LALT; +import static com.mojang.blaze3d.platform.InputConstants.MOUSE_BUTTON_MIDDLE; public class BetterTooltips extends Module { public static final Color ECHEST_COLOR = new Color(0, 50, 50); @@ -82,7 +82,7 @@ public class BetterTooltips extends Module { private final Setting keybind = sgGeneral.add(new KeybindSetting.Builder() .name("keybind") .description("The bind for keybind mode.") - .defaultValue(Keybind.fromKey(GLFW_KEY_LEFT_ALT)) + .defaultValue(Keybind.fromKey(KEY_LALT)) .visible(() -> displayWhen.get() == DisplayWhen.Keybind) .onChanged(_ -> updateTooltips = true) .build() @@ -98,7 +98,7 @@ public class BetterTooltips extends Module { private final Setting openContentsKey = sgGeneral.add(new KeybindSetting.Builder() .name("keybind") .description("Key to open contents (containers, books, etc.) when pressed on items.") - .defaultValue(Keybind.fromButton(GLFW_MOUSE_BUTTON_MIDDLE)) + .defaultValue(Keybind.fromButton(MOUSE_BUTTON_MIDDLE)) .visible(openContents::get) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java index 76a98681da5..5691a536e21 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Blur.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.systems.modules.render; -import com.mojang.blaze3d.GpuFormat; -import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; -import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.FilterMode; -import com.mojang.blaze3d.textures.GpuTextureView; +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.textures.FilterMode; +import com.mojang.renderpearl.api.textures.GpuTextureView; import it.unimi.dsi.fastutil.ints.IntFloatImmutablePair; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.ResolutionChangedEvent; @@ -31,7 +31,7 @@ import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.renderer.DynamicUniformStorage; +import net.minecraft.client.renderer.DynamicGpuDataStorage; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -217,7 +217,7 @@ private void onRenderAfterWorld() { .attachments(mc.gameRenderer.mainRenderTarget()) .pipeline(MeteorRenderPipelines.BLUR_PASSTHROUGH) .fullscreen() - .sampler("u_Texture", fbos[0], RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR)) // todo ??? + .sampler("u_Texture", fbos[0], RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR)) .end(); } @@ -268,7 +268,7 @@ private void updateUniforms(float offset) { private static final FixedUniformStorage UNIFORM_STORAGE = new FixedUniformStorage<>("Meteor - Blur UBO", UNIFORM_SIZE, 6); private record BlurUniformData(float halfTexelSizeX, float halfTexelSizeY, - float offset) implements DynamicUniformStorage.DynamicUniform { + float offset) implements DynamicGpuDataStorage.DynamicGpuData { @Override public void write(@NonNull ByteBuffer buffer) { Std140Builder.intoBuffer(buffer) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java index 5243ab3e096..de8d9f4f593 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/CameraTweaks.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.render; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.events.game.ChangePerspectiveEvent; import meteordevelopment.meteorclient.events.meteor.MouseScrollEvent; import meteordevelopment.meteorclient.settings.*; @@ -13,7 +14,6 @@ import meteordevelopment.meteorclient.utils.misc.Keybind; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.CameraType; -import org.lwjgl.glfw.GLFW; public class CameraTweaks extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -50,7 +50,7 @@ public class CameraTweaks extends Module { .name("bind") .description("Binds camera distance scrolling to a key.") .visible(scrollingEnabled::get) - .defaultValue(Keybind.fromKey(GLFW.GLFW_KEY_LEFT_ALT)) + .defaultValue(Keybind.fromKey(InputConstants.KEY_LALT)) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java index 2e431acbb35..bf27e840fdb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/FreeLook.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.render; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; @@ -13,7 +14,6 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.client.CameraType; import net.minecraft.util.Mth; -import org.lwjgl.glfw.GLFW; public class FreeLook extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -99,19 +99,19 @@ private void onTick(TickEvent.Post event) { for (int i = 0; i < (arrowSpeed.get() * 2); i++) { switch (mode.get()) { case Player -> { - if (Input.isKeyPressed(GLFW.GLFW_KEY_LEFT)) cameraYaw -= 0.5; - if (Input.isKeyPressed(GLFW.GLFW_KEY_RIGHT)) cameraYaw += 0.5; - if (Input.isKeyPressed(GLFW.GLFW_KEY_UP)) cameraPitch -= 0.5; - if (Input.isKeyPressed(GLFW.GLFW_KEY_DOWN)) cameraPitch += 0.5; + if (Input.isKeyPressed(InputConstants.KEY_LEFT)) cameraYaw -= 0.5; + if (Input.isKeyPressed(InputConstants.KEY_RIGHT)) cameraYaw += 0.5; + if (Input.isKeyPressed(InputConstants.KEY_UP)) cameraPitch -= 0.5; + if (Input.isKeyPressed(InputConstants.KEY_DOWN)) cameraPitch += 0.5; } case Camera -> { float yaw = mc.player.getYRot(); float pitch = mc.player.getXRot(); - if (Input.isKeyPressed(GLFW.GLFW_KEY_LEFT)) yaw -= 0.5; - if (Input.isKeyPressed(GLFW.GLFW_KEY_RIGHT)) yaw += 0.5; - if (Input.isKeyPressed(GLFW.GLFW_KEY_UP)) pitch -= 0.5; - if (Input.isKeyPressed(GLFW.GLFW_KEY_DOWN)) pitch += 0.5; + if (Input.isKeyPressed(InputConstants.KEY_LEFT)) yaw -= 0.5; + if (Input.isKeyPressed(InputConstants.KEY_RIGHT)) yaw += 0.5; + if (Input.isKeyPressed(InputConstants.KEY_UP)) pitch -= 0.5; + if (Input.isKeyPressed(InputConstants.KEY_DOWN)) pitch += 0.5; mc.player.setYRot(yaw); mc.player.setXRot(pitch); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java index 492fa23a137..b397d9efb19 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Freecam.java @@ -43,7 +43,8 @@ import net.minecraft.world.phys.shapes.CollisionContext; import org.joml.Vector3d; import org.jspecify.annotations.Nullable; -import org.lwjgl.glfw.GLFW; + +import static com.mojang.blaze3d.platform.InputConstants.KEY_F3; public class Freecam extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -305,7 +306,7 @@ private void onTick(TickEvent.Post event) { @EventHandler(priority = EventPriority.HIGH) public void onKey(KeyInputEvent event) { - if (Input.isKeyPressed(GLFW.GLFW_KEY_F3)) return; + if (Input.isKeyPressed(KEY_F3)) return; if (checkGuiMove()) return; if (onInput(event.key(), event.action)) event.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java index 807f3bd14a1..484818ef6b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java @@ -67,7 +67,7 @@ public class HandView extends Module { .build() ); - public final Setting swingSpeed = sgGeneral.add(new IntSetting.Builder() + public final Setting swingSpeed = sgGeneral.add(new DoubleSetting.Builder() .name("swing-speed") .description("The swing speed of your hands.") .defaultValue(6) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java index 36c68549ac9..b2eb6cc0e5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java @@ -60,7 +60,7 @@ private void onRenderItemEntity(RenderItemEntityEvent event) { for (int i = 0; i < ((ItemStackRenderStateAccessor) event.renderState.item).meteor$getActiveLayerCount(); i++) { ItemStackRenderState.LayerRenderState layer = ((ItemStackRenderStateAccessor) event.renderState.item).meteor$getLayers()[i]; - ModelInfo info = getInfo(layer.prepareQuadList()); + ModelInfo info = getInfo(layer.quads.all()); matrices.pushPose(); applyTransformation(matrices, ((LayerRenderStateAccessor) layer).meteor$getTransform()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java index 54a78d53d37..21e46fe9a5d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.render; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseScrollEvent; @@ -19,7 +20,6 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; import net.minecraft.util.Mth; -import org.lwjgl.glfw.GLFW; public class Zoom extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -109,7 +109,7 @@ public void onDeactivate() { @EventHandler public void onKeyPressed(KeyInputEvent event) { - if (event.key() != GLFW.GLFW_KEY_F1) return; + if (event.key() != InputConstants.KEY_F1) return; hudManualToggled = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java index 2f1305b5d07..4ca16461cb0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoBreed.java @@ -104,7 +104,7 @@ private void onTick(TickEvent.Pre event) { Rotations.rotate(Rotations.getYaw(entity), Rotations.getPitch(entity), -100, () -> { EntityHitResult location = new EntityHitResult(animal, animal.getBoundingBox().getCenter()); mc.gameMode.interact(mc.player, animal, location, hand.get()); - mc.player.swing(hand.get()); + mc.player.swing(hand.get(), mc.player.getItemInHand(hand.get()).getInteractAnimation(), false); animalsFed.putLast(animal, tickCounter); }); break; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java index 76df1044144..6f0a2e1ac10 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSign.java @@ -18,8 +18,10 @@ import net.minecraft.client.gui.screens.inventory.AbstractSignEditScreen; import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket; import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.entity.SignTextSlot; import java.util.ArrayDeque; +import java.util.List; import java.util.Queue; public class AutoSign extends Module { @@ -34,7 +36,8 @@ public class AutoSign extends Module { .build() ); - private String[] text; + private List text; + private SignTextSlot slot; // Some servers (e.g., 2b2t) don't like the sign packet being sent too soon after the swing or block click packets, so queue them. // Delaying by sleeping in the event handler may be fine for a single sign, but would visibly lag the UI at a larger scale. @@ -48,6 +51,7 @@ public AutoSign() { @Override public void onDeactivate() { text = null; + slot = null; } @EventHandler @@ -72,18 +76,19 @@ private void onTick(TickEvent.Post event) { @EventHandler private void onSendPacket(PacketEvent.Send event) { - if (!(event.packet instanceof ServerboundSignUpdatePacket)) return; + if (!(event.packet instanceof ServerboundSignUpdatePacket signPacket)) return; - text = ((ServerboundSignUpdatePacket) event.packet).getLines(); + text = signPacket.lines(); + slot = signPacket.slot(); } @EventHandler private void onOpenScreen(OpenScreenEvent event) { - if (!(event.screen instanceof AbstractSignEditScreen) || text == null) return; + if (!(event.screen instanceof AbstractSignEditScreen) || text == null || slot == null) return; SignBlockEntity sign = ((AbstractSignEditScreenAccessor) event.screen).meteor$getSign(); - queue.add(new ServerboundSignUpdatePacket(sign.getBlockPos(), true, text[0], text[1], text[2], text[3])); + queue.add(new ServerboundSignUpdatePacket(sign.getBlockPos(), text, slot)); event.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java index 984fdee1a8d..db213d8518e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/AutoSmelter.java @@ -6,15 +6,12 @@ package meteordevelopment.meteorclient.systems.modules.world; import meteordevelopment.meteorclient.mixininterface.IAbstractFurnaceMenu; -import meteordevelopment.meteorclient.settings.BoolSetting; -import meteordevelopment.meteorclient.settings.IntSetting; -import meteordevelopment.meteorclient.settings.ItemListSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.InvUtils; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.inventory.AbstractFurnaceMenu; import net.minecraft.world.inventory.ContainerInput; import net.minecraft.world.item.Item; @@ -74,7 +71,7 @@ public AutoSmelter() { private boolean fuelItemFilter(Item item) { if (!Utils.canUpdate()) return false; - return mc.getConnection().fuelValues().fuelItems().contains(item); + return item.getDefaultInstance().has(DataComponents.COOKING_FUEL); } private boolean smeltableItemFilter(Item item) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java index 2bf39936274..c186f9286f6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/BuildHeight.java @@ -22,8 +22,8 @@ public BuildHeight() { private void onSendPacket(PacketEvent.Send event) { if (!(event.packet instanceof ServerboundUseItemOnPacket p)) return; if (mc.level == null) return; - if (p.getHitResult().getLocation().y >= mc.level.getHeight() && p.getHitResult().getDirection() == Direction.UP) { - ((BlockHitResultAccessor) p.getHitResult()).meteor$setDirection(Direction.DOWN); + if (p.hitResult().getLocation().y >= mc.level.getHeight() && p.hitResult().getDirection() == Direction.UP) { + ((BlockHitResultAccessor) p.hitResult()).meteor$setDirection(Direction.DOWN); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java index fb1d6f8e7ac..bc2cf6dd3ad 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Collisions.java @@ -84,7 +84,7 @@ private void onPlayerMove(PlayerMoveEvent event) { private void onPacketSend(PacketEvent.Send event) { if (!unloadedChunks.get()) return; if (event.packet instanceof ServerboundMoveVehiclePacket packet) { - if (!mc.level.getChunkSource().hasChunk((int) packet.position().x() >> 4, (int) packet.position().z() >> 4)) { + if (!mc.level.getChunkSource().hasChunk((int) packet.movingTo().position().x() >> 4, (int) packet.movingTo().position().z() >> 4)) { mc.player.getVehicle().absSnapTo(mc.player.getVehicle().xo, mc.player.getVehicle().yo, mc.player.getVehicle().zo); event.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java index c4537d27e47..a44926449ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/EndermanLook.java @@ -18,7 +18,7 @@ import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.entity.monster.Enderman; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; @@ -51,7 +51,7 @@ private void onTick(TickEvent.Pre event) { return; for (Entity entity : mc.level.entitiesForRendering()) { - if (!(entity instanceof EnderMan enderman) || !enderman.isAlive() || !mc.player.hasLineOfSight(enderman)) + if (!(entity instanceof Enderman enderman) || !enderman.isAlive() || !mc.player.hasLineOfSight(enderman)) continue; switch (lookMode.get()) { @@ -69,9 +69,9 @@ private void onTick(TickEvent.Pre event) { } /** - * @see EnderMan#isBeingStaredBy(Player) + * @see Enderman#isBeingStaredBy(Player) */ - private boolean angleCheck(EnderMan entity) { + private boolean angleCheck(Enderman entity) { Vec3 vec3d = mc.player.getViewVector(1.0F).normalize(); Vec3 vec3d2 = new Vec3(entity.getX() - mc.player.getX(), entity.getEyeY() - mc.player.getEyeY(), entity.getZ() - mc.player.getZ()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java index 1d4c9138df2..a11e3e57959 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Excavator.java @@ -8,6 +8,7 @@ import baritone.api.BaritoneAPI; import baritone.api.IBaritone; import baritone.api.utils.BetterBlockPos; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; @@ -20,7 +21,6 @@ import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import net.minecraft.world.phys.BlockHitResult; -import org.lwjgl.glfw.GLFW; public class Excavator extends Module { private final IBaritone baritone = BaritoneAPI.getProvider().getPrimaryBaritone(); @@ -31,7 +31,7 @@ public class Excavator extends Module { private final Setting selectionBind = sgGeneral.add(new KeybindSetting.Builder() .name("selection-bind") .description("Bind to draw selection.") - .defaultValue(Keybind.fromButton(GLFW.GLFW_MOUSE_BUTTON_RIGHT)) + .defaultValue(Keybind.fromButton(InputConstants.MOUSE_BUTTON_RIGHT)) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java index 5207e34d1df..af80cb739d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/HighwayBuilder.java @@ -762,7 +762,7 @@ private void tickDoubleMine() { normalMining.stopDestroying(); } - mc.player.swing(InteractionHand.MAIN_HAND); + mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getInteractAnimation(), false); } if (packetMining != null) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java index ff7dff87929..56f9f25f3d2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/Nuker.java @@ -31,7 +31,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.world.InteractionHand; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.block.Block; @@ -509,8 +509,8 @@ private void breakBlock(BlockPos blockPos) { // Packet mine mode mc.gameMode.startPrediction(mc.level, sequence -> new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, blockPos, BlockUtils.getDirection(blockPos), sequence)); - if (swing.get()) mc.player.swing(InteractionHand.MAIN_HAND); - else mc.getConnection().send(new ServerboundSwingPacket(InteractionHand.MAIN_HAND)); + if (swing.get()) mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getAttackAnimation(), false); + else mc.getConnection().send(new ServerboundPunchPacket()); mc.gameMode.startPrediction(mc.level, sequence -> new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, blockPos, BlockUtils.getDirection(blockPos), sequence)); } else { @@ -523,7 +523,7 @@ private boolean isOutOfRange(BlockPos blockPos) { Vec3 pos = Vec3.atCenterOf(blockPos); ClipContext clipContext = new ClipContext(mc.player.getEyePosition(), pos, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, mc.player); BlockHitResult result = mc.level.clip(clipContext); - if (result == null || !result.getBlockPos().equals(blockPos)) + if (!result.getBlockPos().equals(blockPos)) return !PlayerUtils.isWithin(pos, wallsRange.get()); return false; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java index 3373f3f533e..9a99e4e32e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/world/VeinMiner.java @@ -221,7 +221,7 @@ public boolean shouldRemove() { public void mine() { if (!mining) { - mc.player.swing(InteractionHand.MAIN_HAND); + mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getAttackAnimation(), false); mining = true; } if (rotate.get()) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/OutlineRenderCommandQueue.java b/src/main/java/meteordevelopment/meteorclient/utils/OutlineRenderCommandQueue.java index 05c5cee890d..19490b77108 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/OutlineRenderCommandQueue.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/OutlineRenderCommandQueue.java @@ -15,13 +15,13 @@ import net.minecraft.client.renderer.block.MovingBlockRenderState; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.renderer.entity.state.EntityRenderState; -import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.client.renderer.feature.phase.TranslucentFeatureRenderPhase; import net.minecraft.client.renderer.item.ItemStackRenderState; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.client.renderer.state.level.QuadParticleRenderState; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.geometry.BakedQuad; +import net.minecraft.client.renderer.texture.UvMapping; +import net.minecraft.client.resources.model.geometry.ItemQuads; import net.minecraft.network.chat.Component; import net.minecraft.util.FormattedCharSequence; import net.minecraft.world.item.ItemDisplayContext; @@ -44,11 +44,15 @@ public void setColor(Color color) { @Override public @NonNull SubmitNodeCollection order(int i) { - return submitsPerOrder.computeIfAbsent(i, _ -> new OutlineBatchingRenderCommandQueue()); + return submitsPerOrder.computeIfAbsent(i, _ -> new OutlineBatchingRenderCommandQueue(true, new TranslucentFeatureRenderPhase())); } @NullMarked private class OutlineBatchingRenderCommandQueue extends SubmitNodeCollection { + public OutlineBatchingRenderCommandQueue(boolean useImprovedTransparency, TranslucentFeatureRenderPhase seeThrough) { + super(useImprovedTransparency, seeThrough); + } + @Override public void submitShadow(PoseStack poseStack, float shadowRadius, List shadowPieces) { } @@ -70,13 +74,13 @@ public void submitLeash(PoseStack poseStack, EntityRenderState.LeashState leashS } @Override - public void submitModel(Model model, S state, PoseStack poseStack, RenderType renderType, int lightCoords, int overlayCoords, int tintedColor, @Nullable TextureAtlasSprite sprite, int outlineColor, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay) { - super.submitModel(model, state, poseStack, renderType, lightCoords, overlayCoords, color, sprite, color, crumblingOverlay); + public void submitModel(Model model, S state, PoseStack poseStack, RenderType renderType, int lightCoords, int overlayCoords, int tintedColor, @Nullable UvMapping uvMapping, int outlineColor) { + super.submitModel(model, state, poseStack, renderType, lightCoords, overlayCoords, tintedColor, uvMapping, color); } @Override - public void submitModelPart(ModelPart part, PoseStack poseStack, RenderType renderType, int lightCoords, int overlayCoords, @Nullable TextureAtlasSprite sprite, int tintedColor, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay, int outlineColor) { - super.submitModelPart(part, poseStack, renderType, lightCoords, overlayCoords, sprite, color, crumblingOverlay, color); + public void submitModelPart(final ModelPart modelPart, final PoseStack poseStack, final RenderType renderType, final int lightCoords, final int overlayCoords, final @Nullable UvMapping uvMapping, final int tintedColor, final int outlineColor) { + super.submitModelPart(modelPart, poseStack, renderType, lightCoords, overlayCoords, uvMapping, tintedColor, color); } @Override @@ -90,11 +94,11 @@ public void submitBlockModel(PoseStack poseStack, RenderType renderType, List modelParts, int progress) { + public void submitBreakingBlockModel(PoseStack poseStack, List parts, int progress, final boolean isBlockTranslucent) { } @Override - public void submitItem(PoseStack poseStack, ItemDisplayContext displayContext, int lightCoords, int overlayCoords, int outlineColor, int[] tintLayers, List quads, ItemStackRenderState.FoilType foilType) { + public void submitItem(PoseStack poseStack, ItemDisplayContext displayContext, int lightCoords, int overlayCoords, int outlineColor, int[] tintLayers, ItemQuads quads, ItemStackRenderState.FoilType foilType) { if (tints == null || tints[0] != color) { tints = new int[]{color, color, color, color}; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index d6d5ad5e902..0564ec040db 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -73,7 +73,6 @@ import java.util.stream.Collectors; import static meteordevelopment.meteorclient.MeteorClient.mc; -import static org.lwjgl.glfw.GLFW.*; public class Utils { public static final Pattern FILE_NAME_INVALID_CHARS_PATTERN = Pattern.compile("[\\s\\\\/:*?\"<>|]"); @@ -277,10 +276,10 @@ public static void getItemsInContainerItem(ItemStack itemStack, ItemStack[] item DataComponentMap components = itemStack.getComponents(); if (components.has(DataComponents.CONTAINER)) { - var stacks = components.get(DataComponents.CONTAINER).allItemsCopyStream().toList(); + List stacks = components.get(DataComponents.CONTAINER).itemCopies().toList(); for (int i = 0; i < stacks.size(); i++) { - if (i >= 0 && i < items.length) items[i] = stacks.get(i); + if (i < items.length) items[i] = stacks.get(i); } } else if (components.has(DataComponents.BLOCK_ENTITY_DATA)) { TypedEntityData> blockEntityData = components.get(DataComponents.BLOCK_ENTITY_DATA); @@ -449,85 +448,6 @@ public static String titleToName(String title) { return title.replace(" ", "-").toLowerCase(Locale.ROOT); } - public static String getKeyName(int key) { - return switch (key) { - case GLFW_KEY_UNKNOWN -> "Unknown"; - case GLFW_KEY_ESCAPE -> "Esc"; - case GLFW_KEY_GRAVE_ACCENT -> "Grave Accent"; - case GLFW_KEY_WORLD_1 -> "World 1"; - case GLFW_KEY_WORLD_2 -> "World 2"; - case GLFW_KEY_PRINT_SCREEN -> "Print Screen"; - case GLFW_KEY_PAUSE -> "Pause"; - case GLFW_KEY_INSERT -> "Insert"; - case GLFW_KEY_DELETE -> "Delete"; - case GLFW_KEY_HOME -> "Home"; - case GLFW_KEY_PAGE_UP -> "Page Up"; - case GLFW_KEY_PAGE_DOWN -> "Page Down"; - case GLFW_KEY_END -> "End"; - case GLFW_KEY_TAB -> "Tab"; - case GLFW_KEY_LEFT_CONTROL -> "Left Control"; - case GLFW_KEY_RIGHT_CONTROL -> "Right Control"; - case GLFW_KEY_LEFT_ALT -> "Left Alt"; - case GLFW_KEY_RIGHT_ALT -> "Right Alt"; - case GLFW_KEY_LEFT_SHIFT -> "Left Shift"; - case GLFW_KEY_RIGHT_SHIFT -> "Right Shift"; - case GLFW_KEY_UP -> "Arrow Up"; - case GLFW_KEY_DOWN -> "Arrow Down"; - case GLFW_KEY_LEFT -> "Arrow Left"; - case GLFW_KEY_RIGHT -> "Arrow Right"; - case GLFW_KEY_APOSTROPHE -> "Apostrophe"; - case GLFW_KEY_BACKSPACE -> "Backspace"; - case GLFW_KEY_CAPS_LOCK -> "Caps Lock"; - case GLFW_KEY_MENU -> "Menu"; - case GLFW_KEY_LEFT_SUPER -> "Left Super"; - case GLFW_KEY_RIGHT_SUPER -> "Right Super"; - case GLFW_KEY_ENTER -> "Enter"; - case GLFW_KEY_KP_ENTER -> "Numpad Enter"; - case GLFW_KEY_NUM_LOCK -> "Num Lock"; - case GLFW_KEY_SCROLL_LOCK -> "Scroll Lock"; - case GLFW_KEY_SPACE -> "Space"; - case GLFW_KEY_F1 -> "F1"; - case GLFW_KEY_F2 -> "F2"; - case GLFW_KEY_F3 -> "F3"; - case GLFW_KEY_F4 -> "F4"; - case GLFW_KEY_F5 -> "F5"; - case GLFW_KEY_F6 -> "F6"; - case GLFW_KEY_F7 -> "F7"; - case GLFW_KEY_F8 -> "F8"; - case GLFW_KEY_F9 -> "F9"; - case GLFW_KEY_F10 -> "F10"; - case GLFW_KEY_F11 -> "F11"; - case GLFW_KEY_F12 -> "F12"; - case GLFW_KEY_F13 -> "F13"; - case GLFW_KEY_F14 -> "F14"; - case GLFW_KEY_F15 -> "F15"; - case GLFW_KEY_F16 -> "F16"; - case GLFW_KEY_F17 -> "F17"; - case GLFW_KEY_F18 -> "F18"; - case GLFW_KEY_F19 -> "F19"; - case GLFW_KEY_F20 -> "F20"; - case GLFW_KEY_F21 -> "F21"; - case GLFW_KEY_F22 -> "F22"; - case GLFW_KEY_F23 -> "F23"; - case GLFW_KEY_F24 -> "F24"; - case GLFW_KEY_F25 -> "F25"; - default -> { - String keyName = glfwGetKeyName(key, 0); - yield keyName == null ? "Unknown" : StringUtils.capitalize(keyName); - } - }; - } - - public static String getButtonName(int button) { - return switch (button) { - case -1 -> "Unknown"; - case 0 -> "Mouse Left"; - case 1 -> "Mouse Right"; - case 2 -> "Mouse Middle"; - default -> "Mouse " + button; - }; - } - public static byte[] readBytes(InputStream in) { try { return in.readAllBytes(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index 53c51ac7af9..1c98b4fb387 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -21,6 +21,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -105,7 +106,6 @@ public static GameType getGameMode(Player player) { return playerListEntry.getGameMode(); } - @SuppressWarnings("deprecation") // Use of AbstractBlock.AbstractBlockState#blocksMovement public static boolean isAboveWater(Entity entity) { BlockPos.MutableBlockPos blockPos = entity.blockPosition().mutable(); int bottom = mc.level.getMinY(); @@ -113,7 +113,9 @@ public static boolean isAboveWater(Entity entity) { while (blockPos.getY() > bottom) { BlockState state = mc.level.getBlockState(blockPos); - if (state.blocksMotion()) break; + // todo is there a better way to replace BlockBehaviour.BlockStateBase#blocksMotion than just copy-pasting the method body? + Block block = state.getBlock(); + if (block != Blocks.COBWEB && block != Blocks.BAMBOO_SAPLING && state.isSolid()) break; Fluid fluid = state.getFluidState().getType(); if (fluid == Fluids.WATER || fluid == Fluids.FLOWING_WATER) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/simulator/ProjectileEntitySimulator.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/simulator/ProjectileEntitySimulator.java index 6daaa744112..67e7c93a955 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/simulator/ProjectileEntitySimulator.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/simulator/ProjectileEntitySimulator.java @@ -374,7 +374,8 @@ private SimulationStep getCollision() { entity -> !entity.isSpectator() && entity.isAlive() && entity.isPickable(), getToleranceMargin(), ClipContext.Block.COLLIDER, - false + false, + true ); // prevent simulating projectiles as colliding with ourselves on the first tick of movement diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/CursorStyle.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/CursorStyle.java deleted file mode 100644 index a0db6fbf835..00000000000 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/CursorStyle.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.utils.misc; - -import org.lwjgl.glfw.GLFW; - -public enum CursorStyle { - Default, - Click, - Type; - - private boolean created; - private long cursor; - - public long getGlfwCursor() { - if (!created) { - switch (this) { - case Click -> cursor = GLFW.glfwCreateStandardCursor(GLFW.GLFW_HAND_CURSOR); - case Type -> cursor = GLFW.glfwCreateStandardCursor(GLFW.GLFW_IBEAM_CURSOR); - } - - created = true; - } - - return cursor; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java index 90e05c3a119..61fa056d20c 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java @@ -5,146 +5,200 @@ package meteordevelopment.meteorclient.utils.misc; -import meteordevelopment.meteorclient.utils.Utils; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.utils.misc.input.Input; import net.minecraft.client.input.KeyEvent; import net.minecraft.client.input.MouseButtonInfo; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; -import java.util.Objects; - -import static org.lwjgl.glfw.GLFW.*; +import java.util.*; public class Keybind implements ISerializable, ICopyable { - private boolean isKey; - private int value; - private int modifiers; + public enum Modifier { + SHIFT(InputConstants.MOD_SHIFT), + CONTROL(InputConstants.MOD_CONTROL), + ALT(InputConstants.MOD_ALT), + SUPER(InputConstants.MOD_SUPER), + CAPS_LOCK(InputConstants.MOD_CAPS_LOCK), + NUM_LOCK(InputConstants.MOD_NUM_LOCK), + ; + + private static final Modifier[] VALUES = values(); + + public final int mask; + + Modifier(int mask) { + this.mask = mask; + } + + public boolean isKeyPressed() { + return switch (this) { + case CONTROL -> Input.isKeyPressed(InputConstants.KEY_LCONTROL) || Input.isKeyPressed(InputConstants.KEY_RCONTROL); + case SUPER -> false; // Input.isKeyPressed(InputConstants.KEY_LSUPER) || Input.isKeyPressed(InputConstants.KEY_RSUPER); todo figure out which key is super - maybe RGUI/LGUI? + case ALT -> Input.isKeyPressed(InputConstants.KEY_LALT) || Input.isKeyPressed(InputConstants.KEY_RALT); + case SHIFT -> Input.isKeyPressed(InputConstants.KEY_LSHIFT) || Input.isKeyPressed(InputConstants.KEY_RSHIFT); + case CAPS_LOCK -> Input.isKeyPressed(InputConstants.KEY_CAPSLOCK); + case NUM_LOCK -> Input.isKeyPressed(InputConstants.KEY_NUMLOCK); + }; + } - private Keybind(boolean isKey, int value, int modifiers) { - set(isKey, value, modifiers); + private static EnumSet fromRawValue(int modifiers) { + var result = EnumSet.noneOf(Modifier.class); + for (var mod : VALUES) { + if ((mod.mask & modifiers) != 0) result.add(mod); + } + return result; + } + } + + public InputConstants.Key key; + private final EnumSet modifiers = EnumSet.noneOf(Modifier.class); + + private Keybind(InputConstants.Key key, Collection modifiers) { + this.key = key; + this.modifiers.addAll(modifiers); } public static Keybind none() { - return new Keybind(true, GLFW_KEY_UNKNOWN, 0); + return new Keybind(InputConstants.UNKNOWN, Set.of()); + } + + public static Keybind fromKey(InputConstants.Key key) { + return new Keybind(key, Set.of()); } public static Keybind fromKey(int key) { - return new Keybind(true, key, 0); + return fromKey(keyboard(key)); } - public static Keybind fromKeys(int key, int modifiers) { - return new Keybind(true, key, modifiers); + public static Keybind fromKeys(InputConstants.Key key, Collection modifiers) { + return new Keybind(key, modifiers); } - public static Keybind fromButton(int button) { - return new Keybind(false, button, 0); + public static Keybind fromKeys(InputConstants.Key key, Modifier... modifiers) { + return fromKeys(key, Arrays.asList(modifiers)); } - public int getValue() { - return value; + public static Keybind fromKeys(int key, int modifiers) { + return fromKeys(keyboard(key), Modifier.fromRawValue(modifiers)); + } + + public static Keybind fromButton(int button) { + return fromKey(mouse(button)); } public boolean isSet() { - return value != GLFW_KEY_UNKNOWN; + return !key.equals(InputConstants.UNKNOWN); } public boolean isKey() { - return isKey; + return key.getType() != InputConstants.Type.MOUSE; } public boolean hasMods() { - return isKey && modifiers != 0; + return !modifiers.isEmpty(); + } + + public int getValue() { + return key.getValue(); + } + + public void set(InputConstants.Key key, Collection modifiers) { + this.key = key; + this.modifiers.clear(); + this.modifiers.addAll(modifiers); + } + + public void set(InputConstants.Key key, Modifier... modifiers) { + set(key, Arrays.asList(modifiers)); } public void set(boolean isKey, int value, int modifiers) { - this.isKey = isKey; - this.value = value; - this.modifiers = modifiers; + set(isKey ? keyboard(value) : mouse(value), isKey ? Modifier.fromRawValue(modifiers) : Set.of()); } @Override public Keybind set(Keybind value) { - this.isKey = value.isKey; - this.value = value.value; - this.modifiers = value.modifiers; + set(value.key, value.modifiers); return this; } public void reset() { - set(true, GLFW_KEY_UNKNOWN, 0); + set(InputConstants.UNKNOWN, Set.of()); } - public boolean canBindTo(boolean isKey, int value, int modifiers) { - if (isKey) { - if (modifiers != 0 && isKeyMod(value)) return false; - return value != GLFW_KEY_UNKNOWN && value != GLFW_KEY_ESCAPE; + public boolean canBindTo(InputConstants.Key key, Collection modifiers) { + if (key.getType() != InputConstants.Type.MOUSE) { + if (!modifiers.isEmpty() && isKeyMod(key)) return false; + return !key.equals(InputConstants.UNKNOWN) && !key.equals(keyboard(InputConstants.KEY_ESCAPE)); } - return value != GLFW_MOUSE_BUTTON_LEFT && value != GLFW_MOUSE_BUTTON_RIGHT; + + return !key.equals(mouse(InputConstants.MOUSE_BUTTON_LEFT)) && !key.equals(mouse(InputConstants.MOUSE_BUTTON_RIGHT)); + } + + public boolean canBindTo(boolean isKey, int value, int modifiers) { + return canBindTo(isKey ? keyboard(value) : mouse(value), isKey ? Modifier.fromRawValue(modifiers) : Set.of()); + } + + public boolean matches(InputConstants.Key key, Set modifiers) { + if (!isSet() || !this.key.equals(key)) return false; + return !hasMods() || this.modifiers.equals(modifiers); } public boolean matches(boolean isKey, int value, int modifiers) { - if (!this.isSet() || this.isKey != isKey) return false; - if (!hasMods()) return this.value == value; - return this.value == value && this.modifiers == modifiers; + return matches(isKey ? keyboard(value) : mouse(value), isKey ? Modifier.fromRawValue(modifiers) : Set.of()); } public boolean matches(KeyEvent input) { - return matches(true, input.key(), input.modifiers()); + return matches(InputConstants.getKey(input), Modifier.fromRawValue(input.modifiers())); } public boolean matches(MouseButtonInfo input) { - return matches(false, input.button(), 0); + return matches(mouse(input.button()), Set.of()); } public boolean isPressed() { - return isKey ? modifiersPressed() && Input.isKeyPressed(value) : Input.isButtonPressed(value); + if (key.getType() == InputConstants.Type.MOUSE) return Input.isButtonPressed(key.getValue()); + + return modifiersPressed() && Input.isKeyPressed(key.getValue()); } private boolean modifiersPressed() { if (!hasMods()) return true; - if (!isModPressed(GLFW_MOD_CONTROL, GLFW_KEY_LEFT_CONTROL, GLFW_KEY_RIGHT_CONTROL)) return false; - if (!isModPressed(GLFW_MOD_SUPER, GLFW_KEY_LEFT_SUPER, GLFW_KEY_RIGHT_SUPER)) return false; - if (!isModPressed(GLFW_MOD_ALT, GLFW_KEY_LEFT_ALT, GLFW_KEY_RIGHT_ALT)) return false; - if (!isModPressed(GLFW_MOD_SHIFT, GLFW_KEY_LEFT_SHIFT, GLFW_KEY_RIGHT_SHIFT)) return false; - - return true; - } - - private boolean isModPressed(int value, int... keys) { - if ((modifiers & value) == 0) return true; - - for (int key : keys) { - if (Input.isKeyPressed(key)) return true; + for (Modifier modifier : modifiers) { + if (!modifier.isKeyPressed()) return false; } - return false; + return true; } - private boolean isKeyMod(int key) { - return key >= GLFW_KEY_LEFT_SHIFT && key <= GLFW_KEY_RIGHT_SUPER; + private boolean isKeyMod(InputConstants.Key key) { + return key.getValue() >= InputConstants.KEY_LCONTROL && key.getValue() <= InputConstants.KEY_RGUI; } @Override public Keybind copy() { - return new Keybind(isKey, value, modifiers); + return new Keybind(key, modifiers); } @Override public String toString() { if (!isSet()) return "None"; - if (!isKey) return Utils.getButtonName(value); - if (modifiers == 0) return Utils.getKeyName(value); + if (key.getType() == InputConstants.Type.MOUSE) return key.getDisplayName().getString(); + if (modifiers.isEmpty()) return key.getDisplayName().getString(); StringBuilder label = new StringBuilder(); - if ((modifiers & GLFW_MOD_CONTROL) != 0) label.append("Ctrl + "); - if ((modifiers & GLFW_MOD_SUPER) != 0) label.append("Cmd + "); - if ((modifiers & GLFW_MOD_ALT) != 0) label.append("Alt + "); - if ((modifiers & GLFW_MOD_SHIFT) != 0) label.append("Shift + "); - if ((modifiers & GLFW_MOD_CAPS_LOCK) != 0) label.append("Caps Lock + "); - if ((modifiers & GLFW_MOD_NUM_LOCK) != 0) label.append("Num Lock + "); - label.append(Utils.getKeyName(value)); + if (modifiers.contains(Modifier.CONTROL)) label.append("Ctrl + "); + if (modifiers.contains(Modifier.SUPER)) label.append("Cmd + "); + if (modifiers.contains(Modifier.ALT)) label.append("Alt + "); + if (modifiers.contains(Modifier.SHIFT)) label.append("Shift + "); + if (modifiers.contains(Modifier.CAPS_LOCK)) label.append("Caps Lock + "); + if (modifiers.contains(Modifier.NUM_LOCK)) label.append("Num Lock + "); + label.append(key.getDisplayName().getString()); return label.toString(); } @@ -154,12 +208,12 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Keybind keybind = (Keybind) o; - return isKey == keybind.isKey && value == keybind.value && modifiers == keybind.modifiers; + return key.equals(keybind.key) && modifiers.equals(keybind.modifiers); } @Override public int hashCode() { - return Objects.hash(isKey, value, modifiers); + return Objects.hash(key, modifiers); } // Serialization @@ -168,19 +222,52 @@ public int hashCode() { public CompoundTag toTag() { CompoundTag tag = new CompoundTag(); - tag.putBoolean("isKey", isKey); - tag.putInt("value", value); - tag.putInt("modifiers", modifiers); + tag.putString("key", key.getName()); + + ListTag modifiersTag = new ListTag(); + for (Modifier modifier : modifiers) { + modifiersTag.add(StringTag.valueOf(modifier.name())); + } + tag.put("modifiers", modifiersTag); return tag; } @Override public Keybind fromTag(CompoundTag tag) { - isKey = tag.getBooleanOr("isKey", false); - value = tag.getIntOr("value", 0); - modifiers = tag.getIntOr("modifiers", 0); + if (tag.contains("key")) { + // New format: key name + modifier enum names + try { + key = InputConstants.getKey(tag.getStringOr("key", "")); + } catch (IllegalArgumentException e) { + key = InputConstants.UNKNOWN; + } + + modifiers.clear(); + ListTag modifiersTag = tag.getListOrEmpty("modifiers"); + for (int i = 0; i < modifiersTag.size(); i++) { + try { + modifiers.add(Modifier.valueOf(modifiersTag.getStringOr(i, ""))); + } catch (IllegalArgumentException ignored) {} + } + } else { + // Legacy format: raw ints (GLFW) + boolean isKey = tag.getBooleanOr("isKey", true); + int value = tag.getIntOr("value", InputConstants.UNKNOWN.getValue()); + int mods = tag.getIntOr("modifiers", 0); + + set(isKey ? keyboard(value) : mouse(value), isKey ? Modifier.fromRawValue(mods) : Set.of()); + } return this; } + + private static InputConstants.Key keyboard(int key) { + return InputConstants.Type.KEYBOARD.getOrCreate(key); + } + + private static InputConstants.Key mouse(int button) { + return InputConstants.Type.MOUSE.getOrCreate(button); + } + } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java index 72b974aa74d..27c4a2b3dd5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/Input.java @@ -5,19 +5,18 @@ package meteordevelopment.meteorclient.utils.misc.input; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.platform.cursor.CursorType; +import com.mojang.blaze3d.platform.cursor.CursorTypes; import meteordevelopment.meteorclient.gui.GuiKeyEvents; import meteordevelopment.meteorclient.mixin.KeyMappingAccessor; -import meteordevelopment.meteorclient.utils.misc.CursorStyle; import net.minecraft.client.KeyMapping; -import org.lwjgl.glfw.GLFW; - -import static meteordevelopment.meteorclient.MeteorClient.mc; public class Input { private static final boolean[] keys = new boolean[512]; private static final boolean[] buttons = new boolean[16]; - private static CursorStyle lastCursorStyle = CursorStyle.Default; + private static CursorType lastCursorStyle = CursorTypes.ARROW; private Input() { } @@ -45,7 +44,7 @@ public static boolean isPressed(KeyMapping bind) { public static boolean isKeyPressed(int key) { if (!GuiKeyEvents.canUseKeys) return false; - if (key == GLFW.GLFW_KEY_UNKNOWN) return false; + if (key == InputConstants.UNKNOWN.getValue()) return false; return key < keys.length && keys[key]; } @@ -54,19 +53,19 @@ public static boolean isButtonPressed(int button) { return button < buttons.length && buttons[button]; } - public static void setCursorStyle(CursorStyle style) { + public static void setCursorStyle(CursorType style) { if (lastCursorStyle != style) { - GLFW.glfwSetCursor(mc.getWindow().handle(), style.getGlfwCursor()); + style.select(); lastCursorStyle = style; } } public static int getModifier(int key) { return switch (key) { - case GLFW.GLFW_KEY_LEFT_SHIFT, GLFW.GLFW_KEY_RIGHT_SHIFT -> GLFW.GLFW_MOD_SHIFT; - case GLFW.GLFW_KEY_LEFT_CONTROL, GLFW.GLFW_KEY_RIGHT_CONTROL -> GLFW.GLFW_MOD_CONTROL; - case GLFW.GLFW_KEY_LEFT_ALT, GLFW.GLFW_KEY_RIGHT_ALT -> GLFW.GLFW_MOD_ALT; - case GLFW.GLFW_KEY_LEFT_SUPER, GLFW.GLFW_KEY_RIGHT_SUPER -> GLFW.GLFW_MOD_SUPER; + case InputConstants.KEY_LSHIFT, InputConstants.KEY_RSHIFT -> InputConstants.MOD_SHIFT; + case InputConstants.KEY_LCONTROL, InputConstants.KEY_RCONTROL -> InputConstants.MOD_CONTROL; + case InputConstants.KEY_LALT, InputConstants.KEY_RALT -> InputConstants.MOD_ALT; +// case InputConstants.KEY_LSUPER, InputConstants.KEY_RSUPER -> InputConstants.MOD_SUPER; default -> 0; }; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java index 33533f23d5b..a3e121451bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyAction.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.utils.misc.input; -import org.lwjgl.glfw.GLFW; +import com.mojang.blaze3d.platform.InputConstants; public enum KeyAction { Press, @@ -14,8 +14,8 @@ public enum KeyAction { public static KeyAction get(int action) { return switch (action) { - case GLFW.GLFW_PRESS -> Press; - case GLFW.GLFW_RELEASE -> Release; + case InputConstants.PRESS -> Press; + case InputConstants.RELEASE -> Release; default -> Repeat; }; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java index 337c213630f..979b516f8e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java @@ -8,13 +8,12 @@ import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.MeteorClient; import net.minecraft.client.KeyMapping; -import org.lwjgl.glfw.GLFW; public class KeyBinds { private static final KeyMapping.Category CATEGORY = KeyMapping.Category.register(MeteorClient.identifier("meteor-client")); - public static KeyMapping OPEN_GUI = new KeyMapping("key.meteor-client.open-gui", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_RIGHT_SHIFT, CATEGORY); - public static KeyMapping OPEN_COMMANDS = new KeyMapping("key.meteor-client.open-commands", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_PERIOD, CATEGORY); + public static KeyMapping OPEN_GUI = new KeyMapping("key.meteor-client.open-gui", InputConstants.Type.KEYBOARD, InputConstants.KEY_RSHIFT, CATEGORY); + public static KeyMapping OPEN_COMMANDS = new KeyMapping("key.meteor-client.open-commands", InputConstants.Type.KEYBOARD, InputConstants.KEY_PERIOD, CATEGORY); private KeyBinds() { } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java index 6a4a6599a38..265d3085cee 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/network/PacketUtils.java @@ -191,7 +191,7 @@ public class PacketUtils { builder.put("ServerboundSignUpdatePacket", GamePacketTypes.SERVERBOUND_SIGN_UPDATE); builder.put("ServerboundSpectatorActionPacket", GamePacketTypes.SERVERBOUND_SPECTATOR_ACTION); builder.put("ServerboundStatusRequestPacket", StatusPacketTypes.SERVERBOUND_STATUS_REQUEST); - builder.put("ServerboundSwingPacket", GamePacketTypes.SERVERBOUND_SWING); + builder.put("ServerboundSwingPacket", GamePacketTypes.SERVERBOUND_PUNCH); builder.put("ServerboundTeleportToEntityPacket", GamePacketTypes.SERVERBOUND_TELEPORT_TO_ENTITY); builder.put("ServerboundTestInstanceBlockActionPacket", GamePacketTypes.SERVERBOUND_TEST_INSTANCE_BLOCK_ACTION); builder.put("ServerboundUseItemOnPacket", GamePacketTypes.SERVERBOUND_USE_ITEM_ON); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java index 11119875814..e98dcbbb77b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/player/PlayerUtils.java @@ -206,7 +206,7 @@ else if (entity instanceof Player player && !Friends.get().isFriend(player) && i } // Check for beds if in nether - if (mc.level.environmentAttributes().getDimensionValue(EnvironmentAttributes.BED_RULE).explodes()) { + if (mc.level.environmentAttributes().getDimensionValue(EnvironmentAttributes.BED_RULE).destroyOnUse()) { BlockPos playerPos = mc.player.blockPosition(); int range = 6; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/CustomBannerGuiElementRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/CustomBannerGuiElementRenderer.java index 80dd3a84485..4eea7a7533b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/CustomBannerGuiElementRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/CustomBannerGuiElementRenderer.java @@ -27,12 +27,12 @@ public CustomBannerGuiElementRenderer(SpriteGetter sprites) { return CustomBannerGuiElementRenderState.class; } - protected void renderToTexture(CustomBannerGuiElementRenderState state, PoseStack matrixStack, @NonNull SubmitNodeCollector submitNodeCollector) { + protected void renderToTexture(CustomBannerGuiElementRenderState state, PoseStack poseStack, @NonNull SubmitNodeCollector submitNodeCollector) { Minecraft.getInstance().gameRenderer.lighting().setupFor(Lighting.Entry.ITEMS_FLAT); - matrixStack.translate(0.0F, 0.25F, 0.0F); + poseStack.translate(0.0F, 0.25F, 0.0F); BannerRenderer.submitPatterns( this.sprites, - matrixStack, + poseStack, submitNodeCollector, 15728880, OverlayTexture.NO_OVERLAY, @@ -40,8 +40,7 @@ protected void renderToTexture(CustomBannerGuiElementRenderState state, PoseStac 0.0F, true, state.baseColor(), - state.resultBannerPatterns(), - null + state.resultBannerPatterns() ); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java b/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java index b128e53afba..d92af6c9008 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java @@ -60,6 +60,11 @@ public VertexConsumer setUv2(int u, int v) { return this; } + @Override + public VertexConsumer setUv3(float u, float v) { + return this; + } + public VertexConsumer setNormal(float x, float y, float z) { return this; } @@ -156,6 +161,11 @@ public void setOffset(int offsetX, int offsetY, int offsetZ) { return this; } + @Override + public VertexConsumer setUv3(float u, float v) { + return this; + } + @Override public @NonNull VertexConsumer setNormal(float x, float y, float z) { return this; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java index d691c745cc1..22c5bac16df 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PeekScreen.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.utils.render; +import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.utils.Utils; @@ -20,7 +21,6 @@ import net.minecraft.world.inventory.ShulkerBoxMenu; import net.minecraft.world.item.ItemStack; import org.jspecify.annotations.NonNull; -import org.lwjgl.glfw.GLFW; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -61,7 +61,7 @@ public boolean keyPressed(@NonNull KeyEvent input) { } } - if (input.key() == GLFW.GLFW_KEY_ESCAPE || mc.options.keyInventory.matches(input)) { + if (input.key() == InputConstants.KEY_ESCAPE || mc.options.keyInventory.matches(input)) { onClose(); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java index e370a57d34d..9b9e25ee209 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/PlayerHeadTexture.java @@ -1,8 +1,8 @@ package meteordevelopment.meteorclient.utils.render; -import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.platform.TextureUtil; -import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.textures.FilterMode; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.renderer.Texture; import meteordevelopment.meteorclient.utils.network.Http; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java index 3052b4ec259..6e296f1739d 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/SimpleBlockRenderer.java @@ -14,12 +14,13 @@ import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; -import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.client.renderer.feature.phase.TranslucentFeatureRenderPhase; import net.minecraft.client.renderer.item.ItemStackRenderState; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.rendertype.RenderTypes; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.UvMapping; import net.minecraft.client.resources.model.geometry.BakedQuad; +import net.minecraft.client.resources.model.geometry.ItemQuads; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; @@ -53,9 +54,9 @@ public SubmitNodeCollection order(int i) { } }; - private static final SubmitNodeCollection MESH_NODES = new SubmitNodeCollection() { + private static final SubmitNodeCollection MESH_NODES = new SubmitNodeCollection(true, new TranslucentFeatureRenderPhase()) { @Override - public void submitModel(Model model, S state, PoseStack poseStack, RenderType renderType, int lightCoords, int overlayCoords, int tintedColor, @Nullable TextureAtlasSprite sprite, int outlineColor, ModelFeatureRenderer.@Nullable CrumblingOverlay crumblingOverlay) { + public void submitModel(final Model model, final S state, final PoseStack poseStack, final RenderType renderType, final int lightCoords, final int overlayCoords, final int tintedColor, final @Nullable UvMapping uvMapping, final int outlineColor) { if (CONSUMER.isBound()) { model.setupAnim(state); model.renderToBuffer(poseStack, CONSUMER.get(), lightCoords, overlayCoords, tintedColor); @@ -63,7 +64,7 @@ public void submitModel(Model model, S state, PoseStack poseStack } @Override - public void submitItem(PoseStack poseStack, ItemDisplayContext displayContext, int lightCoords, int overlayCoords, int outlineColor, int[] tintLayers, List quads, ItemStackRenderState.FoilType foilType) { + public void submitItem(final PoseStack poseStack, final ItemDisplayContext displayContext, final int lightCoords, final int overlayCoords, final int outlineColor, final int[] tintLayers, final ItemQuads quads, final ItemStackRenderState.FoilType foilType) { } }; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java index 948dc348081..5774d06d7ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java @@ -16,13 +16,13 @@ import net.minecraft.client.renderer.SubmitNodeStorage; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.state.EntityRenderState; -import net.minecraft.client.renderer.feature.ModelFeatureRenderer; import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.UvMapping; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -80,9 +80,8 @@ public void submitModel( int lightCoords, int overlayCoords, int tintedColor, - TextureAtlasSprite sprite, - int outlineColor, - ModelFeatureRenderer.CrumblingOverlay crumblingOverlay + final @Nullable UvMapping uvMapping, + int outlineColor ) { if (renderType.isOutline()) return; @@ -152,6 +151,11 @@ private static class MyVertexConsumer implements VertexConsumer { return this; } + @Override + public VertexConsumer setUv3(float u, float v) { + return this; + } + @Override public @NonNull VertexConsumer setNormal(float x, float y, float z) { return this; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java index 22e43dacd1f..3792f817ad5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java @@ -5,11 +5,12 @@ package meteordevelopment.meteorclient.utils.render.postprocess; -import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.platform.TextureUtil; -import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.buffers.GpuBuffer; +import com.mojang.renderpearl.api.textures.FilterMode; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.game.ResourcePacksReloadedEvent; import meteordevelopment.meteorclient.renderer.MeshRenderer; @@ -20,7 +21,7 @@ import meteordevelopment.meteorclient.utils.PostInit; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.renderer.DynamicUniformStorage; +import net.minecraft.client.renderer.DynamicGpuDataStorage; import net.minecraft.server.packs.resources.Resource; import net.minecraft.world.entity.Entity; import org.jspecify.annotations.NonNull; @@ -90,7 +91,7 @@ private static void onResourcePacksReloaded(ResourcePacksReloadedEvent event) { protected void setupPass(MeshRenderer renderer) { Color color = chams.shaderColor.get(); - renderer.uniform("ImageData", UNIFORM_STORAGE.writeUniform(new UniformData( + renderer.uniform("ImageData", UNIFORM_STORAGE.writeData(new UniformData( color.r / 255f, color.g / 255f, color.b / 255f, color.a / 255f ))); @@ -117,13 +118,13 @@ public boolean shouldDraw(Entity entity) { .putVec4() .get(); - private static final DynamicUniformStorage UNIFORM_STORAGE = new DynamicUniformStorage<>("Meteor - Image UBO", UNIFORM_SIZE, 16); + private static final DynamicGpuDataStorage UNIFORM_STORAGE = new DynamicGpuDataStorage<>("Meteor - Image UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { UNIFORM_STORAGE.endFrame(); } - private record UniformData(float r, float g, float b, float a) implements DynamicUniformStorage.DynamicUniform { + private record UniformData(float r, float g, float b, float a) implements DynamicGpuDataStorage.DynamicGpuData { @Override public void write(@NonNull ByteBuffer buffer) { Std140Builder.intoBuffer(buffer) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/EntityShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/EntityShader.java index 861b56283ae..72b2208a4c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/EntityShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/EntityShader.java @@ -1,6 +1,6 @@ package meteordevelopment.meteorclient.utils.render.postprocess; -import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; import meteordevelopment.meteorclient.mixininterface.ILevelRenderer; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java index f62321dda9f..55e371b7f63 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java @@ -5,10 +5,11 @@ package meteordevelopment.meteorclient.utils.render.postprocess; -import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; -import net.minecraft.client.renderer.DynamicUniformStorage; +import com.mojang.renderpearl.api.buffers.GpuBuffer; +import com.mojang.renderpearl.api.buffers.GpuBufferSlice; +import net.minecraft.client.renderer.DynamicGpuDataStorage; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -21,18 +22,18 @@ public class OutlineUniforms { .putFloat() .get(); - private static final DynamicUniformStorage STORAGE = new DynamicUniformStorage<>("Meteor - Outline UBO", UNIFORM_SIZE, 16); + private static final DynamicGpuDataStorage STORAGE = new DynamicGpuDataStorage<>("Meteor - Outline UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { STORAGE.endFrame(); } public static GpuBufferSlice write(int width, float fillOpacity, int shapeMode, float glowMultiplier) { - return STORAGE.writeUniform(new Data(width, fillOpacity, shapeMode, glowMultiplier)); + return STORAGE.writeData(new Data(width, fillOpacity, shapeMode, glowMultiplier)); } private record Data(int width, float fillOpacity, int shapeMode, - float glowMultiplier) implements DynamicUniformStorage.DynamicUniform { + float glowMultiplier) implements DynamicGpuDataStorage.DynamicGpuData { @Override public void write(@NonNull ByteBuffer buffer) { Std140Builder.intoBuffer(buffer) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java index bc98170544f..5c783d1a024 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java @@ -1,23 +1,24 @@ package meteordevelopment.meteorclient.utils.render.postprocess; -import com.mojang.blaze3d.GpuFormat; +import com.mojang.blaze3d.Blaze3D; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; -import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.pipeline.TextureTarget; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.renderpearl.api.GpuFormat; +import com.mojang.renderpearl.api.buffers.GpuBuffer; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.textures.FilterMode; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.renderer.MeshRenderer; -import net.minecraft.client.renderer.DynamicUniformStorage; +import net.minecraft.client.renderer.DynamicGpuDataStorage; import org.joml.Vector4f; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; import static meteordevelopment.meteorclient.MeteorClient.mc; -import static org.lwjgl.glfw.GLFW.glfwGetTime; public abstract class PostProcessShader { protected final RenderPipeline pipeline; @@ -25,8 +26,8 @@ public abstract class PostProcessShader { protected PostProcessShader(RenderPipeline pipeline) { this.pipeline = pipeline; - this.framebuffer = new TextureTarget(MeteorClient.NAME + " PostProcessShader " + this.getClass().getSimpleName(), mc.getWindow().getWidth(), mc.getWindow().getHeight(), true, - GpuFormat.RGBA8_UNORM); + this.framebuffer = new TextureTarget(MeteorClient.NAME + " PostProcessShader " + this.getClass().getSimpleName(), mc.getWindow().getWidth(), mc.getWindow().getHeight(), + GpuFormat.RGBA8_UNORM, GpuFormat.D32_FLOAT); } protected abstract boolean shouldDraw(); @@ -60,9 +61,9 @@ public void render() { .attachments(mc.gameRenderer.mainRenderTarget()) .pipeline(pipeline) .fullscreen() - .uniform("PostData", UNIFORM_STORAGE.writeUniform(new UniformData( + .uniform("PostData", UNIFORM_STORAGE.writeData(new UniformData( (float) mc.getWindow().getWidth(), (float) mc.getWindow().getHeight(), - (float) glfwGetTime() + (float) Blaze3D.getTime() ))) .sampler("u_Texture", framebuffer.getColorTextureView(), RenderSystem.getSamplerCache().getClampToEdge(FilterMode.NEAREST)); @@ -83,13 +84,14 @@ public void onResized(int width, int height) { .putFloat() .get(); - private static final DynamicUniformStorage UNIFORM_STORAGE = new DynamicUniformStorage<>("Meteor - Post UBO", UNIFORM_SIZE, 16); + // todo what should usage be? not just here but everywhere else also + private static final DynamicGpuDataStorage UNIFORM_STORAGE = new DynamicGpuDataStorage<>("Meteor - Post UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { UNIFORM_STORAGE.endFrame(); } - private record UniformData(float sizeX, float sizeY, float time) implements DynamicUniformStorage.DynamicUniform { + private record UniformData(float sizeX, float sizeY, float time) implements DynamicGpuDataStorage.DynamicGpuData { @Override public void write(@NonNull ByteBuffer buffer) { Std140Builder.intoBuffer(buffer) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BundleTooltipComponent.java b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BundleTooltipComponent.java index 6796cbce47a..b21ff54db6f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BundleTooltipComponent.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/tooltip/BundleTooltipComponent.java @@ -123,7 +123,7 @@ private void drawSelectedItemTooltip(Font font, GuiGraphicsExtractor graphics, i int j = x + width / 2 - 12; ClientTooltipComponent tooltipComponent = ClientTooltipComponent.create(text.getVisualOrderText()); graphics.tooltip( - font, List.of(tooltipComponent), j - i / 2, y - 37, DefaultTooltipPositioner.INSTANCE, itemStack.get(DataComponents.TOOLTIP_STYLE) + font, List.of(tooltipComponent), j - i / 2, y - 37, DefaultTooltipPositioner.INSTANCE, itemStack.get(DataComponents.TOOLTIP_STYLE), false ); } } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java index 80f3c9551b5..9b08a06b62b 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/world/BlockUtils.java @@ -19,7 +19,7 @@ import meteordevelopment.orbit.EventPriority; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; +import net.minecraft.network.protocol.game.ServerboundPunchPacket; import net.minecraft.tags.FluidTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -137,8 +137,8 @@ public static void interact(BlockHitResult blockHitResult, InteractionHand hand, InteractionResult result = mc.gameMode.useItemOn(mc.player, hand, blockHitResult); if (result.consumesAction()) { - if (swing) mc.player.swing(hand); - else mc.getConnection().send(new ServerboundSwingPacket(hand)); + if (swing) mc.player.swing(hand, mc.player.getItemInHand(hand).getInteractAnimation(), false); + else mc.getConnection().send(new ServerboundPunchPacket()); } mc.player.setShiftKeyDown(wasSneaking); @@ -240,7 +240,7 @@ public static boolean breakBlock(BlockPos blockPos, boolean swing) { if (!canBreak(blockPos, mc.level.getBlockState(blockPos))) return false; // Creating new instance of block pos because minecraft assigns the parameter to a field, and we don't want it to change when it has been stored in a field somewhere - BlockPos pos = blockPos instanceof BlockPos.MutableBlockPos ? new BlockPos(blockPos) : blockPos; + BlockPos pos = blockPos instanceof BlockPos.MutableBlockPos ? blockPos.immutable() : blockPos; InstantRebreak ir = Modules.get().get(InstantRebreak.class); if (ir != null && ir.isActive() && ir.blockPos.equals(pos) && ir.shouldMine()) { @@ -252,8 +252,8 @@ public static boolean breakBlock(BlockPos blockPos, boolean swing) { mc.gameMode.continueDestroyBlock(pos, getDirection(blockPos)); else mc.gameMode.startDestroyBlock(pos, getDirection(blockPos)); - if (swing) mc.player.swing(InteractionHand.MAIN_HAND); - else mc.getConnection().send(new ServerboundSwingPacket(InteractionHand.MAIN_HAND)); + if (swing) mc.player.swing(InteractionHand.MAIN_HAND, mc.player.getMainHandItem().getAttackAnimation(), false); + else mc.getConnection().send(new ServerboundPunchPacket()); breaking = true; breakingThisTick = true; diff --git a/src/main/resources/meteor-client-sodium.mixins.json b/src/main/resources/meteor-client-sodium.mixins.json index 05722eb99d1..d7744492e73 100644 --- a/src/main/resources/meteor-client-sodium.mixins.json +++ b/src/main/resources/meteor-client-sodium.mixins.json @@ -4,7 +4,6 @@ "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ - "MeshVertexConsumerMixin", "AbstractBlockRenderContextMixin", "SodiumBlockRendererMixin", "SodiumChunkBuilderMeshingTaskMixin", diff --git a/src/main/resources/meteor-client.classtweaker b/src/main/resources/meteor-client.classtweaker index 42b3247b492..66a57a1d0bc 100644 --- a/src/main/resources/meteor-client.classtweaker +++ b/src/main/resources/meteor-client.classtweaker @@ -18,17 +18,13 @@ accessible class net/minecraft/client/gui/screens/inventory/BeaconScreen$Bea # ResourceLoadStateTrackerAccessor, ReloadStateAccessor, Utils#isLoading accessible class net/minecraft/client/ResourceLoadStateTracker$ReloadState -# ExtendedRenderPipelineBuilder -accessible method com/mojang/blaze3d/pipeline/RenderPipeline$Builder ()V -accessible method com/mojang/blaze3d/pipeline/RenderPipeline$Builder withSnippet (Lcom/mojang/blaze3d/pipeline/RenderPipeline$Snippet;)V - # OutlineRenderCommandQueue#order accessible field net/minecraft/client/renderer/SubmitNodeStorage submitsPerOrder Lit/unimi/dsi/fastutil/ints/Int2ObjectAVLTreeMap; # GlCommandEncoderMixin, GlDeviceMixin -accessible class com/mojang/blaze3d/opengl/GlDevice +accessible class com/mojang/renderpearl/backend/opengl/GlDevice # GlCommandEncoderMixin -accessible class com/mojang/blaze3d/opengl/GlCommandEncoder +accessible class com/mojang/renderpearl/backend/opengl/GlCommandEncoder # AutoFish#tryCatch accessible class net/minecraft/world/entity/projectile/FishingHook$FishHookState @@ -38,8 +34,12 @@ accessible method net/minecraft/client/multiplayer/MultiPlayerGameMode startP # GuiGraphicsExtractorAccessor accessible class net/minecraft/client/gui/GuiGraphicsExtractor$ScissorStack -# WireframeEntityRenderer#getBuffer -accessible field net/minecraft/client/renderer/rendertype/RenderSetup outputTarget Lnet/minecraft/client/renderer/rendertype/OutputTarget; # ProjectileEntitySimulator#hitOrDeflect accessible method net/minecraft/world/entity/projectile/Projectile shouldBounceOnWorldBorder ()Z + +# ExtendedRenderPipelineBuilder +accessible method com/mojang/renderpearl/api/pipeline/RenderPipeline$Builder ()V + +# ItemPhysics +accessible field net/minecraft/client/renderer/item/ItemStackRenderState$LayerRenderState quads Lnet/minecraft/client/resources/model/geometry/ItemQuads; diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 0ed52d2eb88..8982a7da4fd 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -96,6 +96,8 @@ "FireworkRocketEntityMixin", "FireworksSparkParticleMixin", "FireworksSparkParticleSubMixin", + "FirstPersonHandsAndItemsMixin", + "FirstPersonHandsAndItemsRendererMixin", "FishingHookAccessor", "FishingHookMixin", "FluidRendererMixin", @@ -103,10 +105,10 @@ "FontMixin", "FoodDataMixin", "FriendlyByteBufMixin", + "FrontendGpuDeviceMixin", "GameRendererMixin", "GlCommandEncoderMixin", "GlDeviceMixin", - "GpuDeviceMixin", "GuiGraphicsExtractorAccessor", "GuiGraphicsExtractorMixin", "GuiMessageMixin", @@ -117,7 +119,6 @@ "HumanoidArmorLayerMixin", "ItemContainerContentsMixin", "ItemEntityRendererMixin", - "ItemInHandRendererMixin", "ItemMixin", "ItemRendererMixin", "ItemStackMixin", @@ -138,6 +139,7 @@ "LivingEntityAccessor", "LivingEntityMixin", "LivingEntityRendererMixin", + "LivingEntitySwingStateMixin", "LocalPlayerAccessor", "LocalPlayerMixin", "MapRendererMixin", @@ -160,6 +162,7 @@ "OptionsMixin", "PacketBundlingMixin", "ParticleEngineMixin", + "PipelineCacheAccessor", "PlayerAccessor", "PlayerInfoMixin", "PlayerMixin", From 451348c6c0db38bb396b9a6010384fd7442a6576 Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Fri, 21 Aug 2026 18:37:20 +0100 Subject: [PATCH 02/17] microfix --- .../meteorclient/mixin/AvatarRendererMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java index 1b9e6109683..29af12fc358 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java @@ -81,7 +81,7 @@ public AvatarRendererMixin(EntityRendererProvider.Context ctx, PlayerModel model @WrapWithCondition(method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeCollector;submitModelPart(Lnet/minecraft/client/model/geom/ModelPart;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/rendertype/RenderType;IILnet/minecraft/client/renderer/texture/UvMapping;)V")) private boolean renderArm$color(SubmitNodeCollector instance, ModelPart modelPart, PoseStack poseStack, RenderType renderType, int light, int uv, UvMapping uvMapping) { if (chams.isActive() && chams.hand.get()) { - instance.submitModelPart(modelPart, poseStack, renderType, light, OverlayTexture.NO_OVERLAY, uvMapping); + instance.submitModelPart(modelPart, poseStack, renderType, light, OverlayTexture.NO_OVERLAY, uvMapping, chams.handColor.get().getPacked(), 0); return false; } From a3f3c6d408713975dd1ccfee86d65fb8e5f6c5eb Mon Sep 17 00:00:00 2001 From: Wide_Cat Date: Thu, 3 Sep 2026 01:34:57 +0100 Subject: [PATCH 03/17] Update to 26.3-pre.1 Less rendering crashes, but it's all still super broken --- gradle/libs.versions.toml | 4 +- .../commands/commands/DropCommand.java | 8 +- .../meteorclient/mixin/LocalPlayerMixin.java | 7 -- .../mixin/MultiPlayerGameModeMixin.java | 6 + .../mixin/ShaderManagerMixin.java | 2 +- .../meteorclient/mixin/SkyRendererMixin.java | 2 +- .../meteorclient/renderer/MeshUniforms.java | 3 +- .../renderer/MeteorRenderPipelines.java | 116 +++++++++++------- .../renderer/MeteorVertexFormats.java | 6 +- .../systems/modules/render/HandView.java | 13 +- .../systems/modules/render/ItemPhysics.java | 7 +- .../utils/render/postprocess/ChamsShader.java | 3 +- .../render/postprocess/OutlineUniforms.java | 3 +- .../render/postprocess/PostProcessShader.java | 3 +- .../shaders/{blur.vert => blur.vsh} | 5 +- .../shaders/{blur_down.frag => blur_down.fsh} | 7 +- .../shaders/{blur_up.frag => blur_up.fsh} | 7 +- .../meteor-client/shaders/passthrough.frag | 12 -- .../meteor-client/shaders/passthrough.fsh | 13 ++ .../{passthrough.vert => passthrough.vsh} | 5 +- .../meteor-client/shaders/pos_color.frag | 9 -- .../meteor-client/shaders/pos_color.fsh | 10 ++ .../shaders/{pos_color.vert => pos_color.vsh} | 5 +- .../meteor-client/shaders/pos_tex_color.frag | 12 -- .../meteor-client/shaders/pos_tex_color.fsh | 13 ++ .../shaders/{text.vert => pos_tex_color.vsh} | 7 +- .../post-process/{base.vert => base.vsh} | 7 +- .../post-process/{image.frag => image.fsh} | 9 +- .../{outline.frag => outline.fsh} | 9 +- .../assets/meteor-client/shaders/text.frag | 12 -- .../assets/meteor-client/shaders/text.fsh | 13 ++ .../shaders/{pos_tex_color.vert => text.vsh} | 7 +- 32 files changed, 196 insertions(+), 149 deletions(-) rename src/main/resources/assets/meteor-client/shaders/{blur.vert => blur.vsh} (61%) rename src/main/resources/assets/meteor-client/shaders/{blur_down.frag => blur_down.fsh} (79%) rename src/main/resources/assets/meteor-client/shaders/{blur_up.frag => blur_up.fsh} (85%) delete mode 100644 src/main/resources/assets/meteor-client/shaders/passthrough.frag create mode 100644 src/main/resources/assets/meteor-client/shaders/passthrough.fsh rename src/main/resources/assets/meteor-client/shaders/{passthrough.vert => passthrough.vsh} (61%) delete mode 100644 src/main/resources/assets/meteor-client/shaders/pos_color.frag create mode 100644 src/main/resources/assets/meteor-client/shaders/pos_color.fsh rename src/main/resources/assets/meteor-client/shaders/{pos_color.vert => pos_color.vsh} (70%) delete mode 100644 src/main/resources/assets/meteor-client/shaders/pos_tex_color.frag create mode 100644 src/main/resources/assets/meteor-client/shaders/pos_tex_color.fsh rename src/main/resources/assets/meteor-client/shaders/{text.vert => pos_tex_color.vsh} (67%) rename src/main/resources/assets/meteor-client/shaders/post-process/{base.vert => base.vsh} (62%) rename src/main/resources/assets/meteor-client/shaders/post-process/{image.frag => image.fsh} (57%) rename src/main/resources/assets/meteor-client/shaders/post-process/{outline.frag => outline.fsh} (86%) delete mode 100644 src/main/resources/assets/meteor-client/shaders/text.frag create mode 100644 src/main/resources/assets/meteor-client/shaders/text.fsh rename src/main/resources/assets/meteor-client/shaders/{pos_tex_color.vert => text.vsh} (67%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5522abc4893..0f922fa956b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] # Fabric (https://fabricmc.net/develop) jdk = "25" -minecraft = "26.3-snapshot-9" +minecraft = "26.3-pre-1" fabric-loader = "0.19.3" -fabric-api = "0.158.0+26.3" +fabric-api = "0.159.1+26.3" # Plugins # Loom (https://github.com/FabricMC/fabric-loom) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java index 4a4f6aa1798..91d65d74eff 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java @@ -32,7 +32,7 @@ public DropCommand() { @Override public void build(LiteralArgumentBuilder builder) { // Main Hand - builder.then(literal("hand").executes(_ -> drop(player -> player.drop(true)))); + builder.then(literal("hand").executes(_ -> drop(player -> mc.gameMode.dropItem(player, true)))); // Offhand builder.then(literal("offhand").executes(_ -> drop(_ -> InvUtils.drop().slotOffhand()))); @@ -70,9 +70,7 @@ public void build(LiteralArgumentBuilder builder) { // Specific item builder.then(argument("item", ItemArgument.item(REGISTRY_ACCESS)) - .executes(context -> drop(player -> { - dropItem(player, context, Integer.MAX_VALUE); - })) + .executes(context -> drop(player -> dropItem(player, context, Integer.MAX_VALUE))) .then(argument("amount", IntegerArgumentType.integer(1)) .executes(context -> drop(player -> { int amount = IntegerArgumentType.getInteger(context, "amount"); @@ -83,7 +81,7 @@ public void build(LiteralArgumentBuilder builder) { private void dropItem(LocalPlayer player, CommandContext context, int amount) throws CommandSyntaxException { ItemStack stack = ItemArgument.getItem(context, "item").createItemStack(1); - if (stack == null || stack.getItem() == Items.AIR) throw NO_SUCH_ITEM.create(); + if (stack.getItem() == Items.AIR) throw NO_SUCH_ITEM.create(); for (int i = 0; i < player.getInventory().getContainerSize() && amount > 0; i++) { ItemStack invStack = player.getInventory().getItem(i); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java index 0ccb0017be8..cebbd842957 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java @@ -11,7 +11,6 @@ import com.llamalad7.mixinextras.sugar.Local; import com.mojang.authlib.GameProfile; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.entity.DropItemsEvent; import meteordevelopment.meteorclient.events.entity.player.PlayerTickMovementEvent; import meteordevelopment.meteorclient.events.entity.player.SendMovementPacketsEvent; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -50,12 +49,6 @@ public LocalPlayerMixin(ClientLevel world, GameProfile profile) { super(world, profile); } - @Inject(method = "drop", at = @At("HEAD"), cancellable = true) - private void onDrop(boolean all, CallbackInfo ci) { - if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(getMainHandItem())).isCancelled()) - ci.cancel(); - } - @ModifyExpressionValue(method = "handlePortalTransitionEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;screen()Lnet/minecraft/client/gui/screens/Screen;", ordinal = 0)) private Screen modifyPortalTransitionEffect(Screen original) { if (Modules.get().isActive(Portals.class)) return null; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeMixin.java index 22c3566ce8e..c2014ac42d3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeMixin.java @@ -56,6 +56,12 @@ public abstract class MultiPlayerGameModeMixin implements IMultiPlayerGameMode { @Shadow public abstract void startPrediction(ClientLevel level, PredictiveAction predictiveAction); + @Inject(method = "dropItem", at = @At("HEAD"), cancellable = true) + private void onDrop(LocalPlayer player, boolean all, CallbackInfo ci) { + if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(player.getMainHandItem())).isCancelled()) + ci.cancel(); + } + @Inject(method = "handleContainerInput", at = @At("HEAD"), cancellable = true) private void onHandleInventoryMouseClick(int containerId, int slotNum, int buttonNum, ContainerInput containerInput, Player player, CallbackInfo ci) { if (containerInput == ContainerInput.THROW && slotNum >= 0 && slotNum < player.containerMenu.slots.size()) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java index d553a829a64..37097af5ba9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java @@ -16,7 +16,7 @@ @Mixin(ShaderManager.class) public abstract class ShaderManagerMixin { - @Inject(method = "apply(Lnet/minecraft/client/renderer/ShaderManager$Configs;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ShaderManager$CompilationCache;close()V")) + @Inject(method = "apply", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ShaderManager$PostChainCache;close()V")) private void meteor$reloadPipelines(CallbackInfo ci, @Local PipelineCache pipelineCache) { MeteorRenderPipelines.precompile(pipelineCache); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java index 608d61f418d..d59ad578379 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java @@ -30,7 +30,7 @@ private void updateRenderState(ClientLevel level, float partialTicks, Camera cam if (!ambience.isActive()) return; if (ambience.endSky.get()) state.skybox = DimensionType.Skybox.END; - if (ambience.customSkyColor.get()) state.skyColor = ambience.skyColor().getPacked(); + if (ambience.customSkyColor.get()) state.skyColor = ambience.skyColor().getVec3f(); } @WrapOperation(method = "renderEndSky", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/DynamicGpuData;writeTransform(Lorg/joml/Matrix4f;)Lcom/mojang/renderpearl/api/buffers/GpuBufferSlice;")) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java index a910f1faac3..d105bc63541 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java @@ -10,6 +10,7 @@ import com.mojang.renderpearl.api.buffers.GpuBuffer; import com.mojang.renderpearl.api.buffers.GpuBufferSlice; import net.minecraft.client.renderer.DynamicGpuDataStorage; +import net.minecraft.client.renderer.DynamicGpuDataStorageMapped; import org.joml.Matrix4f; import org.jspecify.annotations.NonNull; @@ -23,7 +24,7 @@ public class MeshUniforms { private static final Data DATA = new Data(); - private static final DynamicGpuDataStorage STORAGE = new DynamicGpuDataStorage<>("Meteor - Mesh UBO", SIZE, GpuBuffer.USAGE_UNIFORM, 16); + private static final DynamicGpuDataStorage STORAGE = new DynamicGpuDataStorageMapped<>("Meteor - Mesh UBO", SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { STORAGE.endFrame(); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java index 5248cce5954..79cd02c698c 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java @@ -7,19 +7,24 @@ import com.mojang.blaze3d.pipeline.PipelineCache; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.renderpearl.api.device.GpuDevice; import com.mojang.renderpearl.api.pipeline.*; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.mixin.PipelineCacheAccessor; +import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ShaderManager; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; import org.apache.commons.io.IOUtils; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; public abstract class MeteorRenderPipelines { private static final List PIPELINES = new ArrayList<>(); @@ -38,9 +43,9 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/world_colored")) - .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) + .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) + .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) @@ -50,9 +55,9 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED_LINES = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLineSmooth() .withLocation(MeteorClient.identifier("pipeline/world_colored_lines")) - .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) - .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) + .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) + .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) @@ -61,9 +66,9 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED_DEPTH = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/world_colored_depth")) - .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) + .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) + .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(DepthStencilState.DEFAULT.depthTest(), false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) @@ -73,9 +78,9 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED_LINES_DEPTH = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLineSmooth() .withLocation(MeteorClient.identifier("pipeline/world_colored_lines_depth")) - .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) - .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) + .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) + .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(DepthStencilState.DEFAULT.depthTest(), false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) @@ -87,8 +92,8 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline UI_COLORED = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_colored")) .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) + .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -98,8 +103,8 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline UI_COLORED_LINES = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_colored_lines")) .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) - .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) + .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -109,9 +114,11 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline UI_TEXTURED = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_textured")) .withVertexBinding(0, MeteorVertexFormats.POS2_TEXTURE_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/pos_tex_color.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/pos_tex_color.frag")) - .withBindGroupLayout(BindGroupLayout.builder()/*.withSampler("u_Texture")*/.build()) + .withVertexShader(MeteorClient.identifier("shaders/pos_tex_color.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/pos_tex_color.fsh")) + .withBindGroupLayout(BindGroupLayout.builder() + .withUniform("u_Texture", UniformType.COMBINED_IMAGE_SAMPLER) + .build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -121,9 +128,11 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline UI_TEXT = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_text")) .withVertexBinding(0, MeteorVertexFormats.POS2_TEXTURE_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/text.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/text.frag")) - .withBindGroupLayout(BindGroupLayout.builder()/*.withSampler("u_Texture")*/.build()) + .withVertexShader(MeteorClient.identifier("shaders/text.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/text.fsh")) + .withBindGroupLayout(BindGroupLayout.builder() + .withUniform("u_Texture", UniformType.COMBINED_IMAGE_SAMPLER) + .build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -135,10 +144,10 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline POST_OUTLINE = add(new ExtendedRenderPipelineBuilder() .withLocation(MeteorClient.identifier("pipeline/post/outline")) .withVertexBinding(0, MeteorVertexFormats.POS2).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/post-process/outline.frag")) + .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/post-process/outline.fsh")) .withBindGroupLayout(BindGroupLayout.builder() - /*.withSampler("u_Texture")*/ + .withUniform("u_Texture", UniformType.COMBINED_IMAGE_SAMPLER) .withUniform("PostData", UniformType.UNIFORM_BUFFER) .withUniform("OutlineData", UniformType.UNIFORM_BUFFER) .build()) @@ -151,11 +160,11 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline POST_IMAGE = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/post/image")) .withVertexBinding(0, MeteorVertexFormats.POS2).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/post-process/image.frag")) + .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/post-process/image.fsh")) .withBindGroupLayout(BindGroupLayout.builder() - /*.withSampler("u_Texture")*/ -// .withSampler("u_TextureI") + .withUniform("u_Texture", UniformType.COMBINED_IMAGE_SAMPLER) + .withUniform("u_TextureI", UniformType.COMBINED_IMAGE_SAMPLER) .withUniform("PostData", UniformType.UNIFORM_BUFFER) .withUniform("ImageData", UniformType.UNIFORM_BUFFER) .build()) @@ -170,10 +179,10 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline BLUR_DOWN = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/blur/down")) .withVertexBinding(0, MeteorVertexFormats.POS2).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/blur.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/blur_down.frag")) + .withVertexShader(MeteorClient.identifier("shaders/blur.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/blur_down.fsh")) .withBindGroupLayout(BindGroupLayout.builder() - /*.withSampler("u_Texture")*/ + .withUniform("u_Texture", UniformType.COMBINED_IMAGE_SAMPLER) .withUniform("BlurData", UniformType.UNIFORM_BUFFER) .build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) @@ -185,10 +194,10 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline BLUR_UP = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/blur/up")) .withVertexBinding(0, MeteorVertexFormats.POS2).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/blur.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/blur_up.frag")) + .withVertexShader(MeteorClient.identifier("shaders/blur.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/blur_up.fsh")) .withBindGroupLayout(BindGroupLayout.builder() - /*.withSampler("u_Texture")*/ + .withUniform("u_Texture", UniformType.COMBINED_IMAGE_SAMPLER) .withUniform("BlurData", UniformType.UNIFORM_BUFFER) .build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) @@ -200,9 +209,9 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline BLUR_PASSTHROUGH = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/blur/up")) .withVertexBinding(0, MeteorVertexFormats.POS2).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) - .withVertexShader(MeteorClient.identifier("shaders/passthrough.vert")) - .withFragmentShader(MeteorClient.identifier("shaders/passthrough.frag")) - .withBindGroupLayout(BindGroupLayout.builder()/*.withSampler("u_Texture")*/.build()) + .withVertexShader(MeteorClient.identifier("shaders/passthrough.vsh")) + .withFragmentShader(MeteorClient.identifier("shaders/passthrough.fsh")) + .withBindGroupLayout(BindGroupLayout.builder().withUniform("u_Texture", UniformType.COMBINED_IMAGE_SAMPLER).build()) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) @@ -219,19 +228,36 @@ public static void precompile(PipelineCache cache) { GpuDevice device = RenderSystem.getDevice(); ResourceManager resources = Minecraft.getInstance().getResourceManager(); - - for (RenderPipeline pipeline : PIPELINES) { - CompiledRenderPipeline newPipeline = device.compilePipeline(pipeline, (identifier, _) -> { - var resource = resources.getResource(identifier).get(); + final Map includes = ShaderManager.listAllIncludes(resources); + ShaderSource shaderSource = new ShaderSource() { + @Override + public @Nullable String getShader(Identifier id, ShaderType type) { + var resource = resources.getResource(id).get(); try (var in = resource.open()) { return IOUtils.toString(in, StandardCharsets.UTF_8); } catch (IOException e) { throw new RuntimeException(e); } - }); + } + + @Override + public @Nullable CachedIncludeSource getInclude(Identifier id) { + return includes.get(id); + } + + @Override + public void close() { + includes.values().forEach(ShaderSource.CachedIncludeSource::close); + } + }; + + for (RenderPipeline pipeline : PIPELINES) { + CompletableFuture pendingPipeline = device.compilePipeline(pipeline, shaderSource, MeteorExecutor.executor); - pipelineAccessor.getCache().put(pipeline, newPipeline); + try (CompiledRenderPipeline newPipeline = pendingPipeline.join().finishCompile()) { + pipelineAccessor.getCache().put(pipeline, newPipeline); + } } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java index 48f7f91503f..80fad688eeb 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java @@ -15,18 +15,18 @@ public abstract class MeteorVertexFormats { // POS2: 2D position (x, y) public static final VertexFormat POS2 = VertexFormat.builder(STEP_RATE) - .addAttribute("Position", GpuFormat.RG32_FLOAT) // 2 floats (x, y) + .addAttribute("Position", GpuFormat.RGBA32_FLOAT) // 2 floats (x, y) .build(); // POS2_COLOR: 2D position + RGBA color (4 bytes, normalized) public static final VertexFormat POS2_COLOR = VertexFormat.builder(STEP_RATE) - .addAttribute("Position", GpuFormat.RG32_FLOAT) // 2 floats (x, y) + .addAttribute("Position", GpuFormat.RGBA32_FLOAT) // 2 floats (x, y) .addAttribute("Color", GpuFormat.RGBA8_UNORM) // 4 bytes (RGBA, 0-255) .build(); // POS2_TEXTURE_COLOR: 2D position + UV texture coords + RGBA color public static final VertexFormat POS2_TEXTURE_COLOR = VertexFormat.builder(STEP_RATE) - .addAttribute("Position", GpuFormat.RG32_FLOAT) // 2 floats (x, y) + .addAttribute("Position", GpuFormat.RGBA32_FLOAT) // 2 floats (x, y) .addAttribute("Texture", GpuFormat.RG32_FLOAT) // 2 floats (u, v) .addAttribute("Color", GpuFormat.RGBA8_UNORM) // 4 bytes (RGBA, 0-255) .build(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java index 484818ef6b5..4ab2dfdb685 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/HandView.java @@ -15,6 +15,7 @@ import meteordevelopment.meteorclient.utils.player.Rotations; import meteordevelopment.orbit.EventHandler; import net.minecraft.world.InteractionHand; +import org.joml.Matrix4f; import org.joml.Vector3d; public class HandView extends Module { @@ -178,6 +179,8 @@ public class HandView extends Module { .build() ); + private final Matrix4f matrix4f = new Matrix4f(); + public HandView() { super(Categories.Render, "hand-view", "Alters the way items are rendered in your hands."); } @@ -207,9 +210,9 @@ private void onRenderArm(ArmRenderEvent event) { } private void rotate(PoseStack matrix, Vector3d rotation) { - matrix.mulPose(Axis.XP.rotationDegrees((float) rotation.x)); - matrix.mulPose(Axis.YP.rotationDegrees((float) rotation.y)); - matrix.mulPose(Axis.ZP.rotationDegrees((float) rotation.z)); + matrix.mulPose(Axis.XP.rotateDegrees(this.matrix4f, (float) rotation.x)); + matrix.mulPose(Axis.YP.rotateDegrees(this.matrix4f, (float) rotation.y)); + matrix.mulPose(Axis.ZP.rotateDegrees(this.matrix4f, (float) rotation.z)); } private void scale(PoseStack matrix, Vector3d scale) { @@ -221,8 +224,8 @@ private void translate(PoseStack matrix, Vector3d translation) { } private void applyServerRotations(PoseStack matrix) { - matrix.mulPose(Axis.XP.rotationDegrees(mc.player.getXRot() - Rotations.serverPitch)); - matrix.mulPose(Axis.YP.rotationDegrees(mc.player.getYRot() - Rotations.serverYaw)); + matrix.mulPose(Axis.XP.rotateDegrees(this.matrix4f, mc.player.getXRot() - Rotations.serverPitch)); + matrix.mulPose(Axis.YP.rotateDegrees(this.matrix4f, mc.player.getYRot() - Rotations.serverYaw)); } public boolean oldAnimations() { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java index b2eb6cc0e5e..12b51b8658f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ItemPhysics.java @@ -23,6 +23,7 @@ import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.item.ItemEntity; +import org.joml.Matrix4f; import org.joml.Vector3f; import org.joml.Vector3fc; @@ -43,6 +44,8 @@ public class ItemPhysics extends Module { private final RandomSource random = RandomSource.createThreadLocalInstance(); private boolean skipTransformation; + private final Matrix4f matrix4f = new Matrix4f(); + public ItemPhysics() { super(Categories.Render, "item-physics", "Applies physics to items on the ground."); } @@ -68,7 +71,7 @@ private void onRenderItemEntity(RenderItemEntityEvent event) { offsetInWater(matrices, event.itemEntity); if (info.flat) { - matrices.mulPose(Axis.XP.rotationDegrees(90)); + matrices.mulPose(Axis.XP.rotateDegrees(matrix4f, 90)); matrices.translate(0, 0, info.offsetZ); } @@ -87,7 +90,7 @@ private void onRenderItemEntity(RenderItemEntityEvent event) { float degrees = (random.nextFloat() * 2 - 1) * 90; matrices.translate(x, y, z); - matrices.mulPose(axis.rotationDegrees(degrees)); + matrices.mulPose(axis.rotateDegrees(matrix4f, degrees)); matrices.translate(-x, -y, -z); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java index 3792f817ad5..5e9e346dc66 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java @@ -22,6 +22,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; import net.minecraft.client.renderer.DynamicGpuDataStorage; +import net.minecraft.client.renderer.DynamicGpuDataStorageMapped; import net.minecraft.server.packs.resources.Resource; import net.minecraft.world.entity.Entity; import org.jspecify.annotations.NonNull; @@ -118,7 +119,7 @@ public boolean shouldDraw(Entity entity) { .putVec4() .get(); - private static final DynamicGpuDataStorage UNIFORM_STORAGE = new DynamicGpuDataStorage<>("Meteor - Image UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); + private static final DynamicGpuDataStorage UNIFORM_STORAGE = new DynamicGpuDataStorageMapped<>("Meteor - Image UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { UNIFORM_STORAGE.endFrame(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java index 55e371b7f63..dbca96e7a64 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/OutlineUniforms.java @@ -10,6 +10,7 @@ import com.mojang.renderpearl.api.buffers.GpuBuffer; import com.mojang.renderpearl.api.buffers.GpuBufferSlice; import net.minecraft.client.renderer.DynamicGpuDataStorage; +import net.minecraft.client.renderer.DynamicGpuDataStorageMapped; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; @@ -22,7 +23,7 @@ public class OutlineUniforms { .putFloat() .get(); - private static final DynamicGpuDataStorage STORAGE = new DynamicGpuDataStorage<>("Meteor - Outline UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); + private static final DynamicGpuDataStorage STORAGE = new DynamicGpuDataStorageMapped<>("Meteor - Outline UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { STORAGE.endFrame(); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java index 5c783d1a024..248e3a2d273 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java @@ -13,6 +13,7 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.renderer.MeshRenderer; import net.minecraft.client.renderer.DynamicGpuDataStorage; +import net.minecraft.client.renderer.DynamicGpuDataStorageMapped; import org.joml.Vector4f; import org.jspecify.annotations.NonNull; @@ -85,7 +86,7 @@ public void onResized(int width, int height) { .get(); // todo what should usage be? not just here but everywhere else also - private static final DynamicGpuDataStorage UNIFORM_STORAGE = new DynamicGpuDataStorage<>("Meteor - Post UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); + private static final DynamicGpuDataStorage UNIFORM_STORAGE = new DynamicGpuDataStorageMapped<>("Meteor - Post UBO", UNIFORM_SIZE, GpuBuffer.USAGE_UNIFORM, 16); public static void flipFrame() { UNIFORM_STORAGE.endFrame(); diff --git a/src/main/resources/assets/meteor-client/shaders/blur.vert b/src/main/resources/assets/meteor-client/shaders/blur.vsh similarity index 61% rename from src/main/resources/assets/meteor-client/shaders/blur.vert rename to src/main/resources/assets/meteor-client/shaders/blur.vsh index 334da5f4825..6de00d66ac6 100644 --- a/src/main/resources/assets/meteor-client/shaders/blur.vert +++ b/src/main/resources/assets/meteor-client/shaders/blur.vsh @@ -1,10 +1,11 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require precision lowp float; layout (location = 0) in vec2 Position; -out vec2 uv; +layout (location = 0) out vec2 uv; void main() { gl_Position = vec4(Position, 0.0, 1.0); diff --git a/src/main/resources/assets/meteor-client/shaders/blur_down.frag b/src/main/resources/assets/meteor-client/shaders/blur_down.fsh similarity index 79% rename from src/main/resources/assets/meteor-client/shaders/blur_down.frag rename to src/main/resources/assets/meteor-client/shaders/blur_down.fsh index 1b1fcbe0847..25040e51cce 100644 --- a/src/main/resources/assets/meteor-client/shaders/blur_down.frag +++ b/src/main/resources/assets/meteor-client/shaders/blur_down.fsh @@ -1,9 +1,10 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require precision lowp float; -in vec2 uv; -out vec4 color; +layout (location = 0) in vec2 uv; +layout (location = 0) out vec4 color; uniform sampler2D u_Texture; diff --git a/src/main/resources/assets/meteor-client/shaders/blur_up.frag b/src/main/resources/assets/meteor-client/shaders/blur_up.fsh similarity index 85% rename from src/main/resources/assets/meteor-client/shaders/blur_up.frag rename to src/main/resources/assets/meteor-client/shaders/blur_up.fsh index 45a133ce227..b46aeee324e 100644 --- a/src/main/resources/assets/meteor-client/shaders/blur_up.frag +++ b/src/main/resources/assets/meteor-client/shaders/blur_up.fsh @@ -1,9 +1,10 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require precision lowp float; -in vec2 uv; -out vec4 color; +layout (location = 0) in vec2 uv; +layout (location = 0) out vec4 color; uniform sampler2D u_Texture; diff --git a/src/main/resources/assets/meteor-client/shaders/passthrough.frag b/src/main/resources/assets/meteor-client/shaders/passthrough.frag deleted file mode 100644 index f3483ed833d..00000000000 --- a/src/main/resources/assets/meteor-client/shaders/passthrough.frag +++ /dev/null @@ -1,12 +0,0 @@ -#version 330 core - -precision lowp float; - -in vec2 uv; -out vec4 color; - -uniform sampler2D u_Texture; - -void main() { - color = texture(u_Texture, uv); -} diff --git a/src/main/resources/assets/meteor-client/shaders/passthrough.fsh b/src/main/resources/assets/meteor-client/shaders/passthrough.fsh new file mode 100644 index 00000000000..78f37aca679 --- /dev/null +++ b/src/main/resources/assets/meteor-client/shaders/passthrough.fsh @@ -0,0 +1,13 @@ +#version 330 +#extension GL_ARB_separate_shader_objects : require + +precision lowp float; + +layout (location = 0) in vec2 uv; +layout (location = 0) out vec4 color; + +uniform sampler2D u_Texture; + +void main() { + color = texture(u_Texture, uv); +} diff --git a/src/main/resources/assets/meteor-client/shaders/passthrough.vert b/src/main/resources/assets/meteor-client/shaders/passthrough.vsh similarity index 61% rename from src/main/resources/assets/meteor-client/shaders/passthrough.vert rename to src/main/resources/assets/meteor-client/shaders/passthrough.vsh index 334da5f4825..6de00d66ac6 100644 --- a/src/main/resources/assets/meteor-client/shaders/passthrough.vert +++ b/src/main/resources/assets/meteor-client/shaders/passthrough.vsh @@ -1,10 +1,11 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require precision lowp float; layout (location = 0) in vec2 Position; -out vec2 uv; +layout (location = 0) out vec2 uv; void main() { gl_Position = vec4(Position, 0.0, 1.0); diff --git a/src/main/resources/assets/meteor-client/shaders/pos_color.frag b/src/main/resources/assets/meteor-client/shaders/pos_color.frag deleted file mode 100644 index 567156e0fb2..00000000000 --- a/src/main/resources/assets/meteor-client/shaders/pos_color.frag +++ /dev/null @@ -1,9 +0,0 @@ -#version 330 core - -out vec4 color; - -in vec4 v_Color; - -void main() { - color = v_Color; -} diff --git a/src/main/resources/assets/meteor-client/shaders/pos_color.fsh b/src/main/resources/assets/meteor-client/shaders/pos_color.fsh new file mode 100644 index 00000000000..3301fd7b1c9 --- /dev/null +++ b/src/main/resources/assets/meteor-client/shaders/pos_color.fsh @@ -0,0 +1,10 @@ +#version 330 +#extension GL_ARB_separate_shader_objects : require + +layout (location = 0) out vec4 color; + +layout (location = 0) in vec4 v_Color; + +void main() { + color = v_Color; +} diff --git a/src/main/resources/assets/meteor-client/shaders/pos_color.vert b/src/main/resources/assets/meteor-client/shaders/pos_color.vsh similarity index 70% rename from src/main/resources/assets/meteor-client/shaders/pos_color.vert rename to src/main/resources/assets/meteor-client/shaders/pos_color.vsh index a5cc401b772..b872a1604e7 100644 --- a/src/main/resources/assets/meteor-client/shaders/pos_color.vert +++ b/src/main/resources/assets/meteor-client/shaders/pos_color.vsh @@ -1,4 +1,5 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require layout (location = 0) in vec4 Position; layout (location = 1) in vec4 Color; @@ -8,7 +9,7 @@ layout (std140) uniform MeshData { mat4 u_ModelView; }; -out vec4 v_Color; +layout (location = 0) out vec4 v_Color; void main() { gl_Position = u_Proj * u_ModelView * Position; diff --git a/src/main/resources/assets/meteor-client/shaders/pos_tex_color.frag b/src/main/resources/assets/meteor-client/shaders/pos_tex_color.frag deleted file mode 100644 index 1aa3d3eff09..00000000000 --- a/src/main/resources/assets/meteor-client/shaders/pos_tex_color.frag +++ /dev/null @@ -1,12 +0,0 @@ -#version 330 core - -out vec4 color; - -uniform sampler2D u_Texture; - -in vec2 v_TexCoord; -in vec4 v_Color; - -void main() { - color = texture(u_Texture, v_TexCoord) * v_Color; -} diff --git a/src/main/resources/assets/meteor-client/shaders/pos_tex_color.fsh b/src/main/resources/assets/meteor-client/shaders/pos_tex_color.fsh new file mode 100644 index 00000000000..5acc8e85228 --- /dev/null +++ b/src/main/resources/assets/meteor-client/shaders/pos_tex_color.fsh @@ -0,0 +1,13 @@ +#version 330 +#extension GL_ARB_separate_shader_objects : require + +layout (location = 0) out vec4 color; + +uniform sampler2D u_Texture; + +layout (location = 0) in vec2 v_TexCoord; +layout (location = 1) in vec4 v_Color; + +void main() { + color = texture(u_Texture, v_TexCoord) * v_Color; +} diff --git a/src/main/resources/assets/meteor-client/shaders/text.vert b/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vsh similarity index 67% rename from src/main/resources/assets/meteor-client/shaders/text.vert rename to src/main/resources/assets/meteor-client/shaders/pos_tex_color.vsh index 429facab50b..2e31ed23827 100644 --- a/src/main/resources/assets/meteor-client/shaders/text.vert +++ b/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vsh @@ -1,4 +1,5 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require layout (location = 0) in vec4 Position; layout (location = 1) in vec2 Texture; @@ -9,8 +10,8 @@ layout (std140) uniform MeshData { mat4 u_ModelView; }; -out vec2 v_TexCoord; -out vec4 v_Color; +layout (location = 0) out vec2 v_TexCoord; +layout (location = 1) out vec4 v_Color; void main() { gl_Position = u_Proj * u_ModelView * Position; diff --git a/src/main/resources/assets/meteor-client/shaders/post-process/base.vert b/src/main/resources/assets/meteor-client/shaders/post-process/base.vsh similarity index 62% rename from src/main/resources/assets/meteor-client/shaders/post-process/base.vert rename to src/main/resources/assets/meteor-client/shaders/post-process/base.vsh index b1cd1bcf16c..0fd857bf574 100644 --- a/src/main/resources/assets/meteor-client/shaders/post-process/base.vert +++ b/src/main/resources/assets/meteor-client/shaders/post-process/base.vsh @@ -1,4 +1,5 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require layout (location = 0) in vec2 Position; @@ -7,8 +8,8 @@ layout (std140) uniform PostData { float u_Time; }; -out vec2 v_TexCoord; -out vec2 v_OneTexel; +layout (location = 0) out vec2 v_TexCoord; +layout (location = 1) out vec2 v_OneTexel; void main() { gl_Position = vec4(Position, 0.0, 1.0); diff --git a/src/main/resources/assets/meteor-client/shaders/post-process/image.frag b/src/main/resources/assets/meteor-client/shaders/post-process/image.fsh similarity index 57% rename from src/main/resources/assets/meteor-client/shaders/post-process/image.frag rename to src/main/resources/assets/meteor-client/shaders/post-process/image.fsh index 5116ad6a553..6b795f96d1c 100644 --- a/src/main/resources/assets/meteor-client/shaders/post-process/image.frag +++ b/src/main/resources/assets/meteor-client/shaders/post-process/image.fsh @@ -1,7 +1,8 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require -in vec2 v_TexCoord; -in vec2 v_OneTexel; +layout (location = 0) in vec2 v_TexCoord; +layout (location = 1) in vec2 v_OneTexel; uniform sampler2D u_Texture; uniform sampler2D u_TextureI; @@ -10,7 +11,7 @@ layout (std140) uniform ImageData { vec4 u_Color; }; -out vec4 color; +layout (location = 0) out vec4 color; void main() { if (texture(u_Texture, v_TexCoord).a == 0.0) discard; diff --git a/src/main/resources/assets/meteor-client/shaders/post-process/outline.frag b/src/main/resources/assets/meteor-client/shaders/post-process/outline.fsh similarity index 86% rename from src/main/resources/assets/meteor-client/shaders/post-process/outline.frag rename to src/main/resources/assets/meteor-client/shaders/post-process/outline.fsh index bcbacbd8b0a..048de677581 100644 --- a/src/main/resources/assets/meteor-client/shaders/post-process/outline.frag +++ b/src/main/resources/assets/meteor-client/shaders/post-process/outline.fsh @@ -1,7 +1,8 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require -in vec2 v_TexCoord; -in vec2 v_OneTexel; +layout (location = 0) in vec2 v_TexCoord; +layout (location = 1) in vec2 v_OneTexel; uniform sampler2D u_Texture; @@ -12,7 +13,7 @@ layout (std140) uniform OutlineData { float glowMultiplier; } u_Outline; -out vec4 color; +layout (location = 0) out vec4 color; void main() { vec4 center = texture(u_Texture, v_TexCoord); diff --git a/src/main/resources/assets/meteor-client/shaders/text.frag b/src/main/resources/assets/meteor-client/shaders/text.frag deleted file mode 100644 index ceeb34e0917..00000000000 --- a/src/main/resources/assets/meteor-client/shaders/text.frag +++ /dev/null @@ -1,12 +0,0 @@ -#version 330 core - -out vec4 color; - -uniform sampler2D u_Texture; - -in vec2 v_TexCoord; -in vec4 v_Color; - -void main() { - color = vec4(1.0, 1.0, 1.0, texture(u_Texture, v_TexCoord).r) * v_Color; -} diff --git a/src/main/resources/assets/meteor-client/shaders/text.fsh b/src/main/resources/assets/meteor-client/shaders/text.fsh new file mode 100644 index 00000000000..89f0685d991 --- /dev/null +++ b/src/main/resources/assets/meteor-client/shaders/text.fsh @@ -0,0 +1,13 @@ +#version 330 +#extension GL_ARB_separate_shader_objects : require + +layout (location = 0) out vec4 color; + +uniform sampler2D u_Texture; + +layout (location = 0) in vec2 v_TexCoord; +layout (location = 1) in vec4 v_Color; + +void main() { + color = vec4(1.0, 1.0, 1.0, texture(u_Texture, v_TexCoord).r) * v_Color; +} diff --git a/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vert b/src/main/resources/assets/meteor-client/shaders/text.vsh similarity index 67% rename from src/main/resources/assets/meteor-client/shaders/pos_tex_color.vert rename to src/main/resources/assets/meteor-client/shaders/text.vsh index 429facab50b..2e31ed23827 100644 --- a/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vert +++ b/src/main/resources/assets/meteor-client/shaders/text.vsh @@ -1,4 +1,5 @@ -#version 330 core +#version 330 +#extension GL_ARB_separate_shader_objects : require layout (location = 0) in vec4 Position; layout (location = 1) in vec2 Texture; @@ -9,8 +10,8 @@ layout (std140) uniform MeshData { mat4 u_ModelView; }; -out vec2 v_TexCoord; -out vec4 v_Color; +layout (location = 0) out vec2 v_TexCoord; +layout (location = 1) out vec4 v_Color; void main() { gl_Position = u_Proj * u_ModelView * Position; From a64a4cf520d999361f514d23e0e040a9a10ca8ef Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Thu, 3 Sep 2026 16:28:44 +0200 Subject: [PATCH 04/17] Fix rendering --- .../mixin/PipelineCacheAccessor.java | 20 ------------ .../mixin/ShaderManagerMixin.java | 2 +- .../meteorclient/renderer/MeshRenderer.java | 31 ++++++++++++++----- .../renderer/MeteorRenderPipelines.java | 19 ++++++------ .../renderer/MeteorVertexFormats.java | 6 ++-- .../meteor-client/shaders/pos_color.vsh | 12 +++++-- .../meteor-client/shaders/pos_tex_color.vsh | 4 +-- .../assets/meteor-client/shaders/text.vsh | 4 +-- src/main/resources/meteor-client.mixins.json | 1 - 9 files changed, 51 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java deleted file mode 100644 index 5876c6dfabb..00000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PipelineCacheAccessor.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixin; - -import com.mojang.blaze3d.pipeline.PipelineCache; -import com.mojang.renderpearl.api.pipeline.CompiledRenderPipeline; -import com.mojang.renderpearl.api.pipeline.RenderPipeline; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Map; - -@Mixin(PipelineCache.class) -public interface PipelineCacheAccessor { - @Accessor("cache") - Map getCache(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java index 37097af5ba9..8af617f664e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java @@ -17,7 +17,7 @@ @Mixin(ShaderManager.class) public abstract class ShaderManagerMixin { @Inject(method = "apply", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ShaderManager$PostChainCache;close()V")) - private void meteor$reloadPipelines(CallbackInfo ci, @Local PipelineCache pipelineCache) { + private void meteor$reloadPipelines(CallbackInfo ci, @Local(ordinal = 0) PipelineCache pipelineCache) { MeteorRenderPipelines.precompile(pipelineCache); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java index e91491b225d..6e9bf852654 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java @@ -147,7 +147,6 @@ public void end() { : (int) (indexBuffer != null ? indexBuffer.length() / indexType.bytes : -1); if (indexCount > 0) { - if (Utils.rendering3D || matrix != null) { RenderSystem.getModelViewStack().pushMatrix(); } @@ -165,8 +164,11 @@ public void end() { : Optional.empty(); CommandEncoder encoder = RenderSystem.getDevice().createCommandEncoder(); - GpuBufferSlice vertexBuffer = mesh != null ? mesh.uploadVertexBuffer(encoder) : Objects.requireNonNull(this.vertexBuffer); - GpuBufferSlice indexBuffer = mesh != null ? mesh.uploadIndexBuffer(encoder) : Objects.requireNonNull(this.indexBuffer); + + GpuBufferSlice vertexBuffer = mesh != null ? mesh.getVertexBuffer().slice() : Objects.requireNonNull(this.vertexBuffer); + GpuBufferSlice indexBuffer = mesh != null ? mesh.getIndexBuffer().slice() : Objects.requireNonNull(this.indexBuffer); + + int vertexOffset = getVertexOffset(vertexBuffer); int firstIndex = getFirstIndex(indexBuffer); GpuBufferSlice meshData = MeshUniforms.write(RenderUtils.projection, RenderSystem.getModelViewStack()); @@ -182,18 +184,23 @@ public void end() { pass.setUniform(entry.getKey(), entry.getValue()); } -// for (var entry : samplers.entrySet()) { -// pass.bindTexture(entry.getKey(), entry.getValue().textureView, entry.getValue().sampler); -// } + for (var entry : samplers.entrySet()) { + pass.setUniform(entry.getKey(), entry.getValue().textureView, entry.getValue().sampler); + } pass.setVertexBuffer(0, vertexBuffer); pass.setIndexBuffer(indexBuffer.buffer(), indexType); - pass.drawIndexed(indexCount, 1, firstIndex, 0, 0); + pass.drawIndexed(indexCount, 1, 0, 0, 0); } if (Utils.rendering3D || matrix != null) { RenderSystem.getModelViewStack().popMatrix(); } + + if (mesh != null) { + vertexBuffer.buffer().close(); + indexBuffer.buffer().close(); + } } colorAttachment = null; @@ -211,6 +218,16 @@ public void end() { taken = false; } + private int getVertexOffset(GpuBufferSlice vertexBuffer) { + var size = pipeline.getVertexFormatBinding(0).getVertexSize(); + + if (vertexBuffer.offset() % size != 0) { + throw new IllegalArgumentException("Vertex buffer offset must be aligned to " + size + " bytes."); + } + + return Math.toIntExact(vertexBuffer.offset() / size); + } + private int getFirstIndex(GpuBufferSlice indexBuffer) { if (indexBuffer.offset() % indexType.bytes != 0) { throw new IllegalArgumentException("Index buffer offset must be aligned to " + indexType.bytes + " bytes."); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java index 79cd02c698c..9fc2935d31c 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java @@ -7,10 +7,10 @@ import com.mojang.blaze3d.pipeline.PipelineCache; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.renderpearl.api.device.GpuDevice; import com.mojang.renderpearl.api.pipeline.*; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.mixin.PipelineCacheAccessor; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ShaderManager; @@ -43,7 +43,7 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/world_colored")) - .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) + .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) @@ -55,7 +55,7 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED_LINES = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLineSmooth() .withLocation(MeteorClient.identifier("pipeline/world_colored_lines")) - .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) + .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) @@ -66,7 +66,7 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED_DEPTH = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/world_colored_depth")) - .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) + .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(DepthStencilState.DEFAULT.depthTest(), false)) @@ -78,7 +78,7 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED_LINES_DEPTH = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLineSmooth() .withLocation(MeteorClient.identifier("pipeline/world_colored_lines_depth")) - .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) + .withVertexBinding(0, DefaultVertexFormat.POSITION_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) .withDepthStencilState(new DepthStencilState(DepthStencilState.DEFAULT.depthTest(), false)) @@ -94,6 +94,7 @@ public abstract class MeteorRenderPipelines { .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) + .withShaderDefine("UI") .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -105,6 +106,7 @@ public abstract class MeteorRenderPipelines { .withVertexBinding(0, MeteorVertexFormats.POS2_COLOR).withPrimitiveTopology(PrimitiveTopology.DEBUG_LINES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vsh")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.fsh")) + .withShaderDefine("UI") .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) @@ -224,8 +226,6 @@ private static RenderPipeline add(RenderPipeline pipeline) { } public static void precompile(PipelineCache cache) { - PipelineCacheAccessor pipelineAccessor = (PipelineCacheAccessor) cache; - GpuDevice device = RenderSystem.getDevice(); ResourceManager resources = Minecraft.getInstance().getResourceManager(); final Map includes = ShaderManager.listAllIncludes(resources); @@ -255,9 +255,8 @@ public void close() { for (RenderPipeline pipeline : PIPELINES) { CompletableFuture pendingPipeline = device.compilePipeline(pipeline, shaderSource, MeteorExecutor.executor); - try (CompiledRenderPipeline newPipeline = pendingPipeline.join().finishCompile()) { - pipelineAccessor.getCache().put(pipeline, newPipeline); - } + CompiledRenderPipeline compiled = pendingPipeline.join().finishCompile(); + cache.insert(pipeline, compiled); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java index 80fad688eeb..48f7f91503f 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormats.java @@ -15,18 +15,18 @@ public abstract class MeteorVertexFormats { // POS2: 2D position (x, y) public static final VertexFormat POS2 = VertexFormat.builder(STEP_RATE) - .addAttribute("Position", GpuFormat.RGBA32_FLOAT) // 2 floats (x, y) + .addAttribute("Position", GpuFormat.RG32_FLOAT) // 2 floats (x, y) .build(); // POS2_COLOR: 2D position + RGBA color (4 bytes, normalized) public static final VertexFormat POS2_COLOR = VertexFormat.builder(STEP_RATE) - .addAttribute("Position", GpuFormat.RGBA32_FLOAT) // 2 floats (x, y) + .addAttribute("Position", GpuFormat.RG32_FLOAT) // 2 floats (x, y) .addAttribute("Color", GpuFormat.RGBA8_UNORM) // 4 bytes (RGBA, 0-255) .build(); // POS2_TEXTURE_COLOR: 2D position + UV texture coords + RGBA color public static final VertexFormat POS2_TEXTURE_COLOR = VertexFormat.builder(STEP_RATE) - .addAttribute("Position", GpuFormat.RGBA32_FLOAT) // 2 floats (x, y) + .addAttribute("Position", GpuFormat.RG32_FLOAT) // 2 floats (x, y) .addAttribute("Texture", GpuFormat.RG32_FLOAT) // 2 floats (u, v) .addAttribute("Color", GpuFormat.RGBA8_UNORM) // 4 bytes (RGBA, 0-255) .build(); diff --git a/src/main/resources/assets/meteor-client/shaders/pos_color.vsh b/src/main/resources/assets/meteor-client/shaders/pos_color.vsh index b872a1604e7..77298e42dff 100644 --- a/src/main/resources/assets/meteor-client/shaders/pos_color.vsh +++ b/src/main/resources/assets/meteor-client/shaders/pos_color.vsh @@ -1,7 +1,15 @@ #version 330 #extension GL_ARB_separate_shader_objects : require -layout (location = 0) in vec4 Position; +#ifdef UI + #define pos_vec vec2 + #define pos_vec_to_vec4(vec) vec4(vec, 0.0, 1.0) +#else + #define pos_vec vec3 + #define pos_vec_to_vec4(vec) vec4(vec, 1.0) +#endif + +layout (location = 0) in pos_vec Position; layout (location = 1) in vec4 Color; layout (std140) uniform MeshData { @@ -12,7 +20,7 @@ layout (std140) uniform MeshData { layout (location = 0) out vec4 v_Color; void main() { - gl_Position = u_Proj * u_ModelView * Position; + gl_Position = u_Proj * u_ModelView * pos_vec_to_vec4(Position); v_Color = Color; } diff --git a/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vsh b/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vsh index 2e31ed23827..95ead1a0638 100644 --- a/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vsh +++ b/src/main/resources/assets/meteor-client/shaders/pos_tex_color.vsh @@ -1,7 +1,7 @@ #version 330 #extension GL_ARB_separate_shader_objects : require -layout (location = 0) in vec4 Position; +layout (location = 0) in vec2 Position; layout (location = 1) in vec2 Texture; layout (location = 2) in vec4 Color; @@ -14,7 +14,7 @@ layout (location = 0) out vec2 v_TexCoord; layout (location = 1) out vec4 v_Color; void main() { - gl_Position = u_Proj * u_ModelView * Position; + gl_Position = u_Proj * u_ModelView * vec4(Position, 0.0, 1.0); v_TexCoord = Texture; v_Color = Color; diff --git a/src/main/resources/assets/meteor-client/shaders/text.vsh b/src/main/resources/assets/meteor-client/shaders/text.vsh index 2e31ed23827..95ead1a0638 100644 --- a/src/main/resources/assets/meteor-client/shaders/text.vsh +++ b/src/main/resources/assets/meteor-client/shaders/text.vsh @@ -1,7 +1,7 @@ #version 330 #extension GL_ARB_separate_shader_objects : require -layout (location = 0) in vec4 Position; +layout (location = 0) in vec2 Position; layout (location = 1) in vec2 Texture; layout (location = 2) in vec4 Color; @@ -14,7 +14,7 @@ layout (location = 0) out vec2 v_TexCoord; layout (location = 1) out vec4 v_Color; void main() { - gl_Position = u_Proj * u_ModelView * Position; + gl_Position = u_Proj * u_ModelView * vec4(Position, 0.0, 1.0); v_TexCoord = Texture; v_Color = Color; diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 8982a7da4fd..f5523560625 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -162,7 +162,6 @@ "OptionsMixin", "PacketBundlingMixin", "ParticleEngineMixin", - "PipelineCacheAccessor", "PlayerAccessor", "PlayerInfoMixin", "PlayerMixin", From 7a0c4032dcdac91af3968ff8c96de5fb096eba3d Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Thu, 3 Sep 2026 16:31:34 +0200 Subject: [PATCH 05/17] Forgot about this --- .../meteorclient/renderer/MeshRenderer.java | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java index 6e9bf852654..8707ad9fda2 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java @@ -165,10 +165,9 @@ public void end() { CommandEncoder encoder = RenderSystem.getDevice().createCommandEncoder(); - GpuBufferSlice vertexBuffer = mesh != null ? mesh.getVertexBuffer().slice() : Objects.requireNonNull(this.vertexBuffer); - GpuBufferSlice indexBuffer = mesh != null ? mesh.getIndexBuffer().slice() : Objects.requireNonNull(this.indexBuffer); + GpuBufferSlice vertexBuffer = mesh != null ? mesh.uploadVertexBuffer(encoder) : Objects.requireNonNull(this.vertexBuffer); + GpuBufferSlice indexBuffer = mesh != null ? mesh.uploadIndexBuffer(encoder) : Objects.requireNonNull(this.indexBuffer); - int vertexOffset = getVertexOffset(vertexBuffer); int firstIndex = getFirstIndex(indexBuffer); GpuBufferSlice meshData = MeshUniforms.write(RenderUtils.projection, RenderSystem.getModelViewStack()); @@ -190,17 +189,12 @@ public void end() { pass.setVertexBuffer(0, vertexBuffer); pass.setIndexBuffer(indexBuffer.buffer(), indexType); - pass.drawIndexed(indexCount, 1, 0, 0, 0); + pass.drawIndexed(indexCount, 1, firstIndex, 0, 0); } if (Utils.rendering3D || matrix != null) { RenderSystem.getModelViewStack().popMatrix(); } - - if (mesh != null) { - vertexBuffer.buffer().close(); - indexBuffer.buffer().close(); - } } colorAttachment = null; @@ -218,16 +212,6 @@ public void end() { taken = false; } - private int getVertexOffset(GpuBufferSlice vertexBuffer) { - var size = pipeline.getVertexFormatBinding(0).getVertexSize(); - - if (vertexBuffer.offset() % size != 0) { - throw new IllegalArgumentException("Vertex buffer offset must be aligned to " + size + " bytes."); - } - - return Math.toIntExact(vertexBuffer.offset() / size); - } - private int getFirstIndex(GpuBufferSlice indexBuffer) { if (indexBuffer.offset() % indexType.bytes != 0) { throw new IllegalArgumentException("Index buffer offset must be aligned to " + indexType.bytes + " bytes."); From c951120d4811f5a440cd48279f5fbe1f44f9cb6a Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 10 Oct 2026 16:13:31 +0200 Subject: [PATCH 06/17] Update to 26.3 --- gradle/libs.versions.toml | 18 ++++++++-------- gradle/wrapper/gradle-wrapper.properties | 7 ++----- .../commands/commands/NotebotCommand.java | 5 +++-- .../gui/screens/CommitsScreen.java | 11 +++++----- .../meteorclient/mixin/ClientLevelMixin.java | 4 ++-- .../viafabricplus/GeneralSettingsMixin.java | 21 ------------------- .../systems/accounts/MicrosoftLogin.java | 5 +++-- .../hud/elements/keyboard/KeyboardHud.java | 15 ++++++------- .../systems/modules/misc/DiscordPresence.java | 5 +++-- .../systems/modules/misc/swarm/Swarm.java | 6 ++++-- .../meteorclient/utils/misc/Keybind.java | 6 +++--- .../utils/misc/input/KeyBinds.java | 4 ++-- .../render/postprocess/PostProcessShader.java | 2 +- .../meteor-client-viafabricplus.mixins.json | 1 - 14 files changed, 46 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0eaa256716f..21ff870bf1a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] # Fabric (https://fabricmc.net/develop) jdk = "25" -minecraft = "26.3-pre-1" -fabric-loader = "0.19.3" -fabric-api = "0.159.1+26.3" +minecraft = "26.3" +fabric-loader = "0.19.5" +fabric-api = "0.162.0+26.3" # Plugins # Loom (https://github.com/FabricMC/fabric-loom) -loom = "1.17-SNAPSHOT" +loom = "1.18-SNAPSHOT" # Error Prone Plugin (https://github.com/tbroyer/gradle-errorprone-plugin) errorprone-plugin = "5.1.1" @@ -15,13 +15,13 @@ errorprone-plugin = "5.1.1" # Baritone (https://github.com/MeteorDevelopment/baritone) baritone = "26.1-SNAPSHOT" # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium = "mc26.2-0.9.1-fabric" +sodium = "mc26.3-0.9.2-fabric" # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium = "mc26.2-0.25.2-fabric" +lithium = "mc26.3-0.26.2-fabric" # Iris (https://github.com/IrisShaders/Iris) -iris = "1.11.2+26.2-fabric" +iris = "1.11.7+26.3-fabric" # ModMenu (https://github.com/TerraformersMC/ModMenu) -modmenu = "20.0.1" +modmenu = "21.0.0" # Orbit (https://github.com/MeteorDevelopment/orbit) orbit = "0.2.4" # Starscript (https://github.com/MeteorDevelopment/starscript) @@ -33,7 +33,7 @@ reflections = "0.10.2" # Netty (https://github.com/netty/netty) netty = "4.2.15.Final" # ViaFabricPlus (https://github.com/ViaVersion/ViaFabricPlus) -viafabricplus = "4.6.1" +viafabricplus = "5.1.1" # WaybackAuthLib (https://github.com/florianreuth/WaybackAuthLib) waybackauthlib = "1.1.0" # MinecraftAuth (https://github.com/RaphiMC/MinecraftAuth) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a9db11550c6..059a1ed7e85 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,9 +1,6 @@ +#Sat Oct 10 15:53:10 CEST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip -networkTimeout=10000 -retries=0 -retryBackOffMs=500 -validateDistributionUrl=true +distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index 6f3bb0350b3..cc13cedf45f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.commands.commands; +import com.mojang.blaze3d.Blaze3D; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; @@ -24,11 +25,11 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundSoundPacket; import net.minecraft.sounds.SoundEvent; -import net.minecraft.util.Util; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import java.io.FileWriter; import java.io.IOException; +import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -48,7 +49,7 @@ public NotebotCommand() { @Override public void build(LiteralArgumentBuilder builder) { builder.then(literal("help").executes(_ -> { - Util.getPlatform().openUri("https://github.com/MeteorDevelopment/meteor-client/wiki/Notebot-Guide"); + Blaze3D.openUri(URI.create("https://github.com/MeteorDevelopment/meteor-client/wiki/Notebot-Guide")); return SINGLE_SUCCESS; })); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java index b045d95641a..c0c6243a6ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui.screens; +import com.mojang.blaze3d.Blaze3D; import meteordevelopment.meteorclient.addons.GithubRepo; import meteordevelopment.meteorclient.addons.MeteorAddon; import meteordevelopment.meteorclient.gui.GuiTheme; @@ -13,8 +14,8 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WTable; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import net.minecraft.util.Util; +import java.net.URI; import java.net.http.HttpResponse; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; @@ -66,11 +67,11 @@ private void populateHeader(String headerMessage) { l.add(theme.label(headerMessage)).expandX(); String website = addon.getWebsite(); - if (website != null) l.add(theme.button("Website")).widget().action = () -> Util.getPlatform().openUri(website); + if (website != null) l.add(theme.button("Website")).widget().action = () -> Blaze3D.openUri(URI.create(website)); l.add(theme.button("GitHub")).widget().action = () -> { GithubRepo repo = addon.getRepo(); - Util.getPlatform().openUri(String.format("https://github.com/%s/tree/%s", repo.getOwnerName(), repo.branch())); + Blaze3D.openUri(URI.create(String.format("https://github.com/%s/tree/%s", repo.getOwnerName(), repo.branch()))); }; } @@ -91,7 +92,7 @@ private void populateError() { l.add(theme.label("Consider using an authentication token: ")).expandX(); l.add(theme.button("Authorization Guide")).widget().action = () -> { - Util.getPlatform().openUri("https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens"); + Blaze3D.openUri(URI.create("https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens")); }; } @@ -115,7 +116,7 @@ private void populateCommits() { String date = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(commit.commit.committer.date)); t.add(theme.label(date)).top().right().widget().color = theme.textSecondaryColor(); - t.add(theme.label(getMessage(commit))).widget().action = () -> Util.getPlatform().openUri(String.format("https://github.com/%s/commit/%s", addon.getRepo().getOwnerName(), commit.sha)); + t.add(theme.label(getMessage(commit))).widget().action = () -> Blaze3D.openUri(URI.create(String.format("https://github.com/%s/commit/%s", addon.getRepo().getOwnerName(), commit.sha))); t.row(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientLevelMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientLevelMixin.java index 9f0135be996..78d16a1c38a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientLevelMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientLevelMixin.java @@ -64,8 +64,8 @@ private void onAddDestroyBlockEffect(BlockPos pos, BlockState blockState, Callba if (Modules.get().get(NoRender.class).noParticle(ParticleTypes.BLOCK)) ci.cancel(); } - @Inject(method = "addBreakingBlockEffect", at = @At("HEAD"), cancellable = true) - private void onAddBlockBreakingParticles(BlockPos pos, Direction direction, CallbackInfo ci) { + @Inject(method = "addBreakingBlockEffects", at = @At("HEAD"), cancellable = true) + private void onAddBlockBreakingParticles(BlockPos pos, Direction direction, boolean playSound, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noParticle(ParticleTypes.BLOCK)) ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java deleted file mode 100644 index eaa997feab3..00000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/viafabricplus/GeneralSettingsMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixin.viafabricplus; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.viaversion.viafabricplus.settings.impl.GeneralSettings; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(GeneralSettings.class) -public abstract class GeneralSettingsMixin { - // specifies the '2' value on this line: - // public final ModeSetting multiplayerScreenButtonOrientation = new ModeSetting(this, Text.translatable("general_settings.viafabricplus.multiplayer_screen_button_orientation"), 2, ORIENTATION_OPTIONS); - @ModifyExpressionValue(method = "", at = @At(value = "CONSTANT", args = "intValue=2", ordinal = 1), remap = false) - private int modifyDefaultPosition(int original) { - return 4; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java index e32fe1e561b..3e5254e09eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.systems.accounts; +import com.mojang.blaze3d.Blaze3D; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import net.minecraft.util.Util; import net.raphimc.minecraftauth.MinecraftAuth; import net.raphimc.minecraftauth.java.JavaAuthManager; import net.raphimc.minecraftauth.java.model.MinecraftProfile; @@ -19,6 +19,7 @@ import net.raphimc.minecraftauth.msa.service.impl.DeviceCodeMsaAuthService; import org.jspecify.annotations.Nullable; +import java.net.URI; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -54,7 +55,7 @@ public static String getRefreshToken(Consumer callback) { .login(DeviceCodeMsaAuthService::new, (Consumer) deviceCode -> { String urlString = deviceCode.getDirectVerificationUri(); urlFuture.complete(urlString); - Util.getPlatform().openUri(urlString); + Blaze3D.openUri(URI.create(urlString)); }); MsaToken msaToken = authManager.getMsaToken().getUpToDate(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java index 3ecb8f757fd..82124b222e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/KeyboardHud.java @@ -38,6 +38,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; +import org.lwjgl.sdl.SDLKeycode; import java.util.ArrayList; import java.util.Iterator; @@ -380,7 +381,7 @@ private void buildAnsiLayout(LayoutContext l) { double xPos = 0; keys.add(l.key(Keybind.fromKey(KEY_LCONTROL), xPos, row5, KeyDimensions.CTRL)); xPos += l.px(KeyDimensions.CTRL) + l.keyGap; - keys.add(l.key(Keybind.fromKey(KEY_LSUPER), xPos, row5, KeyDimensions.GUI)); + keys.add(l.key(Keybind.fromKey(KEY_LGUI), xPos, row5, KeyDimensions.GUI)); xPos += l.px(KeyDimensions.GUI) + l.keyGap; keys.add(l.key(Keybind.fromKey(KEY_LALT), xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; @@ -388,9 +389,9 @@ private void buildAnsiLayout(LayoutContext l) { xPos += l.px(KeyDimensions.SPACEBAR) + l.keyGap; keys.add(l.key(Keybind.fromKey(KEY_RALT), xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; - keys.add(l.key(Keybind.fromKey(KEY_RSUPER), xPos, row5, KeyDimensions.GUI)); + keys.add(l.key(Keybind.fromKey(KEY_RGUI), xPos, row5, KeyDimensions.GUI)); xPos += l.px(KeyDimensions.GUI) + l.keyGap; - keys.add(l.key(Keybind.fromKey(KEY_MENU), xPos, row5, KeyDimensions.MENU)); + keys.add(l.key(Keybind.fromKey(SDLKeycode.SDLK_MENU), xPos, row5, KeyDimensions.MENU)); xPos += l.px(KeyDimensions.MENU) + l.keyGap; keys.add(l.key(Keybind.fromKey(KEY_RCONTROL), xPos, row5, KeyDimensions.CTRL)); keys.add(l.key(Keybind.fromKey(KEY_LEFT), l.ux(15.5), row5)); @@ -451,7 +452,7 @@ private void buildIsoLayout(LayoutContext l) { // Row 4: LShift, ISO \| key, ZXCV..., RShift, Up keys.add(l.key(Keybind.fromKey(KEY_LSHIFT), 0, row4, KeyDimensions.LEFT_SHIFT_ISO)); double lShiftEnd = l.px(KeyDimensions.LEFT_SHIFT_ISO) + l.keyGap; - keys.add(l.key(Keybind.fromKey(KEY_WORLD_2), lShiftEnd, row4)); + //keys.add(l.key(Keybind.fromKey(KEY_WORLD_2), lShiftEnd, row4)); TODO: wtf is WORLD_2 int[] row4Keys = {KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_SLASH}; for (int i = 0; i < row4Keys.length; i++) @@ -465,7 +466,7 @@ private void buildIsoLayout(LayoutContext l) { double xPos = 0; keys.add(l.key(Keybind.fromKey(KEY_LCONTROL), xPos, row5, KeyDimensions.CTRL)); xPos += l.px(KeyDimensions.CTRL) + l.keyGap; - keys.add(l.key(Keybind.fromKey(KEY_LSUPER), xPos, row5, KeyDimensions.GUI)); + keys.add(l.key(Keybind.fromKey(KEY_LGUI), xPos, row5, KeyDimensions.GUI)); xPos += l.px(KeyDimensions.GUI) + l.keyGap; keys.add(l.key(Keybind.fromKey(KEY_LALT), xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; @@ -473,9 +474,9 @@ private void buildIsoLayout(LayoutContext l) { xPos += l.px(KeyDimensions.SPACEBAR) + l.keyGap; keys.add(l.keyNamed(Keybind.fromKey(KEY_RALT), "AltGr", xPos, row5, KeyDimensions.ALT)); xPos += l.px(KeyDimensions.ALT) + l.keyGap; - keys.add(l.key(Keybind.fromKey(KEY_RSUPER), xPos, row5, KeyDimensions.GUI)); + keys.add(l.key(Keybind.fromKey(KEY_RGUI), xPos, row5, KeyDimensions.GUI)); xPos += l.px(KeyDimensions.GUI) + l.keyGap; - keys.add(l.key(Keybind.fromKey(KEY_MEN), xPos, row5, KeyDimensions.MENU)); + keys.add(l.key(Keybind.fromKey(SDLKeycode.SDLK_MENU), xPos, row5, KeyDimensions.MENU)); xPos += l.px(KeyDimensions.MENU) + l.keyGap; keys.add(l.key(Keybind.fromKey(KEY_RCONTROL), xPos, row5, KeyDimensions.CTRL)); keys.add(l.key(Keybind.fromKey(KEY_LEFT), l.ux(15.5), row5)); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java index a8dda6dab0d..01de40a4f28 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/DiscordPresence.java @@ -7,6 +7,7 @@ //Created by squidoodly +import com.mojang.blaze3d.Blaze3D; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import meteordevelopment.discordipc.DiscordIPC; import meteordevelopment.discordipc.RichPresence; @@ -34,9 +35,9 @@ import net.minecraft.client.gui.screens.worldselection.EditWorldScreen; import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen; import net.minecraft.realms.RealmsScreen; -import net.minecraft.util.Util; import org.meteordev.starscript.Script; +import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -288,7 +289,7 @@ private void onOpenScreen(OpenScreenEvent event) { @Override public WWidget getWidget(GuiTheme theme) { WButton help = theme.button("Open documentation."); - help.action = () -> Util.getPlatform().openUri("https://github.com/MeteorDevelopment/meteor-client/wiki/Starscript"); + help.action = () -> Blaze3D.openUri(URI.create("https://github.com/MeteorDevelopment/meteor-client/wiki/Starscript")); return help; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java index c3c5317c5f3..ef06a936e79 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/swarm/Swarm.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.misc.swarm; +import com.mojang.blaze3d.Blaze3D; import meteordevelopment.meteorclient.events.game.GameJoinedEvent; import meteordevelopment.meteorclient.events.game.GameLeftEvent; import meteordevelopment.meteorclient.events.world.TickEvent; @@ -17,7 +18,8 @@ import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.orbit.EventHandler; -import net.minecraft.util.Util; + +import java.net.URI; public class Swarm extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -72,7 +74,7 @@ public WWidget getWidget(GuiTheme theme) { stop.action = this::close; WButton guide = list.add(theme.button("Guide")).expandX().widget(); - guide.action = () -> Util.getPlatform().openUri("https://github.com/MeteorDevelopment/meteor-client/wiki/Swarm-Guide"); + guide.action = () -> Blaze3D.openUri(URI.create("https://github.com/MeteorDevelopment/meteor-client/wiki/Swarm-Guide")); return list; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java index 4141ecfe423..662f05f05a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java @@ -36,7 +36,7 @@ public enum Modifier { public boolean isKeyPressed() { return switch (this) { case CONTROL -> Input.isKeyPressed(InputConstants.KEY_LCONTROL) || Input.isKeyPressed(InputConstants.KEY_RCONTROL); - case SUPER -> Input.isKeyPressed(InputConstants.KEY_LSUPER) || Input.isKeyPressed(InputConstants.KEY_RSUPER); + case SUPER -> Input.isKeyPressed(InputConstants.KEY_LGUI) || Input.isKeyPressed(InputConstants.KEY_RGUI); case ALT -> Input.isKeyPressed(InputConstants.KEY_LALT) || Input.isKeyPressed(InputConstants.KEY_RALT); case SHIFT -> Input.isKeyPressed(InputConstants.KEY_LSHIFT) || Input.isKeyPressed(InputConstants.KEY_RSHIFT); case CAPS_LOCK -> Input.isKeyPressed(InputConstants.KEY_CAPSLOCK); @@ -180,7 +180,7 @@ private boolean modifiersPressed() { } private boolean isKeyMod(InputConstants.Key key) { - return key.getValue() >= InputConstants.KEY_LSHIFT && key.getValue() <= InputConstants.KEY_RSUPER; + return key.getValue() >= InputConstants.KEY_LALT && key.getValue() <= InputConstants.KEY_RGUI; } @Override @@ -266,7 +266,7 @@ public Keybind fromTag(CompoundTag tag) { } private static InputConstants.Key keyboard(int key) { - return InputConstants.Type.KEYSYM.getOrCreate(key); + return InputConstants.Type.KEYBOARD.getOrCreate(key); } private static InputConstants.Key mouse(int button) { diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java index aec7375bbd6..979b516f8e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/input/KeyBinds.java @@ -12,8 +12,8 @@ public class KeyBinds { private static final KeyMapping.Category CATEGORY = KeyMapping.Category.register(MeteorClient.identifier("meteor-client")); - public static KeyMapping OPEN_GUI = new KeyMapping("key.meteor-client.open-gui", InputConstants.Type.KEYSYM, InputConstants.KEY_RSHIFT, CATEGORY); - public static KeyMapping OPEN_COMMANDS = new KeyMapping("key.meteor-client.open-commands", InputConstants.Type.KEYSYM, InputConstants.KEY_PERIOD, CATEGORY); + public static KeyMapping OPEN_GUI = new KeyMapping("key.meteor-client.open-gui", InputConstants.Type.KEYBOARD, InputConstants.KEY_RSHIFT, CATEGORY); + public static KeyMapping OPEN_COMMANDS = new KeyMapping("key.meteor-client.open-commands", InputConstants.Type.KEYBOARD, InputConstants.KEY_PERIOD, CATEGORY); private KeyBinds() { } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java index e7bfaf03638..43029b13e51 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/PostProcessShader.java @@ -12,9 +12,9 @@ import com.mojang.renderpearl.api.textures.FilterMode; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.renderer.MeshRenderer; +import net.minecraft.client.gui.render.GuiRenderer; import net.minecraft.client.renderer.DynamicGpuDataStorage; import net.minecraft.client.renderer.DynamicGpuDataStorageMapped; -import org.joml.Vector4f; import org.jspecify.annotations.NonNull; import java.nio.ByteBuffer; diff --git a/src/main/resources/meteor-client-viafabricplus.mixins.json b/src/main/resources/meteor-client-viafabricplus.mixins.json index 38868b7bcdb..8bc17408060 100644 --- a/src/main/resources/meteor-client-viafabricplus.mixins.json +++ b/src/main/resources/meteor-client-viafabricplus.mixins.json @@ -4,7 +4,6 @@ "compatibilityLevel": "JAVA_21", "plugin": "meteordevelopment.meteorclient.MixinPlugin", "client": [ - "GeneralSettingsMixin" ], "injectors": { "defaultRequire": 1 From 2d203f3071c75f906fceea8965804e762d1cf075 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sun, 11 Oct 2026 09:44:26 +0200 Subject: [PATCH 07/17] Fix not being able to type in GUIs --- .../java/meteordevelopment/meteorclient/gui/WidgetScreen.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java index 49b7c0ab4af..f38ca464863 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java @@ -106,6 +106,8 @@ protected void init() { firstInit = false; initWidgets(); } + + mc.textInputManager().startTextInput(this); } public abstract void initWidgets(); @@ -357,6 +359,8 @@ public void removed() { if (parent != null) { SDLMouse.SDL_WarpMouseInWindow(mc.getWindow().handle(), (float) restoreX, (float) restoreY); } + + mc.textInputManager().stopTextInput(this); }; } } From 9afdbe805139dfaefea98983f287b691b374effa Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sun, 11 Oct 2026 19:41:15 +0200 Subject: [PATCH 08/17] fix(26.3): resolve update compatibility and resource warnings --- .../commands/commands/LocateCommand.java | 12 ++++++------ .../commands/commands/SaveMapCommand.java | 2 -- .../gui/DefaultSettingsWidgetFactory.java | 2 -- .../meteorclient/gui/screens/NotebotSongsScreen.java | 4 ++-- .../meteorclient/gui/screens/ProxiesScreen.java | 2 -- .../meteorclient/gui/tabs/builtin/ProfilesTab.java | 3 --- .../meteorclient/mixin/ChatComponentMixin.java | 2 +- .../mixin/ClientPacketListenerMixin.java | 4 ++-- .../mixin/FirstPersonHandsAndItemsMixin.java | 4 ++-- .../mixin/FirstPersonHandsAndItemsRendererMixin.java | 3 ++- .../meteorclient/mixin/LevelExtractorMixin.java | 2 +- .../mixin/LivingEntitySwingStateMixin.java | 2 +- .../meteorclient/mixin/ShaderManagerMixin.java | 4 ++-- .../meteorclient/renderer/MeteorRenderPipelines.java | 5 +++-- .../meteorclient/utils/misc/Keybind.java | 3 ++- .../render/MeshBuilderVertexConsumerProvider.java | 2 +- .../utils/render/WireframeEntityRenderer.java | 2 +- .../utils/render/postprocess/ChamsShader.java | 8 ++++---- 18 files changed, 30 insertions(+), 36 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index 7b3cb1e1d3b..9d5aa0b0a81 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -78,7 +78,7 @@ public void build(LiteralArgumentBuilder builder) { ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponents.ITEM_NAME) == null - || !stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("filled_map.buried_treasure").getString())) { + || !stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("item.minecraft.buried_treasure_map").getString())) { error("You need to hold a (highlight)buried treasure map(default)!"); return SINGLE_SUCCESS; } @@ -108,8 +108,8 @@ public void build(LiteralArgumentBuilder builder) { ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack.getItem() != Items.FILLED_MAP || stack.get(DataComponents.ITEM_NAME) == null - || !stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("filled_map.mansion").getString())) { - error("You need to hold a (highlight)woodland explorer map(default)!"); + || !stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("item.minecraft.woodland_mansion_map").getString())) { + error("You need to hold a (highlight)woodland mansion map(default)!"); return SINGLE_SUCCESS; } @@ -138,7 +138,7 @@ public void build(LiteralArgumentBuilder builder) { ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack.getItem() == Items.FILLED_MAP && stack.get(DataComponents.ITEM_NAME) != null - && stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("filled_map.monument").getString())) { + && stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("item.minecraft.ocean_monument_map").getString())) { MapDecorations mapDecorationsComponent = stack.get(DataComponents.MAP_DECORATIONS); if (mapDecorationsComponent == null) { @@ -165,7 +165,7 @@ public void build(LiteralArgumentBuilder builder) { if (BaritoneUtils.IS_AVAILABLE) { Vec3 coords = findByBlockList(monumentBlocks); if (coords == null) { - error("No monument found. Try using an (highlight)ocean explorer map(default) for more success."); + error("No monument found. Try using an (highlight)ocean monument map(default) for more success."); return SINGLE_SUCCESS; } MutableComponent text = Component.literal("Monument located at "); @@ -175,7 +175,7 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; } - error("Locating this structure without an (highlight)ocean explorer map(default) requires Baritone."); + error("Locating this structure without an (highlight)ocean monument map(default) requires Baritone."); return SINGLE_SUCCESS; })); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java index db87ba20b9f..4f7956ca55e 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -71,8 +71,6 @@ private void saveMap(int scale) throws CommandSyntaxException { if (filePointer == 0) return; String str = MemoryUtil.memUTF8(filePointer); - System.out.println(str); - if (str.isBlank()) return; if (!str.endsWith(".png")) str += ".png"; File path = new File(str); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index ed861c011e9..4e116638bd4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -505,8 +505,6 @@ private void fileW(WTable table, FileSetting setting) { if (filePointer == 0) return; String path = MemoryUtil.memUTF8(filePointer); - System.out.println(path); - if (!path.isEmpty()) { setting.set(new File(path)); fileName.set(setting.get().getName()); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java index 1599e22dde2..b28f3c61baa 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java @@ -57,8 +57,8 @@ public void initWidgets() { private void initSongsTable() { AtomicBoolean noSongsFound = new AtomicBoolean(true); - try { - Files.list(MeteorClient.FOLDER.toPath().resolve("notebot")).forEach(path -> { + try (var songs = Files.list(MeteorClient.FOLDER.toPath().resolve("notebot"))) { + songs.forEach(path -> { if (SongDecoders.hasDecoder(path)) { String name = path.getFileName().toString(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java index 864ce1eab75..3f8518e4e9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesScreen.java @@ -71,8 +71,6 @@ public void initWidgets() { if (filePointer == 0) return; String selectedFile = MemoryUtil.memUTF8(filePointer); - System.out.println(selectedFile); - if (!selectedFile.isEmpty()){ File file = new File(selectedFile); mc.gui.setScreen(new ProxiesImportScreen(theme, file)); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java index 10943e7be76..de8ac3e8d69 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -99,7 +99,6 @@ public void initWidgets() { if (filePointer == 0) return; String path = MemoryUtil.memUTF8(filePointer); - System.out.println(path); File profileFile = new File(path); Profile profile = importProfile(profileFile); @@ -303,8 +302,6 @@ public void initWidgets() { if (filePointer == 0) return; String path = MemoryUtil.memUTF8(filePointer); - System.out.println(path); - exportProfile(path, profile, hud.checked, macros.checked, modules.checked, waypoints.checked); onClose(); }, 0, 0, filters, ""); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java index 9cc4ba52fd7..f006e57e81f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java @@ -94,7 +94,7 @@ private GuiMessage onAddMessage_modifyGuiMessage(GuiMessage line) { } @Inject(at = @At("HEAD"), method = "addMessage", cancellable = true) - private void onAddMessage(Component message, MessageSignature signature, GuiMessageSource source, GuiMessageTag indicator, CallbackInfo ci, @Local(argsOnly = true) LocalRef contents, @Local(argsOnly = true) LocalRef tag) { + private void onAddMessage(Component message, MessageSignature signature, GuiMessageSource source, GuiMessageTag indicator, CallbackInfo ci, @Local(argsOnly = true, name = "contents") LocalRef contents, @Local(argsOnly = true, name = "tag") LocalRef tag) { ReceiveMessageEvent event = MeteorClient.EVENT_BUS.post(ReceiveMessageEvent.get(message, indicator, nextId)); if (event.isCancelled()) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java index 94a88032a58..0acb28f08d8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java @@ -58,7 +58,7 @@ protected ClientPacketListenerMixin(Minecraft client, Connection connection, Com @Inject(method = "handleAddEntity", at = @At("HEAD"), cancellable = true) private void onHandleAddEntity(ClientboundAddEntityPacket packet, CallbackInfo ci) { - if (packet != null && packet.getType() != null) { + if (packet != null) { if (Modules.get().get(NoRender.class).noEntity(packet.getType()) && Modules.get().get(NoRender.class).getDropSpawnPacket()) { ci.cancel(); } @@ -159,7 +159,7 @@ private void onHandleMovePlayerReturn(ClientboundPlayerPositionPacket packet, Ca } @Inject(method = "sendChat", at = @At("HEAD"), cancellable = true) - private void onSendChatMessage(String message, CallbackInfo ci, @Local(argsOnly = true) LocalRef messageRef) { + private void onSendChatMessage(String message, CallbackInfo ci, @Local(argsOnly = true, name = "content") LocalRef messageRef) { if (!message.startsWith(Config.get().prefix.get()) && !(BaritoneUtils.IS_AVAILABLE && message.startsWith(BaritoneUtils.getPrefix()))) { SendMessageEvent event = MeteorClient.EVENT_BUS.post(SendMessageEvent.get(message)); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java index a877f8cc6b3..082f75370cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsMixin.java @@ -43,7 +43,7 @@ private boolean modifySkipSwapAnimation(boolean original) { } @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 2), index = 0) - private float modifyEquipProgressMainhand(float value, @Local(argsOnly = true) LocalPlayer player) { + private float modifyEquipProgressMainhand(float value, @Local(argsOnly = true, name = "player") LocalPlayer player) { HandView handView = Modules.get().get(HandView.class); if (handView.swordSlash() && mc.player.getMainHandItem().is(ItemTags.SWORDS)) return value; @@ -54,7 +54,7 @@ private float modifyEquipProgressMainhand(float value, @Local(argsOnly = true) L } @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 3), index = 0) - private float modifyEquipProgressOffhand(float value, @Local(argsOnly = true) LocalPlayer player) { + private float modifyEquipProgressOffhand(float value, @Local(argsOnly = true, name = "player") LocalPlayer player) { return (shouldInstantlyReplaceVisibleItem(offHandItem, player.getOffhandItem(), player) ? 1 : 0) - offHandHeight; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java index bea27d87a10..98bb3197423 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FirstPersonHandsAndItemsRendererMixin.java @@ -20,6 +20,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.item.ItemStack; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -27,7 +28,7 @@ @Mixin(FirstPersonHandsAndItemsRenderer.class) public abstract class FirstPersonHandsAndItemsRendererMixin { - @ModifyExpressionValue(method = "submitHandsWithItems", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;swingAnimation:F")) + @ModifyExpressionValue(method = "submitHandsWithItems", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;swingAnimation:F", opcode = Opcodes.GETFIELD)) private float modifySwing(float attackValue, final float partialTicks, final PoseStack poseStack, final SubmitNodeCollector submitNodeCollector, final PlayerRenderState playerState, final FirstPersonHandsAndItemsRenderState state) { HandView module = Modules.get().get(HandView.class); InteractionHand hand = state.attackHand; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java index 1305c32de09..510e7994457 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelExtractorMixin.java @@ -103,7 +103,7 @@ private void onSetLevel(ClientLevel level, CallbackInfo ci) { shift = At.Shift.AFTER ) ) - private void extractLevel$cloudColor(DeltaTracker deltaTracker, Camera camera, float deltaPartialTick, CallbackInfo ci) { + private void extractLevel$cloudColor(DeltaTracker deltaTracker, Camera camera, float worldPartialTicks, CallbackInfo ci) { Ambience ambience = Modules.get().get(Ambience.class); LevelRenderState levelRenderState = Minecraft.getInstance().gameRenderer.gameRenderState().levelRenderState; if (ambience.isActive() && ambience.customCloudColor.get()) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java index 755d24f0aad..8e0722b4d3a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntitySwingStateMixin.java @@ -16,7 +16,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; @Mixin(LivingEntity.SwingState.class) -public class LivingEntitySwingStateMixin { +public abstract class LivingEntitySwingStateMixin { @ModifyExpressionValue(method = "getAnimation", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/LivingEntity$SwingState;animation:F", opcode = Opcodes.GETFIELD)) private float getHandSwingDuration(float original) { if ((Object) this != mc.player) return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java index 8af617f664e..2c3cea79384 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java @@ -16,8 +16,8 @@ @Mixin(ShaderManager.class) public abstract class ShaderManagerMixin { - @Inject(method = "apply", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ShaderManager$PostChainCache;close()V")) - private void meteor$reloadPipelines(CallbackInfo ci, @Local(ordinal = 0) PipelineCache pipelineCache) { + @Inject(method = "apply", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;setCurrentPipelineCache(Lcom/mojang/blaze3d/pipeline/PipelineCache;)Lcom/mojang/blaze3d/pipeline/PipelineCache;")) + private void meteor$reloadPipelines(CallbackInfo ci, @Local(name = "pipelineCache") PipelineCache pipelineCache) { MeteorRenderPipelines.precompile(pipelineCache); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java index 9fc2935d31c..a80f367ba7d 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java @@ -17,6 +17,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; import org.apache.commons.io.IOUtils; +import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import java.io.IOException; @@ -231,7 +232,7 @@ public static void precompile(PipelineCache cache) { final Map includes = ShaderManager.listAllIncludes(resources); ShaderSource shaderSource = new ShaderSource() { @Override - public @Nullable String getShader(Identifier id, ShaderType type) { + public @Nullable String getShader(@NonNull Identifier id, @NonNull ShaderType type) { var resource = resources.getResource(id).get(); try (var in = resource.open()) { @@ -242,7 +243,7 @@ public static void precompile(PipelineCache cache) { } @Override - public @Nullable CachedIncludeSource getInclude(Identifier id) { + public @Nullable CachedIncludeSource getInclude(@NonNull Identifier id) { return includes.get(id); } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java index 662f05f05a8..dd7741a086f 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/misc/Keybind.java @@ -251,7 +251,8 @@ public Keybind fromTag(CompoundTag tag) { for (int i = 0; i < modifiersTag.size(); i++) { try { modifiers.add(Modifier.valueOf(modifiersTag.getStringOr(i, ""))); - } catch (IllegalArgumentException ignored) {} + } catch (IllegalArgumentException _) { + } } } else { // Legacy format: raw ints (GLFW) diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java b/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java index d92af6c9008..95011e88d96 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/MeshBuilderVertexConsumerProvider.java @@ -162,7 +162,7 @@ public void setOffset(int offsetX, int offsetY, int offsetZ) { } @Override - public VertexConsumer setUv3(float u, float v) { + public @NonNull VertexConsumer setUv3(float u, float v) { return this; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java b/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java index 5774d06d7ec..cd4b5ed9374 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/WireframeEntityRenderer.java @@ -152,7 +152,7 @@ private static class MyVertexConsumer implements VertexConsumer { } @Override - public VertexConsumer setUv3(float u, float v) { + public @NonNull VertexConsumer setUv3(float u, float v) { return this; } diff --git a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java index 5e9e346dc66..2da5aa2d884 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/render/postprocess/ChamsShader.java @@ -53,11 +53,11 @@ public static void load() { ByteBuffer data = null; for (String fileFormat : FILE_FORMATS) { Optional optional = mc.getResourceManager().getResource(MeteorClient.identifier("textures/chams." + fileFormat)); - if (optional.isEmpty() || optional.get().open() == null) { - continue; - } + if (optional.isEmpty()) continue; - data = TextureUtil.readResource(optional.get().open()); + try (var input = optional.get().open()) { + data = TextureUtil.readResource(input); + } break; } if (data == null) return; From 3a818bc105bf51e19316843c280b65038b51bd29 Mon Sep 17 00:00:00 2001 From: MachieCodes <80427814+machiecodes@users.noreply.github.com> Date: Sun, 11 Oct 2026 14:15:18 -0400 Subject: [PATCH 09/17] Fix Hide HUD (#6704) --- .../meteorclient/MeteorClient.java | 29 +++++--------- .../gui/themes/meteor/MeteorGuiTheme.java | 5 --- .../meteorclient/mixin/HudMixin.java | 22 ++++++++++ .../systems/modules/render/Zoom.java | 40 +++++-------------- 4 files changed, 42 insertions(+), 54 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index 93e508dcea4..2686b08d474 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -7,7 +7,6 @@ import meteordevelopment.meteorclient.addons.AddonManager; import meteordevelopment.meteorclient.addons.MeteorAddon; -import meteordevelopment.meteorclient.events.game.OpenScreenEvent; import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; import meteordevelopment.meteorclient.events.world.TickEvent; @@ -32,13 +31,13 @@ import meteordevelopment.meteorclient.utils.network.OnlinePlayers; import meteordevelopment.orbit.EventBus; import meteordevelopment.orbit.EventHandler; -import meteordevelopment.orbit.EventPriority; import meteordevelopment.orbit.IEventBus; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.ModMetadata; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ChatScreen; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.resources.Identifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -176,25 +175,15 @@ private void toggleGui() { // Hide HUD - private boolean wasWidgetScreen, wasHudHiddenRoot; - - @EventHandler(priority = EventPriority.LOWEST) - private void onOpenScreen(OpenScreenEvent event) { - if (event.screen instanceof WidgetScreen) { - if (!wasWidgetScreen) wasHudHiddenRoot = mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden; - if (GuiThemes.get().hideHUD() || wasHudHiddenRoot) { - // Always show the MC HUD in the HUD editor screen since people like - // to align some items with the hotbar or chat - mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden = !(event.screen instanceof HudEditorScreen) - && !(event.screen instanceof AddHudElementScreen) - && !(event.screen instanceof HudElementScreen); - } - } else { - if (wasWidgetScreen) mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden = wasHudHiddenRoot; - wasHudHiddenRoot = mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden; - } + public static boolean shouldHideHud() { + if (!GuiThemes.get().hideHUD()) return false; + + Screen screen = mc.gui.screen(); + if (!(screen instanceof WidgetScreen)) return false; - wasWidgetScreen = event.screen instanceof WidgetScreen; + return !(screen instanceof HudEditorScreen) + && !(screen instanceof AddHudElementScreen) + && !(screen instanceof HudElementScreen); } public static Identifier identifier(String path) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java index c71fb631cfb..02a92b2c21b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java @@ -85,11 +85,6 @@ public class MeteorGuiTheme extends GuiTheme { .name("hide-HUD") .description("Hide HUD when in GUI.") .defaultValue(false) - .onChanged(v -> { - if (mc.gui.screen() instanceof WidgetScreen) { - mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden = v; - } - }) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java index 30c54cad4d9..137956d5104 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java @@ -6,16 +6,22 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.meteorclient.systems.modules.render.NoRender; +import meteordevelopment.meteorclient.systems.modules.render.Zoom; import net.minecraft.client.DeltaTracker; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.Hud; import net.minecraft.world.entity.Entity; import net.minecraft.world.scores.Objective; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArgs; @@ -95,4 +101,20 @@ private void onClear(CallbackInfo ci) { private void onExtractNausea(GuiGraphicsExtractor graphics, float strength, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noNausea()) ci.cancel(); } + + @ModifyExpressionValue(method = "extractRenderState", at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/Hud;isHidden:Z", opcode = Opcodes.GETFIELD)) + private boolean onGetIsHidden(boolean original) { + return original || meteor$ShouldHideHud(); + } + + @Inject(method = "extractDebugOverlay", at = @At("HEAD"), cancellable = true) + private void onExtractDebugOverlay(GuiGraphicsExtractor graphics, CallbackInfo ci) { + if (meteor$ShouldHideHud()) ci.cancel(); + } + + @Unique + private static boolean meteor$ShouldHideHud() { + if (GuiThemes.get() == null || Modules.get() == null) return false; + return MeteorClient.shouldHideHud() || Modules.get().get(Zoom.class).shouldHideHud(); + } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java index 21e46fe9a5d..f8e9d6fdd8c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/Zoom.java @@ -5,9 +5,7 @@ package meteordevelopment.meteorclient.systems.modules.render; -import com.mojang.blaze3d.platform.InputConstants; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseScrollEvent; import meteordevelopment.meteorclient.events.render.GetFovEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; @@ -75,8 +73,6 @@ public class Zoom extends Module { private double value; private double time; - private boolean hudManualToggled; - public Zoom() { super(Categories.Render, "zoom", "Zooms your view."); autoSubscribe = false; @@ -84,33 +80,15 @@ public Zoom() { @Override public void onActivate() { - if (!enabled) { - preCinematic = mc.options.smoothCamera; - preMouseSensitivity = mc.options.sensitivity().get(); - value = zoom.get(); - time = 0.001; - - MeteorClient.EVENT_BUS.subscribe(this); - enabled = true; - } + if (enabled) return; - if (hideHud.get() && !mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden) { - hudManualToggled = false; - mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden = true; - } - } + preCinematic = mc.options.smoothCamera; + preMouseSensitivity = mc.options.sensitivity().get(); + value = zoom.get(); + time = 0.001; - @Override - public void onDeactivate() { - if (hideHud.get() && !hudManualToggled) { - mc.gameRenderer.gameRenderState().guiRenderState.isHudHidden = false; - } - } - - @EventHandler - public void onKeyPressed(KeyInputEvent event) { - if (event.key() != InputConstants.KEY_F1) return; - hudManualToggled = true; + MeteorClient.EVENT_BUS.subscribe(this); + enabled = true; } public void onStop() { @@ -171,4 +149,8 @@ public double getScaling() { public boolean renderHands() { return !isActive() || renderHands.get(); } + + public boolean shouldHideHud() { + return isActive() && hideHud.get(); + } } From 563771c365c98d98e35cf92741447ea3f3434f4f Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:17:33 +0200 Subject: [PATCH 10/17] chore(deps): remove now unneeded ViaFabricPlus dep, bump others --- build.gradle.kts | 2 -- gradle/libs.versions.toml | 6 +----- .../meteordevelopment/meteorclient/MixinPlugin.java | 4 ---- src/main/resources/fabric.mod.json | 3 +-- .../resources/meteor-client-viafabricplus.mixins.json | 11 ----------- 5 files changed, 2 insertions(+), 24 deletions(-) delete mode 100644 src/main/resources/meteor-client-viafabricplus.mixins.json diff --git a/build.gradle.kts b/build.gradle.kts index 00580753065..2d60418e9fd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -84,8 +84,6 @@ dependencies { compileOnly(libs.sodium) { isTransitive = false } compileOnly(libs.lithium) { isTransitive = false } compileOnly(libs.iris) { isTransitive = false } - compileOnly(libs.viafabricplus) { isTransitive = false } - compileOnly(libs.viafabricplus.api) { isTransitive = false } compileOnly(libs.baritone) compileOnly(libs.modmenu) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 21ff870bf1a..bb2f4451ca1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,9 +31,7 @@ discordipc = "1.1" # Reflections (https://github.com/ronmamo/reflections) reflections = "0.10.2" # Netty (https://github.com/netty/netty) -netty = "4.2.15.Final" -# ViaFabricPlus (https://github.com/ViaVersion/ViaFabricPlus) -viafabricplus = "5.1.1" +netty = "4.2.16.Final" # WaybackAuthLib (https://github.com/florianreuth/WaybackAuthLib) waybackauthlib = "1.1.0" # MinecraftAuth (https://github.com/RaphiMC/MinecraftAuth) @@ -56,8 +54,6 @@ lithium = { module = "maven.modrinth:lithium", version.ref = "lithium" } iris = { module = "maven.modrinth:iris", version.ref = "iris" } baritone = { module = "meteordevelopment:baritone", version.ref = "baritone" } modmenu = { module = "maven.modrinth:modmenu", version.ref = "modmenu" } -viafabricplus = { module = "com.viaversion:viafabricplus", version.ref = "viafabricplus" } -viafabricplus-api = { module = "com.viaversion:viafabricplus-api", version.ref = "viafabricplus" } # Libraries orbit = { module = "meteordevelopment:orbit", version.ref = "orbit" } diff --git a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java index 86e7804bfa8..9e9d9da1a4d 100644 --- a/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java +++ b/src/main/java/meteordevelopment/meteorclient/MixinPlugin.java @@ -23,7 +23,6 @@ public class MixinPlugin implements IMixinConfigPlugin { public static boolean isSodiumPresent; private static boolean isLithiumPresent; public static boolean isIrisPresent; - private static boolean isVFPPresent; private static boolean isBaritonePresent; @Override @@ -35,7 +34,6 @@ public void onLoad(String mixinPackage) { isSodiumPresent = FabricLoader.getInstance().isModLoaded("sodium"); isLithiumPresent = FabricLoader.getInstance().isModLoaded("lithium"); isIrisPresent = FabricLoader.getInstance().isModLoaded("iris"); - isVFPPresent = FabricLoader.getInstance().isModLoaded("viafabricplus"); isBaritonePresent = FabricLoader.getInstance().isModLoaded("baritone") || FabricLoader.getInstance().isModLoaded("baritone-meteor"); loaded = true; @@ -58,8 +56,6 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { return isIndigoPresent; } else if (mixinClassName.startsWith(mixinPackage + ".lithium")) { return isLithiumPresent; - } else if (mixinClassName.startsWith(mixinPackage + ".viafabricplus")) { - return isVFPPresent; } else if (mixinClassName.startsWith(mixinPackage + ".baritone")) { return isBaritonePresent; } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a0954d4a771..b7f86d9697d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -31,8 +31,7 @@ "meteor-client-baritone.mixins.json", "meteor-client-indigo.mixins.json", "meteor-client-sodium.mixins.json", - "meteor-client-lithium.mixins.json", - "meteor-client-viafabricplus.mixins.json" + "meteor-client-lithium.mixins.json" ], "accessWidener": "meteor-client.classtweaker", "custom": { diff --git a/src/main/resources/meteor-client-viafabricplus.mixins.json b/src/main/resources/meteor-client-viafabricplus.mixins.json deleted file mode 100644 index 8bc17408060..00000000000 --- a/src/main/resources/meteor-client-viafabricplus.mixins.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "required": false, - "package": "meteordevelopment.meteorclient.mixin.viafabricplus", - "compatibilityLevel": "JAVA_21", - "plugin": "meteordevelopment.meteorclient.MixinPlugin", - "client": [ - ], - "injectors": { - "defaultRequire": 1 - } -} From a4202b9a60addac373ae920798479ea1eb2c1a05 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:17:40 +0200 Subject: [PATCH 11/17] build(gradle): re-enable configuration cache --- build.gradle.kts | 3 ++- gradle.properties | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2d60418e9fd..a5c913f9813 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -197,9 +197,10 @@ tasks { jar { inputs.property("archivesName", archivesBaseName) + val licenseName = "LICENSE_$archivesBaseName" from("LICENSE") { - rename { "${it}_$archivesBaseName" } + rename("LICENSE", licenseName) } // Include launcher classes diff --git a/gradle.properties b/gradle.properties index 62858894c9f..a94add1331f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx2G org.gradle.parallel=true org.gradle.caching=true -org.gradle.configuration-cache=false +org.gradle.configuration-cache=true # Mod Properties maven_group=meteordevelopment From 5746a75fe82acb6f09166caa049e9331da77ec44 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Mon, 12 Oct 2026 19:18:35 +0200 Subject: [PATCH 12/17] fix(tooltips): prevent null client components from crashing tooltips Return Meteor tooltip components from `ClientTooltipComponent.create` instead of `null`, allowing Minecraft's native tooltip pipeline to render them safely. Remove the redundant `GuiGraphicsExtractor` mixin workaround. --- .../mixin/ClientTooltipComponentMixin.java | 2 +- .../mixin/GuiGraphicsExtractorMixin.java | 41 ------------------- src/main/resources/meteor-client.mixins.json | 1 - 3 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientTooltipComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientTooltipComponentMixin.java index 9d9414d1da2..92ef0c73886 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientTooltipComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientTooltipComponentMixin.java @@ -17,6 +17,6 @@ public interface ClientTooltipComponentMixin { @Inject(method = "create(Lnet/minecraft/world/inventory/tooltip/TooltipComponent;)Lnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent;", at = @At("HEAD"), cancellable = true) private static void shortcutMeteorTooltipData(TooltipComponent component, CallbackInfoReturnable cir) { - if (component instanceof MeteorTooltipData) cir.setReturnValue(null); + if (component instanceof MeteorTooltipData meteorTooltipData) cir.setReturnValue(meteorTooltipData.getComponent()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java deleted file mode 100644 index d5c7469ec0c..00000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReceiver; -import com.llamalad7.mixinextras.sugar.Local; -import meteordevelopment.meteorclient.utils.tooltip.MeteorTooltipData; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; -import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; -import net.minecraft.resources.Identifier; -import net.minecraft.util.FormattedCharSequence; -import net.minecraft.world.inventory.tooltip.TooltipComponent; -import org.jspecify.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.List; -import java.util.Optional; -import java.util.function.Consumer; - -@Mixin(value = GuiGraphicsExtractor.class) -public abstract class GuiGraphicsExtractorMixin { - @Inject(method = "setTooltipForNextFrame(Lnet/minecraft/client/gui/Font;Ljava/util/List;Ljava/util/Optional;Lnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;IIZLnet/minecraft/resources/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V", shift = At.Shift.BEFORE)) - private void onDrawTooltip(Font font, List tooltip, Optional component, ClientTooltipPositioner positioner, int xo, int yo, boolean replaceExisting, @Nullable Identifier style, CallbackInfo ci, @Local(name = "components") List components) { - if (component.isPresent() && component.get() instanceof MeteorTooltipData meteorTooltipData) - components.add(meteorTooltipData.getComponent()); - } - - @ModifyReceiver(method = "setTooltipForNextFrame(Lnet/minecraft/client/gui/Font;Ljava/util/List;Ljava/util/Optional;Lnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;IIZLnet/minecraft/resources/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V")) - private Optional onDrawTooltip_modifyIfPresentReceiver(Optional data, Consumer action) { - if (data.isPresent() && data.get() instanceof MeteorTooltipData) return Optional.empty(); - return data; - } -} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 029c502f962..435f8c763a1 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -110,7 +110,6 @@ "GlCommandEncoderMixin", "GlDeviceMixin", "GuiGraphicsExtractorAccessor", - "GuiGraphicsExtractorMixin", "GuiMessageMixin", "GuiMessageVisibleMixin", "GuiMixin", From 422fc004eb1325b2e195532f7c061af7a0711da2 Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Wed, 14 Oct 2026 12:12:48 +0200 Subject: [PATCH 13/17] chore(gradle): update to 9.8.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 48462 -> 48749 bytes gradle/wrapper/gradle-wrapper.properties | 7 ++- gradlew.bat | 52 ++++++++++++++++++----- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index b1b8ef56b44f16b14dc800fa8103a6d89abb526f..9fa7f288283f81eec4952784c271abd7e0938dee 100644 GIT binary patch delta 40407 zcmXVXQ(#>U({;=f+qP}nwj0}xa~j)fY}+Tc?X*c6G-+)6&+~r&&A!=Jd-kkZGi%n& zzCfJ6K{VJS13lx#5C&OMr5=Me$zWZAJI|PPlf(_6T07&8TVNJBDaGoY?XaL+1#Uk+ z>yx#;aLGB3LWmtlwf*Jf*my%Af76=t530$8;BEN)!nd$y$(8t&;Ii3R05(7~)a(IC zX@AGY^&Y;*lwOKPX;p$;6|W(eUC>Zr^4@l!KK{L>v`$${iv1>+2Zizh z22AAzm$Kd&c>Ou%AJ_u~>xVw$@c!j=xQmexYFHTe96A+>0-9E=YoXP$3P>4|?UaZs z5@pXQx;j8VsH#vLpoyA?M)uBok>2mE5&*jR2jWRlOm<#93RkvJo5j@?XrmAAdh_Dn z9x}7S{2{N-8TKnp5)*N^P2@+j2b5?JaB@hmdzUf(>1<)Qnd*ug?hdSnWP%w>_{Idm zn(#hFTl3kW8Vl zPVpTMN&m-#-Y3$7F%Vs85Qei4{J)sVy{4RDf`ftS{4ZvKdH)x)+XgJ4rTT`lh8U)i zgaV2qN=ACj4)nEmVOTo7DwC-{nXxPat^z5pN!cObyuX954bA>{HYcc+!odpwO;art&&oh%T$u>>YJ5U zxuuy`Tjo~Lu#L~jm@d~@R-?^&(6);ZaYqp2OAy6)eJG7Lt&Mv^gp?mpWgXUR2_*r9DhhXqIZW`GIK0 zS``502wIY89%Ti-tfx8Mg_;TT5aw-LMIPR4&>hJh&$A{C;wH<*k`A#R-%=uI{)F2X0d0YUz?0q)ShPzd)-`bW_a^5nbZ$gpoDafG zk(L18659$(@tIq7EXqrCJf?T(jm$}TAbgCo%R}s*fOkMZ^AMChXd)5&l6-`r>d#$R ztaxXi@`=^Huay*Cpr+@L4O7?#C}o&wnq3hI%!ai>1@!lhtG}$3mWh6cq6a zi1PGR0A!{|#+5n4-zOX7iKb`C7vs!~7ZFo1h_%JLX1U*4lS)I*BMMl{viJ||A9C}n z+|t%Ie%H0Y&ggvd*nl10%b$N~`Z;)T@ds%VtDNhWh(jPuLy@_gE@$_*9FBJ`7?Ej^ zDO0kCS%hjisOt&~#W?>>u4d^1?$^Zk7i>$w_4a?+g(~>NO71JUvQy0Rh*F-&s8YhQ zX@Jg4+L(b(8!MG^L1mZ^qj1Kgw&*-HQ~`)A_EQ_AjzNGbP1%(=_iT{o+4%RPGTXEV zj)wq|A4)Z8*zix>wjv0;Z9_KM>bKBRZSHdcvmJ9nk9>z8k1zQ+V9bBPhnzPyP|AU7 z^oARlR$7@_EuK`>HrmCN1e+^N8jiYJV!-bPxWNL!)Tf(jt)27Sx!OZ&R%;!*ku{4o zl}LXyJz2uX6XrDOF+y9*x1a0V0U-dDuya*ScEyB)G3uMidNfv;4vSU?rOid80an{z zt%fuIv?TU9CFYoP<6wBIrM561JI>(**jQGXvgh0Wrt7E8c83awSE_Cwl(pA(Fae#s z7^yP4#KlD<`V7``hpAvnak0xpj~F^DyVh`>$_IC0(Rw>NVRdi=2&JGPA)f#Xv=)RZ zWV^gW1(xU%8%W+9HD%ERZ*+5bn>7dWb+y^8;_a54sp>Rner}?E>LQB_x>Dk?WY4bt z#D0GKROYx8fa?ZJ${aIZvuAt0Tc8N67;bn-Ka&oRn-@sKWPe5+(`07~+&{h^H@vfq zD#!Au7CvKl&$wtR4XLmrwTxK<^AI)T8flhff@3@+)Hw=^2Vj4i)M2Y{U}frsyKaYx zsGdiZBfdgYd8li{A{~N@yYQH`_M0CyS-e>iZ7~w-HW85_-TR5XAuKl zYK!MHt=f8HmBLRbCnyQ?x>_!X?J|PsnpQ}|hdpo)iS|+7UQ9migZ2-PyzX9kvRr+O zIkYDzoA@C;7Cyn#TcGO^9Juh-e@>^$ChREl~t7KCL&0pqdKmekLj_Q`*PN{Y= z`5B4NNEaFme66E8->W%5Eg|&?#+)XiJ6-P6xBu&TNrg`}uOLF2#ccgCYD(P|g8}sQ zW?bsZ@9nt*>{1E^jhSGUC-mNX5DXnq&HcS|2MCX?{UV~RPo!l5e#BJUZl}HwHF7Un z;>TI8E_OX#=n-HXaNiuzoaj5);WP_?+R$GEVG$VwKs_-6EE}NHzcF^)62vic{IQ5)5n} z77R>P0TK!m3@#-a10#hRUmlpIZR>@hg&XLU&F+Ys)bc}9Y!t3-W|1B)y-BvRV!cHw zX4w?0Y{HS>gB`<~n#ohlb^8$sXLI1af<`I9E&gQ!C2&oofaDE4@2}hZ%b!fSD5cgr z33jiGfJ^uMN1qIV?a%j>H8AF}a)3+%VMpP6{8eHW{(&_ACYmx*ggJ0GHFL(c^TehM zZ7$1J`4)Sv!_HlwQ0?5?F0@?w+3sBuTW4>!hou}pQs$_ZZKWw_W^w)`;%qmLw9M?o+~e_qssr(9i<_k~@fMx0_V^ zTSsgu+)5$L;Z%iGE^ciy+VD5FPSx;O_hH$jMySJRwVzE3ocy(l!c#~QX4cK+S#|iC z+}r2rVd0{gDm3sJs>oFzm3}mCm`AF=28=rGHViB{i%XG}B3T*vnn82Ri|F3~K|K>f zT^20}#k{|9(`SKY%)9K-?Xz*Q9D4{I2BR>B#KXQ0C0<;)Wt?=6Am<}g6+Q#~hba)m zx%lEto#?)p@*z11%h$&cvbUMqCzkvfMSZ`_Ek!-!&)Msh)?v@#*(lESQBrYN5T}vw zD=)lqn9Wp`m#6<*RlCpVuBdR^!tS6SZQ|{k8?V}(r3K8gTi}|yR4>_*+`t-EHdGp{ z>>zBF3x6_1*E)NsOd4AI*8T$&UszSyiXEi~$6LKQV z+xQ^;4!1hh_3wKoy{%SCGIvKUZdoz!39XK%xitTt4@PNbh3AT!@3UD1`5>w712b7; zwoob-k2z4)VuT5h{ck3ic&06?DB~vdU;8%X^6gyb?OPXKsE;;%m2NEjO7v z$K^K%Tqb@6$%3kpWn2O)(>mTa?6)3SJ?{2BWs0#mDC%ls-DC38x*yfkY>?YE$0+Z$ zQ>%uB%-Tg%gf|mlp$=f_nCRE21QjQgNd(AmEd`?oM!caClKNnjrt5_IV8^{7R1mt# zX$gUNQ`3hqoC`JtlW?lh@ptZKuYf!(pGU&hmuO3P7O3l@oi>jLI&@>|PugEw3PJs! zBPAXh-N8B`yy0u(@G7_lqpp|zJhC@ABaY~;^(}Ylx|4q$?cA{Evdl3TyrlYoXqQQ? zJZX82!pC}jEUU-Da2^XX#6unApq}S5)OO%QmBgOL1!2|FvQ0vk`!-rp8OuVsHB#IW zdzqT7;mAb_^S4L2wT9Oc`;FF;or0hbk)n3Tmag!;Q}T&{0lFIAu(XK_I!bq^q* zP_{|*hm;2Zv+=!IV?BwodS$D;frAg1PZhX=Sw~moSI}D?DP+;)g}@W2VaBD}B%iLg z5T*4re4u$xGk9tkc+V^_&=^fvLk$lx>?zXrV(4cZ-{F+uY9z*jgXwz8HeT++ikB&V z(i~YJ;11=eZumyUiAf{dLOM!T!UjAtcP`}%+ER^Yf>tJ1eZK}IQ;vs!_qKzvZ3@Lk z*XfAR)RG7)*=Zn{N(#5q{evl&EV)&p8oU}NE2OalZ8P!bQWYl#F^PNv_jsRf9V3dW zxbek7PHIWRbx!o%(b5Q!0T)`vctua(pf4Y#jmxuoN`Da!8k368$@%y-6xbV?fv&dAju!Qjt|TPc zq~rbcA`0%DtOoD&67d8ulqvY(g%2r}!^{1y(ftEu_(=ldGpV0N7-QwUB3l}^%6@^? zOtVMSpV&e&YZ7d?+U0wXZEj^&l zIxg88*9cHnZ6GOb5SCkcre8U9Z4wl_e@4_gtjB!YruF=kgfs}VbU-p{Tk8U?Ft42e zzi18?u21XXeG&!?%o;f*2!rse^HcyDIWMtdhMTk-ELqXnBSMd^kvhy@76pj@LXA{% z(c+d|K<#qZXh&4Yp_ii}8>aj~!BGq*cO5|4ks(uV!gQ=yT>m!lJ?AhW!QKDu^f4hH zEM3*?sip6;>RQa%-CSopzPE_LsHcb^ev60cB0Ik3x3bK9Cj;ZxfKB2B(%}Mr4{ba} za!@fjcALV$>e;UT-EG1JiPG48)v#qux#}2uw-sc$Fqr2e{E8;_z*%Q?CHmp|0+HJ zC2=5mzKcqS4uGfeFw?cms}KSLyob%w?h+JjUlQ<$F=xN2Zhnizi8jF3w4ui=;i62E zH$z_n;AQtYBa#~dIeuI9&iju&dT;GD={P?#ADFd*W(qL#yhrS6bB28u-(zUUF}}Iy zE6*;u!1H0@xMq@_kDEVin4gV72^!R4E7z;L#7zz*g+4ItYWQq2yvYFXie0%j`)i_4 zL6y4*bueI@t$Ah68CEp0w#b59*OobzTGLR`Y-({Z_zvEJ`9&58I z!Xgqtb}?oE_$~!;2}f4W14}k2{))Tze+hN)f!)CSHOU13Z<1-FR0JL?W2j+%FhiFyS<+>b zGV=z1FNM>bBriedq;5sEp}a@w$TgnqXPn8U6OX0rO%Pdbpv-y#6HdJbKwB#Cr)(bN zT>4x0^nJcPL7O7P0P;~#*4Rl_(AU0)X=z()IVvbsWI1YkhIDm0QYm#Y$})$Mfhc4< zW^zl~m|Bd=t$_R|XV^T1NvhRpB@@+hTYpiHqcYWPlN;FG&HA)B0O)7%$EXbO?B>Uf z6D?n@+9;}FyS+L_y@v#=;zm<)m8>zhq&&yna4XXYaR#$@#MP2-b=YdnoIx8>%e6aBVLGFQD|Ov)H!FVd0^tf)@_1u?+qY zL03XAB3Wb`nEw30PK@^>YG<%2D)KSTSd zQYWo{MVEM~<3$)s@gwgbiSKJ<2r%&9+%h^ZLRmvUNH6w?wPxFH+C0TRZn$s4;Z2-i zSL{G)FF=HFJpSQc1|My0yRrtu2=wZ%x{l7IN%;vBx6Z$_VFi1xU?(bE&h#^;qnT-pp1SW=O=c< zGh0FE0cOn&Wyx|jGy?Z|VVA43Mc&L9slXpADAcJ6^qiMb@K=`vSz$&3QSEV9Lcb=! zpa%z)+aSq}v_U7>-no?m3QS{HqQXBHVNtD@Mb4lB2n)QL*k_@3DxJJ7_tB#)h<&_$ zl~DA5sbXbK?p;u~4XU9Kn0ToWQihJ5Po}diz%kSMrln{1yZS<=8zS1GQDOR_o$kd< zz9Ryr)U}uPZxa&k6UCYIzj_s5(Ku3VY{Y(XpQnoPp&gI*hP;FepxZ+8z398S^(W`6 z8FD|wB8DJEKVw=+8U$O)a_a`WW$Bo5&Dg^$3*kk(CqDmAi}Tn}{NV-l zB@pwaBr$)9>h$7317~zG%nuk;T4wbEtlEr|w#iaPN^Nw9I27*dN_~nl7?bHUcB8f} z1FMW)-0UZgH|Sow#l`^4`-Q|hX1lJryog7dci>nFhj2?DLCitRkLvv zyAR7uE4-?wRl9t>mbddahBMc`!7g+T1CU|^!YG`@EWp@e(;cXjRq%F5HJtzrcTl~a z8p=ZFqv#qBolaZ%JuKt~^^WfNk52S?rxyHdrh6m&ShA&Sm_<|-MgvxxJkIR0eIWx* zqz$_Z@A#puKXnJuhlViXb(ha*t;)1aYl>t84c_AkK1=`Ver+zHgrSusT12|rvSWS+ z!j4gG0DyAN%fUGj>Goj>xRYtWy7fvrRU8>s0-$k{W=O*n5EgZH`=J@>$76dSB>3+} zu>cBbCxS3+N(z5(OqR=WI>m#b$TG~XCJ|l%Q|=X7CJed*t$?~ceu?Alr@uj#kD-dY z|A3P+JfO4zdZ!e)%}3ie%J=SNJex&-g8}^2Vj#8`CZieO%_Jc9Ld#P2Y<>sNZDBnR ziO^^~!!Thq`#kjScb*%tMJ5kQVZl8%Nk%?7Bf*1^ES8tvg2zTjItM$k+Oz9$+%bpD zL`346Lk!^AB=<6QJSAgDEd_(V4}Sie?j~#zl}Fh0fI+*fl_zYGZ&?E~0wf@LKp~F- zqIsZsvz3&f$d+BF^GSTMqV>X3}t>*V)$CSpoc`45Oklf zIrz|Q=DgUCBtCfF?j8hav;!i&>-R@+q1l_7U(UNeMA>I8z5S7uhajF0Es+;({!?+u zQ*-zQ->^Djy#K*h%h7*>XEVj7OMTs%9}aZ$TYMLbhb-$n>Qq{AkgxK&BHGKEF<6r zkk^0T-J02*nQ-_t7?gA=OQe8N(D!V~687Z3RQN>vOk=d?lHk)J4!Ofq3LTIKct{6@ z{QE+1WgMQJN;iA|o>P)hxlN2<%)%Cru5T%12vXB8D63TMQ1oF9-SD*G3^OjX+IQL1 zts-t2w_iPZuJ}#aashLw=e?Eby1V??zDj&3eH`NNnlEV$1tevd#tn+ev z-fth*oWFQ&=<0lD=Y9~Ub@X0n7yl%=YHcOC%1?Qy$;Z^k>DM(t%=HV!0b&zG7a72N zqQc8(r7@k1lg$SyIme%t5j>OH<7EG=aqL_9s?re4pM00v=o(l`RBAAFE2ee+{adLI zFa;bV)zf)iZ#F>>711coq;58Zm2ITAo$w)h#Z?_d>lnU>EBAOl8eSH6{ei>E8|H=} zj-=cJG#l+^?D*oL2OhC&RvE$b7fb;GY|KjG11HSehgma58XIsW2U)2nYjcf&6RCfZ zV@EqQvX>ZBt-<90@=p z0G> zhATNw7ueIraA(@lP+Jgr%!xqDHmq~p#tH}}U(Hfh8t3V@LbR~OlpK8mpM280$aqDfE6;J%8P!Njc^H?jFPgMzXhO~V-} zHZVSsCGXl<|IAu$bVy#~dLeHd%Wa;^J{l^j7@%eF zCHY}~Aj@TPLKV{Cgh(yIQ7dIj)1@uCAr{J(D$z47i?Zb@DyI~tWU_J;)*52op*&Fw zz6{3L`+#etw$59d_}}0>3A9{r*vi*?)GE*Zy3KXId_NC(czfPTwUSB94{Y?QM@Xc10d%*;o3vETVcFt9PfQ1Eo4I(E zcngkaMLP#xk-V%N!rmM+xVX-ptm0!ih16kxw;X}^hFCIw*Pk21bndNl_S`H-MdST- zY-jA%b@!Wtq2{*IQ4Q7J%x+zRqt(elr=5IWBR{#O`6xDchZ^2XtZZg&VN_~P?ZCPk zHc+4)0geQ`m@Ti3u#VtBsD@@NruDHM0l7*ZxbHoaoV6Ma2;zX(=)qM+HASwFd>4>L zvys;tgf}8lAYuOi*xNc89SWPraM|2uZrvZbW9eGA%a=*|q&~FEo5B>cPi%HN?+7tl z4`?h}G=cyub&2f4IwmUQ9k@UDe_4ybpXTX9j>&!S_t*&&jJ9Kej;F*nw2GaVs!Bt< zS!O2ahyXtw*p;J5vPwya9`#Mi70%tES9|>OT_rIR&w_K8sm5~7^6vO*JapIlzmOtZ z*?%de!vs9w8N+*5);%%}F!r>SaI4lOlN(3LlJ}utN+~6>ZF&LfE_NevME!Vr^Gm!_ zs6Gcyl50{?r*zdo&1$$IygZ#ShWKE2r9CaWoN8NNHT3-QJSF!b)?8K=?4daM&|+c3 zb#l*kAj=C|ELs&|y|%4(cN-G7Z)pyTnWlOyn_*;l2hl(2rB?ck@Lp8oI-8%TE9~We zFw@Jzwb0Y5mle2`!d*DgJb^b0#w1N1YJ|-`LXX4Toiu$wlD|!N0=qK$qd<#d_sUR% z&nvfv0Yq<SADr~Rd5+DXm+EsZe;ud?{C1FQ zhgDA>!8wWsQirw4aBUPut{Em-IoF>s!xu{;s=n_OEVhiT_Bk%Qj3x-m(v3L8SKd=N zipx?X@fg4Z`MS*X7wn<2)TN7kUB*ff8(7--QJ5)2T&sFikP&E7i8Iyx7Yl1UybyX7#E81Z+dA znmH3_4rG4(tE*8j)24%)YAuM9&JZ_IW)XKw2Jeypx^*X)Dk(d?Sb7g_`PoQeh8If-*5xxmYBB7zGY|dAzkqt zNvl9k$1g2lH@$DY-=rSi4a8qwId;G9EQnoloT2!fdS9|hjuQy#kM*19JmI<83hK$6 zpy~Gk9~x*BfIXu8j}Sv0$B8^7Z!TygD@mCM@l)1BDKVg%*ME_fwWuA`doTEs!Wjgo zfyj-KHylTvy2V?4-{N=CkcVwOBX&^;r&QOY^7wmy`ZnFE%q66*a|;$6>d}4{g*8&$ zbsVds#e?VODjW@SLo*>bfhpKTjBTk#{5$xdK%MxauZX)#nzl{AT3qPczlFzIxh-|rkM!l9cZ$aCI9Ua~z-CF>(YpTWfWpt*^ z`Fa6zaD8z#YWw!fGjFRU+J}L&gW4WDAsnGY*O+-&Gbtn?!En+-dSWf7VzeHMD-K|= z*+R>JM;$&EAu}eSqTi3}uOPiJeREnhiWeN78FQ$px8N;UU3o3gWb0}0x%$#=2%4TZ zX6+d9^efymzHA$I+_k#tZX8L|aXNoXa-7t#s{2`P!|t&SovX=&=0jO{QWcO^ zXx||Auh0@^ZfCxUWNdynBos_ShDaHnCg4c2KLNX?tq8CDq#H<^8A?o|jL1UrJ9Nz; z@QLB~hNcdrH+rye4i=is0`uD}TT2BukL3m{^j;zUc)Q`NrN|$#K3>}&WU8NCp=2;o z;S^F#ZdF}}GEfWLp=jn;C-Kh~TwX}7seJKXVcTK8H}*F5iKJ$!g`eBfB_{$GLsAQd z6S;^Y)ROk2F2}%mD6McQ2(&{wO!&iLQ=w^Jg(3aAohsAw0GQ9ABC}gMqYlRk{vp|O zN<~XX{E`|Wa~u2-v^I%f^grNcD|sB3q_i}6Tm42O^wjisS|f&}q>B;VdXRXa)RY!X z5uFxzC&M6&T*B8)-|6mQyCPJ%+-0NP|KY8RB4XR9IurwaTai)t_&8S?Sc{>hN}7lAf{2XCViS7I>7o>h_Q-V17U{M&W1PhFOi^Wn`MEaHy8>popxGO-vYvs(wgpD+6g6fxDNtt-pW+t)Va(MxPz<;oSXN<`JV(Ck;oBOD0ehrKqi_`M zpKt-0gZ+ZH=x2Y|3z>uE8+mu@hpQ<4z&3q_RF}v;c!h2b3;LPIvfE>%m@GlB?MnMe z9N$44C3nf(>DRp=Tb0Yth!@RmTu2U#5NHD$s ztA||z0ze}Li2uAnS=HGGIz11pC~AA1iSSlvq4NsCYN$`V7xDc3T?`yu;*#Pbl@X{2 zFW~PLHkiJr2W}U9hr|~>+ae?;V6zP>SDl7`+VhVSpE-!3TO{7mYBfZV55=1#hm#0K z!Fjs(k~wDLc+Gy_(`@D+b1t`Vd{e*W&rR4$1kM;W&hFGM-R?Hnc2~Xgh{%_64hJ(h zsv|9YX%92l0TV%}yeO_!{(%&fG`!I(>jVtgvKP8f#2$ZHE!5^Q&@SiJvVV=E zrj|Jj2u>6=u8}Br5kDPK=ZD< zs+tyys=kjoo6m`%g+aKDA2!CZin$Bb z#}v=vzEPt+kRbaZy%db38nWWn+@X~2^gUxsNkK~VZBWIS=w+CoKANL)9q)QU&BXs! z&H9NUXTkfTjHz@PkHpvS(f@6>@0VDgSq!5jr43vfm*3CQb>Xd*2i-qWN^a_M7fDZM%O`Y)5Gwf>)Pf6q)Y> zAtUBPa_ySHp@@DfBYG_29E~RW-S@u9y=no`^_h8};ZElF%qDibh`)yH#3@3=LrJ6!ANZhn5+L%pd8;TyoQ*QH|&ax8^yf|Y2*-Mbfh zqcJ3J4}NVAX2l{vFxR*UMs2uJVN{m2hS%Y@mCK#TA|Htqx)IvoIrUP1(m{Gda{)IM z*S11%0C-pFIdM2wVK4qq?USE}*Aq3z8U&AQHYx)2>ngwm#wby4_H)g1QU`JBXk$W$ z5%4=U#u#h-3BvdSSeXiVYF9aJQ!#!s&~#1Cq7NF2+@ra>TK+tPtVU(zC*+WEy8 z-3WY6kt#Pl?&>IxcAc2ypg%O8?IXPW<2bfRuvLo>1LfbX|M9HwoC-$4{$;K57R~DyaK-#E)g&O7%Qd{>(!#&&g(I&|#gN`4t zd;3@tAh##1SXKw!oPXC#mB)fIx%w!DSDxr ztp<*ci)rN&ngn6UL9_wpDpcOn3|b6>$k_Wf3lu=Fss>y4xB4Js+{Ls7W)6>wWhImL zT+zc$Lv;Sf*d{(^4}=4yllby3Nr5fuPBo!-IC^%W`v$X_S%}6}KTWbWZ^D*aHmL17R&QQNntyMK1hqsjY~Ju^nPjM|{NPo20vV98U@K4FIVMW$4CV?2uJ|^)oIsnzvfxJ{zlLAy>H|o@uu|7y}{h z{*A|~FTJp`5c*^AgMUSDRmYAyI1KJ7`J*jSNC}GRj9Nc%2A6VdW4Xqp0U|-R{2L)g z9JLq?fq1{Z^T+?T6Q;vk%Yd(@oEz?cP5G<1 zDp1JzOH2#E02=N+xhOu_+0@C`@Y0~gDh4O2LTNz+7pPv=j%CC>3VZljqmhwc+gE6i z(bCdAsr7HtMFuljS^w$wdF6clvZh{w5$_T2E*%_XA4ia?`wkp4uA|%uuETqz?~hh3 zS{(CESTTAJq^FtN=F#!2TG!yz$s0C^0CiTcl@rJQN*hxp4uU&x)h-n{a^J_j^}Zq!jUjrC0#zczQIO$K+U&WSRjhf zAgdY<8p-eJ>(faWTNXI4ws?HBlrSX;sdSV!m9RIGvt5|N;?t%Cq?%guA7o~?`S6WX zK0S&k*`W`G4xy~P>~wuK$&oSbt$+a$x&wlEtv}1SMHC+=%@9@R^4&};0UdG|vqy-l z^^|Ds=v_#P;-^D>Wx}0h$kHM^2~53v)VmzNFYBNj5GTf%CN2;L#wMNNiw@waO{;y{ z?qUC9I4;o1L;e@TG5p^eLrMgwy`h1jgZoL80wR+{5|ff*D#IQOPxRH1G$^RBh0q0e zY{BNq#?bwBHaa6MRbAWj>-C+TC|{uW$&@Hgzr0q(qwG^T|BSbE`&X#n(KuDktr76> zF<_hT?f$a94{|+<1h3Ah$JgQVKviFDtRo5DGj!RZf~h2{qq~fu%?cm5kdwJf*$$db zgP=M1sUBHnZb-y}=^mykqrHIG&6G+K_b=676NBxk?)-J}n8?EZJojM^+cOvHutTe$ zf^vPMw>n^~ZXSyTH^h0KQJ-F<q(%6y8*wkp zX*%QqM`OFFiIuCcKE5N&&C1Ftu}8@C>@@1mwH`_xuD_v}g;T-4Ob(dY9a+^%iMZ;P z?M*8*D{SkkIL335vnexA%`V)EVI9h%2c#pCz0L>2t*CQGC7DHPa~M%pS&;LpwZx#Z zeOdD89cH*TsR6)t4sXZi8Vg;bI^WUUbt(rh4$co1EvmE9c&eS3VMd@kzc2Ac^mqdD zS^bEx$6}_|k}8&8&}FhU^>&E2oXaP>M2~vQn4&`0KHv?lZl0`?d}+)T?2+!dwg<+u z`Dboj$AfXVIM&I(=#g4#7G$(^CpLo?VfOk;*-5X<)GHu;+$(LnAJU2kx?@g8g+ps= z5mk=d-E*R-$Po6}4T`IDo(1saYs`Ii*%R zhtc~jp~n;KpF*ALq$w{x82fNhP_RAFM!74252o8|X0WO$ai+H&_I!?pK{aYuYY=<`_cR4Jn{7Ir?`IDIk0 zE+ViBb|H5M1F^n3li`5D-zbLV8YzfzsW~`Yk*J(hqUaM>n~E#s5y#!ui4T2wL4#)D z6JyFo%9*tGWEfEvm=R(O^K^VG@SAH;YP+AFFRe2{E6K0IzANIzgtXVL0pFfJoEjQ4 zJm7|se`8~Id>IW}C-a>0OCqbwiK4v3JMZKHk z+zxFZx4^~JqXdrETRsQ2j)|-a1CNBhl?UO><4Zr`+^<9ft~@pHXWwX9si-mehP9MZ zj8AWm+Txk{ga!@k#55-rg_Ts&i`7uPDl{qjfP%I%(w`)ABOy@whfhAtDPFhZ@ z9{iS)w@q5A&g?T!gy;XG-HC6c8UvVM_$y)s-4tb_ZYns#;>s?wRc;w-n`{w8ae>%- z8hNVm4ji14?PbD0qTL-@9w5*F#yH&9DN*^8t2?>n)9u~{4t$F+h(}L2-GV=f{qcsn z&90{J_ShhqZMZ8yjvd6XjN8&BG;}8?s{-A_qyfi2;#^2#8hzDCNrJNmZ$ACDrJ&s9#te%g;}~dvOTFpcY5<4T=P>8@$s0h5Xp0Jxq3! zQEuN#SCtl)|31^-2Cs{=NTUsbkn%iH*?r9pKAKnq3aW{rn!*M^>$JHsO%Sw=Lr*rj zrx%BMfO7pPI}YJ}mTuBo?8Hi(m3~vLk?GSf%ulgirPkl(%;ai2l|E=LrvbwQ0I>dl zFzpwMwCDb11EhUB436N^3=Ej&Vp%>;l4E6vNfDZd-R$EgvxBG zU2@E}J*OI%35OQ$w(&X*V}26M2v4Dv-!{rmv)iW zVfxKXOMVA=A+CvIZg2e=HS~1(vnhT|p)^jK;0KDY{&_Jy(eac6c-Y+u@~H<>98}DGCFXRK9Kmg(yhs zQ|Vh;e{7V;q~F~`%cuNC$H@W>{#+jpb9EQU6)u~89q+c)L(RGZu7i?7p+$a>NP(E} zxm-DD+%Nd7l`l3$HvfS04l)E)KfftF4w57bYD|n@KD(Xq1Z0k8a_@U&LAmm)Pa9Zb z9z;i!r^4Q7PBi=D9|i)Q6{&TUL}G$}Hi@#ZYaU*myR2K)o_{cEEQg_xW zS8rXjAfiHyi1D|o2P{j&bE*@BC6y+r?RJzhYH<7Kmoa1@uO)_clHM|6-LgG3#NLDs#i_J zch}{=onPj^`Izt2C>I6(&F;U@nCPG9+>Ki=X#MQrA~WcJ5NXY0B<jR*Wz05Uu^_ zn@2Y;(w4*$fT$+%_M|nBn}T<^$`CT&Z}Y#nuAQdEU3+l8dV_5!F*ZG215MswN!RPq zeGXsTtCOZr4MdLm zI|_1?C!p0#Tq#a0QG!fOpYMlZAT15W;;Nusr2M{@!|OyOa4QqT8N_)WA7kV?gkE&*~h zUtkp&jWzS_={>)i2R>}7&)Fm1ybhuXqI&!~5SutdaHoj$4QgE9RVKBH?bSND4xC8m z8-B~Ytz9KFd!O8RQr_p?U&jm-)tgYu%+1fu=D9%n!DfTRa--xr^BqcJ<+irz;I@ro z(m?p~G0dcQ&#@zZY-6lG5;-B~sy1NhkU_Wa?A3kBaK$G{eCX>nHy&H9#`_&osf=cp2G?`8TF`(~Jo zp0+4OGX?t@89+q)N(H51l%e@9uB{z2oe?$qmA_t8E!qsr9{X2O;pRV6127swQ(m?aj^E7(~oy)8umOekMTY$`; zusUfco5$h2S9ic)KfkV(`<`0fNBg!}`wG(}P##e~G*N`BBt>xK-A;I%OhEx3AEGnlg|rv**UdzxrL$t~XkZOFrz+#X-<2CR7GpAL(Q zsV{-K1CRg~V*?k64Qo`!A;m6s8R>AOw3ENDl=LQ?5%`2_f|LJu=hDWiMbYm@>>`LK zJSvU^-RryA**E%PKCjLh=mRwRP=Yyn6;);{ti`dWN#-&y7k-Y`g12aO?Oy}GHZW3vOB7aKxCH+NSXppg;rW3Cp3!&NTq56RNuLRQj z*QJVl-7P`?pD|HOT>_}5@}J?>2~iQREI5*Y`6!Z~sYMIT(lw;B;0LOx`B2E0;r4gX zv0@JgbX3x?$X@ZBU5lh#tV-5X@iGUrqJiR_*@fGz*XnET^Y!g54p;`;%$1$FxzkZt z-od|U7q^#4C+6e#&SPwa^qGJuPjo3BnlINa6NpAuZ^w9$5eVl#!hjSn46!~-{1J=|*I95MRp0OWN3 zY4}XIx5?JZ8PmgOcAnSqwN1JAG%p793Tr9qD%|WF00+%&@~ifydM(S#d~8z-53&w)Kag%LmXD}GI&gQ5V*oRX2i*_^rLf?N za5#N~h1l=m#Xh@pZgU3imUYyED-$lGkxK6q=a;0>f5eFY4L3Jk(H@80qk9fiaMdtW zwIlOY?Sgd%=ODA+eI$eh4*_PH-8od)0f!$v<7yu5z&*J56)JnaXBl@5$||LF%21J@ z6ft!nfPSs?fNgkNf!X4{(NZg3=l3|ri+zpTUdsCY9e}Ua5$}`>NKL@F?JTEYO{jiQ zG}V~pi>=LNas7rGQ$GJRu`UGDLiL8?50%kcokd z4ADB;C>S7GP%VGd#@e_u*=1q+b#Zq@8U}HtjYjV(^{g=~1;Y&cw$s>UN(96XqS|$a zo`29t!A+AH8qaKE zU*AV`ysM%oX>FlBRJEkIJNVaVLYQ_Lui(&o9DjqQc&36=6=LfLbZo)M^gZ1~tb#;m zik1p4eZo)(Uon!I{)XXrBj{QKX!1K+I&VyF;Z}x1-0mmby|?jA+<#lmYl_xxgnr>E z!U{Dm`0y4BQ80xn4G`gKjp5%=O9u#=E4hXU1C!q;Ad|&aF@JzmXLbG#%YtvS0(}%UKwzXDk(^gw_`<;7dc4r?!YkA!NKj;7d^Pl%Q|9t7k&wUQS zE9BjR$4;LKt}!}nC3ALbV|Ju1Wo6qEO2gi?;m*Oqjoj;ODW4xMB$GrOx1AiR60xOy zQ~SnEjgOiTL7*>FaN_o^MA8|CxVk;~g@C4SdJ#LIlFy~iH53dwvK-aqF!>DT2>ah~D| z59SkgPJdAA@lnVpk{x@kEH^Dl+xZh2XRJSwvNMIeK)Na4wnRFS-!8bN={f>-uRBN? zy|oi2R`Be46X98E?Q>Z$uu5>lh@G$G<;JFU72M3MYz^Wj+#JAa+#;x-*|FQojgn^r zYXpm%)*TFD8Ey@r5o-mZ+1v8gVA3}5GJ$EQ^MB5%KAVEo&$^E&Uettj0o;yeayM(q zKr7EC^0s5;Gc?8WS!cUTcoJwwM-AGrUJ!msMH$#ITPLmq7>pY<%qME#4r-OL(QBW~ zyOJIbVhir9!Dd7SzO;*8T4t!idCAT;+@<@r&(a8$w)S3CgMnAlwlu>Y`&1B}x_1Y5 zQh(5V#^Y%&-IA*YaW8fSV4#b8dHkT2EZ9MGdj#$ylUengElu-TnvYqK?;h+`OZMs| zYl8@&rW$_SA4Cv0=&Ub@CEjcxhh#uE z2NA+joxO&^Gn&t5+ZnkhPYvX3$HX9YF@K`Y_ObRZ<%jv|mrc z{knBWAwNndPsBavIi}9qGcRgN!XyJ2LyBA64GjH`Ima_hOF27V(j60AiPpTWF2RT3 z1ds)T*~nSL_JEUcRXTlQ;6Qg->M|$@R>B5O2&$>FK30Mho$8c&+DSaDnZ?fU&VS_c zLA=((J?i21XB;msx`TKfUau>Ul~%0$Xb^AocE8E<)%y#!LuY@phx|D~4UxMXYa~Tc zf_STkf14oNG~e-m8cg@kcFeQKJM{8*Qq7e*={uFqTPN>58Mm`qI1RA8uACuopg z?27fDCxKlSOWsfK#4+rpz_y{voYHTRswxGbQXq(ZO0zkSI9GoQ8Bi~a`kI0PnCSmUj20~CUeDCt^Gy- zpTX0t1v9IaCri7Y4dB!G&Dnv_W8ggV32R__XC|FyZg9JTm2+g6S)(-Lm%{8Bn@-&Ihs(9ywq?RIqd9vVTf&`%e{R%F|_B3E&I(BBdjt67A_O#n;rWo4$nK*G*rh z>fGC`q0){Z{?J?cqjKyhle?K==P>%mOuQp{)N`qw^r#^IMAORi_d6rGHRL-<)%Dfuc442M{^kAnJj{nC01aKACW;JGH*wzmJ$4p%Df}?56L(T1rJnYsW zJ6;K3N*3`zBG*k89H)@Y+e1O|X%3qbzaRRi4xsVNxwJ2D<$nvgouedWyFA@@ADuv| zCBR-oYIxg1*~5?>y#UV$O$VKNz8E5Zc0eNhs!e7 zO+H@nj}v2W6%9(pP1b(psekWmjEaCP=GChMi0*VhVfmhRCp6Y@(68 zXTwO7DcY2$a)0Ygxm6wEiCLYy=Sn$4*pM%Am=Y3>-J41G@+B9PCN@BFyR55&J*x}X zR$p3cqz%Kh)zUtvrFu!f-dZPY#v5nQiS+TznBCE1r3Qzry>{Ljw&LtxP8q_kye2h+ z5PZ4vhSE8n7|jgrw$kjta%+1snXy9l`UQU0!TwWO`+sL!^sc=A*>&?*cUsA0A6sMd%3VLP>tDc7<=$7CVOc`{0E}AGPLwuxBc1Cir(`Mi2L`t^f)6(Cm+?m2RLMk%5TZv?}$+OZ-S~;7U zS3A3MiPo03oH!#q6zOu!AF1@k_Q-zsMA!rWx#G_8TMX7H`ZriHF?_cQbwK zPk$^cX1(jDAIh|6O44dYzK5D;HtZPWoy-=xu`iLzChhK2s^I?G;61SAp@2BpsUJRz zYxHFMahCH8&08pSeC?&5u1w+6r`E%yW{~tzBa>@STPfR=M_AqoOfNp_Em}@|)Rfn; z{B)SY$Il|oz;7hD)s!<##OoC1TSu6W-+#*5r(F%*gLNl9M&A3CVf`^Ek+ypasX<1V zhpFq#Wb!Iv)=M%uzP0^)lJkj%D$e;XXECeSSGhYbDUG#S;5hPS?v8vRbM$M?!*bTh zw=;ii;NEItpKZ9Yw_#<}H-X3`8e>uaIBqMV(mgaHn zKaT_F(SIHX&*Onf9FDb&<5lNz^gOJFco8F4a6{PNkl^exY9}$q!{bO#ApZ=xUL^0} z_b{raa1)FwgT>RpCih>Xfz7~=(0^fI2N6@$QT4nH-W>P=f>YQ|W$GU;0aLC{A@Ag8 z2^Lewg5y|(_i zi&jnI(=_KKJ`-yl$1~$NSHyF%*xu$={*CFm&lU0chTl0_#P6MhRm2~-->-Zg&wmhI zt(Wk85q}ojR*x@!3{_{bX@3%5i%sH%*s7y#gT;j<>S_g{BacUEsU!~T{ceiXYSu;`;WJRysVQuQQuEjQOJ z3!FL9X>B&wSVuaSijk^*{KKeOZmvG__>)-LyoM;d^Bj(@KC|2`N`EkHv@Bj0C`toQ zZZuoRlqkw zvX%g4Y8jW?E>;q{402CuVV}-?B-(NjYt)F+f$zCv3$3*VtuCyi!ma4QcDy*ZzAHv67SVx6Ffu~$pM}G~j0n zWh5H7YM^M48Ajk5cfkwEt576;`(LLxtH77GbLD%}D+ZaJO@C^cyI|ml;+w|%fNLzE zbyJL%`2=|=Fz~Xw(qb5uSkfqQ1b2bc$|aIn?~>u!X+lJXT;4sDCZ%dO z{ZzS$o~^t7AW%x%Pr;|zN>;Sc;~t1jNb{lRWE&9cZ3)Tt3E6QdBs+CrA_~d9Z4B)84SJ_behUMR_pRTe^*jrcG~~`X+PE*{QF$U4iczUi?T% zUUjr6){}^~Y1r)1t9n8bXT~@u!lB ziR~#$jvO=>CC`C5YNj^qL-jRmH)P)w_N%`6@1(kiAzi=^;a`4@DCzP|G2-YN8x6d` zWq0+OB3L*YsB4swu0@*Z8V$6_dKQGcY5Ui3$HTPU6ST=kxOD<1zDk>Yhx_XFcbbyb zfR%2seSc94#St1VB*!mE`y!UpO?zDMWEt#n!H3J>UKf0A8SHhz(`7K~bK%!d!~S#V zk5-+-LCxte#EwMG*033C;s0j-*NPlt88TySIx+N96*fH^({bLQgExKC%=FC*PT%sA zHoVQ7e*0;+wl1Q!+^@XLt68#z^A_olm;WzNOAH4Hxjfzh;|>4-w;Yr4WoCc;Top>f zb`!BlMPhF#v9barPmyNe-45`U60L8FO3z#nD2EgGZv;LFVYI_I8y zXTE*^{1w0>EHS)0Ice43SUv6zMdVrQmfN>hEmwtcAbA?7$PSe!D6WMRJQ0)}@Wgfp z!W|}Am{{w5E)%h8#l9W#*baY29HRE{aj&;VwYvTb-_N9^z>&}iu~ML3tyR}*)>{*d zq0m;DcExre1;et^zT<1|N#VTKJdTBScE)Ze5qejJqN&s{iw#UN%pUS1?noZ_&R*|O zxT%3@hJ~%h_GYKK-`#0#ZZ#X-PP@_S?(V&4FqE6W5$#k5k^h9j+;D$o5C!Q|hFoRk zfMNdcqGwqkJ)sSh7^XMIwIy6Yv49y|WXNYEtvVoWCNBM~pe5iygxLUv*=Be>$8Ii|e{}=YBW}>);>m#9yG^tZPTdj$kdCcFK({69p9Men8$bCddL7zhLIoN6ePX zpRjO>8|7PcoWlBm`|p7ky?N175ft=1*-X-HH_5V_R6#8GS{{4=A4;59oWn5x zH}n6@_s{1S09?UXz{hU)kiE$q^@f^4E~GByRO+^N#$spMCaK$kn0vB>fq1#XkmwcZ zP3Y?&7bV(2Q|YRtMwgf&gVM|EJfHKef6xB?Wp6EmE&0Hy46<1|o2T-91VX_0vF*L4 zTVqMUr1h1mJQkMJi$~|ktGhq>yjM#!&Do6}-izT-!08&ds4O;>y3g07yBLlI#PmwK z?>I0zzj$JB1ThRH*fN5XVSAI`0-m>C~e~K<8xL1vKSNJM|Jr(s8K`qiB3M+a@ zi+Uqkw~F-!M*WBBwpd`QNnSxzM{X^8&UebAwfeud)dmat}_7} zTam%bg)^WvbL-y^Xywr8}%P?vE+` zfBkB#alP@{X}+~7p{PVQrqWB5eM)0kiS{;b>bg`7>Jr(RY!U1;omRcmKfd3g$3oHG zRW;k0W{j_{4J+}uL^4xZuc~j3X*!62zh=#(QBhrE(uk|UL@cBaH0Hysa*~s#$y7qq znHEe9D-kq44F|1-PE3iJPM>hZ_%4XMf2d5RnKX-O&SX#$oyJrGvVJXS*bIuv5RIyO zDsm}trO5%fwq7a$~2!mxoE8tRWKFf%nrCh1Y*p} zpk`~^NtLujrp2@rR_TFp9aNoTH4{#vS|+=CSpu%aR9@}RH|wgJ9ZsqzuS|8+e*jyV zoP@MSL9=nQqW8gw?_;upA^1;qt`HfSvf;tnGCEVHGw3WP*Tj8^mV+f-Gd*%lF8~oM zz+OQsOXwW(ftvzuCegVWZ!nhIHN(@I)t+@)BHG;&i)k^5&dVq@O;(}{m?Ytd;J`_1 zOx>*oBj<*qA^p5O-Hf@klUitO7n7x`!9kbgQOMY7N(y@f1%=6> zYv!htg2MjWsavM4g1vd!PTesO)s+KT8tO%Y$UbyyUrgJtbP4Mk{t*&XE;VCzGyEf} zJ1Hy|D*{$#TtLID~u|i73%- zKb!*yap5@E3QC)0x{j_#7%Snhwtri6Z&ceK-DGGL$%v77K0r4Xe*@-&csTY-faE9Wlg0FL`Y$klnS(xsTz^?2r0Nd(G*+4&^cfg8J`mT{h*y}{L3bgC z7-SN9DBS1|#ZgrMf17DlhpNXtis!=ZZ5|WelXi&#Pqhd!^?(xT53BVaZ*ycoY^{zA z>{G%CwFV(^H%{qRq)JqQJkQ`n%y`yjGJUqQoQe_A%aX24_>&f?F7Y*YGi z+#~d;aFl}+2w_{ILlD4FNL++!Hn(fFa9GVG*CeH6I!wb%?&`uYW&}JY)5A0(+8qA` zuG1io%k&UE!LVs+%!K=%k&g|JyUND z+qEKJi!3G4e>af(LgG!=VnV8H1+}Kvp`LHjvn6zl{)eglq*9rGI&?(`{pU01=1`RA zTgZNBY1`EUx>1x6@ZY8vOXvmq4w{yzv7Fo7r2WlFFVS}e+{^ISh%(Tn;-r|qDed6} zOErkULf@C^IQ;;{!s~U=k5DX5Do9fg*iGjoiGC~sf8bPg{u7yAqn|=XuXpDqt1qr| z(9iJ_QFQceaVPy!a8pOWLScv}y5ec~F0XDan5%z7zZKBGL*CV*InwSp#R70rQB8tb zmcy~Xr#}dl{gG+ed&igPPsnI#c7>IjVvz8C)u+HqE*F2HzsmGydK1*D&yUxn^|`vC z)@fo}31^f?2^UTadjfQ5!@thdVWg;v)XKooqA892X%~r!l-23j`@MdKmmPWiZVi zmWySUMfofVYUoHp(fCGnz{yV0s~_fRIN$5we;H62>NJv5Mo1^mq!$H$E<<(*gVLd^ zPM&2bnahzY!)mlw?=xbu)ycDY4s^wCoTNqDwRDAc@;o8uamEl+YS76jr6mfH7KrM8 zoEM6O3Leir6~#^nr19#^6-cPOm}%*$;Yhp$vEv`%GH^1CKo{BTAAxa zf12af4)#uxPK29rqtFY6A9CQG5A(zCh;l zxCvRlI&aftXRVN`8GZ!?HHE`YUS}??e;@1T8bm+WVDxj0VR-3Drhu_Bu#7hfLjK&z z){sHscF|uMR|`h3>q+cAi3sJ^(d@-_8JajqYYd69O3wtKy_$+C<1Vj)@&nnYse?EGZ zu#sHGhYm*1InQL(gA(eAB*J{C5Tbif1! zBu0~}Nr%a8Fw6$n#jk056VOx`DXF<-UDG!I*4^v3G&TEMc5mxw*|K}XrnVL*N6|)d zgf;V0B%}E}gHAD$@MRnmCW87)fAgt3H~|*|Sv9)P$@@(}%r5qr8qxMa!IzuPkQq&~ zd^oq~8{ff!SMk+?&NVr?K$u%MdLzD0=Ie!{x(jH?ul4qd*!h5{JUdKZ|Den_@=Z+d z?`+!A-rBz2)7l$Ff7k5^CgM7#UsJ0d;qM;d@1Ah_<_L3fv?tV?5U`=>e*`$6$HBLt zABJR2U2!dpLEgBk;9HHUkw1+56V`g2{83sbSh!7G>l{EjgL{5lB>X1+1XD!;Dbm*k zEynGDs4Ey)W);$w#GjJ+4w22P3g)4F<(di^l=*hXsAD(fV=8#%k!E6TS_g`m_xUdV zY%$O=1kEde)QoX4tSQ|Rf8Sl$g$q%Y_+A7%X8HYEZ12`kMAbyrX4JXQ^B0QwKK`PS z^CmU-s#a63FUfolf4P)4GtCYwk*;o~GWY(c5{2Qmf`sxkzN*kI(d6eB+G@?HVpSo- zjHT}FPJWOdlBtNlGQ-Xf!ym>E4n_BAd(}q2AxfL7D?LgO%neBVe<-3kGQPlcJUg1x zc);k>y3KMDuQanof%-HVqL`xpZ=2?kQ{&c5++C}L!yO^fukly;kjw}9FjSIc8u|Za zviEpDxQT~dM0^A@T6*6z-a~lA9jm8mNxW*j8W=eOMF8Wh9fK&Q6Q-2~vi0Ose{KSQ zoSzU)(NU(kg@lgAe|0Ec;-_-&1;&~aq%_gyM!Jlq&+sv(OQs6j zli1*7%%qQcR_3P}t)U!@sVK|{GoP(j`1|72A7n0n)1NGit1UkiCam)#aoy)hf5PxP`8DyGV=?~(4Nl%=SO()~ zs4QbmX4a0laLM+jtS#{J3;w0dKj&XLDQrIdM#!==_bbaJ*rwHfC-bZPdQOwLwGReF z<@f`-go}3H*E59kw|HiZc zc5F!Zy(ZT-^b_1qC!nkpmvUy71H}YHjw$RSM92iH8%VskJGF@f7;>s(XLqYppJ|R;HkLC=dxlodYkweV%f0~y=(h1`vIV95uTdWqFY_V7{ z4i^Q(T3mHnButb1ss(bjtkn|XZXTBd($(%}7#tlIA68QNW+1DpyUC8V9MiZkWzKLYU6{L*(ilp{77vU6Ptp zw4vTFHvLCv3)7<`v^6k7+XK7mcDpW0Q6Nbdce-{bsjD+dYKnS}ZWIu;DcXCKEI4vH z1*wnbQ6*K=`DC$76W^K1Hi}oMZ?!~=i6uIJe-wb`dlS(p$-os`c=P}P5Pg>E1~nlD z%!vIpc$USNCsRnsU5t0K4b|3VxR2uhWv;j@k)(kXU74h7%pd;oDLOhrPX&BMUbihp&m5uWn0$7({Rkm*4)XKvBJun^rYAw# zCnf2JgM7bRa=mI8W#$OI23&#qv!T)BSpP+memzKTph+<0>uw3EeWhjmN#akxzf+5QBA z>2%uyu3NAMzB&)_MQ%Lo9Hb66{I$tvcin<@_@BY@CARB@3z;v9?LM0Awi|EOBzJ={ zQo<0aBis`x>fNMuGj zYdWv#Lg^Or-Wvq&i1ISbz!eO8gzA^#y?b zoBk|*0Ye+1C%Nq|H)HUJh)#px)OkbP{M%uTU8e=loUqQk}pXueC0 zg1fh9zEBBo9i`1eAF?PH6A*YS(INnrVCh||F*h#YQIw-BMe~h{{fQp>G0 z)AAa*EN@VmtnrH2y)2&z1eCxHe!1^pL zw7y9m+iA4Owty;Zb+p*lNR_s8Xo>AST57w9s%$z{+YV5T?Ha1JT~Bqk+rY0Z#%Qw| zvI9KYA;+;1emYRQ8?O3HV57)VDgLInHpS1uW0U;CMiFFzf415(ei1Qdcz6vQ{iQ*w z0LsgOwiJI4?>`K*9i!6vCv10bhcp}8q=qpDJgJAOz0_uTlA^kl5YLjdAY8TJtflCX@@p# zt{;@Wtcqe8x-MP6@2inHfIT@MUIWM%*jNw7R(+>Bj82eg%7CX{I3{fQD5n{MWz%=*-rvFe&2M9d=uBy%e008U& zlksIUlel~(f6Gb(F%*XXShW|&Uc7DGje@PV4pBV zkL02VE_?tVN<32)5jl{YbMl=pki37qz5&?B8pG3geA9feyWG7MLC-$4-M(G5-O!Ju z;;{^anjiKA^|erf8$pKyZffp8xVL8H8~d=&l@V1tfAVTRk7_b;h{oPQw_7JxH-F~) zBc-TuC$u3eHJZDP-Fm}*%z!cETH#2$;!G;RuoY_0@igx#;oNH;MM66lfr+_No8S9s za(^1L48r7j=p_ClYV^5OBQ36kG2A0!>GIdo zinR77${MZ zrVp5*j3~-V2}3)hu&_w$Dpl)9Q2>SQPUi*1oe7qz6RbP~Q#3VIq&@*qO9u!Fbw9aU z0RRBblTm(4e_IP+l+~3!=g#AwnGBE+0uB!y-g!qr0uH_)fCQ3Y2{9c(agzKYBa@jp z4>$YpF)jqdt(d>8b|IZ^Z zq22B(&YAl@_uO;8^PM~R)px%1G!dPr{)*}58*kjUfBO0bJ(1o$X1s4fXhCoPg8Bu$ ziNT?0ERv2U;thj|J`?pxGiF9oCK?AKsfOMGvv*G_GniTs>W{=yX8nSp-3^10p@yi; zVXj<$eoxN|^i8hLjqlIIVyM__CR3Od6{{OpHm+E?;06ydldm(8N%oo>qcM|db|SgE zX?HTxe-|^G_9Y`jLuRt6HJ(aGVlji9Oy$=^_C}gwk@)VWtv%P6y=jBoOzv1>_ii)E zG^ee^_%_|RhRM^H*cXo_B7IC}m+IKM-flwY|M&D%Bo|N3?Di7S9lkr_E$Me-dlzN5`gEqIXXeTiP(`a7^yLAR3RR zFJii?`V6}~^S=J{CTcEca#Yt`?x%8^?jwULnb!Ot6gQ~KM>DC?Pg7}{mt1s~pFHH1 zZ?pa6qcZt6*H3<$BHzwtnh8IN_7AU*rqao1PevSZTOyHW+EU%7Pd}Pyl4aJk6?~x+ ze_i9d*VL5Uz2!cOY}q323v>F5=Q3yk3~cVlnkl{iEBv&G7W-%+Et%kS)?r}M21g|NX$ zAMQX^b=#@8X^m|B0=iJf!_%ftRNSCTn2cy@gY3>v>u7Nqt)&*GS*IFkT_zgqlf&PD zWiHj{5$r2E(BM)JU3!WJxii$R*XpB9h2XBdaF4W+uCR%NdXyR}ifOwqyAf4Vf- zmoQVocp@F_O~liYXgnB+4?`czGEpsjz2Qg4#hgtkt9%L(K3Sud=wQ=t(my_cw|tZBrSkc;!5n1m10aQijG#+i6muD z`9ltt@H}iRUceX|7hCL*#Z6gSBAD|D4bv~4vR$F%aKr*o}(j#F15zNyYOQcLceN>{{9dr-o>C?u=N`T>Y ze)>55wM=qI?lL^IqA*h{VxSIfpTJS36PwKaIYc<+s^lTz0XpoXfBWf^LRHN8?(~44 z9;BTkjAao7=ttbs{mc~9lZ-M*6h!b$GwLPgs zER#0nT>SI}0i=cWcdXo(i{D3kHN6Wa`b*uAV1ERs*EfH0d~rMsYF4t(U}QKr5ZP-6 zdrUJPOh*QB$$=>Qf1>Gu#>MfLM7%$m91NxhB58b>!KKB6I|m}TDV>?YrNNZ>WIeU1pKbaT=45X8p zl;B-T6U|21STVZ@b|qt>;Nlc&?RkQ23Cl!QbsjKt)Hf7df4Vreba8xbZyEEJ**J(LPH*;v>puxL~10*P)C#In#xtDbL=(@FH>tfE+<*nB|n)_%)cJ>n$6 zObX_S1beYbY`3^;eK2L3`cQ(=bV{tfHwvc$20jMY=}#mFBk=e0OW@Cr64aoSV}Fs3 zh$lV)?ptWxf0l`-qk|?$p=qPbsE@`ZoKFGq=*$caB>`t9Zu42iOXn}B4s>6lV?H`a zPl6&@J`N@$6lo$F*Ia@78q-9pD$kxKs`w23y?FmW01QgB8}t=FJx#}bAfG1y3z_(J z(IKXDN(STns+Uioe;CnpMRdp_l3y*Mq>kHP^U?G4f6ss^GoF?}%oLbF4L8IygJx2@ z9khOd{zdwKW5Pm3T@3nHTy^AQ?TMthA!ZI@Rv^Q-gp<8U{{~=+oBPvt!>LpyAHx5g zz9Zegi|BFMb~ZrGVS~O8je#f~h{%5Wfgs6C^h5BmNpk|hobAboWP1^d-Uw9w2#h-w z>DP!Pe{(S{`Lh@ul>7<3;-eqaf5^%pukOJ;pefkve_D|DDiAbh?sb{|egUGbnRHPU z`2{S65LR5tbm?Cn!-^+@ey`InC5XKt2U@z138BCzsJFrTF{_Bz?JubIpECRl3@7X^hf!)e@8|k*7sUrtdGtCfLEYwV7_}+SaVIvo)wJj|_PZ{jRYDq*-(A$ngydx6>d0bs0{W-Ho=B^EwvERo&o|4NV zf9)+8JPr8)PPZi%N#TB1PPlZs5`!yP@@lTM?v;+vT!nkZ>6LZZA5+N&3wF zTl*);lUn^eo96(1c`j4%PbKySBenLXGCe6h+|NOwBsDxAOE!9Vq43AnlH`ShyjXf7 z5uQ_Gm0Zj;7&);aSG+43Wjech;_23$e|p%pT<7B&u18QvC)Rehw6=EInl)O+XhL4m zzJ8^Lm%*32wr^}$?co)ceb)`A1wUt&G7G31ujFRYc$G~Tg%R@kAafkbT^Izufu?oQ z-8m}97XVnQTdmIJe36eYVIYx@QdUn-Yho3ATnCO0Jn2B)5q-f$~#_VPKr1=hT5+t$q+TDE(*9n&Ft zi~AK4dfsaFyzCV1ESK75Dbk5)04buepS!HO%dI-A-@C24a5;Sk9vh1c_Vh&-72sjf zxlFxh42BaA_AiAJKkwu#5rp}we`zj8>RDcWN{4ceFfAxpJR0Ad*kd-eX@%R(bfiC` z&0;VT(z3xq1=H7x{lp%J5d(?7O<X3C9eNu1Gf(knSWWMwd9${)|}qj z5{bn+f#)!k$^Aa=d9`s?jbO9MZ!I4--MK z)}TB)S_y%N5y0l1Q4@prPJF@}MlvvHFmh*4JQ7cAj}BVTD4YF!9bfO`VSbN`@oN@ zWVy+G9=^lJx5xvEPeO>*jcI;yT3>2@So(c@H-<8jVFRo|CKUjlY@D=X&@yNgOA071l7ER0M)YA>k6ke{gxMvP7C@BmpT*LWR%YUR;)rA({@jE| zgF+6&NUi4<+!M?je@T^)vY-`F5k$YhR6FVWQHd0%oF7GA#K^^bI_;3GGv=q~=$`}# zj}$+OY%NkG3)2@A(Ic^uF_>I7>ESPdh)((gfx%D8dtCx?_GxPM@l$*p_h1{2L$X~D z|GnjY_Is0`zbuUZAb$nbFl(>5(MZA!5mQ!5Z7nCeARc|G*k$6yk|B!50ezB6=SbPP&22(X2{yJEa z)=h>MM?(+)3!JhMIFk18H^JD}7d;ku_(c%GB4cR~$>%dR@D)E6bR}cJK_oY6u_f}X zsW#<7r=eH`e>Z1AY34JLCj2{p$H(91?-nx6JOH1TI{Ntg!jxXZIVJVW==Ox4e<&&I zLVg+4Z*4j)zc;`XO|XXbdea!p9qHnfhktD08Ii)-Hzt6!KgAV@rYtnJ@+f}QPeGb5 zp7#s!0c{VVD1Lq&JcGLVml$j&fznlZ9WTRn@>vPLf62e{0zD!FS)wz4*;Y6xYuBu0^v7Y-cvtK&>>Oy)297A1{3!v7|YXbeI zf1xe`73k{B=N3h6*!DWr;#F(adj0C$me>bMrW27R)u;C^g*s}Zx)gbl+64XfML}ft zr95ggcA5LZ2pL|nKZwmbku{s~UU_Nrt2Wgx<2!&4J<+(0nI3gnjv(n#*r^2E+)sdN z8#XG022?8^g>E|SP}}vJwCa+V_<_Mhf1gKn1723GTa3&L;ZvPzr|=B< z6-ht)wVk#&_Ij1tB|Wd6@N#cA8>&Z40J^X-k@TxR+UZlh3YMHzJ?V>!+AVzsCj8{O zQNN%{Bv9A*)E@bnz$p*L9yQ2x!T;)6b>e*TvZ@l8Qh`aGJuzk`lbNBk*;j-Je@R(; zJ7~5|eJwV2>Z6}k3(I8GUQjZ%kI5U&&F5FcLd8C=t^P8(;)O$gUbFmiWY~oK0n!Br;Px)PU(wF8U-luK_ z?^6fhBSPEai6Hnzv@a+mNM>#Hf2iAW3N48~9Oo23Oz)od$k29CpJ|$0<&Ml?kD0V< z$_qbC>hvo`733lVq0)(O9`fQ_h5R)IE&Vh_%c(RC(n}bR6018=swX$b5Cv<);hm#2 z;~32hZyBXowNFr>?g^Sx{{+ozc!JJ(Ob24G#9C`4AH|Ap$eFcST6!<}f5xb3%LrYJ z(u(kwXURP>{$}klS`}^|rPWVg@_G4hTBijwECx=pCoU+WBCX< z`PtJKN}Rrse5+;oCbUJ}h0h52$8j_Y|J4wU!)D5$g?6D#3M+Nt9hzd$D(1jA4C|2I zC`uoeK5KQKy83ZiTNr-{zPv??)%&naEsh&(g0^6#7{>3zu^z%qf1kmEU%+gyg4YU{ zkiWg+mGEsJ<9E>R!T49}pC#vGb<HXnm*8}5kHU!*`DxBemN5)^l=^qR@Pmm|z%+kjivUG2_LrfNOj?#TkH@h6o z?kddjAT>5rxmQ%sfB21K^r>*j$kL}_=dysa{M;;!bYp%)412&0r}##_Ox6{KMxQ$* z`h~Of2yFgnoADGGa9QYA+v%+9bk%pd8#<>y9&nCP76&pG#(5k)F8Y*feMZPryDLji z)gFgo=D?5FV$;>sq~%I{iu^A982{!@?sMdKjniB*^jR#_f1eqH?qGxNl7l&$G(klT zq3Yl`tnNCcE74oz9j6%+=D5p13W!AGq%M!+b{2+Vwv96PRB{%L(7w_n-45CdqU_hJ z>JO)OfvHfy4HtL-F7SPP_sTCs_B|iKu0`7mYPGkofcSE_?F7}ZD4FQ*<3ch-BWc=q1 zVeJK3dK-U6#&6ovATsY0xbyEkCLcv^QjVK4h1Tiq&d_oe+(zUATC8O?HEVf3U8Lnk z+&+=*v{TESw2MBhA)sH&0ZM3@p}Vz|PwDp&*y0f6A^M~)e}*2Wg0T+^fWYDgy{P@+ zc{%(Qe>h)~??s+xHyiX4zDTF}J$<_%>1>C!UQ$QYBo3_FU zwgP$djR?7qFmTMM=>cSfG0QO4Kia#ZNO+Kn(vB<^Vwfr`Kgak03!nK`noUi zAkh}Funu``Kvf>n8#VMs`C2_bl^=@ca64|>y|k=eN5&~uWQ2i(0;rZ2m7GBU1On&A z9X-zN+%d*C%-|abEBU6|BCDJnatGYce^RGiJJb2mPte9=d`mbS!eQTuz3^RGe!n=t zhr{j9(!7AXVT|v=p9*^JwlThMgnU~9?)DLi*F)fp#~%j(L;~&;bZ$L@PVG^?pJjKS z#28uqo>~O=N2RH#j@yst6vvJ$`9Zzoo3i|wN*)or858zVTW>3o9~JOmzkjRue~W>i zFLcd!Fed4sLr^9EUF|48ew?OLlJ=`N_z}9E?$YvubiYXcA^%h%^6>BYq)4TdOG~e+ z(6U0!P|F}^s(_YftEF1jsbyMjR@;>c*`;>q{#UB2wKP>i%WG9y%f0GOE$>zjiL{`F zpQNgBx=@0X%V1@2xxweiCn2Q;e@ysJ(hMHQ{VmbK4oY$IOlZ>$9y)3_mrvTP0qPR+ zp5BZ$5Bu#2rWH?+i-uMYX}(SKDm~X+^yGcIpkt)2l)$Si4Zg+T15Sf)&o3>333c*u ziw%M9LigLP?zh<8JsK|cBzee{^>TGonE4!;xv1LiFT6Zoozt&Q!u-K}f3?`!Yd?DB z_+n7gvk4VAIfEb3xSPbj9l%|%N($iHT` zwcjD4{DG!%1(owGs^AM~I&VNGxCtk|o2vMFn#n(;SxV7aDnbDjrP=Bcnxo#t3KjC^ zWAlnM){y*RdtLn)Kk-<&f1@^hgy!U+;%FW!D)|^b>vM%g)=kOsGj{I=^!^9w&Hr7U z1yodB*T)AWq)TF8q*3YaP)fSHyBk3SMn;eZ0Uhb?hJm3Zlm#n=*Z}vI+o||Xwz5hvWs6K69dU>7{8H7m%r@z5aB;BX9b;#PP5 zvLvqLuoPac7cVXdh<=~242k;@z*4#jd1oGoW<5`F{j8UrCRAyxH?D`s-6!b9bKQL$ z6oN;L(;P*?$Sj1rxbYWwKVp20N_>p4gDAh%^>xt|!oL>rtc%N-Rg~g6)u2PGM(Qdk zoUdyEby-zMll*)ymCAU#7g($No9!B&Zg5^d$@TC}k8Z1z8YHsl*I$(T7HeVf)x1@> zvM&zLceMkDH5Banb!JdKnPIVQvN^rt6~XMeLKg092P%YMv?jSCy>$k7q39L=;}uGZ zk4395=&8gLMDBHP^5ZAR_NUx_+WkEnOzdU_dNttmfZTj+ZPK}M~PJeso2A-M3#cn{p@QRbgv#`I}o#I&Lxu>roSQ9x_B#~AYe1% z^(c}}KL7%&73<-p^0|{-wKC|3%>gcZd#|>gpAVr)?E)6@X zUkNTw8F&L#57%CiqxA}v^d*&XuC+H0LEYk|TB(_(Eb)JVTDghecHwYTNCsI+4s1M`JPyaz(` zAVdnRHkV`4oU?*fs_5O8)Og}iOIK>hIsr*2n<-(Qh|+BzQ!kzmdFk21J;BTz*(kQ! z-Bpf-DAPtf-`*_Xl7cT@04dNEUYfl5oiLLeR)oai#xDD0l7S(h5k= zbB%qzaAzUOw&q+Riz+HrkN0OHb9mlb^`Qa*(sO|K$}iN#E2O!dr0mt}d+oiA@*8uX zq{L0gIK)Xi;%nv|+xs$nD_bi+q+=%-?Wt*w#dkV2@RRA6+YC<_qJ2nu3KFkeo7yxo z{HXkRY+uJutAAm5mYzQ^{Lo#!Ult6>NcaXuzXn`5V;0tY`5C}o`Q50dne;+y)gnN> zU+rMU(DoFa-E7fqUyU%{bk*(0KIG?*3z5Fc14Moqe$lb0u~-RH>HD*+vu2K{_xt4I zR*h_$eRAVPzt=Q=<^5iG{L1;gsGlJ4GRS*xrct?7Ezf){)so#$pAWfk`c=mfCG&O3 zTRFZu;gJzoBj4d_wnp{6FN(JV>!Zw3v@B-R-zlDnFzTY(;R!pd` z^t?Rc*BhP@{H%QREXis#d9u1|{DFg>mY4qqZpm|?hR zsF|sr?%C?T?Uc}?Sw_eKa^7;n+fLov6I$)+@_uf?afhthfn@L__`OW6p=GSDf1ZoN z2w}BhR;if<`aS^gM&zb4;7}?*1Z5^lbgz_#dj-=XBRWVcTr!RW9U(on&k z9<{#8agiy4;4yVU?U#Bcn%+}K%28njKkm8I)5#x)FukC)_lU)meW|vADQOMC-0J42 zN3F{9dpfdiI`W=6r^c_z)GSy36Sy7mG(oog?aw=&OxexGhNi5=m6&Z5#QcK$-X04z zXdTf%s8W^=LYZpFC62|GoOGtRf-B8mS$JjAcnmDZWQ&&|aKyCBMB9fe?y7}TZHtG4GJ4KY)LiNZ2!K^RvEFm#Ut1-lwI@*#S^ zf+ao))|X}C_%BAY7W%?Q{p-}nPRm@xF&r$Xj`ah26g3BNkjS(!mIG58i2lxJSC?PP zFAl&(N`2_b`xyKZ^-8Fk%lqw&FX-vO>^h;&yY7L>O#z=HbwAACW~6 zG&D?i+5mfDb9EPiM3(Cw+W8%2K1s@{Kv&+W4AS|x(>_v{GL)1mD>4cOBE|@zxpn}a zdGk)(JAC*vmDQ{L6V>rzIY>XlLQ|wOiPCj>5C`Fh-nFZR-(ec1>o}j4ku~=ukpi!p z5H%$!$$MQx*2TriM|KlAFG{aY{C9< zol`n0#WDBc_zMD*bb5MuhT$IW9eBL-v*K*)gl9v&es?@AYw3O36FH9}YtC^K!BKC^ zZ*lYv5u8S&jgnD8F*|aT#r%2I+Mde=5US79cs)REVWIs?9(chS!tF5L(&9q`kG@j!|H`GR4QY>eOvBQ+7lcc^wPrJE+2;Cz?yGhMeRvzXrIQM2eX~mhE zR1n>6TEj|o%yF4#)NIMD_dWEl{MtiisKRLAoC1E)X2GFN0-UIyp)jf=Rdj)R6T8i? zF5fk1t6C0{q{)zP_6MQl=B&wPPrK z!rA=7@WOCn!MSoP;}gBq+6TPwPcKCm!2Z`)$5Cb|#;rcM1c(K*lrst4;X`lN@@^jP z77C?qucl>+f(N*>iaOg69o6TFsm2FFfi?q5n>H1d{sCQ4Hjyctd)8l=^I1}$Jl6OU zzE_snT#_Gm#{h@VPiZ4`6FkgoVdK=mBNV>^aBm3@!4ZPw_Iv_1Hn1fR(ZXuPb%3dHsxYIh>BGjtU!Cx$>-e!p| zT7CCvB|Js1Aoo#tDMh@>uR2R9R{5ju4T>LN(Vi|z>RuVKJgy4*2tH{&oV-QxM*wT{9{xP7tc~g5~%e$eZw0yCfImRHPusEt$}a4 zFy#!UQ2nsp86cmw7W4PNQFwnyy7NeNc+qu@Hcai3MmH5Vauu`yeNAd z@^fJn{r-F?gBFFQ@cu*H#C(F6F=ZBe=$|wf zUCpye{iFFfAdK?C8`*8IqQe!KX3RY^l$+HcQ4 z9LZV2tfI?&QAaw}D)WRVq^+o^*CBBcWl3%F@!40yWn+RZ^Wm*vKh40N@qoO<>*k zJO+q~rpa%?TyX~dN3P7~RRNGPni|sS;K(+|lxebBEIbSuE$LC*et=Pe2~U$!Zuf&L zMw;*lf-3+dcBs3liSOOVFT%%j{zENr_^0cu3-m=SzEHQq!Z&^7wH?2*VU1e}CCB5< zC9}Cz7M@eE^7h_c?9qHKbRRS(%sJ+bJCJOG`);d6M&hm_^p!E^Aw)FfxC_$nm4-yp zRZ8OH;a3@UDU8a&UcK?bidDvQY^7!^=C~0BI|?SvJj!ixa2vB9O7r|7&*@KJu;m@m zb(+j>0bi{AS#0Zs|ql4E)I)icOe z$`E3>g@UK{T2-ab;PSxR?SrU!@1W8E3TJ$#Kns!dHk=zj9ZWX)z+pLpJq!{37ABq; zxWikf+Th^zf%RxT+Hf>)Th1{dNM=bLJ|wX-+&}K$a)+4Alpy`RoM zi#DWYh?==~v3h9oURm%=XpnR7KJJK#pK%^@_y|EfKpGU)neWGbz>zPaS(jG^80Z3~ga6nX~obW3rb zt`)v>UfCs4!Uoxm=2yKp&yF$NdvA!4cXyOKP>Uihh?6r&kMzp*`4oI!75ZY|Yi@X; zV9%<>3ED8&p)e-ks;FZ1@T>Qzv!$c$6#PeokB_K6QHsx_gEx zqi1w%lo2$=+E@`Z@)we{bbEIq9?Q!&=Y=984E996YTM_xJR7{+6kVd^SztowR-BoI7;%_nxRU*o8|qN=G`P+Zd2G(+$|Rdw+)-u&|E*^ z3?M&`)tX{9X!G;dX*E&Qd(XWf)5z4((2*7wJ&|v+Wi8JvUe>)E((;&r_17qN4aV%o zRP6SyNZt)pA1#>%t_1M9-IZYzol1uPdfPlA>=9d-(cLod_C|BCXa%2~5TiWcnY&_tQ9z;|eC2ZRodn zbh(|@(Pr@H($p%Wil<$RR&&H{N4$=(Yic-Z^-|?#HBii)W;ICrt9a1R@r+L)ep)b= z;0cJmdiL_99~w+omhjiUQ%fYF>svD_v~fpjY*z*at9CX~o2g$Oq?v6ybj~vR<|h0# zmHH(@3OxdcK|$e9I=n^q^%scRZJmkqO`IUuhG-YQN;E|JpBkF`s-5!jMhFc@IAA3h zGLpu$ai5KBq-6_nwJ;@EVV1%EumLaG?qx`LI)P)+(8tWEY!*5y}eRZ;m{4iuCPYUk^YgB*7rlVA zN*`i5S0tASHbT@jC0fVa**wc1xr(a)1A7&AXQRT`sGUhGs^xcPOK}_E`;O6P6tM~?DL2}Yb zomOm~XS{M=Jq?I6R1xX+ZA`nLObRCo4rR{^L{F+25967Fj||A%?$+fOQg9~@Lz>qg zd)^pr0!0FSl46C+!km^vyak%#A7T^7+MMe$;hZHeMp7@=rRv?^>}K{- zFjcY!C}kCkOuU22%4HUzf>S@#7K(_rlZt*43`e~1j$h=rBh@jETl1h^Fxg(qoWIvh z?5k68`mr^%>r^IxgX>`lMe_r91mqRza{>u5SCQN$ZY!R->ijuk4u2-c=->g%7auRf z$Pp#(3BNY!MT1W0jC?1naT>LnJkpCaeaWqNj*cG$FvcGA&^2?UD(UEB%DFfhtM&V@ zum|c_>U@q3j!Ga&5N~-PKFh*3e4hN|aE!rc-~#+}{w;36AZu=-8%EtoUIzqrojWuv?kFEs-*!K0jZCH-g(zF3~-|b-g4!jv zJEs_E|4cufGN~=)2Mb`o$ekBF1uumQV$r2Ka>}SpS^9tH#Y#*@@xaGaR_^Kwgp=;ep}X3hy!d8rtN1=Sf(6D#~SdiMiM`E7K6Vz%^71G5h$4p}}l~@hRPiv18#b0?Zn$Yz? zIMSBLrw9M7drz>?`XGd}!~am=?i$Op7FEe7OXB%3=%Z#d4^o8r*JjN}LQ|!S;0_(< zI7&T*X@XD2^Qt zj`g4lkhc7^c4yb8;r=H%3P|gNi-@;ZyvY~nK8uypL7%dL5ILNyHuAy8z{_jeNVSt` zOYta?kL6n&(lNxxB*zm4gddPB7hQAgP>6`F3{yR)ZP<$Lrz21cz$pT$|k&l4q!|mLa|r2 z3P>mw`IN_d3vwqxLJUy7Dpru_-e|K8(#kNhLt?ie2C^F{l#CJj1WpM0q;quHhg6oZ zLzV~zNA$idM76-b0q6OL`0V*hMBRA-8vK0Wpa?8qy!@m#?blBmaA^w}I1OU+A zg4@Br`*oA0^$_$Y!v;Cfw|lnv@;8P|a$>j{qrX$O008YRdxel2P_F3#=+Dd>^0cG5 z1x2RcKp9O;pg)sG$R=-JFW9nfp!f{XO_P7$3IPC)Th_j2-+-D~|D42sUkU!}gjWGH syICIe_bLYfJi29Rvj_=*ps7XVWa>)j$V&_Tqf=(cv$?60(R&?3z6 zyo0OA!@%0iPU@zBfq}JyC6QtgBnhJk1C^)cAXrgznwqPdi7>jnrey6~qgMvhB;yN8 zb98Tr8W%aZ#+k+)(1wH}9QS2!_8?wV4j5?oARu;UKl}r_fna^S7i?bZb{6A+UTl{z zrr)Ma*j=;c7OwUZ`Rv&143Y(JAI5YL@)1rrW zck1iy{SqedI|EDC?xwF{K%u>hzw{c2tM*J!S9CF3N?ms=E!Mz}2b9-F&(JR@N_-C7 zqW|Nbf9+KbDxG$8o&-QuTVvsOeNPreA}u+w@cLEf(4O79+`s_u|!XBFQJa$){pvONDGorO;J# zgjiro;6k^&GBJPO;*zJ&+!TApbYln7C`H`hKv$CH{g$tM2=#r;xS>a+^PJWaU;FxV zPNiC0QL2f>c;yW#i#M=nfV*NW<4Ix@aDy5=q_}F$xms*wd1@Hn@<5Dg+!9hxC)k^) zXBuJVYD@Q)ASWW4fivq~{DUS4ae>YUHI5vFfaqUZWE;zY5yK{-&7C8t;S2{H=V3Z% zh?3YFcG8sGbw0pp_RVNJLP&Ge6$=`fBM-^EZbKYg*OxAor@oDf%4|y+LfUfB=Djx% zOAyo6(Ya~3xBkq2HDhcw$ znNH#!z5%dL8nLLoMERZ*#|8l5;pp8;=G{Y`-Do3di;%wd=$chVJ^{oB7~iG1QcEA= zMAC8K-lIPt{=;gucW};6a4@h>~0ze`@*CZ->rfrnFKci zDXSoZ#ZrLtVsf?7SyR<*;J}}Z^Gf;!Eo>E>Xmx;cBaN%viiVoX&@wJq`YbTZt2`_C z{G3bN3nm~Dw7hJ_;WX{91MfZa5paR9ehXr>GJ;dSQBkRz5nlvW zAXK8Ye9Y<8I5T4)NG-DZ?{IAMgrlMmG2XHnYrcjW*?JS%hq^oL#E~vI7o$$3AYWb~ zV5%{0Ff%hTrYh=P;1h@U<2+R76*Js!Jwk@y(v%+2IQSNrc{^A$-uN?J!khc_Ytk%T z*f65oG~yzla8lr6y{Yk8&>tksu?zv@Ta-u0cgmo{Mz3+jzuv&BH( z5pOx5=%XBaM`G(O$aBA%#e~03({J8y8kdgR*fmim%0NL_TjTl zNw~qi7cwooeO`cPxE614D^4M#^gGf~wREMw5pcuY0t@2b#)1vOsc$ zoik&Fxa7>TJ+U0syl)v&;1Jeki(%PAtPR7CIPXy}xTVi(*vXXmA<*c#o%L|~S0l&e zBEc7@$_kelu`F7CdORb`%$FJ7y5VCbn~$~oK4}`KTGLn_5ze9f!`JCR*NJ&rKAC_h z2HR3%kpt%cAP13dGNk(taxF>w6fQM(Iv**fGE+5XUbyDE zUU|>(K3`U?XJ#%z3J-F9ed;i(O;}%TN#OItoK$?d2gJpFmokbXOMA}Vu&bI9tla(c7XC(=GZVb_z z%jS1(nVmUK;n+hNhv=J+A8L&Yy1=yfAL)_J-OI2KGmb8;Vaa}12yldmgaO+(Am9&` zw8JfoNdNgdq`z!~kM&+}0aCEqp0`nl&lqk6l?X;6sw9V@h;Y=n9fX-=Zl5#`pym4C z?|vaC3J$9-l)^IhwIeV3}n4QJ2U07;MeDSsWqK0oLw;|5pC6UL{~#pqP1 z_zbLQk06n4#^iL2r%*uVC8yw^M}sN z(oCceOM=wHy&@%yQWHkwMsWqXg;e*vLA{5TV>yMM8s20(mUOoTz!)ffV;P2pzS1)Z z+c!SKrp_+(sjHm67mLLTSZ;|q>3fBORn+rKgc1BtTZn((?b`W8l8rM2nlqPUBR9*2 z&C^$y{!)}~H_58Mb3u@wU#UC&BCi&Ge4mip%1%`87=P#y)3goAbCL7w!%ufbI~0@w zzjhZl)BUgq&C}uytIkK=M74I(e1BU2pwqW z#|HSbq{QHh5yQb!Pw^-PAKu6q?RjMB-o}4K$k0Z4M3pTzb;uE5(bZ2Cu$ROEJ`|$Y-c8>=Ov&-l8?pMo6NTH9PS`m8x(+{8@0}k>?wb=%X z`)Zw9LQx88(dGa~2e}tdK7YbXXoND~uOfgQ@uH%1Xvo>EjGD4EV!3!kAqv6b=9q0O z=FuoyiEJ=?zI3ci>QY+*`T&>OVUZHtWrfzI=lO(zc-HR9|2Go}*z3J$%DTo$B zz-;}n`miO3MbdVQLl@{34i?9Au>2J~(0VPg$sG z&s2t@y`$o`vC*<~t~i%DjR%_33ppqWw#ykvcv3`#b0r{&y`H+17zMa#D&d%?(NNKq zNR2Z@I0|35UWHR4E2+GiWe+h^!gZ+}q#0uxX!JHT=BQkgl|kdDc4~Kk8+pZ^&Me^# zBzme7IPD}-+glOrX}NiBL{n~LT6Wo{LvPy=n-sjpATO=|^WC_BKfI+`4m74fn}gvS z;wWj0J{nL>FMucKw?xl*yOVFF9I^BV&PXYoyMCMU>5Lq^rja;di-T|~0oJ3mfg z6l7=<_ej4+fv!f~W`%yG)3Ti{!*^k97TT0_j$UB?uPQQ1OT6s5ctd{sl_?|4mSDzq zSpIExC=I>nEBF%o0%c`Da`fr2whHLsR)q~<6CJ&%TsO%_)NK8LoinTHTEVW|<2`P{K7!i&$*m+&vHgDCjEh`W^A!?2+{xril-qUX zMIq2ngu~BZA>*bXSdpI0O#8NhAwi;G(kvDaFB;=Xr$koc?k!31MbWPkdbh8YH;M3& zH-8_K*X;au+eW`XXW-$9!WDZJ1taTpGQFn1ykm<@>4)yxLCxq|oQ^4o-fp`&eU~r{ z@4hN)V)5*@@})lX4lmRAvOOx74c!lR;ucu2Z^@$`vU=^Cs1 z=4kTAL|?vd$- zrxo%u*Q~Ll7xFuq>)P&K=3u`knDQbi!OUc@%o$tFiP-mxNwPbp*q)%n>3ge8Nqd^q z;zVz^*r~$={OHrz1Y5`2YZNaIEJh#-(u&}UA3&KY?^>C11{&US$q=OXp;d6P3wt%< zyS3Uc4H*NN)kt2HCU(vqi4>?YUcjhpu1TvEEBq@OO^Tc3<`W zcb*;P6twU7tEpcJi!UnzHO#J3;!rbGWZS#MRM$ua-jNFa`vi*%M&$d!9UjES@{T~^ z&Iiwd+_ZNny1)1-#QNhmU=?X|(eTCak94t>EE+ooIwq2|hV*_Bjl@7>Zh(uqtQM9v zo#6@b4fEDB@yqKo8nPG12}EdjR|!pB2VR`YcmBpV9@@c+X*iG4arm~et0@tsb49OT zS+#Zimg||d^<+C_QRf%a3@!V)Yq2Og;lw7?LQ;a~4WjF_Y5m`4wc1ZqUV-2KQ(+OG zkzPX>Ffcw8FfbK)h$Jd3fh31U3Sf59|5>fkziIs)DP$~?L)1;d9w_GUWe7Mw(G?X? zW7u)LJy&iqg_O zxqtC=x6IN*jpt2>2^@z&q*(DV*|3)$k!unzl{m9!)0ELlAAz zZ;RuL{Jp;mkI7VPm{NbKw5!Xbbjeua%f^W%;mJcCyI&;#F(}uf|kp+&hGe zygC5&Rc8Z{mwfw$laCYeFw(d1q*dZ2u~i^QcEc}hhN%#98oXM{s@fzuN7E-$3R&Dt zn!eU`*Qw$S6OgN)pr7QH#x~C&i=Lpyn0;n?Y&uan&#s(WY-b}yl|yP0d!h3if$FVI zxBAifQhg+A(2pwf-$*N=bvcM5Gg0=DKyjfUR;2x&QjZ}Vy5;yE)NDwr<>mi*tF(XK z${KjC1Q5me0)flRqfID^Xy}XTZ4~Pl>xXItgCON0B!YosZv1xG9<62`(WvAo2kbB6 zNNExP;=XXU9DC78$}@)s_V?^-zY{jgfWNP|2z?Y-xI(#ERi#1|yfxPd)U`7eZ#5Yz zj|Kiebhp@}V=b`ngPmv@`VB-!z&$y;Nq`Ujt!ABnE|^;N6I4(Tr;lMW&TL^>g*f}w zhf>Pv|86ImqwQg}aUH7@47!EJmzbjZ&=kqn!z%w&h$(97;?WT13}OxCilQu!UM-=- zDT!W?!Am@0Oju%MZ`WwDzdF*ErJXFMKib;}%5{B%NJ|?7jSA-H<&df_zGg_1ivt_K zatHEic2H>+?={(65q}!?yTM3b|Ja2;X*^LJeZa!mk+5B~4Ug+aAP+qz!E=hs7wR~G zFm4LVBSDt}1oxDO`f-GIg-pQ|yGk zA9*Gf247dpqR2EQXg)M5pn}G<$=;fqW0fk^~rk zCNdJt77x(n%jZ~AE~?!fYA!w=52)O7L{Q_HowkMK?cs_Cp4@ZuHKuL?I;6AV$fI;% zXIcID8}(9XWK`0dFODa4EvSEE(dKG6-_L0Y@XwClX2+}<Pvl;yOIu|Y$TCmCUkN4A)$xli=CpF6>AXj0c zzQO(v=>Sozl;wX&mxKDh;EIJ>2IvT2MJ41mqO@PUQ{{PVIEc@4z(SALViXIOi;z>* zLtBDq9ltU=Tsb#b-zig*1j7CeRxc)c`Swv30DJ5{@xnG1G)>FLH7CZP9YP<9JG7Uv-Z|c3nJ4 z{k1zZgm@Pa&u?#!+FfzmZ<8Ln^KW@9S)wRBNXl-;{TZ6`t*Y`&V!>&L@ zM;DFX05&71f{4}mJ=Ra_;2ZV(?&;d_nBe-`1H6?0FaOEOb9wJ@XJ&I+N3ZXFi^VXb z7aKu}It-cF0z$!~2!03NGZnYp;LW@Lom=Ok4S~idY0>YDA>=T`GOXL_H?8h+&tVncG-%VYrmi54A;2USVh8m!h}L@*3u&+g zuQTV+skKvDZnhmURDbumFh|e0sFGy7&S@;X%h+|*?!pr}42=#b!%ES{feY{3%REZU zk4Vd$N^&#jQhkFqDCN!PkWo$$Z`baUcR<#FOVd_F_Vd+Szb`my3I`KsA)kBZhYo|b zg*!{>xwZaR<>Nh!0jYR!{3MH)d6++_7`Ix}uu^A44qDs!Xa2+W=V6e!XPAc5q43!) zf`dg}l%5&*vwsEx)6oV6OSG6AWD09#fCCMOZ6%sVxNryOYkO2#_qc6($o%l@a z0{A;Hy^UBxl#-iGktl;`IZ9na$7ID`$41kQmkQCwU|1O9K6`qqJuNBZy9Tl_DsPNx?ECd?|~v!afShEj0Eqv!QS zPF92$O*9X&LENZd9-`{TlhrTy zjNJQwtrH1X6+cR^mi_kF?%?DVZA9PSkrURn= zr#{=1Z{3A}Q!b9Z;dG@f+%lhtFgHwS>Tydh2*y1q`VA#QubFwk6qcSxYO|2I5?? z*1q5h7WzErFmgnUKO8(iYiO7%RM1pj8JZb-U}-pkde{goFxNIJVHttz$E_=pNE1ws zW?lfaLOW+Zr)<=^jf;;HcLdLukd@-Vj`>=@G<839Esve98NkhOF*4*7zQ4)Cy;k^Q z>;u;eXM^zr!eqTt8$kNQ4jjv1-z;6ytk<+CLQnTttGyO{z&&i(4lw9z70#f)x+{-^w8(vVFUo z0pWdqYr9}%EaV08Yp&?W0m^@q$_%3<9)aY@zwM_+w#O6Ye40dH%3HDyR&o(WGp@`>2_cKX-+)aV}VyYhY=lq%i5yw zb0DkP%0Nfc5MUL6h$42D9(&Y6tuX02{d?}&`-gVK8B|(A{9M^Q6A-u~X)zEeXOj~V29i}UD?41a zcq!UEWN&e~l2XrJNe3yB&(kClx5nZ~#pg z&F7^ipqspzI>|6jo@1nvx|>oWA(LH~;z!@!)HhHx3=StU%NL>50n@%qWk)Up`DV(; z#)Lt?1bv$QZ?!OS{r43)<$WK$j&nDkJK{GXTCLOife|T)!dd*HvY^dtWaBRDANt>L zrb(IR;;h@=1sn_xMYAid!=I$#+ zpaf7_es}wKC91$Q?|QcP$uG+t@13~M!(5{sFrJ^1Aj>#nWiz4?%QiM@L{1@8ZHvQh z=i#aqj%@x6pmkA23Eh|joPm?xoJrUwZ82FgZ>M4NAw;8otE6L>mXfA7V{toySQg*n zEPH4(+xffYd502o=YTr3L4@iGA}PZ(O_IBz4p+A1lY$Y@h^jd1^`#IMN4(8yg;7#} z(XF2(Q;XN2rL7{mslfIu>wC3}I3Z<;v%~s8BB~h=&?|TLzG>#CO9zXq5lw7pH)3_z z?fAY}0ADU4eg@I3k`l7w5w1xgQQMW3&jz}AeLB%eEIET|yhqj^mvaZ%nl@+V?5UXf z4^JHAbk12H^YYU+ZjuYEob#=knA?oWKKE_?HtQ+e<6zaBXO;`WTHFlR1k(7^9?br4 z1c>5dKm_qgWMsH%V*)XGNVE$_DL^bs=*;4>e=tNQ_w?CORVdCNn&w&t<W@_So0W}eaz;sKvl6@#b5| zQ7HlxO$yGo+xV(Qov(Hz`RP!&ah8ZSBq>KHaKP`uL%Nyr( z_&*Ghs=tvn!-wa3F*7TjDrtz8!tx`a6JuU8WfEO+oG5Ya@?P;|2Eu-tUcfT7f9sBz z1R~x}AA;NslG}5dCmt(UvhpP*y$)pB23S%KLB@P++M4UwdRKp%I?Ws=w{%)*uIA>_ zjyM_3YgXy98iH-K5->ZEwP~WbmW#Gh{@fWZ8u*jy7o*N(V7-ny)dcCQBNfyGF#9?E z4&;3NvFE!dUO8e2q;R0WPJZggU@LhC0SC_B6p`at-7s407OavS;A)u0E7FU*)ZjGo zY#ica(H**)88KHhm}@N4uxF~wZz(HQGAS@yr8zT;{wQ29#k7uxB`~z!e#dE5Ap@ds zYWu5}45SYk$f3D*AKG0jN$#`x$DUb;1=JVb&NYPM{^7ubO6RBgeU~t#r43rW07?{y zh35ZACGBuE08fdL*p2SeaU*Msd-9)S8Aat7>vN)+@4lZw(=cx1Nz&D-R;p770T1}M zAyE+w{Jp|sjXE{&8DT8!E^Z#HdtS6TTOQV-IGK5)limCr;mzseeszL^{t!rH2y zSUhY$@L=IJnh9eiF`b#?o4w`t}FV$iJT&(<;3#}*a!%GN7&y+vV(c@T3fMN zWQ&FA4fw{32MilRpzyx|JmjsyG~)0sNwlQoaASjG$29}PnUe%Zm5?Bf3K+5UN2F(+ z$gyH_bfu1Q7lg^q@Mf9G-!Z0lA=mDgg^kFy;lJR^InX1ZqUZCE=n-pw03TZIpFWtL zZWZ6n$~ji<;XSpSt|?#GCJF_G#Vx&}3T5$@aRNrq1b9>b7=T>gU;h|&?bHWOCyNMji0!R=< zzI#Uh5g`^2gx47)7}&x$*#F;I0VHj3lKjVp>HtfO07LY(I!F#xjOJtA)ciaKi-C7t+ErRt@NK-Is2tvuqQnbzl;%zU2^-50Z`l9@T4Nk10M zHjYhp8!cx?U3c!Yl8nCIzNEplReyLrJ)CvFr1djWHcmd;IZ>sLLy`B#sM1tq08J`E zM2tA!m3)$H_3L^3x3sFPEHW)Us@3}8XO1wY4-$T`5;M{am(iIx33=PgMJ83_*1n&} zWk|u>>P0HS0t9RSWMx+5P+t;pGfqgpy}T@W31s~C?XMO1x2Bz-`Gp%Gzsw`v$8ula zRc^*fG-+jXQDdSj&}oJNAC;r10u+FA044EHR$UgUWtpGSXKWpGbQ^Lya>_gFrT^;sadCT5|D70UmpKvqiy3n) z6XO#p0HLH@K(;LP<|0GgeYvOK$)ZW|s2&EfX1*TAFe^|Q1SuR+3soAr2xNQPe;x?A za&SAai^haXa#9-cHl{3;*6IEo)=Jl{=-wPeO-gcDaC0h|Th}?Xr)uv&*J2DmWQr8; zxcbm&h?WJY)^^#)<@FmnFX5P(1vHe)LV7b zni)!!x|mJBYg__N_nWNc3)f%sVCW0N2@?WgJR{2G>Sg4ENclE0fW@57jBuJsB5Ft9 zO@ELRZBZhxOZorFc-Kcb9u_PLo%CnMs;2pewi}E+lc?kRu{(;y%X)^JF41lhis=ZQ7lg7}XnoFhFr z#T_R~dLeY#pP`ud3LRt~fcsRDD@d|J^(tA5di>S~JXlSZ&WSml4^P2ed}kkg1ahU^ zaZVL6Uv3AmmIJ%Sc`^55JtB8MLIgBMBuQapd;B8iC0;N`fVe%w0&q!)wa(2kXKr_} z*F+|%h${t}Arp@IR?{W{BmRLwu2*BESX?>U0YFh491b7ke$9RYKG-w~c_<(miE+jd zJfq<4Io3sG|6kCA^ZYNwl=>_~!2!nSE&44B87Z4|Dkh0Pw18QX@Q=!Ho!vZ>Phxmd z1|rRQ&gZT>pzSFt@g=coJ4M~gUSi!80ShJ~pCkHl_OmdH$gVY$jhDq4+qT;XP5(D& zBNNj{u(UH7f*%pFW~(Ui3z@bxDiefC?ow)BZV!|~>z?rU`|5sL2u)%^e5V8m^PFg7 zQ??!R%enKo8_Xf4+hkJ}^jUW&;zz*H?A%z<=U~k}Txv(~Gn!#2_r6E&|7fb_m&s`G zKblheA4{R|^8*#-2Srf*ZI_pHh5w8$iz62lvsz&WN09_$BVa=1kJ_^-wr*3HbJIqw z5g+v4kOT({_YqSnA?$P^I_~)1TX^;Wg?hjUOy&2?+1e3uwrUW=lclc8@t?Lp_!i?b z*1swl9upbJj*+YrQ*|!n&%^xT!&_vkd^eId)CLKM4S{6RIT;qHgxMVCeTIOK>1X)r zUv>Uxgi4IoRcd5~3+d~uxRagfD99NwLD=(a{!HSq8dr@2p>EY2a2FO-Pp0JLiUDOQ zK>DA>r*!h@zoZyvY~xClJy@9QgyK!lY=4aebn@r1c-GO>@uYT;(ARBeoJrO+0j*>F z>}WG{>y7vIi|Kk%X)Z5?HB|duppYxTGylF2R%z9NY%t9k7>&Pi2EEdMG23kM_?h-c zG~=Q#a@1sQUFHqJu9bQ2)Zaxm&rI{LoI9?0L0Md(ukt4U&uEt|nc}JcGig=->o7(E zP?Gq>kdqb!$bs&flb!%goWI*8EQ=gr=sRl0u;A7i;a&3HG>~&vy76F~Dq)-BifnFd z01GNc%x}9d1A+$irj=ew@J}>Mf`3M`s@D=c9dI`{$>H|Eix#aCI#xnGju2i(Fa(o&}B!% z4%HYEpQ$}5-vLmpMC~=ftdOoA)APe{gBXZ#|E6v^Wae}-bDbO~28WWUBDw4X!`GNW zN@VWEL|~Q^MiaZ6(ea^xxl3g-AFt2%)12Vq(2Q{df*C|Ye%>t8A1AnCOw90bY(w-I zR(c%oL(C_#sW3jdn1WFM;#62x8jx?7+9MS%`25a2DZ}6$Nyi*va8xWZgJ^mIa+%I> z-k+A=&Vw$vTnvaAOs>?_HA|tz(GcjSNGozN?!cp8YPSU4{f}*j?Smj~3!UvK7VpPB z@3ZEFE-4MG2bJBaI(4=}crrwTnlhJg-xhMyL}R{C?7C(My}F+{2N4zH?i1q~R(#uJ zFr*Um^rk~NsYDzMgZv-DZZl!1(quAivTTobzZ~HB5p2-PUv<$hqSr|6J=v-r9yw=O z)Pd3j;mQ_BX%lUkq#spgfJCk7+52 zDeZ&=k6JW{S%(tq`b)pmMx5l^@KfF{6`;<)g`>pxTXiq-oc@@xCHxW(o1NZ*-xC633@A{E4JX_nb@if6z;92 zSrA-qcm_KfSJKUubut)!a_yQzWWWnXsP@8mHOuwm`V=to+5Q{g3?*cJl7F*e3;`+6 z@V!BMXr&sJu#W5ej#-JsUF{XI(4Kqb_U-G+agh5=NlWJ zLY)?x#&hl3!&Vq~@6d!&9bZFrlyS8BbDT8&va{V>BslMh{duw}fj;lX0`-5ZGl~q3-R5n<4c*ijk z;Y+#uC7A5Tg*q8_*#qNLx-WQ_bO)79eyVeiVnSC?CCZCJb6ViY7X;1q<_R^5k#Y6P zZ{c`pWor}ETh}VOjx<)3WI>o77s!0pns8zLX6@KIkBqp-!5bh+`Nk7Aag**wXM^LI z3XQjp3a%AaE7bS+{!$mKw?A9Pv}^L4JJ4t;a8~e!_&>>N$LR$pfdT{5`k!Rci>Uzn z9Txvd)+U8}(nwRj%9T*FssRFg$}$;+Mt>x{s4A}`7r-*}abu&oP%9z;R=BU78WJX! z;DzRg9j5aSlt%vRZg2LC&)4%!Pq4UKk-f#o$IS~yoiZOY6vtk7N zli_3>Pcs=G6Bj1`s^cQ8o*92PjwIm7qM?R`Gt;CFH<3hK4#8M*Gt;M@aOF?qzFG5+ zx`Z_aJ+e~!k<-Mi6T_I&cbIo;fnxIqXC$#7PFhP!^YZpGdu>kN6M1<#ldbd;8W$+o zOVHKJp!6u2nNrHT4O^gQQ^>BBi&Jph!3=_?5!#a@6RP|K+etK`bTD=NE2@DtIdE~Z zBK@gp#7(MDS26d9Flub?K@EMMrQ7Z<%bK}rgzv|Og=j>|E&&)C%gB#X`{mdFD@BK| zGa6<66F;i|C6vM_C`nJP%>T^LwktprJu6Hwd;Ayb>=#2 z_g`6+`0v*peqduA4w0arm-|CNQ(0MSyJ}RdigPdmn-#Q!jMxHC`pz24v#iDuscItQ zp|(wJL$1mr3yguqrUe1&k?k%u1Sm0-*}d!=-N&4GR#-riZfyPiQk+YvNq$m`uY$jglm@$-8q+WfLXWE@e5cU+ojp_Y=( zmMI$|K*P!vx11U+{1&yP*CtVN39+-EylypO>nOkW_Y0sI(Aq|7RGClvcjJ2Lg1mo z&eh6x9y-nApC%xLaXt*?k|ukB#*|T+iIEFifz?)t`6^i{tE@TkA>{qVRIz_!JTtw7 z@6pAfylDlxK>w->kkT1EfKo}oiP4@3wqbs4{P%EaL&ebWv%Q59w-f@lrBiO$mZ0cR zl6>U?d5VMVAq{-Lpu5w8zx6MCGf5$n#^qKh5r>mKrF*tZUANY?0ft|5}&)FiRvPh+0@8vwyD)2wO67=}YTl;6R{`^m`M&#syVTtmNiy|0dvvW;M<$Cb; z6Yu6+v_qUK@m0|Ed9ZNhm}U8S4Ae6}*)L!6Zz=F4fUvy6o_boJ`lpAXmbEklMV^K&P@q~+A)AnQW&{Um@~M~i|B%eS-X5okbSJs+t+>y|j*R5VHh6Wm$I>;4t8N>zg1AFEmO8uBi7 zw%&fW+VOh2x|0=~g=}Z1DSmsNZ4RmEn*yZJy=&xY{e}6v5*GbRcU(u}#6`7v;IGJY z>f--s-OtAT64vSxrJ*cYTU^hiMKvWE#QztCgXq)+lT#lpy#;r4 z&%ZL)7XHrxUQJpFK6r}aS2y@Q<0Q3}-m#;ZG{EtRgCH6EWPo88yw&Rw5mVuIlYd0N zv)lg~_C!kOEx6cpX~PqrT%T`X8O?!+3wiXyK7dKY&oZ4g+%?(e`#xexz`sHo46M_g zx&OvLy&L_X-jOQ_0Vf>*qNr7*ahxL}S@DoH2r&G2KA7MObfUbFk?N@EsXQc1+0MR# zGglWj7Iw%Hez3do@=PSo|6csjNYp}rQ!uG#{HgeplXETH6991oiGm?ypx-qkG-O#c zyB>QusH1!!T22lYS&8eoC3Rn*PeJZ?8k}F!X`TMM436XFHbssD~<^Bhqv&eGQ}4 z$v0{jm?r#*ptQ?hVe4@ws|iJXbe9-I2;~yAUHA!G36IaNtD+k}y{K);zCt?CF))+J zskvdMOP6VP3zV>;trBKm2{jE%G5o6tW4~oXE+!3M#JMWEZ+!jW_;>y+m#A>A>$vQ% zmhrRCSW#Ykie|f6+p_}?`Rc%ku&IF_nH`-3B~*e>*yYY&G5)sjORko>!n!wok0_=U zGoG-_yEJY{b6wu+$!hvC$knHwy(i4NqN}~D+Pl;-Z9>Sxev4;z59T!R=Axn-z<;Nd zzx4GP`|p&9{&!0BVkk+o>S#%F?M%R*>a&gjX^byu-^N>yBpwQo2qcvrcuS-y3F;P( zt`*pLKPpBciM$NUI$+>^CU z1!bKJUEGd6zplHVr@OpfC)vR)>&9+ALtyBaYkzV&IKa-bVIel!PvMm8Uh)E&;s|!> zJ^kfX1W;@C^7Dp~Q6?><)A5bBkbZ`7d5W`|K3uq@Jx|06h(|11o_M9yi9TL_d0cd0 z!18zb$%zSU-iE>w%$8UgL6SPFcJc9Z>oMvTIQp@}j^uHE@~{kRj$$Hm3fIwl^f78{ za6#;xN9MV#?>^|~>Pa(4bHxF-PcJ_#_BMlH2SEU-0YFd`hqy=fv-j}t9E0zMde|04 zCV|F%kM??yh)F+DP&pEZ@dooG8SA_yBK2QTZ~j_{Nnc(=6-{K@3MAmMv?Wh^NEQc1I+y6df*$6*Xg1VJQ(Gq+Xajn`5Qu{zL@wo+Ih8AE**A zd6c0Hn5e+Z%MULHMKe+m58k|U8Jws}50e)BxqC;~t;Ig)yW=U?XDKn;x^?q=^9gt$ zW^|BJGsGOlSrYOzt=}r4fPXYO+)dAj1&_juEgW*%6Smc272i%ki(3%-zUGdM3E&vk zuD?-G-Bfg<6}{)wMjZz-(BVz+$Wnw2$K@%>FA)st1Ur4m`M*y1t3Mots5qzY@4Z*k z*JJY<)Z2a%3=UmwIkqzj{4Z8N^D zM^vB$Xu%YGXHP{)S;#_2ZP{`RZwg-TLbV$S{>01+qH;1Rt1h5Sqrd{jw-LE&e&zb- zA*_*gtf%4@mRpJhKMkr|=nrb>Q<$DY z2o)?jpB+j$YXziIoB+JPr8VSu!#-}a8bSb@JSo}#(oJdJQoF+`d$JEW@znsyW=)@{ z4ae7V={Q!3eP1JH)Tb5-TZ4CqUupq1_(lTxeALc}j8pQe=)TC>fX>jAAuj7=4-_WV z1%OO%aM!59@Q1va2F=;Sn9))+GcAt-A-{yV62K?hucKSGRt@-nF2Hc_*hT)|;~Dh- zHO%_d#ex4`@cv(+QZE$>p3F-cd&xe(Iw}pmOazTtgk;O)Fa)0eAUS#5^PBHBI1|$>Z2)Tva5Uu#WOg_XYd=nb&k<^xuvbPr9oFyai*}|T zBOOYy4H1yk`NbDu#JJ9d+a(ZZgiN9|;}RO5nnZry5l^&C=1a$#E;HO{VgSU2HdVpi zO5_+WGDiS~(z}jl9evlM;HF^43R6&O!;ihZv)j#b%XN%R`RH=;n>^~F$6R7}6a0M+ z6gYzw{(fj{7U7kd!wioh`^!(>3(9c5V=j;jbjZ6u>pZ*ZWZqK1(L6q9D^dFQ=8ZdoPMT)0%S#KL2+eSdVF5B` zqOSt`D83+7(z$w1w`P_%c1f>8()VHuI zPYeqdO@w+BGp(xP@4VAU576B9PXgJt?I=9oLQhwvrUYjqR{L@wC!<4`hZK24=bs3( zsX2vHop+uIq?xMSDS~{+-*~Ex5fAA=@g=ffrUG$`z8yW4CKyS08}n!cTmJCMi(w@t z*nV#oD!tKu!&pa-B;0*g(w@LT5BDbRd4+RvpYwueKA(#EDK6c2VX`~q{#wDYt~l=y zpU_iUQ**cO(ehTEpXL)hdQ^e|B1Z@@3V)OAB_<<0DXeJ^C#Z}5+#ren`gPrgTM6}Z zDX=6Uum1392|LE3Y-k8<|H^*2<@Sed+ABsiwMuIUH7qSh#$Fs@Qy?w&l0hKsscVz zQU4zRgg|@01sdmCy0!(9u5#}c;IyGn+NR0+3ZxB9(!4g>u3JI|vWeT0b}8w)X79Dz z+HKwA*FC##UAv_jsrNtMm2CL|%{uT;-*?XUo%5aVyubU+pTG1KB3jSC%5?hp@qfMT z@2nrt}g!vDa!Z(hufRDIn}&J#>?7$qXekhG8W$L%<#}EE{J5 z-`={ewLO$Dj?_QkC1&zP&72iCwtpv62Gdg08fqJ|^hC;NJ8J3KtYNj?ZXV5~Og*8I zhpGCIenf9e>6xLn-2;b=xT8@8Q$@-g8Zs=`ll7`K+FrsA4ImuMpEX~Y1uYYT_l1YQ-^%%z-CH38Yx{+2_(JE?S@?;cxQIU6v2Y_=E zHOsyhroc4auiPd#(x?^s7&4r0W5iEuWN#bY1eqN(>WF{N~H#3*92Ng6-BeT*aT~@PCG`#(g615t#EAw1c|*)YE^)K?K?@|VII^)gk$ zQc+~DG)%Qm?AJ&8!G99iou=*hDdyttc5!=5%k?(Me30HDEB6#ubZ6L4_qw}v*8}d% z85Ue9?jjRRRX}dH^r18^;-^6u4}Z!w%yy@@g6aC@$Xwkg3XYAozGG%YW2#^=tJGTjo)HAY~K; zvV3F`5}G$r@G7PoW*F3kl4hIae~=X|TEJ*@6zN7;!-9(4B2iro)*_joM(BPY9iw+5 z&eMkzNz3-r1GHLD$C*|}4GWnzXcMI9mVYa71ZRDKPKcsE2!}38(UBV*G%O>rJLe$yp%_C?YxH5JYfI&vzWNc# zvNNwQT6@?>57DnM)lIFIQWkc7%tsH>$EOECM59ll+90WCI?YT5*#s7axo6yAY7MtJ zNvC}D2t5jE^h9EMOfogjX|CCPM5a&EW1_s%Nbhky6@Sm6yD<7}!`eEeg5z-sj&gbe z6<@F+h4#{CQ84Cas?pP6WgE_3JB4aB!nFD=MVH9*EIsF=X9#Uj4Hy-8PnKa% zLziqiL!XmPpNHzyX?mit!%x5NE`6~WGa}?p$H~qR^fyuUhlJF1sZMy5pI(r3@;sd_ z7A4rRD}Phs0KZkbu)8Dz&!ah*d7F-0GL?`tJj%3qj_bQlaluDp^b&$VGIIvuwhT9% zwYk6x#{Uw1Stz~&n*;|<3vnKiNO+kkG}jqd<@7b-^xHEi=O}ZtDZeh1m*i)IkMbga zV2+%k(KnGkCan-P(a#o5S)#me!HO_NiKd~=l7ECzvVg;XkA7e5`v(a0A>|(^c1{GX ztK|Ma5(7R%f6P>NphKfSg~NahS}kul&>;omJM?EhI!Av#trLL2hBT|+MdFI*EJ<4~ zYG#+=Vj;v|(qH-Ld-T^JNZMTx!Lo8$$4L0;ZzP9(kN&otD)^yV1*K;wLC93x*Mkty$?NB&T?} zd|GoVy)bJa8j_y&#$Vu=#r}&c*;mD0u0l`?f4lU6`An@>Yolg%HfU^lA+A%}(o3hN z;+1QBT+Owm8E^*aB19%~QlU9RX)npg)3ypjUc%S-crjl)?NQ)f%hvch=*vPXO@CTO zkD2MgYt7Hg*yrP=e0??h7FM!HP>(~Z z5slx5CMi9IVER_+2?aV(44a9adImbRS4K?pa4viG#%CH~??~488vkblA@TW8t31Rl&~RNZLXUYLMQ6F1i)yzzorm_W;I zB?oe{(r2Z--1-Y&6LT19(wmp@8Zq%r?()t&Vt}o`PF#gj?Z}wZkYW(0%`h_V)@Znd?2qn>g&_c7NV1weC5Y z-BRp!=jNjEZE(NB1>FGN3Jn(!dvx2zvpnJDPN|fgSFKXK4GD|!2%0~j+sU{v>>8 zUf$`x0*VMf-=SUs+zoF~>BGx-`&1zCpspFkyO@RU_VaGu3`#Wl~4$tI{pp=&9W6N7&HdL4iVYQ2bj{q=`CK+l+IYs zAk*6h%9XUk#lA-R|6;WXf+)B{`9!ePL0f}+)K?=Rv&E-^xk;&`tzLcy6ecH{R`Pyz zpqKkmcnTtVS@%PMO7b|Aq~rwFC{|QuR$z^r*K3S-l@FTUmXVI#5`UAGMwPp3WnmQ> zN%A2d5A$KB6>iQ%DU1)xdj{QugTU9VM5hbGjnO8Q_w{b?$Fu&r$gKT^ec)HF))-Hn1%?88CqGOqkyc|adynw_K0d~H z@ia|w+&TcuAkoUFkAG+~olO~C>2%JK_R0Mc!Vk>op0E66LKUcY`}jD&2S0R^{InP4 zS39@bwtPJ@Gutdniq!|u{B;#lMbHpjIM|mlj%C3Qudeu1)(F~YUJSU$2d@wi>hKTy z_yj+Q@RIe`BWP$%1n@(JH&1KflcJaLR$Ay{(o@Kf!OKj$HGiY04KIHJo&#WV@ey}X zx8lQIJ|*vc<=IEQ{3$dUYrOmz^2#c^ZIvBtSY>Zke~l$mFMkH!ijFz0qbP5hBikK# zD@`!W_yj*Gj)7N@M_vtx7Pw~oFbvo$R+F!Z$&AsHOAjDJyO`<@({#knS+_{pRD*Yw zh6d4tnU^XttACLXFlzMEd^Ikhg%~xgRs&*w8qgy&4>Uy4rf~|yx<~1nJY9c*P_iS< z7pRfxG1`Pli0Nf&i^X*k&dw2A3eLS{Qd^IH@I^sc5*OP+4qe`ey9rWe4L z`5FASl4pWysZ67QMyrV4q$Z8pG}=4?Sv)Ql5dMf>2Y(8UE4{rS;2Nq>0?xNVw4WQ&^=COtoFX9QF1OSCRMbK($Hd! z8f$5>8h@8iof?HP=r3Kr=M=t~|Ya zf9-pFIPBqY`53)FPalefE5_-;SXdjUhhiGqke@y5;lcy(ZpX$%k zubmT3d_n#G##ib2$7n~(%k+GnUW{$2p>I4z6@O=F!#L$*<1`jq+8-LF@jP9u{c4_G zsjJA-t9kmyDE-dGNSzk;oT1kW&UxsI&Gz^YnV2{wGhD&qmJB z`bhB(qx5F&L{a(xGp0@I_7?*@4*)LIJj$MnC2TGcBnPiLkIZ2I%gq;Qg&2@S^qLwQ zVW}0=qF@;XZlN|h30TI50k5S#1OBIME5CJMu9E-3M`|*kJHl%mQmnm z>2nH}QQ*(h7Zog{z%SypB(RJEU!<=qSVn=rL*G@fi~|3Neym^_1^x+_DOg6pc-$-& zSd9X=@;&OFW#X`W11+3@=w6NRppwYc=$uB6X!Ib_1au+`q|(Vb5+wZkcPB6_!G9OF zW97BU6%DWH>8uv31&zMVo=H3c{xWUg>Iunavlx=3jhW{I8K4Rm30TmsNb^W5#ezpc zB2o*OmM(!!n_>gnNk$~uOJsLZDoOFPU{HZnCF!b0zFZelP9ILhBbh?*w`~EgxWN80 zB+6PBT%f>9R5Q-iF+q)TV2ta|7Ju~)mSxM|p!tfukILvqFl)qEBOlk?Bg!^Gm!kmmw?b7+jW#KInRXnU-u&cma8>lr$V;5`6* zfIHkB<#m|fF7uvCv?X+j+9km1%KH&xh@|Rpo_B=Ykm?amVNWQ)T{!1ulz*>&@T~Ln zoS|TIo+GiI!fD83Avta02S{mWCcYnfl{{y0@Ld7!>Cf}t(-am(b#}{9kpTB1A)Vv9 zE>Ts0@0Qf#4e-IRr>R-u^pybL(7iv{lvv zJc!jXP6_Tsw(@)=&+jU1ZGRc(yZ$#&4gXJ>o0)>l4@3xSi-{RKDagP~48P*CGY(ry7l6S*>0c#Afj*k9d=doIug= zxKUO_tfqNxO;jQCIxSN!aVu(gEnH#^T;eu(+P&a%KiuI_IK-2n9)Cmi|2BN`hj5-Z zsfy7laTnaFmlm)A+8X%?TkzDU$*1btDJhJ~J0DiwiF4*&q+9+M#!9FuNlN`F*z zRVWGDjiO0|!~~_lLk*_2CO$R8?(KHzer0yIh8X!F{tIJ*MiYO4KgxKwXpG{6FEew` zoOAEFcjnvo&tCyNz_P%*CG{>f^#UBFoW{~#f+`h2kcG9 zg+E+%j*^rD4HpH^#Qmg40?W0tPFBxC65yKMxO+&r=AK;JPP&HIBhf!!Qhn9SU^p#4|)3KrE|ZAXU3@ffGUk3C>>X zrrFZ8O4@>i*n{vW9C!d83gLqA!LmR9zwNK@k52%&fT@7@?e;!@l`GU6@`YSVUCNo% zP2F0Doo&3Tn}V1Ja)gn1SYcGUBE5-y9p$n_7ilJ2qiSrG9d{6&UoJ3zXKl#;{blbQ zgIJ+D8ztUYPZX>-Oa}^)Z!yp3i+QdJ8sysqgn;Qo(+5r0){%hICYa0wEF5Le0o#^B zcJtdl{dKo!{n3>k|4w07z~LGP%p7`?-L2N7yA<{Xr1V0%?|5NyeDcU(4^kLIuw?=V zV+9H49Y}rvP)i30E7W2KQuhD=04xEMAr>5y>uEWEd3;p$wLfRJJGmJJCj=N48AFuG zGKr!hCL#tBATkNa0CCvj&CE?QGBY>M5{L^`tG4!8^|iJ&*7_{9ja9m6VJ4UgQd_E4 zyJ$D7eRi{}-8Ze3^!vMaCYebl0pDMbPe|_l{mwbRvoF8<+=(ZS5YYvu)0pntw{O$( z>ngf`l;CbP7OH5d2zFQ0Rs^+ZUpS&9!&=N6)j}%P<7z}z5-K)(m4r9gs|I%`Qqe?3 zL$?x1sI?V+J>IC&=M4)Qs=D;T^Ofa*jW5sPcc&r|EF^jr?|A|w))S7YYCIh4!D_!6 zPv9)9FRwelZn-z4_E+3sCuWlUS}Gn?*MuW~DpREv@2T&JE1`&5zbCHr^{Mgtwfbv^ z@z$nFTs>uNQal*qp=lDuYHs4W{DZ2#(ur-zkjCevwu zIA}GLWk}4lVA2ueyCCkQGMUbxSxj@Mf|6)9Qz^*$w4iQGC?-cVrY7sRZ1RE7Tyn`Y zhvqRk@^>U!z+_EoTQ;>$LTd%unY2izh2$G;UiIqF)N3fuWbia(%CXC zrgLDGZWz~2o&u{Ga1vEB+0<)N@G+);a*uDKSsSaiIjEMrGSyHWY-Ml~*6Ib#`i)Am z7e+jn$qa_zKb}G%ax&$^gSDk}zD(!Q1x(J#`w}e!OG(Y}$T7VDM63XNIbB>z7f}Pa zDdJ`lU6S(#eYsuJJ*`>oUZbUAp_X`Di%WEAPN`Y45?#h52}cA64q9dCZZ#Nxxg;D5 zCoi3#n=zMmPz$Y*sfpGyo!%E$`;>StRG2mv3xh&ws(hysag|NFD?|2Hx?CnJt!Juv z7l;zIK{|CW95@M`nmvN?4YaY8+UW|WdE-oOO2v}lsM@kOsP-9{ex^%TE3ufCbcfWW z8jm8YxPwBaeNdIVTZ_B1$Gb0oSK{vOxE6H>5g=X2W$q*ABy9AX^Ba}A6 zY_X(+6k+!!>N0$xU5Tm=3K?tAn{7wk)k?h5PCW?vy1uvup_5@XVW%*E+zG~yC?b)@ z6A*KG5iyH6P%$ZYQ$$D^Wm!^cf{`%NSTw4{ zLOvK22niKokrI?P%G6JL5M4?nqV3rd+a1&P#5U+!1r-;lNVt+0X;?@2`={N{l^ zSnQ0vWA!uulJBGUm(Xo=JD9)5PXC1zd`&8>Chhb=tTfx{E*Lj4kVvXguQ0Kl{u`mK zlSw7Rk$PV^fm-)rrbfS-Ot=;I6NP6?@rU_6}Fk+Ya9e2nfDybk6vx6VORJgy8N>wX*>RuY0Arn5a$$Iuwt zAovM-K&JcYeWp-{O>g$a#d_NThC`w|^uTI-p{aSiOoi4c>No8>1XQ<{czWl*t3;YBMb zh(Av+$aIXp$z<|+?euLX?@0w|>IS>noFvhUA^=WR=iim-CHfv@^m@1NTCuanPCvj4 zY7^S2go9px7Tna(k5CvAsjfuUy~{nVMRWD5^kV`2zsS2p2Bp3c2_t{Ys|S>DQpT^Y1wVi$o zm4;&>b?=65_zaZS>Yz91_d-{H5Wd_xl{)_mz>u|$hCWm7rRs$!n=Zn^y{{Y`ND zcN7VoTfwZ(>pzjbDp4CmF^4-fhZ7?HLJoS%D0BZps?K6~cM61m=OzN3pQapUwzWJV z)2Jw)r9llHNjR2RuMRjcXrYCEgiTCyCW^8u6^?{ZeHmjFd+ltK*(%x_o9L=yAz&62 ze+n{xjSenh86>zA`6HhOTv}5k)JhI=DfqTt2Ug;_kWq`ZYuVnw!SjTMkMVp&zfLD-j+R)+!3#xSag5It zsT|t5Pt=R1hbiP`hGW;PWgPkKse2XD4&Le`AsKZ#I)E` zI8IE_9I|Ku83U82$k4EHjHDp34qA%{XS~E1%>8<2GY-SFXu_HKWl694d?~M#c?DyC zqH=mBY#QvW5>kob3JPk9L>!!5S~J#3)`?ECPVXdn9gJLTFfCSqmh$C-(E7qrSC>KJ zHqqJXcMW=%=HLzJw7H!(B6}CGDe)#_oJ$}+#ya1LEskg_9K4ygl)w|WBG_^P@8By% zv_HfFkp&Yi(LQn5c0?IhGsY52B77}>;%gVe2n(H)s!N_Uih#g4vM8@XK-<%!MD(;a zKJGB`#C(HQH;T7Anu;XD2xPa>VAa{VTV_?Hl|@;okftWwVyx>``c=0Q8!$itiD_oZ zl+)!F7-k*p;?uO+Hg&Gs(AMJMC>mIQj&RJl zCCO=ifiFp1Fz>B1f6~8af(4me51@a2~TwuQISvU=@G&6UQzV68P0yI%(w7uOjmR?ZEA0A zU+Zq|iJ`R&xr3=h62r2gR=03}c(-tPcO-k4gfTkS9qvg9*l=tTT!Y)r??)>R(VDsv zS_GrLetE$k&<9q=WMhtK$owCqHG+jZ#YN9vRF(#XeB2r{85L)#60+clV zFhmwfdr8rBGf{_z*dLYo9{w24G^AiEdexCVYIRmp#Ypcw$oG{19TU!f{31xrm`5X; z5|a26#XYqcRf#e5oE}q?d$joO&Ecr3iR8>EXP@N#CHx>`teFE|`ys{Tq*vpaLe^qq z4}Y3JBl81{v1h5LnAC=wG#0^aHI(;Rf&R!$LS~v1QKDTTrLypHsq$Q=JB!kuV7$g+ zS5VWiG>y6&iy42c3T$wN43Th zNhnI$LJ!hk3yzd@f6OvT03sj)Qi zn!{KH8^7Z>Wd1Gx9^xg$C#6^tQ*?n4^E^{?!GGjG33N=kXTpwk*^W1&q+-EdbiGCl z3M<K9MiT<**i}DJO4vy=bv^ABKiflk+7I9JIU?4K_H)GTQ45mxi%@MP50$ZoASD+P*~jPbfxtE%J@2AlF+P)PkJyv!X~&I zb$GM50YGmh=EwF_v`dX=S7we!nJ#I9z!^y-{+X$NgzWgwrV_lpfORwe2A$S4%}7&u zn&zkJtbi{~OPp0{svo54nqj)|Ff}syhRE45LQR3Tnlv?MXkD#OZ2Arp29d``Xmh~w zBuRnw<{H0qYxOW~%h2|t>&1F?hORnFCLDA+1!yPDr%LkBN-~*b@dcVJqj)t*v_hiA z#1gH490j29-b6G?GH}Hf9%lmq5Iaq!IyJ#OjEDVIc$USdCqp#J1tCG*a-g~<$8!+> zyPdtxtJ4(A&^2jF8b7`f>JRML(Vn5bmP2&C^+~D;1kBETev9))f0}M_)*PY_YZY>Be!xlRz4(F0?vB?==|s*x^I{s9HISxfdE~(sO@no4^Z@pMr|;K^{h2G$^v7iaupFR&F+j_$maFuC zr`OW-4}r7?NN?&$Zh>SO2X#rdaj=b#)7$saTmZkL1KWnEbc99&XdjMxfdeh#VA>>Q-BoTLUH zC!TR(y}ZF{U1l%0yQDO`_MbTDvXiPn91@WO1%G8`?Ayx{MG%pa(=esO|twkgBNT5B#Zs*-;UVM-}X|93stcI;=t$4~= z+E&KiG@lz-Cf!fa4PKX~d0EHM=u3Dhms~b;xg-R!S*{Xhwsji2hlFR>l=1R^3^xvQ zQ-f6;8Sr+xtQl@j^V%|QO|#E9;W#<)>aq><6&)^1z_|}=;H%>xcewDdZIJvfcxzLG z&AAWj@IIa8otB%00~s$@Sw2N`TsHm9oaP`XBMl6ZI>Kt8jC(TNd(?QmT0B0^S_jS? z=7fHJx!|?|!T`r5HNa=QWt0X9Fw_sUfN^=XJ+PvJ8>M zEH)cTTy|GUP7nGDV$SL+F&2jTJ;FpckMJ#lcAUS81PxD>1Y5ve4HIDE-K&(bI2Wm(7CiwqHGJNkrzJL7)KM-j1Rv+Ylhj7*~Kirw& zM{8ZSnkRUK=!<#DvesY5Pv){EvYDO}`7T;8O8ZGNa-jaxFVTL9j!E=1(Z6Y#L^X>p zIA@fcBCC%gJ=%-H0!)Bc;_oP}Edum<4rmk!vt%k7EcTm8o@(Ft5kPaM076PO0M43@ z(@`oV+t@Z4n__u>-m*l0kLVkq`3}_!?%t$@LM7}UrHw)#vZxu85ZF(27641J^bS=S z8<+7Y1@jfnw+L4Cx^tc~P%Q9)Ocjn)Bf8!GE=Xt586 z$010H9JH5CqkB=PK29^}C7MaE&>5xya++?UGSh7|%XB-Hn_i`V*`_yWj_GZhYo1Lm z^L(0TUPSZFwY0!|F)cK&p)<|9XpuQYZu7NtmU$mln2*z9^Pj2GGKr55Bh_2(q;oCzKn7V1!A6;6JNUK<*+%$ipt=)Y zd@QhDB(MyB)mxo^;jhD))BKI~BK`tx)n)tw!cTYpD#XCI2dM%mF9zB&{1V=O5NJD2 zGi#4n9wfQeytHiylXhF}aq^Gw%Yhy10r8_W|F{jVzc2vLA7xv=DXSaK08xeM6n?`!-hjoEMF zq|d0-FZ_2|Xi23zhJQ}US{X4>KlydJ$cx)DHN2-1mG2A8Fa0(64=-N|l$Mq+9XOb% zpp2@65sZ#v2sH;4j1|?Cz~BMD5^CI(`DX^WVv4I;!EhEF4#s(%;cgBk4xqYnb@hVD z)o0Wj&zOD!`e>O9u$Q4wrdp0RRB!0RR9{O9KQH0Fx;e6qCV!E`M4HV4KyE zo_RWcNmddkjzSbL5jntzY?DBopgq-%ZQTR50fKCrme6e*XiM+X6Lx7!56ZTsExjnj`_21*$+9Dd-R?r7(R**+ym|BH z&3yBeuN?c#<3x0}`X{D4uYbRO%c_4`)EkTMHdB3zB8%evi^7ZI>A|5yGL}oEQ%!^E zJ`?>JGik=MCI$y$*{1k_8Q-1F4`vrd`eVtg8D2EBt7$Mc)RYhzrn!8@S+P~%&8#ZU z@6RWb=*SMlnwAMmYF8pSr}VA%Q<$23)JV->O`=Csz`C>R z>Mx(XML(TM%YQ_R8^JG38ZRTXf4Z48INMzT`?)=n7ORH!twKH9Hp*DG_uk6f1 zXDrR05$a2u*-$E-3&qo^Tr80a#Ztpyvvf+B+2+vteSbq}n0=vKI@F&?^@YrRv3M>y z99mZ58*cW{dYn&xIx`r9NzbV}{^&2Su$SYx{B$90^ie%^FrD!~^c90PF)e;$-_uv7 z%SWBm&E(7`t~IqMb@=IGx!HiUBcN}61!J_~)Y-goCz>T|#`Bp(Zn&ijfele@U1FCh*CBx`27hyFZ%M^*-peYiX`e%788FRmO8V$( zg2wJ#T7oh5RE!xZsHy|4^n*7|Lt@5jnC4F&-#lcdHV=ta49XV6LTOaT7lZP+(J6Cp zM`|dagK}mJYi_8kw9@6B(}^!`2P0*2pxR#A=c7F|TwHuIgF(O{>hd;&-i*tE9>gD4 z-GAk6ay{NcH~8o}dMgZ&AL@(cU`GQ(9UXF|-bOcyb#5w()t22lkV)^2^-A1+JLJTZ z>8$CecSypzj&6aRK5bmAgoxVar+3nABIIA0PMUf=ZTUp9Ptw%wK6&ZRe+`>Z*~U9VDfc^|#sM|aQ%1b>hK{p1Gxw4W}KfO99h#IIA>_$hVm$IrGE zfsniD9?|7POik0f(=;>hlbIg|(8;BXy3VbusOtUn5#jx)^tHX&bTXea#Yg<~ph#Fu|HjIFsocRtT!YC_y1&wG4fV(1Nq>E( zEln*=MS=G!@(jj?Lj$orW~kRRQ=wdJ5OD}WZ*L+u(7ZI&o=){AGJ~PqKrDw3GjvAz z4SCZCm%oPX8mwOKY+4q8InGRa72X%@YZJiWope9W zDuETs&4(n@(QjF+R~#yo&%!*hP#l}YcFS4Ap{!}@LkT5vS+Vw>1RN0Y_FVoAqcrBDo9Qv& zD9d93cLYaGj`Q`GArd4t8Vi&l*5uppIeJ`t`3S;Hg>i#E@2A7`SsxJU7Z7mrscREM zObaW5g3_v&PQr+o(Q;X0$bUkcPgYP;+u+MSdWyb+0BELilKGi}lknsERDRIRXeWZ! zPt(_g|Lc<$Dq}I|o4B~B<+{=tbA8ergjC$~Zwqky7JUa%EoJV@*#lD}MF}%JL*Enj z?;|fAx1IG+bJ(CCLSw{-Za@G({aE6{kLX#%uW1Vhi6C1uF{ue-7Jtl=IQt)f<=I%j zjxQpM>Gc0m1cZ{$(@%W#pY&5%83@-sxEr_#d;Pf;z%I18oEI<7U zmO^qY?_|30AJ2~Ef}r28=_N^z|0M@nna6T~-}>l9`W+Ir#ua6%wA6K0w*Isk`SQ1ma*@X(0 z-NjVNR_EUref&P*5U?k6n~AwHog-G$IU=r+*0&I)NlhWZHZk)c*V^}m%Uz-kc@9-|C1b7PbHp`p{i`qBvUXkP`kmW))^FLladX#t51%V{N}F$6*34{7 zOLUnzrA*;9e7=|GvXr?OZ`pj&`u43JZi6_aI0=Rm#eX!fvpCmJ(av(I3oS)9LJV%I zXzb^UtiDZFpT*Z@^>tU%_u#|H*kEs8Y{|r}TXH5-{De7X^1=S2H`LFU@D}7Y?wRFc zl#tbRQy8ilxopvd#S^JL>D^{ar&hSj%*Fa++AId6u&f%K=wN!f+)wOzm@$y<+X$$I zvSdkTI)A-8KUAR@n{MLP;UV)M8?=@@@!b03N84k`WDmk540Rb_?&B!$nC0dx04m}b zVY#3oUpLg)SizT04_O*4Bv{AM5Tlh+WRWEP8!>9q1< zynm8>nEM8PE2i>4<8mV-i%^Ne)6J7{OuCV8^6|C&FTjGRdwR`wDPu3mC(K-Ocp|`J zvK}a6UcQ;%;iGwc%Oslu7Mqd>-iffAO`7JA)V>!9`@izLe0&?<4xa#y<3WB8l(g#w zKi`3xnXlvb;o8bEr1Lo`5Ip<=sZuMXq<^wnllSBF8Fg(-2y3IjK%Ev#5%47{%6F8xRZ@WEQ@c}0XCA(9QmH>tJn#YNG~uH_wJ1LX@Pw?i zicIeJYd>)%-Ek96W*(*N|T7v!tKCL`NkWezN>2V{@4z55V*jis+fx$bY}V z~{|+D76HDezK|u2+JA$3I z;lN+yFZt*WKFYK*RF^T~`Lfp1zJHKZec7;8A;wZ6`Po9sP5A*zicfJda1CbbJ^U0L zwi$sY=V6pR{&i&~w}+pe@&q#N!*01-eqG%18xz%8DY_n4Zu$6I0)xH{`)Bm?<<_*H zzbj?lVtxj=Zf!0n5Bbow1?pPw7tNvKQ7z4S`1@9zA_5$BG^Y_re+<`7WPhzt`<$*l z_&@vO#C@%sPUrzk|dkc~LLB|NY0%f4xSNKoT z|7U2R54sIUxw*f;E9>XKT7N@-^Ydr2c2fuTaJRvZrET9;>xOcug>a>#hGOkcaz&Kl}u3zP3$h5d9M$8YmNp;~pSSDm63 zGA*A77Ud=4^pkaPRHymW0<}o0tI~8!ReOAiPt8|L_3erEbtY1#U!8$yh0Z#BNC_F7 z2$TI1i>#A|BKVSnLtwps3-M>Sb5=@;7%cYf7^dY;qj%wm?aeuR?vY#M4g^7Xc! zQWa1(hHam%R(RD}s#U+)cBc0NJn53*^t$7@E7e?Tl{yC%j6xY<>`ee|?9F-oKp%o2j@wHTl&Vb-v6;5#j4ir0guHZ)@^D#(@AyHJ~^nU@LV?Ohsh24XSTNShGjv zVaxV(AKZHe0!4gxS8QmjD8V#KE@XFpu-DAkJ=GIG=;?ANOS8#E2C|nE-#p~Sx7qTO zyrzDdq3KMT1?nZtM~l^7w8G@Z9HLM|G`eGy<{qYb(M_XtQp2MZYv6 zGvKT}K(!44=kjR8RiM@T$rldd%lX@Hbn?jf&%&D;9wS_y{Z#Ax92wC~j>euj8yd#w zqD_aXGs+F4wD}-d5G|bdmh)_z%Hw#9qKclN#ee8r9F2B0%(;A&c0kSjR2SAOpB6q$ zSBh#o(e90Q9i>^}$DQ|)H|$tGLQa0NTz=ma`SPuS<(t3-wGW>$@{hy*3V-W~#$gy` z&|UypQEkr4^d51(B%lY3-m7|WZ+~!5OAw|E8pfy4XXrWnUp%z?$nQEvL4Sj; zHt0Hot{=xdjRMgmHt6PYIU;>Vi}k0?2f+O|@{Ch((%|(5z$%7b)9rEGIag^E65lPS zJd>PdGqiKG2;0r}qGDFul#&r-`*YAt7v>~gZApPK%R(p z9;JrH$Io-DsXgTYg&J#@N1SpE8h?T~ryXPT#XHI6c;H3{tp5}6KkxwNv$h9TIz|D5 z{+;>cze288$|u`{Ua{lLBZuiJxlyC^)dGD(ZtQnOwRhsn4;WYON8%HU;S-Hb1$u6b zex@(p3;V58`sMbK@o&JFdc#eJ>BVTb^x01Mn^AhXK(D|Rol{)#E}B(z#ectzjQ_eR zYP;X7_%kwo!=@&orPIfK{`*7nQRWcUxDGR@O>c3orY9kg30*`>HLasoP0yh<8Ts=aTkE=>dA6^P9t|&?~9fn61__E#}U+>S^)ZO8HOxzb4jRE!i&8K zWH~2Bb)=f&Z$9{0A12%iIvd{ny5#|``@xF5qF!ulXgtJ@u0ymC*Ora#XcX9wBd_6^ z1)dXab={3HK{JESfXjJRflrD!gBS}I$9zFF=Qf=)-kRp3)1u7AcTWQ_5m0xylY zYxoRAC&Y~)zSbAGslaC*=H=0#;cSHqyer_|Im#=lmlSxVM4zB*C&CW`imXltaN-9L zP$DjPVZ?oiS3^(@pQpo%zv&RKjTj>|H;BG=>EoBtw;^IQ2HinJ#5IbvL)=jkC|)QM z;m0DSL;q%7S<_lhLz%Q1R;r&mKHU9^(gN~U@guo z9N{kR9^>p>&JEV^o||GTog8ro-A_`F-8;{D$KAByFz<^-<$qYN$6oj?1%8_x``e>k z$dN&J(-_~1KeOqno5uLvBjno@ba#zVDhv`qvUnJ`Jr;Byr8C1#L3hJr{9cyby&rRA z^;;W|r4PzbSs!;DDJqT~*YF4Rj`tM!t{T2a>}E{bM?=_FqBJY$!G7=6`^Cf$Pq3C4 zjA?$BGsko7PUjuD^*O>xXNp~Pu(umiX(g< z1;!Dw5E2k8#trrwJQwMNB_Q}-qq#hen>uw==bP7Q$bUm0)A^~IJjZkBK^<`}An)uC-zN2#>}2fLL5JV5jKX*!92NAp!T1yRi{PN%`8TV6

@uqt$Z{Rn_q4Bi<20rBFM@Pe#1*;d5y`7^!juy*{JqWiE z`Yb)K>5KF`O|64@%qmS>`VVf8)PK6*nCM|0IgHm(_{bgcmJJyEh}>%af=0Hd>&UTC zaBq8REvf|TY{FA6af)@Y@juIT^V9@n2U7ZC~8%?-|Lvbta z!KKCB9g4fV6nA$^fl{5(o0-k* z?Cxa0_q}I|s!B(@tpi$4_($Cny9*m)`a;Vz#xD@!e%AxmNr<=EE9LL28w1F)pU48r zej4hhcL=l)h7yqVYW|YNFuA?cJ?R^^>to(_g^o`e5gl!mUwYS;#X7C?=b+OB8qG$_7Q?xHhPKqdXk zTR}=N;hklw<~n=s?A2C!{O-yzfM^A}H@GLMf;C00l3&1Xe}f;aGhIE+oh7E$Idd)( zU@$E{bs*&}fV01mSgPcgTDo+t!V<+YJa3n^Et&;-dWM*zkCT8C7UIbQhuaP2@{c-TCF~sgcTiXqL8IO z4^4{}!3q=gguO;}drIAe16Tnv4OVN4Q2Z6S@4rIGbZ7=i_cDUigNj3{Vd(D|5b3;g zp`CCAaCT}A-x*!90+@R#tU%P#}DO2oD#Kx0HAlJ&b`= zY3{#PF?VcKCQo;zLOT@l!$X;Q$Q*rMg}W++A|Xd&7E)L-xR)0L6oN-n1b@}e>{dVf zGVo?KW(k|5zwQg~(^vd&fdVNI(4x;1oicvLgGp=%o1?< z1bo4-lPxIcTG~LVF1*pxi}D`nW19X(qzRD(9Jn~nR$anPx=$b5cCZ)#~^y*7Cdg%rqB;h+R^n<9u08QB+DI@ z`l+Y{Qhte`1Kup)_n3~Jro>^Pf4r*DP;Kfr;nf$Cg9Pyy;zuUFMR z>m`S?%YI+Dd+;Y4oV#g5BL@IX1Rwt8F3IHuZ8WN*y<0|r>({AeP1!EBhj4PzG06ChFv55?N)hYkmTtqq++sXP_TW0W%$gv=p`|S7CyenX? zhR)5)@4Ed&w_4sap}nG`DqHv_%;m;q#mCC(m+9&Sv@by7=}@9yEkkd+0j(!{+={vx zXe~)q9z9@XxUDX)DHVBgctyuxeWAc@__!~=S4toJ)0$w@pivHgA+LWQ4v~7t;$uy7 ztNtgwJqge}I(6dnU+(5pv`f^X3gR^w%!xXYar2??=NUN^JFGPd3YE<5^eE(elk%)Z zD!(U_*ze*Hi)vAFZRl9{Q)7O7vhu4|1(ft^fpE9QHPGi=qJa5B?h5YiXRD@Uc?%9W z%yK&1-D7F~srJq5v@ZQpuWv^2Gh#6@!g|s_Rfv$0<*@z~6sHpmN>X|8Sz*zzq3sok15zD(3YI$NH_6pMHQza52j zV`%^?G!NB|#@YZcRI0lbQH_euQB4fG8uI2IEAWqliPv58?gu8j;pM-Y26s=)*kXWQ z1xyil+i}}ek${JTdrok0Dc!yAh+od@6m(hi{&_i{jH;JC#g z;{`e+vB=>|#i8L1pXm*XRzCnOW+dD;hp1=VXT$_b})s{zc+%qmVIZt)7uAn?}`R&r8ttuRi2+gSnHwy_Ug+g-@AoKPv#yx8(VT#I)ofqgKG0X zeb#G1o}5#ae)DCPs;q*gKdy`rTqvK9HUh3K-K)9a8}q*X0cse&Nu z8@?jEcM9fT76hUyo$S$$DnE18bw_;newtfcQa%KG)|+EG6`sT{bD-P*gOWydlzZs@ z@p1!gpaU)+G!IkII&3*8VTa4nxcEFUhA5 zTp_b-99L)WqY4ttDZ^nVky&I-jrWIFhFPt_SzrIZ*`H2Vh%h^5#X z>q!fVj7q{V)lmtx*!{Q!6_6OXw~Px|8lYm=w2R2W-yQR%9Ovq=I({Cxp738=EZa8I z85?IcFmT(Nbp#8pt#;o39;pVfS%z;6^+qavakZ4Gszm>QpB-nvtRw1HQ6EqiCDUQNH$=pLLJqb7mX-z`;4arM^LXtFQ8b2i@ zih<`Zn>=#2T~ZY_u=O|@!26~|M*bV*Z0Rqwj|7r&dHN?jCEig`Q?uuKXa=deO_OJg(AbsfE<$z z$H+;{0ny3|KGLS=;I|XbBl!d1#bQBua#vqm3kqS)a{}Kz<0O6#QgOqhT5^4ml&R?m zmmn@GaowQ6of;%iKk3DF+(wG)6vM=b5IZRi@hiJq?E8eV-ryj%oegx-rCf{ z8IpskDR=l=FfPshbybA=UAiy^$Oc*=B~fOS6gW)xc?NWTFF~k%D};fn0S5Ke^l>J6 z4B~f^t?CwTkkS0&IW!}!X_sTpYi(t5-WBqw4pKEE(Xz2Sd-m;zo z&BR7TWu7bSvXf1qVMa+=G*s8UZ4mk_^#0UYfSqwDgyzs!zaP7(TQ~+sq-aKtgEWV7 zV{m;1E}?{flH6qqZC{(CRMK3%FmuqXdGZBOhE#0Moo@DS$_*5Ve=G_FZLFbGr_|2W&JHynQVyp?6>H);J zUD*6{Nn`!hSj*0Gi|5YK-PvVzC){#3MK8PSYD$c_!LxP`ruK>k8yyFjA&fnrVf=`6 z+1@tUD5!#JnW$<#w7@(U`KO|ZwraQ!ZOxp+GG<@VY~2~=>aZ|ZB=!iDxn1746LQ|r zcz}yNH!f|CQSR~KP_NGtrox$7>PqC4 zuVx-19 zVw-8}w+>1{H@VZ;qduRye2880+~>=Gs5@QI37we4P$Vr7A;i4uoBH)KyvnIlcZt^g zqyq%g7!>N2;PbUx4_;QLjyBTX22T}Nt{kQ#Zy!#Ll>G`^lFr~t>aa!%N`pU``heWg7I%Cfr*fLu; zLA{)K%T7FSIC2Xy!~2p`b+r{5FOvCjcoal#szPoe0g6Xa!7=_ELKwJ|v=Bd#CR^cXUjSc85nR$NkcpomBdlgUBBqec<+3tE{47(+Le74oL>HN-p*SRZ9AXV4 z&-8$wamhrdv#A2)j*|WJZff9=jd^2%ATxGx@!NSrf77A)hJJDFe(@=ydv)uziDBE+ zAT9QMogb`~L8?Pd7e55)LGMM4WOEOrJ9tUxK{4cSMasUet!Jv{#eO~SnK&awx_d}6 z-@T%}Q-Dbg8o~}Raxi>3Kj<=F^h{rn z=^4-acS-H1iqNB~?+A*`32E7cXmCBjWtGzmb=27D%*LYEsp9mV*sI^=)2v20oLrG$sphP)~X}Bn1qO<^H9#~Et_t|A7ozP+^?0H@kaCw zhu3S}l}2`22$t9f$>l(Pb?X^vPuP2ldKWVYx$BJ?8Xd1W)P&HoK54IVDNIkcjJg@* zL$%zzXd448k%A{=^fJ*9~iAD)x!vQJjT-Qq6vf8Rc zx72Hr!@kOSE!CRLOEZOpn%&f*Np5y=G-%U{5Kyz6gHxG_*&3SD7F9V$mK{kjDi6tn z32wIHAtyEjdYepe`YNw5e0>}V#|4wuWUM7JaR|s!&g=A z(5vu1PtO@Sje8GG=nmG)uk$Z3NqymC4qeIO-t4_>L5)HL5%7OPaLGAPsk%~x@`KkL zpr<&_hi~4VO3g)zy?OURdHj6^apI*fr}3{3&q=Z(!A1zr!oLpZ&CgPh?3)TPHXZyF z;3Z;%HsuGP$_SL~SWn_|l~QLlLQAm}Z!2~D6jlpK+P}U4UvH4K=cp>Q+ey~f4yZVK zCFE_}bf1Q1fz;3qh#{Fi3C`7M*j>OZ!_X8rCms5+er@55L1zHnQPszEKSH zPRCN4U)HIULc5d76>v5*7%lG{!8#x9SliFPwLR4n&+GQY*vJ=S4wPl_G$t#ReeRmG z6(SNr1R_q;<{w%$?pVi8b2LC?*U2(%iB#Mj3CZbV_QITLo5OFH^(N|@=!SMdS=w}0 zyRt*tUOnIjGI6nBMhwQ}PEx8+utkPb!E_U&`aKw$w@E+3{kd67_rm5=84 zTU9V(Tn5E#=5@^|&mO0|@SW1WvkS_*O#hyO(i7f}(=Fy8rHkW2WNK0P&8NBTA*`Kp z+Mt->8M))`P${1bqazGMNaXW#<%^lguCg}c$XpR7wx#VT*;$<$vF;S{blOiIf* zVR*^KE*SS+NbRG3r`jt`uIHXmn{rXZaR*T!q2H$U!N2QYLv*2KG)SHb#Yv8%QKtTK zF0R|BaSF0sXG=a}trWrbiz*RMEg4)L7{2@9$F%XASkaT(JcclSsiyeF8Gk7R~6l`6Lb3wvbDBm)b>y2c~q27kxJ-?+3!I zmW}aiivpL~i3q9$pvwnx?#UOkniDCUqvWZfWP{2W0|rttC?xRu;hiw@2kN?B;M@yg z@d7i;|QyDToJUmk?iBy?759UhSr5ICMXz=W7^kon%*9l?q>2D zZx5k|`APm^PS4L1>geBUtUhpu!!|!yYMN4N{FBM-+f~&k6_n}t{Kt#!Gks}1DBdPT z>kLkQveBAS>-Q#!{%li%nU@x8HF1!3Mw0Xu5qE^7x=21V+Y(+x{K=m*0B_WY&HiH~ z0AK_Y>|JAk<}f~DmPjUgSdHnh8Xrem zrG9{1KJWnXBneYzVUQxsTj_D696A`p2xg?Cgf)w-Z8`w25VjwJVXVNT8n?lm_1eI{ zj`IKQ-UTBpjw z*SY`zV1KmzwK7ha|x)${x z_OJdF06_hSh3fpnqJUXiDS>}wi~s=EN8p+D1GwIb1dg>K{}U9Z?emYc&wqCbyWKx5 zKk#q16ac{VC}6z(KM)Sspp6pv|5JJ%*BluH1A$=Fb{62@RcQc#>QOZ95Evv3{C6!8 zHUKFf0S(y?)qQNI2mW31`tR7X%6ouJ3V?q)`0xEJ>_}yM6pXsyfph!F1N`@z90omZ wcVo!|H2aYo=>6|J1pqvM6v-0u0Fjnc5UML7!lp6+fCl!C!~_6ptN(oaAN=1=F#rGn diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 059a1ed7e85..2e7bb9fd6ab 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,9 @@ -#Sat Oct 10 15:53:10 CEST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.1-bin.zip +networkTimeout=10000 +retries=0 +retryBackOffMs=500 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew.bat b/gradlew.bat index 8508ef684d4..03754c4c3d9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,33 @@ @rem Set local scope for the variables, and ensure extensions are enabled setlocal EnableExtensions +@rem Catch executions from older scripts and ensure they exit cleanly. +@rem This can be removed once we can be reasonably confident that few people +@rem will be migrating directly to this new wrapper. +goto afterSafetyNet +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +goto exitWithErrorLevel +:afterSafetyNet + set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @rem This is normally unused @@ -45,13 +72,14 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +1>&2 echo. +1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +1>&2 echo. +1>&2 echo Please set the JAVA_HOME variable in your environment to match the +1>&2 echo location of your Java installation. "%COMSPEC%" /c exit 1 +goto exitWithErrorLevel :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -59,13 +87,14 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +1>&2 echo. +1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +1>&2 echo. +1>&2 echo Please set the JAVA_HOME variable in your environment to match the +1>&2 echo location of your Java installation. "%COMSPEC%" /c exit 1 +goto exitWithErrorLevel :execute @rem Setup the command line @@ -75,8 +104,9 @@ echo location of your Java installation. 1>&2 @rem Execute gradlew @rem endlocal doesn't take effect until after the line is parsed and variables are expanded @rem which allows us to clear the local environment before executing the java command -endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel & goto exitWithErrorLevel +@rem This label must not be changed. We rely on old scripts being able to jump to this point. :exitWithErrorLevel @rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts "%COMSPEC%" /c exit %ERRORLEVEL% From 5154b7f9dc2755068fd47d45df77a251eba66cfb Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Wed, 14 Oct 2026 12:51:24 +0200 Subject: [PATCH 14/17] refactor: migrate file operations to nio --- .../commands/commands/NotebotCommand.java | 8 ++--- .../meteorclient/systems/System.java | 22 ++++++++---- .../systems/modules/misc/BookBot.java | 5 +-- .../systems/profiles/Profiles.java | 35 ++++++++++++------- .../meteorclient/utils/files/StreamUtils.java | 15 ++++---- 5 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index cc13cedf45f..e7fe80d4cc0 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -27,9 +27,9 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; -import java.io.FileWriter; import java.io.IOException; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -161,10 +161,9 @@ private void saveRecording(Path path) { MeteorClient.EVENT_BUS.unsubscribe(this); return; } - try { + try (var writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { MeteorClient.EVENT_BUS.unsubscribe(this); - FileWriter file = new FileWriter(path.toFile()); for (var entry : song.int2ObjectEntrySet()) { int tick = entry.getIntKey(); List notes = entry.getValue(); @@ -173,11 +172,10 @@ private void saveRecording(Path path) { NoteBlockInstrument instrument = note.getInstrument(); int noteLevel = note.getNoteLevel(); - file.write(String.format("%d:%d:%d\n", tick, noteLevel, instrument.ordinal())); + writer.write(String.format("%d:%d:%d\n", tick, noteLevel, instrument.ordinal())); } } - file.close(); info("Song saved."); } catch (IOException _) { info("Couldn't create the file."); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/System.java b/src/main/java/meteordevelopment/meteorclient/systems/System.java index 24c350c335d..695196d17aa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/System.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/System.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.nio.file.AtomicMoveNotSupportedException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -48,23 +49,30 @@ public void save(File folder) { CompoundTag tag = toTag(); if (tag == null) return; + Path tempFile = null; try { - File tempFile = File.createTempFile(MeteorClient.MOD_ID, file.getName()); - NbtIo.write(tag, tempFile.toPath()); + tempFile = Files.createTempFile(MeteorClient.MOD_ID, file.getName()); + NbtIo.write(tag, tempFile); if (folder != null) file = new File(folder, file.getName()); - file.getParentFile().mkdirs(); + Files.createDirectories(file.toPath().getParent()); try { - Files.move(tempFile.toPath(), file.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + Files.move(tempFile, file.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); } catch (AtomicMoveNotSupportedException _) { - StreamUtils.copy(tempFile, file); + StreamUtils.copy(tempFile.toFile(), file); } - - tempFile.delete(); } catch (IOException e) { MeteorClient.LOG.error("Error saving {}. Possibly corrupted?", this.name, e); + } finally { + if (tempFile != null) { + try { + Files.deleteIfExists(tempFile); + } catch (IOException e) { + MeteorClient.LOG.warn("Failed to delete temporary file '{}'.", tempFile, e); + } + } } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java index b5fd9c1e796..06b9e7986ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/misc/BookBot.java @@ -25,8 +25,9 @@ import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.*; import java.util.function.Predicate; @@ -204,7 +205,7 @@ private void onTick(TickEvent.Post event) { } // Read each line of the file and construct a string with the needed line breaks - try (BufferedReader reader = new BufferedReader(new FileReader(file.get()))) { + try (BufferedReader reader = Files.newBufferedReader(file.get().toPath(), StandardCharsets.UTF_8)) { StringBuilder file = new StringBuilder(); String line; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java index 2cbefec206d..bba5edf6a4e 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profiles.java @@ -16,6 +16,8 @@ import org.jspecify.annotations.NonNull; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -92,21 +94,28 @@ public CompoundTag toTag() { public Profiles fromTag(CompoundTag tag) { profiles = NbtUtils.listFromTag(tag.getListOrEmpty("profiles"), Profile::new); - for (File file : FOLDER.listFiles()) { - if (file.isDirectory() && get(file.getName()) == null) { - Profile p = new Profile(); - p.name.set(file.getName()); - - boolean add = false; - for (File f : file.listFiles()) { - if (f.getName().equals("hud.nbt")) p.hud.set(add = true); - else if (f.getName().equals("macros.nbt")) p.macros.set(add = true); - else if (f.getName().equals("modules.nbt")) p.modules.set(add = true); - else if (f.getName().endsWith(".nbt")) p.waypoints.set(add = true); + try (var files = Files.list(FOLDER.toPath())) { + for (var path : files.toList()) { + if (Files.isDirectory(path) && get(path.getFileName().toString()) == null) { + Profile p = new Profile(); + p.name.set(path.getFileName().toString()); + + boolean add = false; + try (var profileFiles = Files.list(path)) { + for (var profilePath : profileFiles.toList()) { + String filename = profilePath.getFileName().toString(); + if (filename.equals("hud.nbt")) p.hud.set(add = true); + else if (filename.equals("macros.nbt")) p.macros.set(add = true); + else if (filename.equals("modules.nbt")) p.modules.set(add = true); + else if (filename.endsWith(".nbt")) p.waypoints.set(add = true); + } + } + + if (add) add(p); } - - if (add) add(p); } + } catch (IOException e) { + MeteorClient.LOG.error("Failed to scan profile files.", e); } return this; diff --git a/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java index 6ee1a6d15a0..ebb6fd7e464 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/files/StreamUtils.java @@ -8,24 +8,27 @@ import meteordevelopment.meteorclient.MeteorClient; import org.apache.commons.io.IOUtils; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; public class StreamUtils { private StreamUtils() { } public static void copy(File from, File to) { - try (InputStream in = new FileInputStream(from); - OutputStream out = new FileOutputStream(to)) { - in.transferTo(out); + try { + Files.copy(from.toPath(), to.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { MeteorClient.LOG.error("Error copying from file '{}' to file '{}'.", from.getName(), to.getName(), e); } } public static void copy(InputStream in, File to) { - try (OutputStream out = new FileOutputStream(to)) { - in.transferTo(out); + try { + Files.copy(in, to.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException _) { MeteorClient.LOG.error("Error writing to file '{}'.", to.getName()); } finally { From dbc9d10a4b0abf17685fa9cf1512f72a977fff3b Mon Sep 17 00:00:00 2001 From: Big-Iron-Cheems <52252627+Big-Iron-Cheems@users.noreply.github.com> Date: Wed, 14 Oct 2026 12:51:55 +0200 Subject: [PATCH 15/17] chore: remove unused import --- src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java index 137956d5104..44faca6a524 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HudMixin.java @@ -7,7 +7,6 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; From 3fae69ecdbfb81ffe7e56346165c63b21e7fbf87 Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 17 Oct 2026 09:28:15 +0200 Subject: [PATCH 16/17] Fix scissor not working on the Vulkan backend --- .../mixin/VulkanCommandEncoderMixin.java | 30 +++++++++++++++++++ src/main/resources/meteor-client.mixins.json | 1 + 2 files changed, 31 insertions(+) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/VulkanCommandEncoderMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/VulkanCommandEncoderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/VulkanCommandEncoderMixin.java new file mode 100644 index 00000000000..ee381e85b48 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/VulkanCommandEncoderMixin.java @@ -0,0 +1,30 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.mojang.renderpearl.backend.api.RenderPassBackend; +import com.mojang.renderpearl.backend.vulkan.VulkanCommandEncoder; +import com.mojang.renderpearl.backend.vulkan.VulkanDevice; +import meteordevelopment.meteorclient.mixininterface.IGpuDevice; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(VulkanCommandEncoder.class) +public abstract class VulkanCommandEncoderMixin { + @Shadow + @Final + private VulkanDevice device; + + @SuppressWarnings("deprecation") + @Inject(method = "createRenderPass", at = @At("RETURN")) + private void createRenderPass$iGpuDevice(CallbackInfoReturnable cir) { + ((IGpuDevice) device).meteor$onCreateRenderPass(cir.getReturnValue()); + } +} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index 435f8c763a1..cba3388a49c 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -196,6 +196,7 @@ "TridentItemMixin", "Vec3Mixin", "VisGraphMixin", + "VulkanCommandEncoderMixin", "VulkanDeviceMixin", "WebBlockMixin", "WingsLayerMixin", From cdde9f870d98a6d05035858be943a1d899dc5d3d Mon Sep 17 00:00:00 2001 From: MineGame159 Date: Sat, 17 Oct 2026 09:53:47 +0200 Subject: [PATCH 17/17] Fix line smooth on the OpenGL backend --- .../mixin/GlCommandEncoderMixin.java | 11 ----- .../mixin/GlRenderPipelineMixin.java | 41 +++++++++++++++++++ .../mixin/PipelineBuilderMixin.java | 31 ++++++++++++++ src/main/resources/meteor-client.mixins.json | 2 + 4 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/GlRenderPipelineMixin.java create mode 100644 src/main/java/meteordevelopment/meteorclient/mixin/PipelineBuilderMixin.java diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java index 3b7d1f62fc6..95881f6ac0e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java @@ -27,15 +27,4 @@ public abstract class GlCommandEncoderMixin { private void createRenderPass$iGpuDevice(CallbackInfoReturnable cir) { ((IGpuDevice) device).meteor$onCreateRenderPass(cir.getReturnValue()); } - - // todo ? -// @Inject(method = "applyPipelineState", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlStateManager;_polygonMode(II)V")) -// private void setPipelineAndApplyState$lineSmooth(RenderPipeline pipeline, CallbackInfo ci) { -// if (((IRenderPipeline) pipeline).meteor$getLineSmooth()) { -// glEnable(GL_LINE_SMOOTH); -// glLineWidth(1); -// } else { -// glDisable(GL_LINE_SMOOTH); -// } -// } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GlRenderPipelineMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GlRenderPipelineMixin.java new file mode 100644 index 00000000000..2de8f9c0851 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GlRenderPipelineMixin.java @@ -0,0 +1,41 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.mojang.renderpearl.backend.opengl.GlRenderPipeline; +import meteordevelopment.meteorclient.mixininterface.IRenderPipeline; +import org.lwjgl.opengl.GL11C; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(GlRenderPipeline.class) +public abstract class GlRenderPipelineMixin implements IRenderPipeline { + @Unique + private boolean lineSmooth; + + @Override + public void meteor$setLineSmooth(boolean lineSmooth) { + this.lineSmooth = lineSmooth; + } + + @Override + public boolean meteor$getLineSmooth() { + return lineSmooth; + } + + @Inject(method = "bind", at = @At("RETURN")) + private void bind$lineSmooth(CallbackInfo ci) { + if (lineSmooth) { + GL11C.glEnable(GL11C.GL_LINE_SMOOTH); + GL11C.glLineWidth(1); + } else { + GL11C.glDisable(GL11C.GL_LINE_SMOOTH); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PipelineBuilderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PipelineBuilderMixin.java new file mode 100644 index 00000000000..8c4be312a82 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PipelineBuilderMixin.java @@ -0,0 +1,31 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.renderpearl.api.pipeline.CompiledRenderPipeline; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; +import com.mojang.renderpearl.backend.api.BackendRenderPipeline; +import com.mojang.renderpearl.frontend.shaders.PipelineBuilder; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.ReferenceArrayList; +import meteordevelopment.meteorclient.mixininterface.IRenderPipeline; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.Executor; + +@Mixin(PipelineBuilder.class) +public abstract class PipelineBuilderMixin { + @Inject(method = "lambda$compilePipeline$1", at = @At(value = "INVOKE", target = "Ljava/util/concurrent/Executor;execute(Ljava/lang/Runnable;)V")) + private static void compilePipeline$lineSmooth(RenderPipeline pipeline, BackendRenderPipeline.Pending backendPendingPipeline, Executor executor, ReferenceArrayList shaderCreateInfos, Object2IntOpenHashMap uniformBindings, CallbackInfoReturnable cir, @Local(name = "backendPipeline") BackendRenderPipeline backendPipeline) { + if (backendPipeline instanceof IRenderPipeline iPipeline) { + iPipeline.meteor$setLineSmooth(((IRenderPipeline) pipeline).meteor$getLineSmooth()); + } + } +} diff --git a/src/main/resources/meteor-client.mixins.json b/src/main/resources/meteor-client.mixins.json index cba3388a49c..e462b6ac85c 100644 --- a/src/main/resources/meteor-client.mixins.json +++ b/src/main/resources/meteor-client.mixins.json @@ -109,6 +109,7 @@ "GameRendererMixin", "GlCommandEncoderMixin", "GlDeviceMixin", + "GlRenderPipelineMixin", "GuiGraphicsExtractorAccessor", "GuiMessageMixin", "GuiMessageVisibleMixin", @@ -162,6 +163,7 @@ "OptionsMixin", "PacketBundlingMixin", "ParticleEngineMixin", + "PipelineBuilderMixin", "PlayerAccessor", "PlayerInfoMixin", "PlayerMixin",