diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 73c9536313..28b01298b1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,23 +15,23 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: persist-credentials: false - name: Set up Gradle - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v5 - name: Set up Java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' - java-version: '21' + java-version: '25' - name: Set up Node JS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 - name: Get current build number id: build-number diff --git a/.github/workflows/issue-moderator.yml b/.github/workflows/issue-moderator.yml index e5e885996b..0088679fe3 100644 --- a/.github/workflows/issue-moderator.yml +++ b/.github/workflows/issue-moderator.yml @@ -14,14 +14,14 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: persist-credentials: false - name: Set Up Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 - name: Install Dependencies working-directory: .github/moderation diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 8baee8109d..291500d49d 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -8,24 +8,24 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: persist-credentials: false - name: Set up Gradle - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v5 - name: Set up Java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' - java-version: '21' + java-version: '25' - name: Build run: ./gradlew build - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: pull-request-build path: build/libs/ diff --git a/build.gradle.kts b/build.gradle.kts index 17cfb27b56..0945334fb4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,7 +48,7 @@ val jij: Configuration by configurations.creating configurations { // include mods - modImplementation.configure { + implementation.configure { extendsFrom(modInclude) } include.configure { @@ -67,23 +67,24 @@ configurations { dependencies { // Fabric minecraft(libs.minecraft) - mappings(variantOf(libs.yarn) { classifier("v2") }) - modImplementation(libs.fabric.loader) + implementation(libs.fabric.loader) val fapiVersion = libs.versions.fabric.api.get() modInclude(fabricApi.module("fabric-api-base", fapiVersion)) modInclude(fabricApi.module("fabric-resource-loader-v1", fapiVersion)) // Compat fixes - modCompileOnly(fabricApi.module("fabric-renderer-indigo", fapiVersion)) - modCompileOnly(libs.sodium) { isTransitive = false } - modCompileOnly(libs.lithium) { isTransitive = false } - modCompileOnly(libs.iris) { isTransitive = false } - modCompileOnly(libs.viafabricplus) { isTransitive = false } - modCompileOnly(libs.viafabricplus.api) { isTransitive = false } - - modCompileOnly(libs.baritone) - modCompileOnly(libs.modmenu) + compileOnly(fabricApi.module("fabric-renderer-indigo", fapiVersion)) + 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 } + + val localBaritone = files("../baritone-1.21.11/fabric/build/libs/baritone-fabric-${libs.versions.baritone.get()}.jar") + compileOnly(localBaritone) + runtimeOnly(localBaritone) + compileOnly(libs.modmenu) // Libraries (JAR-in-JAR) jij(libs.orbit) @@ -104,8 +105,9 @@ sourceSets { } java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion.set(JavaLanguageVersion.of(libs.versions.jdk.get().toInt())) + } if (System.getenv("CI")?.toBoolean() == true) { withSourcesJar() @@ -114,32 +116,24 @@ java { } // Handle transitive dependencies for jar-in-jar -// Based on implementation from BaseProject by FlorianMichael/EnZaXD -// Source: https://github.com/FlorianMichael/BaseProject/blob/main/src/main/kotlin/de/florianmichael/baseproject/Fabric.kt +// Based on implementation from BaseProject by florianreuth/EnZaXD +// Source: https://github.com/florianreuth/BaseProject/blob/main/src/main/kotlin/de/florianreuth/baseproject/Fabric.kt // Licensed under Apache License 2.0 -afterEvaluate { - val jijConfig = configurations.findByName("jij") ?: return@afterEvaluate - - // Dependencies to exclude from jar-in-jar - val excluded = setOf( - "org.slf4j", // Logging provided by Minecraft - "jsr305" // Compile time annotations only - ) - - jijConfig.incoming.resolutionResult.allDependencies.forEach { dep -> - val requested = dep.requested.displayName - - if (excluded.any { requested.contains(it) }) return@forEach - - val compileOnlyDep = dependencies.create(requested) { - isTransitive = false +val jijExcluded = setOf("org.slf4j", "jsr305") +listOf("jij", "implementation", "include").forEach { configName -> + configurations.named(configName).configure { + defaultDependencies { + configurations.getByName("jij").incoming.resolutionResult.allComponents + .mapNotNull { it.id as? ModuleComponentIdentifier } + .forEach { id -> + val notation = "${id.group}:${id.module}:${id.version}" + if (jijExcluded.none { notation.contains(it) }) { + add(project.dependencies.create(notation) { + isTransitive = false + }) + } + } } - - val implDep = dependencies.create(compileOnlyDep) - - dependencies.add("compileOnlyApi", compileOnlyDep) - dependencies.add("implementation", implDep) - dependencies.add("include", compileOnlyDep) } } @@ -156,6 +150,7 @@ tasks { "version" to project.version, "build_number" to buildNumber, "commit" to commit, + "jdk_version" to libs.versions.jdk.get(), "minecraft_version" to libs.versions.minecraft.get(), "loader_version" to libs.versions.fabric.loader.get() ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 65a8135913..b57397f53d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,25 +1,25 @@ [versions] # Fabric (https://fabricmc.net/develop) -minecraft = "1.21.11" -yarn-mappings = "1.21.11+build.3" -fabric-loader = "0.18.2" -fabric-api = "0.140.0+1.21.11" +jdk = "25" +minecraft = "26.1.1" +fabric-loader = "0.18.6" +fabric-api = "0.145.2+26.1.1" # Plugins # Loom (https://github.com/FabricMC/fabric-loom) -loom = "1.14-SNAPSHOT" +loom = "1.15-SNAPSHOT" # Mods # Baritone (https://github.com/MeteorDevelopment/baritone) -baritone = "1.21.10-SNAPSHOT" +baritone = "26.1.1-SNAPSHOT" # Sodium (https://github.com/CaffeineMC/sodium-fabric) -sodium = "mc1.21.11-0.8.0-fabric" +sodium = "mc26.1-0.8.7-fabric" # Lithium (https://github.com/CaffeineMC/lithium-fabric) -lithium = "mc1.21.11-0.21.3-fabric" +lithium = "mc26.1.1-0.23.0-fabric" # Iris (https://github.com/IrisShaders/Iris) -iris = "1.10.2+1.21.11-fabric" +iris = "1.10.8+26.1-fabric" # ModMenu (https://github.com/TerraformersMC/ModMenu) -modmenu = "15.0.0" +modmenu = "18.0.0-alpha.8" # Orbit (https://github.com/MeteorDevelopment/orbit) orbit = "0.2.4" # Starscript (https://github.com/MeteorDevelopment/starscript) @@ -31,14 +31,13 @@ reflections = "0.10.2" # Netty (https://github.com/netty/netty) netty = "4.2.7.Final" # ViaFabricPlus (https://github.com/ViaVersion/ViaFabricPlus) -viafabricplus = "4.4.0" -# WaybackAuthLib (https://github.com/FlorianMichael/WaybackAuthLib) -waybackauthlib = "1.0.1" +viafabricplus = "4.5.0" +# WaybackAuthLib (https://github.com/florianreuth/WaybackAuthLib) +waybackauthlib = "1.1.0" [libraries] # Fabric base minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } -yarn = { module = "net.fabricmc:yarn", version.ref = "yarn-mappings" } fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-loader" } # Mods @@ -57,7 +56,7 @@ discord-ipc = { module = "meteordevelopment:discord-ipc", version.ref = "discord reflections = { module = "org.reflections:reflections", version.ref = "reflections" } netty-handler-proxy = { module = "io.netty:netty-handler-proxy", version.ref = "netty" } netty-codec-socks = { module = "io.netty:netty-codec-socks", version.ref = "netty" } -waybackauthlib = { module = "de.florianmichael:WaybackAuthLib", version.ref = "waybackauthlib" } +waybackauthlib = { module = "de.florianreuth:waybackauthlib", version.ref = "waybackauthlib" } [plugins] -fabric-loom = { id = "fabric-loom", version.ref = "loom" } +fabric-loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee3125..d997cfc60f 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c2462f..c61a118f7d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index adff685a03..739907dfd1 100755 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java index 4711bd80bd..eda3b46f96 100644 --- a/src/main/java/meteordevelopment/meteorclient/MeteorClient.java +++ b/src/main/java/meteordevelopment/meteorclient/MeteorClient.java @@ -8,7 +8,7 @@ import meteordevelopment.meteorclient.addons.AddonManager; import meteordevelopment.meteorclient.addons.MeteorAddon; import meteordevelopment.meteorclient.events.game.OpenScreenEvent; -import meteordevelopment.meteorclient.events.meteor.KeyEvent; +import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.gui.GuiThemes; @@ -35,9 +35,9 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.ModMetadata; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.ChatScreen; +import net.minecraft.resources.Identifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongepowered.asm.mixin.MixinEnvironment; @@ -55,7 +55,7 @@ public class MeteorClient implements ClientModInitializer { public static MeteorClient INSTANCE; public static MeteorAddon ADDON; - public static MinecraftClient mc; + public static Minecraft mc; public static final IEventBus EVENT_BUS = new EventBus(); public static final File FOLDER = FabricLoader.getInstance().getGameDir().resolve(MOD_ID).toFile(); public static final Logger LOG; @@ -84,7 +84,7 @@ public void onInitializeClient() { } // Global minecraft client accessor - mc = MinecraftClient.getInstance(); + mc = Minecraft.getInstance(); if (FabricLoader.getInstance().isDevelopmentEnvironment()) { LOG.info("Force loading mixins"); @@ -149,14 +149,14 @@ public void onInitializeClient() { @EventHandler private void onTick(TickEvent.Post event) { - if (mc.currentScreen == null && mc.getOverlay() == null && KeyBinds.OPEN_COMMANDS.wasPressed()) { + if (mc.screen == null && mc.getOverlay() == null && KeyBinds.OPEN_COMMANDS.consumeClick()) { mc.setScreen(new ChatScreen(Config.get().prefix.get(), true)); } } @EventHandler - private void onKey(KeyEvent event) { - if (event.action == KeyAction.Press && KeyBinds.OPEN_GUI.matchesKey(event.input)) { + private void onKey(KeyInputEvent event) { + if (event.action == KeyAction.Press && KeyBinds.OPEN_GUI.matches(event.input)) { toggleGui(); } } @@ -169,7 +169,7 @@ private void onMouseClick(MouseClickEvent event) { } private void toggleGui() { - if (Utils.canCloseGui()) mc.currentScreen.close(); + if (Utils.canCloseGui()) mc.screen.onClose(); else if (Utils.canOpenGui()) Tabs.get().getFirst().openScreen(GuiThemes.get()); } @@ -180,21 +180,21 @@ private void toggleGui() { @EventHandler(priority = EventPriority.LOWEST) private void onOpenScreen(OpenScreenEvent event) { if (event.screen instanceof WidgetScreen) { - if (!wasWidgetScreen) wasHudHiddenRoot = mc.options.hudHidden; + if (!wasWidgetScreen) wasHudHiddenRoot = mc.options.hideGui; 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.options.hudHidden = !(event.screen instanceof HudEditorScreen); + mc.options.hideGui = !(event.screen instanceof HudEditorScreen); } } else { - if (wasWidgetScreen) mc.options.hudHidden = wasHudHiddenRoot; - wasHudHiddenRoot = mc.options.hudHidden; + if (wasWidgetScreen) mc.options.hideGui = wasHudHiddenRoot; + wasHudHiddenRoot = mc.options.hideGui; } wasWidgetScreen = event.screen instanceof WidgetScreen; } public static Identifier identifier(String path) { - return Identifier.of(MeteorClient.MOD_ID, path); + return Identifier.fromNamespaceAndPath(MeteorClient.MOD_ID, path); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Command.java b/src/main/java/meteordevelopment/meteorclient/commands/Command.java index 18fea76782..3d5782c5a4 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Command.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Command.java @@ -13,19 +13,19 @@ import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.command.CommandRegistryAccess; -import net.minecraft.command.CommandSource; -import net.minecraft.registry.BuiltinRegistries; -import net.minecraft.server.command.CommandManager; -import net.minecraft.text.Text; +import net.minecraft.client.Minecraft; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.Commands; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.data.registries.VanillaRegistries; +import net.minecraft.network.chat.Component; import java.util.List; public abstract class Command { - protected static CommandRegistryAccess REGISTRY_ACCESS = CommandManager.createRegistryAccess(BuiltinRegistries.createWrapperLookup()); + protected static CommandBuildContext REGISTRY_ACCESS = Commands.createValidationContext(VanillaRegistries.createLookup()); protected static final int SINGLE_SUCCESS = com.mojang.brigadier.Command.SINGLE_SUCCESS; - protected static final MinecraftClient mc = MeteorClient.mc; + protected static final Minecraft mc = MeteorClient.mc; private final String name; private final String title; @@ -40,26 +40,26 @@ public Command(String name, String description, String... aliases) { } // Helper methods to painlessly infer the CommandSource generic type argument - protected static RequiredArgumentBuilder argument(final String name, final ArgumentType type) { + protected static RequiredArgumentBuilder argument(final String name, final ArgumentType type) { return RequiredArgumentBuilder.argument(name, type); } - protected static LiteralArgumentBuilder literal(final String name) { + protected static LiteralArgumentBuilder literal(final String name) { return LiteralArgumentBuilder.literal(name); } - public final void registerTo(CommandDispatcher dispatcher) { + public final void registerTo(CommandDispatcher dispatcher) { register(dispatcher, name); for (String alias : aliases) register(dispatcher, alias); } - public void register(CommandDispatcher dispatcher, String name) { - LiteralArgumentBuilder builder = LiteralArgumentBuilder.literal(name); + public void register(CommandDispatcher dispatcher, String name) { + LiteralArgumentBuilder builder = LiteralArgumentBuilder.literal(name); build(builder); dispatcher.register(builder); } - public abstract void build(LiteralArgumentBuilder builder); + public abstract void build(LiteralArgumentBuilder builder); public String getName() { return name; @@ -83,7 +83,7 @@ public String toString(String... args) { return base.toString(); } - public void info(Text message) { + public void info(Component message) { ChatUtils.forceNextPrefixClass(getClass()); ChatUtils.sendMsg(title, message); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java index c80c9054ad..36d2a32518 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/Commands.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/Commands.java @@ -13,9 +13,9 @@ import meteordevelopment.meteorclient.pathing.PathManagers; import meteordevelopment.meteorclient.utils.PostInit; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.command.CommandRegistryAccess; -import net.minecraft.command.CommandSource; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.SharedSuggestionProvider; import java.util.ArrayList; import java.util.Comparator; @@ -25,7 +25,7 @@ public class Commands { public static final List COMMANDS = new ArrayList<>(); - public static CommandDispatcher DISPATCHER = new CommandDispatcher<>(); + public static CommandDispatcher DISPATCHER = new CommandDispatcher<>(); @PostInit(dependencies = PathManagers.class) public static void init() { @@ -80,7 +80,7 @@ public static void add(Command command) { } public static void dispatch(String message) throws CommandSyntaxException { - DISPATCHER.execute(message, mc.getNetworkHandler().getCommandSource()); + DISPATCHER.execute(message, mc.getConnection().getSuggestionsProvider()); } public static Command get(String name) { @@ -94,8 +94,8 @@ public static Command get(String name) { } /** - * Argument types that rely on Minecraft registries access those registries through a {@link CommandRegistryAccess} - * object. Since dynamic registries are specific to each server, we need to make a new CommandRegistryAccess object + * Argument types that rely on Minecraft registries access those registries through a {@link CommandBuildContext} + * object. Since dynamic registries are specific to each server, we need to make a new CommandBuildContext object * every time we join a server. *

* The command tree and by extension the {@link CommandDispatcher} also have to be rebuilt because: @@ -112,8 +112,8 @@ public static Command get(String name) { */ @EventHandler private static void onJoin(GameJoinedEvent event) { - ClientPlayNetworkHandler networkHandler = mc.getNetworkHandler(); - Command.REGISTRY_ACCESS = CommandRegistryAccess.of(networkHandler.getRegistryManager(), networkHandler.getEnabledFeatures()); + ClientPacketListener networkHandler = mc.getConnection(); + Command.REGISTRY_ACCESS = CommandBuildContext.simple(networkHandler.registryAccess(), networkHandler.enabledFeatures()); DISPATCHER = new CommandDispatcher<>(); for (Command command : COMMANDS) { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/BlockPosArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/BlockPosArgumentType.java index c9ce16f4de..a78d91602a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/BlockPosArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/BlockPosArgumentType.java @@ -12,15 +12,18 @@ import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.CoordinateArgument; -import net.minecraft.command.argument.EntityAnchorArgumentType; -import net.minecraft.command.argument.Vec3ArgumentType; -import net.minecraft.server.command.CommandManager; -import net.minecraft.text.Text; -import net.minecraft.util.math.*; -import net.minecraft.world.World; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.commands.Commands; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.arguments.EntityAnchorArgument; +import net.minecraft.commands.arguments.coordinates.Vec3Argument; +import net.minecraft.commands.arguments.coordinates.WorldCoordinate; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.phys.Vec2; +import net.minecraft.world.phys.Vec3; import java.util.Arrays; import java.util.Collection; @@ -64,27 +67,28 @@ public class BlockPosArgumentType implements ArgumentType { private static final BlockPosArgumentType INSTANCE = new BlockPosArgumentType(); private static final Collection EXAMPLES = Arrays.asList("0 0 0", "~ ~ ~", "^ ^ ^", "^1 ^ ^-5", "~0.5 ~1 ~-5"); - public static final SimpleCommandExceptionType UNLOADED_EXCEPTION = new SimpleCommandExceptionType(Text.translatable("argument.pos.unloaded")); - public static final SimpleCommandExceptionType OUT_OF_WORLD_EXCEPTION = new SimpleCommandExceptionType(Text.translatable("argument.pos.outofworld")); - public static final SimpleCommandExceptionType OUT_OF_BOUNDS_EXCEPTION = new SimpleCommandExceptionType(Text.translatable("argument.pos.outofbounds")); + public static final SimpleCommandExceptionType UNLOADED_EXCEPTION = new SimpleCommandExceptionType(Component.translatable("argument.pos.unloaded")); + public static final SimpleCommandExceptionType OUT_OF_WORLD_EXCEPTION = new SimpleCommandExceptionType(Component.translatable("argument.pos.outofworld")); + public static final SimpleCommandExceptionType OUT_OF_BOUNDS_EXCEPTION = new SimpleCommandExceptionType(Component.translatable("argument.pos.outofbounds")); - private BlockPosArgumentType() {} + private BlockPosArgumentType() { + } public static BlockPosArgumentType blockPos() { return INSTANCE; } public static BlockPos getLoadedBlockPos(CommandContext context, String name) throws CommandSyntaxException { - ClientWorld clientLevel = mc.world; + ClientLevel clientLevel = mc.level; return getLoadedBlockPos(context, clientLevel, name); } - public static BlockPos getLoadedBlockPos(CommandContext context, ClientWorld level, String name) throws CommandSyntaxException { + public static BlockPos getLoadedBlockPos(CommandContext context, ClientLevel level, String name) throws CommandSyntaxException { BlockPos blockPos = getBlockPos(context, name); - ChunkPos chunkPos = new ChunkPos(blockPos); - if (!level.getChunkManager().isChunkLoaded(chunkPos.x, chunkPos.z)) { + ChunkPos chunkPos = new ChunkPos(blockPos.getX(), blockPos.getZ()); + if (!level.getChunkSource().hasChunk(chunkPos.x(), chunkPos.z())) { throw UNLOADED_EXCEPTION.create(); - } else if (!level.isInBuildLimit(blockPos)) { + } else if (!level.isInWorldBounds(blockPos)) { throw OUT_OF_WORLD_EXCEPTION.create(); } else { return blockPos; @@ -97,7 +101,7 @@ public static BlockPos getBlockPos(CommandContext context, String name) { public static BlockPos getValidBlockPos(CommandContext context, String name) throws CommandSyntaxException { BlockPos blockPos = getBlockPos(context, name); - if (!World.isValid(blockPos)) { + if (!ClientLevel.isInSpawnableBounds(blockPos)) { throw OUT_OF_BOUNDS_EXCEPTION.create(); } else { return blockPos; @@ -109,18 +113,18 @@ public PosArgument parse(StringReader stringReader) throws CommandSyntaxExceptio } public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - if (!(context.getSource() instanceof CommandSource)) { + if (!(context.getSource() instanceof SharedSuggestionProvider)) { return Suggestions.empty(); } else { String string = builder.getRemaining(); - Collection collection; + Collection collection; if (!string.isEmpty() && string.charAt(0) == '^') { - collection = Collections.singleton(CommandSource.RelativePosition.ZERO_LOCAL); + collection = Collections.singleton(SharedSuggestionProvider.TextCoordinates.DEFAULT_LOCAL); } else { - collection = ((CommandSource) context.getSource()).getBlockPositionSuggestions(); + collection = ((SharedSuggestionProvider) context.getSource()).getRelevantCoordinates(); } - return CommandSource.suggestPositions(string, collection, builder, CommandManager.getCommandValidator(this::parse)); + return SharedSuggestionProvider.suggestCoordinates(string, collection, builder, Commands.createValidator(this::parse)); } } @@ -129,12 +133,12 @@ public Collection getExamples() { } public interface PosArgument { - Vec3d getPosition(S var1); + Vec3 getPosition(S var1); - Vec2f getRotation(S var1); + Vec2 getRotation(S var1); default BlockPos getBlockPos(S source) { - return BlockPos.ofFloored(this.getPosition(source)); + return BlockPos.containing(this.getPosition(source)); } boolean isXRelative(); @@ -145,26 +149,26 @@ default BlockPos getBlockPos(S source) { } public static class DefaultPosArgument implements PosArgument { - private final CoordinateArgument x; - private final CoordinateArgument y; - private final CoordinateArgument z; + private final WorldCoordinate x; + private final WorldCoordinate y; + private final WorldCoordinate z; - public DefaultPosArgument(CoordinateArgument x, CoordinateArgument y, CoordinateArgument z) { + public DefaultPosArgument(WorldCoordinate x, WorldCoordinate y, WorldCoordinate z) { this.x = x; this.y = y; this.z = z; } @Override - public Vec3d getPosition(S source) { - Vec3d vec3 = mc.player.getEntityPos(); - return new Vec3d(this.x.toAbsoluteCoordinate(vec3.x), this.y.toAbsoluteCoordinate(vec3.y), this.z.toAbsoluteCoordinate(vec3.z)); + public Vec3 getPosition(S source) { + Vec3 vec3 = mc.player.position(); + return new Vec3(this.x.get(vec3.x), this.y.get(vec3.y), this.z.get(vec3.z)); } @Override - public Vec2f getRotation(S source) { - Vec2f vec2 = mc.player.getRotationClient(); - return new Vec2f((float) this.x.toAbsoluteCoordinate(vec2.x), (float) this.y.toAbsoluteCoordinate(vec2.y)); + public Vec2 getRotation(S source) { + Vec2 vec2 = mc.player.getRotationVector(); + return new Vec2((float) this.x.get(vec2.x), (float) this.y.get(vec2.y)); } @Override @@ -194,46 +198,46 @@ public boolean equals(Object o) { public static DefaultPosArgument parse(StringReader reader) throws CommandSyntaxException { int cursor = reader.getCursor(); - CoordinateArgument worldCoordinate = CoordinateArgument.parse(reader); + WorldCoordinate worldCoordinate = WorldCoordinate.parseInt(reader); if (reader.canRead() && reader.peek() == ' ') { reader.skip(); - CoordinateArgument worldCoordinate2 = CoordinateArgument.parse(reader); + WorldCoordinate worldCoordinate2 = WorldCoordinate.parseInt(reader); if (reader.canRead() && reader.peek() == ' ') { reader.skip(); - CoordinateArgument worldCoordinate3 = CoordinateArgument.parse(reader); + WorldCoordinate worldCoordinate3 = WorldCoordinate.parseInt(reader); return new DefaultPosArgument(worldCoordinate, worldCoordinate2, worldCoordinate3); } } reader.setCursor(cursor); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + throw Vec3Argument.ERROR_NOT_COMPLETE.createWithContext(reader); } public static DefaultPosArgument parse(StringReader reader, boolean centerIntegers) throws CommandSyntaxException { int cursor = reader.getCursor(); - CoordinateArgument worldCoordinate = CoordinateArgument.parse(reader, centerIntegers); + WorldCoordinate worldCoordinate = WorldCoordinate.parseDouble(reader, centerIntegers); if (reader.canRead() && reader.peek() == ' ') { reader.skip(); - CoordinateArgument worldCoordinate2 = CoordinateArgument.parse(reader, false); + WorldCoordinate worldCoordinate2 = WorldCoordinate.parseDouble(reader, false); if (reader.canRead() && reader.peek() == ' ') { reader.skip(); - CoordinateArgument worldCoordinate3 = CoordinateArgument.parse(reader, centerIntegers); + WorldCoordinate worldCoordinate3 = WorldCoordinate.parseDouble(reader, centerIntegers); return new DefaultPosArgument(worldCoordinate, worldCoordinate2, worldCoordinate3); } } reader.setCursor(cursor); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + throw Vec3Argument.ERROR_NOT_COMPLETE.createWithContext(reader); } public static DefaultPosArgument absolute(double x, double y, double z) { - return new DefaultPosArgument(new CoordinateArgument(false, x), new CoordinateArgument(false, y), new CoordinateArgument(false, z)); + return new DefaultPosArgument(new WorldCoordinate(false, x), new WorldCoordinate(false, y), new WorldCoordinate(false, z)); } - public static DefaultPosArgument absolute(Vec2f vec) { - return new DefaultPosArgument(new CoordinateArgument(false, vec.x), new CoordinateArgument(false, vec.y), new CoordinateArgument(true, 0.0)); + public static DefaultPosArgument absolute(Vec2 vec) { + return new DefaultPosArgument(new WorldCoordinate(false, vec.x), new WorldCoordinate(false, vec.y), new WorldCoordinate(true, 0.0)); } public static DefaultPosArgument current() { - return new DefaultPosArgument(new CoordinateArgument(true, 0.0), new CoordinateArgument(true, 0.0), new CoordinateArgument(true, 0.0)); + return new DefaultPosArgument(new WorldCoordinate(true, 0.0), new WorldCoordinate(true, 0.0), new WorldCoordinate(true, 0.0)); } @Override @@ -256,27 +260,27 @@ public LookingPosArgument(double x, double y, double z) { } @Override - public Vec3d getPosition(S source) { - Vec2f vec2 = mc.player.getRotationClient(); - Vec3d vec3 = EntityAnchorArgumentType.EntityAnchor.FEET.positionAt(mc.player); - float f = MathHelper.cos((vec2.y + 90.0F) * (float) (Math.PI / 180.0)); - float g = MathHelper.sin((vec2.y + 90.0F) * (float) (Math.PI / 180.0)); - float h = MathHelper.cos(-vec2.x * (float) (Math.PI / 180.0)); - float i = MathHelper.sin(-vec2.x * (float) (Math.PI / 180.0)); - float j = MathHelper.cos((-vec2.x + 90.0F) * (float) (Math.PI / 180.0)); - float k = MathHelper.sin((-vec2.x + 90.0F) * (float) (Math.PI / 180.0)); - Vec3d vec32 = new Vec3d(f * h, i, g * h); - Vec3d vec33 = new Vec3d(f * j, k, g * j); - Vec3d vec34 = vec32.crossProduct(vec33).multiply(-1.0); + public Vec3 getPosition(S source) { + Vec2 vec2 = mc.player.getRotationVector(); + Vec3 vec3 = EntityAnchorArgument.Anchor.FEET.apply(mc.player); + float f = Mth.cos((vec2.y + 90.0F) * (float) (Math.PI / 180.0)); + float g = Mth.sin((vec2.y + 90.0F) * (float) (Math.PI / 180.0)); + float h = Mth.cos(-vec2.x * (float) (Math.PI / 180.0)); + float i = Mth.sin(-vec2.x * (float) (Math.PI / 180.0)); + float j = Mth.cos((-vec2.x + 90.0F) * (float) (Math.PI / 180.0)); + float k = Mth.sin((-vec2.x + 90.0F) * (float) (Math.PI / 180.0)); + Vec3 vec32 = new Vec3(f * h, i, g * h); + Vec3 vec33 = new Vec3(f * j, k, g * j); + Vec3 vec34 = vec32.cross(vec33).scale(-1.0); double d = vec32.x * this.z + vec33.x * this.y + vec34.x * this.x; double e = vec32.y * this.z + vec33.y * this.y + vec34.y * this.x; double l = vec32.z * this.z + vec33.z * this.y + vec34.z * this.x; - return new Vec3d(vec3.x + d, vec3.y + e, vec3.z + l); + return new Vec3(vec3.x + d, vec3.y + e, vec3.z + l); } @Override - public Vec2f getRotation(S source) { - return Vec2f.ZERO; + public Vec2 getRotation(S source) { + return Vec2.ZERO; } @Override @@ -299,13 +303,13 @@ public static LookingPosArgument parse(StringReader reader) throws CommandSyntax double d = readCoordinate(reader, cursor); if (!reader.canRead() || reader.peek() != ' ') { reader.setCursor(cursor); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + throw Vec3Argument.ERROR_NOT_COMPLETE.createWithContext(reader); } reader.skip(); double e = readCoordinate(reader, cursor); if (!reader.canRead() || reader.peek() != ' ') { reader.setCursor(cursor); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + throw Vec3Argument.ERROR_NOT_COMPLETE.createWithContext(reader); } reader.skip(); double f = readCoordinate(reader, cursor); @@ -314,11 +318,11 @@ public static LookingPosArgument parse(StringReader reader) throws CommandSyntax private static double readCoordinate(StringReader reader, int startingCursorPos) throws CommandSyntaxException { if (!reader.canRead()) { - throw CoordinateArgument.MISSING_COORDINATE.createWithContext(reader); + throw WorldCoordinate.ERROR_EXPECTED_DOUBLE.createWithContext(reader); } if (reader.peek() != '^') { reader.setCursor(startingCursorPos); - throw Vec3ArgumentType.MIXED_COORDINATE_EXCEPTION.createWithContext(reader); + throw Vec3Argument.ERROR_MIXED_TYPE.createWithContext(reader); } reader.skip(); return reader.canRead() && reader.peek() != ' ' ? reader.readDouble() : 0.0; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CommandArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CommandArgumentType.java index a04494b394..15bb4f4781 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CommandArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CommandArgumentType.java @@ -14,8 +14,8 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.Commands; -import net.minecraft.command.CommandSource; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; import java.util.Collection; import java.util.LinkedHashSet; @@ -25,7 +25,7 @@ public class CommandArgumentType implements ArgumentType { private static final CommandArgumentType INSTANCE = new CommandArgumentType(); - private static final DynamicCommandExceptionType NO_SUCH_COMMAND = new DynamicCommandExceptionType(name -> Text.literal("Command with name " + name + " doesn't exist.")); + private static final DynamicCommandExceptionType NO_SUCH_COMMAND = new DynamicCommandExceptionType(name -> Component.literal("Command with name " + name + " doesn't exist.")); private static final Collection EXAMPLES = Commands.COMMANDS.stream().limit(3).map(Command::getName).collect(Collectors.toList()); private CommandArgumentType() { @@ -68,7 +68,7 @@ public CompletableFuture listSuggestions(CommandContext cont suggestions.add(c.getName()); suggestions.addAll(c.getAliases()); } - return CommandSource.suggestMatching(suggestions, builder); + return SharedSuggestionProvider.suggest(suggestions, builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.java index 4ec8c2648a..bb173050bf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ComponentMapArgumentType.java @@ -12,32 +12,32 @@ import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.utils.misc.ComponentMapReader; -import net.minecraft.command.CommandRegistryAccess; -import net.minecraft.command.CommandSource; -import net.minecraft.component.ComponentMap; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.component.DataComponentMap; import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; -public class ComponentMapArgumentType implements ArgumentType { +public class ComponentMapArgumentType implements ArgumentType { private static final Collection EXAMPLES = List.of("{foo=bar}"); private final ComponentMapReader reader; - public ComponentMapArgumentType(CommandRegistryAccess commandRegistryAccess) { + public ComponentMapArgumentType(CommandBuildContext commandRegistryAccess) { this.reader = new ComponentMapReader(commandRegistryAccess); } - public static ComponentMapArgumentType componentMap(CommandRegistryAccess commandRegistryAccess) { + public static ComponentMapArgumentType componentMap(CommandBuildContext commandRegistryAccess) { return new ComponentMapArgumentType(commandRegistryAccess); } - public static ComponentMap getComponentMap(CommandContext context, String name) { - return context.getArgument(name, ComponentMap.class); + public static DataComponentMap getComponentMap(CommandContext context, String name) { + return context.getArgument(name, DataComponentMap.class); } @Override - public ComponentMap parse(StringReader reader) throws CommandSyntaxException { + public DataComponentMap parse(StringReader reader) throws CommandSyntaxException { return this.reader.consume(reader); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java index fcfbe07d41..a5f238c09a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/CompoundNbtTagArgumentType.java @@ -9,15 +9,15 @@ import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.StringNbtReader; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; import java.util.Collection; import java.util.List; -import static net.minecraft.nbt.StringNbtReader.EXPECTED_COMPOUND; +import static net.minecraft.nbt.TagParser.ERROR_EXPECTED_COMPOUND; -public class CompoundNbtTagArgumentType implements ArgumentType { +public class CompoundNbtTagArgumentType implements ArgumentType { private static final CompoundNbtTagArgumentType INSTANCE = new CompoundNbtTagArgumentType(); private static final Collection EXAMPLES = List.of("{foo:bar}", "{foo:[aa, bb],bar:15}"); @@ -25,25 +25,25 @@ public static CompoundNbtTagArgumentType create() { return INSTANCE; } - public static NbtCompound get(CommandContext context) { - return context.getArgument("nbt", NbtCompound.class); + public static CompoundTag get(CommandContext context) { + return context.getArgument("nbt", CompoundTag.class); } - private CompoundNbtTagArgumentType() {} + private CompoundNbtTagArgumentType() { + } @Override - public NbtCompound parse(StringReader reader) throws CommandSyntaxException { + public CompoundTag parse(StringReader reader) throws CommandSyntaxException { reader.skipWhitespace(); if (!reader.canRead()) { - throw EXPECTED_COMPOUND.createWithContext(reader); + throw ERROR_EXPECTED_COMPOUND.createWithContext(reader); } StringBuilder b = new StringBuilder(); int open = 0; while (reader.canRead()) { if (reader.peek() == '{') { open++; - } - else if (reader.peek() == '}') { + } else if (reader.peek() == '}') { open--; } if (open == 0) @@ -52,9 +52,9 @@ else if (reader.peek() == '}') { } reader.expect('}'); b.append('}'); - return StringNbtReader.readCompound(b.toString() - .replace("$", "§") - .replace("§§", "$") + return TagParser.parseCompoundFully(b.toString() + .replace("$", "§") + .replace("§§", "$") ); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java index d50efe6797..201e9e27f7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/DirectionArgumentType.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.commands.arguments; -import net.minecraft.command.argument.EnumArgumentType; -import net.minecraft.util.math.Direction; +import net.minecraft.commands.arguments.StringRepresentableArgument; +import net.minecraft.core.Direction; -public class DirectionArgumentType extends EnumArgumentType { +public class DirectionArgumentType extends StringRepresentableArgument { private static final DirectionArgumentType INSTANCE = new DirectionArgumentType(); private DirectionArgumentType() { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java index 948447377d..bb3f89dabf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FakePlayerArgumentType.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import static net.minecraft.command.CommandSource.suggestMatching; +import static net.minecraft.commands.SharedSuggestionProvider.suggest; public class FakePlayerArgumentType implements ArgumentType { private static final FakePlayerArgumentType INSTANCE = new FakePlayerArgumentType(); @@ -32,7 +32,8 @@ public static FakePlayerEntity get(CommandContext context) { return FakePlayerManager.get(context.getArgument("fp", String.class)); } - private FakePlayerArgumentType() {} + private FakePlayerArgumentType() { + } @Override public String parse(StringReader reader) throws CommandSyntaxException { @@ -41,7 +42,7 @@ public String parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return suggestMatching(FakePlayerManager.stream().map(fakePlayerEntity -> fakePlayerEntity.getName().getString()), builder); + return suggest(FakePlayerManager.stream().map(fakePlayerEntity -> fakePlayerEntity.getName().getString()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java index e236bdf789..fe00731dae 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/FriendArgumentType.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import static net.minecraft.command.CommandSource.suggestMatching; +import static net.minecraft.commands.SharedSuggestionProvider.suggest; public class FriendArgumentType implements ArgumentType { private static final FriendArgumentType INSTANCE = new FriendArgumentType(); @@ -33,7 +33,8 @@ public static Friend get(CommandContext context) { return Friends.get().get(context.getArgument("friend", String.class)); } - private FriendArgumentType() {} + private FriendArgumentType() { + } @Override public String parse(StringReader reader) throws CommandSyntaxException { @@ -42,7 +43,7 @@ public String parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return suggestMatching(Streams.stream(Friends.get()).map(Friend::getName), builder); + return suggest(Streams.stream(Friends.get()).map(Friend::getName), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java index 65201f4c16..de78084cd9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/MacroArgumentType.java @@ -14,8 +14,8 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.systems.macros.Macro; import meteordevelopment.meteorclient.systems.macros.Macros; -import net.minecraft.command.CommandSource; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; import java.util.Collection; import java.util.concurrent.CompletableFuture; @@ -23,7 +23,7 @@ public class MacroArgumentType implements ArgumentType { private static final MacroArgumentType INSTANCE = new MacroArgumentType(); - private static final DynamicCommandExceptionType NO_SUCH_MACRO = new DynamicCommandExceptionType(name -> Text.literal("Macro with name " + name + " doesn't exist.")); + private static final DynamicCommandExceptionType NO_SUCH_MACRO = new DynamicCommandExceptionType(name -> Component.literal("Macro with name " + name + " doesn't exist.")); public static MacroArgumentType create() { return INSTANCE; @@ -33,7 +33,8 @@ public static Macro get(CommandContext context) { return context.getArgument("macro", Macro.class); } - private MacroArgumentType() {} + private MacroArgumentType() { + } @Override public Macro parse(StringReader reader) throws CommandSyntaxException { @@ -46,7 +47,7 @@ public Macro parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestMatching(Macros.get().getAll().stream().map(macro -> { + return SharedSuggestionProvider.suggest(Macros.get().getAll().stream().map(macro -> { String name = macro.name.get(); if (name.contains(" ")) { name = "\"" + name.replace("\"", "\\\"") + "\""; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java index 727cedcdcc..f996bbd770 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ModuleArgumentType.java @@ -14,8 +14,8 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import net.minecraft.command.CommandSource; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; import java.util.Collection; import java.util.concurrent.CompletableFuture; @@ -23,13 +23,13 @@ public class ModuleArgumentType implements ArgumentType { private static final ModuleArgumentType INSTANCE = new ModuleArgumentType(); - private static final DynamicCommandExceptionType NO_SUCH_MODULE = new DynamicCommandExceptionType(name -> Text.literal("Module with name " + name + " doesn't exist.")); + private static final DynamicCommandExceptionType NO_SUCH_MODULE = new DynamicCommandExceptionType(name -> Component.literal("Module with name " + name + " doesn't exist.")); private static final Collection EXAMPLES = Modules.get().getAll() - .stream() - .limit(3) - .map(module -> module.name) - .collect(Collectors.toList()); + .stream() + .limit(3) + .map(module -> module.name) + .collect(Collectors.toList()); public static ModuleArgumentType create() { return INSTANCE; @@ -39,7 +39,8 @@ public static Module get(CommandContext context) { return context.getArgument("module", Module.class); } - private ModuleArgumentType() {} + private ModuleArgumentType() { + } @Override public Module parse(StringReader reader) throws CommandSyntaxException { @@ -52,7 +53,7 @@ public Module parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestMatching(Modules.get().getAll().stream().map(module -> module.name), builder); + return SharedSuggestionProvider.suggest(Modules.get().getAll().stream().map(module -> module.name), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java index 370689917c..a4b81a2315 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/NotebotSongArgumentType.java @@ -13,7 +13,7 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.notebot.decoder.SongDecoders; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; import java.io.IOException; import java.nio.file.Files; @@ -27,7 +27,8 @@ public static NotebotSongArgumentType create() { return INSTANCE; } - private NotebotSongArgumentType() {} + private NotebotSongArgumentType() { + } @Override public Path parse(StringReader reader) throws CommandSyntaxException { @@ -39,7 +40,7 @@ public Path parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { try (var suggestions = Files.list(MeteorClient.FOLDER.toPath().resolve("notebot"))) { - return CommandSource.suggestMatching(suggestions + return SharedSuggestionProvider.suggest(suggestions .filter(SongDecoders::hasDecoder) .map(path -> path.getFileName().toString()), builder diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java index d579ac27bc..5be8abdc51 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerArgumentType.java @@ -12,9 +12,9 @@ import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.command.CommandSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; import java.util.Collection; import java.util.List; @@ -22,9 +22,9 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -public class PlayerArgumentType implements ArgumentType { +public class PlayerArgumentType implements ArgumentType { private static final PlayerArgumentType INSTANCE = new PlayerArgumentType(); - private static final DynamicCommandExceptionType NO_SUCH_PLAYER = new DynamicCommandExceptionType(name -> Text.literal("Player with name " + name + " doesn't exist.")); + private static final DynamicCommandExceptionType NO_SUCH_PLAYER = new DynamicCommandExceptionType(name -> Component.literal("Player with name " + name + " doesn't exist.")); private static final Collection EXAMPLES = List.of("seasnail8169", "MineGame159"); @@ -32,18 +32,19 @@ public static PlayerArgumentType create() { return INSTANCE; } - public static PlayerEntity get(CommandContext context) { - return context.getArgument("player", PlayerEntity.class); + public static Player get(CommandContext context) { + return context.getArgument("player", Player.class); } - private PlayerArgumentType() {} + private PlayerArgumentType() { + } @Override - public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { + public Player parse(StringReader reader) throws CommandSyntaxException { String argument = reader.readString(); - PlayerEntity playerEntity = null; + Player playerEntity = null; - for (PlayerEntity p : mc.world.getPlayers()) { + for (Player p : mc.level.players()) { if (p.getName().getString().equalsIgnoreCase(argument)) { playerEntity = p; break; @@ -56,7 +57,7 @@ public PlayerEntity parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestMatching(mc.world.getPlayers().stream().map(abstractClientPlayerEntity -> abstractClientPlayerEntity.getName().getString()), builder); + return SharedSuggestionProvider.suggest(mc.level.players().stream().map(abstractClientPlayerEntity -> abstractClientPlayerEntity.getName().getString()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java index 8d195da02b..cba3122ad8 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/PlayerListEntryArgumentType.java @@ -12,9 +12,9 @@ import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.command.CommandSource; -import net.minecraft.text.Text; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; import java.util.Collection; import java.util.List; @@ -22,9 +22,9 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -public class PlayerListEntryArgumentType implements ArgumentType { +public class PlayerListEntryArgumentType implements ArgumentType { private static final PlayerListEntryArgumentType INSTANCE = new PlayerListEntryArgumentType(); - private static final DynamicCommandExceptionType NO_SUCH_PLAYER = new DynamicCommandExceptionType(name -> Text.literal("Player list entry with name " + name + " doesn't exist.")); + private static final DynamicCommandExceptionType NO_SUCH_PLAYER = new DynamicCommandExceptionType(name -> Component.literal("Player list entry with name " + name + " doesn't exist.")); private static final Collection EXAMPLES = List.of("seasnail8169", "MineGame159"); @@ -32,18 +32,19 @@ public static PlayerListEntryArgumentType create() { return INSTANCE; } - public static PlayerListEntry get(CommandContext context) { - return context.getArgument("player", PlayerListEntry.class); + public static PlayerInfo get(CommandContext context) { + return context.getArgument("player", PlayerInfo.class); } - private PlayerListEntryArgumentType() {} + private PlayerListEntryArgumentType() { + } @Override - public PlayerListEntry parse(StringReader reader) throws CommandSyntaxException { + public PlayerInfo parse(StringReader reader) throws CommandSyntaxException { String argument = reader.readString(); - PlayerListEntry playerListEntry = null; + PlayerInfo playerListEntry = null; - for (PlayerListEntry p : mc.getNetworkHandler().getPlayerList()) { + for (PlayerInfo p : mc.getConnection().getOnlinePlayers()) { if (p.getProfile().name().equalsIgnoreCase(argument)) { playerListEntry = p; break; @@ -56,7 +57,7 @@ public PlayerListEntry parse(StringReader reader) throws CommandSyntaxException @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestMatching(mc.getNetworkHandler().getPlayerList().stream().map(playerListEntry -> playerListEntry.getProfile().name()), builder); + return SharedSuggestionProvider.suggest(mc.getConnection().getOnlinePlayers().stream().map(playerListEntry -> playerListEntry.getProfile().name()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java index 56fb09e8dd..17da8aabf4 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/ProfileArgumentType.java @@ -15,17 +15,17 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.systems.profiles.Profile; import meteordevelopment.meteorclient.systems.profiles.Profiles; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; -import static net.minecraft.command.CommandSource.suggestMatching; +import static net.minecraft.commands.SharedSuggestionProvider.suggest; public class ProfileArgumentType implements ArgumentType { private static final ProfileArgumentType INSTANCE = new ProfileArgumentType(); - private static final DynamicCommandExceptionType NO_SUCH_PROFILE = new DynamicCommandExceptionType(name -> Text.literal("Profile with name " + name + " doesn't exist.")); + private static final DynamicCommandExceptionType NO_SUCH_PROFILE = new DynamicCommandExceptionType(name -> Component.literal("Profile with name " + name + " doesn't exist.")); private static final Collection EXAMPLES = List.of("pvp.meteorclient.com", "anarchy"); @@ -37,7 +37,8 @@ public static Profile get(CommandContext context) { return Profiles.get().get(context.getArgument("profile", String.class)); } - private ProfileArgumentType() {} + private ProfileArgumentType() { + } @Override public String parse(StringReader reader) throws CommandSyntaxException { @@ -50,7 +51,7 @@ public String parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return suggestMatching(Streams.stream(Profiles.get()).map(profile -> profile.name.get()), builder); + return suggest(Streams.stream(Profiles.get()).map(profile -> profile.name.get()), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/RegistryEntryReferenceArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/RegistryEntryReferenceArgumentType.java index ac740f28ce..37f2a9b4e0 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/RegistryEntryReferenceArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/RegistryEntryReferenceArgumentType.java @@ -13,41 +13,41 @@ import com.mojang.brigadier.exceptions.Dynamic3CommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.client.MinecraftClient; -import net.minecraft.command.CommandSource; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.world.gen.structure.Structure; +import net.minecraft.client.Minecraft; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.levelgen.structure.Structure; import java.util.Arrays; import java.util.Collection; import java.util.concurrent.CompletableFuture; -public class RegistryEntryReferenceArgumentType implements ArgumentType> { - private static final RegistryEntryReferenceArgumentType ENCHANTMENT = new RegistryEntryReferenceArgumentType<>(RegistryKeys.ENCHANTMENT); - private static final RegistryEntryReferenceArgumentType ENTITY_ATTRIBUTE = new RegistryEntryReferenceArgumentType<>(RegistryKeys.ATTRIBUTE); - private static final RegistryEntryReferenceArgumentType STRUCTURE = new RegistryEntryReferenceArgumentType<>(RegistryKeys.STRUCTURE); - private static final RegistryEntryReferenceArgumentType> ENTITY_TYPE = new RegistryEntryReferenceArgumentType<>(RegistryKeys.ENTITY_TYPE); - private static final RegistryEntryReferenceArgumentType STATUS_EFFECT = new RegistryEntryReferenceArgumentType<>(RegistryKeys.STATUS_EFFECT); +public class RegistryEntryReferenceArgumentType implements ArgumentType> { + private static final RegistryEntryReferenceArgumentType ENCHANTMENT = new RegistryEntryReferenceArgumentType<>(Registries.ENCHANTMENT); + private static final RegistryEntryReferenceArgumentType ENTITY_ATTRIBUTE = new RegistryEntryReferenceArgumentType<>(Registries.ATTRIBUTE); + private static final RegistryEntryReferenceArgumentType STRUCTURE = new RegistryEntryReferenceArgumentType<>(Registries.STRUCTURE); + private static final RegistryEntryReferenceArgumentType> ENTITY_TYPE = new RegistryEntryReferenceArgumentType<>(Registries.ENTITY_TYPE); + private static final RegistryEntryReferenceArgumentType MOB_EFFECT = new RegistryEntryReferenceArgumentType<>(Registries.MOB_EFFECT); private static final Collection EXAMPLES = Arrays.asList("foo", "foo:bar", "012"); public static final Dynamic2CommandExceptionType NOT_FOUND_EXCEPTION = new Dynamic2CommandExceptionType( - (element, type) -> Text.stringifiedTranslatable("argument.resource.not_found", element, type) + (element, type) -> Component.translatableEscape("argument.resource.not_found", element, type) ); public static final Dynamic3CommandExceptionType INVALID_TYPE_EXCEPTION = new Dynamic3CommandExceptionType( - (element, type, expectedType) -> Text.stringifiedTranslatable("argument.resource.invalid_type", element, type, expectedType) + (element, type, expectedType) -> Component.translatableEscape("argument.resource.invalid_type", element, type, expectedType) ); - private final RegistryKey> registryRef; + private final ResourceKey> registryRef; - private RegistryEntryReferenceArgumentType(RegistryKey> registryRef) { + private RegistryEntryReferenceArgumentType(ResourceKey> registryRef) { this.registryRef = registryRef; } @@ -55,7 +55,7 @@ public static RegistryEntryReferenceArgumentType enchantment() { return ENCHANTMENT; } - public static RegistryEntryReferenceArgumentType entityAttribute() { + public static RegistryEntryReferenceArgumentType entityAttribute() { return ENTITY_ATTRIBUTE; } @@ -67,54 +67,54 @@ public static RegistryEntryReferenceArgumentType> entityType() { return ENTITY_TYPE; } - public static RegistryEntryReferenceArgumentType statusEffect() { - return STATUS_EFFECT; + public static RegistryEntryReferenceArgumentType statusEffect() { + return MOB_EFFECT; } - public static RegistryEntry.Reference getEnchantment(CommandContext context, String name) throws CommandSyntaxException { - return getRegistryEntry(context, name, RegistryKeys.ENCHANTMENT); + public static Holder.Reference getEnchantment(CommandContext context, String name) throws CommandSyntaxException { + return getRegistryEntry(context, name, Registries.ENCHANTMENT); } - public static RegistryEntry.Reference getEntityAttribute(CommandContext context, String name) throws CommandSyntaxException { - return getRegistryEntry(context, name, RegistryKeys.ATTRIBUTE); + public static Holder.Reference getEntityAttribute(CommandContext context, String name) throws CommandSyntaxException { + return getRegistryEntry(context, name, Registries.ATTRIBUTE); } - public static RegistryEntry.Reference getStructure(CommandContext context, String name) throws CommandSyntaxException { - return getRegistryEntry(context, name, RegistryKeys.STRUCTURE); + public static Holder.Reference getStructure(CommandContext context, String name) throws CommandSyntaxException { + return getRegistryEntry(context, name, Registries.STRUCTURE); } - public static RegistryEntry.Reference> getEntityType(CommandContext context, String name) throws CommandSyntaxException { - return getRegistryEntry(context, name, RegistryKeys.ENTITY_TYPE); + public static Holder.Reference> getEntityType(CommandContext context, String name) throws CommandSyntaxException { + return getRegistryEntry(context, name, Registries.ENTITY_TYPE); } - public static RegistryEntry.Reference getStatusEffect(CommandContext context, String name) throws CommandSyntaxException { - return getRegistryEntry(context, name, RegistryKeys.STATUS_EFFECT); + public static Holder.Reference getStatusEffect(CommandContext context, String name) throws CommandSyntaxException { + return getRegistryEntry(context, name, Registries.MOB_EFFECT); } @SuppressWarnings("unchecked") - private static RegistryEntry.Reference getRegistryEntry(CommandContext context, String name, RegistryKey> registryRef) throws CommandSyntaxException { - RegistryEntry.Reference reference = context.getArgument(name, RegistryEntry.Reference.class); - RegistryKey registryKey = reference.registryKey(); - if (registryKey.isOf(registryRef)) { + private static Holder.Reference getRegistryEntry(CommandContext context, String name, ResourceKey> registryRef) throws CommandSyntaxException { + Holder.Reference reference = context.getArgument(name, Holder.Reference.class); + ResourceKey registryKey = reference.key(); + if (registryKey.isFor(registryRef)) { return reference; } else { - throw INVALID_TYPE_EXCEPTION.create(registryKey.getValue(), registryKey.getRegistry(), registryRef.getValue()); + throw INVALID_TYPE_EXCEPTION.create(registryKey.identifier(), registryKey.registry(), registryRef.identifier()); } } @Override - public RegistryEntry.Reference parse(StringReader reader) throws CommandSyntaxException { - Identifier identifier = Identifier.fromCommandInput(reader); - RegistryKey registryKey = RegistryKey.of(this.registryRef, identifier); - return MinecraftClient.getInstance().getNetworkHandler().getRegistryManager() - .getOrThrow(this.registryRef) - .getOptional(registryKey) - .orElseThrow(() -> NOT_FOUND_EXCEPTION.createWithContext(reader, identifier, this.registryRef.getValue())); + public Holder.Reference parse(StringReader reader) throws CommandSyntaxException { + Identifier identifier = Identifier.read(reader); + ResourceKey registryKey = ResourceKey.create(this.registryRef, identifier); + return Minecraft.getInstance().getConnection().registryAccess() + .lookupOrThrow(this.registryRef) + .get(registryKey) + .orElseThrow(() -> NOT_FOUND_EXCEPTION.createWithContext(reader, identifier, this.registryRef.identifier())); } @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestIdentifiers(MinecraftClient.getInstance().getNetworkHandler().getRegistryManager().getOrThrow(this.registryRef).streamKeys().map(RegistryKey::getValue), builder); + return SharedSuggestionProvider.suggestResource(Minecraft.getInstance().getConnection().registryAccess().lookupOrThrow(this.registryRef).listElementIds().map(ResourceKey::identifier), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java index 0fe0724062..8b67c9f64c 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingArgumentType.java @@ -16,15 +16,15 @@ import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.Settings; import meteordevelopment.meteorclient.systems.modules.Module; -import net.minecraft.command.CommandSource; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; public class SettingArgumentType implements ArgumentType { private static final SettingArgumentType INSTANCE = new SettingArgumentType(); - private static final DynamicCommandExceptionType NO_SUCH_SETTING = new DynamicCommandExceptionType(name -> Text.literal("No such setting '" + name + "'.")); + private static final DynamicCommandExceptionType NO_SUCH_SETTING = new DynamicCommandExceptionType(name -> Component.literal("No such setting '" + name + "'.")); public static SettingArgumentType create() { return INSTANCE; @@ -45,7 +45,8 @@ public static Setting get(CommandContext context, Settings settings) throw return setting; } - private SettingArgumentType() {} + private SettingArgumentType() { + } @Override public String parse(StringReader reader) throws CommandSyntaxException { @@ -62,6 +63,6 @@ public static CompletableFuture listSuggestions(SuggestionsBuilder .flatMap(sg -> Streams.stream(sg.iterator())) .map(setting -> setting.name); - return CommandSource.suggestMatching(stream, builder); + return SharedSuggestionProvider.suggest(stream, builder); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java index 1ab864e0fc..c15aabe158 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/SettingValueArgumentType.java @@ -13,8 +13,8 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.Settings; -import net.minecraft.command.CommandSource; -import net.minecraft.util.Identifier; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.resources.Identifier; import org.jetbrains.annotations.NotNull; import java.util.concurrent.CompletableFuture; @@ -30,7 +30,8 @@ public static String get(CommandContext context) { return context.getArgument("value", String.class); } - private SettingValueArgumentType() {} + private SettingValueArgumentType() { + } @Override public String parse(StringReader reader) throws CommandSyntaxException { @@ -45,7 +46,7 @@ public CompletableFuture listSuggestions(CommandContext cont try { setting = SettingArgumentType.get(context); - } catch (CommandSyntaxException ignored) { + } catch (CommandSyntaxException _) { return Suggestions.empty(); } @@ -57,7 +58,7 @@ public static CompletableFuture listSuggestions(CommandContext< try { setting = SettingArgumentType.get(context, settings); - } catch (CommandSyntaxException ignored) { + } catch (CommandSyntaxException _) { return Suggestions.empty(); } @@ -67,9 +68,9 @@ public static CompletableFuture listSuggestions(CommandContext< public static CompletableFuture suggest(SuggestionsBuilder builder, @NotNull Setting setting) { Iterable identifiers = setting.getIdentifierSuggestions(); if (identifiers != null) { - return CommandSource.suggestIdentifiers(identifiers, builder); + return SharedSuggestionProvider.suggestResource(identifiers, builder); } - return CommandSource.suggestMatching(setting.getSuggestions(), builder); + return SharedSuggestionProvider.suggest(setting.getSuggestions(), builder); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java b/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java index ee5d2cbce5..958faebf0a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/arguments/WaypointArgumentType.java @@ -14,8 +14,8 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import meteordevelopment.meteorclient.systems.waypoints.Waypoint; import meteordevelopment.meteorclient.systems.waypoints.Waypoints; -import net.minecraft.command.CommandSource; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; import java.util.ArrayList; import java.util.Collection; @@ -25,7 +25,7 @@ public class WaypointArgumentType implements ArgumentType { private static final WaypointArgumentType GREEDY = new WaypointArgumentType(true); private static final WaypointArgumentType QUOTED = new WaypointArgumentType(false); - private static final DynamicCommandExceptionType NO_SUCH_WAYPOINT = new DynamicCommandExceptionType(name -> Text.literal("Waypoint with name '" + name + "' doesn't exist.")); + private static final DynamicCommandExceptionType NO_SUCH_WAYPOINT = new DynamicCommandExceptionType(name -> Component.literal("Waypoint with name '" + name + "' doesn't exist.")); private final boolean greedyString; private WaypointArgumentType(boolean greedyString) { @@ -62,7 +62,7 @@ public String parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return CommandSource.suggestMatching(getExamples(), builder); + return SharedSuggestionProvider.suggest(getExamples(), builder); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java index 3ef50aa80d..84b51a61d2 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindCommand.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.commands.arguments.ModuleArgumentType; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; public class BindCommand extends Command { public BindCommand() { @@ -18,7 +18,7 @@ public BindCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); Modules.get().setModuleToBind(module); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java index 0bc90a5ea4..063fbba4a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/BindsCommand.java @@ -11,11 +11,11 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; import java.util.List; @@ -25,7 +25,7 @@ public BindsCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { // Modules List modules = Modules.get().getAll().stream() @@ -37,16 +37,16 @@ public void build(LiteralArgumentBuilder builder) { for (Module module : modules) { HoverEvent hoverEvent = new HoverEvent.ShowText(getTooltip(module)); - MutableText text = Text.literal(module.title).formatted(Formatting.WHITE); + MutableComponent text = Component.literal(module.title).withStyle(ChatFormatting.WHITE); text.setStyle(text.getStyle().withHoverEvent(hoverEvent)); - MutableText sep = Text.literal(" - "); + MutableComponent sep = Component.literal(" - "); sep.setStyle(sep.getStyle().withHoverEvent(hoverEvent)); - text.append(sep.formatted(Formatting.GRAY)); + text.append(sep.withStyle(ChatFormatting.GRAY)); - MutableText key = Text.literal(module.keybind.toString()); + MutableComponent key = Component.literal(module.keybind.toString()); key.setStyle(key.getStyle().withHoverEvent(hoverEvent)); - text.append(key.formatted(Formatting.GRAY)); + text.append(key.withStyle(ChatFormatting.GRAY)); ChatUtils.sendMsg(text); } @@ -55,9 +55,9 @@ public void build(LiteralArgumentBuilder builder) { }); } - private MutableText getTooltip(Module module) { - MutableText tooltip = Text.literal(Utils.nameToTitle(module.title)).formatted(Formatting.BLUE, Formatting.BOLD).append("\n\n"); - tooltip.append(Text.literal(module.description).formatted(Formatting.WHITE)); + private MutableComponent getTooltip(Module module) { + MutableComponent tooltip = Component.literal(Utils.nameToTitle(module.title)).withStyle(ChatFormatting.BLUE, ChatFormatting.BOLD).append("\n\n"); + tooltip.append(Component.literal(module.description).withStyle(ChatFormatting.WHITE)); return tooltip; } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java index e35078c472..381116bdb9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/CommandsCommand.java @@ -11,12 +11,12 @@ import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; public class CommandsCommand extends Command { public CommandsCommand() { @@ -24,11 +24,11 @@ public CommandsCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { ChatUtils.info("--- Commands ((highlight)%d(default)) ---", Commands.COMMANDS.size()); - MutableText commands = Text.literal(""); + MutableComponent commands = Component.literal(""); Commands.COMMANDS.forEach(command -> commands.append(getCommandText(command))); ChatUtils.sendMsg(commands); @@ -36,13 +36,13 @@ public void build(LiteralArgumentBuilder builder) { }); } - private MutableText getCommandText(Command command) { + private MutableComponent getCommandText(Command command) { // Hover tooltip - MutableText tooltip = Text.literal(""); + MutableComponent tooltip = Component.literal(""); - tooltip.append(Text.literal(Utils.nameToTitle(command.getName())).formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); + tooltip.append(Component.literal(Utils.nameToTitle(command.getName())).withStyle(ChatFormatting.BLUE, ChatFormatting.BOLD)).append("\n"); - MutableText aliases = Text.literal(Config.get().prefix.get() + command.getName()); + MutableComponent aliases = Component.literal(Config.get().prefix.get() + command.getName()); if (!command.getAliases().isEmpty()) { aliases.append(", "); for (String alias : command.getAliases()) { @@ -51,14 +51,14 @@ private MutableText getCommandText(Command command) { if (!alias.equals(command.getAliases().getLast())) aliases.append(", "); } } - tooltip.append(aliases.formatted(Formatting.GRAY)).append("\n\n"); + tooltip.append(aliases.withStyle(ChatFormatting.GRAY)).append("\n\n"); - tooltip.append(Text.literal(command.getDescription()).formatted(Formatting.WHITE)); + tooltip.append(Component.literal(command.getDescription()).withStyle(ChatFormatting.WHITE)); // Text - MutableText text = Text.literal(Utils.nameToTitle(command.getName())); + MutableComponent text = Component.literal(Utils.nameToTitle(command.getName())); if (command != Commands.COMMANDS.getLast()) - text.append(Text.literal(", ").formatted(Formatting.GRAY)); + text.append(Component.literal(", ").withStyle(ChatFormatting.GRAY)); text.setStyle(text .getStyle() .withHoverEvent(new HoverEvent.ShowText(tooltip)) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java index 973c10bb0c..2677101ad9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DamageCommand.java @@ -12,20 +12,20 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoFall; import meteordevelopment.meteorclient.systems.modules.player.AntiHunger; -import net.minecraft.command.CommandSource; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; -import net.minecraft.text.Text; -import net.minecraft.util.math.Vec3d; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; +import net.minecraft.world.phys.Vec3; public class DamageCommand extends Command { - private final static SimpleCommandExceptionType INVULNERABLE = new SimpleCommandExceptionType(Text.literal("You are invulnerable.")); + private final static SimpleCommandExceptionType INVULNERABLE = new SimpleCommandExceptionType(Component.literal("You are invulnerable.")); public DamageCommand() { super("damage", "Damages self", "dmg"); } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("damage", IntegerArgumentType.integer(1, 7)).executes(context -> { int amount = IntegerArgumentType.getInteger(context, "damage"); @@ -46,9 +46,9 @@ private void damagePlayer(int amount) { boolean antiHunger = Modules.get().isActive(AntiHunger.class); if (antiHunger) Modules.get().get(AntiHunger.class).toggle(); - Vec3d pos = mc.player.getEntityPos(); + Vec3 pos = mc.player.position(); - for(int i = 0; i < 80; i++) { + for (int i = 0; i < 80; i++) { sendPositionPacket(pos.x, pos.y + amount + 2.1, pos.z, false); sendPositionPacket(pos.x, pos.y + 0.05, pos.z, false); } @@ -60,6 +60,6 @@ private void damagePlayer(int amount) { } private void sendPositionPacket(double x, double y, double z, boolean onGround) { - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(x, y, z, onGround, mc.player.horizontalCollision)); + mc.player.connection.send(new ServerboundMovePlayerPacket.Pos(x, y, z, onGround, mc.player.horizontalCollision)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java index f43585276a..5116578127 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DisconnectCommand.java @@ -8,10 +8,10 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.command.CommandSource; -import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.common.ClientboundDisconnectPacket; public class DisconnectCommand extends Command { public DisconnectCommand() { @@ -19,14 +19,14 @@ public DisconnectCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal("%s[%sDisconnectCommand%s] Disconnected by user.".formatted(Formatting.GRAY, Formatting.BLUE, Formatting.GRAY)))); + mc.player.connection.handleDisconnect(new ClientboundDisconnectPacket(Component.literal("%s[%sDisconnectCommand%s] Disconnected by user.".formatted(ChatFormatting.GRAY, ChatFormatting.BLUE, ChatFormatting.GRAY)))); return SINGLE_SUCCESS; }); builder.then(argument("reason", StringArgumentType.greedyString()).executes(context -> { - mc.player.networkHandler.onDisconnect(new DisconnectS2CPacket(Text.literal(StringArgumentType.getString(context, "reason")))); + mc.player.connection.handleDisconnect(new ClientboundDisconnectPacket(Component.literal(StringArgumentType.getString(context, "reason")))); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java index 1cbdfb84cd..3b18ef4e76 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DismountCommand.java @@ -7,9 +7,9 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.command.CommandSource; -import net.minecraft.network.packet.c2s.play.PlayerInputC2SPacket; -import net.minecraft.util.PlayerInput; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.protocol.game.ServerboundPlayerInputPacket; +import net.minecraft.world.entity.player.Input; public class DismountCommand extends Command { public DismountCommand() { @@ -17,10 +17,10 @@ public DismountCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - PlayerInput sneak = new PlayerInput(false, false, false, false, false, true, false); - mc.getNetworkHandler().sendPacket(new PlayerInputC2SPacket(sneak)); + Input sneak = new Input(false, false, false, false, false, true, false); + mc.getConnection().send(new ServerboundPlayerInputPacket(sneak)); return SINGLE_SUCCESS; }); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java index 4816bedd09..3a19126134 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/DropCommand.java @@ -12,27 +12,27 @@ import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.player.InvUtils; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.ItemStackArgumentType; -import net.minecraft.component.type.AttributeModifierSlot; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.text.Text; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.arguments.item.ItemArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; public class DropCommand extends Command { - private static final SimpleCommandExceptionType NOT_SPECTATOR = new SimpleCommandExceptionType(Text.literal("Can't drop items while in spectator.")); - private static final SimpleCommandExceptionType NO_SUCH_ITEM = new SimpleCommandExceptionType(Text.literal("Could not find an item with that name!")); + private static final SimpleCommandExceptionType NOT_SPECTATOR = new SimpleCommandExceptionType(Component.literal("Can't drop items while in spectator.")); + private static final SimpleCommandExceptionType NO_SUCH_ITEM = new SimpleCommandExceptionType(Component.literal("Could not find an item with that name!")); public DropCommand() { super("drop", "Automatically drops specified items."); } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { // Main Hand - builder.then(literal("hand").executes(context -> drop(player -> player.dropSelectedItem(true)))); + builder.then(literal("hand").executes(context -> drop(player -> player.drop(true)))); // Offhand builder.then(literal("offhand").executes(context -> drop(player -> InvUtils.drop().slotOffhand()))); @@ -53,23 +53,23 @@ public void build(LiteralArgumentBuilder builder) { // Hotbar and main inv builder.then(literal("all").executes(context -> drop(player -> { - for (int i = 0; i < player.getInventory().size(); i++) { + for (int i = 0; i < player.getInventory().getContainerSize(); i++) { InvUtils.drop().slot(i); } - if (!mc.player.getOffHandStack().isEmpty()) InvUtils.drop().slotOffhand(); + if (!mc.player.getOffhandItem().isEmpty()) InvUtils.drop().slotOffhand(); }))); // Armor builder.then(literal("armor").executes(context -> drop(player -> { - for (EquipmentSlot equipmentSlot : AttributeModifierSlot.ARMOR) { + for (EquipmentSlot equipmentSlot : EquipmentSlotGroup.ARMOR) { if (equipmentSlot.getType() == EquipmentSlot.Type.HUMANOID_ARMOR) { - InvUtils.drop().slotArmor(equipmentSlot.getEntitySlotId()); + InvUtils.drop().slotArmor(equipmentSlot.getIndex()); } } }))); // Specific item - builder.then(argument("item", ItemStackArgumentType.itemStack(REGISTRY_ACCESS)) + builder.then(argument("item", ItemArgument.item(REGISTRY_ACCESS)) .executes(context -> drop(player -> { dropItem(player, context, Integer.MAX_VALUE); })) @@ -81,12 +81,12 @@ public void build(LiteralArgumentBuilder builder) { ); } - private void dropItem(ClientPlayerEntity player, CommandContext context, int amount) throws CommandSyntaxException { - ItemStack stack = ItemStackArgumentType.getItemStackArgument(context, "item").createStack(1, false); + 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(); - for (int i = 0; i < player.getInventory().size() && amount > 0; i++) { - ItemStack invStack = player.getInventory().getStack(i); + for (int i = 0; i < player.getInventory().getContainerSize() && amount > 0; i++) { + ItemStack invStack = player.getInventory().getItem(i); if (invStack.isEmpty() || stack.getItem() != invStack.getItem()) continue; int dropCount = Math.min(amount, invStack.getCount()); @@ -112,6 +112,6 @@ private int drop(PlayerConsumer consumer) throws CommandSyntaxException { // Separate interface so exceptions can be thrown from it (which is not the case for Consumer) @FunctionalInterface private interface PlayerConsumer { - void accept(ClientPlayerEntity player) throws CommandSyntaxException; + void accept(LocalPlayer player) throws CommandSyntaxException; } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java index 7eb9e6b584..a03967e40a 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnchantCommand.java @@ -13,26 +13,26 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.RegistryEntryReferenceArgumentType; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.command.CommandSource; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; import java.util.function.ToIntFunction; public class EnchantCommand extends Command { - private static final SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(Text.literal("You must be in creative mode to use this.")); - private static final SimpleCommandExceptionType NOT_HOLDING_ITEM = new SimpleCommandExceptionType(Text.literal("You need to hold some item to enchant.")); + private static final SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(Component.literal("You must be in creative mode to use this.")); + private static final SimpleCommandExceptionType NOT_HOLDING_ITEM = new SimpleCommandExceptionType(Component.literal("You need to hold some item to enchant.")); public EnchantCommand() { super("enchant", "Enchants the item in your hand. REQUIRES Creative mode."); } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("one").then(argument("enchantment", RegistryEntryReferenceArgumentType.enchantment()) .then(literal("level").then(argument("level", IntegerArgumentType.integer()).executes(context -> { one(context, enchantment -> context.getArgument("level", Integer.class)); @@ -76,7 +76,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("remove").then(argument("enchantment", RegistryEntryReferenceArgumentType.enchantment()).executes(context -> { ItemStack itemStack = tryGetItemStack(); - RegistryEntry.Reference enchantment = RegistryEntryReferenceArgumentType.getEnchantment(context, "enchantment"); + Holder.Reference enchantment = RegistryEntryReferenceArgumentType.getEnchantment(context, "enchantment"); Utils.removeEnchantment(itemStack, enchantment.value()); syncItem(); @@ -84,10 +84,10 @@ public void build(LiteralArgumentBuilder builder) { }))); } - private void one(CommandContext context, ToIntFunction level) throws CommandSyntaxException { + private void one(CommandContext context, ToIntFunction level) throws CommandSyntaxException { ItemStack itemStack = tryGetItemStack(); - RegistryEntry.Reference enchantment = RegistryEntryReferenceArgumentType.getEnchantment(context, "enchantment"); + Holder.Reference enchantment = RegistryEntryReferenceArgumentType.getEnchantment(context, "enchantment"); Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment.value())); syncItem(); @@ -96,9 +96,9 @@ private void one(CommandContext context, ToIntFunction level) throws CommandSyntaxException { ItemStack itemStack = tryGetItemStack(); - mc.getNetworkHandler().getRegistryManager().getOptional(RegistryKeys.ENCHANTMENT).ifPresent(registry -> { - registry.streamEntries().forEach(enchantment -> { - if (!onlyPossible || enchantment.value().isAcceptableItem(itemStack)) { + mc.getConnection().registryAccess().lookup(Registries.ENCHANTMENT).ifPresent(registry -> { + registry.listElements().forEach(enchantment -> { + if (!onlyPossible || enchantment.value().isSupportedItem(itemStack)) { Utils.addEnchantment(itemStack, enchantment, level.applyAsInt(enchantment.value())); } }); @@ -122,8 +122,8 @@ private ItemStack tryGetItemStack() throws CommandSyntaxException { } private ItemStack getItemStack() { - ItemStack itemStack = mc.player.getMainHandStack(); - if (itemStack == null) itemStack = mc.player.getOffHandStack(); + ItemStack itemStack = mc.player.getMainHandItem(); + if (itemStack == null) itemStack = mc.player.getOffhandItem(); return itemStack.isEmpty() ? null : itemStack; } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java index 818bf8bb27..27ae4419d0 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/EnderChestCommand.java @@ -8,9 +8,9 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.command.CommandSource; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; public class EnderChestCommand extends Command { public EnderChestCommand() { @@ -18,9 +18,9 @@ public EnderChestCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - Utils.openContainer(Items.ENDER_CHEST.getDefaultStack(), new ItemStack[27], true); + Utils.openContainer(Items.ENDER_CHEST.getDefaultInstance(), new ItemStack[27], true); return SINGLE_SUCCESS; }); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java index 5374e1f503..dcf90dfea0 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FakePlayerCommand.java @@ -14,7 +14,7 @@ import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerManager; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; public class FakePlayerCommand extends Command { public FakePlayerCommand() { @@ -22,7 +22,7 @@ public FakePlayerCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("add") .executes(context -> { FakePlayer fakePlayer = Modules.get().get(FakePlayer.class); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java index dd612d030a..ad5aa514c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FovCommand.java @@ -8,8 +8,8 @@ import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import meteordevelopment.meteorclient.mixininterface.ISimpleOption; -import net.minecraft.command.CommandSource; +import meteordevelopment.meteorclient.mixininterface.IOptionInstance; +import net.minecraft.commands.SharedSuggestionProvider; public class FovCommand extends Command { public FovCommand() { @@ -17,9 +17,9 @@ public FovCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("fov", IntegerArgumentType.integer(1, 180)).executes(context -> { - ((ISimpleOption) (Object) mc.options.getFov()).meteor$set(context.getArgument("fov", Integer.class)); + ((IOptionInstance) (Object) mc.options.fov()).meteor$set(context.getArgument("fov", Integer.class)); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java index 23ae209cad..73b549b101 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/FriendsCommand.java @@ -13,8 +13,8 @@ import meteordevelopment.meteorclient.systems.friends.Friend; import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.util.Formatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.ChatFormatting; public class FriendsCommand extends Command { public FriendsCommand() { @@ -22,7 +22,7 @@ public FriendsCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("add") .then(argument("player", PlayerListEntryArgumentType.create()) .executes(context -> { @@ -30,9 +30,8 @@ public void build(LiteralArgumentBuilder builder) { Friend friend = new Friend(profile.name(), profile.id()); if (Friends.get().add(friend)) { - ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, "Added (highlight)%s (default)to friends.".formatted(friend.getName())); - } - else error("Already friends with that player."); + ChatUtils.sendMsg(friend.hashCode(), ChatFormatting.GRAY, "Added (highlight)%s (default)to friends.".formatted(friend.getName())); + } else error("Already friends with that player."); return SINGLE_SUCCESS; }) @@ -49,9 +48,8 @@ public void build(LiteralArgumentBuilder builder) { } if (Friends.get().remove(friend)) { - ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, "Removed (highlight)%s (default)from friends.".formatted(friend.getName())); - } - else error("Failed to remove that friend."); + ChatUtils.sendMsg(friend.hashCode(), ChatFormatting.GRAY, "Removed (highlight)%s (default)from friends.".formatted(friend.getName())); + } else error("Failed to remove that friend."); return SINGLE_SUCCESS; }) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java index 9033346af8..9f5c8ebab9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GamemodeCommand.java @@ -7,8 +7,8 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.command.CommandSource; -import net.minecraft.world.GameMode; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.world.level.GameType; public class GamemodeCommand extends Command { public GamemodeCommand() { @@ -16,10 +16,10 @@ public GamemodeCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { - for (GameMode gameMode : GameMode.values()) { - builder.then(literal(gameMode.getId()).executes(context -> { - mc.interactionManager.setGameMode(gameMode); + public void build(LiteralArgumentBuilder builder) { + for (GameType gameMode : GameType.values()) { + builder.then(literal(gameMode.getName()).executes(context -> { + mc.gameMode.setLocalMode(gameMode); return SINGLE_SUCCESS; })); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java index 94150a58b7..e8e0cddaca 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/GiveCommand.java @@ -12,33 +12,33 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.ItemStackArgumentType; -import net.minecraft.item.ItemStack; -import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.arguments.item.ItemArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ServerboundSetCreativeModeSlotPacket; +import net.minecraft.world.item.ItemStack; public class GiveCommand extends Command { - private final static SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(Text.literal("You must be in creative mode to use this.")); - private final static SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(Text.literal("No space in hotbar.")); + private static final SimpleCommandExceptionType NOT_IN_CREATIVE = new SimpleCommandExceptionType(Component.literal("You must be in creative mode to use this.")); + private static final SimpleCommandExceptionType NO_SPACE = new SimpleCommandExceptionType(Component.literal("No space in hotbar.")); public GiveCommand() { super("give", "Gives you any item."); } @Override - public void build(LiteralArgumentBuilder builder) { - builder.then(argument("item", ItemStackArgumentType.itemStack(REGISTRY_ACCESS)).executes(context -> { - if (!mc.player.getAbilities().creativeMode) throw NOT_IN_CREATIVE.create(); + public void build(LiteralArgumentBuilder builder) { + builder.then(argument("item", ItemArgument.item(REGISTRY_ACCESS)).executes(context -> { + if (!mc.player.getAbilities().instabuild) throw NOT_IN_CREATIVE.create(); - ItemStack item = ItemStackArgumentType.getItemStackArgument(context, "item").createStack(1, false); + ItemStack item = ItemArgument.getItem(context, "item").createItemStack(1); giveItem(item); return SINGLE_SUCCESS; }).then(argument("number", IntegerArgumentType.integer(1, 99)).executes(context -> { - if (!mc.player.getAbilities().creativeMode) throw NOT_IN_CREATIVE.create(); + if (!mc.player.getAbilities().instabuild) throw NOT_IN_CREATIVE.create(); - ItemStack item = ItemStackArgumentType.getItemStackArgument(context, "item").createStack(IntegerArgumentType.getInteger(context, "number"), true); + ItemStack item = ItemArgument.getItem(context, "item").createItemStack(IntegerArgumentType.getInteger(context, "number")); giveItem(item); return SINGLE_SUCCESS; @@ -49,7 +49,7 @@ private void giveItem(ItemStack item) throws CommandSyntaxException { FindItemResult fir = InvUtils.find(ItemStack::isEmpty, 0, 8); if (!fir.found()) throw NO_SPACE.create(); - mc.getNetworkHandler().sendPacket(new CreativeInventoryActionC2SPacket(36 + fir.slot(), item)); - mc.player.playerScreenHandler.getSlot(36 + fir.slot()).setStack(item); + mc.getConnection().send(new ServerboundSetCreativeModeSlotPacket(36 + fir.slot(), item)); + mc.player.inventoryMenu.getSlot(36 + fir.slot()).set(item); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java index 2af1daa8f3..8d963bf0d3 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/HClipCommand.java @@ -8,9 +8,9 @@ import com.mojang.brigadier.arguments.DoubleArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.command.CommandSource; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Vec3d; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; public class HClipCommand extends Command { public HClipCommand() { @@ -18,17 +18,17 @@ public HClipCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("blocks", DoubleArgumentType.doubleArg()).executes(context -> { double blocks = context.getArgument("blocks", Double.class); - Vec3d forward = Vec3d.fromPolar(0, mc.player.getYaw()).normalize(); + Vec3 forward = Vec3.directionFromRotation(0, mc.player.getYRot()).normalize(); - if (mc.player.hasVehicle()) { + if (mc.player.isPassenger()) { Entity vehicle = mc.player.getVehicle(); - vehicle.setPosition(vehicle.getX() + forward.x * blocks, vehicle.getY(), vehicle.getZ() + forward.z * blocks); + vehicle.setPos(vehicle.getX() + forward.x * blocks, vehicle.getY(), vehicle.getZ() + forward.z * blocks); } - mc.player.setPosition(mc.player.getX() + forward.x * blocks, mc.player.getY(), mc.player.getZ() + forward.z * blocks); + mc.player.setPos(mc.player.getX() + forward.x * blocks, mc.player.getY(), mc.player.getZ() + forward.z * blocks); return SINGLE_SUCCESS; })); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/HelpCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/HelpCommand.java index 6e68226c80..4d5360fc32 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/HelpCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/HelpCommand.java @@ -11,10 +11,10 @@ import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.commands.arguments.CommandArgumentType; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import java.util.Map; @@ -24,7 +24,7 @@ public HelpCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("command", CommandArgumentType.create()).executes(context -> { showHelp(CommandArgumentType.get(context)); return SINGLE_SUCCESS; @@ -37,38 +37,38 @@ public void build(LiteralArgumentBuilder builder) { } private void showHelp(Command cmd) { - MutableText msg = Text.literal(""); - msg.append(Text.literal("Help for ").formatted(Formatting.GRAY).append(Text.literal(cmd.getName()).formatted(Formatting.YELLOW))); - msg.append(Text.literal("\n ")).append(Text.literal("Description: ").formatted(Formatting.GRAY).append(Text.literal(cmd.getDescription()).formatted(Formatting.WHITE))); + MutableComponent msg = Component.literal(""); + msg.append(Component.literal("Help for ").withStyle(ChatFormatting.GRAY).append(Component.literal(cmd.getName()).withStyle(ChatFormatting.YELLOW))); + msg.append(Component.literal("\n ")).append(Component.literal("Description: ").withStyle(ChatFormatting.GRAY).append(Component.literal(cmd.getDescription()).withStyle(ChatFormatting.WHITE))); if (!cmd.getAliases().isEmpty()) { - msg.append(Text.literal("\n ")).append(Text.literal("Aliases: ").formatted(Formatting.GRAY)); - msg.append(Text.literal(String.join(", ", cmd.getAliases())).formatted(Formatting.AQUA)); + msg.append(Component.literal("\n ")).append(Component.literal("Aliases: ").withStyle(ChatFormatting.GRAY)); + msg.append(Component.literal(String.join(", ", cmd.getAliases())).withStyle(ChatFormatting.AQUA)); } msg.append(getUsageText(cmd)); ChatUtils.sendMsg(msg); } - private MutableText getUsageText(Command cmd) { - CommandSource source = mc.getNetworkHandler().getCommandSource(); - CommandNode root = Commands.DISPATCHER.getRoot(); - CommandNode node = root.getChild(cmd.getName()); + private MutableComponent getUsageText(Command cmd) { + SharedSuggestionProvider source = mc.getConnection().getSuggestionsProvider(); + CommandNode root = Commands.DISPATCHER.getRoot(); + CommandNode node = root.getChild(cmd.getName()); - MutableText usagesText = Text.literal(""); + MutableComponent usagesText = Component.literal(""); if (node != null) { - Map, String> usages = Commands.DISPATCHER.getSmartUsage(node, source); + Map, String> usages = Commands.DISPATCHER.getSmartUsage(node, source); for (String usage : usages.values()) { - usagesText.append(Text.literal("\n " + cmd + " ").formatted(Formatting.GREEN)).append(Text.literal(usage).formatted(Formatting.GREEN)); + usagesText.append(Component.literal("\n " + cmd + " ").withStyle(ChatFormatting.GREEN)).append(Component.literal(usage).withStyle(ChatFormatting.GREEN)); } } if (usagesText.getString().isEmpty()) { - usagesText.append(Text.literal("\n " + cmd).formatted(Formatting.GREEN)); + usagesText.append(Component.literal("\n " + cmd).withStyle(ChatFormatting.GREEN)); } - return Text.literal("\n Usage:").formatted(Formatting.GRAY).append(usagesText); + return Component.literal("\n Usage:").withStyle(ChatFormatting.GRAY).append(usagesText); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java index ae4fc9ad57..3ca864a0cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InputCommand.java @@ -11,11 +11,11 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.mixin.KeyBindingAccessor; +import meteordevelopment.meteorclient.mixin.KeyMappingAccessor; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.command.CommandSource; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.commands.SharedSuggestionProvider; import java.util.ArrayList; import java.util.List; @@ -23,21 +23,21 @@ public class InputCommand extends Command { private static final List activeHandlers = new ArrayList<>(); - private static final List> holdKeys = List.of( - new Pair<>(mc.options.forwardKey, "forwards"), - new Pair<>(mc.options.backKey, "backwards"), - new Pair<>(mc.options.leftKey, "left"), - new Pair<>(mc.options.rightKey, "right"), - new Pair<>(mc.options.jumpKey, "jump"), - new Pair<>(mc.options.sneakKey, "sneak"), - new Pair<>(mc.options.sprintKey, "sprint"), - new Pair<>(mc.options.useKey, "use"), - new Pair<>(mc.options.attackKey, "attack") + private static final List> holdKeys = List.of( + new Pair<>(mc.options.keyUp, "forwards"), + new Pair<>(mc.options.keyDown, "backwards"), + new Pair<>(mc.options.keyLeft, "left"), + new Pair<>(mc.options.keyRight, "right"), + new Pair<>(mc.options.keyJump, "jump"), + new Pair<>(mc.options.keyShift, "sneak"), + new Pair<>(mc.options.keySprint, "sprint"), + new Pair<>(mc.options.keyUse, "use"), + new Pair<>(mc.options.keyAttack, "attack") ); - private static final List> pressKeys = List.of( - new Pair<>(mc.options.swapHandsKey, "swap"), - new Pair<>(mc.options.dropKey, "drop") + private static final List> pressKeys = List.of( + new Pair<>(mc.options.keySwapOffhand, "swap"), + new Pair<>(mc.options.keyDrop, "drop") ); public InputCommand() { @@ -45,8 +45,8 @@ public InputCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { - for (Pair keyBinding : holdKeys) { + public void build(LiteralArgumentBuilder builder) { + for (Pair keyBinding : holdKeys) { builder.then(literal(keyBinding.getSecond()) .executes(context -> { activeHandlers.add(new KeypressHandler(keyBinding.getFirst(), 1)); @@ -61,7 +61,7 @@ public void build(LiteralArgumentBuilder builder) { ); } - for (Pair keyBinding : pressKeys) { + for (Pair keyBinding : pressKeys) { builder.then(literal(keyBinding.getSecond()) .executes(context -> { press(keyBinding.getFirst()); @@ -70,8 +70,8 @@ public void build(LiteralArgumentBuilder builder) { ); } - for (KeyBinding keyBinding : mc.options.hotbarKeys) { - builder.then(literal(keyBinding.getId().substring(4)) + for (KeyMapping keyBinding : mc.options.keyHotbarSlots) { + builder.then(literal(keyBinding.getName().substring(4)) .executes(context -> { press(keyBinding); return SINGLE_SUCCESS; @@ -95,7 +95,7 @@ public void build(LiteralArgumentBuilder builder) { info("Active keypress handlers: "); for (int i = 0; i < activeHandlers.size(); i++) { KeypressHandler handler = activeHandlers.get(i); - info("(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", i, I18n.translate(handler.key.getId()), handler.ticks, handler.totalTicks); + info("(highlight)%d(default) - (highlight)%s %d(default) ticks left out of (highlight)%d(default).", i, I18n.get(handler.key.getName()), handler.ticks, handler.totalTicks); } } return SINGLE_SUCCESS; @@ -113,17 +113,17 @@ public void build(LiteralArgumentBuilder builder) { }))); } - private static void press(KeyBinding keyBinding) { - KeyBindingAccessor accessor = (KeyBindingAccessor) keyBinding; - accessor.meteor$setTimesPressed(accessor.meteor$getTimesPressed() + 1); + private static void press(KeyMapping keyBinding) { + KeyMappingAccessor accessor = (KeyMappingAccessor) keyBinding; + accessor.meteor$setClickCount(accessor.meteor$getClickCount() + 1); } private static class KeypressHandler { - private final KeyBinding key; + private final KeyMapping key; private final int totalTicks; private int ticks; - public KeypressHandler(KeyBinding key, int ticks) { + public KeypressHandler(KeyMapping key, int ticks) { this.key = key; this.totalTicks = ticks; this.ticks = ticks; @@ -136,9 +136,9 @@ private void onTick(TickEvent.Post event) { if (ticks == totalTicks) press(key); if (ticks-- > 0) { - key.setPressed(true); + key.setDown(true); } else { - key.setPressed(false); + key.setDown(false); MeteorClient.EVENT_BUS.unsubscribe(this); activeHandlers.remove(this); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java index 8ef230967c..86c6dced15 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/InventoryCommand.java @@ -9,8 +9,8 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.command.CommandSource; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.commands.SharedSuggestionProvider; public class InventoryCommand extends Command { public InventoryCommand() { @@ -18,7 +18,7 @@ public InventoryCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("player", PlayerArgumentType.create()).executes(context -> { Utils.screenToOpen = new InventoryScreen(PlayerArgumentType.get(context)); return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java index f3c4895d35..4da86a24d2 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/LocateCommand.java @@ -5,7 +5,6 @@ package meteordevelopment.meteorclient.commands.commands; -import baritone.api.BaritoneAPI; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; @@ -16,30 +15,29 @@ import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.command.CommandSource; -import net.minecraft.component.ComponentMap; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.LodestoneTrackerComponent; -import net.minecraft.component.type.MapDecorationsComponent; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EyeOfEnderEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.EyeOfEnder; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.LodestoneTracker; +import net.minecraft.world.item.component.MapDecorations; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; import java.util.List; public class LocateCommand extends Command { - private Vec3d firstStart, firstEnd; - private Vec3d secondStart, secondEnd; + private Vec3 firstStart, firstEnd; + private Vec3 secondStart, secondEnd; private final List netherFortressBlocks = List.of( Blocks.NETHER_BRICKS, @@ -71,28 +69,28 @@ public LocateCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { // Overworld structures builder.then(literal("buried_treasure").executes(s -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack.getItem() != Items.FILLED_MAP - || stack.get(DataComponentTypes.ITEM_NAME) == null - || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.buried_treasure").getString())) { + || stack.get(DataComponents.ITEM_NAME) == null + || !stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("filled_map.buried_treasure").getString())) { error("You need to hold a (highlight)buried treasure map(default)!"); return SINGLE_SUCCESS; } - MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); + MapDecorations mapDecorationsComponent = stack.get(DataComponents.MAP_DECORATIONS); if (mapDecorationsComponent == null) { error("Couldn't locate the map icons!"); return SINGLE_SUCCESS; } - for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { + for (MapDecorations.Entry decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:red_x")) { - Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - MutableText text = Text.literal("Buried Treasure located at "); + Vec3 coords = new Vec3(decoration.x(), 62, decoration.z()); + MutableComponent text = Component.literal("Buried Treasure located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -105,24 +103,24 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("mansion").executes(s -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack.getItem() != Items.FILLED_MAP - || stack.get(DataComponentTypes.ITEM_NAME) == null - || !stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.mansion").getString())) { + || 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)!"); return SINGLE_SUCCESS; } - MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); + MapDecorations mapDecorationsComponent = stack.get(DataComponents.MAP_DECORATIONS); if (mapDecorationsComponent == null) { error("Couldn't locate the map icons!"); return SINGLE_SUCCESS; } - for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { + for (MapDecorations.Entry decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:woodland_mansion")) { - Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - MutableText text = Text.literal("Mansion located at "); + Vec3 coords = new Vec3(decoration.x(), 62, decoration.z()); + MutableComponent text = Component.literal("Mansion located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -135,21 +133,21 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("monument").executes(s -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack.getItem() == Items.FILLED_MAP - && stack.get(DataComponentTypes.ITEM_NAME) != null - && stack.get(DataComponentTypes.ITEM_NAME).getString().equals(Text.translatable("filled_map.monument").getString())) { + && stack.get(DataComponents.ITEM_NAME) != null + && stack.get(DataComponents.ITEM_NAME).getString().equals(Component.translatable("filled_map.monument").getString())) { - MapDecorationsComponent mapDecorationsComponent = stack.get(DataComponentTypes.MAP_DECORATIONS); + MapDecorations mapDecorationsComponent = stack.get(DataComponents.MAP_DECORATIONS); if (mapDecorationsComponent == null) { error("Couldn't locate the map icons!"); return SINGLE_SUCCESS; } - for (MapDecorationsComponent.Decoration decoration : mapDecorationsComponent.decorations().values()) { + for (MapDecorations.Entry decoration : mapDecorationsComponent.decorations().values()) { if (decoration.type().value().assetId().toString().equals("minecraft:ocean_monument")) { - Vec3d coords = new Vec3d(decoration.x(), 62, decoration.z()); - MutableText text = Text.literal("Monument located at "); + Vec3 coords = new Vec3(decoration.x(), 62, decoration.z()); + MutableComponent text = Component.literal("Monument located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -163,12 +161,12 @@ public void build(LiteralArgumentBuilder builder) { // If the player is not holding a valid map, try to locate the monument using Baritone if (BaritoneUtils.IS_AVAILABLE) { - Vec3d coords = findByBlockList(monumentBlocks); + Vec3 coords = findByBlockList(monumentBlocks); if (coords == null) { error("No monument found. Try using an (highlight)ocean explorer map(default) for more success."); return SINGLE_SUCCESS; } - MutableText text = Text.literal("Monument located at "); + MutableComponent text = Component.literal("Monument located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -183,7 +181,7 @@ public void build(LiteralArgumentBuilder builder) { boolean foundEye = InvUtils.testInHotbar(Items.ENDER_EYE); if (foundEye) { - if (BaritoneUtils.IS_AVAILABLE) PathManagers.get().follow(EyeOfEnderEntity.class::isInstance); + if (BaritoneUtils.IS_AVAILABLE) PathManagers.get().follow(EyeOfEnder.class::isInstance); firstStart = null; firstEnd = null; secondStart = null; @@ -191,12 +189,12 @@ public void build(LiteralArgumentBuilder builder) { MeteorClient.EVENT_BUS.subscribe(this); info("Please throw the first Eye of Ender"); } else if (BaritoneUtils.IS_AVAILABLE) { - Vec3d coords = findByBlockList(strongholdBlocks); + Vec3 coords = findByBlockList(strongholdBlocks); if (coords == null) { error("No stronghold found nearby. You can use (highlight)Ender Eyes(default) for more success."); return SINGLE_SUCCESS; } - MutableText text = Text.literal("Stronghold located at "); + MutableComponent text = Component.literal("Stronghold located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -210,7 +208,7 @@ public void build(LiteralArgumentBuilder builder) { // Nether structures builder.then(literal("nether_fortress").executes(s -> { - if (mc.world.getRegistryKey() != World.NETHER) { + if (mc.level.dimension() != Level.NETHER) { error("You need to be in the nether to locate a nether fortress."); return SINGLE_SUCCESS; } @@ -220,12 +218,12 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; } - Vec3d coords = findByBlockList(netherFortressBlocks); + Vec3 coords = findByBlockList(netherFortressBlocks); if (coords == null) { error("No nether fortress found."); return SINGLE_SUCCESS; } - MutableText text = Text.literal("Fortress located at "); + MutableComponent text = Component.literal("Fortress located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -235,7 +233,7 @@ public void build(LiteralArgumentBuilder builder) { // End structures builder.then(literal("end_city").executes(s -> { - if (mc.world.getRegistryKey() != World.END) { + if (mc.level.dimension() != Level.END) { error("You need to be in the end to locate an end city."); return SINGLE_SUCCESS; } @@ -245,12 +243,12 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; } - Vec3d coords = findByBlockList(endCityBlocks); + Vec3 coords = findByBlockList(endCityBlocks); if (coords == null) { error("No end city found."); return SINGLE_SUCCESS; } - MutableText text = Text.literal("End city located at "); + MutableComponent text = Component.literal("End city located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -260,17 +258,17 @@ public void build(LiteralArgumentBuilder builder) { // Misc structures builder.then(literal("lodestone").executes(s -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack.getItem() != Items.COMPASS) { error("You need to hold a (highlight)lodestone(default) compass!"); return SINGLE_SUCCESS; } - ComponentMap components = stack.getComponents(); + DataComponentMap components = stack.getComponents(); if (components == null) { error("Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?"); return SINGLE_SUCCESS; } - LodestoneTrackerComponent lodestoneTrackerComponent = components.get(DataComponentTypes.LODESTONE_TRACKER); + LodestoneTracker lodestoneTrackerComponent = components.get(DataComponents.LODESTONE_TRACKER); if (lodestoneTrackerComponent == null) { error("Couldn't get the components data. Are you holding a (highlight)lodestone(default) compass?"); return SINGLE_SUCCESS; @@ -281,8 +279,8 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; } - Vec3d coords = Vec3d.of(lodestoneTrackerComponent.target().get().pos()); - MutableText text = Text.literal("Lodestone located at "); + Vec3 coords = Vec3.atLowerCornerOf(lodestoneTrackerComponent.target().get().pos()); + MutableComponent text = Component.literal("Lodestone located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); @@ -300,33 +298,35 @@ private void cancel() { MeteorClient.EVENT_BUS.unsubscribe(this); } - private @Nullable Vec3d findByBlockList(List blockList) { - List posList = BaritoneAPI.getProvider().getWorldScanner().scanChunkRadius(BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext(), blockList, 64, 10, 32); + private @Nullable Vec3 findByBlockList(List blockList) { + /*List posList = BaritoneAPI.getProvider().getWorldScanner().scanChunkRadius(BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext(), blockList, 64, 10, 32); if (posList.isEmpty()) { return null; } if (posList.size() < 3) { warning("Only %d block(s) found. This search might be a false positive.", posList.size()); } - return new Vec3d(posList.getFirst().getX(), posList.getFirst().getY(), posList.getFirst().getZ()); + return new Vec3(posList.getFirst().getX(), posList.getFirst().getY(), posList.getFirst().getZ());*/ + + return null; // TODO(Baritone) } @EventHandler private void onReadPacket(PacketEvent.Receive event) { - if (event.packet instanceof EntitySpawnS2CPacket packet && packet.getEntityType() == EntityType.EYE_OF_ENDER) { + if (event.packet instanceof ClientboundAddEntityPacket packet && packet.getType() == EntityType.EYE_OF_ENDER) { firstPosition(packet.getX(), packet.getY(), packet.getZ()); } } @EventHandler private void onRemoveEntity(EntityRemovedEvent event) { - if (event.entity instanceof EyeOfEnderEntity eye) { + if (event.entity instanceof EyeOfEnder eye) { lastPosition(eye.getX(), eye.getY(), eye.getZ()); } } private void firstPosition(double x, double y, double z) { - Vec3d pos = new Vec3d(x, y, z); + Vec3 pos = new Vec3(x, y, z); if (this.firstStart == null) { this.firstStart = pos; } else { @@ -336,7 +336,7 @@ private void firstPosition(double x, double y, double z) { private void lastPosition(double x, double y, double z) { info("%s Eye of Ender's trajectory saved.", (this.firstEnd == null) ? "First" : "Second"); - Vec3d pos = new Vec3d(x, y, z); + Vec3 pos = new Vec3(x, y, z); if (this.firstEnd == null) { this.firstEnd = pos; info("Please throw the second Eye Of Ender from a different location."); @@ -365,8 +365,8 @@ private void findStronghold() { } MeteorClient.EVENT_BUS.unsubscribe(this); - Vec3d coords = new Vec3d(intersection[0], 0, intersection[1]); - MutableText text = Text.literal("Stronghold roughly located at "); + Vec3 coords = new Vec3(intersection[0], 0, intersection[1]); + MutableComponent text = Component.literal("Stronghold roughly located at "); text.append(ChatUtils.formatCoords(coords)); text.append("."); info(text); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java index 074c9eae8d..2b3a0d81eb 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/MacroCommand.java @@ -13,8 +13,8 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.systems.macros.Macro; import meteordevelopment.orbit.EventHandler; -import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.TimeArgumentType; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.arguments.TimeArgument; import java.util.ArrayList; import java.util.List; @@ -30,7 +30,7 @@ public MacroCommand() { List scheduledMacros = new ArrayList<>(); @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder .then(literal("clear") .executes(context -> { @@ -66,7 +66,7 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; }) - .then(argument("delay", TimeArgumentType.time()) + .then(argument("delay", TimeArgument.time()) .executes(context -> { Macro macro = MacroArgumentType.get(context); scheduleQueue.add(new ScheduledMacro(IntegerArgumentType.getInteger(context, "delay"), macro)); @@ -122,7 +122,7 @@ public ScheduledMacro(int tickDelay, Macro scheduledMacro) { } public void tick() { - delay--; + delay--; } public boolean run() { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java index 248fea9f6a..023a12b51f 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ModulesCommand.java @@ -10,11 +10,11 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; public class ModulesCommand extends Command { public ModulesCommand() { @@ -22,12 +22,12 @@ public ModulesCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { ChatUtils.info("--- Modules ((highlight)%d(default)) ---", Modules.get().getCount()); Modules.loopCategories().forEach(category -> { - MutableText categoryMessage = Text.literal(""); + MutableComponent categoryMessage = Component.literal(""); Modules.get().getGroup(category).forEach(module -> categoryMessage.append(getModuleText(module))); ChatUtils.sendMsg(category.name, categoryMessage); }); @@ -36,17 +36,18 @@ public void build(LiteralArgumentBuilder builder) { }); } - private MutableText getModuleText(Module module) { + private MutableComponent getModuleText(Module module) { // Hover tooltip - MutableText tooltip = Text.literal(""); + MutableComponent tooltip = Component.literal(""); - tooltip.append(Text.literal(module.title).formatted(Formatting.BLUE, Formatting.BOLD)).append("\n"); - tooltip.append(Text.literal(module.name).formatted(Formatting.GRAY)).append("\n\n"); - tooltip.append(Text.literal(module.description).formatted(Formatting.WHITE)); + tooltip.append(Component.literal(module.title).withStyle(ChatFormatting.BLUE, ChatFormatting.BOLD)).append("\n"); + tooltip.append(Component.literal(module.name).withStyle(ChatFormatting.GRAY)).append("\n\n"); + tooltip.append(Component.literal(module.description).withStyle(ChatFormatting.WHITE)); - MutableText finalModule = Text.literal(module.title); - if (!module.isActive()) finalModule.formatted(Formatting.GRAY); - if (!module.equals(Modules.get().getGroup(module.category).getLast())) finalModule.append(Text.literal(", ").formatted(Formatting.GRAY)); + MutableComponent finalModule = Component.literal(module.title); + if (!module.isActive()) finalModule.withStyle(ChatFormatting.GRAY); + if (!module.equals(Modules.get().getGroup(module.category).getLast())) + finalModule.append(Component.literal(", ").withStyle(ChatFormatting.GRAY)); finalModule.setStyle(finalModule.getStyle().withHoverEvent(new HoverEvent.ShowText(tooltip))); return finalModule; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java index db1a317183..087fc080f9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NameHistoryCommand.java @@ -14,10 +14,10 @@ import meteordevelopment.meteorclient.utils.player.ChatUtils; import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.command.CommandSource; -import net.minecraft.text.*; -import net.minecraft.util.Formatting; +import net.minecraft.ChatFormatting; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.*; import java.net.URI; import java.text.DateFormat; @@ -31,10 +31,10 @@ public NameHistoryCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("player", PlayerListEntryArgumentType.create()).executes(context -> { MeteorExecutor.execute(() -> { - PlayerListEntry lookUpTarget = PlayerListEntryArgumentType.get(context); + PlayerInfo lookUpTarget = PlayerListEntryArgumentType.get(context); UUID uuid = lookUpTarget.getProfile().id(); NameHistory history = Http.get("https://laby.net/api/v2/user/" + uuid + "/get-profile") @@ -48,10 +48,10 @@ public void build(LiteralArgumentBuilder builder) { } String name = lookUpTarget.getProfile().name(); - MutableText initial = Text.literal(name); - initial.append(Text.literal(name.endsWith("s") ? "'" : "'s")); + MutableComponent initial = Component.literal(name); + initial.append(Component.literal(name.endsWith("s") ? "'" : "'s")); - Color nameColor = PlayerUtils.getPlayerColor(mc.world.getPlayerByUuid(uuid), Utils.WHITE); + Color nameColor = PlayerUtils.getPlayerColor(mc.level.getPlayerByUUID(uuid), Utils.WHITE); initial.setStyle(initial.getStyle() .withColor(TextColor.fromRgb(nameColor.getPacked())) @@ -60,32 +60,32 @@ public void build(LiteralArgumentBuilder builder) { ) ) .withHoverEvent(new HoverEvent.ShowText( - Text.literal("View on laby.net") - .formatted(Formatting.YELLOW) - .formatted(Formatting.ITALIC) + Component.literal("View on laby.net") + .withStyle(ChatFormatting.YELLOW) + .withStyle(ChatFormatting.ITALIC) )) ); - info(initial.append(Text.literal(" Username History:").formatted(Formatting.GRAY))); + info(initial.append(Component.literal(" Username History:").withStyle(ChatFormatting.GRAY))); for (Name entry : history.username_history) { - MutableText nameText = Text.literal(entry.name); - nameText.formatted(Formatting.AQUA); + MutableComponent nameText = Component.literal(entry.name); + nameText.withStyle(ChatFormatting.AQUA); if (entry.changed_at != null && entry.changed_at.getTime() != 0) { - MutableText changed = Text.literal("Changed at: "); - changed.formatted(Formatting.GRAY); + MutableComponent changed = Component.literal("Changed at: "); + changed.withStyle(ChatFormatting.GRAY); DateFormat formatter = new SimpleDateFormat("hh:mm:ss, dd/MM/yyyy"); - changed.append(Text.literal(formatter.format(entry.changed_at)).formatted(Formatting.WHITE)); + changed.append(Component.literal(formatter.format(entry.changed_at)).withStyle(ChatFormatting.WHITE)); nameText.setStyle(nameText.getStyle().withHoverEvent(new HoverEvent.ShowText(changed))); } if (!entry.accurate) { - MutableText text = Text.literal("*").formatted(Formatting.WHITE); + MutableComponent text = Component.literal("*").withStyle(ChatFormatting.WHITE); - text.setStyle(text.getStyle().withHoverEvent(new HoverEvent.ShowText(Text.literal("This name history entry is not accurate according to laby.net")))); + text.setStyle(text.getStyle().withHoverEvent(new HoverEvent.ShowText(Component.literal("This name history entry is not accurate according to laby.net")))); nameText.append(text); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java index 1eea843b3a..2fd5a88f90 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NbtCommand.java @@ -9,29 +9,27 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; -import com.mojang.serialization.DataResult; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.ComponentMapArgumentType; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; -import net.minecraft.command.CommandSource; -import net.minecraft.command.DataCommandObject; -import net.minecraft.command.EntityDataObject; -import net.minecraft.command.argument.NbtPathArgumentType; -import net.minecraft.command.argument.RegistryKeyArgumentType; -import net.minecraft.component.*; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; -import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Style; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Unit; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.arguments.NbtPathArgument; +import net.minecraft.commands.arguments.ResourceKeyArgument; +import net.minecraft.core.component.*; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.network.protocol.game.ServerboundSetCreativeModeSlotPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.commands.data.DataAccessor; +import net.minecraft.server.commands.data.EntityDataAccessor; +import net.minecraft.world.item.ItemStack; import java.util.List; import java.util.Locale; @@ -39,15 +37,15 @@ public class NbtCommand extends Command { private static final DynamicCommandExceptionType MALFORMED_ITEM_EXCEPTION = new DynamicCommandExceptionType( - error -> Text.stringifiedTranslatable("arguments.item.malformed", error) + error -> Component.translatableEscape("arguments.item.malformed", error) ); - private final Text copyButton = Text.literal("NBT").setStyle(Style.EMPTY - .withFormatting(Formatting.UNDERLINE) + private final MutableComponent copyButton = Component.literal("NBT").setStyle(Style.EMPTY + .applyFormat(ChatFormatting.UNDERLINE) .withClickEvent(new MeteorClickEvent( this.toString("copy") )) .withHoverEvent(new HoverEvent.ShowText( - Text.literal("Copy the NBT data to your clipboard.") + Component.literal("Copy the NBT data to your clipboard.") ))); public NbtCommand() { @@ -55,19 +53,16 @@ public NbtCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("add").then(argument("component", ComponentMapArgumentType.componentMap(REGISTRY_ACCESS)).executes(ctx -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (validBasic(stack)) { - ComponentMap itemComponents = stack.getComponents(); - ComponentMap newComponents = ComponentMapArgumentType.getComponentMap(ctx, "component"); + DataComponentMap itemComponents = stack.getComponents(); + DataComponentMap newComponents = ComponentMapArgumentType.getComponentMap(ctx, "component"); - ComponentMap testComponents = ComponentMap.of(itemComponents, newComponents); - DataResult dataResult = ItemStack.validateComponents(testComponents); - dataResult.getOrThrow(MALFORMED_ITEM_EXCEPTION::create); - - stack.applyComponentsFrom(testComponents); + DataComponentMap testComponents = DataComponentMap.composite(itemComponents, newComponents); + stack.applyComponents(testComponents); setStack(stack); } @@ -76,30 +71,27 @@ public void build(LiteralArgumentBuilder builder) { }))); builder.then(literal("set").then(argument("component", ComponentMapArgumentType.componentMap(REGISTRY_ACCESS)).executes(ctx -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (validBasic(stack)) { - ComponentMap components = ComponentMapArgumentType.getComponentMap(ctx, "component"); - MergedComponentMap stackComponents = (MergedComponentMap) stack.getComponents(); - - DataResult dataResult = ItemStack.validateComponents(components); - dataResult.getOrThrow(MALFORMED_ITEM_EXCEPTION::create); + DataComponentMap components = ComponentMapArgumentType.getComponentMap(ctx, "component"); + PatchedDataComponentMap stackComponents = (PatchedDataComponentMap) stack.getComponents(); - ComponentChanges.Builder changesBuilder = ComponentChanges.builder(); - Set> types = stackComponents.getTypes(); + DataComponentPatch.Builder changesBuilder = DataComponentPatch.builder(); + Set> types = stackComponents.keySet(); //set changes - for (Component entry : components) { - changesBuilder.add(entry); + for (TypedDataComponent entry : components) { + changesBuilder.set(entry); types.remove(entry.type()); } //remove the rest - for (ComponentType type : types) { + for (DataComponentType type : types) { changesBuilder.remove(type); } - stackComponents.applyChanges(changesBuilder.build()); + stackComponents.applyPatch(changesBuilder.build()); setStack(stack); } @@ -107,36 +99,36 @@ public void build(LiteralArgumentBuilder builder) { return SINGLE_SUCCESS; }))); - builder.then(literal("remove").then(argument("component", RegistryKeyArgumentType.registryKey(RegistryKeys.DATA_COMPONENT_TYPE)).executes(ctx -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + builder.then(literal("remove").then(argument("component", ResourceKeyArgument.key(Registries.DATA_COMPONENT_TYPE)).executes(ctx -> { + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (validBasic(stack)) { @SuppressWarnings("unchecked") - RegistryKey> componentTypeKey = (RegistryKey>) ctx.getArgument("component", RegistryKey.class); + ResourceKey> componentTypeKey = (ResourceKey>) ctx.getArgument("component", ResourceKey.class); - ComponentType componentType = Registries.DATA_COMPONENT_TYPE.get(componentTypeKey); + DataComponentType componentType = BuiltInRegistries.DATA_COMPONENT_TYPE.getValue(componentTypeKey); - MergedComponentMap components = (MergedComponentMap) stack.getComponents(); - components.applyChanges(ComponentChanges.builder().remove(componentType).build()); + PatchedDataComponentMap components = (PatchedDataComponentMap) stack.getComponents(); + components.applyPatch(DataComponentPatch.builder().remove(componentType).build()); setStack(stack); } return SINGLE_SUCCESS; }).suggests((ctx, suggestionsBuilder) -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (stack != ItemStack.EMPTY) { - ComponentMap components = stack.getComponents(); + DataComponentMap components = stack.getComponents(); String remaining = suggestionsBuilder.getRemaining().toLowerCase(Locale.ROOT); - CommandSource.forEachMatching(components.getTypes().stream().map(Registries.DATA_COMPONENT_TYPE::getEntry).toList(), remaining, entry -> { - if (entry.getKey().isPresent()) return entry.getKey().get().getValue(); + SharedSuggestionProvider.filterResources(components.keySet().stream().map(BuiltInRegistries.DATA_COMPONENT_TYPE::wrapAsHolder).toList(), remaining, entry -> { + if (entry.unwrapKey().isPresent()) return entry.unwrapKey().get().identifier(); return null; }, entry -> { - ComponentType dataComponentType = entry.value(); - if (dataComponentType.getCodec() != null) { - if (entry.getKey().isPresent()) { - suggestionsBuilder.suggest(entry.getKey().get().getValue().toString()); + DataComponentType dataComponentType = entry.value(); + if (dataComponentType.codec() != null) { + if (entry.unwrapKey().isPresent()) { + suggestionsBuilder.suggest(entry.unwrapKey().get().identifier().toString()); } } }); @@ -146,15 +138,15 @@ public void build(LiteralArgumentBuilder builder) { }))); builder.then(literal("get").executes(context -> { - DataCommandObject dataCommandObject = new EntityDataObject(mc.player); - NbtPathArgumentType.NbtPath handPath = NbtPathArgumentType.NbtPath.parse("SelectedItem"); + DataAccessor dataCommandObject = new EntityDataAccessor(mc.player); + NbtPathArgument.NbtPath handPath = NbtPathArgument.NbtPath.of("SelectedItem"); - MutableText text = Text.empty().append(copyButton); + MutableComponent text = Component.empty().append(copyButton); try { - List nbtElement = handPath.get(dataCommandObject.getNbt()); + List nbtElement = handPath.get(dataCommandObject.getData()); if (!nbtElement.isEmpty()) { - text.append(" ").append(NbtHelper.toPrettyPrintedText(nbtElement.getFirst())); + text.append(" ").append(NbtUtils.toPrettyComponent(nbtElement.getFirst())); } } catch (CommandSyntaxException e) { text.append("{}"); @@ -166,23 +158,23 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("copy").executes(context -> { - DataCommandObject dataCommandObject = new EntityDataObject(mc.player); - NbtPathArgumentType.NbtPath handPath = NbtPathArgumentType.NbtPath.parse("SelectedItem"); + DataAccessor dataCommandObject = new EntityDataAccessor(mc.player); + NbtPathArgument.NbtPath handPath = NbtPathArgument.NbtPath.of("SelectedItem"); - MutableText text = Text.empty().append(copyButton); + MutableComponent text = Component.empty().append(copyButton); String nbt = "{}"; try { - List nbtElement = handPath.get(dataCommandObject.getNbt()); + List nbtElement = handPath.get(dataCommandObject.getData()); if (!nbtElement.isEmpty()) { - text.append(" ").append(NbtHelper.toPrettyPrintedText(nbtElement.getFirst())); + text.append(" ").append(NbtUtils.toPrettyComponent(nbtElement.getFirst())); nbt = nbtElement.getFirst().toString(); } } catch (CommandSyntaxException e) { text.append("{}"); } - mc.keyboard.setClipboard(nbt); + mc.keyboardHandler.setClipboard(nbt); text.append(" data copied!"); info(text); @@ -191,7 +183,7 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("count").then(argument("count", IntegerArgumentType.integer(-127, 127)).executes(context -> { - ItemStack stack = mc.player.getInventory().getSelectedStack(); + ItemStack stack = mc.player.getInventory().getSelectedItem(); if (validBasic(stack)) { int count = IntegerArgumentType.getInteger(context, "count"); @@ -205,11 +197,11 @@ public void build(LiteralArgumentBuilder builder) { } private void setStack(ItemStack stack) { - mc.player.networkHandler.sendPacket(new CreativeInventoryActionC2SPacket(36 + mc.player.getInventory().getSelectedSlot(), stack)); + mc.player.connection.send(new ServerboundSetCreativeModeSlotPacket(36 + mc.player.getInventory().getSelectedSlot(), stack)); } private boolean validBasic(ItemStack stack) { - if (!mc.player.getAbilities().creativeMode) { + if (!mc.player.getAbilities().instabuild) { error("Creative mode only."); return false; } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java index ee791ce2fc..d821cb2ddc 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/NotebotCommand.java @@ -18,12 +18,12 @@ import meteordevelopment.meteorclient.systems.modules.misc.Notebot; import meteordevelopment.meteorclient.utils.notebot.song.Note; import meteordevelopment.orbit.EventHandler; -import net.minecraft.block.enums.NoteBlockInstrument; -import net.minecraft.command.CommandSource; -import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; -import net.minecraft.sound.SoundEvent; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +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; @@ -34,8 +34,8 @@ import java.util.Map; public class NotebotCommand extends Command { - private static final SimpleCommandExceptionType INVALID_SONG = new SimpleCommandExceptionType(Text.literal("Invalid song.")); - private static final DynamicCommandExceptionType INVALID_PATH = new DynamicCommandExceptionType(object -> Text.literal("'%s' is not a valid path.".formatted(object))); + private static final SimpleCommandExceptionType INVALID_SONG = new SimpleCommandExceptionType(Component.literal("Invalid song.")); + private static final DynamicCommandExceptionType INVALID_PATH = new DynamicCommandExceptionType(object -> Component.literal("'%s' is not a valid path.".formatted(object))); int ticks = -1; private final Map> song = new HashMap<>(); // tick -> notes @@ -45,9 +45,9 @@ public NotebotCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("help").executes(ctx -> { - Util.getOperatingSystem().open("https://github.com/MeteorDevelopment/meteor-client/wiki/Notebot-Guide"); + Util.getPlatform().openUri("https://github.com/MeteorDevelopment/meteor-client/wiki/Notebot-Guide"); return SINGLE_SUCCESS; })); @@ -105,7 +105,7 @@ public void build(LiteralArgumentBuilder builder) { } notebot.previewSong(songPath.toFile()); return SINGLE_SUCCESS; - }))); + }))); builder.then(literal("record").then(literal("start").executes(ctx -> { ticks = -1; @@ -144,7 +144,7 @@ private void onTick(TickEvent.Post event) { @EventHandler private void onReadPacket(PacketEvent.Receive event) { - if (event.packet instanceof PlaySoundS2CPacket sound && sound.getSound().value().id().getPath().contains("note_block")) { + if (event.packet instanceof ClientboundSoundPacket sound && sound.getSound().value().location().getPath().contains("note_block")) { if (ticks == -1) ticks = 0; List notes = song.computeIfAbsent(ticks, tick -> new ArrayList<>()); var note = getNote(sound); @@ -184,7 +184,7 @@ private void saveRecording(Path path) { } - private Note getNote(PlaySoundS2CPacket soundPacket) { + private Note getNote(ClientboundSoundPacket soundPacket) { float pitch = soundPacket.getPitch(); // Bruteforce note level @@ -212,7 +212,7 @@ private Note getNote(PlaySoundS2CPacket soundPacket) { } private NoteBlockInstrument getInstrumentFromSound(SoundEvent sound) { - String path = sound.id().getPath(); + String path = sound.location().getPath(); if (path.contains("harp")) return NoteBlockInstrument.HARP; else if (path.contains("basedrum")) diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java index 52e9761622..272f59c830 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/PeekCommand.java @@ -9,27 +9,26 @@ import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.command.CommandSource; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.item.ItemStack; public class PeekCommand extends Command { private static final ItemStack[] ITEMS = new ItemStack[27]; - private static final SimpleCommandExceptionType CANT_PEEK = new SimpleCommandExceptionType(Text.literal("You must be holding a storage block or looking at an item frame.")); + private static final SimpleCommandExceptionType CANT_PEEK = new SimpleCommandExceptionType(Component.literal("You must be holding a storage block or looking at an item frame.")); public PeekCommand() { super("peek", "Lets you see what's inside storage block items."); } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { - if (Utils.openContainer(mc.player.getMainHandStack(), ITEMS, true)) return SINGLE_SUCCESS; - else if (Utils.openContainer(mc.player.getOffHandStack(), ITEMS, true)) return SINGLE_SUCCESS; - else if (mc.targetedEntity instanceof ItemFrameEntity && - Utils.openContainer(((ItemFrameEntity) mc.targetedEntity).getHeldItemStack(), ITEMS, true) - ) return SINGLE_SUCCESS; + if (Utils.openContainer(mc.player.getMainHandItem(), ITEMS, true)) return SINGLE_SUCCESS; + else if (Utils.openContainer(mc.player.getOffhandItem(), ITEMS, true)) return SINGLE_SUCCESS; + else if (mc.crosshairPickEntity instanceof ItemFrame itemFrame && Utils.openContainer(itemFrame.getItem(), ITEMS, true)) + return SINGLE_SUCCESS; else throw CANT_PEEK.create(); }); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java index 43c816f1c1..edf3e4eb66 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ProfilesCommand.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.commands.arguments.ProfileArgumentType; import meteordevelopment.meteorclient.systems.profiles.Profile; import meteordevelopment.meteorclient.systems.profiles.Profiles; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; public class ProfilesCommand extends Command { @@ -19,7 +19,7 @@ public ProfilesCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("load").then(argument("profile", ProfileArgumentType.create()).executes(context -> { Profile profile = ProfileArgumentType.get(context); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java index f299819854..719c90b1d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ReloadCommand.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.utils.network.Capes; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; public class ReloadCommand extends Command { public ReloadCommand() { @@ -21,7 +21,7 @@ public ReloadCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { warning("Reloading systems, this may take a while."); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java index 3377b7d7e1..2b2e946c81 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ResetCommand.java @@ -14,7 +14,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; public class ResetCommand extends Command { @@ -23,7 +23,7 @@ public ResetCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("settings") .then(argument("module", ModuleArgumentType.create()).executes(context -> { Module module = context.getArgument("module", Module.class); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java index d9b3be2622..22fb177ee7 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/RotationCommand.java @@ -9,9 +9,9 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.DirectionArgumentType; -import net.minecraft.command.CommandSource; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; public class RotationCommand extends Command { public RotationCommand() { @@ -19,26 +19,26 @@ public RotationCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder .then(literal("set") .then(argument("direction", DirectionArgumentType.create()) .executes(context -> { - mc.player.setPitch(context.getArgument("direction", Direction.class).getVector().getY() * -90); - mc.player.setYaw(context.getArgument("direction", Direction.class).getPositiveHorizontalDegrees()); + mc.player.setXRot(context.getArgument("direction", Direction.class).getUnitVec3i().getY() * -90); + mc.player.setYRot(context.getArgument("direction", Direction.class).toYRot()); return SINGLE_SUCCESS; })) .then(argument("pitch", FloatArgumentType.floatArg(-90, 90)) .executes(context -> { - mc.player.setPitch(context.getArgument("pitch", Float.class)); + mc.player.setXRot(context.getArgument("pitch", Float.class)); return SINGLE_SUCCESS; }) .then(argument("yaw", FloatArgumentType.floatArg(-180, 180)) .executes(context -> { - mc.player.setPitch(context.getArgument("pitch", Float.class)); - mc.player.setYaw(context.getArgument("yaw", Float.class)); + mc.player.setXRot(context.getArgument("pitch", Float.class)); + mc.player.setYRot(context.getArgument("yaw", Float.class)); return SINGLE_SUCCESS; }) @@ -48,18 +48,18 @@ public void build(LiteralArgumentBuilder builder) { .then(literal("add") .then(argument("pitch", FloatArgumentType.floatArg(-90, 90)) .executes(context -> { - float pitch = mc.player.getPitch() + context.getArgument("pitch", Float.class); - mc.player.setPitch(pitch >= 0 ? Math.min(pitch, 90) : Math.max(pitch, -90)); + float pitch = mc.player.getXRot() + context.getArgument("pitch", Float.class); + mc.player.setXRot(pitch >= 0 ? Math.min(pitch, 90) : Math.max(pitch, -90)); return SINGLE_SUCCESS; }) .then(argument("yaw", FloatArgumentType.floatArg(-180, 180)) .executes(context -> { - float pitch = mc.player.getPitch() + context.getArgument("pitch", Float.class); - mc.player.setPitch(pitch >= 0 ? Math.min(pitch, 90) : Math.max(pitch, -90)); + float pitch = mc.player.getXRot() + context.getArgument("pitch", Float.class); + mc.player.setXRot(pitch >= 0 ? Math.min(pitch, 90) : Math.max(pitch, -90)); - float yaw = mc.player.getYaw() + context.getArgument("yaw", Float.class); - mc.player.setYaw(MathHelper.wrapDegrees(yaw)); + float yaw = mc.player.getYRot() + context.getArgument("yaw", Float.class); + mc.player.setYRot(Mth.wrapDegrees(yaw)); 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 e29c4f2f48..b9e19deca0 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SaveMapCommand.java @@ -12,14 +12,14 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.mixin.MapTextureManagerAccessor; -import net.minecraft.client.texture.MapTextureManager; -import net.minecraft.command.CommandSource; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.item.FilledMapItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.map.MapState; -import net.minecraft.text.Text; +import net.minecraft.client.resources.MapTextureManager; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.jetbrains.annotations.Nullable; import org.lwjgl.BufferUtils; import org.lwjgl.PointerBuffer; @@ -33,8 +33,8 @@ import java.nio.ByteBuffer; public class SaveMapCommand extends Command { - private static final SimpleCommandExceptionType MAP_NOT_FOUND = new SimpleCommandExceptionType(Text.literal("You must be holding a filled map.")); - private static final SimpleCommandExceptionType OOPS = new SimpleCommandExceptionType(Text.literal("Something went wrong.")); + 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; @@ -50,7 +50,7 @@ public SaveMapCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { saveMap(128); @@ -65,20 +65,20 @@ public void build(LiteralArgumentBuilder builder) { @SuppressWarnings("deprecation") // Use of NativeImage#makePixelArray private void saveMap(int scale) throws CommandSyntaxException { ItemStack map = getMap(); - MapState state = getMapState(); + MapItemSavedData state = getMapState(); if (map == null || state == null) throw MAP_NOT_FOUND.create(); File path = getPath(); if (path == null) throw OOPS.create(); - MapTextureManagerAccessor textureManager = (MapTextureManagerAccessor) mc.gameRenderer.getClient().getMapTextureManager(); - MapTextureManager.MapTexture texture = textureManager.meteor$invokeGetMapTexture(map.get(DataComponentTypes.MAP_ID), state); - if (texture.texture.getImage() == null) throw OOPS.create(); + MapTextureManagerAccessor textureManager = (MapTextureManagerAccessor) mc.gameRenderer.getMinecraft().getMapTextureManager(); + MapTextureManager.MapInstance texture = textureManager.meteor$invokeGetOrCreateMapInstance(map.get(DataComponents.MAP_ID), state); + if (texture.texture.getPixels() == null) throw OOPS.create(); try { - if (scale == 128) texture.texture.getImage().writeTo(path); + if (scale == 128) texture.texture.getPixels().writeToFile(path); else { - int[] data = texture.texture.getImage().makePixelArray(); + 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); @@ -93,11 +93,11 @@ private void saveMap(int scale) throws CommandSyntaxException { } } - private @Nullable MapState getMapState() { + private @Nullable MapItemSavedData getMapState() { ItemStack map = getMap(); if (map == null) return null; - return FilledMapItem.getMapState(map.get(DataComponentTypes.MAP_ID), mc.world); + return MapItem.getSavedData(map.get(DataComponents.MAP_ID), mc.level); } private @Nullable File getPath() { @@ -109,10 +109,10 @@ private void saveMap(int scale) throws CommandSyntaxException { } private @Nullable ItemStack getMap() { - ItemStack itemStack = mc.player.getMainHandStack(); + ItemStack itemStack = mc.player.getMainHandItem(); if (itemStack.getItem() == Items.FILLED_MAP) return itemStack; - itemStack = mc.player.getOffHandStack(); + itemStack = mc.player.getOffhandItem(); if (itemStack.getItem() == Items.FILLED_MAP) return itemStack; return null; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java index 102bc003fe..dba078a9bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SayCommand.java @@ -8,15 +8,15 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import meteordevelopment.meteorclient.mixin.ClientPlayNetworkHandlerAccessor; +import meteordevelopment.meteorclient.mixin.ClientPacketListenerAccessor; import meteordevelopment.meteorclient.utils.misc.MeteorStarscript; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.command.CommandSource; -import net.minecraft.network.encryption.NetworkEncryptionUtils; -import net.minecraft.network.message.LastSeenMessagesCollector; -import net.minecraft.network.message.MessageBody; -import net.minecraft.network.message.MessageSignatureData; -import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.LastSeenMessagesTracker; +import net.minecraft.network.chat.MessageSignature; +import net.minecraft.network.chat.SignedMessageBody; +import net.minecraft.network.protocol.game.ServerboundChatPacket; +import net.minecraft.util.Crypt; import org.meteordev.starscript.Script; import java.time.Instant; @@ -27,7 +27,7 @@ public SayCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("message", StringArgumentType.greedyString()).executes(context -> { String msg = context.getArgument("message", String.class); Script script = MeteorStarscript.compile(msg); @@ -37,11 +37,11 @@ public void build(LiteralArgumentBuilder builder) { if (message != null) { Instant instant = Instant.now(); - long l = NetworkEncryptionUtils.SecureRandomUtil.nextLong(); - ClientPlayNetworkHandler handler = mc.getNetworkHandler(); - LastSeenMessagesCollector.LastSeenMessages lastSeenMessages = ((ClientPlayNetworkHandlerAccessor) handler).meteor$getLastSeenMessagesCollector().collect(); - MessageSignatureData messageSignatureData = ((ClientPlayNetworkHandlerAccessor) handler).meteor$getMessagePacker().pack(new MessageBody(message, instant, l, lastSeenMessages.lastSeen())); - handler.sendPacket(new ChatMessageC2SPacket(message, instant, l, messageSignatureData, lastSeenMessages.update())); + long l = Crypt.SaltSupplier.getLong(); + 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())); } } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java index 3267e448ea..6ce880c280 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ServerCommand.java @@ -12,27 +12,27 @@ import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.mixin.ClientPlayNetworkHandlerAccessor; +import meteordevelopment.meteorclient.mixin.ClientPacketListenerAccessor; import meteordevelopment.meteorclient.utils.world.TickRate; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.network.ServerAddress; -import net.minecraft.client.network.ServerInfo; -import net.minecraft.command.CommandRegistryAccess; -import net.minecraft.command.CommandSource; -import net.minecraft.command.DefaultPermissions; -import net.minecraft.command.permission.PermissionPredicate; -import net.minecraft.network.packet.c2s.play.RequestCommandCompletionsC2SPacket; -import net.minecraft.network.packet.s2c.play.CommandSuggestionsS2CPacket; -import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; -import net.minecraft.server.integrated.IntegratedServer; -import net.minecraft.text.ClickEvent; -import net.minecraft.text.HoverEvent; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.world.LocalDifficulty; +import net.minecraft.ChatFormatting; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.resolver.ServerAddress; +import net.minecraft.client.server.IntegratedServer; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.protocol.game.ClientboundCommandSuggestionsPacket; +import net.minecraft.network.protocol.game.ClientboundCommandsPacket; +import net.minecraft.network.protocol.game.ServerboundCommandSuggestionPacket; +import net.minecraft.server.permissions.PermissionSet; +import net.minecraft.server.permissions.Permissions; +import net.minecraft.world.DifficultyInstance; import net.minecraft.world.attribute.EnvironmentAttributes; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.level.dimension.DimensionType; import org.apache.commons.lang3.Strings; import java.net.InetAddress; @@ -60,7 +60,7 @@ public ServerCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.executes(context -> { basicInfo(); return SINGLE_SUCCESS; @@ -75,7 +75,7 @@ public void build(LiteralArgumentBuilder builder) { plugins.addAll(commandTreePlugins); if (alias != null) { - mc.getNetworkHandler().sendPacket(new RequestCommandCompletionsC2SPacket(RANDOM.nextInt(200), alias + " ")); + mc.getConnection().send(new ServerboundCommandSuggestionPacket(RANDOM.nextInt(200), alias + " ")); tick = true; } else printPlugins(); @@ -84,26 +84,26 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("tps").executes(ctx -> { float tps = TickRate.INSTANCE.getTickRate(); - Formatting color; - if (tps > 17.0f) color = Formatting.GREEN; - else if (tps > 12.0f) color = Formatting.YELLOW; - else color = Formatting.RED; + ChatFormatting color; + if (tps > 17.0f) color = ChatFormatting.GREEN; + else if (tps > 12.0f) color = ChatFormatting.YELLOW; + else color = ChatFormatting.RED; info("Current TPS: %s%.2f(default).", color, tps); return SINGLE_SUCCESS; })); } private void basicInfo() { - if (mc.isIntegratedServerRunning()) { - IntegratedServer server = mc.getServer(); + if (mc.hasSingleplayerServer()) { + IntegratedServer server = mc.getSingleplayerServer(); info("Singleplayer"); - if (server != null) info("Version: %s", server.getVersion()); + if (server != null) info("Version: %s", server.getServerVersion()); return; } - ServerInfo server = mc.getCurrentServerEntry(); + ServerData server = mc.getCurrentServer(); if (server == null) { info("Couldn't obtain any server information."); @@ -112,61 +112,61 @@ private void basicInfo() { String ipv4 = ""; try { - ipv4 = InetAddress.getByName(server.address).getHostAddress(); - } catch (UnknownHostException ignored) {} + ipv4 = InetAddress.getByName(server.ip).getHostAddress(); + } catch (UnknownHostException _) { + } - MutableText ipText; + MutableComponent ipText; if (ipv4.isEmpty()) { - ipText = Text.literal(Formatting.GRAY + server.address); + ipText = Component.literal(ChatFormatting.GRAY + server.ip); ipText.setStyle(ipText.getStyle() - .withClickEvent(new ClickEvent.CopyToClipboard(server.address)) - .withHoverEvent(new HoverEvent.ShowText(Text.literal("Copy to clipboard"))) + .withClickEvent(new ClickEvent.CopyToClipboard(server.ip)) + .withHoverEvent(new HoverEvent.ShowText(Component.literal("Copy to clipboard"))) ); - } - else { - ipText = Text.literal(Formatting.GRAY + server.address); + } else { + ipText = Component.literal(ChatFormatting.GRAY + server.ip); ipText.setStyle(ipText.getStyle() - .withClickEvent(new ClickEvent.CopyToClipboard(server.address)) - .withHoverEvent(new HoverEvent.ShowText(Text.literal("Copy to clipboard"))) + .withClickEvent(new ClickEvent.CopyToClipboard(server.ip)) + .withHoverEvent(new HoverEvent.ShowText(Component.literal("Copy to clipboard"))) ); - MutableText ipv4Text = Text.literal(String.format("%s (%s)", Formatting.GRAY, ipv4)); + MutableComponent ipv4Text = Component.literal(String.format("%s (%s)", ChatFormatting.GRAY, ipv4)); ipv4Text.setStyle(ipText.getStyle() .withClickEvent(new ClickEvent.CopyToClipboard(ipv4)) - .withHoverEvent(new HoverEvent.ShowText(Text.literal("Copy to clipboard"))) + .withHoverEvent(new HoverEvent.ShowText(Component.literal("Copy to clipboard"))) ); ipText.append(ipv4Text); } info( - Text.literal(String.format("%sIP: ", Formatting.GRAY)) - .append(ipText) + Component.literal(String.format("%sIP: ", ChatFormatting.GRAY)) + .append(ipText) ); - info("Port: %d", ServerAddress.parse(server.address).getPort()); - info("Type: %s", mc.getNetworkHandler().getBrand() != null ? mc.getNetworkHandler().getBrand() : "unknown"); - info("Motd: %s", server.label != null ? server.label.getString() : "unknown"); + info("Port: %d", ServerAddress.parseString(server.ip).getPort()); + info("Type: %s", mc.getConnection().serverBrand() != null ? mc.getConnection().serverBrand() : "unknown"); + info("Motd: %s", server.motd != null ? server.motd.getString() : "unknown"); info("Version: %s", server.version.getString()); - info("Protocol version: %d", server.protocolVersion); + info("Protocol version: %d", server.protocol); info("Difficulty: %s (Local: %.2f)", - mc.world.getDifficulty().getTranslatableName().getString(), - new LocalDifficulty( - mc.world.getDifficulty(), - mc.world.getTimeOfDay(), - mc.world.getChunk(mc.player.getBlockPos()).getInhabitedTime(), - DimensionType.MOON_SIZES[mc.world.getEnvironmentAttributes().getAttributeValue(EnvironmentAttributes.MOON_PHASE_VISUAL, mc.player.getBlockPos()).getIndex()] // lol - ).getLocalDifficulty() + mc.level.getDifficulty().getDisplayName().getString(), + new DifficultyInstance( + mc.level.getDifficulty(), + mc.level.getGameTime(), + mc.level.getChunk(mc.player.blockPosition()).getInhabitedTime(), + DimensionType.MOON_BRIGHTNESS_PER_PHASE[mc.level.environmentAttributes().getValue(EnvironmentAttributes.MOON_PHASE, mc.player.blockPosition()).index()] // lol + ).getDifficulty() ); - info("Day: %d", mc.world.getTimeOfDay() / 24000L); + info("Day: %d", mc.level.getGameTime() / 24000L); info("Permission level: %s", formatPerms()); } public String formatPerms() { - PermissionPredicate permissions = mc.player.getPermissions(); + PermissionSet permissions = mc.player.permissions(); - if (permissions.hasPermission(DefaultPermissions.OWNERS)) return "4 (Owner)"; - else if (permissions.hasPermission(DefaultPermissions.ADMINS)) return "3 (Admin)"; - else if (permissions.hasPermission(DefaultPermissions.GAMEMASTERS)) return "2 (Gamemaster)"; - else if (permissions.hasPermission(DefaultPermissions.MODERATORS)) return "1 (Moderator)"; + if (permissions.hasPermission(Permissions.COMMANDS_OWNER)) return "4 (Owner)"; + else if (permissions.hasPermission(Permissions.COMMANDS_ADMIN)) return "3 (Admin)"; + else if (permissions.hasPermission(Permissions.COMMANDS_GAMEMASTER)) return "2 (Gamemaster)"; + else if (permissions.hasPermission(Permissions.COMMANDS_MODERATOR)) return "1 (Moderator)"; else return "0 (No Perms)"; } @@ -198,7 +198,7 @@ private void onTick(TickEvent.Post event) { @EventHandler private void onSendPacket(PacketEvent.Send event) { - if (tick && event.packet instanceof RequestCommandCompletionsC2SPacket) event.cancel(); + if (tick && event.packet instanceof ServerboundCommandSuggestionPacket) event.cancel(); } @EventHandler @@ -206,16 +206,16 @@ private void onReadPacket(PacketEvent.Receive event) { // should return the same set of plugins that command completing '/' would // the rationale is that since we should get this packet whenever we log into the server, we can capture it // straight away and not need to send a command completion packet for essentially the same results - if (event.packet instanceof CommandTreeS2CPacket packet) { - ClientPlayNetworkHandlerAccessor handler = (ClientPlayNetworkHandlerAccessor) event.connection.getPacketListener(); + if (event.packet instanceof ClientboundCommandsPacket packet) { + ClientPacketListenerAccessor handler = (ClientPacketListenerAccessor) event.connection.getPacketListener(); commandTreePlugins.clear(); alias = null; // This gets the root node of the command tree. From there, all of its children have to be of type // LiteralCommandNode, so we don't need to worry about checking or casting and can just grab the name - packet.getCommandTree( - CommandRegistryAccess.of(handler.meteor$getCombinedDynamicRegistries(), handler.meteor$getEnabledFeatures()), - ClientPlayNetworkHandlerAccessor.meteor$getCommandNodeFactory() + packet.getRoot( + CommandBuildContext.simple(handler.meteor$getRegistryAccess(), handler.meteor$getEnabledFeatures()), + ClientPacketListenerAccessor.meteor$getCommandNodeFactory() ).getChildren().forEach(node -> { String[] split = node.getName().split(":"); if (split.length > 1) { @@ -233,8 +233,8 @@ private void onReadPacket(PacketEvent.Receive event) { if (!tick) return; try { - if (event.packet instanceof CommandSuggestionsS2CPacket packet) { - Suggestions matches = packet.getSuggestions(); + if (event.packet instanceof ClientboundCommandSuggestionsPacket packet) { + Suggestions matches = packet.toSuggestions(); if (matches.isEmpty()) { error("An error occurred while trying to find plugins."); @@ -255,10 +255,9 @@ private void onReadPacket(PacketEvent.Receive event) { private String formatName(String name) { if (ANTICHEAT_LIST.contains(name.toLowerCase())) { - return String.format("%s%s(default)", Formatting.RED, name); - } - else if (Strings.CI.contains(name, "exploit") || Strings.CI.contains(name, "cheat") || Strings.CI.contains(name, "illegal")) { - return String.format("%s%s(default)", Formatting.RED, name); + return String.format("%s%s(default)", ChatFormatting.RED, name); + } else if (Strings.CI.contains(name, "exploit") || Strings.CI.contains(name, "cheat") || Strings.CI.contains(name, "illegal")) { + return String.format("%s%s(default)", ChatFormatting.RED, name); } return String.format("(highlight)%s(default)", name); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java index 1b20b66a55..bad82f72b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SettingCommand.java @@ -21,7 +21,7 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; public class SettingCommand extends Command { public SettingCommand() { @@ -29,7 +29,7 @@ public SettingCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { // Open hud screen builder.then( literal("hud") @@ -106,28 +106,28 @@ public void build(LiteralArgumentBuilder builder) { argument("module", ModuleArgumentType.create()) .then( argument("setting", SettingArgumentType.create()) - .executes(context -> { - // Get setting value - Setting setting = SettingArgumentType.get(context); - - ModuleArgumentType.get(context).info("Setting (highlight)%s(default) is (highlight)%s(default).", setting.title, setting.get()); - - return SINGLE_SUCCESS; - }) - .then( - argument("value", SettingValueArgumentType.create()) - .executes(context -> { - // Set setting value - Setting setting = SettingArgumentType.get(context); - String value = SettingValueArgumentType.get(context); - - if (setting.parse(value)) { - ModuleArgumentType.get(context).info("Setting (highlight)%s(default) changed to (highlight)%s(default).", setting.title, value); - } - - return SINGLE_SUCCESS; - }) - ) + .executes(context -> { + // Get setting value + Setting setting = SettingArgumentType.get(context); + + ModuleArgumentType.get(context).info("Setting (highlight)%s(default) is (highlight)%s(default).", setting.title, setting.get()); + + return SINGLE_SUCCESS; + }) + .then( + argument("value", SettingValueArgumentType.create()) + .executes(context -> { + // Set setting value + Setting setting = SettingArgumentType.get(context); + String value = SettingValueArgumentType.get(context); + + if (setting.parse(value)) { + ModuleArgumentType.get(context).info("Setting (highlight)%s(default) changed to (highlight)%s(default).", setting.title, value); + } + + return SINGLE_SUCCESS; + }) + ) ) ); } diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java index d54ed7cce9..4f36128a6b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SpectateCommand.java @@ -9,12 +9,12 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.commands.Command; import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; -import meteordevelopment.meteorclient.events.meteor.KeyEvent; +import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.orbit.EventHandler; -import net.minecraft.command.CommandSource; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; public class SpectateCommand extends Command { @@ -25,7 +25,7 @@ public SpectateCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("reset").executes(context -> { mc.setCameraEntity(mc.player); return SINGLE_SUCCESS; @@ -33,7 +33,7 @@ public void build(LiteralArgumentBuilder builder) { builder.then(argument("player", PlayerArgumentType.create()).executes(context -> { mc.setCameraEntity(PlayerArgumentType.get(context)); - mc.player.sendMessage(Text.literal("Sneak to un-spectate."), true); + mc.player.sendSystemMessage(Component.literal("Sneak to un-spectate.")); MeteorClient.EVENT_BUS.subscribe(shiftListener); return SINGLE_SUCCESS; })); @@ -41,8 +41,8 @@ public void build(LiteralArgumentBuilder builder) { private static class StaticListener { @EventHandler - private void onKey(KeyEvent event) { - if (Input.isPressed(mc.options.sneakKey)) { + private void onKey(KeyInputEvent event) { + if (Input.isPressed(mc.options.keyShift)) { mc.setCameraEntity(mc.player); event.cancel(); MeteorClient.EVENT_BUS.unsubscribe(this); @@ -51,7 +51,7 @@ private void onKey(KeyEvent event) { @EventHandler private void onMouse(MouseClickEvent event) { - if (Input.isPressed(mc.options.sneakKey)) { + if (Input.isPressed(mc.options.keyShift)) { mc.setCameraEntity(mc.player); event.cancel(); MeteorClient.EVENT_BUS.unsubscribe(this); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java index 1397af8f4a..73046f0f47 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/SwarmCommand.java @@ -24,14 +24,14 @@ import meteordevelopment.meteorclient.systems.modules.world.InfinityMiner; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.BlockStateArgument; -import net.minecraft.command.argument.BlockStateArgumentType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Style; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.commands.arguments.blocks.BlockInput; +import net.minecraft.commands.arguments.blocks.BlockStateArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -39,7 +39,7 @@ public class SwarmCommand extends Command { - private final static SimpleCommandExceptionType SWARM_NOT_ACTIVE = new SimpleCommandExceptionType(Text.literal("The swarm module must be active to use this command.")); + private final static SimpleCommandExceptionType SWARM_NOT_ACTIVE = new SimpleCommandExceptionType(Component.literal("The swarm module must be active to use this command.")); private @Nullable ObjectIntPair pendingConnection; public SwarmCommand() { @@ -47,13 +47,12 @@ public SwarmCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("disconnect").executes(context -> { Swarm swarm = Modules.get().get(Swarm.class); if (swarm.isActive()) { swarm.close(); - } - else { + } else { throw SWARM_NOT_ACTIVE.create(); } @@ -61,49 +60,49 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(literal("join") - .then(argument("ip", StringArgumentType.string()) - .then(argument("port", IntegerArgumentType.integer(0, 65535)) - .executes(context -> { - String ip = StringArgumentType.getString(context, "ip"); - int port = IntegerArgumentType.getInteger(context, "port"); - - pendingConnection = new ObjectIntImmutablePair<>(ip, port); - - info("Are you sure you want to connect to '%s:%s'?", ip, port); - info(Text.literal("Click here to confirm").setStyle(Style.EMPTY - .withFormatting(Formatting.UNDERLINE, Formatting.GREEN) - .withClickEvent(new MeteorClickEvent(".swarm join confirm")) - )); - - return SINGLE_SUCCESS; - }) - ) - ) - .then(literal("confirm").executes(ctx -> { - if (pendingConnection == null) { - error("No pending swarm connections."); + .then(argument("ip", StringArgumentType.string()) + .then(argument("port", IntegerArgumentType.integer(0, 65535)) + .executes(context -> { + String ip = StringArgumentType.getString(context, "ip"); + int port = IntegerArgumentType.getInteger(context, "port"); + + pendingConnection = new ObjectIntImmutablePair<>(ip, port); + + info("Are you sure you want to connect to '%s:%s'?", ip, port); + info(Component.literal("Click here to confirm").setStyle(Style.EMPTY + .applyFormats(ChatFormatting.UNDERLINE, ChatFormatting.GREEN) + .withClickEvent(new MeteorClickEvent(".swarm join confirm")) + )); + return SINGLE_SUCCESS; - } + }) + ) + ) + .then(literal("confirm").executes(ctx -> { + if (pendingConnection == null) { + error("No pending swarm connections."); + return SINGLE_SUCCESS; + } - Swarm swarm = Modules.get().get(Swarm.class); - swarm.enable(); + Swarm swarm = Modules.get().get(Swarm.class); + swarm.enable(); - swarm.close(); - swarm.mode.set(Swarm.Mode.Worker); - swarm.worker = new SwarmWorker(pendingConnection.left(), pendingConnection.rightInt()); + swarm.close(); + swarm.mode.set(Swarm.Mode.Worker); + swarm.worker = new SwarmWorker(pendingConnection.left(), pendingConnection.rightInt()); - pendingConnection = null; + pendingConnection = null; - try { - info("Connected to (highlight)%s.", swarm.worker.getConnection()); - } catch (NullPointerException e) { - error("Error connecting to swarm host."); - swarm.close(); - swarm.toggle(); - } + try { + info("Connected to (highlight)%s.", swarm.worker.getConnection()); + } catch (NullPointerException e) { + error("Error connecting to swarm host."); + swarm.close(); + swarm.toggle(); + } - return SINGLE_SUCCESS; - })) + return SINGLE_SUCCESS; + })) ); builder.then(literal("connections").executes(context -> { @@ -115,18 +114,16 @@ public void build(LiteralArgumentBuilder builder) { for (int i = 0; i < swarm.host.getConnections().length; i++) { SwarmConnection connection = swarm.host.getConnections()[i]; - if (connection != null) ChatUtils.info("(highlight)Worker %s(default): %s.", i, connection.getConnection()); + if (connection != null) + ChatUtils.info("(highlight)Worker %s(default): %s.", i, connection.getConnection()); } - } - else { + } else { warning("No active connections"); } - } - else if (swarm.isWorker()) { + } else if (swarm.isWorker()) { info("Connected to (highlight)%s", swarm.worker.getConnection()); } - } - else { + } else { throw SWARM_NOT_ACTIVE.create(); } @@ -134,201 +131,187 @@ else if (swarm.isWorker()) { })); builder.then(literal("follow").executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput() + " " + mc.player.getName().getString()); - } - else if (swarm.isWorker()) { - error("The follow host command must be used by the host."); + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput() + " " + mc.player.getName().getString()); + } else if (swarm.isWorker()) { + error("The follow host command must be used by the host."); + } + } else { + throw SWARM_NOT_ACTIVE.create(); } - } - else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - }).then(argument("player", PlayerArgumentType.create()).executes(context -> { - PlayerEntity playerEntity = PlayerArgumentType.get(context); + return SINGLE_SUCCESS; + }).then(argument("player", PlayerArgumentType.create()).executes(context -> { + Player playerEntity = PlayerArgumentType.get(context); - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } - else if (swarm.isWorker() && playerEntity != null) { - PathManagers.get().follow(entity -> entity.getName().getString().equalsIgnoreCase(playerEntity.getName().getString())); + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker() && playerEntity != null) { + PathManagers.get().follow(entity -> entity.getName().getString().equalsIgnoreCase(playerEntity.getName().getString())); + } + } else { + throw SWARM_NOT_ACTIVE.create(); } - } - else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - })) + return SINGLE_SUCCESS; + })) ); builder.then(literal("goto") - .then(argument("x", IntegerArgumentType.integer()) - .then(argument("z", IntegerArgumentType.integer()).executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } - else if (swarm.isWorker()) { - int x = IntegerArgumentType.getInteger(context, "x"); - int z = IntegerArgumentType.getInteger(context, "z"); - - PathManagers.get().moveTo(new BlockPos(x, 0, z), true); - } - } - else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - })) - ) + .then(argument("x", IntegerArgumentType.integer()) + .then(argument("z", IntegerArgumentType.integer()).executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + int x = IntegerArgumentType.getInteger(context, "x"); + int z = IntegerArgumentType.getInteger(context, "z"); + + PathManagers.get().moveTo(new BlockPos(x, 0, z), true); + } + } else { + throw SWARM_NOT_ACTIVE.create(); + } + return SINGLE_SUCCESS; + })) + ) ); builder.then(literal("infinity-miner").executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } - else if (swarm.isWorker()) { - runInfinityMiner(); - } - } - else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - }) - .then(argument("target", BlockStateArgumentType.blockState(REGISTRY_ACCESS)).executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } - else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).targetBlocks.set(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock())); - runInfinityMiner(); - } - } - else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - }) - .then(argument("repair", BlockStateArgumentType.blockState(REGISTRY_ACCESS)).executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } - else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).targetBlocks.set(List.of(context.getArgument("target", BlockStateArgument.class).getBlockState().getBlock())); - Modules.get().get(InfinityMiner.class).repairBlocks.set(List.of(context.getArgument("repair", BlockStateArgument.class).getBlockState().getBlock())); - runInfinityMiner(); - } - } - else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - }))) - .then(literal("logout").then(argument("logout", BoolArgumentType.bool()).executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + runInfinityMiner(); + } + } else { + throw SWARM_NOT_ACTIVE.create(); } - else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).logOut.set(BoolArgumentType.getBool(context, "logout")); + return SINGLE_SUCCESS; + }) + .then(argument("target", BlockStateArgument.block(REGISTRY_ACCESS)).executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + Modules.get().get(InfinityMiner.class).targetBlocks.set(List.of(context.getArgument("target", BlockInput.class).getState().getBlock())); + runInfinityMiner(); + } + } else { + throw SWARM_NOT_ACTIVE.create(); + } + return SINGLE_SUCCESS; + }) + .then(argument("repair", BlockStateArgument.block(REGISTRY_ACCESS)).executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + Modules.get().get(InfinityMiner.class).targetBlocks.set(List.of(context.getArgument("target", BlockInput.class).getState().getBlock())); + Modules.get().get(InfinityMiner.class).repairBlocks.set(List.of(context.getArgument("repair", BlockInput.class).getState().getBlock())); + runInfinityMiner(); + } + } else { + throw SWARM_NOT_ACTIVE.create(); + } + return SINGLE_SUCCESS; + }))) + .then(literal("logout").then(argument("logout", BoolArgumentType.bool()).executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + Modules.get().get(InfinityMiner.class).logOut.set(BoolArgumentType.getBool(context, "logout")); + } + } else { + throw SWARM_NOT_ACTIVE.create(); } - } - else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - }))) - .then(literal("walkhome").then(argument("walkhome", BoolArgumentType.bool()).executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } else if (swarm.isWorker()) { - Modules.get().get(InfinityMiner.class).walkHome.set(BoolArgumentType.getBool(context, "walkhome")); + return SINGLE_SUCCESS; + }))) + .then(literal("walkhome").then(argument("walkhome", BoolArgumentType.bool()).executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + Modules.get().get(InfinityMiner.class).walkHome.set(BoolArgumentType.getBool(context, "walkhome")); + } + } else { + throw SWARM_NOT_ACTIVE.create(); } - } else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - })))); + return SINGLE_SUCCESS; + })))); builder.then(literal("mine") - .then(argument("block", BlockStateArgumentType.blockState(REGISTRY_ACCESS)).executes(context -> { + .then(argument("block", BlockStateArgument.block(REGISTRY_ACCESS)).executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + swarm.worker.target = context.getArgument("block", BlockInput.class).getState().getBlock(); + } + } else { + throw SWARM_NOT_ACTIVE.create(); + } + return SINGLE_SUCCESS; + })) + ); + + builder.then(literal("toggle") + .then(argument("module", ModuleArgumentType.create()) + .executes(context -> { Swarm swarm = Modules.get().get(Swarm.class); if (swarm.isActive()) { if (swarm.isHost()) { swarm.host.sendMessage(context.getInput()); } else if (swarm.isWorker()) { - swarm.worker.target = context.getArgument("block", BlockStateArgument.class).getBlockState().getBlock(); + Module module = ModuleArgumentType.get(context); + module.toggle(); } } else { throw SWARM_NOT_ACTIVE.create(); } return SINGLE_SUCCESS; - })) - ); - - builder.then(literal("toggle") - .then(argument("module", ModuleArgumentType.create()) - .executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } else if (swarm.isWorker()) { - Module module = ModuleArgumentType.get(context); - module.toggle(); - } - } else { - throw SWARM_NOT_ACTIVE.create(); + }).then(literal("on") + .executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + Module m = ModuleArgumentType.get(context); + m.enable(); + } + } else { + throw SWARM_NOT_ACTIVE.create(); + } + return SINGLE_SUCCESS; + })).then(literal("off") + .executes(context -> { + Swarm swarm = Modules.get().get(Swarm.class); + if (swarm.isActive()) { + if (swarm.isHost()) { + swarm.host.sendMessage(context.getInput()); + } else if (swarm.isWorker()) { + Module m = ModuleArgumentType.get(context); + m.disable(); } - return SINGLE_SUCCESS; - }).then(literal("on") - .executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } else if (swarm.isWorker()) { - Module m = ModuleArgumentType.get(context); - m.enable(); - } - } else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - })).then(literal("off") - .executes(context -> { - Swarm swarm = Modules.get().get(Swarm.class); - if (swarm.isActive()) { - if (swarm.isHost()) { - swarm.host.sendMessage(context.getInput()); - } else if (swarm.isWorker()) { - Module m = ModuleArgumentType.get(context); - m.disable(); - } - } else { - throw SWARM_NOT_ACTIVE.create(); - } - return SINGLE_SUCCESS; - }) - ) + } else { + throw SWARM_NOT_ACTIVE.create(); + } + return SINGLE_SUCCESS; + }) ) + ) ); builder.then(literal("scatter").executes(context -> { diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java index c7fdbdd5e6..206c93be92 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/ToggleCommand.java @@ -11,7 +11,7 @@ import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import net.minecraft.command.CommandSource; +import net.minecraft.commands.SharedSuggestionProvider; import java.util.ArrayList; @@ -21,7 +21,7 @@ public ToggleCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder .then(literal("all") .then(literal("on") diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java index 13124e5a54..63105b4685 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/VClipCommand.java @@ -8,9 +8,9 @@ import com.mojang.brigadier.arguments.DoubleArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.commands.Command; -import net.minecraft.command.CommandSource; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; -import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; +import net.minecraft.network.protocol.game.ServerboundMoveVehiclePacket; public class VClipCommand extends Command { public VClipCommand() { @@ -18,7 +18,7 @@ public VClipCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(argument("blocks", DoubleArgumentType.doubleArg()).executes(context -> { double blocks = context.getArgument("blocks", Double.class); @@ -36,24 +36,24 @@ public void build(LiteralArgumentBuilder builder) { packetsRequired = 1; } - if (mc.player.hasVehicle()) { + if (mc.player.isPassenger()) { // Vehicle version // For each 10 blocks, send a vehicle move packet with no delta for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(VehicleMoveC2SPacket.fromVehicle(mc.player.getVehicle())); + mc.player.connection.send(ServerboundMoveVehiclePacket.fromEntity(mc.player.getVehicle())); } // Now send the final vehicle move packet - mc.player.getVehicle().setPosition(mc.player.getVehicle().getX(), mc.player.getVehicle().getY() + blocks, mc.player.getVehicle().getZ()); - mc.player.networkHandler.sendPacket(VehicleMoveC2SPacket.fromVehicle(mc.player.getVehicle())); + mc.player.getVehicle().setPos(mc.player.getVehicle().getX(), mc.player.getVehicle().getY() + blocks, mc.player.getVehicle().getZ()); + mc.player.connection.send(ServerboundMoveVehiclePacket.fromEntity(mc.player.getVehicle())); } else { // No vehicle version // For each 10 blocks, send a player move packet with no delta for (int packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.OnGroundOnly(true, mc.player.horizontalCollision)); + mc.player.connection.send(new ServerboundMovePlayerPacket.StatusOnly(true, mc.player.horizontalCollision)); } // Now send the final player move packet - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY() + blocks, mc.player.getZ(), true, mc.player.horizontalCollision)); - mc.player.setPosition(mc.player.getX(), mc.player.getY() + blocks, mc.player.getZ()); + mc.player.connection.send(new ServerboundMovePlayerPacket.Pos(mc.player.getX(), mc.player.getY() + blocks, mc.player.getZ(), true, mc.player.horizontalCollision)); + mc.player.setPos(mc.player.getX(), mc.player.getY() + blocks, mc.player.getZ()); } return SINGLE_SUCCESS; diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java index fe9ce8a74a..70bdb3fccd 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaspCommand.java @@ -11,19 +11,19 @@ import meteordevelopment.meteorclient.commands.arguments.PlayerArgumentType; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.AutoWasp; -import net.minecraft.command.CommandSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Text; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.network.chat.Component; public class WaspCommand extends Command { - private static final SimpleCommandExceptionType CANT_WASP_SELF = new SimpleCommandExceptionType(Text.literal("You cannot target yourself!")); + private static final SimpleCommandExceptionType CANT_WASP_SELF = new SimpleCommandExceptionType(Component.literal("You cannot target yourself!")); public WaspCommand() { super("wasp", "Sets the auto wasp target."); } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { AutoWasp wasp = Modules.get().get(AutoWasp.class); builder.then(literal("reset").executes(context -> { @@ -32,7 +32,7 @@ public void build(LiteralArgumentBuilder builder) { })); builder.then(argument("player", PlayerArgumentType.create()).executes(context -> { - PlayerEntity player = PlayerArgumentType.get(context); + Player player = PlayerArgumentType.get(context); if (player == mc.player) throw CANT_WASP_SELF.create(); diff --git a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java index 54082c09c2..f1216f230b 100644 --- a/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java +++ b/src/main/java/meteordevelopment/meteorclient/commands/commands/WaypointCommand.java @@ -14,9 +14,9 @@ import meteordevelopment.meteorclient.systems.waypoints.Waypoint; import meteordevelopment.meteorclient.systems.waypoints.Waypoints; import meteordevelopment.meteorclient.utils.player.PlayerUtils; -import net.minecraft.command.CommandSource; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.BlockPos; public class WaypointCommand extends Command { public WaypointCommand() { @@ -24,11 +24,11 @@ public WaypointCommand() { } @Override - public void build(LiteralArgumentBuilder builder) { + public void build(LiteralArgumentBuilder builder) { builder.then(literal("list").executes(context -> { if (Waypoints.get().isEmpty()) error("No created waypoints."); else { - info(Formatting.WHITE + "Created Waypoints:"); + info(ChatFormatting.WHITE + "Created Waypoints:"); for (Waypoint waypoint : Waypoints.get()) { info("Name: (highlight)'%s'(default), Dimension: (highlight)%s(default), Pos: (highlight)%s(default)", waypoint.name.get(), waypoint.dimension.get(), waypointPos(waypoint)); } @@ -38,10 +38,10 @@ public void build(LiteralArgumentBuilder builder) { builder.then(literal("get").then(argument("waypoint", WaypointArgumentType.create()).executes(context -> { Waypoint waypoint = WaypointArgumentType.get(context); - info("Name: " + Formatting.WHITE + waypoint.name.get()); - info("Actual Dimension: " + Formatting.WHITE + waypoint.dimension.get()); - info("Position: " + Formatting.WHITE + waypointFullPos(waypoint)); - info("Visible: " + (waypoint.visible.get() ? Formatting.GREEN + "True" : Formatting.RED + "False")); + info("Name: " + ChatFormatting.WHITE + waypoint.name.get()); + info("Actual Dimension: " + ChatFormatting.WHITE + waypoint.dimension.get()); + info("Position: " + ChatFormatting.WHITE + waypointFullPos(waypoint)); + info("Visible: " + (waypoint.visible.get() ? ChatFormatting.GREEN + "True" : ChatFormatting.RED + "False")); return SINGLE_SUCCESS; }))); @@ -80,10 +80,10 @@ private String waypointFullPos(Waypoint waypoint) { return "X: " + waypoint.pos.get().getX() + ", Y: " + waypoint.pos.get().getY() + ", Z: " + waypoint.pos.get().getZ(); } - private int addWaypoint(CommandContext context, boolean withCoords) { + private int addWaypoint(CommandContext context, boolean withCoords) { if (mc.player == null) return -1; - BlockPos pos = withCoords ? BlockPosArgumentType.getBlockPos(context, "pos") : mc.player.getBlockPos().up(2); + BlockPos pos = withCoords ? BlockPosArgumentType.getBlockPos(context, "pos") : mc.player.blockPosition().above(2); Waypoint waypoint = new Waypoint.Builder() .name(StringArgumentType.getString(context, "waypoint")) .pos(pos) diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/BoatMoveEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/BoatMoveEvent.java index 6abc337460..a63af9addb 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/BoatMoveEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/BoatMoveEvent.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.events.entity; -import net.minecraft.entity.vehicle.AbstractBoatEntity; +import net.minecraft.world.entity.vehicle.boat.AbstractBoat; public class BoatMoveEvent { private static final BoatMoveEvent INSTANCE = new BoatMoveEvent(); - public AbstractBoatEntity boat; + public AbstractBoat boat; - public static BoatMoveEvent get(AbstractBoatEntity entity) { + public static BoatMoveEvent get(AbstractBoat entity) { INSTANCE.boat = entity; return INSTANCE; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/DropItemsEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/DropItemsEvent.java index 42ebe9f960..b8611cc09f 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/DropItemsEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/DropItemsEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.entity; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; public class DropItemsEvent extends Cancellable { private static final DropItemsEvent INSTANCE = new DropItemsEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityAddedEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityAddedEvent.java index 639373073e..ca58b51009 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityAddedEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityAddedEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.entity; -import net.minecraft.entity.Entity; +import net.minecraft.world.entity.Entity; public class EntityAddedEvent { private static final EntityAddedEvent INSTANCE = new EntityAddedEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityDestroyEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityDestroyEvent.java index 05ffc91df3..4c0cebd6b9 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityDestroyEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityDestroyEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.entity; -import net.minecraft.entity.Entity; +import net.minecraft.world.entity.Entity; public class EntityDestroyEvent { private static final EntityDestroyEvent INSTANCE = new EntityDestroyEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityMoveEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityMoveEvent.java index 060712ab06..513c788d8e 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityMoveEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityMoveEvent.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.events.entity; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; public class EntityMoveEvent { private static final EntityMoveEvent INSTANCE = new EntityMoveEvent(); public Entity entity; - public Vec3d movement; + public Vec3 movement; - public static EntityMoveEvent get(Entity entity, Vec3d movement) { + public static EntityMoveEvent get(Entity entity, Vec3 movement) { INSTANCE.entity = entity; INSTANCE.movement = movement; return INSTANCE; diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityRemovedEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityRemovedEvent.java index b531cad1e2..9331c77f19 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/EntityRemovedEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/EntityRemovedEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.entity; -import net.minecraft.entity.Entity; +import net.minecraft.world.entity.Entity; public class EntityRemovedEvent { private static final EntityRemovedEvent INSTANCE = new EntityRemovedEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/AttackEntityEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/AttackEntityEvent.java index 2982cd5b4a..4c78f8fdb5 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/AttackEntityEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/AttackEntityEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.entity.player; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.entity.Entity; +import net.minecraft.world.entity.Entity; public class AttackEntityEvent extends Cancellable { private static final AttackEntityEvent INSTANCE = new AttackEntityEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/BreakBlockEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/BreakBlockEvent.java index bbea3fc82e..2cd3444155 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/BreakBlockEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/BreakBlockEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.entity.player; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; public class BreakBlockEvent extends Cancellable { private static final BreakBlockEvent INSTANCE = new BreakBlockEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/CanWalkOnFluidEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/CanWalkOnFluidEvent.java index e5fbfabe68..891a66cd03 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/CanWalkOnFluidEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/CanWalkOnFluidEvent.java @@ -5,17 +5,17 @@ package meteordevelopment.meteorclient.events.entity.player; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.level.material.FluidState; /** * As of writing, using any method that gets the players pose within this event will cause a crash. *

- * Getting the pose calls {@link meteordevelopment.meteorclient.mixin.EntityMixin#modifyGetPose(net.minecraft.entity.EntityPose)}, - * which calls {@link PlayerEntity#canChangeIntoPose(net.minecraft.entity.EntityPose)}, which + * Getting the pose calls {@link meteordevelopment.meteorclient.mixin.EntityMixin#modifyGetPose(Pose)}, + * which calls {@link net.minecraft.world.entity.player.Player#canPlayerFitWithinBlocksAndEntitiesWhen(Pose)}, which * calculates whether there is enough space to fit your bounding box if you change into that pose. This method ends up - * calling {@link LivingEntity#canWalkOnFluid(FluidState)}, causing this event to fire + * calling {@link LivingEntity#canStandOnFluid(FluidState)}, causing this event to fire * again and leading to a stack overflow crash. Introduced in * this pull request */ diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/DoItemUseEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/DoItemUseEvent.java index ce89b5630d..816873cd43 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/DoItemUseEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/DoItemUseEvent.java @@ -8,7 +8,7 @@ import meteordevelopment.meteorclient.events.Cancellable; /** - * Some of our other injections coming from {@link net.minecraft.client.MinecraftClient#doItemUse()} + * Some of our other injections coming from {@link net.minecraft.client.Minecraft#startUseItem()} * (e.g. InteractItemEvent) are called twice because the method loops over the Mainhand and the Offhand. This event is * only called once, before any interaction logic is called. */ diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/FinishUsingItemEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/FinishUsingItemEvent.java index 37a02f09d7..1f7d77ab39 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/FinishUsingItemEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/FinishUsingItemEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.entity.player; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; public class FinishUsingItemEvent { private static final FinishUsingItemEvent INSTANCE = new FinishUsingItemEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractBlockEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractBlockEvent.java index d1055d38c6..5cf52f72a6 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractBlockEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractBlockEvent.java @@ -6,16 +6,16 @@ package meteordevelopment.meteorclient.events.entity.player; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.BlockHitResult; public class InteractBlockEvent extends Cancellable { private static final InteractBlockEvent INSTANCE = new InteractBlockEvent(); - public Hand hand; + public InteractionHand hand; public BlockHitResult result; - public static InteractBlockEvent get(Hand hand, BlockHitResult result) { + public static InteractBlockEvent get(InteractionHand hand, BlockHitResult result) { INSTANCE.setCancelled(false); INSTANCE.hand = hand; INSTANCE.result = result; diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractEntityEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractEntityEvent.java index d0cba698f8..ce6611ac52 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractEntityEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractEntityEvent.java @@ -6,16 +6,16 @@ package meteordevelopment.meteorclient.events.entity.player; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.entity.Entity; -import net.minecraft.util.Hand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.InteractionHand; public class InteractEntityEvent extends Cancellable { private static final InteractEntityEvent INSTANCE = new InteractEntityEvent(); public Entity entity; - public Hand hand; + public InteractionHand hand; - public static InteractEntityEvent get(Entity entity, Hand hand) { + public static InteractEntityEvent get(Entity entity, InteractionHand hand) { INSTANCE.setCancelled(false); INSTANCE.entity = entity; INSTANCE.hand = hand; diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractItemEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractItemEvent.java index 4da48cc1db..85a3a71eeb 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractItemEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/InteractItemEvent.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.events.entity.player; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; public class InteractItemEvent { private static final InteractItemEvent INSTANCE = new InteractItemEvent(); - public Hand hand; - public ActionResult toReturn; + public InteractionHand hand; + public InteractionResult toReturn; - public static InteractItemEvent get(Hand hand) { + public static InteractItemEvent get(InteractionHand hand) { INSTANCE.hand = hand; INSTANCE.toReturn = null; diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/ItemUseCrosshairTargetEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/ItemUseCrosshairTargetEvent.java index 54aa247e0c..90ffa1edb3 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/ItemUseCrosshairTargetEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/ItemUseCrosshairTargetEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.entity.player; -import net.minecraft.util.hit.HitResult; +import net.minecraft.world.phys.HitResult; public class ItemUseCrosshairTargetEvent { private static final ItemUseCrosshairTargetEvent INSTANCE = new ItemUseCrosshairTargetEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PickItemsEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PickItemsEvent.java index 2d17e32965..6dc33ae491 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PickItemsEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PickItemsEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.entity.player; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; public class PickItemsEvent { private static final PickItemsEvent INSTANCE = new PickItemsEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlaceBlockEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlaceBlockEvent.java index f38a18a802..cc21aa2a97 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlaceBlockEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlaceBlockEvent.java @@ -6,8 +6,8 @@ package meteordevelopment.meteorclient.events.entity.player; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.block.Block; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.core.BlockPos; public class PlaceBlockEvent extends Cancellable { private static final PlaceBlockEvent INSTANCE = new PlaceBlockEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerMoveEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerMoveEvent.java index a9facc6452..faa1dfbdac 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerMoveEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerMoveEvent.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.events.entity.player; -import net.minecraft.entity.MovementType; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.phys.Vec3; public class PlayerMoveEvent { private static final PlayerMoveEvent INSTANCE = new PlayerMoveEvent(); - public MovementType type; - public Vec3d movement; + public MoverType type; + public Vec3 movement; - public static PlayerMoveEvent get(MovementType type, Vec3d movement) { + public static PlayerMoveEvent get(MoverType type, Vec3 movement) { INSTANCE.type = type; INSTANCE.movement = movement; return INSTANCE; diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.java index 38b8775661..faab9ee87c 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/PlayerTickMovementEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.entity.player; /** - * @see net.minecraft.client.network.ClientPlayerEntity#tickMovement() + * @see net.minecraft.client.entity.ClientAvatarState#updateBob(float) */ public class PlayerTickMovementEvent { private static final PlayerTickMovementEvent INSTANCE = new PlayerTickMovementEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/StartBreakingBlockEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/StartBreakingBlockEvent.java index d799efb15a..e51532cca7 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/StartBreakingBlockEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/StartBreakingBlockEvent.java @@ -6,8 +6,8 @@ package meteordevelopment.meteorclient.events.entity.player; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; public class StartBreakingBlockEvent extends Cancellable { private static final StartBreakingBlockEvent INSTANCE = new StartBreakingBlockEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/entity/player/StoppedUsingItemEvent.java b/src/main/java/meteordevelopment/meteorclient/events/entity/player/StoppedUsingItemEvent.java index 394dcb61ef..8daec28cf8 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/entity/player/StoppedUsingItemEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/entity/player/StoppedUsingItemEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.entity.player; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; public class StoppedUsingItemEvent { private static final StoppedUsingItemEvent INSTANCE = new StoppedUsingItemEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/ChangePerspectiveEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/ChangePerspectiveEvent.java index 746ff7701b..c1cb4fa51b 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/game/ChangePerspectiveEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/game/ChangePerspectiveEvent.java @@ -6,14 +6,14 @@ package meteordevelopment.meteorclient.events.game; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.client.option.Perspective; +import net.minecraft.client.CameraType; public class ChangePerspectiveEvent extends Cancellable { private static final ChangePerspectiveEvent INSTANCE = new ChangePerspectiveEvent(); - public Perspective perspective; + public CameraType perspective; - public static ChangePerspectiveEvent get(Perspective perspective) { + public static ChangePerspectiveEvent get(CameraType perspective) { INSTANCE.setCancelled(false); INSTANCE.perspective = perspective; return INSTANCE; diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java index 9a5bbf8d21..0f580655b1 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/game/ItemStackTooltipEvent.java @@ -6,21 +6,21 @@ package meteordevelopment.meteorclient.events.game; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.chat.Component; import java.util.List; public class ItemStackTooltipEvent { private final ItemStack itemStack; - private List list; + private List list; - public ItemStackTooltipEvent(ItemStack itemStack, List list) { + public ItemStackTooltipEvent(ItemStack itemStack, List list) { this.itemStack = itemStack; this.list = list; } - public List list() { + public List list() { return list; } @@ -28,23 +28,23 @@ public ItemStack itemStack() { return itemStack; } - public void appendStart(Text text) { + public void appendStart(Component text) { copyIfImmutable(); int index = list.isEmpty() ? 0 : 1; list.add(index, text); } - public void appendEnd(Text text) { + public void appendEnd(Component text) { copyIfImmutable(); list.add(text); } - public void append(int index, Text text) { + public void append(int index, Component text) { copyIfImmutable(); list.add(index, text); } - public void set(int index, Text text) { + public void set(int index, Component text) { copyIfImmutable(); list.set(index, text); } diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/OpenScreenEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/OpenScreenEvent.java index ad74317e88..d6d3db5ff7 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/game/OpenScreenEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/game/OpenScreenEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.game; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; public class OpenScreenEvent extends Cancellable { private static final OpenScreenEvent INSTANCE = new OpenScreenEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/game/ReceiveMessageEvent.java b/src/main/java/meteordevelopment/meteorclient/events/game/ReceiveMessageEvent.java index ac5f158364..e5a496d0b7 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/game/ReceiveMessageEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/game/ReceiveMessageEvent.java @@ -6,18 +6,18 @@ package meteordevelopment.meteorclient.events.game; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.client.gui.hud.MessageIndicator; -import net.minecraft.text.Text; +import net.minecraft.client.multiplayer.chat.GuiMessageTag; +import net.minecraft.network.chat.Component; public class ReceiveMessageEvent extends Cancellable { private static final ReceiveMessageEvent INSTANCE = new ReceiveMessageEvent(); - private Text message; - private MessageIndicator indicator; + private Component message; + private GuiMessageTag indicator; private boolean modified; public int id; - public static ReceiveMessageEvent get(Text message, MessageIndicator indicator, int id) { + public static ReceiveMessageEvent get(Component message, GuiMessageTag indicator, int id) { INSTANCE.setCancelled(false); INSTANCE.message = message; INSTANCE.indicator = indicator; @@ -26,20 +26,20 @@ public static ReceiveMessageEvent get(Text message, MessageIndicator indicator, return INSTANCE; } - public Text getMessage() { + public Component getMessage() { return message; } - public MessageIndicator getIndicator() { + public GuiMessageTag getIndicator() { return indicator; } - public void setMessage(Text message) { + public void setMessage(Component message) { this.message = message; this.modified = true; } - public void setIndicator(MessageIndicator indicator) { + public void setIndicator(GuiMessageTag indicator) { this.indicator = indicator; this.modified = true; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/meteor/KeyEvent.java b/src/main/java/meteordevelopment/meteorclient/events/meteor/KeyInputEvent.java similarity index 70% rename from src/main/java/meteordevelopment/meteorclient/events/meteor/KeyEvent.java rename to src/main/java/meteordevelopment/meteorclient/events/meteor/KeyInputEvent.java index e569d9f605..44c6ec5030 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/meteor/KeyEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/meteor/KeyInputEvent.java @@ -7,15 +7,14 @@ import meteordevelopment.meteorclient.events.Cancellable; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; -import net.minecraft.client.input.KeyInput; -public class KeyEvent extends Cancellable { - private static final KeyEvent INSTANCE = new KeyEvent(); +public class KeyInputEvent extends Cancellable { + private static final KeyInputEvent INSTANCE = new KeyInputEvent(); - public KeyInput input; + public net.minecraft.client.input.KeyEvent input; public KeyAction action; - public static KeyEvent get(KeyInput input, KeyAction action) { + public static KeyInputEvent get(net.minecraft.client.input.KeyEvent input, KeyAction action) { INSTANCE.setCancelled(false); INSTANCE.input = input; INSTANCE.action = action; diff --git a/src/main/java/meteordevelopment/meteorclient/events/meteor/MouseClickEvent.java b/src/main/java/meteordevelopment/meteorclient/events/meteor/MouseClickEvent.java index 9c5d679a04..ff98360486 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/meteor/MouseClickEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/meteor/MouseClickEvent.java @@ -7,17 +7,17 @@ import meteordevelopment.meteorclient.events.Cancellable; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; -import net.minecraft.client.gui.Click; -import net.minecraft.client.input.MouseInput; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.client.input.MouseButtonInfo; public class MouseClickEvent extends Cancellable { private static final MouseClickEvent INSTANCE = new MouseClickEvent(); - public Click click; - public MouseInput input; + public MouseButtonEvent click; + public MouseButtonInfo input; public KeyAction action; - public static MouseClickEvent get(Click click, KeyAction action) { + public static MouseClickEvent get(MouseButtonEvent click, KeyAction action) { INSTANCE.setCancelled(false); INSTANCE.click = click; INSTANCE.input = click.buttonInfo(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/packets/ContainerSlotUpdateEvent.java b/src/main/java/meteordevelopment/meteorclient/events/packets/ContainerSlotUpdateEvent.java index 8c81ee2d12..04fe4e95d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/ContainerSlotUpdateEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/ContainerSlotUpdateEvent.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.events.packets; -import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; +import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; public class ContainerSlotUpdateEvent { private static final ContainerSlotUpdateEvent INSTANCE = new ContainerSlotUpdateEvent(); - public ScreenHandlerSlotUpdateS2CPacket packet; + public ClientboundContainerSetSlotPacket packet; - public static ContainerSlotUpdateEvent get(ScreenHandlerSlotUpdateS2CPacket packet) { + public static ContainerSlotUpdateEvent get(ClientboundContainerSetSlotPacket packet) { INSTANCE.packet = packet; return INSTANCE; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/packets/InventoryEvent.java b/src/main/java/meteordevelopment/meteorclient/events/packets/InventoryEvent.java index 86fb87db82..37c3c898c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/InventoryEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/InventoryEvent.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.events.packets; -import net.minecraft.network.packet.s2c.play.InventoryS2CPacket; +import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket; public class InventoryEvent { private static final InventoryEvent INSTANCE = new InventoryEvent(); - public InventoryS2CPacket packet; + public ClientboundContainerSetContentPacket packet; - public static InventoryEvent get(InventoryS2CPacket packet) { + public static InventoryEvent get(ClientboundContainerSetContentPacket packet) { INSTANCE.packet = packet; return INSTANCE; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java index 977f8a1836..98d98c1bb3 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/PacketEvent.java @@ -6,15 +6,15 @@ package meteordevelopment.meteorclient.events.packets; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.packet.Packet; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; public class PacketEvent { public static class Receive extends Cancellable { public Packet packet; - public ClientConnection connection; + public Connection connection; - public Receive(Packet packet, ClientConnection connection) { + public Receive(Packet packet, Connection connection) { this.setCancelled(false); this.packet = packet; this.connection = connection; @@ -23,9 +23,9 @@ public Receive(Packet packet, ClientConnection connection) { public static class Send extends Cancellable { public Packet packet; - public ClientConnection connection; + public Connection connection; - public Send(Packet packet, ClientConnection connection) { + public Send(Packet packet, Connection connection) { this.setCancelled(false); this.packet = packet; this.connection = connection; @@ -44,9 +44,9 @@ public void sendSilently(Packet packet) { public static class Sent { public Packet packet; - public ClientConnection connection; + public Connection connection; - public Sent(Packet packet, ClientConnection connection) { + public Sent(Packet packet, Connection connection) { this.packet = packet; this.connection = connection; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/packets/PlaySoundPacketEvent.java b/src/main/java/meteordevelopment/meteorclient/events/packets/PlaySoundPacketEvent.java index 14cdeec2ac..8b43385378 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/packets/PlaySoundPacketEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/packets/PlaySoundPacketEvent.java @@ -5,15 +5,15 @@ package meteordevelopment.meteorclient.events.packets; -import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import net.minecraft.network.protocol.game.ClientboundSoundPacket; public class PlaySoundPacketEvent { private static final PlaySoundPacketEvent INSTANCE = new PlaySoundPacketEvent(); - public PlaySoundS2CPacket packet; + public ClientboundSoundPacket packet; - public static PlaySoundPacketEvent get(PlaySoundS2CPacket packet) { + public static PlaySoundPacketEvent get(ClientboundSoundPacket packet) { INSTANCE.packet = packet; return INSTANCE; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.java index 0361485e68..a824a5bdeb 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/ApplyTransformationEvent.java @@ -6,15 +6,15 @@ package meteordevelopment.meteorclient.events.render; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.client.render.model.json.Transformation; +import net.minecraft.client.resources.model.cuboid.ItemTransform; public class ApplyTransformationEvent extends Cancellable { private static final ApplyTransformationEvent INSTANCE = new ApplyTransformationEvent(); - public Transformation transformation; + public ItemTransform transformation; public boolean leftHanded; - public static ApplyTransformationEvent get(Transformation transformation, boolean leftHanded) { + public static ApplyTransformationEvent get(ItemTransform transformation, boolean leftHanded) { INSTANCE.setCancelled(false); INSTANCE.transformation = transformation; diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/ArmRenderEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/ArmRenderEvent.java index 775b653ca5..4ccea92c7d 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/ArmRenderEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/ArmRenderEvent.java @@ -6,16 +6,16 @@ package meteordevelopment.meteorclient.events.render; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Hand; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.InteractionHand; public class ArmRenderEvent { public static ArmRenderEvent INSTANCE = new ArmRenderEvent(); - public MatrixStack matrix; - public Hand hand; + public PoseStack matrix; + public InteractionHand hand; - public static ArmRenderEvent get(Hand hand, MatrixStack matrices) { + public static ArmRenderEvent get(InteractionHand hand, PoseStack matrices) { INSTANCE.matrix = matrices; INSTANCE.hand = hand; diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/HeldItemRendererEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/HeldItemRendererEvent.java index defe8c6110..915160067c 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/HeldItemRendererEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/HeldItemRendererEvent.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.events.render; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Hand; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.InteractionHand; public class HeldItemRendererEvent { private static final HeldItemRendererEvent INSTANCE = new HeldItemRendererEvent(); - public Hand hand; - public MatrixStack matrix; + public InteractionHand hand; + public PoseStack matrix; - public static HeldItemRendererEvent get(Hand hand, MatrixStack matrices) { + public static HeldItemRendererEvent get(InteractionHand hand, PoseStack matrices) { INSTANCE.hand = hand; INSTANCE.matrix = matrices; return INSTANCE; diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/Render2DEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/Render2DEvent.java index e394606e29..d3cce0ba3d 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/Render2DEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/Render2DEvent.java @@ -6,18 +6,18 @@ package meteordevelopment.meteorclient.events.render; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.GuiGraphicsExtractor; public class Render2DEvent { private static final Render2DEvent INSTANCE = new Render2DEvent(); - public DrawContext drawContext; + public GuiGraphicsExtractor graphics; public int screenWidth, screenHeight; public double frameTime; public float tickDelta; - public static Render2DEvent get(DrawContext drawContext, int screenWidth, int screenHeight, float tickDelta) { - INSTANCE.drawContext = drawContext; + public static Render2DEvent get(GuiGraphicsExtractor graphics, int screenWidth, int screenHeight, float tickDelta) { + INSTANCE.graphics = graphics; INSTANCE.screenWidth = screenWidth; INSTANCE.screenHeight = screenHeight; INSTANCE.frameTime = Utils.frameTime; diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java index 3c212c7057..9da14824f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/Render3DEvent.java @@ -7,19 +7,19 @@ import meteordevelopment.meteorclient.renderer.Renderer3D; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; public class Render3DEvent { private static final Render3DEvent INSTANCE = new Render3DEvent(); - public MatrixStack matrices; + public PoseStack matrices; public Renderer3D renderer; public Renderer3D depthRenderer; public double frameTime; public float tickDelta; public double offsetX, offsetY, offsetZ; - public static Render3DEvent get(MatrixStack matrices, Renderer3D renderer, Renderer3D depthRenderer, float tickDelta, double offsetX, double offsetY, double offsetZ) { + public static Render3DEvent get(PoseStack matrices, Renderer3D renderer, Renderer3D depthRenderer, float tickDelta, double offsetX, double offsetY, double offsetZ) { INSTANCE.matrices = matrices; INSTANCE.renderer = renderer; INSTANCE.depthRenderer = depthRenderer; diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/RenderBlockEntityEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/RenderBlockEntityEvent.java index 27c1595816..5b29079f9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/RenderBlockEntityEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/RenderBlockEntityEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.render; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.client.render.block.entity.state.BlockEntityRenderState; +import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; public class RenderBlockEntityEvent extends Cancellable { private static final RenderBlockEntityEvent INSTANCE = new RenderBlockEntityEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/RenderBossBarEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/RenderBossBarEvent.java index 44cc227457..371d194baf 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/RenderBossBarEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/RenderBossBarEvent.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.events.render; -import net.minecraft.client.gui.hud.ClientBossBar; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.LerpingBossEvent; +import net.minecraft.network.chat.Component; import java.util.Iterator; @@ -14,10 +14,10 @@ public class RenderBossBarEvent { public static class BossText { private static final BossText INSTANCE = new BossText(); - public ClientBossBar bossBar; - public Text name; + public LerpingBossEvent bossBar; + public Component name; - public static BossText get(ClientBossBar bossBar, Text name) { + public static BossText get(LerpingBossEvent bossBar, Component name) { INSTANCE.bossBar = bossBar; INSTANCE.name = name; return INSTANCE; @@ -38,9 +38,9 @@ public static BossSpacing get(int spacing) { public static class BossIterator { private static final BossIterator INSTANCE = new BossIterator(); - public Iterator iterator; + public Iterator iterator; - public static BossIterator get(Iterator iterator) { + public static BossIterator get(Iterator iterator) { INSTANCE.iterator = iterator; return INSTANCE; } diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/RenderItemEntityEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/RenderItemEntityEvent.java index fcf0cfb249..698afe0c0e 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/RenderItemEntityEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/RenderItemEntityEvent.java @@ -7,12 +7,12 @@ import meteordevelopment.meteorclient.events.Cancellable; import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; -import net.minecraft.client.item.ItemModelManager; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.state.ItemEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.ItemEntity; +import net.minecraft.client.renderer.item.ItemModelResolver; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.state.ItemEntityRenderState; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.entity.item.ItemEntity; import org.jspecify.annotations.Nullable; public class RenderItemEntityEvent extends Cancellable { @@ -22,13 +22,13 @@ public class RenderItemEntityEvent extends Cancellable { public ItemEntity itemEntity; public ItemEntityRenderState renderState; public float tickDelta; - public MatrixStack matrixStack; - public VertexConsumerProvider vertexConsumerProvider; + public PoseStack matrixStack; + public MultiBufferSource vertexConsumerProvider; public int light; - public ItemModelManager itemModelManager; - public OrderedRenderCommandQueue renderCommandQueue; + public ItemModelResolver itemModelManager; + public SubmitNodeCollector renderCommandQueue; - public static RenderItemEntityEvent get(ItemEntityRenderState renderState, float tickDelta, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int light, ItemModelManager itemModelManager, OrderedRenderCommandQueue renderCommandQueue) { + public static RenderItemEntityEvent get(ItemEntityRenderState renderState, float tickDelta, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int light, ItemModelResolver itemModelManager, SubmitNodeCollector renderCommandQueue) { INSTANCE.setCancelled(false); INSTANCE.itemEntity = (ItemEntity) ((IEntityRenderState) renderState).meteor$getEntity(); INSTANCE.renderState = renderState; diff --git a/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java b/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java index f632f4fb88..d70c247071 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/render/TooltipDataEvent.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.events.render; -import net.minecraft.item.tooltip.TooltipData; -import net.minecraft.item.ItemStack; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemStack; public class TooltipDataEvent { private static final TooltipDataEvent INSTANCE = new TooltipDataEvent(); - public TooltipData tooltipData; + public TooltipComponent tooltipData; public ItemStack itemStack; public static TooltipDataEvent get(ItemStack itemStack) { diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/BlockActivateEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/BlockActivateEvent.java index 52d082568f..f6730f9e29 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/BlockActivateEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/BlockActivateEvent.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.events.world; -import net.minecraft.block.BlockState; +import net.minecraft.world.level.block.state.BlockState; public class BlockActivateEvent { private static final BlockActivateEvent INSTANCE = new BlockActivateEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/BlockUpdateEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/BlockUpdateEvent.java index f4e0b583d9..57b8bcc0b6 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/BlockUpdateEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/BlockUpdateEvent.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.events.world; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; public class BlockUpdateEvent { private static final BlockUpdateEvent INSTANCE = new BlockUpdateEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java index 438c8f1f57..a04303fc63 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/ChunkDataEvent.java @@ -5,10 +5,11 @@ package meteordevelopment.meteorclient.events.world; -import net.minecraft.world.chunk.WorldChunk; +import net.minecraft.world.level.chunk.LevelChunk; /** - * @implNote Shouldn't be put in a {@link meteordevelopment.meteorclient.utils.misc.Pool} to avoid a race-condition, or in a {@link ThreadLocal} as it is shared between threads. * @author Crosby + * @implNote Shouldn't be put in a {@link meteordevelopment.meteorclient.utils.misc.Pool} to avoid a race-condition, or in a {@link ThreadLocal} as it is shared between threads. */ -public record ChunkDataEvent(WorldChunk chunk) {} +public record ChunkDataEvent(LevelChunk chunk) { +} diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java index b759780555..0853efacb8 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/CollisionShapeEvent.java @@ -7,9 +7,9 @@ import com.mojang.blaze3d.systems.RenderSystem; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.shapes.VoxelShape; public class CollisionShapeEvent extends Cancellable { private static final CollisionShapeEvent INSTANCE = new CollisionShapeEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/ParticleEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/ParticleEvent.java index 923c0ca82f..7ea54bae25 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/ParticleEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/ParticleEvent.java @@ -6,14 +6,14 @@ package meteordevelopment.meteorclient.events.world; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.particle.ParticleEffect; +import net.minecraft.core.particles.ParticleOptions; public class ParticleEvent extends Cancellable { private static final ParticleEvent INSTANCE = new ParticleEvent(); - public ParticleEffect particle; + public ParticleOptions particle; - public static ParticleEvent get(ParticleEffect particle) { + public static ParticleEvent get(ParticleOptions particle) { INSTANCE.setCancelled(false); INSTANCE.particle = particle; return INSTANCE; diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/PlaySoundEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/PlaySoundEvent.java index 30892b608f..e24b42aedb 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/PlaySoundEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/PlaySoundEvent.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.events.world; import meteordevelopment.meteorclient.events.Cancellable; -import net.minecraft.client.sound.SoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; public class PlaySoundEvent extends Cancellable { private static final PlaySoundEvent INSTANCE = new PlaySoundEvent(); diff --git a/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.java b/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.java index cc7a2333e1..fe8bf2801d 100644 --- a/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.java +++ b/src/main/java/meteordevelopment/meteorclient/events/world/ServerConnectBeginEvent.java @@ -5,15 +5,15 @@ package meteordevelopment.meteorclient.events.world; -import net.minecraft.client.network.ServerAddress; -import net.minecraft.client.network.ServerInfo; +import net.minecraft.client.multiplayer.resolver.ServerAddress; +import net.minecraft.client.multiplayer.ServerData; public class ServerConnectBeginEvent { private static final ServerConnectBeginEvent INSTANCE = new ServerConnectBeginEvent(); public ServerAddress address; - public ServerInfo info; + public ServerData info; - public static ServerConnectBeginEvent get(ServerAddress address, ServerInfo info) { + public static ServerConnectBeginEvent get(ServerAddress address, ServerData info) { INSTANCE.address = address; INSTANCE.info = info; return INSTANCE; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java index 0e10738e11..7ea1bc6004 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/DefaultSettingsWidgetFactory.java @@ -25,7 +25,7 @@ import meteordevelopment.meteorclient.systems.hud.elements.keyboard.KeyboardHud; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.language.I18n; import org.apache.commons.lang3.Strings; import java.util.ArrayList; @@ -251,17 +251,17 @@ private void keybindW(WTable table, KeybindSetting setting) { private void blockW(WTable table, BlockSetting setting) { WHorizontalList list = table.add(theme.horizontalList()).expandX().widget(); - WItem item = list.add(theme.item(setting.get().asItem().getDefaultStack())).widget(); + WItem item = list.add(theme.item(setting.get().asItem().getDefaultInstance())).widget(); WButton select = list.add(theme.button("Select")).widget(); select.action = () -> { BlockSettingScreen screen = new BlockSettingScreen(theme, setting); - screen.onClosed(() -> item.set(setting.get().asItem().getDefaultStack())); + screen.onClosed(() -> item.set(setting.get().asItem().getDefaultInstance())); mc.setScreen(screen); }; - reset(table, setting, () -> item.set(setting.get().asItem().getDefaultStack())); + reset(table, setting, () -> item.set(setting.get().asItem().getDefaultInstance())); } private void blockPosW(WTable table, BlockPosSetting setting) { @@ -281,17 +281,17 @@ private void blockListW(WTable table, BlockListSetting setting) { private void itemW(WTable table, ItemSetting setting) { WHorizontalList list = table.add(theme.horizontalList()).expandX().widget(); - WItem item = list.add(theme.item(setting.get().asItem().getDefaultStack())).widget(); + WItem item = list.add(theme.item(setting.get().asItem().getDefaultInstance())).widget(); WButton select = list.add(theme.button("Select")).widget(); select.action = () -> { ItemSettingScreen screen = new ItemSettingScreen(theme, setting); - screen.onClosed(() -> item.set(setting.get().getDefaultStack())); + screen.onClosed(() -> item.set(setting.get().getDefaultInstance())); mc.setScreen(screen); }; - reset(table, setting, () -> item.set(setting.get().getDefaultStack())); + reset(table, setting, () -> item.set(setting.get().getDefaultInstance())); } private void itemListW(WTable table, ItemListSetting setting) { @@ -347,17 +347,17 @@ private void blockDataW(WTable table, BlockDataSetting setting) { private void potionW(WTable table, PotionSetting setting) { WHorizontalList list = table.add(theme.horizontalList()).expandX().widget(); - WItemWithLabel item = list.add(theme.itemWithLabel(setting.get().potion, I18n.translate(setting.get().potion.getItem().getTranslationKey()))).widget(); + WItemWithLabel item = list.add(theme.itemWithLabel(setting.get().potion(), I18n.get(setting.get().potion().getItem().getDescriptionId()))).widget(); WButton button = list.add(theme.button("Select")).expandCellX().widget(); button.action = () -> { WidgetScreen screen = new PotionSettingScreen(theme, setting); - screen.onClosed(() -> item.set(setting.get().potion)); + screen.onClosed(() -> item.set(setting.get().potion())); mc.setScreen(screen); }; - reset(list, setting, () -> item.set(setting.get().potion)); + reset(list, setting, () -> item.set(setting.get().potion())); } private void fontW(WTable table, FontFaceSetting setting) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java index 2b52425f84..2582cce197 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiTheme.java @@ -28,10 +28,10 @@ import meteordevelopment.meteorclient.utils.misc.Keybind; import meteordevelopment.meteorclient.utils.misc.Names; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; import java.util.HashMap; import java.util.Map; @@ -59,45 +59,57 @@ public void beforeRender() { // Widgets public abstract WWindow window(WWidget icon, String title); + public WWindow window(String title) { return window(null, title); } public abstract WLabel label(String text, boolean title, double maxWidth); + public WLabel label(String text, boolean title) { return label(text, title, 0); } + public WLabel label(String text, double maxWidth) { return label(text, false, maxWidth); } + public WLabel label(String text) { return label(text, false); } public abstract WHorizontalSeparator horizontalSeparator(String text); + public WHorizontalSeparator horizontalSeparator() { return horizontalSeparator(null); } + public abstract WVerticalSeparator verticalSeparator(); protected abstract WButton button(String text, GuiTexture texture); + public WButton button(String text) { return button(text, null); } + public WButton button(GuiTexture texture) { return button(null, texture); } protected abstract WConfirmedButton confirmedButton(String text, String confirmText, GuiTexture texture); + public WConfirmedButton confirmedButton(String text, String confirmText) { return confirmedButton(text, confirmText, null); } + public WConfirmedButton confirmedButton(GuiTexture texture) { return confirmedButton(null, null, texture); } public abstract WMinus minus(); + public abstract WConfirmedMinus confirmedMinus(); + public abstract WPlus plus(); public abstract WCheckbox checkbox(boolean checked); @@ -105,23 +117,29 @@ public WConfirmedButton confirmedButton(GuiTexture texture) { public abstract WSlider slider(double value, double min, double max); public abstract WTextBox textBox(String text, String placeholder, CharFilter filter, Class renderer); + public WTextBox textBox(String text, CharFilter filter, Class renderer) { return textBox(text, null, filter, renderer); } + public WTextBox textBox(String text, String placeholder, CharFilter filter) { return textBox(text, placeholder, filter, null); } + public WTextBox textBox(String text, CharFilter filter) { return textBox(text, filter, null); } + public WTextBox textBox(String text, String placeholder) { return textBox(text, placeholder, (text1, c) -> true, null); } + public WTextBox textBox(String text) { return textBox(text, (text1, c) -> true, null); } public abstract WDropdown dropdown(T[] values, T value); + @SuppressWarnings("unchecked") public > WDropdown dropdown(T value) { Class klass = value.getDeclaringClass(); @@ -138,17 +156,21 @@ public > WDropdown dropdown(T value) { public WVerticalList verticalList() { return w(new WVerticalList()); } + public WHorizontalList horizontalList() { return w(new WHorizontalList()); } + public WTable table() { return w(new WTable()); } public abstract WSection section(String title, boolean expanded, WWidget headerWidget); + public WSection section(String title, boolean expanded) { return section(title, expanded, null); } + public WSection section(String title) { return section(title, true); } @@ -158,6 +180,7 @@ public WSection section(String title) { public WWidget module(Module module) { return module(module, module.title); } + public abstract WWidget module(Module module, String title); public abstract WQuad quad(Color color); @@ -169,9 +192,11 @@ public WWidget module(Module module) { public WItem item(ItemStack itemStack) { return w(new WItem(itemStack)); } + public WItemWithLabel itemWithLabel(ItemStack stack, String name) { return w(new WItemWithLabel(stack, name)); } + public WItemWithLabel itemWithLabel(ItemStack stack) { return itemWithLabel(stack, Names.get(stack.getItem())); } @@ -183,9 +208,11 @@ public WTexture texture(double width, double height, double rotation, Texture te public WIntEdit intEdit(int value, int min, int max, int sliderMin, int sliderMax, boolean noSlider) { return w(new WIntEdit(value, min, max, sliderMin, sliderMax, noSlider)); } + public WIntEdit intEdit(int value, int min, int max, int sliderMin, int sliderMax) { return w(new WIntEdit(value, min, max, sliderMin, sliderMax, false)); } + public WIntEdit intEdit(int value, int min, int max, boolean noSlider) { return w(new WIntEdit(value, min, max, 0, 0, noSlider)); } @@ -193,9 +220,11 @@ public WIntEdit intEdit(int value, int min, int max, boolean noSlider) { public WDoubleEdit doubleEdit(double value, double min, double max, double sliderMin, double sliderMax, int decimalPlaces, boolean noSlider) { return w(new WDoubleEdit(value, min, max, sliderMin, sliderMax, decimalPlaces, noSlider)); } + public WDoubleEdit doubleEdit(double value, double min, double max, double sliderMin, double sliderMax) { return w(new WDoubleEdit(value, min, max, sliderMin, sliderMax, 3, false)); } + public WDoubleEdit doubleEdit(double value, double min, double max) { return w(new WDoubleEdit(value, min, max, 0, 10, 3, false)); } @@ -215,6 +244,7 @@ public WKeybind keybind(Keybind keybind, Keybind defaultValue) { public WWidget settings(Settings settings, String filter) { return settingsFactory.create(this, settings, filter); } + public WWidget settings(Settings settings) { return settings(settings, ""); } @@ -224,6 +254,7 @@ public WWidget settings(Settings settings) { public TabScreen modulesScreen() { return new ModulesScreen(this); } + public boolean isModulesScreen(Screen screen) { return screen instanceof ModulesScreen; } @@ -285,6 +316,7 @@ public WidgetScreen proxiesScreen() { public double textWidth(String text, int length, boolean title) { return scale(textRenderer().getWidth(text, length, false) * (title ? TITLE_TEXT_SCALE : 1)); } + public double textWidth(String text) { return textWidth(text, text.length(), false); } @@ -292,6 +324,7 @@ public double textWidth(String text) { public double textHeight(boolean title) { return scale(textRenderer().getHeight() * (title ? TITLE_TEXT_SCALE : 1)); } + public double textHeight() { return textHeight(false); } @@ -321,13 +354,13 @@ protected T w(T widget) { // Saving / Loading @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("name", name); tag.put("settings", settings.toTag()); - NbtCompound configs = new NbtCompound(); + CompoundTag configs = new CompoundTag(); for (String id : windowConfigs.keySet()) { configs.put(id, windowConfigs.get(id).toTag()); } @@ -337,11 +370,11 @@ public NbtCompound toTag() { } @Override - public GuiTheme fromTag(NbtCompound tag) { + public GuiTheme fromTag(CompoundTag tag) { tag.getCompound("settings").ifPresent(settings::fromTag); tag.getCompound("windowConfigs").ifPresent(configs -> { - for (String id : configs.getKeys()) { + for (String id : configs.keySet()) { windowConfigs.put(id, new WindowConfig().fromTag(configs.getCompound(id).get())); } }); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java index e831fdc435..148614cc27 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/GuiThemes.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.gui.themes.meteor.MeteorGuiTheme; import meteordevelopment.meteorclient.utils.PostInit; import meteordevelopment.meteorclient.utils.PreInit; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; import java.io.File; @@ -38,9 +38,9 @@ public static void init() { public static void postInit() { if (FILE.exists()) { try { - NbtCompound tag = NbtIo.read(FILE.toPath()); + CompoundTag tag = NbtIo.read(FILE.toPath()); - if (tag != null) select(tag.getString("currentTheme", "")); + if (tag != null) select(tag.getStringOr("currentTheme", "")); } catch (IOException e) { e.printStackTrace(); } @@ -50,7 +50,7 @@ public static void postInit() { } public static void add(GuiTheme theme) { - for (ListIterator it = themes.listIterator(); it.hasNext();) { + for (ListIterator it = themes.listIterator(); it.hasNext(); ) { if (it.next().name.equals(theme.name)) { // Replace the old one with same name it.set(theme); @@ -86,7 +86,7 @@ public static void select(String name) { File file = new File(THEMES_FOLDER, get().name + ".nbt"); if (file.exists()) { - NbtCompound tag = NbtIo.read(file.toPath()); + CompoundTag tag = NbtIo.read(file.toPath()); if (tag != null) get().fromTag(tag); } } catch (IOException e) { @@ -117,7 +117,7 @@ public static String[] getNames() { private static void saveTheme() { if (get() != null) { try { - NbtCompound tag = get().toTag(); + CompoundTag tag = get().toTag(); THEMES_FOLDER.mkdirs(); NbtIo.write(tag, new File(THEMES_FOLDER, get().name + ".nbt").toPath()); @@ -129,7 +129,7 @@ private static void saveTheme() { private static void saveGlobal() { try { - NbtCompound tag = new NbtCompound(); + CompoundTag tag = new CompoundTag(); tag.putString("currentTheme", get().name); FOLDER.mkdirs(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java index bdc8983324..83405b2882 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/WidgetScreen.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui; +import com.mojang.blaze3d.platform.MacosUtil; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.gui.renderer.GuiDebugRenderer; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; @@ -17,14 +18,13 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.CursorStyle; import meteordevelopment.meteorclient.utils.misc.input.Input; -import net.minecraft.client.gui.Click; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.input.CharInput; -import net.minecraft.client.input.KeyInput; -import net.minecraft.client.util.MacWindowUtil; -import net.minecraft.text.Text; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; import java.util.ArrayList; import java.util.List; @@ -65,9 +65,9 @@ public abstract class WidgetScreen extends Screen { protected boolean firstInit = true; public WidgetScreen(GuiTheme theme, String title) { - super(Text.literal(title)); + super(Component.literal(title)); - this.parent = mc.currentScreen; + this.parent = mc.screen; this.root = new WFullScreenRoot(); this.theme = theme; @@ -119,40 +119,41 @@ public void onClosed(Runnable action) { } @Override - public boolean mouseClicked(Click click, boolean doubled) { + public boolean mouseClicked(MouseButtonEvent click, boolean doubled) { if (locked) return false; double mouseX = click.x(); double mouseY = click.y(); - double s = mc.getWindow().getScaleFactor(); + double s = mc.getWindow().getGuiScale(); mouseX *= s; mouseY *= s; - return root.mouseClicked(new Click(mouseX, mouseY, click.buttonInfo()), doubled); + return root.mouseClicked(new MouseButtonEvent(mouseX, mouseY, click.buttonInfo()), doubled); } @Override - public boolean mouseReleased(Click click) { + public boolean mouseReleased(MouseButtonEvent click) { if (locked) return false; double mouseX = click.x(); double mouseY = click.y(); - double s = mc.getWindow().getScaleFactor(); + double s = mc.getWindow().getGuiScale(); mouseX *= s; mouseY *= s; - if (debug && click.button() == GLFW_MOUSE_BUTTON_RIGHT) DEBUG_RENDERER.mouseReleased(root, new Click(mouseX, mouseY, click.buttonInfo()), 0); + if (debug && click.button() == GLFW_MOUSE_BUTTON_RIGHT) + DEBUG_RENDERER.mouseReleased(root, new MouseButtonEvent(mouseX, mouseY, click.buttonInfo()), 0); - return root.mouseReleased(new Click(mouseX, mouseY, click.buttonInfo())); + return root.mouseReleased(new MouseButtonEvent(mouseX, mouseY, click.buttonInfo())); } @Override public void mouseMoved(double mouseX, double mouseY) { if (locked) return; - double s = mc.getWindow().getScaleFactor(); + double s = mc.getWindow().getGuiScale(); mouseX *= s; mouseY *= s; @@ -172,7 +173,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmou } @Override - public boolean keyReleased(KeyInput input) { + public boolean keyReleased(KeyEvent input) { if (locked) return false; if ((input.modifiers() == GLFW_MOD_CONTROL || input.modifiers() == GLFW_MOD_SUPER) && input.key() == GLFW_KEY_9) { @@ -189,7 +190,7 @@ public boolean keyReleased(KeyInput input) { } @Override - public boolean keyPressed(KeyInput input) { + public boolean keyPressed(KeyEvent input) { if (locked) return false; boolean shouldReturn = root.keyPressed(input) || super.keyPressed(input); @@ -227,39 +228,44 @@ public boolean keyPressed(KeyInput input) { return true; } - boolean control = MacWindowUtil.IS_MAC ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; + boolean control = MacosUtil.IS_MACOS ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; return (control && input.key() == GLFW_KEY_C && toClipboard()) || (control && input.key() == GLFW_KEY_V && fromClipboard()); } - public void keyRepeated(KeyInput input) { + public void keyRepeated(KeyEvent input) { if (locked) return; root.keyRepeated(input); } @Override - public boolean charTyped(CharInput input) { + public boolean charTyped(CharacterEvent input) { if (locked) return false; return root.charTyped(input); } @Override - public void renderBackground(DrawContext context, int mouseX, int mouseY, float deltaTicks) { - if (this.client.world == null) { - this.renderPanoramaBackground(context, deltaTicks); + public void extractBackground(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float deltaTicks) { + if (this.minecraft.level == null) { + this.extractPanorama(graphics, deltaTicks); } } - public void renderCustom(DrawContext context, int mouseX, int mouseY, float delta) { - int s = mc.getWindow().getScaleFactor(); + @Override + public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float deltaTicks) { + super.extractRenderState(graphics, mouseX, mouseY, deltaTicks); + } + + public void renderCustom(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { + int s = mc.getWindow().getGuiScale(); mouseX *= s; mouseY *= s; animProgress += (delta / 20 * 14) * (closing ? -1 : 1); - animProgress = MathHelper.clamp(animProgress, 0, 1); + animProgress = Mth.clamp(animProgress, 0, 1); if (closing && (animProgress == 0 || parent != null)) { closeInternal(); @@ -270,18 +276,18 @@ public void renderCustom(DrawContext context, int mouseX, int mouseY, float delt // Apply projection without scaling Utils.unscaledProjection(); - onRenderBefore(context, delta); + onRenderBefore(graphics, delta); RENDERER.theme = theme; theme.beforeRender(); - RENDERER.begin(context); + RENDERER.begin(graphics); RENDERER.setAlpha(animProgress); root.render(RENDERER, mouseX, mouseY, delta / 20); RENDERER.setAlpha(1); RENDERER.end(); - boolean tooltip = RENDERER.renderTooltip(context, mouseX, mouseY, delta / 20); + boolean tooltip = RENDERER.renderTooltip(graphics, mouseX, mouseY, delta / 20); if (debug) { DEBUG_RENDERER.render(root); @@ -300,7 +306,8 @@ protected void runAfterRenderTasks() { } } - protected void onRenderBefore(DrawContext drawContext, float delta) {} + protected void onRenderBefore(GuiGraphicsExtractor graphics, float delta) { + } @Override public void resize(int width, int height) { @@ -309,7 +316,7 @@ public void resize(int width, int height) { } @Override - public void close() { + public void onClose() { if (!locked || lockedAllowClose) { closing = true; } @@ -347,7 +354,7 @@ private void closeInternal() { boolean preOnClose = onClose; onClose = true; - super.close(); + super.onClose(); removed(); onClose = preOnClose; @@ -361,7 +368,8 @@ private void loopWidgets(WWidget widget, Consumer action) { } } - protected void onClosed() {} + protected void onClosed() { + } public boolean toClipboard() { return false; @@ -377,7 +385,7 @@ public boolean shouldCloseOnEsc() { } @Override - public boolean shouldPause() { + public boolean isPauseScreen() { return false; } @@ -415,7 +423,7 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double calculateWidgetPositions(); valid = true; - mouseMoved(mc.mouse.getX(), mc.mouse.getY(), mc.mouse.getX(), mc.mouse.getY()); + mouseMoved(mc.mouseHandler.xpos(), mc.mouseHandler.ypos(), mc.mouseHandler.xpos(), mc.mouseHandler.ypos()); } return super.render(renderer, mouseX, mouseY, delta); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiDebugRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiDebugRenderer.java index 08a17e69d7..a778e7bee3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiDebugRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiDebugRenderer.java @@ -13,8 +13,8 @@ import meteordevelopment.meteorclient.renderer.MeshRenderer; import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.Click; +import net.minecraft.client.Minecraft; +import net.minecraft.client.input.MouseButtonEvent; public class GuiDebugRenderer { private static final Color CELL_COLOR = new Color(25, 225, 25); @@ -30,13 +30,13 @@ public void render(WWidget widget) { mesh.end(); MeshRenderer.begin() - .attachments(MinecraftClient.getInstance().getFramebuffer()) + .attachments(Minecraft.getInstance().getMainRenderTarget()) .pipeline(MeteorRenderPipelines.WORLD_COLORED_LINES) .mesh(mesh) .end(); } - public void mouseReleased(WWidget widget, Click click, int i) { + public void mouseReleased(WWidget widget, MouseButtonEvent click, int i) { if (widget == null) return; MeteorClient.LOG.info("{} {}", widget.getClass(), i); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java index 639b221ae9..2e4f70c019 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/GuiRenderer.java @@ -19,10 +19,10 @@ import meteordevelopment.meteorclient.utils.misc.Pool; import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; import java.util.List; @@ -60,7 +60,7 @@ public class GuiRenderer { public WWidget tooltipWidget; private double tooltipAnimProgress; - private DrawContext drawContext; + private GuiGraphicsExtractor graphics; public static GuiTexture addTexture(Identifier id) { return TEXTURE_PACKER.add(id); @@ -81,13 +81,13 @@ public static void init() { TEXTURE = TEXTURE_PACKER.pack(); } - public void begin(DrawContext drawContext) { - this.drawContext = drawContext; - this.drawContext.createNewRootLayer(); + public void begin(GuiGraphicsExtractor graphics) { + this.graphics = graphics; + this.graphics.nextStratum(); - var matrices = drawContext.getMatrices(); + var matrices = graphics.pose(); matrices.pushMatrix(); - matrices.scale(1.0f / mc.getWindow().getScaleFactor()); + matrices.scale(1.0f / mc.getWindow().getGuiScale()); scissorStart(0, 0, getWindowWidth(), getWindowHeight()); } @@ -98,8 +98,8 @@ public void end() { for (Runnable task : postTasks) task.run(); postTasks.clear(); - drawContext.getMatrices().popMatrix(); - drawContext.createNewRootLayer(); + graphics.pose().popMatrix(); + graphics.nextStratum(); } public void beginRender() { @@ -118,7 +118,7 @@ public void endRender(Scissor scissor) { rTex.end(); r.render(); - rTex.render("u_Texture", TEXTURE.getGlTextureView(), TEXTURE.getSampler()); + rTex.render("u_Texture", TEXTURE.getTextureView(), TEXTURE.getSampler()); // Normal text theme.textRenderer().begin(theme.scale(1)); @@ -153,7 +153,7 @@ public void scissorStart(double x, double y, double width, double height) { } scissorStack.push(scissorPool.get().set(x, y, width, height)); - drawContext.enableScissor((int) x, (int) y, (int) (x + width), (int) (y + height)); + graphics.enableScissor((int) x, (int) y, (int) (x + width), (int) (y + height)); beginRender(); } @@ -167,15 +167,15 @@ public void scissorEnd() { for (Runnable task : scissor.postTasks) task.run(); scissor.pop(); - drawContext.disableScissor(); + graphics.disableScissor(); if (!scissorStack.isEmpty()) beginRender(); scissorPool.free(scissor); } - public boolean renderTooltip(DrawContext drawContext, double mouseX, double mouseY, double delta) { + public boolean renderTooltip(GuiGraphicsExtractor graphics, double mouseX, double mouseY, double delta) { tooltipAnimProgress += (tooltip != null ? 1 : -1) * delta * 14; - tooltipAnimProgress = MathHelper.clamp(tooltipAnimProgress, 0, 1); + tooltipAnimProgress = Mth.clamp(tooltipAnimProgress, 0, 1); boolean toReturn = false; @@ -188,14 +188,16 @@ public boolean renderTooltip(DrawContext drawContext, double mouseX, double mous double deltaX = -tooltipWidget.x + mouseX + 12; double deltaY = -tooltipWidget.y + mouseY + 12; - if (mouseX + 12 + tooltipWidget.width > getWindowWidth()) deltaX = -tooltipWidget.x + getWindowWidth() - tooltipWidget.width; - if (mouseY + 12 + tooltipWidget.height > getWindowHeight()) deltaY = -tooltipWidget.y + getWindowHeight() - tooltipWidget.height; + if (mouseX + 12 + tooltipWidget.width > getWindowWidth()) + deltaX = -tooltipWidget.x + getWindowWidth() - tooltipWidget.width; + if (mouseY + 12 + tooltipWidget.height > getWindowHeight()) + deltaY = -tooltipWidget.y + getWindowHeight() - tooltipWidget.height; tooltipWidget.move(deltaX, deltaY); setAlpha(tooltipAnimProgress); - begin(drawContext); + begin(graphics); tooltipWidget.render(this, mouseX, mouseY, delta); end(); @@ -223,15 +225,19 @@ public void tooltip(String text) { public void quad(double x, double y, double width, double height, Color cTopLeft, Color cTopRight, Color cBottomRight, Color cBottomLeft) { r.quad(x, y, width, height, cTopLeft, cTopRight, cBottomRight, cBottomLeft); } + public void quad(double x, double y, double width, double height, Color colorLeft, Color colorRight) { quad(x, y, width, height, colorLeft, colorRight, colorRight, colorLeft); } + public void quad(double x, double y, double width, double height, Color color) { quad(x, y, width, height, color, color); } + public void quad(WWidget widget, Color color) { quad(widget.x, widget.y, widget.width, widget.height, color); } + public void quad(double x, double y, double width, double height, GuiTexture texture, Color color) { rTex.texQuad(x, y, width, height, texture.get(width, height), color); } @@ -241,7 +247,7 @@ public void rotatedQuad(double x, double y, double width, double height, double } public void triangle(double x1, double y1, double x2, double y2, double x3, double y3, Color color) { - r.triangle(x1, y1, x2, y2, x3, y3 ,color); + r.triangle(x1, y1, x2, y2, x3, y3, color); } public void text(String text, double x, double y, Color color, boolean title) { @@ -254,7 +260,7 @@ public void texture(double x, double y, double width, double height, double rota rTex.texQuad(x, y, width, height, rotation, 0, 0, 1, 1, WHITE); rTex.end(); - rTex.render(texture.getGlTextureView(), texture.getSampler()); + rTex.render(texture.getTextureView(), texture.getSampler()); }); } @@ -263,7 +269,7 @@ public void post(Runnable task) { } public void item(ItemStack itemStack, int x, int y, float scale, boolean overlay) { - RenderUtils.drawItem(drawContext, itemStack, x, y, scale, overlay, null, false); + RenderUtils.drawItem(graphics, itemStack, x, y, scale, overlay, null, false); } public void absolutePost(Runnable task) { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/renderer/Scissor.java b/src/main/java/meteordevelopment/meteorclient/gui/renderer/Scissor.java index 7c2af763bb..9b162ad371 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/Scissor.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/Scissor.java @@ -34,10 +34,16 @@ public Scissor set(double x, double y, double width, double height) { } public void push() { - ((IGpuDevice) RenderSystem.getDevice()).meteor$pushScissor(x, getWindowHeight() - y - height, width, height); + Object device = RenderSystem.getDevice(); + if (device instanceof IGpuDevice gpuDevice) { + gpuDevice.meteor$pushScissor(x, getWindowHeight() - y - height, width, height); + } } public void pop() { - ((IGpuDevice) RenderSystem.getDevice()).meteor$popScissor(); + Object device = RenderSystem.getDevice(); + if (device instanceof IGpuDevice gpuDevice) { + gpuDevice.meteor$popScissor(); + } } } 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 62e49699bc..f55047617f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/TexturePacker.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/renderer/packer/TexturePacker.java @@ -9,7 +9,7 @@ import com.mojang.blaze3d.textures.FilterMode; import com.mojang.blaze3d.textures.TextureFormat; import meteordevelopment.meteorclient.renderer.Texture; -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; import org.lwjgl.BufferUtils; import org.lwjgl.stb.STBImage; import org.lwjgl.stb.STBImageResize; @@ -33,7 +33,7 @@ public class TexturePacker { public GuiTexture add(Identifier id) { try { - InputStream in = mc.getResourceManager().getResource(id).get().getInputStream(); + InputStream in = mc.getResourceManager().getResource(id).get().open(); GuiTexture texture = new GuiTexture(); try (MemoryStack stack = MemoryStack.stackPush()) { @@ -80,7 +80,7 @@ private void addResized(GuiTexture texture, ByteBuffer srcImageBuffer, int srcWi int height = (int) (srcHeight * scaleFactor); ByteBuffer imageBuffer = BufferUtils.createByteBuffer(width * height * 4); - STBImageResize.stbir_resize_uint8(srcImageBuffer, srcWidth, srcHeight, 0, imageBuffer, width, height, 0, 4); + STBImageResize.stbir_resize_uint8_linear(srcImageBuffer, srcWidth, srcHeight, 0, imageBuffer, width, height, 0, 4); TextureRegion region = new TextureRegion(width, height); texture.add(region); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java index f738e187ee..b045d95641 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/CommitsScreen.java @@ -66,11 +66,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.getOperatingSystem().open(website); + if (website != null) l.add(theme.button("Website")).widget().action = () -> Util.getPlatform().openUri(website); l.add(theme.button("GitHub")).widget().action = () -> { GithubRepo repo = addon.getRepo(); - Util.getOperatingSystem().open(String.format("https://github.com/%s/tree/%s", repo.getOwnerName(), repo.branch())); + Util.getPlatform().openUri(String.format("https://github.com/%s/tree/%s", repo.getOwnerName(), repo.branch())); }; } @@ -91,7 +91,7 @@ private void populateError() { l.add(theme.label("Consider using an authentication token: ")).expandX(); l.add(theme.button("Authorization Guide")).widget().action = () -> { - Util.getOperatingSystem().open("https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens"); + Util.getPlatform().openUri("https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens"); }; } @@ -115,7 +115,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.getOperatingSystem().open(String.format("https://github.com/%s/commit/%s", addon.getRepo().getOwnerName(), commit.sha)); + 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.row(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java index 56d65b9229..abfab85c59 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ContainerInventoryScreen.java @@ -8,18 +8,18 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.gl.RenderPipelines; -import net.minecraft.client.gui.Click; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.input.KeyInput; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.BundleContentsComponent; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.BundleItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.core.component.DataComponents; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.BundleItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.BundleContents; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; @@ -32,12 +32,12 @@ * i couldn't figure out how to add proper outer borders for the GUI without adding custom textures. */ public class ContainerInventoryScreen extends Screen { - private static final Identifier SLOT_TEXTURE = Identifier.ofVanilla("container/slot"); + private static final Identifier SLOT_TEXTURE = Identifier.withDefaultNamespace("container/slot"); private static final int SLOT_SIZE = 18; private static final int SCREEN_WIDTH = 176; private final List containerItems; - private final PlayerInventory playerInventory; + private final Inventory playerInventory; private final int containerRows; private int x, y; @@ -45,14 +45,16 @@ public class ContainerInventoryScreen extends Screen { private int playerY; public ContainerInventoryScreen(ItemStack containerItem) { - super(containerItem.getName()); + super(containerItem.getHoverName()); this.playerInventory = mc.player.getInventory(); this.containerItems = new ArrayList<>(); if (containerItem.getItem() instanceof BundleItem) { - BundleContentsComponent bundleContents = containerItem.get(DataComponentTypes.BUNDLE_CONTENTS); + BundleContents bundleContents = containerItem.get(DataComponents.BUNDLE_CONTENTS); if (bundleContents != null) { - bundleContents.iterate().forEach(containerItems::add); + for (var template : bundleContents.items()) { + containerItems.add(template.create()); + } } } else { ItemStack[] tempItems = new ItemStack[64]; @@ -60,7 +62,7 @@ public ContainerInventoryScreen(ItemStack containerItem) { Collections.addAll(containerItems, tempItems); } - this.containerRows = Math.max(1, MathHelper.ceilDiv(containerItems.size(), 9)); + this.containerRows = Math.max(1, Mth.positiveCeilDiv(containerItems.size(), 9)); } @Override @@ -71,8 +73,8 @@ protected void init() { } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - super.render(context, mouseX, mouseY, delta); + public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { + super.extractRenderState(graphics, mouseX, mouseY, delta); baseX = x + 8; baseY = y + 18; @@ -82,7 +84,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { for (int row = 0; row < containerRows + 4; row++) { for (int col = 0; col < 9; col++) { int slotY = row < containerRows ? baseY + row * SLOT_SIZE : playerY + (row - containerRows) * SLOT_SIZE; - context.drawGuiTexture(RenderPipelines.GUI_TEXTURED, SLOT_TEXTURE, baseX + col * SLOT_SIZE, slotY, SLOT_SIZE, SLOT_SIZE); + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, SLOT_TEXTURE, baseX + col * SLOT_SIZE, slotY, SLOT_SIZE, SLOT_SIZE); } } @@ -92,8 +94,8 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { if (!item.isEmpty()) { int itemX = baseX + (i % 9) * SLOT_SIZE + 1; int itemY = baseY + (i / 9) * SLOT_SIZE + 1; - context.drawItem(item, itemX, itemY); - context.drawStackOverlay(textRenderer, item, itemX, itemY); + graphics.item(item, itemX, itemY); + graphics.itemDecorations(font, item, itemX, itemY); } } @@ -101,34 +103,34 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { for (int row = 0; row < 4; row++) { for (int col = 0; col < 9; col++) { int slotIndex = row < 3 ? 9 + row * 9 + col : col; - ItemStack item = playerInventory.getStack(slotIndex); + ItemStack item = playerInventory.getItem(slotIndex); if (!item.isEmpty()) { int itemX = baseX + col * SLOT_SIZE + 1; int itemY = playerY + row * SLOT_SIZE + 1; - context.drawItem(item, itemX, itemY); - context.drawStackOverlay(textRenderer, item, itemX, itemY); + graphics.item(item, itemX, itemY); + graphics.itemDecorations(font, item, itemX, itemY); } } } // drawing title headers - context.getMatrices().pushMatrix(); - context.getMatrices().translate((float) x, (float) y); - if (textRenderer != null) { - context.drawText(textRenderer, title, 8, 6, -12566464, false); - context.drawText(textRenderer, playerInventory.getDisplayName(), 8, 18 + containerRows * SLOT_SIZE + 10, -12566464, false); + graphics.pose().pushMatrix(); + graphics.pose().translate((float) x, (float) y); + if (font != null) { + graphics.text(font, title, 8, 6, -12566464, false); + graphics.text(font, playerInventory.getDisplayName(), 8, 18 + containerRows * SLOT_SIZE + 10, -12566464, false); } - context.getMatrices().popMatrix(); + graphics.pose().popMatrix(); // drawing the tooltip ItemStack item = getSelectedItem(mouseX, mouseY); if (!item.isEmpty()) { - context.drawTooltip(textRenderer, getTooltipFromItem(mc, item), item.getTooltipData(), mouseX, mouseY); + graphics.setTooltipForNextFrame(font, getTooltipFromItem(mc, item), item.getTooltipImage(), mouseX, mouseY); } } @Override - public boolean mouseClicked(Click click, boolean doubled) { + public boolean mouseClicked(MouseButtonEvent click, boolean doubled) { BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); ItemStack stack = getSelectedItem((int) click.x(), (int) click.y()); @@ -140,16 +142,16 @@ public boolean mouseClicked(Click click, boolean doubled) { } @Override - public boolean keyPressed(KeyInput input) { + public boolean keyPressed(KeyEvent input) { BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); - ItemStack stack = getSelectedItem((int) mc.mouse.getScaledX(mc.getWindow()), (int) mc.mouse.getScaledY(mc.getWindow())); + ItemStack stack = getSelectedItem((int) mc.mouseHandler.getScaledXPos(mc.getWindow()), (int) mc.mouseHandler.getScaledYPos(mc.getWindow())); if (tooltips.shouldOpenContents(input)) { return tooltips.openContent(stack); } - if (input.key() == GLFW.GLFW_KEY_ESCAPE || mc.options.inventoryKey.matchesKey(input)) { - close(); + if (input.key() == GLFW.GLFW_KEY_ESCAPE || mc.options.keyInventory.matches(input)) { + onClose(); return true; } @@ -170,7 +172,7 @@ private ItemStack getSelectedItem(int mouseX, int mouseY) { if (mouseY >= playerY && mouseY < playerY + 4 * SLOT_SIZE) { int row = (mouseY - playerY) / SLOT_SIZE; int slotIndex = row < 3 ? 9 + row * 9 + col : col; - return playerInventory.getStack(slotIndex); + return playerInventory.getItem(slotIndex); } return ItemStack.EMPTY; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java index 42e2550ae0..d71c5db681 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/EditBookTitleAndAuthorScreen.java @@ -9,13 +9,13 @@ import meteordevelopment.meteorclient.gui.WindowScreen; import meteordevelopment.meteorclient.gui.widgets.containers.WTable; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; -import net.minecraft.client.gui.screen.ingame.BookScreen; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.WrittenBookContentComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.network.packet.c2s.play.BookUpdateC2SPacket; -import net.minecraft.text.RawFilteredPair; -import net.minecraft.util.Hand; +import net.minecraft.client.gui.screens.inventory.BookViewScreen; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.protocol.game.ServerboundEditBookPacket; +import net.minecraft.server.network.Filterable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.WrittenBookContent; import java.util.ArrayList; import java.util.List; @@ -25,9 +25,9 @@ public class EditBookTitleAndAuthorScreen extends WindowScreen { private final ItemStack itemStack; - private final Hand hand; + private final InteractionHand hand; - public EditBookTitleAndAuthorScreen(GuiTheme theme, ItemStack itemStack, Hand hand) { + public EditBookTitleAndAuthorScreen(GuiTheme theme, ItemStack itemStack, InteractionHand hand) { super(theme, "Edit title & author"); this.itemStack = itemStack; this.hand = hand; @@ -38,25 +38,25 @@ public void initWidgets() { WTable t = add(theme.table()).expandX().widget(); t.add(theme.label("Title")); - WTextBox title = t.add(theme.textBox(itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT).title().get(mc.shouldFilterText()))).minWidth(220).expandX().widget(); + WTextBox title = t.add(theme.textBox(itemStack.get(DataComponents.WRITTEN_BOOK_CONTENT).title().get(mc.isTextFilteringEnabled()))).minWidth(220).expandX().widget(); t.row(); t.add(theme.label("Author")); - WTextBox author = t.add(theme.textBox(itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT).author())).minWidth(220).expandX().widget(); + WTextBox author = t.add(theme.textBox(itemStack.get(DataComponents.WRITTEN_BOOK_CONTENT).author())).minWidth(220).expandX().widget(); t.row(); t.add(theme.button("Done")).expandX().widget().action = () -> { - WrittenBookContentComponent component = itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT); - WrittenBookContentComponent newComponent = new WrittenBookContentComponent(RawFilteredPair.of(title.get()), author.get(), component.generation(), component.pages(), component.resolved()); - itemStack.set(DataComponentTypes.WRITTEN_BOOK_CONTENT, newComponent); + WrittenBookContent component = itemStack.get(DataComponents.WRITTEN_BOOK_CONTENT); + WrittenBookContent newComponent = new WrittenBookContent(Filterable.passThrough(title.get()), author.get(), component.generation(), component.pages(), component.resolved()); + itemStack.set(DataComponents.WRITTEN_BOOK_CONTENT, newComponent); - BookScreen.Contents contents = new BookScreen.Contents(itemStack.get(DataComponentTypes.WRITTEN_BOOK_CONTENT).getPages(mc.shouldFilterText())); + BookViewScreen.BookAccess contents = new BookViewScreen.BookAccess(itemStack.get(DataComponents.WRITTEN_BOOK_CONTENT).getPages(mc.isTextFilteringEnabled())); List pages = new ArrayList<>(contents.getPageCount()); for (int i = 0; i < contents.getPageCount(); i++) pages.add(contents.getPage(i).getString()); - mc.getNetworkHandler().sendPacket(new BookUpdateC2SPacket(hand == Hand.MAIN_HAND ? mc.player.getInventory().getSelectedSlot() : 40, pages, Optional.of(title.get()))); + mc.getConnection().send(new ServerboundEditBookPacket(hand == InteractionHand.MAIN_HAND ? mc.player.getInventory().getSelectedSlot() : 40, pages, Optional.of(title.get()))); - close(); + onClose(); }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/EditSystemScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/EditSystemScreen.java index e145632e04..5025804433 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/EditSystemScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/EditSystemScreen.java @@ -29,7 +29,7 @@ public void initWidgets() { WButton done = add(theme.button(isNew ? "Create" : "Save")).expandX().widget(); done.action = () -> { - if (save()) close(); + if (save()) onClose(); }; enterAction = done.action; @@ -46,6 +46,8 @@ protected void onClosed() { } public abstract T create(); + public abstract boolean save(); + public abstract Settings getSettings(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java index a9918bddfe..2fb34b1be4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModuleScreen.java @@ -26,7 +26,7 @@ import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; import meteordevelopment.orbit.EventHandler; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.Optional; @@ -157,11 +157,11 @@ private void onActiveModulesChanged(ActiveModulesChangedEvent event) { @Override public boolean toClipboard() { - NbtCompound tag = new NbtCompound(); + CompoundTag tag = new CompoundTag(); tag.putString("name", module.name); - NbtCompound settingsTag = module.settings.toTag(); + CompoundTag settingsTag = module.settings.toTag(); if (!settingsTag.isEmpty()) tag.put("settings", settingsTag); return NbtUtils.toClipboard(tag); @@ -169,11 +169,11 @@ public boolean toClipboard() { @Override public boolean fromClipboard() { - NbtCompound tag = NbtUtils.fromClipboard(); + CompoundTag tag = NbtUtils.fromClipboard(); if (tag == null) return false; - if (!tag.getString("name", "").equals(module.name)) return false; + if (!tag.getStringOr("name", "").equals(module.name)) return false; - Optional settings = tag.getCompound("settings"); + Optional settings = tag.getCompound("settings"); if (settings.isPresent()) module.settings.fromTag(settings.get()); else module.settings.reset(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java index 05e2e55f5b..7069c262c0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ModulesScreen.java @@ -5,6 +5,7 @@ package meteordevelopment.meteorclient.gui.screens; +import com.mojang.blaze3d.platform.MacosUtil; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.tabs.TabScreen; import meteordevelopment.meteorclient.gui.tabs.Tabs; @@ -19,10 +20,9 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.misc.NbtUtils; -import net.minecraft.client.input.KeyInput; -import net.minecraft.client.util.MacWindowUtil; -import net.minecraft.item.Items; -import net.minecraft.util.Pair; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.util.Tuple; +import net.minecraft.world.item.Items; import java.util.ArrayList; import java.util.List; @@ -86,16 +86,16 @@ protected WWindow createCategory(WContainer c, Category category, List m protected void createSearchW(WContainer w, String text) { if (!text.isEmpty()) { // Titles - List> modules = Modules.get().searchTitles(text); + List> modules = Modules.get().searchTitles(text); if (!modules.isEmpty()) { WSection section = w.add(theme.section("Modules")).expandX().widget(); section.spacing = 0; int count = 0; - for (Pair p : modules) { + for (Tuple p : modules) { if (count >= Config.get().moduleSearchCount.get() || count >= modules.size()) break; - section.add(theme.module(p.getLeft(), p.getRight())).expandX(); + section.add(theme.module(p.getA(), p.getB())).expandX(); count++; } } @@ -123,7 +123,7 @@ protected WWindow createSearch(WContainer c) { searchWindow = w; if (theme.categoryIcons()) { - w.beforeHeaderInit = wContainer -> wContainer.add(theme.item(Items.COMPASS.getDefaultStack())).pad(2); + w.beforeHeaderInit = wContainer -> wContainer.add(theme.item(Items.COMPASS.getDefaultInstance())).pad(2); } c.add(w); @@ -148,10 +148,10 @@ protected WWindow createSearch(WContainer c) { } @Override - public boolean keyPressed(KeyInput value) { + public boolean keyPressed(KeyEvent value) { if (locked) return false; - boolean cntrl = MacWindowUtil.IS_MAC ? value.modifiers() == GLFW_MOD_SUPER : value.modifiers() == GLFW_MOD_CONTROL; + boolean cntrl = MacosUtil.IS_MACOS ? value.modifiers() == GLFW_MOD_SUPER : value.modifiers() == GLFW_MOD_CONTROL; if (cntrl && value.key() == GLFW_KEY_F) { if (searchWindow != null) searchWindow.setExpanded(true); @@ -178,7 +178,7 @@ protected Cell createFavorites(WContainer c) { w.spacing = 0; if (theme.categoryIcons()) { - w.beforeHeaderInit = wContainer -> wContainer.add(theme.item(Items.NETHER_STAR.getDefaultStack())).pad(2); + w.beforeHeaderInit = wContainer -> wContainer.add(theme.item(Items.NETHER_STAR.getDefaultInstance())).pad(2); } Cell cell = c.add(w); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java index 7ec54b7472..1599e22dde 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/NotebotSongsScreen.java @@ -62,13 +62,13 @@ private void initSongsTable() { if (SongDecoders.hasDecoder(path)) { String name = path.getFileName().toString(); - if (Utils.searchTextDefault(name, filterText, false)){ + if (Utils.searchTextDefault(name, filterText, false)) { addPath(path); noSongsFound.set(false); } } }); - } catch (IOException e) { + } catch (IOException _) { table.add(theme.label("Missing meteor-client/notebot folder.")).expandCellX(); table.row(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesImportScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesImportScreen.java index 7a27d7e6b2..e3a069eb43 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesImportScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/ProxiesImportScreen.java @@ -24,6 +24,7 @@ public class ProxiesImportScreen extends WindowScreen { private final File file; + public ProxiesImportScreen(GuiTheme theme, File file) { super(theme, "Import Proxies"); this.file = file; @@ -82,7 +83,7 @@ public void initWidgets() { ProxyType type = ProxyType.parse(matcher.group(1)); if (type == null) { if (matcher.group(1) != null && matcher.group(1).equals("socks")) type = ProxyType.Socks5; - // if it has a password it's a socks5 proxy + // if it has a password it's a socks5 proxy else if (matcher.group("pass") != null) type = ProxyType.Socks5; else type = ProxyType.Socks4; } @@ -104,8 +105,7 @@ public void initWidgets() { if (proxies.add(proxy)) { list.add(theme.label("Imported proxy: " + proxy.name.get()).color(Color.GREEN)); success++; - } - else { + } else { list.add(theme.label("Proxy already exists: " + proxy.name.get()).color(Color.ORANGE)); fail++; } @@ -125,10 +125,10 @@ public void initWidgets() { WButton refresh = add(theme.button("Check proxies")).expandX().widget(); refresh.action = () -> { Proxies.get().checkProxies(false); - close(); + onClose(); }; WButton btnBack = add(theme.button("Back")).expandX().widget(); - btnBack.action = this::close; + btnBack.action = this::onClose; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java index 540dbe5741..04bc9abf35 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java @@ -33,7 +33,7 @@ public void initWidgets() { if (account.getType() == AccountType.Session) tokenLabel = ""; WButton copy = theme.button("Copy"); - copy.action = () -> mc.keyboard.setClipboard(e.getToken()); + copy.action = () -> mc.keyboardHandler.setClipboard(e.getToken()); l.add(theme.label(tokenLabel)); l.add(theme.label(account.getType() == AccountType.Session ? "Click to copy Token" : e.getToken()).color(Color.GRAY)).pad(5); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountsScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountsScreen.java index d620cacf63..6468df6501 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountsScreen.java @@ -68,7 +68,7 @@ public static void addAccount(@Nullable AddAccountScreen screen, AccountsScreen mc.execute(() -> { if (screen != null) { screen.locked = false; - screen.close(); + screen.onClose(); } parent.reload(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddCrackedAccountScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddCrackedAccountScreen.java index 253de00da6..7c95a6ea11 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddCrackedAccountScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddCrackedAccountScreen.java @@ -22,8 +22,8 @@ public void initWidgets() { // Name t.add(theme.label("Name: ")); - WTextBox name = t.add(theme.textBox("", "seasnail8169", (text, c) -> - /** @see net.minecraft.util.StringHelper#isValidPlayerName */ + WTextBox name = t.add(theme.textBox("", "seasnail8169", (_, c) -> + /// @see net.minecraft.util.StringUtil#isValidPlayerName c > 32 && c < 127 )).minWidth(400).expandX().widget(); name.setFocused(true); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddMicrosoftAccountScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddMicrosoftAccountScreen.java index 5c7d819ce3..71aa6fdb6d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddMicrosoftAccountScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AddMicrosoftAccountScreen.java @@ -27,7 +27,7 @@ public void initWidgets() { AccountsScreen.addAccount(null, parent, account); } - close(); + onClose(); }); add(theme.label("Please select the account to log into in your browser.")); @@ -36,17 +36,18 @@ public void initWidgets() { WHorizontalList l = add(theme.horizontalList()).expandX().widget(); WButton copy = l.add(theme.button("Copy link")).expandX().widget(); - copy.action = () -> mc.keyboard.setClipboard(url); + copy.action = () -> mc.keyboardHandler.setClipboard(url); WButton cancel = l.add(theme.button("Cancel")).expandX().widget(); cancel.action = () -> { MicrosoftLogin.stopServer(); - close(); + onClose(); }; } @Override - public void tick() {} + public void tick() { + } @Override public boolean shouldCloseOnEsc() { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java index edae8bff8f..f90d78961a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockDataSettingScreen.java @@ -16,10 +16,10 @@ import meteordevelopment.meteorclient.utils.misc.ICopyable; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.registry.Registries; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.Nullable; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -29,7 +29,7 @@ public class BlockDataSettingScreen & ISerializable & private boolean invalidate; public BlockDataSettingScreen(GuiTheme theme, BlockDataSetting setting) { - super(theme, "Configure Blocks", setting, setting.get(), Registries.BLOCK); + super(theme, "Configure Blocks", setting, setting.get(), BuiltInRegistries.BLOCK); this.setting = setting; } @@ -41,7 +41,7 @@ protected boolean includeValue(Block value) { @Override protected WWidget getValueWidget(Block block) { - return theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block)); + return theme.itemWithLabel(block.asItem().getDefaultInstance(), Names.get(block)); } @Override @@ -58,7 +58,7 @@ protected WWidget getDataWidget(Block block, @Nullable T blockData) { } @Override - protected void onRenderBefore(DrawContext drawContext, float delta) { + protected void onRenderBefore(GuiGraphicsExtractor graphics, float delta) { if (invalidate) { this.invalidateTable(); invalidate = false; @@ -69,7 +69,7 @@ protected void onRenderBefore(DrawContext drawContext, float delta) { protected String[] getValueNames(Block block) { return new String[]{ Names.get(block), - Registries.BLOCK.getId(block).toString() + BuiltInRegistries.BLOCK.getKey(block).toString() }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java index d0309ce85b..d93ce9472e 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockListSettingScreen.java @@ -10,21 +10,21 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.BlockListSetting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import java.util.function.Predicate; public class BlockListSettingScreen extends CollectionListSettingScreen { public BlockListSettingScreen(GuiTheme theme, BlockListSetting setting) { - super(theme, "Select Blocks", setting, setting.get(), Registries.BLOCK); + super(theme, "Select Blocks", setting, setting.get(), BuiltInRegistries.BLOCK); } @Override protected boolean includeValue(Block value) { - if (Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner")) { + if (BuiltInRegistries.BLOCK.getKey(value).getPath().endsWith("_wall_banner")) { return false; } @@ -36,22 +36,22 @@ protected boolean includeValue(Block value) { @Override protected WWidget getValueWidget(Block value) { - return theme.itemWithLabel(value.asItem().getDefaultStack(), Names.get(value)); + return theme.itemWithLabel(value.asItem().getDefaultInstance(), Names.get(value)); } @Override protected String[] getValueNames(Block value) { return new String[]{ Names.get(value), - Registries.BLOCK.getId(value).toString() + BuiltInRegistries.BLOCK.getKey(value).toString() }; } @Override protected Block getAdditionalValue(Block value) { - String path = Registries.BLOCK.getId(value).getPath(); + String path = BuiltInRegistries.BLOCK.getKey(value).getPath(); if (!path.endsWith("_banner")) return null; - return Registries.BLOCK.get(Identifier.ofVanilla(path.substring(0, path.length() - 6) + "wall_banner")); + return BuiltInRegistries.BLOCK.getValue(Identifier.withDefaultNamespace(path.substring(0, path.length() - 6) + "wall_banner")); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockSettingScreen.java index ae4b4faa5b..06b242a4e7 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/BlockSettingScreen.java @@ -13,9 +13,9 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.settings.BlockSetting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.registry.Registries; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import org.apache.commons.lang3.Strings; public class BlockSettingScreen extends WindowScreen { @@ -49,18 +49,18 @@ public void initWidgets() { } private void initTable() { - for (Block block : Registries.BLOCK) { + for (Block block : BuiltInRegistries.BLOCK) { if (setting.filter != null && !setting.filter.test(block)) continue; if (skipValue(block)) continue; - WItemWithLabel item = theme.itemWithLabel(block.asItem().getDefaultStack(), Names.get(block)); + WItemWithLabel item = theme.itemWithLabel(block.asItem().getDefaultInstance(), Names.get(block)); if (!filterText.isEmpty() && !Strings.CI.contains(item.getLabelText(), filterText)) continue; table.add(item); WButton select = table.add(theme.button("Select")).expandCellX().right().widget(); select.action = () -> { setting.set(block); - close(); + onClose(); }; table.row(); @@ -68,6 +68,6 @@ private void initTable() { } protected boolean skipValue(Block value) { - return value == Blocks.AIR || Registries.BLOCK.getId(value).getPath().endsWith("_wall_banner"); + return value == Blocks.AIR || BuiltInRegistries.BLOCK.getKey(value).getPath().endsWith("_wall_banner"); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java index 68c1b3a10f..74ea00918b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ColorSettingScreen.java @@ -20,13 +20,13 @@ import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.gui.Click; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.util.Mth; import static meteordevelopment.meteorclient.MeteorClient.mc; public class ColorSettingScreen extends WindowScreen { - private static final Color[] HUE_COLORS = { new Color(255, 0, 0), new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 255, 255), new Color(0, 0, 255), new Color(255, 0, 255), new Color(255, 0, 0) }; + private static final Color[] HUE_COLORS = {new Color(255, 0, 0), new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 255, 255), new Color(0, 0, 255), new Color(255, 0, 255), new Color(255, 0, 0)}; private static final Color WHITE = new Color(255, 255, 255); private static final Color BLACK = new Color(0, 0, 0); @@ -93,7 +93,7 @@ public void initWidgets() { WHorizontalList bottomList = add(theme.horizontalList()).expandX().widget(); WButton backButton = bottomList.add(theme.button("Back")).expandX().widget(); - backButton.action = this::close; + backButton.action = this::onClose; WButton copyButton = bottomList.add(theme.button(GuiRenderer.COPY)).widget(); copyButton.action = this::toClipboard; @@ -171,7 +171,7 @@ private void hsvChanged() { double b = 0; boolean calculated = false; - if(brightnessQuad.saturation <= 0.0) { + if (brightnessQuad.saturation <= 0.0) { r = brightnessQuad.value; g = brightnessQuad.value; b = brightnessQuad.value; @@ -278,7 +278,7 @@ void calculateFromColor(Color c, boolean calculateNow) { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (doubled) return false; if (mouseOver) { @@ -296,7 +296,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (dragging) { dragging = false; setFocused(false); @@ -366,7 +366,7 @@ public boolean toClipboard() { @Override public boolean fromClipboard() { if (!NbtUtils.fromClipboard(setting.get())) { - String clipboard = mc.keyboard.getClipboard().trim(); + String clipboard = mc.keyboardHandler.getClipboard().trim(); SettingColor parsed; parsed = parseRGBA(clipboard); @@ -396,8 +396,7 @@ private SettingColor parseRGBA(String string) { try { color = new SettingColor(Integer.parseInt(rgba[0]), Integer.parseInt(rgba[1]), Integer.parseInt(rgba[2])); if (rgba.length == 4) color.a = Integer.parseInt(rgba[3]); - } - catch (NumberFormatException e) { + } catch (NumberFormatException _) { return null; } @@ -413,8 +412,7 @@ private SettingColor parseHex(String string) { try { color = new SettingColor(Integer.parseInt(hex.substring(0, 2), 16), Integer.parseInt(hex.substring(2, 4), 16), Integer.parseInt(hex.substring(4, 6), 16)); if (hex.length() == 8) color.a = Integer.parseInt(hex.substring(6, 8), 16); - } - catch (NumberFormatException e) { + } catch (NumberFormatException _) { return null; } @@ -445,10 +443,10 @@ void calculateFromSetting(boolean calculateNow) { double min, max, delta; min = Math.min(c.r, c.g); - min = min < c.b ? min : c.b; + min = min < c.b ? min : c.b; max = Math.max(c.r, c.g); - max = max > c.b ? max : c.b; + max = max > c.b ? max : c.b; delta = max - min; if (delta < 0.00001) { @@ -500,7 +498,7 @@ void calculateColor() { int i; hh = hueAngle; - if(hh >= 360.0) hh = 0.0; + if (hh >= 360.0) hh = 0.0; hh /= 60.0; i = (int) hh; ff = hh - i; @@ -552,7 +550,7 @@ void calculateColor() { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (doubled) return false; if (mouseOver) { @@ -570,7 +568,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (dragging) { dragging = false; setFocused(false); @@ -584,7 +582,7 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double if (dragging) { if (mouseX >= this.x && mouseX <= this.x + width) { handleX += mouseX - lastMouseX; - handleX = MathHelper.clamp(handleX, 0, width); + handleX = Mth.clamp(handleX, 0, width); } else { if (handleX > 0 && mouseX < this.x) handleX = 0; else if (handleX < width && mouseX > this.x + width) handleX = width; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java index f6dad94ea0..bbe8a6baa4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EnchantmentListSettingScreen.java @@ -10,27 +10,27 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.enchantment.Enchantment; import java.util.Set; public class EnchantmentListSettingScreen extends DynamicRegistryListSettingScreen { - public EnchantmentListSettingScreen(GuiTheme theme, Setting>> setting) { - super(theme, "Select Enchantments", setting, setting.get(), RegistryKeys.ENCHANTMENT); + public EnchantmentListSettingScreen(GuiTheme theme, Setting>> setting) { + super(theme, "Select Enchantments", setting, setting.get(), Registries.ENCHANTMENT); } @Override - protected WWidget getValueWidget(RegistryKey value) { + protected WWidget getValueWidget(ResourceKey value) { return theme.label(Names.get(value)); } @Override - protected String[] getValueNames(RegistryKey value) { + protected String[] getValueNames(ResourceKey value) { return new String[]{ Names.get(value), - value.getValue().toString() + value.identifier().toString() }; } } 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 4cd2223638..70788f828d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/EntityTypeListSettingScreen.java @@ -19,12 +19,12 @@ import meteordevelopment.meteorclient.settings.EntityTypeListSetting; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.entity.EntityType; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.util.Pair; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.Tuple; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import java.util.ArrayList; import java.util.Comparator; @@ -74,7 +74,7 @@ public void initWidgets() { for (EntityType entityType : setting.get()) { if (setting.filter == null || setting.filter.test(entityType)) { - switch (entityType.getSpawnGroup()) { + switch (entityType.getCategory()) { case CREATURE -> hasAnimal++; case WATER_AMBIENT, WATER_CREATURE, UNDERGROUND_WATER_CREATURE, AXOLOTLS -> hasWaterAnimal++; case MONSTER -> hasMonster++; @@ -136,13 +136,13 @@ public void initWidgets() { Cell miscCell = add(misc).expandX(); miscT = misc.add(theme.table()).expandX().widget(); - var spawnEggItems = Registries.ITEM.stream() - .filter(item -> item.getComponents().contains(DataComponentTypes.ENTITY_DATA)) + var spawnEggItems = BuiltInRegistries.ITEM.stream() + .filter(item -> item.components().has(DataComponents.ENTITY_DATA)) .toList(); Consumer> entityTypeForEach = entityType -> { if (setting.filter == null || setting.filter.test(entityType)) { - switch (entityType.getSpawnGroup()) { + switch (entityType.getCategory()) { case CREATURE -> { animalsE.add(entityType); addEntityType(animalsT, animalsC, entityType, spawnEggItems); @@ -169,17 +169,17 @@ public void initWidgets() { // Sort all entities if (filterText.isEmpty()) { - Registries.ENTITY_TYPE.forEach(entityTypeForEach); + BuiltInRegistries.ENTITY_TYPE.forEach(entityTypeForEach); } else { - List, Integer>> entities = new ArrayList<>(); - Registries.ENTITY_TYPE.forEach(entity -> { + List, Integer>> entities = new ArrayList<>(); + BuiltInRegistries.ENTITY_TYPE.forEach(entity -> { int words = Utils.searchInWords(Names.get(entity), filterText); int diff = Utils.searchLevenshteinDefault(Names.get(entity), filterText, false); - if (words > 0 || diff < Names.get(entity).length() / 2) entities.add(new Pair<>(entity, -diff)); + if (words > 0 || diff < Names.get(entity).length() / 2) entities.add(new Tuple<>(entity, -diff)); }); - entities.sort(Comparator.comparingInt(value -> -value.getRight())); - for (Pair, Integer> pair : entities) entityTypeForEach.accept(pair.getLeft()); + entities.sort(Comparator.comparingInt(value -> -value.getB())); + for (Tuple, Integer> pair : entities) entityTypeForEach.accept(pair.getA()); } if (animalsT.cells.isEmpty()) list.cells.remove(animalsCell); @@ -197,8 +197,7 @@ public void initWidgets() { if (!monstersT.cells.isEmpty()) monsters.setExpanded(true); if (!ambientT.cells.isEmpty()) ambient.setExpanded(true); if (!miscT.cells.isEmpty()) misc.setExpanded(true); - } - else { + } else { if (!animalsT.cells.isEmpty()) animals.setExpanded(false); if (!waterAnimalsT.cells.isEmpty()) waterAnimals.setExpanded(false); if (!monstersT.cells.isEmpty()) monsters.setExpanded(false); @@ -235,11 +234,11 @@ private void addEntityType(WTable table, WCheckbox tableCheckbox, EntityType ItemStack stack = null; for (var item : spawnEggItems) { - var component = item.getComponents().get(DataComponentTypes.ENTITY_DATA); + var component = item.components().get(DataComponents.ENTITY_DATA); //noinspection DataFlowIssue - if (component.getType() == entityType) { - stack = item.getDefaultStack(); + if (component.type() == entityType) { + stack = item.getDefaultInstance(); break; } } @@ -263,7 +262,7 @@ private void addEntityType(WTable table, WCheckbox tableCheckbox, EntityType a.action = () -> { if (a.checked) { setting.get().add(entityType); - switch (entityType.getSpawnGroup()) { + switch (entityType.getCategory()) { case CREATURE -> { if (hasAnimal == 0) tableCheckbox.checked = true; hasAnimal++; @@ -287,7 +286,7 @@ private void addEntityType(WTable table, WCheckbox tableCheckbox, EntityType } } else { if (setting.get().remove(entityType)) { - switch (entityType.getSpawnGroup()) { + switch (entityType.getCategory()) { case CREATURE -> { hasAnimal--; if (hasAnimal == 0) tableCheckbox.checked = false; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/FontFaceSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/FontFaceSettingScreen.java index 6cc4f711db..73bb7727ab 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/FontFaceSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/FontFaceSettingScreen.java @@ -83,7 +83,7 @@ private void initTable() { WButton select = table.add(theme.button("Select")).expandCellX().right().widget(); select.action = () -> { setting.set(fontFamily.get(dropdown.get())); - close(); + onClose(); }; table.row(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java index 3e58d7d70f..7d844b9165 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemListSettingScreen.java @@ -10,15 +10,15 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.ItemListSetting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.registry.Registries; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import java.util.function.Predicate; public class ItemListSettingScreen extends CollectionListSettingScreen { public ItemListSettingScreen(GuiTheme theme, ItemListSetting setting) { - super(theme, "Select Items", setting, setting.get(), Registries.ITEM); + super(theme, "Select Items", setting, setting.get(), BuiltInRegistries.ITEM); } @Override @@ -31,14 +31,14 @@ protected boolean includeValue(Item value) { @Override protected WWidget getValueWidget(Item value) { - return theme.itemWithLabel(value.getDefaultStack()); + return theme.itemWithLabel(value.getDefaultInstance()); } @Override protected String[] getValueNames(Item value) { return new String[]{ Names.get(value), - Registries.ITEM.getId(value).toString() + BuiltInRegistries.ITEM.getKey(value).toString() }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSettingScreen.java index c7c824677b..3436d75cc7 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ItemSettingScreen.java @@ -13,9 +13,9 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.settings.ItemSetting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.registry.Registries; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import org.apache.commons.lang3.Strings; public class ItemSettingScreen extends WindowScreen { @@ -48,18 +48,18 @@ public void initWidgets() { } public void initTable() { - for (Item item : Registries.ITEM) { + for (Item item : BuiltInRegistries.ITEM) { if (setting.filter != null && !setting.filter.test(item)) continue; if (item == Items.AIR) continue; - WItemWithLabel itemLabel = theme.itemWithLabel(item.getDefaultStack(), Names.get(item)); + WItemWithLabel itemLabel = theme.itemWithLabel(item.getDefaultInstance(), Names.get(item)); if (!filterText.isEmpty() && !Strings.CI.contains(itemLabel.getLabelText(), filterText)) continue; table.add(itemLabel); WButton select = table.add(theme.button("Select")).expandCellX().right().widget(); select.action = () -> { setting.set(item); - close(); + onClose(); }; table.row(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java index ee765c1dc0..abbb97f341 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PacketBoolSettingScreen.java @@ -11,7 +11,7 @@ import meteordevelopment.meteorclient.settings.PacketListSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.network.PacketUtils; -import net.minecraft.network.packet.Packet; +import net.minecraft.network.protocol.Packet; import java.util.Set; import java.util.function.Predicate; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java index ae2cc22806..4a03071497 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ParticleTypeListSettingScreen.java @@ -10,20 +10,20 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.registry.Registries; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.registries.BuiltInRegistries; import java.util.List; public class ParticleTypeListSettingScreen extends CollectionListSettingScreen> { public ParticleTypeListSettingScreen(GuiTheme theme, Setting>> setting) { - super(theme, "Select Particles", setting, setting.get(), Registries.PARTICLE_TYPE); + super(theme, "Select Particles", setting, setting.get(), BuiltInRegistries.PARTICLE_TYPE); } @Override protected boolean includeValue(ParticleType value) { - return value instanceof ParticleEffect; + return value instanceof ParticleOptions; } @Override @@ -35,7 +35,7 @@ protected WWidget getValueWidget(ParticleType value) { protected String[] getValueNames(ParticleType value) { return new String[]{ Names.get(value), - Registries.PARTICLE_TYPE.getId(value).toString() + BuiltInRegistries.PARTICLE_TYPE.getKey(value).toString() }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PotionSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PotionSettingScreen.java index 398c24f32e..191106d02d 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PotionSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/PotionSettingScreen.java @@ -11,7 +11,7 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.settings.PotionSetting; import meteordevelopment.meteorclient.utils.misc.MyPotion; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.language.I18n; public class PotionSettingScreen extends WindowScreen { private final PotionSetting setting; @@ -27,12 +27,12 @@ public void initWidgets() { WTable table = add(theme.table()).expandX().widget(); for (MyPotion potion : MyPotion.values()) { - table.add(theme.itemWithLabel(potion.potion, I18n.translate(potion.potion.getItem().getTranslationKey()))); + table.add(theme.itemWithLabel(potion.potion(), I18n.get(potion.potion().getItem().getDescriptionId()))); WButton select = table.add(theme.button("Select")).widget(); select.action = () -> { setting.set(potion); - close(); + onClose(); }; table.row(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java index c779f4b37a..0488f4d873 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/ScreenHandlerSettingScreen.java @@ -9,29 +9,29 @@ import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; -import net.minecraft.registry.Registries; -import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.inventory.MenuType; import java.util.List; -public class ScreenHandlerSettingScreen extends CollectionListSettingScreen> { - public ScreenHandlerSettingScreen(GuiTheme theme, Setting>> setting) { - super(theme, "Select Screen Handlers", setting, setting.get(), Registries.SCREEN_HANDLER); +public class ScreenHandlerSettingScreen extends CollectionListSettingScreen> { + public ScreenHandlerSettingScreen(GuiTheme theme, Setting>> setting) { + super(theme, "Select Screen Handlers", setting, setting.get(), BuiltInRegistries.MENU); } @Override - protected WWidget getValueWidget(ScreenHandlerType value) { + protected WWidget getValueWidget(MenuType value) { return theme.label(getName(value)); } @Override - protected String[] getValueNames(ScreenHandlerType type) { + protected String[] getValueNames(MenuType type) { return new String[]{ getName(type) }; } - private static String getName(ScreenHandlerType type) { - return Registries.SCREEN_HANDLER.getId(type).toString(); + private static String getName(MenuType type) { + return BuiltInRegistries.MENU.getKey(type).toString(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java index f94bdbfd15..82d53f1b0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/SoundEventListSettingScreen.java @@ -9,27 +9,27 @@ import meteordevelopment.meteorclient.gui.screens.settings.base.CollectionListSettingScreen; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.registry.Registries; -import net.minecraft.sound.SoundEvent; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvent; import java.util.List; public class SoundEventListSettingScreen extends CollectionListSettingScreen { public SoundEventListSettingScreen(GuiTheme theme, Setting> setting) { - super(theme, "Select Sounds", setting, setting.get(), Registries.SOUND_EVENT); + super(theme, "Select Sounds", setting, setting.get(), BuiltInRegistries.SOUND_EVENT); } @Override protected WWidget getValueWidget(SoundEvent value) { - return theme.label(value.id().getPath()); + return theme.label(value.location().getPath()); } @Override protected String[] getValueNames(SoundEvent value) { return new String[]{ - value.id().toString(), - I18n.translate("subtitles." + value.id().getPath()) + value.location().toString(), + I18n.get("subtitles." + value.location().getPath()) }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java index 7d69a9299a..800933ae2c 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectAmplifierMapSettingScreen.java @@ -13,11 +13,11 @@ import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.PotionContentsComponent; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; import org.apache.commons.lang3.Strings; import java.util.ArrayList; @@ -26,13 +26,13 @@ import java.util.Optional; public class StatusEffectAmplifierMapSettingScreen extends WindowScreen { - private final Setting> setting; + private final Setting> setting; private WTable table; private String filterText = ""; - public StatusEffectAmplifierMapSettingScreen(GuiTheme theme, Setting> setting) { + public StatusEffectAmplifierMapSettingScreen(GuiTheme theme, Setting> setting) { super(theme, "Modify Amplifiers"); this.setting = setting; @@ -55,10 +55,10 @@ public void initWidgets() { } private void initTable() { - List statusEffects = new ArrayList<>(setting.get().keySet()); + List statusEffects = new ArrayList<>(setting.get().keySet()); statusEffects.sort(Comparator.comparing(Names::get)); - for (StatusEffect statusEffect : statusEffects) { + for (MobEffect statusEffect : statusEffects) { String name = Names.get(statusEffect); if (!Strings.CI.contains(name, filterText)) continue; @@ -75,15 +75,15 @@ private void initTable() { } } - private ItemStack getPotionStack(StatusEffect effect) { - ItemStack potion = Items.POTION.getDefaultStack(); + private ItemStack getPotionStack(MobEffect effect) { + ItemStack potion = Items.POTION.getDefaultInstance(); potion.set( - DataComponentTypes.POTION_CONTENTS, - new PotionContentsComponent( - potion.get(DataComponentTypes.POTION_CONTENTS).potion(), + DataComponents.POTION_CONTENTS, + new PotionContents( + potion.get(DataComponents.POTION_CONTENTS).potion(), Optional.of(effect.getColor()), - potion.get(DataComponentTypes.POTION_CONTENTS).customEffects(), + potion.get(DataComponents.POTION_CONTENTS).customEffects(), Optional.empty() ) ); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java index 608c035a6b..40bbba7ea7 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StatusEffectListSettingScreen.java @@ -10,43 +10,43 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.PotionContentsComponent; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.registry.Registries; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; import java.util.List; import java.util.Optional; -public class StatusEffectListSettingScreen extends CollectionListSettingScreen { - public StatusEffectListSettingScreen(GuiTheme theme, Setting> setting) { - super(theme, "Select Effects", setting, setting.get(), Registries.STATUS_EFFECT); +public class StatusEffectListSettingScreen extends CollectionListSettingScreen { + public StatusEffectListSettingScreen(GuiTheme theme, Setting> setting) { + super(theme, "Select Effects", setting, setting.get(), BuiltInRegistries.MOB_EFFECT); } @Override - protected WWidget getValueWidget(StatusEffect value) { + protected WWidget getValueWidget(MobEffect value) { return theme.itemWithLabel(getPotionStack(value), Names.get(value)); } @Override - protected String[] getValueNames(StatusEffect value) { + protected String[] getValueNames(MobEffect value) { return new String[]{ Names.get(value), - Registries.STATUS_EFFECT.getId(value).toString() + BuiltInRegistries.MOB_EFFECT.getKey(value).toString() }; } - private ItemStack getPotionStack(StatusEffect effect) { - ItemStack potion = Items.POTION.getDefaultStack(); + private ItemStack getPotionStack(MobEffect effect) { + ItemStack potion = Items.POTION.getDefaultInstance(); potion.set( - DataComponentTypes.POTION_CONTENTS, - new PotionContentsComponent( - potion.get(DataComponentTypes.POTION_CONTENTS).potion(), + DataComponents.POTION_CONTENTS, + new PotionContents( + potion.get(DataComponents.POTION_CONTENTS).potion(), Optional.of(effect.getColor()), - potion.get(DataComponentTypes.POTION_CONTENTS).customEffects(), + potion.get(DataComponents.POTION_CONTENTS).customEffects(), Optional.empty() ) ); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java index f73d2cfb9e..6e73e95ffe 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/StorageBlockListSettingScreen.java @@ -11,10 +11,10 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.StorageBlockListSetting; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.registry.Registries; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.entity.BlockEntityType; import java.util.List; import java.util.Map; @@ -50,16 +50,17 @@ public StorageBlockListSettingScreen(GuiTheme theme, Setting value) { BlockEntityTypeInfo info = BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN); - return theme.itemWithLabel(info.item().getDefaultStack(), info.name()); + return theme.itemWithLabel(info.item().getDefaultInstance(), info.name()); } @Override protected String[] getValueNames(BlockEntityType value) { return new String[]{ BLOCK_ENTITY_TYPE_INFO_MAP.getOrDefault(value, UNKNOWN).name(), - Registries.BLOCK_ENTITY_TYPE.getId(value).toString() + BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(value).toString() }; } - private record BlockEntityTypeInfo(Item item, String name) {} + private record BlockEntityTypeInfo(Item item, String name) { + } } 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 f151dddea3..9a2a8d0fdc 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 @@ -11,32 +11,35 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WTable; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.settings.Setting; -import net.minecraft.client.MinecraftClient; -import net.minecraft.registry.*; -import net.minecraft.util.Identifier; -import net.minecraft.util.InvalidIdentifierException; +import net.minecraft.IdentifierException; +import net.minecraft.client.Minecraft; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.Registry; +import net.minecraft.data.registries.VanillaRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import java.util.Collection; import java.util.Optional; import java.util.Set; -public abstract class DynamicRegistryListSettingScreen extends CollectionListSettingScreen> { - protected final RegistryKey> registryKey; +public abstract class DynamicRegistryListSettingScreen extends CollectionListSettingScreen> { + protected final ResourceKey> registryKey; - public DynamicRegistryListSettingScreen(GuiTheme theme, String title, Setting setting, Collection> collection, RegistryKey> registryKey) { + public DynamicRegistryListSettingScreen(GuiTheme theme, String title, Setting setting, Collection> collection, ResourceKey> registryKey) { super(theme, title, setting, collection, createUniverse(collection, registryKey)); this.registryKey = registryKey; } - private static Iterable> createUniverse(Collection> collection, RegistryKey> registryKey) { - Set> set = new ReferenceOpenHashSet<>(collection); + private static Iterable> createUniverse(Collection> collection, ResourceKey> registryKey) { + Set> set = new ReferenceOpenHashSet<>(collection); - Optional.ofNullable(MinecraftClient.getInstance().getNetworkHandler()) - .map(networkHandler -> (RegistryWrapper.WrapperLookup) networkHandler.getRegistryManager()) - .orElseGet(BuiltinRegistries::createWrapperLookup) - .getOptional(registryKey) - .ifPresent(registry -> registry.streamKeys().forEach(set::add)); + Optional.ofNullable(Minecraft.getInstance().getConnection()) + .map(networkHandler -> (HolderLookup.Provider) networkHandler.registryAccess()) + .orElseGet(VanillaRegistries::createLookup) + .lookup(registryKey) + .ifPresent(registry -> registry.listElementIds().forEach(set::add)); return set; } @@ -53,9 +56,10 @@ protected void postWidgets(WTable left, WTable right) { manualEntry.add(theme.plus()).expandCellX().right().widget().action = () -> { String entry = textBox.get().trim(); try { - Identifier id = entry.contains(":") ? Identifier.of(entry) : Identifier.ofVanilla(entry); - addValue(RegistryKey.of(registryKey, id)); - } catch (InvalidIdentifierException ignored) {} + Identifier id = entry.contains(":") ? Identifier.parse(entry) : Identifier.withDefaultNamespace(entry); + addValue(ResourceKey.create(registryKey, id)); + } catch (IdentifierException _) { + } }; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java index ed0b9be450..61c2362a02 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/screens/settings/base/SortingHelper.java @@ -7,7 +7,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.util.collection.IndexedIterable; +import net.minecraft.core.IdMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -22,7 +22,8 @@ public final class SortingHelper { private static final Comparator> FILTER_COMPARATOR = Comparator.comparingInt(Entry::distance); - private SortingHelper() {} + private SortingHelper() { + } public static Iterable sort(Iterable registry, Predicate filter, Function nameFunction, String filterText) { return sortInternal(registry, filter, nameFunction, filterText, null); @@ -85,7 +86,7 @@ private static Iterable sortInternal(Iterable registry, Predicate f } private static List createList(Iterable iterable) { - if (iterable instanceof IndexedIterable indexed) { + if (iterable instanceof IdMap indexed) { return new ObjectArrayList<>(indexed.size()); } else if (iterable instanceof Collection collection) { return new ObjectArrayList<>(collection.size()); @@ -140,5 +141,6 @@ public void forEach(Consumer action) { }; } - public record Entry(T value, int distance) {} + public record Entry(T value, int distance) { + } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java index f7774038a1..ba30716052 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/Tab.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.gui.tabs; import meteordevelopment.meteorclient.gui.GuiTheme; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; import static meteordevelopment.meteorclient.MeteorClient.mc; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java index 55d84c1f8d..98f5df4700 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ConfigTab.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.prompts.YesNoPrompt; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; public class ConfigTab extends Tab { public ConfigTab() { @@ -51,8 +51,7 @@ public ConfigScreen(GuiTheme theme, Tab tab) { .onYes(() -> Config.get().prefix.set(".")) .id("empty-command-prefix") .show(); - } - else if (prefix.equals("/")) { + } else if (prefix.equals("/")) { YesNoPrompt.create(theme, this.parent) .title("Potential prefix conflict") .message("You have set your command prefix to '/', which is used by minecraft.") @@ -61,8 +60,7 @@ else if (prefix.equals("/")) { .onYes(() -> Config.get().prefix.set(".")) .id("minecraft-prefix-conflict") .show(); - } - else if (prefix.length() > 7) { + } else if (prefix.length() > 7) { YesNoPrompt.create(theme, this.parent) .title("Long command prefix") .message("You have set your command prefix to a very long string.") diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java index 600060ff3e..56003726ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; import static meteordevelopment.meteorclient.MeteorClient.mc; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java index 35122c6551..cfcefcb3a0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/GuiTab.java @@ -15,7 +15,7 @@ import meteordevelopment.meteorclient.gui.widgets.input.WDropdown; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.utils.misc.NbtUtils; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; import static meteordevelopment.meteorclient.MeteorClient.mc; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java index 21236d2c1f..51e16f1774 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/HudTab.java @@ -17,8 +17,8 @@ import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.screens.HudEditorScreen; import meteordevelopment.meteorclient.utils.misc.NbtUtils; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -76,8 +76,8 @@ public void initWidgets() { } @Override - protected void onRenderBefore(DrawContext drawContext, float delta) { - HudEditorScreen.renderElements(drawContext); + protected void onRenderBefore(GuiGraphicsExtractor graphics, float delta) { + HudEditorScreen.renderElements(graphics); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java index 1ba286fd59..670fc385c8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/MacrosTab.java @@ -18,7 +18,7 @@ import meteordevelopment.meteorclient.systems.macros.Macro; import meteordevelopment.meteorclient.systems.macros.Macros; import meteordevelopment.meteorclient.utils.misc.NbtUtils; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; import static meteordevelopment.meteorclient.MeteorClient.mc; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java index 093bbe2683..2e5ae725c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ModulesTab.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.gui.GuiThemes; import meteordevelopment.meteorclient.gui.tabs.Tab; import meteordevelopment.meteorclient.gui.tabs.TabScreen; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; public class ModulesTab extends Tab { public ModulesTab() { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java index d2fd0ade51..0ef4d1b3e8 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/PathManagerTab.java @@ -11,7 +11,7 @@ import meteordevelopment.meteorclient.gui.tabs.WindowTabScreen; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.pathing.PathManagers; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; public class PathManagerTab extends Tab { public PathManagerTab() { 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 635a8b3142..bec9797e09 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -25,10 +25,10 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.Tag; import org.lwjgl.BufferUtils; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryUtil; @@ -97,7 +97,8 @@ public void initWidgets() { importBtn.action = () -> { try { Profile imported = importProfile(); - if (imported != null) MeteorClient.LOG.info("Successfully imported profile '{}'.", imported.name.get()); + if (imported != null) + MeteorClient.LOG.info("Successfully imported profile '{}'.", imported.name.get()); reload(); } catch (IOException e) { MeteorClient.LOG.error("Error importing profile", e); @@ -146,15 +147,15 @@ private Profile importProfile() throws IOException { if (file == null) return null; File profileFile = new File(file); - NbtCompound nbt = NbtIo.read(profileFile.toPath()); + CompoundTag nbt = NbtIo.read(profileFile.toPath()); Profile p = new Profile(); - p.name.set(nbt.getString("name", profileFile.getName())); + p.name.set(nbt.getStringOr("name", profileFile.getName())); //noinspection ResultOfMethodCallIgnored p.getFile().mkdirs(); nbt.remove("name"); - for (Map.Entry entry : nbt.entrySet()) { + for (Map.Entry entry : nbt.entrySet()) { String filename = entry.getKey(); switch (filename) { @@ -167,7 +168,7 @@ private Profile importProfile() throws IOException { } File f = new File(p.getFile(), filename); - NbtIo.write(entry.getValue(), new DataOutputStream(new FileOutputStream(f))); + NbtIo.writeUnnamedTagWithFallback(entry.getValue(), new DataOutputStream(new FileOutputStream(f))); } Profiles.get().getAll().add(p); @@ -228,7 +229,7 @@ public void initWidgets() { if (isNew) Profiles.get().add(profile); else Profiles.get().save(); - close(); + onClose(); }; enterAction = save.action; @@ -273,7 +274,7 @@ public void initWidgets() { WButton export = add(theme.button("Export profile")).expandX().widget(); export.action = () -> { exportProfile(profile, hud.checked, macros.checked, modules.checked, waypoints.checked); - close(); + onClose(); }; } @@ -292,7 +293,7 @@ private void exportProfile(Profile profile, boolean hud, boolean macros, boolean if (path == null) return; Path p = Path.of(path.endsWith(".nbt") ? path : path + ".nbt"); - NbtCompound nbt = new NbtCompound(); + CompoundTag nbt = new CompoundTag(); nbt.putString("name", profile.name.get()); try { @@ -302,8 +303,7 @@ private void exportProfile(Profile profile, boolean hud, boolean macros, boolean f.getName().equals("modules.nbt") && modules ) { nbt.put(f.getName(), NbtIo.read(f.toPath())); - } - else if (f.getName().endsWith(".nbt") && waypoints) + } else if (f.getName().endsWith(".nbt") && waypoints) nbt.put(f.getName(), NbtIo.read(f.toPath())); } 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 a2b5ffe06b..ae40907e5a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/MeteorGuiTheme.java @@ -5,6 +5,7 @@ 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; @@ -30,7 +31,6 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.util.MacWindowUtil; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -55,7 +55,7 @@ public class MeteorGuiTheme extends GuiTheme { .sliderRange(0.75, 4) .onSliderRelease() .onChanged(aDouble -> { - if (mc.currentScreen instanceof WidgetScreen) ((WidgetScreen) mc.currentScreen).invalidate(); + if (mc.screen instanceof WidgetScreen) ((WidgetScreen) mc.screen).invalidate(); }) .build() ); @@ -79,7 +79,7 @@ public class MeteorGuiTheme extends GuiTheme { .description("Hide HUD when in GUI.") .defaultValue(false) .onChanged(v -> { - if (mc.currentScreen instanceof WidgetScreen) mc.options.hudHidden = v; + if (mc.screen instanceof WidgetScreen) mc.options.hideGui = v; }) .build() ); @@ -104,11 +104,11 @@ public class MeteorGuiTheme extends GuiTheme { // Background public final ThreeStateColorSetting backgroundColor = new ThreeStateColorSetting( - sgBackgroundColors, - "background", - new SettingColor(20, 20, 20, 200), - new SettingColor(30, 30, 30, 200), - new SettingColor(40, 40, 40, 200) + sgBackgroundColors, + "background", + new SettingColor(20, 20, 20, 200), + new SettingColor(30, 30, 30, 200), + new SettingColor(40, 40, 40, 200) ); public final Setting moduleBackground = color(sgBackgroundColors, "module-background", "Color of module background when active.", new SettingColor(50, 50, 50)); @@ -116,11 +116,11 @@ public class MeteorGuiTheme extends GuiTheme { // Outline public final ThreeStateColorSetting outlineColor = new ThreeStateColorSetting( - sgOutline, - "outline", - new SettingColor(0, 0, 0), - new SettingColor(10, 10, 10), - new SettingColor(20, 20, 20) + sgOutline, + "outline", + new SettingColor(0, 0, 0), + new SettingColor(10, 10, 10), + new SettingColor(20, 20, 20) ); // Separator @@ -132,24 +132,24 @@ public class MeteorGuiTheme extends GuiTheme { // Scrollbar public final ThreeStateColorSetting scrollbarColor = new ThreeStateColorSetting( - sgScrollbar, - "Scrollbar", - new SettingColor(30, 30, 30, 200), - new SettingColor(40, 40, 40, 200), - new SettingColor(50, 50, 50, 200) + sgScrollbar, + "Scrollbar", + new SettingColor(30, 30, 30, 200), + new SettingColor(40, 40, 40, 200), + new SettingColor(50, 50, 50, 200) ); // Slider public final ThreeStateColorSetting sliderHandle = new ThreeStateColorSetting( - sgSlider, - "slider-handle", - new SettingColor(130, 0, 255), - new SettingColor(140, 30, 255), - new SettingColor(150, 60, 255) + sgSlider, + "slider-handle", + new SettingColor(130, 0, 255), + new SettingColor(140, 30, 255), + new SettingColor(150, 60, 255) ); - public final Setting sliderLeft = color(sgSlider, "slider-left", "Color of slider left part.", new SettingColor(100,35,170)); + public final Setting sliderLeft = color(sgSlider, "slider-left", "Color of slider left part.", new SettingColor(100, 35, 170)); public final Setting sliderRight = color(sgSlider, "slider-right", "Color of slider right part.", new SettingColor(50, 50, 50)); // Starscript @@ -173,11 +173,12 @@ public MeteorGuiTheme() { private Setting color(SettingGroup group, String name, String description, SettingColor color) { return group.add(new ColorSetting.Builder() - .name(name + "-color") - .description(description) - .defaultValue(color) - .build()); + .name(name + "-color") + .description(description) + .defaultValue(color) + .build()); } + private Setting color(String name, String description, SettingColor color) { return color(sgColors, name, description, color); } @@ -370,8 +371,8 @@ public TextRenderer textRenderer() { public double scale(double value) { double scaled = value * scale.get(); - if (MacWindowUtil.IS_MAC) { - scaled /= (double) mc.getWindow().getWidth() / mc.getWindow().getFramebufferWidth(); + if (MacosUtil.IS_MACOS) { + scaled /= (double) mc.getWindow().getWidth() / mc.getWindow().getWidth(); } return scaled; 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 7cd5bd1481..1bf15b22e7 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 @@ -11,7 +11,7 @@ import meteordevelopment.meteorclient.gui.utils.AlignmentX; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.systems.modules.Module; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import static meteordevelopment.meteorclient.MeteorClient.mc; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; @@ -68,10 +68,10 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub double pad = pad(); animationProgress1 += delta * 4 * ((module.isActive() || mouseOver) ? 1 : -1); - animationProgress1 = MathHelper.clamp(animationProgress1, 0, 1); + animationProgress1 = Mth.clamp(animationProgress1, 0, 1); animationProgress2 += delta * 6 * (module.isActive() ? 1 : -1); - animationProgress2 = MathHelper.clamp(animationProgress2, 0, 1); + animationProgress2 = Mth.clamp(animationProgress2, 0, 1); if (animationProgress1 > 0) { renderer.quad(x, y, width * animationProgress1, height, theme.moduleBackground.get()); @@ -85,8 +85,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub if (theme.moduleAlignment.get() == AlignmentX.Center) { x += w / 2 - titleWidth / 2; - } - else if (theme.moduleAlignment.get() == AlignmentX.Right) { + } else if (theme.moduleAlignment.get() == AlignmentX.Right) { x += w - titleWidth; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/input/WMeteorTextBox.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/input/WMeteorTextBox.java index 0e8b59229e..f2b740bb24 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/input/WMeteorTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/input/WMeteorTextBox.java @@ -15,7 +15,7 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class WMeteorTextBox extends WTextBox implements MeteorWidget { private boolean cursorVisible; @@ -100,8 +100,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub if (cursorTimer >= 1) { cursorVisible = !cursorVisible; cursorTimer = 0; - } - else { + } else { cursorTimer += delta * 1.75; } @@ -116,8 +115,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub // Text content if (!text.isEmpty()) { this.renderer.render(renderer, x + pad - overflowWidth, y + pad, text, theme.textColor.get()); - } - else if (placeholder != null) { + } else if (placeholder != null) { this.renderer.render(renderer, x + pad - overflowWidth, y + pad, placeholder, theme.placeholderColor.get()); } @@ -131,7 +129,7 @@ else if (placeholder != null) { // Cursor animProgress += delta * 10 * (focused && cursorVisible ? 1 : -1); - animProgress = MathHelper.clamp(animProgress, 0, 1); + animProgress = Mth.clamp(animProgress, 0, 1); if ((focused && cursorVisible) || animProgress > 0) { renderer.setAlpha(animProgress); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorCheckbox.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorCheckbox.java index 1fa104c899..eba6d113a9 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorCheckbox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorCheckbox.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.gui.themes.meteor.MeteorGuiTheme; import meteordevelopment.meteorclient.gui.themes.meteor.MeteorWidget; import meteordevelopment.meteorclient.gui.widgets.pressable.WCheckbox; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; public class WMeteorCheckbox extends WCheckbox implements MeteorWidget { private double animProgress; @@ -24,7 +24,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub MeteorGuiTheme theme = theme(); animProgress += (checked ? 1 : -1) * delta * 14; - animProgress = MathHelper.clamp(animProgress, 0, 1); + animProgress = Mth.clamp(animProgress, 0, 1); renderBackground(renderer, this, pressed, mouseOver); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java index 57b92c801d..35b534ea15 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/themes/meteor/widgets/pressable/WMeteorConfirmedButton.java @@ -9,7 +9,6 @@ import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; import meteordevelopment.meteorclient.gui.themes.meteor.MeteorGuiTheme; import meteordevelopment.meteorclient.gui.themes.meteor.MeteorWidget; -import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WConfirmedButton; import meteordevelopment.meteorclient.utils.render.color.Color; @@ -33,8 +32,7 @@ protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, doub if (text != null) { renderer.text(text, x + width / 2 - textWidth / 2, y + pad, fg, false); - } - else { + } else { double ts = theme.textHeight(); renderer.quad(x + width / 2 - ts / 2, y + pad, ts, ts, texture, fg); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java b/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java index f1cd5c4255..0dd1f5c3c0 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/utils/StarscriptTextBoxRenderer.java @@ -106,7 +106,7 @@ private static Color getColorForToken(GuiTheme theme, SemanticTokenType type, St try { yield TextHud.getSectionColor(Integer.parseInt(text)); - } catch (NumberFormatException ignored) {} + } catch (NumberFormatException _) {} yield theme.starscriptTextColor(); } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/utils/WindowConfig.java b/src/main/java/meteordevelopment/meteorclient/gui/utils/WindowConfig.java index 8ea1bb692d..8847e734a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/utils/WindowConfig.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/utils/WindowConfig.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.gui.utils; import meteordevelopment.meteorclient.utils.misc.ISerializable; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; public class WindowConfig implements ISerializable { public boolean expanded = true; @@ -16,8 +16,8 @@ public class WindowConfig implements ISerializable { // Saving @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putBoolean("expanded", expanded); tag.putDouble("x", x); @@ -27,7 +27,7 @@ public NbtCompound toTag() { } @Override - public WindowConfig fromTag(NbtCompound tag) { + public WindowConfig fromTag(CompoundTag tag) { tag.getBoolean("expanded").ifPresent(bool -> expanded = bool); tag.getDouble("x").ifPresent(x1 -> x = x1); tag.getDouble("y").ifPresent(y1 -> y = y1); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java index f3ce37567a..00cfab4a30 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WAccount.java @@ -29,6 +29,7 @@ public WAccount(WidgetScreen screen, Account account) { } protected abstract Color loggedInColor(); + protected abstract Color accountTypeColor(); @Override @@ -38,7 +39,7 @@ public void init() { // Name WLabel name = add(theme.label(account.getUsername())).widget(); - if (mc.getSession().getUsername().equalsIgnoreCase(account.getUsername())) name.color = loggedInColor(); + if (mc.getUser().getName().equalsIgnoreCase(account.getUsername())) name.color = loggedInColor(); // Type WLabel label = add(theme.label("(" + account.getType() + ")")).expandCellX().right().widget(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java index 059d1b90d9..116507da9c 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItem.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.gui.widgets; import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; public class WItem extends WWidget { protected ItemStack itemStack; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java index cd7b4decfc..fdd65a7c3c 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WItemWithLabel.java @@ -7,11 +7,11 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.utils.misc.Names; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffectUtil; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffectUtil; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import java.util.Iterator; @@ -39,15 +39,15 @@ private String getStringToAppend() { String str = ""; if (itemStack.getItem() == Items.POTION) { - Iterator effects = itemStack.getItem().getComponents().get(DataComponentTypes.POTION_CONTENTS).getEffects().iterator(); + Iterator effects = itemStack.getItem().components().get(DataComponents.POTION_CONTENTS).getAllEffects().iterator(); if (!effects.hasNext()) return str; str += " "; - StatusEffectInstance effect = effects.next(); + MobEffectInstance effect = effects.next(); if (effect.getAmplifier() > 0) str += "%d ".formatted(effect.getAmplifier() + 1); - str += "(%s)".formatted(StatusEffectUtil.getDurationText(effect, 1, mc.world != null ? mc.world.getTickManager().getTickRate() : 20.0F).getString()); + str += "(%s)".formatted(MobEffectUtil.formatDuration(effect, 1, mc.level != null ? mc.level.tickRateManager().tickrate() : 20.0F).getString()); } return str; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WLabel.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WLabel.java index 2b7ff3c9fb..ba2890c36a 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WLabel.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WLabel.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gui.Click; +import net.minecraft.client.input.MouseButtonEvent; public abstract class WLabel extends WPressable { public Color color; @@ -27,13 +27,13 @@ protected void onCalculateSize() { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (action != null) return super.onMouseClicked(click, doubled); return false; } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (action != null) return super.onMouseReleased(click); return false; } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java index 5e20f5a3a5..6db9aeeb34 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WTopBar.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screens.Screen; import static meteordevelopment.meteorclient.MeteorClient.mc; import static org.lwjgl.glfw.GLFW.glfwSetCursorPos; @@ -50,21 +50,21 @@ protected void onCalculateSize() { @Override protected void onPressed(int button) { - Screen screen = mc.currentScreen; + Screen screen = mc.screen; if (!(screen instanceof TabScreen) || ((TabScreen) screen).tab != tab) { - double mouseX = mc.mouse.getX(); - double mouseY = mc.mouse.getY(); + double mouseX = mc.mouseHandler.xpos(); + double mouseY = mc.mouseHandler.ypos(); tab.openScreen(theme); - glfwSetCursorPos(mc.getWindow().getHandle(), mouseX, mouseY); + glfwSetCursorPos(mc.getWindow().handle(), mouseX, mouseY); } } @Override protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { double pad = pad(); - Color color = getButtonColor(pressed || (mc.currentScreen instanceof TabScreen && ((TabScreen) mc.currentScreen).tab == tab), mouseOver); + Color color = getButtonColor(pressed || (mc.screen instanceof TabScreen && ((TabScreen) mc.screen).tab == tab), mouseOver); renderer.quad(x, y, width, height, color); renderer.text(tab.name, x + pad, y + pad, getNameColor(), false); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java index 873f9b01ef..139b15430b 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/WWidget.java @@ -9,9 +9,9 @@ import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.utils.BaseWidget; import meteordevelopment.meteorclient.gui.widgets.containers.WView; -import net.minecraft.client.gui.Click; -import net.minecraft.client.input.CharInput; -import net.minecraft.client.input.KeyInput; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.KeyEvent; public abstract class WWidget implements BaseWidget { public boolean visible = true; @@ -29,7 +29,8 @@ public abstract class WWidget implements BaseWidget { protected boolean instantTooltips; protected double mouseOverTimer; - public void init() {} + public void init() { + } public void move(double deltaX, double deltaY) { x = Math.round(x + deltaX); @@ -84,8 +85,7 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double WView view = getView(); if (view == null || view.mouseOver) renderer.tooltip(tooltip); } - } - else { + } else { mouseOverTimer = 0; } @@ -93,45 +93,66 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double return false; } - protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {} + protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) { + } // Events - public boolean mouseClicked(Click click, boolean doubled) { + public boolean mouseClicked(MouseButtonEvent click, boolean doubled) { return onMouseClicked(click, doubled); } - public boolean onMouseClicked(Click click, boolean doubled) { return false; } - public boolean mouseReleased(Click click) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { + return false; + } + + public boolean mouseReleased(MouseButtonEvent click) { return onMouseReleased(click); } - public boolean onMouseReleased(Click click) { return false; } + + public boolean onMouseReleased(MouseButtonEvent click) { + return false; + } public void mouseMoved(double mouseX, double mouseY, double lastMouseX, double lastMouseY) { mouseOver = isOver(mouseX, mouseY); onMouseMoved(mouseX, mouseY, lastMouseX, lastMouseY); } - public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double lastMouseY) {} + + public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double lastMouseY) { + } public boolean mouseScrolled(double amount) { return onMouseScrolled(amount); } - public boolean onMouseScrolled(double amount) { return false; } - public boolean keyPressed(KeyInput input) { + public boolean onMouseScrolled(double amount) { + return false; + } + + public boolean keyPressed(KeyEvent input) { return onKeyPressed(input); } - public boolean onKeyPressed(KeyInput input) { return false; } - public boolean keyRepeated(KeyInput input) { + public boolean onKeyPressed(KeyEvent input) { + return false; + } + + public boolean keyRepeated(KeyEvent input) { return onKeyRepeated(input); } - public boolean onKeyRepeated(KeyInput input) { return false; } - public boolean charTyped(CharInput input) { + public boolean onKeyRepeated(KeyEvent input) { + return false; + } + + public boolean charTyped(CharacterEvent input) { return onCharTyped(input); } - public boolean onCharTyped(CharInput input) { return false; } + + public boolean onCharTyped(CharacterEvent input) { + return false; + } // Other diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java index 41f875be85..3a141c71bc 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WContainer.java @@ -8,10 +8,10 @@ import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.utils.Cell; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import net.minecraft.client.Mouse; -import net.minecraft.client.gui.Click; -import net.minecraft.client.input.CharInput; -import net.minecraft.client.input.KeyInput; +import net.minecraft.client.MouseHandler; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; import java.util.ArrayList; import java.util.ConcurrentModificationException; @@ -57,8 +57,8 @@ public void moveCells(double deltaX, double deltaY) { for (Cell cell : cells) { cell.move(deltaX, deltaY); - Mouse mouse = mc.mouse; - cell.widget().mouseMoved(mouse.getX(), mouse.getY(), mouse.getX(), mouse.getY()); + MouseHandler mouse = mc.mouseHandler; + cell.widget().mouseMoved(mouse.xpos(), mouse.ypos(), mouse.xpos(), mouse.ypos()); } } @@ -155,23 +155,25 @@ protected boolean propagateEvents(WWidget widget) { } @Override - public boolean mouseClicked(Click click, boolean doubled) { + public boolean mouseClicked(MouseButtonEvent click, boolean doubled) { try { for (Cell cell : cells) { if (propagateEvents(cell.widget()) && cell.widget().mouseClicked(click, doubled)) return true; } - } catch (ConcurrentModificationException ignored) {} + } catch (ConcurrentModificationException _) { + } return super.mouseClicked(click, doubled); } @Override - public boolean mouseReleased(Click click) { + public boolean mouseReleased(MouseButtonEvent click) { try { for (Cell cell : cells) { if (propagateEvents(cell.widget()) && cell.widget().mouseReleased(click)) return true; } - } catch (ConcurrentModificationException ignored) {} + } catch (ConcurrentModificationException _) { + } return super.mouseReleased(click); } @@ -182,7 +184,8 @@ public void mouseMoved(double mouseX, double mouseY, double lastMouseX, double l for (Cell cell : cells) { if (propagateEvents(cell.widget())) cell.widget().mouseMoved(mouseX, mouseY, lastMouseX, lastMouseY); } - } catch (ConcurrentModificationException ignored) {} + } catch (ConcurrentModificationException _) { + } super.mouseMoved(mouseX, mouseY, lastMouseX, lastMouseY); } @@ -193,40 +196,44 @@ public boolean mouseScrolled(double amount) { for (Cell cell : cells) { if (propagateEvents(cell.widget()) && cell.widget().mouseScrolled(amount)) return true; } - } catch (ConcurrentModificationException ignored) {} + } catch (ConcurrentModificationException _) { + } return super.mouseScrolled(amount); } @Override - public boolean keyPressed(KeyInput input) { + public boolean keyPressed(KeyEvent input) { try { for (Cell cell : cells) { if (propagateEvents(cell.widget()) && cell.widget().keyPressed(input)) return true; } - } catch (ConcurrentModificationException ignored) {} + } catch (ConcurrentModificationException _) { + } return onKeyPressed(input); } @Override - public boolean keyRepeated(KeyInput input) { + public boolean keyRepeated(KeyEvent input) { try { for (Cell cell : cells) { if (propagateEvents(cell.widget()) && cell.widget().keyRepeated(input)) return true; } - } catch (ConcurrentModificationException ignored) {} + } catch (ConcurrentModificationException _) { + } return onKeyRepeated(input); } @Override - public boolean charTyped(CharInput input) { + public boolean charTyped(CharacterEvent input) { try { for (Cell cell : cells) { if (propagateEvents(cell.widget()) && cell.widget().charTyped(input)) return true; } - } catch (ConcurrentModificationException ignored) {} + } catch (ConcurrentModificationException _) { + } return super.charTyped(input); } 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 1f60c51992..acdac7e1df 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WSection.java @@ -8,8 +8,8 @@ import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.utils.Cell; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import net.minecraft.client.gui.Click; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.util.Mth; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; @@ -66,8 +66,7 @@ protected void onCalculateSize() { actualWidth = width; actualHeight = height; - } - else { + } else { width = actualWidth; height = forcedHeight; @@ -89,7 +88,7 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double double preProgress = animProgress; animProgress += (expanded ? 1 : -1) * delta * 14; - animProgress = MathHelper.clamp(animProgress, 0, 1); + animProgress = Mth.clamp(animProgress, 0, 1); if (animProgress != preProgress) { forcedHeight = (actualHeight - header.height) * animProgress + header.height; @@ -124,7 +123,7 @@ public WHeader(String title) { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (mouseOver && click.button() == GLFW_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 1b36297081..15a14e5f68 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WView.java @@ -8,8 +8,8 @@ import meteordevelopment.meteorclient.gui.renderer.GuiRenderer; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.gui.Click; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.util.Mth; import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; @@ -51,8 +51,7 @@ protected void onCalculateSize() { } if (couldScroll) moveAfterPositionWidgets = true; - } - else { + } else { actualHeight = height; scroll = 0; targetScroll = 0; @@ -64,7 +63,7 @@ protected void onCalculateWidgetPositions() { super.onCalculateWidgetPositions(); if (moveAfterPositionWidgets) { - scroll = MathHelper.clamp(scroll, 0, actualHeight - height); + scroll = Mth.clamp(scroll, 0, actualHeight - height); targetScroll = scroll; moveCells(0, -scroll); @@ -74,7 +73,7 @@ protected void onCalculateWidgetPositions() { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (handleMouseOver && click.button() == GLFW_MOUSE_BUTTON_LEFT && !doubled) { setFocused(true); return true; @@ -84,7 +83,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (focused) setFocused(false); return false; @@ -110,7 +109,7 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double //scroll += Math.round(theme.scale(mouseDelta + mouseDelta * ((height / actualHeight) * 0.7627725))); //scroll += Math.round(theme.scale(mouseDelta * (1 / (height / actualHeight)))); scroll += Math.round(mouseDelta * ((actualHeight - handleHeight() / 2) / height)); - scroll = MathHelper.clamp(scroll, 0, actualHeight - height); + scroll = Mth.clamp(scroll, 0, actualHeight - height); targetScroll = scroll; @@ -125,7 +124,7 @@ public boolean onMouseScrolled(double amount) { double max = actualHeight - height; targetScroll -= Math.round(theme.scale(amount * 40)); - targetScroll = MathHelper.clamp(targetScroll, 0, max); + targetScroll = Mth.clamp(targetScroll, 0, max); // Only consume the event if the view actually scrolled, otherwise propagate to parent. return targetScroll > 0 && targetScroll < max; @@ -153,13 +152,12 @@ private void updateScroll(double delta) { else if (targetScroll > scroll) { scroll += Math.round(theme.scale(delta * 300 + delta * 100 * (Math.abs(targetScroll - scroll) / 10))); if (scroll > targetScroll) scroll = targetScroll; - } - else if (targetScroll < scroll) { + } else if (targetScroll < scroll) { scroll -= Math.round(theme.scale(delta * 300 + delta * 100 * (Math.abs(targetScroll - scroll) / 10))); if (scroll < targetScroll) scroll = targetScroll; } - scroll = MathHelper.clamp(scroll, 0, max); + scroll = Mth.clamp(scroll, 0, max); double change = scroll - preScroll; if (change != 0) moveCells(0, -change); 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 9d3fe57e2e..4b84785762 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/containers/WWindow.java @@ -10,8 +10,8 @@ import meteordevelopment.meteorclient.gui.utils.WindowConfig; import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.gui.widgets.pressable.WTriangle; -import net.minecraft.client.gui.Click; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.util.Mth; import java.util.function.Consumer; @@ -189,7 +189,7 @@ protected void onCalculateSize() { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (mouseOver && !doubled) { if (click.button() == GLFW_MOUSE_BUTTON_RIGHT) setExpanded(!expanded); else { @@ -204,7 +204,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (dragging) { dragging = false; @@ -237,7 +237,7 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double @Override public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double delta) { animProgress += (expanded ? 1 : -1) * delta * 14; - animProgress = MathHelper.clamp(animProgress, 0, 1); + animProgress = Mth.clamp(animProgress, 0, 1); triangle.rotation = (1 - animProgress) * -90; 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 ca1917fdd1..e0ccee9d0f 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WBlockPosEdit.java @@ -14,9 +14,9 @@ import meteordevelopment.meteorclient.systems.modules.render.marker.Marker; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.HitResult; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -49,14 +49,14 @@ public void init() { clicking = true; MeteorClient.EVENT_BUS.subscribe(this); - previousScreen = mc.currentScreen; + previousScreen = mc.screen; mc.setScreen(null); }; WButton here = add(theme.button("Set Here")).expandX().widget(); here.action = () -> { lastValue = value; - set(new BlockPos(mc.player.getBlockPos())); + set(new BlockPos(mc.player.blockPosition())); newValueCheck(); clear(); @@ -100,13 +100,12 @@ private boolean filter(String text, char c) { if (c == '-' && text.isEmpty()) { good = true; validate = false; - } - else good = Character.isDigit(c); + } else good = Character.isDigit(c); if (good && validate) { try { Integer.parseInt(text + c); - } catch (NumberFormatException ignored) { + } catch (NumberFormatException _) { good = false; } } @@ -133,7 +132,8 @@ private void addTextBox() { else { try { set(new BlockPos(Integer.parseInt(textBoxX.get()), value.getY(), value.getZ())); - } catch (NumberFormatException ignored) {} + } catch (NumberFormatException _) { + } } newValueCheck(); }; @@ -144,7 +144,8 @@ private void addTextBox() { else { try { set(new BlockPos(value.getX(), Integer.parseInt(textBoxY.get()), value.getZ())); - } catch (NumberFormatException ignored) {} + } catch (NumberFormatException _) { + } } newValueCheck(); }; @@ -155,7 +156,8 @@ private void addTextBox() { else { try { set(new BlockPos(value.getX(), value.getY(), Integer.parseInt(textBoxZ.get()))); - } catch (NumberFormatException ignored) {} + } catch (NumberFormatException _) { + } } newValueCheck(); }; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java index 47fed3323a..dd06918369 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDoubleEdit.java @@ -34,7 +34,7 @@ public WDoubleEdit(double value, double min, double max, double sliderMin, doubl this.sliderMax = sliderMax; if (noSlider || (sliderMin == 0 && sliderMax == 0)) this.noSlider = true; - } + } @Override public void init() { @@ -43,20 +43,22 @@ public void init() { if (noSlider) { add(theme.button("+")).widget().action = () -> setButton(get() + 1); add(theme.button("-")).widget().action = () -> setButton(get() - 1); + } else { + slider = add(theme.slider(value, sliderMin, sliderMax)).minWidth(small ? 200 - 75 - spacing : 200).centerY().expandX().widget(); } - else slider = add(theme.slider(value, sliderMin, sliderMax)).minWidth(small ? 200 - 75 - spacing : 200).centerY().expandX().widget(); textBox.actionOnUnfocused = () -> { double lastValue = value; - if (textBox.get().isEmpty()) value = 0; - else if (textBox.get().equals("-")) value = -0; - else if (textBox.get().equals(".")) value = 0; - else if (textBox.get().equals("-.")) value = 0; - else { - try { - value = Double.parseDouble(textBox.get()); - } catch (NumberFormatException ignored) {} + switch (textBox.get()) { + case "", ".", "-." -> value = 0; + case "-" -> value = -0; + default -> { + try { + value = Double.parseDouble(textBox.get()); + } catch (NumberFormatException _) { + } + } } double preValidationValue = value; @@ -96,17 +98,15 @@ private boolean filter(String text, char c) { if (c == '-' && !text.contains("-") && textBox.cursor == 0) { good = true; validate = false; - } - else if (c == '.' && !text.contains(".")) { + } else if (c == '.' && !text.contains(".")) { good = true; if (text.isEmpty()) validate = false; - } - else good = Character.isDigit(c); + } else good = Character.isDigit(c); if (good && validate) { try { Double.parseDouble(text + c); - } catch (NumberFormatException ignored) { + } catch (NumberFormatException _) { good = false; } } @@ -134,7 +134,7 @@ public double get() { } public void set(double value) { - this.value = value; + this.value = value; textBox.set(valueString()); if (slider != null) slider.set(value); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java index f3d3895d7a..bf20da4708 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WDropdown.java @@ -11,10 +11,10 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WVerticalList; import meteordevelopment.meteorclient.gui.widgets.containers.WView; import meteordevelopment.meteorclient.gui.widgets.pressable.WPressable; -import net.minecraft.client.gui.Click; -import net.minecraft.client.input.CharInput; -import net.minecraft.client.input.KeyInput; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.util.Mth; public abstract class WDropdown extends WPressable { public Runnable action; @@ -109,7 +109,7 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double boolean render = super.render(renderer, mouseX, mouseY, delta); animProgress += (expanded ? 1 : -1) * delta * 14; - animProgress = MathHelper.clamp(animProgress, 0, 1); + animProgress = Mth.clamp(animProgress, 0, 1); WView view = getView(); boolean rootInView = view == null || view.isWidgetInView(root); @@ -130,7 +130,7 @@ public boolean render(GuiRenderer renderer, double mouseX, double mouseY, double // Events @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { boolean used = false; if (!mouseOver && !root.mouseOver) expanded = false; @@ -141,7 +141,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (super.onMouseReleased(click)) return true; return expanded && root.mouseReleased(click); @@ -166,21 +166,21 @@ public boolean onMouseScrolled(double amount) { } @Override - public boolean onKeyPressed(KeyInput input) { + public boolean onKeyPressed(KeyEvent input) { if (super.onKeyPressed(input)) return true; return expanded && root.keyPressed(input); } @Override - public boolean onKeyRepeated(KeyInput input) { + public boolean onKeyRepeated(KeyEvent input) { if (super.onKeyRepeated(input)) return true; return expanded && root.keyRepeated(input); } @Override - public boolean onCharTyped(CharInput input) { + public boolean onCharTyped(CharacterEvent input) { if (super.onCharTyped(input)) return true; return expanded && root.charTyped(input); @@ -190,7 +190,8 @@ public boolean onCharTyped(CharInput input) { protected abstract static class WDropdownRoot extends WVerticalList implements WRoot { @Override - public void invalidate() {} + public void invalidate() { + } } protected abstract class WDropdownValue extends WPressable { diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WIntEdit.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WIntEdit.java index c3cc4287a6..c6231b1619 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WIntEdit.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WIntEdit.java @@ -51,7 +51,7 @@ public void init() { else { try { value = Integer.parseInt(textBox.get()); - } catch (NumberFormatException ignored) {} + } catch (NumberFormatException _) {} } if (slider != null) slider.set(value); @@ -91,7 +91,7 @@ private boolean filter(String text, char c) { if (good && validate) { try { Integer.parseInt(text + c); - } catch (NumberFormatException ignored) { + } catch (NumberFormatException _) { good = false; } } diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java index a0ae60e4d0..73f6139a98 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WSlider.java @@ -6,8 +6,8 @@ package meteordevelopment.meteorclient.gui.widgets.input; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import net.minecraft.client.gui.Click; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.util.Mth; public abstract class WSlider extends WWidget { public Runnable action; @@ -16,16 +16,16 @@ public abstract class WSlider extends WWidget { protected double value; protected double min, max; - // ghost slider for scrolling event - protected double scrollHandleX, scrollHandleY, scrollHandleH; - protected boolean scrollHandleMouseOver; + // ghost slider for scrolling event + protected double scrollHandleX, scrollHandleY, scrollHandleH; + protected boolean scrollHandleMouseOver; protected boolean handleMouseOver; protected boolean dragging; protected double valueAtDragStart; public WSlider(double value, double min, double max) { - this.value = MathHelper.clamp(value, min, max); + this.value = Mth.clamp(value, min, max); this.min = min; this.max = max; } @@ -43,7 +43,7 @@ protected void onCalculateSize() { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { if (mouseOver && !doubled) { valueAtDragStart = value; double handleSize = handleSize(); @@ -67,21 +67,21 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double double s2 = s / 2; double x = this.x + s2 + valueWidth - height / 2; - handleMouseOver = mouseX >= x && mouseX <= x + height && mouseY >= y && mouseY <= y + height; - - if(!scrollHandleMouseOver) { - scrollHandleX = x; - scrollHandleY = y; - scrollHandleH = height; - if(handleMouseOver) { - scrollHandleMouseOver = true; - } - } else { - scrollHandleMouseOver = mouseX >= scrollHandleX && - mouseX <= scrollHandleX + scrollHandleH && - mouseY >= scrollHandleY && - mouseY <= scrollHandleY + scrollHandleH; - } + handleMouseOver = mouseX >= x && mouseX <= x + height && mouseY >= y && mouseY <= y + height; + + if (!scrollHandleMouseOver) { + scrollHandleX = x; + scrollHandleY = y; + scrollHandleH = height; + if (handleMouseOver) { + scrollHandleMouseOver = true; + } + } else { + scrollHandleMouseOver = mouseX >= scrollHandleX && + mouseX <= scrollHandleX + scrollHandleH && + mouseY >= scrollHandleY && + mouseY <= scrollHandleY + scrollHandleH; + } boolean mouseOverX = mouseX >= this.x + s2 && mouseX <= this.x + s2 + width - s; mouseOver = mouseOverX && mouseY >= this.y && mouseY <= this.y + height; @@ -89,7 +89,7 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double if (dragging) { if (mouseOverX) { valueWidth += mouseX - lastMouseX; - valueWidth = MathHelper.clamp(valueWidth, 0, width - s); + valueWidth = Mth.clamp(valueWidth, 0, width - s); set((valueWidth / (width - s)) * (max - min) + min); if (action != null) action.run(); @@ -106,7 +106,7 @@ public void onMouseMoved(double mouseX, double mouseY, double lastMouseX, double } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (dragging) { if (value != valueAtDragStart && actionOnRelease != null) { actionOnRelease.run(); @@ -120,35 +120,34 @@ public boolean onMouseReleased(Click click) { return false; } - @Override - public boolean onMouseScrolled(double amount) { - // when user starts to scroll over regular handle - // remember its position and check only this "ghost" - // position to allow scroll (until it leaves ghost area) - if (!scrollHandleMouseOver && handleMouseOver) { - scrollHandleX = x; - scrollHandleY = y; - scrollHandleH = height; - scrollHandleMouseOver = true; - } - - if (scrollHandleMouseOver) { - if (parent instanceof WIntEdit) { - set(value + amount); - } - else { - set(value + 0.05 * amount); - } - - if (action != null) action.run(); - return true; - } - - return false; - } + @Override + public boolean onMouseScrolled(double amount) { + // when user starts to scroll over regular handle + // remember its position and check only this "ghost" + // position to allow scroll (until it leaves ghost area) + if (!scrollHandleMouseOver && handleMouseOver) { + scrollHandleX = x; + scrollHandleY = y; + scrollHandleH = height; + scrollHandleMouseOver = true; + } + + if (scrollHandleMouseOver) { + if (parent instanceof WIntEdit) { + set(value + amount); + } else { + set(value + 0.05 * amount); + } + + if (action != null) action.run(); + return true; + } + + return false; + } public void set(double value) { - this.value = MathHelper.clamp(value, min, max); + this.value = Mth.clamp(value, min, max); } public double get() { 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 db29af084b..d528fd8d23 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/input/WTextBox.java @@ -5,6 +5,7 @@ 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; @@ -14,11 +15,10 @@ import meteordevelopment.meteorclient.gui.widgets.WWidget; import meteordevelopment.meteorclient.gui.widgets.containers.WContainer; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gui.Click; -import net.minecraft.client.input.CharInput; -import net.minecraft.client.input.KeyInput; -import net.minecraft.client.util.MacWindowUtil; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.util.Mth; import org.apache.commons.lang3.SystemUtils; import java.lang.reflect.InvocationTargetException; @@ -63,7 +63,8 @@ public WTextBox(String text, String placeholder, CharFilter filter, Class selectionEnd) { + } else if (best > selectionEnd) { selectionEnd = best + countToNextSpace(false, best); cursor = selectionEnd; - } - else { + } else { if (cursor == selectionStart) { int nextRight = countToNextSpace(false); if (best > cursor + nextRight) { @@ -214,8 +212,7 @@ else if (best > selectionEnd) { cursor = selectionEnd; } } - } - else if (cursor == selectionEnd) { + } else if (cursor == selectionEnd) { int nextLeft = countToNextSpace(true); if (best < cursor - nextLeft) { selectionEnd = cursor = cursor - nextLeft - 1; @@ -226,14 +223,13 @@ else if (cursor == selectionEnd) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { selecting = false; doubleClick = false; if (selectionStart < preSelectionCursor && preSelectionCursor == selectionEnd) { cursor = selectionStart; - } - else if (selectionEnd > preSelectionCursor && preSelectionCursor == selectionStart) { + } else if (selectionEnd > preSelectionCursor && preSelectionCursor == selectionStart) { cursor = selectionEnd; } @@ -241,40 +237,35 @@ else if (selectionEnd > preSelectionCursor && preSelectionCursor == selectionSta } @Override - public boolean onKeyPressed(KeyInput input) { + public boolean onKeyPressed(KeyEvent input) { if (!focused) return false; - boolean control = MacWindowUtil.IS_MAC ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; + boolean control = MacosUtil.IS_MACOS ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; if (control && input.key() == GLFW_KEY_C) { if (cursor != selectionStart || cursor != selectionEnd) { - mc.keyboard.setClipboard(text.substring(selectionStart, selectionEnd)); + mc.keyboardHandler.setClipboard(text.substring(selectionStart, selectionEnd)); } return true; - } - else if (control && input.key() == GLFW_KEY_X) { + } else if (control && input.key() == GLFW_KEY_X) { if (cursor != selectionStart || cursor != selectionEnd) { - mc.keyboard.setClipboard(text.substring(selectionStart, selectionEnd)); + mc.keyboardHandler.setClipboard(text.substring(selectionStart, selectionEnd)); clearSelection(); } return true; - } - else if (control && input.key() == GLFW_KEY_A) { + } else if (control && input.key() == GLFW_KEY_A) { cursor = text.length(); selectionStart = 0; selectionEnd = cursor; - } - else if (input.modifiers() == ((MacWindowUtil.IS_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) | GLFW_MOD_SHIFT) && input.key() == GLFW_KEY_A) { + } else if (input.modifiers() == ((MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) | GLFW_MOD_SHIFT) && input.key() == GLFW_KEY_A) { resetSelection(); - } - else if (input.key() == GLFW_KEY_ENTER || input.key() == GLFW_KEY_KP_ENTER) { + } else if (input.key() == GLFW_KEY_ENTER || input.key() == GLFW_KEY_KP_ENTER) { setFocused(false); if (actionOnUnfocused != null) actionOnUnfocused.run(); return true; - } - else if (input.key() == GLFW_KEY_TAB && completionsW != null) { + } else if (input.key() == GLFW_KEY_TAB && completionsW != null) { String completion = ((ICompletionItem) completionsW.cells.get(getSelectedCompletion()).widget()).getCompletion(); StringBuilder sb = new StringBuilder(text.length() + completion.length() + 1); @@ -305,19 +296,19 @@ else if (input.key() == GLFW_KEY_TAB && completionsW != null) { } @Override - public boolean onKeyRepeated(KeyInput input) { + public boolean onKeyRepeated(KeyEvent input) { if (!focused) return false; - boolean control = MacWindowUtil.IS_MAC ? input.modifiers() == GLFW_MOD_SUPER : input.modifiers() == GLFW_MOD_CONTROL; + 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 : MacWindowUtil.IS_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) | 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); if (control && input.key() == GLFW_KEY_V) { clearSelection(); String preText = text; - String clipboard = mc.keyboard.getClipboard(); + String clipboard = mc.keyboardHandler.getClipboard(); int addedChars = 0; StringBuilder sb = new StringBuilder(text.length() + clipboard.length()); @@ -337,51 +328,46 @@ public boolean onKeyRepeated(KeyInput input) { if (!text.equals(preText)) runAction(); return true; - } - else if (input.key() == GLFW_KEY_BACKSPACE) { + } else if (input.key() == GLFW_KEY_BACKSPACE) { if (cursor > 0 && cursor == selectionStart && cursor == selectionEnd) { String preText = text; - int count = (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacWindowUtil.IS_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) + int count = (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) ? cursor : (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) - ? countToNextSpace(true) - : 1; + ? countToNextSpace(true) + : 1; text = text.substring(0, cursor - count) + text.substring(cursor); cursor -= count; resetSelection(); if (!text.equals(preText)) runAction(); - } - else if (cursor != selectionStart || cursor != selectionEnd) { + } else if (cursor != selectionStart || cursor != selectionEnd) { clearSelection(); } return true; - } - else if (input.key() == GLFW_KEY_DELETE) { + } else if (input.key() == GLFW_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 : MacWindowUtil.IS_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) + int count = input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL) ? text.length() - cursor : (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_CONTROL : GLFW_MOD_ALT)) - ? countToNextSpace(false) - : 1; + ? countToNextSpace(false) + : 1; text = text.substring(0, cursor) + text.substring(cursor + count); if (!text.equals(preText)) runAction(); } - } - else { + } else { clearSelection(); } return true; - } - else if (input.key() == GLFW_KEY_LEFT) { + } else if (input.key() == GLFW_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)) { @@ -389,7 +375,7 @@ else if (input.key() == GLFW_KEY_LEFT) { resetSelection(); } // sets the cursor to the beginning of the text box - else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacWindowUtil.IS_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) { + else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) { cursor = 0; resetSelection(); } @@ -402,8 +388,7 @@ else if (altShift) { selectionEnd = selectionStart; selectionStart = cursor; } - } - else { + } else { cursor -= countToNextSpace(true); selectionStart = cursor; } @@ -421,8 +406,7 @@ else if (controlShift) { else if (shift) { if (cursor == selectionEnd && cursor != selectionStart) { selectionEnd = cursor - 1; - } - else { + } else { selectionStart = cursor - 1; } @@ -432,8 +416,7 @@ else if (shift) { else { if (cursor == selectionEnd && cursor != selectionStart) { cursor = selectionStart; - } - else { + } else { cursor--; } @@ -441,16 +424,14 @@ else if (shift) { } cursorChanged(); - } - else if (selectionStart != selectionEnd && selectionStart == 0 && input.modifiers() == 0) { + } else if (selectionStart != selectionEnd && selectionStart == 0 && input.modifiers() == 0) { cursor = 0; resetSelection(); cursorChanged(); } return true; - } - else if (input.key() == GLFW_KEY_RIGHT) { + } else if (input.key() == GLFW_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)) { @@ -458,7 +439,7 @@ else if (input.key() == GLFW_KEY_RIGHT) { resetSelection(); } // sets the cursor to the end of the text box - else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacWindowUtil.IS_MAC ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) { + else if (input.modifiers() == (SystemUtils.IS_OS_WINDOWS ? GLFW_MOD_ALT : MacosUtil.IS_MACOS ? GLFW_MOD_SUPER : GLFW_MOD_CONTROL)) { cursor = text.length(); resetSelection(); } @@ -471,8 +452,7 @@ else if (altShift) { selectionStart = selectionEnd; selectionEnd = cursor; } - } - else { + } else { cursor += countToNextSpace(false); selectionEnd = cursor; } @@ -489,8 +469,7 @@ else if (controlShift) { else if (shift) { if (cursor == selectionStart && cursor != selectionEnd) { selectionStart = cursor + 1; - } - else { + } else { selectionEnd = cursor + 1; } @@ -500,8 +479,7 @@ else if (shift) { else { if (cursor == selectionStart && cursor != selectionEnd) { cursor = selectionEnd; - } - else { + } else { cursor++; } @@ -509,16 +487,14 @@ else if (shift) { } cursorChanged(); - } - else if (selectionStart != selectionEnd && selectionEnd == text.length() && input.modifiers() == 0) { + } else if (selectionStart != selectionEnd && selectionEnd == text.length() && input.modifiers() == 0) { cursor = text.length(); resetSelection(); cursorChanged(); } return true; - } - else if (input.key() == GLFW_KEY_DOWN && completionsW != null) { + } else if (input.key() == GLFW_KEY_DOWN && completionsW != null) { int currentI = getSelectedCompletion(); if (currentI == Math.min(5, completions.size() - 1)) { @@ -526,15 +502,13 @@ else if (input.key() == GLFW_KEY_DOWN && completionsW != null) { completionsStart++; createCompletions(completionsStart + currentI); } - } - else { + } else { ((ICompletionItem) completionsW.cells.get(currentI).widget()).setSelected(false); ((ICompletionItem) completionsW.cells.get(currentI + 1).widget()).setSelected(true); } return true; - } - else if (input.key() == GLFW_KEY_UP && completionsW != null) { + } else if (input.key() == GLFW_KEY_UP && completionsW != null) { int currentI = getSelectedCompletion(); if (currentI == 0) { @@ -542,8 +516,7 @@ else if (input.key() == GLFW_KEY_UP && completionsW != null) { completionsStart--; createCompletions(completionsStart + currentI); } - } - else { + } else { ((ICompletionItem) completionsW.cells.get(currentI).widget()).setSelected(false); ((ICompletionItem) completionsW.cells.get(currentI - 1).widget()).setSelected(true); } @@ -566,13 +539,13 @@ private int getSelectedCompletion() { } @Override - public boolean onCharTyped(CharInput input) { + public boolean onCharTyped(CharacterEvent input) { if (!focused) return false; if (filter.filter(text, input.codepoint())) { clearSelection(); - text = text.substring(0, cursor) + input.asString() + text.substring(cursor); + text = text.substring(0, cursor) + input.codepointAsString() + text.substring(cursor); cursor++; resetSelection(); @@ -671,7 +644,7 @@ private void cursorChanged() { textStart += cursor - (textStart + maxTextWidth()); } - textStart = MathHelper.clamp(textStart, 0, Math.max(textWidth() - maxTextWidth(), 0)); + textStart = Mth.clamp(textStart, 0, Math.max(textWidth() - maxTextWidth(), 0)); onCursorChanged(); @@ -681,7 +654,9 @@ private void cursorChanged() { completionsW = null; if (completions != null && !completions.isEmpty()) createCompletions(0); } - protected void onCursorChanged() {} + + protected void onCursorChanged() { + } private void createCompletions(int selected) { completionsW = createCompletionsRootWidget(); @@ -697,7 +672,7 @@ private void createCompletions(int selected) { } completionsW.calculateSize(); - completionsW.x = Math.min(Math.max(x - pad() * 2 + getTextWidth(cursor) - getOverflowWidthForRender(), x), x + width - completionsW.width); + completionsW.x = Math.clamp(x - pad() * 2 + getTextWidth(cursor) - getOverflowWidthForRender(), x, x + width - completionsW.width); completionsW.y = y + height; completionsW.calculateWidgetPositions(); } @@ -726,7 +701,7 @@ public String get() { public void set(String text) { this.text = text; - cursor = MathHelper.clamp(cursor, 0, text.length()); + cursor = Mth.clamp(cursor, 0, text.length()); selectionStart = cursor; selectionEnd = cursor; diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java index bbb1a4cbc4..d66ad49ed6 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedButton.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.gui.widgets.pressable; import meteordevelopment.meteorclient.gui.renderer.packer.GuiTexture; -import net.minecraft.client.gui.Click; +import net.minecraft.client.input.MouseButtonEvent; public abstract class WConfirmedButton extends WButton { @@ -19,7 +19,7 @@ public WConfirmedButton(String text, String confirmText, GuiTexture texture) { } @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { boolean pressed = super.onMouseClicked(click, doubled); if (!pressed) { pressedOnce = false; @@ -29,7 +29,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (pressed && pressedOnce) super.onMouseReleased(click); pressedOnce = pressed; invalidate(); diff --git a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedMinus.java b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedMinus.java index 31381dd52e..189c5d42f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedMinus.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WConfirmedMinus.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.gui.widgets.pressable; -import net.minecraft.client.gui.Click; +import net.minecraft.client.input.MouseButtonEvent; public class WConfirmedMinus extends WMinus { protected boolean pressedOnce = false; @Override - public boolean onMouseClicked(Click click, boolean doubled) { + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { boolean pressed = super.onMouseClicked(click, doubled); if (!pressed) { pressedOnce = false; @@ -20,7 +20,7 @@ public boolean onMouseClicked(Click click, boolean doubled) { } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (pressed && pressedOnce) super.onMouseReleased(click); pressedOnce = pressed; return pressed = false; 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 93406f51cb..ac58f20c63 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WPressable.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/widgets/pressable/WPressable.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.gui.widgets.pressable; import meteordevelopment.meteorclient.gui.widgets.WWidget; -import net.minecraft.client.gui.Click; +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; @@ -17,13 +17,14 @@ public abstract class WPressable extends WWidget { protected boolean pressed; @Override - public boolean onMouseClicked(Click click, boolean doubled) { - if (mouseOver && (click.button() == GLFW_MOUSE_BUTTON_LEFT || click.button() == GLFW_MOUSE_BUTTON_RIGHT)) pressed = true; + public boolean onMouseClicked(MouseButtonEvent click, boolean doubled) { + if (mouseOver && (click.button() == GLFW_MOUSE_BUTTON_LEFT || click.button() == GLFW_MOUSE_BUTTON_RIGHT)) + pressed = true; return pressed; } @Override - public boolean onMouseReleased(Click click) { + public boolean onMouseReleased(MouseButtonEvent click) { if (pressed) { onPressed(click.button()); if (action != null) action.run(); @@ -34,5 +35,6 @@ public boolean onMouseReleased(Click click) { return false; } - protected void onPressed(int button) {} + protected void onPressed(int button) { + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BoxMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AABBMixin.java similarity index 63% rename from src/main/java/meteordevelopment/meteorclient/mixin/BoxMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/AABBMixin.java index 2bf35405fe..f39fd82073 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BoxMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AABBMixin.java @@ -5,22 +5,40 @@ package meteordevelopment.meteorclient.mixin; -import meteordevelopment.meteorclient.mixininterface.IBox; -import net.minecraft.util.math.Box; +import meteordevelopment.meteorclient.mixininterface.IAABB; +import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; -@Mixin(Box.class) -public abstract class BoxMixin implements IBox { - @Shadow @Final @Mutable public double minX; - @Shadow @Final @Mutable public double minY; - @Shadow @Final @Mutable public double minZ; +@Mixin(AABB.class) +public abstract class AABBMixin implements IAABB { + @Shadow + @Final + @Mutable + public double minX; + @Shadow + @Final + @Mutable + public double minY; + @Shadow + @Final + @Mutable + public double minZ; - @Shadow @Final @Mutable public double maxX; - @Shadow @Final @Mutable public double maxY; - @Shadow @Final @Mutable public double maxZ; + @Shadow + @Final + @Mutable + public double maxX; + @Shadow + @Final + @Mutable + public double maxY; + @Shadow + @Final + @Mutable + public double maxZ; @Override public void meteor$expand(double v) { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java index b47e5b9935..1d12a17551 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockStateMixin.java @@ -7,20 +7,20 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.block.AbstractBlock; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockBehaviour; +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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(AbstractBlock.AbstractBlockState.class) +@Mixin(BlockBehaviour.BlockStateBase.class) public abstract class AbstractBlockStateMixin { - @Inject(method = "getModelOffset", at = @At("HEAD"), cancellable = true) - private void modifyPos(BlockPos pos, CallbackInfoReturnable info) { + @Inject(method = "getOffset", at = @At("HEAD"), cancellable = true) + private void modifyPos(BlockPos pos, CallbackInfoReturnable cir) { if (Modules.get() == null) return; - if (Modules.get().get(NoRender.class).noTextureRotations()) info.setReturnValue(Vec3d.ZERO); + if (Modules.get().get(NoRender.class).noTextureRotations()) cir.setReturnValue(Vec3.ZERO); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBoatEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBoatMixin.java similarity index 56% rename from src/main/java/meteordevelopment/meteorclient/mixin/AbstractBoatEntityMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/AbstractBoatMixin.java index 14313115cb..12d6da6f89 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBoatEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBoatMixin.java @@ -8,22 +8,24 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.EntityControl; -import net.minecraft.entity.vehicle.AbstractBoatEntity; +import net.minecraft.world.entity.vehicle.boat.AbstractBoat; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(AbstractBoatEntity.class) -public abstract class AbstractBoatEntityMixin { - @ModifyExpressionValue(method = "updatePaddles", at = @At(value = "FIELD", target = "Lnet/minecraft/entity/vehicle/AbstractBoatEntity;pressingLeft:Z", opcode = Opcodes.GETFIELD)) +@Mixin(AbstractBoat.class) +public abstract class AbstractBoatMixin { + @ModifyExpressionValue(method = "controlBoat", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/vehicle/boat/AbstractBoat;inputLeft:Z", opcode = Opcodes.GETFIELD)) private boolean modifyPressingLeft(boolean original) { - if (Modules.get().isActive(EntityControl.class) && Modules.get().get(EntityControl.class).lockYaw.get()) return false; + if (Modules.get().isActive(EntityControl.class) && Modules.get().get(EntityControl.class).lockYaw.get()) + return false; return original; } - @ModifyExpressionValue(method = "updatePaddles", at = @At(value = "FIELD", target = "Lnet/minecraft/entity/vehicle/AbstractBoatEntity;pressingRight:Z", opcode = Opcodes.GETFIELD)) + @ModifyExpressionValue(method = "controlBoat", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/vehicle/boat/AbstractBoat;inputRight:Z", opcode = Opcodes.GETFIELD)) private boolean modifyPressingRight(boolean original) { - if (Modules.get().isActive(EntityControl.class) && Modules.get().get(EntityControl.class).lockYaw.get()) return false; + if (Modules.get().isActive(EntityControl.class) && Modules.get().get(EntityControl.class).lockYaw.get()) + return false; return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerAccessor.java new file mode 100644 index 0000000000..c9a24d698c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerAccessor.java @@ -0,0 +1,17 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.multiplayer.PlayerInfo; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(AbstractClientPlayer.class) +public interface AbstractClientPlayerAccessor { + @Accessor("playerInfo") + void meteor$setPlayerInfo(PlayerInfo entry); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityAccessor.java deleted file mode 100644 index de34fcf50f..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityAccessor.java +++ /dev/null @@ -1,17 +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 net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.PlayerListEntry; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(AbstractClientPlayerEntity.class) -public interface AbstractClientPlayerEntityAccessor { - @Accessor("playerListEntry") - void meteor$setPlayerListEntry(PlayerListEntry entry); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerMixin.java similarity index 61% rename from src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerMixin.java index 08afee7b20..e1b9a787a3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractClientPlayerMixin.java @@ -6,8 +6,8 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.utils.misc.FakeClientPlayer; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.client.player.AbstractClientPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -15,12 +15,12 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -@Mixin(AbstractClientPlayerEntity.class) -public abstract class AbstractClientPlayerEntityMixin { +@Mixin(AbstractClientPlayer.class) +public abstract class AbstractClientPlayerMixin { // Player model rendering in main menu - @Inject(method = "getPlayerListEntry", at = @At("HEAD"), cancellable = true) - private void onGetPlayerListEntry(CallbackInfoReturnable info) { - if (mc.getNetworkHandler() == null) info.setReturnValue(FakeClientPlayer.getPlayerListEntry()); + @Inject(method = "getPlayerInfo", at = @At("HEAD"), cancellable = true) + private void onGetPlayerListEntry(CallbackInfoReturnable cir) { + if (mc.getConnection() == null) cir.setReturnValue(FakeClientPlayer.getPlayerListEntry()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenAccessor.java new file mode 100644 index 0000000000..70ef8225ab --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenAccessor.java @@ -0,0 +1,17 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.world.inventory.Slot; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(AbstractContainerScreen.class) +public interface AbstractContainerScreenAccessor { + @Accessor("hoveredSlot") + Slot meteor$getHoveredSlot(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenMixin.java new file mode 100644 index 0000000000..b28002764b --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractContainerScreenMixin.java @@ -0,0 +1,138 @@ +/* + * 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 meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import meteordevelopment.meteorclient.systems.modules.render.ItemHighlight; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.MenuAccess; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerInput; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; +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 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 { + @Shadow + protected Slot hoveredSlot; + + @Shadow + protected int leftPos; + @Shadow + protected int topPos; + + @Shadow + @Nullable + protected abstract Slot getHoveredSlot(double x, double y); + + @Shadow + public abstract T getMenu(); + + @Shadow + private boolean doubleclick; + + @Shadow + protected abstract void slotClicked(Slot slot, int slotId, int buttonNum, ContainerInput containerInput); + + @Shadow + public abstract void onClose(); + + public AbstractContainerScreenMixin(Component title) { + super(title); + } + + @Inject(method = "init", at = @At("TAIL")) + private void onInit(CallbackInfo ci) { + InventoryTweaks invTweaks = Modules.get().get(InventoryTweaks.class); + + if (invTweaks.isActive() && invTweaks.showButtons() && invTweaks.canSteal(getMenu())) { + addRenderableWidget( + new Button.Builder(Component.literal("Steal"), button -> invTweaks.steal(getMenu())) + .pos(leftPos, topPos - 22) + .size(40, 20) + .build() + ); + + addRenderableWidget( + new Button.Builder(Component.literal("Dump"), button -> invTweaks.dump(getMenu())) + .pos(leftPos + 42, topPos - 22) + .size(40, 20) + .build() + ); + } + } + + // 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()) + return; + + Slot slot = getHoveredSlot(event.x(), event.y()); + if (slot != null && slot.hasItem() && mc.hasShiftDown()) + slotClicked(slot, slot.index, event.button(), ContainerInput.QUICK_MOVE); + } + + // Middle click open + @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) + private void mouseClicked(MouseButtonEvent event, boolean doubleClick, CallbackInfoReturnable cir) { + BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); + + if (tooltips.shouldOpenContents(event) && hoveredSlot != null && !hoveredSlot.getItem().isEmpty() && getMenu().getCarried().isEmpty()) { + if (tooltips.openContent(hoveredSlot.getItem())) { + cir.setReturnValue(true); + } + } + } + + // Keyboard input for middle click open + @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) + private void keyPressed(KeyEvent event, CallbackInfoReturnable cir) { + BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); + + if (tooltips.shouldOpenContents(event) && hoveredSlot != null && !hoveredSlot.getItem().isEmpty() && getMenu().getCarried().isEmpty()) { + if (tooltips.openContent(hoveredSlot.getItem())) { + cir.setReturnValue(true); + } + } + } + + // Item Highlight + @Inject(method = "extractSlot", at = @At("HEAD")) + private void onRenderSlot(GuiGraphicsExtractor graphics, Slot slot, int mouseX, int mouseY, CallbackInfo ci) { + int color = Modules.get().get(ItemHighlight.class).getColor(slot.getItem()); + if (color != -1) graphics.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, color); + } + + @ModifyReturnValue(method = "showTooltipWithItemInHand", at = @At("RETURN")) + private boolean showTooltipWithItemInHand(boolean original, ItemStack item) { + if (item.getTooltipImage().orElse(null) instanceof ClientTooltipComponent component) { + return original || component.showTooltipWithItemInHand(); + } + + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceMenuMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceMenuMixin.java new file mode 100644 index 0000000000..743c4774fa --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceMenuMixin.java @@ -0,0 +1,23 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.mixininterface.IAbstractFurnaceMenu; +import net.minecraft.world.inventory.AbstractFurnaceMenu; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(AbstractFurnaceMenu.class) +public abstract class AbstractFurnaceMenuMixin implements IAbstractFurnaceMenu { + @Shadow + protected abstract boolean canSmelt(ItemStack itemStack); + + @Override + public boolean meteor$canSmelt(ItemStack itemStack) { + return canSmelt(itemStack); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceScreenHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceScreenHandlerMixin.java deleted file mode 100644 index 807dae715a..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceScreenHandlerMixin.java +++ /dev/null @@ -1,23 +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 meteordevelopment.meteorclient.mixininterface.IAbstractFurnaceScreenHandler; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.AbstractFurnaceScreenHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(AbstractFurnaceScreenHandler.class) -public abstract class AbstractFurnaceScreenHandlerMixin implements IAbstractFurnaceScreenHandler { - @Shadow - protected abstract boolean isSmeltable(ItemStack itemStack); - - @Override - public boolean meteor$isItemSmeltable(ItemStack itemStack) { - return isSmeltable(itemStack); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceScreenMixin.java index c773b0b5cf..f843caffc1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractFurnaceScreenMixin.java @@ -7,24 +7,24 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.AutoSmelter; -import net.minecraft.client.gui.screen.ingame.AbstractFurnaceScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.AbstractFurnaceScreenHandler; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.AbstractFurnaceScreen; +import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractFurnaceMenu; import org.spongepowered.asm.mixin.Mixin; @Mixin(AbstractFurnaceScreen.class) -public abstract class AbstractFurnaceScreenMixin extends HandledScreen implements RecipeBookProvider { - public AbstractFurnaceScreenMixin(T container, PlayerInventory playerInventory, Text name) { +public abstract class AbstractFurnaceScreenMixin extends AbstractContainerScreen implements RecipeUpdateListener { + public AbstractFurnaceScreenMixin(T container, Inventory playerInventory, Component name) { super(container, playerInventory, name); } @Override - public void handledScreenTick() { - super.handledScreenTick(); + public void containerTick() { + super.containerTick(); - if (Modules.get().isActive(AutoSmelter.class)) Modules.get().get(AutoSmelter.class).tick(handler); + if (Modules.get().isActive(AutoSmelter.class)) Modules.get().get(AutoSmelter.class).tick(menu); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MountScreenHandlerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractMountInventoryMenuAccessor.java similarity index 62% rename from src/main/java/meteordevelopment/meteorclient/mixin/MountScreenHandlerAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/AbstractMountInventoryMenuAccessor.java index 11acefa5a9..233c1e7653 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MountScreenHandlerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractMountInventoryMenuAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.LivingEntity; -import net.minecraft.screen.MountScreenHandler; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.inventory.AbstractMountInventoryMenu; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(MountScreenHandler.class) -public interface MountScreenHandlerAccessor { +@Mixin(AbstractMountInventoryMenu.class) +public interface AbstractMountInventoryMenuAccessor { @Accessor("mount") LivingEntity meteor$getMount(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenAccessor.java index cc06eddcef..e2e8d9a9ce 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignEditScreenAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.client.gui.screens.inventory.AbstractSignEditScreen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(AbstractSignEditScreen.class) public interface AbstractSignEditScreenAccessor { - @Accessor("blockEntity") + @Accessor("sign") SignBlockEntity meteor$getSign(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignRendererMixin.java similarity index 67% rename from src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignBlockEntityRendererMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignRendererMixin.java index cde62a3298..57e8dbc39f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AbstractSignRendererMixin.java @@ -8,13 +8,13 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.render.block.entity.AbstractSignBlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.AbstractSignRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(AbstractSignBlockEntityRenderer.class) -public abstract class AbstractSignBlockEntityRendererMixin { - @ModifyExpressionValue(method = "renderText", at = @At(value = "CONSTANT", args = {"intValue=4", "ordinal=1"})) +@Mixin(AbstractSignRenderer.class) +public abstract class AbstractSignRendererMixin { + @ModifyExpressionValue(method = "submitSignText", at = @At(value = "CONSTANT", args = {"intValue=4", "ordinal=1"})) private int loopTextLengthProxy(int i) { if (Modules.get().get(NoRender.class).noSignText()) return 0; return i; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorFeatureRendererMixin.java deleted file mode 100644 index 80a9b53858..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorFeatureRendererMixin.java +++ /dev/null @@ -1,27 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.state.BipedEntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -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(ArmorFeatureRenderer.class) -public abstract class ArmorFeatureRendererMixin, A extends BipedEntityModel> { - @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;ILnet/minecraft/client/render/entity/state/BipedEntityRenderState;FF)V", at = @At("HEAD"), cancellable = true) - private void onRender(MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, int i, S bipedEntityRenderState, float f, float g, CallbackInfo ci) { - if (bipedEntityRenderState instanceof PlayerEntityRenderState && Modules.get().get(NoRender.class).noArmor()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorStandEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorStandRendererMixin.java similarity index 61% rename from src/main/java/meteordevelopment/meteorclient/mixin/ArmorStandEntityRendererMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ArmorStandRendererMixin.java index 35bc339bf9..78d4f668d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ArmorStandEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ArmorStandRendererMixin.java @@ -8,19 +8,19 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.ESP; -import net.minecraft.client.render.entity.ArmorStandEntityRenderer; -import net.minecraft.entity.EntityType; +import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.world.entity.EntityType; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -@Mixin(ArmorStandEntityRenderer.class) -public class ArmorStandEntityRendererMixin { +@Mixin(ArmorStandRenderer.class) +public abstract class ArmorStandRendererMixin { @Unique private static ESP esp; - @ModifyExpressionValue(method = "getRenderLayer(Lnet/minecraft/client/render/entity/state/ArmorStandEntityRenderState;ZZZ)Lnet/minecraft/client/render/RenderLayer;", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/ArmorStandEntityRenderState;marker:Z", opcode = Opcodes.GETFIELD)) + @ModifyExpressionValue(method = "getRenderType(Lnet/minecraft/client/renderer/entity/state/ArmorStandRenderState;ZZZ)Lnet/minecraft/client/renderer/rendertype/RenderType;", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/ArmorStandRenderState;isMarker:Z", opcode = Opcodes.GETFIELD)) private boolean modifyMarkerValue(boolean original) { if (esp == null) esp = Modules.get().get(ESP.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AttackRangeComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AttackRangeMixin.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/mixin/AttackRangeComponentMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/AttackRangeMixin.java index e39095991f..56ed72f9e9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AttackRangeComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AttackRangeMixin.java @@ -8,20 +8,20 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.Hitboxes; -import net.minecraft.component.type.AttackRangeComponent; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.component.AttackRange; +import net.minecraft.world.phys.Vec3; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import java.util.function.ToDoubleFunction; -@Mixin(AttackRangeComponent.class) -public class AttackRangeComponentMixin { - @ModifyExpressionValue(method = "isWithinRange(Lnet/minecraft/entity/LivingEntity;Ljava/util/function/ToDoubleFunction;D)Z", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/AttackRangeComponent;hitboxMargin:F", opcode = Opcodes.GETFIELD)) - private float modifyHitboxMargin(float original, LivingEntity entity, ToDoubleFunction squaredDistanceFunction, double extraHitboxMargin) { - float v = (float) Modules.get().get(Hitboxes.class).getEntityValue(entity); +@Mixin(AttackRange.class) +public abstract class AttackRangeMixin { + @ModifyExpressionValue(method = "isInRange(Lnet/minecraft/world/entity/LivingEntity;Ljava/util/function/ToDoubleFunction;D)Z", at = @At(value = "FIELD", target = "Lnet/minecraft/world/item/component/AttackRange;hitboxMargin:F", opcode = Opcodes.GETFIELD)) + private float modifyHitboxMargin(float original, LivingEntity attacker, ToDoubleFunction distanceFunction, double extraBuffer) { + float v = (float) Modules.get().get(Hitboxes.class).getEntityValue(attacker); return original + v; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java new file mode 100644 index 0000000000..54dbd67e01 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/AvatarRendererMixin.java @@ -0,0 +1,100 @@ +/* + * 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.v2.WrapWithCondition; +import com.mojang.blaze3d.vertex.PoseStack; +import meteordevelopment.meteorclient.mixininterface.IVec3; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Chams; +import meteordevelopment.meteorclient.utils.player.Rotations; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.player.PlayerModel; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.AvatarRenderer; +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.resources.Identifier; +import net.minecraft.world.entity.Avatar; +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; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(AvatarRenderer.class) +public abstract class AvatarRendererMixin + extends LivingEntityRenderer { + // Chams + + @Unique + private Chams chams; + + public AvatarRendererMixin(EntityRendererProvider.Context ctx, PlayerModel model, float shadowRadius) { + super(ctx, model, shadowRadius); + } + + @Inject(method = "", at = @At("RETURN")) + private void init$chams(CallbackInfo ci) { + chams = Modules.get().get(Chams.class); + } + + // Chams - Player scale + + @Inject(method = "extractRenderState(Lnet/minecraft/world/entity/Avatar;Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;F)V", at = @At("RETURN")) + private void updateRenderState$scale(Avatar entity, AvatarRenderState state, float partialTicks, CallbackInfo ci) { + if (!chams.isActive() || !chams.players.get()) return; + if (chams.ignoreSelf.get() && entity == mc.player) return; + + float v = chams.playersScale.get().floatValue(); + state.scale *= v; + + if (state.nameTagAttachment != null) + ((IVec3) state.nameTagAttachment).meteor$setY(state.nameTagAttachment.y + (entity.getBbHeight() * v - entity.getBbHeight())); + } + + // Chams - Hand Texture + + @ModifyExpressionValue(method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/rendertype/RenderTypes;entityTranslucent(Lnet/minecraft/resources/Identifier;)Lnet/minecraft/client/renderer/rendertype/RenderType;")) + private RenderType renderArm$texture(RenderType original, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, Identifier skinTexture, ModelPart arm, boolean hasSleeve) { + if (chams.isActive() && chams.hand.get()) { + Identifier texture = chams.handTexture.get() ? skinTexture : Chams.BLANK; + return RenderTypes.entityTranslucent(texture); + } + + return original; + } + + // 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) { + if (chams.isActive() && chams.hand.get()) { + instance.submitModelPart(modelPart, matrixStack, renderLayer, light, uv, null, chams.handColor.get().getPacked(), null); + return false; + } + + return true; + } + + // Rotations + + @Inject(method = "extractRenderState(Lnet/minecraft/world/entity/Avatar;Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;F)V", at = @At("RETURN")) + private void extractRenderState$rotations(Avatar entity, AvatarRenderState state, float partialTicks, CallbackInfo ci) { + if (Rotations.rotating && entity == mc.player) { + state.yRot = 0; + state.bodyRot = Rotations.serverYaw; + state.xRot = Rotations.serverPitch; + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BannerBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BannerBlockEntityRendererMixin.java deleted file mode 100644 index e6798c11da..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BannerBlockEntityRendererMixin.java +++ /dev/null @@ -1,81 +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.sugar.Local; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.block.entity.BannerBlockEntityRenderer; -import net.minecraft.client.render.block.entity.model.BannerBlockModel; -import net.minecraft.client.render.block.entity.state.BannerBlockEntityRenderState; -import net.minecraft.client.render.command.ModelCommandRenderer; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.model.ModelBaker; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.texture.SpriteHolder; -import net.minecraft.client.util.SpriteIdentifier; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Unit; -import net.minecraft.util.math.RotationAxis; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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(BannerBlockEntityRenderer.class) -public abstract class BannerBlockEntityRendererMixin { - @Shadow - @Final - private SpriteHolder materials; - - @Inject(method = "render(Lnet/minecraft/client/render/block/entity/state/BannerBlockEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At("HEAD"), cancellable = true) - private void injectRender1(BannerBlockEntityRenderState bannerBlockEntityRenderState, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState arg, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).getBannerRenderMode() == NoRender.BannerRenderMode.None) ci.cancel(); - } - - @Inject(method = "render(Lnet/minecraft/client/render/block/entity/state/BannerBlockEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;render(Lnet/minecraft/client/texture/SpriteHolder;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;IIFLnet/minecraft/client/render/block/entity/model/BannerBlockModel;Lnet/minecraft/client/render/block/entity/model/BannerFlagBlockModel;FLnet/minecraft/util/DyeColor;Lnet/minecraft/component/type/BannerPatternsComponent;Lnet/minecraft/client/render/command/ModelCommandRenderer$CrumblingOverlayCommand;I)V"), cancellable = true) - private void injectRender2(BannerBlockEntityRenderState bannerBlockEntityRenderState, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState cameraRenderState, CallbackInfo ci, @Local BannerBlockModel bannerBlockModel) { - if (Modules.get().get(NoRender.class).getBannerRenderMode() == NoRender.BannerRenderMode.Pillar) { - renderPillar( - matrixStack, - orderedRenderCommandQueue, - bannerBlockEntityRenderState.lightmapCoordinates, - bannerBlockEntityRenderState.yaw, - bannerBlockModel, - this.materials, - bannerBlockEntityRenderState.crumblingOverlay - ); - ci.cancel(); - } - } - - @Unique - private static void renderPillar(MatrixStack matrices, OrderedRenderCommandQueue entityRenderCommandQueue, int light, float rotation, BannerBlockModel model, SpriteHolder spriteHolder, ModelCommandRenderer.CrumblingOverlayCommand arg) { - matrices.push(); - matrices.translate(0.5F, 0.0F, 0.5F); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(rotation)); - matrices.scale(0.6666667F, -0.6666667F, -0.6666667F); - SpriteIdentifier spriteIdentifier = ModelBaker.BANNER_BASE; - entityRenderCommandQueue.submitModel( - model, - Unit.INSTANCE, - matrices, - spriteIdentifier.getRenderLayer(RenderLayers::entitySolid), - light, - OverlayTexture.DEFAULT_UV, - -1, - spriteHolder.getSprite(spriteIdentifier), - 0, - arg - ); - matrices.pop(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BannerRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BannerRendererMixin.java new file mode 100644 index 0000000000..bca35781f1 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BannerRendererMixin.java @@ -0,0 +1,80 @@ +/* + * 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.vertex.PoseStack; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.NoRender; +import net.minecraft.client.model.object.banner.BannerModel; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.blockentity.BannerRenderer; +import net.minecraft.client.renderer.blockentity.state.BannerRenderState; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.sprite.SpriteGetter; +import net.minecraft.client.resources.model.sprite.SpriteId; +import net.minecraft.util.Unit; +import net.minecraft.world.level.block.BannerBlock; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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(BannerRenderer.class) +public abstract class BannerRendererMixin { + @Shadow + @Final + private SpriteGetter sprites; + + @Shadow + protected abstract BannerModel bannerModel(final BannerBlock.AttachmentType type); + + @Inject(method = "submit(Lnet/minecraft/client/renderer/blockentity/state/BannerRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At("HEAD"), cancellable = true) + private void injectRender1(BannerRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).getBannerRenderMode() == NoRender.BannerRenderMode.None) ci.cancel(); + } + + @Inject( + method = "submit(Lnet/minecraft/client/renderer/blockentity/state/BannerRenderState;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/blockentity/BannerRenderer;submitBanner(Lnet/minecraft/client/resources/model/sprite/SpriteGetter;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;IILnet/minecraft/client/model/object/banner/BannerModel;Lnet/minecraft/client/model/object/banner/BannerFlagModel;FLnet/minecraft/world/item/DyeColor;Lnet/minecraft/world/level/block/entity/BannerPatternLayers;Lnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;I)V"), + cancellable = true + ) + private void injectRender2(BannerRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).getBannerRenderMode() == NoRender.BannerRenderMode.Pillar) { + renderPillar( + poseStack, + submitNodeCollector, + state.lightCoords, + this.bannerModel(state.attachmentType), + this.sprites, + state.breakProgress + ); + ci.cancel(); + } + } + + @Unique + private static void renderPillar(PoseStack matrices, SubmitNodeCollector submitNodeCollector, int light, BannerModel model, SpriteGetter sprites, ModelFeatureRenderer.CrumblingOverlay breakProgress) { + SpriteId sprite = Sheets.BANNER_BASE; + submitNodeCollector.submitModel( + model, + Unit.INSTANCE, + matrices, + light, + OverlayTexture.NO_OVERLAY, + -1, + sprite, + sprites, + 0, + breakProgress + ); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconBlockEntityRendererMixin.java deleted file mode 100644 index 49e45c49db..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconBlockEntityRendererMixin.java +++ /dev/null @@ -1,29 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.block.entity.BeamEmitter; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.state.BeaconBlockEntityRenderState; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -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(BeaconBlockEntityRenderer.class) -public abstract class BeaconBlockEntityRendererMixin implements BlockEntityRenderer { - @Inject(method = "renderBeam(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/util/Identifier;FFIIIFF)V", at = @At("HEAD"), cancellable = true) - private static void onRender(MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, Identifier textureId, float tickProgress, float heightScale, int i, int j, int k, float f, float g, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noBeaconBeams()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconRendererMixin.java new file mode 100644 index 0000000000..45c9a77152 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconRendererMixin.java @@ -0,0 +1,29 @@ +/* + * 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.vertex.PoseStack; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.NoRender; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.blockentity.BeaconRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.state.BeaconRenderState; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.entity.BeaconBeamOwner; +import net.minecraft.world.level.block.entity.BlockEntity; +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(BeaconRenderer.class) +public abstract class BeaconRendererMixin implements BlockEntityRenderer { + @Inject(method = "submitBeaconBeam(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/resources/Identifier;FFIIIFF)V", at = @At("HEAD"), cancellable = true) + private static void onRender(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, Identifier beamLocation, float scale, float animationTime, int beamStart, int height, int color, float solidBeamRadius, float beamGlowRadius, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noBeaconBeams()) ci.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java index 9f1e6046a6..3254990259 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BeaconScreenMixin.java @@ -7,17 +7,17 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterBeacons; -import net.minecraft.block.entity.BeaconBlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ingame.BeaconScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.screen.BeaconScreenHandler; -import net.minecraft.text.Text; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.BeaconScreen; +import net.minecraft.core.Holder; +import net.minecraft.network.chat.Component; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.BeaconMenu; +import net.minecraft.world.level.block.entity.BeaconBlockEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -28,41 +28,41 @@ import java.util.List; @Mixin(BeaconScreen.class) -public abstract class BeaconScreenMixin extends HandledScreen { +public abstract class BeaconScreenMixin extends AbstractContainerScreen { @Shadow - protected abstract void addButton(T button); + protected abstract void addBeaconButton(T beaconButton); - public BeaconScreenMixin(BeaconScreenHandler handler, PlayerInventory inventory, Text title) { + public BeaconScreenMixin(BeaconMenu handler, Inventory inventory, Component title) { super(handler, inventory, title); } @Inject(method = "init", at = @At(value = "INVOKE", target = "Ljava/util/List;clear()V", shift = At.Shift.AFTER), cancellable = true) private void changeButtons(CallbackInfo ci) { if (!Modules.get().get(BetterBeacons.class).isActive()) return; - List> effects = BeaconBlockEntity.EFFECTS_BY_LEVEL.stream().flatMap(Collection::stream).toList(); - if (MinecraftClient.getInstance().currentScreen instanceof BeaconScreen beaconScreen) { - addButton(beaconScreen.new DoneButtonWidget(this.x + 164, this.y + 107)); - addButton(beaconScreen.new CancelButtonWidget(this.x + 190, this.y + 107)); + List> effects = BeaconBlockEntity.BEACON_EFFECTS.stream().flatMap(Collection::stream).toList(); + if (Minecraft.getInstance().screen instanceof BeaconScreen beaconScreen) { + addBeaconButton(beaconScreen.new BeaconConfirmButton(this.leftPos + 164, this.topPos + 107)); + addBeaconButton(beaconScreen.new BeaconCancelButton(this.leftPos + 190, this.topPos + 107)); for (int x = 0; x < 3; x++) { for (int y = 0; y < 2; y++) { - RegistryEntry effect = effects.get(x * 2 + y); - int xMin = this.x + x * 25; - int yMin = this.y + y * 25; - addButton(beaconScreen.new EffectButtonWidget(xMin + 27, yMin + 32, effect, true, -1)); - BeaconScreen.EffectButtonWidget secondaryWidget = beaconScreen.new EffectButtonWidget(xMin + 133, yMin + 32, effect, false, 3); - if (getScreenHandler().getProperties() != 4) secondaryWidget.active = false; - addButton(secondaryWidget); + Holder effect = effects.get(x * 2 + y); + int xMin = this.leftPos + x * 25; + int yMin = this.topPos + y * 25; + addBeaconButton(beaconScreen.new BeaconPowerButton(xMin + 27, yMin + 32, effect, true, -1)); + BeaconScreen.BeaconPowerButton secondaryWidget = beaconScreen.new BeaconPowerButton(xMin + 133, yMin + 32, effect, false, 3); + if (getMenu().getLevels() != 4) secondaryWidget.active = false; + addBeaconButton(secondaryWidget); } } } ci.cancel(); } - @Inject(method = "drawBackground", at = @At("TAIL")) - private void onDrawBackground(DrawContext context, float delta, int mouseX, int mouseY, CallbackInfo ci) { + @Inject(method = "extractBackground", at = @At("TAIL")) + private void onExtractBackground(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a, CallbackInfo ci) { if (!Modules.get().get(BetterBeacons.class).isActive()) return; //this will clear the background from useless pyramid graphics - context.fill(x + 10, y + 7, x + 220, y + 98, 0xFF212121); + graphics.fill(leftPos + 10, topPos + 7, leftPos + 220, topPos + 98, 0xFF212121); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java index 2166d8690c..df39cf3ac5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BiomeColorsMixin.java @@ -7,9 +7,9 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import net.minecraft.client.color.world.BiomeColors; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockRenderView; +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.core.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -20,36 +20,36 @@ public abstract class BiomeColorsMixin { /** * @author Walaryne */ - @Inject(method = "getWaterColor", at = @At("HEAD"), cancellable = true) - private static void onGetWaterColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { + @Inject(method = "getAverageWaterColor", at = @At("HEAD"), cancellable = true) + private static void onGetWaterColor(BlockAndTintGetter level, BlockPos pos, CallbackInfoReturnable cir) { Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.customWaterColor.get()) { - info.setReturnValue(ambience.waterColor.get().getPacked()); + cir.setReturnValue(ambience.waterColor.get().getPacked()); } } /** * @author Walaryne */ - @Inject(method = "getFoliageColor", at = @At("HEAD"), cancellable = true) - private static void onGetFoliageColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { + @Inject(method = "getAverageFoliageColor", at = @At("HEAD"), cancellable = true) + private static void onGetFoliageColor(BlockAndTintGetter level, BlockPos pos, CallbackInfoReturnable cir) { Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.customFoliageColor.get()) { - info.setReturnValue(ambience.foliageColor.get().getPacked()); + cir.setReturnValue(ambience.foliageColor.get().getPacked()); } } /** * @author Walaryne */ - @Inject(method = "getGrassColor", at = @At("HEAD"), cancellable = true) - private static void onGetGrassColor(BlockRenderView world, BlockPos pos, CallbackInfoReturnable info) { + @Inject(method = "getAverageGrassColor", at = @At("HEAD"), cancellable = true) + private static void onGetGrassColor(BlockAndTintGetter level, BlockPos pos, CallbackInfoReturnable cir) { Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.customGrassColor.get()) { - info.setReturnValue(ambience.grassColor.get().getPacked()); + cir.setReturnValue(ambience.grassColor.get().getPacked()); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TextHandlerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockBehaviourAccessor.java similarity index 59% rename from src/main/java/meteordevelopment/meteorclient/mixin/TextHandlerAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/BlockBehaviourAccessor.java index 90394cdda4..c8a4de2af4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TextHandlerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockBehaviourAccessor.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.font.TextHandler; +import net.minecraft.world.level.block.state.BlockBehaviour; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(TextHandler.class) -public interface TextHandlerAccessor { - @Accessor("widthRetriever") - TextHandler.WidthRetriever meteor$getWidthRetriever(); +@Mixin(BlockBehaviour.class) +public interface BlockBehaviourAccessor { + @Accessor("hasCollision") + boolean meteor$isHasCollision(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockBehaviourMixin.java similarity index 64% rename from src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/BlockBehaviourMixin.java index 089d557186..a50adc65d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockBehaviourMixin.java @@ -9,25 +9,25 @@ import meteordevelopment.meteorclient.events.world.AmbientOcclusionEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; 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; -@Mixin(AbstractBlock.class) -public abstract class AbstractBlockMixin { - @Inject(method = "getAmbientOcclusionLightLevel", at = @At("HEAD"), cancellable = true) - private void onGetAmbientOcclusionLightLevel(BlockState state, BlockView world, BlockPos pos, CallbackInfoReturnable info) { +@Mixin(BlockBehaviour.class) +public abstract class BlockBehaviourMixin { + @Inject(method = "getShadeBrightness", at = @At("HEAD"), cancellable = true) + private void onGetAmbientOcclusionLightLevel(BlockState state, BlockGetter level, BlockPos pos, CallbackInfoReturnable cir) { AmbientOcclusionEvent event = MeteorClient.EVENT_BUS.post(AmbientOcclusionEvent.get()); - if (event.lightLevel != -1) info.setReturnValue(event.lightLevel); + if (event.lightLevel != -1) cir.setReturnValue(event.lightLevel); } - @Inject(method = "getRenderingSeed", at = @At("HEAD"), cancellable = true) + @Inject(method = "getSeed", at = @At("HEAD"), cancellable = true) private void onRenderingSeed(BlockState state, BlockPos pos, CallbackInfoReturnable cir) { if (Modules.get().get(NoRender.class).noTextureRotations()) cir.setReturnValue(0L); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.java deleted file mode 100644 index 39048a1bd3..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionSpliteratorMixin.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.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.world.CollisionShapeEvent; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShapeContext; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockCollisionSpliterator; -import net.minecraft.world.CollisionView; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(BlockCollisionSpliterator.class) -public abstract class BlockCollisionSpliteratorMixin { - @WrapOperation(method = "computeNext", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/block/ShapeContext;getCollisionShape(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/CollisionView;Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/util/shape/VoxelShape;" - ) - ) - private VoxelShape onComputeNextCollisionBox(ShapeContext instance, BlockState blockState, CollisionView collisionView, BlockPos blockPos, Operation original) { - VoxelShape shape = original.call(instance, blockState, collisionView, blockPos); - - if (collisionView != MinecraftClient.getInstance().world) { - return shape; - } - - CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(blockState, blockPos, shape)); - return event.isCancelled() ? VoxelShapes.empty() : event.shape; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionsMixin.java new file mode 100644 index 0000000000..8c5f4586a2 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockCollisionsMixin.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.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.world.CollisionShapeEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockCollisions; +import net.minecraft.world.level.CollisionGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(BlockCollisions.class) +public abstract class BlockCollisionsMixin { + @WrapOperation(method = "computeNext", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/phys/shapes/CollisionContext;getCollisionShape(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/CollisionGetter;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/phys/shapes/VoxelShape;" + ) + ) + private VoxelShape onComputeNextCollisionBox(CollisionContext instance, BlockState blockState, CollisionGetter collisionView, BlockPos blockPos, Operation original) { + VoxelShape shape = original.call(instance, blockState, collisionView, blockPos); + + if (collisionView != Minecraft.getInstance().level) { + return shape; + } + + CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(blockState, blockPos, shape)); + return event.isCancelled() ? Shapes.empty() : event.shape; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockColorsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockColorsMixin.java index ede07e615e..1f9ccbd88a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockColorsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockColorsMixin.java @@ -7,41 +7,43 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.color.block.BlockTintSource; 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.ModifyArg; +import java.util.List; + @Mixin(BlockColors.class) public abstract class BlockColorsMixin { // Ambience - Custom Foliage Color @ModifyArg( - method = "create", + method = "createDefault", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/color/block/BlockColors;registerColorProvider(Lnet/minecraft/client/color/block/BlockColorProvider;[Lnet/minecraft/block/Block;)V", + target = "Lnet/minecraft/client/color/block/BlockColors;register(Ljava/util/List;[Lnet/minecraft/world/level/block/Block;)V", ordinal = 3 ), index = 0 ) - private static BlockColorProvider modifySpruceLeavesColor(BlockColorProvider provider) { - return (state, world, pos, tintIndex) -> getModifiedColor(-10380959); + private static List modifySpruceLeavesColor(List layers) { + return List.of(state -> getModifiedColor(-10380959)); } @ModifyArg( - method = "create", + method = "createDefault", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/color/block/BlockColors;registerColorProvider(Lnet/minecraft/client/color/block/BlockColorProvider;[Lnet/minecraft/block/Block;)V", + target = "Lnet/minecraft/client/color/block/BlockColors;register(Ljava/util/List;[Lnet/minecraft/world/level/block/Block;)V", ordinal = 4 ), index = 0 ) - private static BlockColorProvider modifyBirchLeavesColor(BlockColorProvider provider) { - return (state, world, pos, tintIndex) -> getModifiedColor(-8345771); + private static List modifyBirchLeavesColor(List layers) { + return List.of(state -> getModifiedColor(-8345771)); } @Unique diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderDispatcherMixin.java similarity index 52% rename from src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderManagerMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderDispatcherMixin.java index 4fc4ef95fc..06ca712779 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderDispatcherMixin.java @@ -5,23 +5,23 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.RenderBlockEntityEvent; -import net.minecraft.client.render.block.entity.BlockEntityRenderManager; -import net.minecraft.client.render.block.entity.state.BlockEntityRenderState; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; +import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; 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(BlockEntityRenderManager.class) -public abstract class BlockEntityRenderManagerMixin { - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRenderEntity(S renderState, MatrixStack matrices, OrderedRenderCommandQueue queue, CameraRenderState arg, CallbackInfo ci) { - RenderBlockEntityEvent event = MeteorClient.EVENT_BUS.post(RenderBlockEntityEvent.get(renderState)); +@Mixin(BlockEntityRenderDispatcher.class) +public abstract class BlockEntityRenderDispatcherMixin { + @Inject(method = "submit", at = @At("HEAD"), cancellable = true) + private void onRenderEntity(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + RenderBlockEntityEvent event = MeteorClient.EVENT_BUS.post(RenderBlockEntityEvent.get(state)); if (event.isCancelled()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderManagerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderStateAccessor.java similarity index 50% rename from src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderManagerAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderStateAccessor.java index b582915859..f8fa33f2d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderManagerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockEntityRenderStateAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.render.block.entity.BlockEntityRenderManager; -import net.minecraft.client.texture.SpriteHolder; +import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(BlockEntityRenderManager.class) -public interface BlockEntityRenderManagerAccessor { - @Accessor("spriteHolder") - SpriteHolder getSpriteHolder(); +@Mixin(BlockEntityRenderState.class) +public interface BlockEntityRenderStateAccessor { + @Accessor("blockState") + BlockState meteor$getBlockState(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockHitResultAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockHitResultAccessor.java index ecedfeaa65..5494848381 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockHitResultAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockHitResultAccessor.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.Direction; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.core.Direction; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; @@ -14,6 +14,6 @@ @Mixin(BlockHitResult.class) public interface BlockHitResultAccessor { @Mutable - @Accessor("side") - void meteor$setSide(Direction direction); + @Accessor("direction") + void meteor$setDirection(Direction direction); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java index 268c00db75..b4037f4137 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockItemMixin.java @@ -9,9 +9,9 @@ import meteordevelopment.meteorclient.events.entity.player.PlaceBlockEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.NoGhostBlocks; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemPlacementContext; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -22,32 +22,31 @@ @Mixin(BlockItem.class) public abstract class BlockItemMixin { @Shadow - protected abstract BlockState getPlacementState(ItemPlacementContext context); + protected abstract BlockState getPlacementState(BlockPlaceContext context); - @Inject(method = "place(Lnet/minecraft/item/ItemPlacementContext;Lnet/minecraft/block/BlockState;)Z", at = @At("HEAD"), cancellable = true) - private void onPlace(ItemPlacementContext context, BlockState state, CallbackInfoReturnable info) { - if (!context.getWorld().isClient()) return; + @Inject(method = "placeBlock(Lnet/minecraft/world/item/context/BlockPlaceContext;Lnet/minecraft/world/level/block/state/BlockState;)Z", at = @At("HEAD"), cancellable = true) + private void onPlace(BlockPlaceContext context, BlockState placementState, CallbackInfoReturnable cir) { + if (!context.getLevel().isClientSide()) return; - if (MeteorClient.EVENT_BUS.post(PlaceBlockEvent.get(context.getBlockPos(), state.getBlock())).isCancelled()) { - info.setReturnValue(true); + if (MeteorClient.EVENT_BUS.post(PlaceBlockEvent.get(context.getClickedPos(), placementState.getBlock())).isCancelled()) { + cir.setReturnValue(true); } } @ModifyVariable( - method = "place(Lnet/minecraft/item/ItemPlacementContext;)Lnet/minecraft/util/ActionResult;", - ordinal = 1, + method = "place(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/InteractionResult;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/block/BlockState;isOf(Lnet/minecraft/block/Block;)Z" - ) - ) - private BlockState modifyState(BlockState state, ItemPlacementContext context) { + target = "Lnet/minecraft/world/level/block/state/BlockState;is(Ljava/lang/Object;)Z" + ), + name = "placedState") + private BlockState modifyState(BlockState placedState, BlockPlaceContext placeContext) { var noGhostBlocks = Modules.get().get(NoGhostBlocks.class); if (noGhostBlocks.isActive() && noGhostBlocks.placing.get()) { - return getPlacementState(context); + return getPlacementState(placeContext); } - return state; + return placedState; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java index 119b58039f..b759b9f319 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockMixin.java @@ -10,25 +10,25 @@ import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; import meteordevelopment.meteorclient.systems.modules.movement.Slippy; import meteordevelopment.meteorclient.systems.modules.render.Xray; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemConvertible; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; 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; @Mixin(Block.class) -public abstract class BlockMixin extends AbstractBlock implements ItemConvertible { - public BlockMixin(Settings settings) { - super(settings); +public abstract class BlockMixin extends BlockBehaviour implements ItemLike { + public BlockMixin(Properties properties) { + super(properties); } - @ModifyReturnValue(method = "getSlipperiness", at = @At("RETURN")) - public float getSlipperiness(float original) { + @ModifyReturnValue(method = "getFriction", at = @At("RETURN")) + public float getFriction(float original) { // For some retarded reason Tweakeroo calls this method before meteor is initialized if (Modules.get() == null) return original; @@ -44,8 +44,8 @@ public float getSlipperiness(float original) { } // For More Culling compatibility - runs before More Culling's inject to force-render whitelisted Xray blocks - @Inject(method = "shouldDrawSide", at = @At("HEAD"), cancellable = true) - private static void meteor$forceXrayFace(BlockState state, BlockState sideState, Direction side, CallbackInfoReturnable cir) { + @Inject(method = "shouldRenderFace", at = @At("HEAD"), cancellable = true) + private static void meteor$forceXrayFace(BlockState state, BlockState neighborState, Direction direction, CallbackInfoReturnable cir) { Modules modules = Modules.get(); if (modules == null) return; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java deleted file mode 100644 index ef7caabb26..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockModelRendererMixin.java +++ /dev/null @@ -1,58 +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.ModifyReturnValue; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Xray; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.block.BlockModelRenderer; -import net.minecraft.client.render.model.BlockModelPart; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockRenderView; -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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -import java.util.List; - -@Mixin(BlockModelRenderer.class) -public abstract class BlockModelRendererMixin { - @Unique - private final ThreadLocal alphas = new ThreadLocal<>(); - - @Inject(method = {"renderSmooth", "renderFlat"}, at = @At("HEAD"), cancellable = true) - private void onRenderSmooth(BlockRenderView world, List parts, BlockState state, BlockPos pos, MatrixStack matrices, VertexConsumer vertexConsumer, boolean cull, int overlay, CallbackInfo ci) { - int alpha = Xray.getAlpha(state, pos); - - if (alpha == 0) ci.cancel(); - else alphas.set(alpha); - } - - @ModifyArgs(method = "renderQuad", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;quad(Lnet/minecraft/client/util/math/MatrixStack$Entry;Lnet/minecraft/client/render/model/BakedQuad;[FFFFF[II)V")) - private void modifyXrayAlpha(final Args args) { - final int alpha = alphas.get(); - args.set(6, alpha == -1 ? args.get(6) : alpha / 255f); - } - - @ModifyReturnValue(method = "shouldDrawFace", at = @At("RETURN")) - private static boolean modifyShouldDrawFace(boolean original, BlockRenderView world, BlockState state, boolean cull, Direction side, BlockPos pos) { - Xray xray = Modules.get().get(Xray.class); - - if (xray.isActive()) { - return xray.modifyDrawSide(state, world, pos.offset(side.getOpposite()), side, original); // thanks mojang - } - - return original; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderLayersMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderLayersMixin.java deleted file mode 100644 index e92adb7186..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderLayersMixin.java +++ /dev/null @@ -1,47 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Xray; -import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.BlockRenderLayer; -import net.minecraft.client.render.BlockRenderLayers; -import net.minecraft.fluid.FluidState; -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; - -@Mixin(BlockRenderLayers.class) -public class BlockRenderLayersMixin { - @Inject(method = "getBlockLayer", at = @At("HEAD"), cancellable = true) - private static void onGetBlockLayer(BlockState state, CallbackInfoReturnable cir) { - if (Modules.get() == null) return; - - int alpha = Xray.getAlpha(state, null); - if (alpha > 0 && alpha < 255) cir.setReturnValue(BlockRenderLayer.TRANSLUCENT); - } - - @Inject(method = "getFluidLayer", at = @At("HEAD"), cancellable = true) - private static void onGetFluidLayer(FluidState state, CallbackInfoReturnable cir) { - if (Modules.get() == null) return; - - int alpha = Xray.getAlpha(state.getBlockState(), null); - if (alpha > 0 && alpha < 255) { - cir.setReturnValue(BlockRenderLayer.TRANSLUCENT); - } - - else { - Ambience ambience = Modules.get().get(Ambience.class); - int a = ambience.lavaColor.get().a; - if (ambience.isActive() && ambience.customLavaColor.get() && a > 0 && a < 255) { - cir.setReturnValue(BlockRenderLayer.TRANSLUCENT); - } - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderManagerMixin.java deleted file mode 100644 index 7e7fc2892a..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockRenderManagerMixin.java +++ /dev/null @@ -1,28 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.BreakIndicators; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.block.BlockRenderManager; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockRenderView; -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(BlockRenderManager.class) -public abstract class BlockRenderManagerMixin { - @Inject(method = "renderDamage", at = @At("HEAD"), cancellable = true) - private void renderDamage(BlockState state, BlockPos pos, BlockRenderView world, MatrixStack matrix, VertexConsumer vertexConsumer, CallbackInfo info) { - if (Modules.get().isActive(BreakIndicators.class) || Modules.get().get(NoRender.class).noBlockBreakOverlay()) info.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BlockStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BlockStateMixin.java index 353f279c9c..676827052c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BlockStateMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BlockStateMixin.java @@ -5,29 +5,28 @@ package meteordevelopment.meteorclient.mixin; -import com.mojang.serialization.MapCodec; -import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.BlockActivateEvent; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.state.property.Property; -import net.minecraft.util.ActionResult; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.world.World; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.phys.BlockHitResult; +import org.jspecify.annotations.NonNull; import org.spongepowered.asm.mixin.Mixin; @Mixin(BlockState.class) -public abstract class BlockStateMixin extends AbstractBlock.AbstractBlockState { - public BlockStateMixin(Block block, Reference2ObjectArrayMap, Comparable> propertyMap, MapCodec mapCodec) { - super(block, propertyMap, mapCodec); +public abstract class BlockStateMixin extends BlockBehaviour.BlockStateBase { + protected BlockStateMixin(Block owner, Property[] propertyKeys, Comparable[] propertyValues) { + super(owner, propertyKeys, propertyValues); } @Override - public ActionResult onUse(World world, PlayerEntity player, BlockHitResult hit) { + public @NonNull InteractionResult useWithoutItem(@NonNull Level level, @NonNull Player player, @NonNull BlockHitResult hitResult) { MeteorClient.EVENT_BUS.post(BlockActivateEvent.get((BlockState) (Object) this)); - return super.onUse(world, player, hit); + return super.useWithoutItem(level, player, hitResult); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java index 1b6eeab7c1..90362cce26 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookEditScreenMixin.java @@ -6,11 +6,11 @@ package meteordevelopment.meteorclient.mixin; import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.BookEditScreen; -import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.BookEditScreen; import net.minecraft.nbt.*; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -30,81 +30,84 @@ @Mixin(BookEditScreen.class) public abstract class BookEditScreenMixin extends Screen { - @Shadow @Final private List pages; - @Shadow private int currentPage; + @Shadow + @Final + private List pages; + @Shadow + private int currentPage; @Shadow - protected abstract void updatePage(); + protected abstract void updatePageContent(); - public BookEditScreenMixin(Text title) { + public BookEditScreenMixin(Component title) { super(title); } @Inject(method = "init", at = @At("TAIL")) - private void onInit(CallbackInfo info) { - addDrawableChild( - new ButtonWidget.Builder(Text.literal("Copy"), button -> { - NbtList listTag = new NbtList(); - pages.stream().map(NbtString::of).forEach(listTag::add); - - NbtCompound tag = new NbtCompound(); - tag.put("pages", listTag); - tag.putInt("currentPage", currentPage); - - FastByteArrayOutputStream bytes = new FastByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(bytes); - try { - NbtIo.write(tag, out); - } catch (IOException e) { - e.printStackTrace(); - } - - try { - GLFW.glfwSetClipboardString(mc.getWindow().getHandle(), Base64.getEncoder().encodeToString(bytes.array)); - } catch (OutOfMemoryError exception) { - GLFW.glfwSetClipboardString(mc.getWindow().getHandle(), exception.toString()); - } - }) - .position(4, 4) + private void onInit(CallbackInfo ci) { + addRenderableWidget( + new Button.Builder(Component.literal("Copy"), button -> { + ListTag listTag = new ListTag(); + pages.stream().map(StringTag::valueOf).forEach(listTag::add); + + CompoundTag tag = new CompoundTag(); + tag.put("pages", listTag); + tag.putInt("currentPage", currentPage); + + FastByteArrayOutputStream bytes = new FastByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(bytes); + try { + NbtIo.write(tag, out); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + GLFW.glfwSetClipboardString(mc.getWindow().handle(), Base64.getEncoder().encodeToString(bytes.array)); + } catch (OutOfMemoryError exception) { + GLFW.glfwSetClipboardString(mc.getWindow().handle(), exception.toString()); + } + }) + .pos(4, 4) .size(120, 20) .build() ); - addDrawableChild( - new ButtonWidget.Builder(Text.literal("Paste"), button -> { - String clipboard = GLFW.glfwGetClipboardString(mc.getWindow().getHandle()); - if (clipboard == null) return; + addRenderableWidget( + new Button.Builder(Component.literal("Paste"), button -> { + String clipboard = GLFW.glfwGetClipboardString(mc.getWindow().handle()); + if (clipboard == null) return; - byte[] bytes; - try { - bytes = Base64.getDecoder().decode(clipboard); - } catch (IllegalArgumentException ignored) { - return; - } - DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); + byte[] bytes; + try { + bytes = Base64.getDecoder().decode(clipboard); + } catch (IllegalArgumentException _) { + return; + } + DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); - try { - NbtCompound tag = NbtIo.readCompressed(in, NbtSizeTracker.ofUnlimitedBytes()); + try { + CompoundTag tag = NbtIo.readCompressed(in, NbtAccounter.unlimitedHeap()); - NbtList listTag = tag.getListOrEmpty("pages").copy(); + ListTag listTag = tag.getListOrEmpty("pages").copy(); - pages.clear(); - for(int i = 0; i < listTag.size(); ++i) { - pages.add(listTag.getString(i, "")); - } + pages.clear(); + for (int i = 0; i < listTag.size(); ++i) { + pages.add(listTag.getStringOr(i, "")); + } - if (pages.isEmpty()) { - pages.add(""); - } + if (pages.isEmpty()) { + pages.add(""); + } - currentPage = tag.getInt("currentPage", 0); + currentPage = tag.getIntOr("currentPage", 0); - updatePage(); - } catch (IOException e) { - e.printStackTrace(); - } - }) - .position(4, 4 + 20 + 2) + updatePageContent(); + } catch (IOException e) { + e.printStackTrace(); + } + }) + .pos(4, 4 + 20 + 2) .size(120, 20) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java deleted file mode 100644 index 4da1997a8a..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BookScreenMixin.java +++ /dev/null @@ -1,108 +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 it.unimi.dsi.fastutil.io.FastByteArrayOutputStream; -import meteordevelopment.meteorclient.gui.GuiThemes; -import meteordevelopment.meteorclient.gui.screens.EditBookTitleAndAuthorScreen; -import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.BookScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.text.Text; -import net.minecraft.util.Hand; -import org.lwjgl.glfw.GLFW; -import org.lwjgl.system.MemoryStack; -import org.lwjgl.system.MemoryUtil; -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 java.io.DataOutputStream; -import java.io.IOException; -import java.util.Base64; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(BookScreen.class) -public abstract class BookScreenMixin extends Screen { - @Shadow - private BookScreen.Contents contents; - - @Shadow - private int pageIndex; - - public BookScreenMixin(Text title) { - super(title); - } - - @Inject(method = "init", at = @At("TAIL")) - private void onInit(CallbackInfo info) { - addDrawableChild( - new ButtonWidget.Builder(Text.literal("Copy"), button -> { - NbtList listTag = new NbtList(); - for (int i = 0; i < contents.getPageCount(); i++) listTag.add(NbtString.of(contents.getPage(i).getString())); - - NbtCompound tag = new NbtCompound(); - tag.put("pages", listTag); - tag.putInt("currentPage", pageIndex); - - FastByteArrayOutputStream bytes = new FastByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(bytes); - try { - NbtIo.write(tag, out); - } catch (IOException e) { - e.printStackTrace(); - } - - String encoded = Base64.getEncoder().encodeToString(bytes.array); - - @SuppressWarnings("resource") - long available = MemoryStack.stackGet().getPointer(); - long size = MemoryUtil.memLengthUTF8(encoded, true); - - if (size > available) { - ChatUtils.error("Could not copy to clipboard: Out of memory."); - } else { - GLFW.glfwSetClipboardString(mc.getWindow().getHandle(), encoded); - } - }) - .position(4, 4) - .size(120, 20) - .build() - ); - - // Edit title & author - ItemStack itemStack = mc.player.getMainHandStack(); - Hand hand = Hand.MAIN_HAND; - - if (itemStack.getItem() != Items.WRITTEN_BOOK) { - itemStack = mc.player.getOffHandStack(); - hand = Hand.OFF_HAND; - } - if (itemStack.getItem() != Items.WRITTEN_BOOK) return; - - ItemStack book = itemStack; // Fuck you Java - Hand hand2 = hand; // Honestly - - addDrawableChild( - new ButtonWidget.Builder(Text.literal("Edit title & author"), button -> { - mc.setScreen(new EditBookTitleAndAuthorScreen(GuiThemes.get(), book, hand2)); - }) - .position(4, 4 + 20 + 2) - .size(120, 20) - .build() - ); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BookViewScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BookViewScreenMixin.java new file mode 100644 index 0000000000..43ec7f90e0 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BookViewScreenMixin.java @@ -0,0 +1,109 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream; +import meteordevelopment.meteorclient.gui.GuiThemes; +import meteordevelopment.meteorclient.gui.screens.EditBookTitleAndAuthorScreen; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.BookViewScreen; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.StringTag; +import net.minecraft.network.chat.Component; +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; +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 java.io.DataOutputStream; +import java.io.IOException; +import java.util.Base64; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(BookViewScreen.class) +public abstract class BookViewScreenMixin extends Screen { + @Shadow + private BookViewScreen.BookAccess bookAccess; + + @Shadow + private int currentPage; + + public BookViewScreenMixin(Component title) { + super(title); + } + + @Inject(method = "init", at = @At("TAIL")) + private void onInit(CallbackInfo ci) { + addRenderableWidget( + new Button.Builder(Component.literal("Copy"), button -> { + ListTag listTag = new ListTag(); + for (int i = 0; i < bookAccess.getPageCount(); i++) + listTag.add(StringTag.valueOf(bookAccess.getPage(i).getString())); + + CompoundTag tag = new CompoundTag(); + tag.put("pages", listTag); + tag.putInt("currentPage", currentPage); + + FastByteArrayOutputStream bytes = new FastByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(bytes); + try { + NbtIo.write(tag, out); + } catch (IOException e) { + e.printStackTrace(); + } + + String encoded = Base64.getEncoder().encodeToString(bytes.array); + + @SuppressWarnings("resource") + long available = MemoryStack.stackGet().getPointer(); + long size = MemoryUtil.memLengthUTF8(encoded, true); + + if (size > available) { + ChatUtils.error("Could not copy to clipboard: Out of memory."); + } else { + GLFW.glfwSetClipboardString(mc.getWindow().handle(), encoded); + } + }) + .pos(4, 4) + .size(120, 20) + .build() + ); + + // Edit title & author + ItemStack itemStack = mc.player.getMainHandItem(); + InteractionHand hand = InteractionHand.MAIN_HAND; + + if (itemStack.getItem() != Items.WRITTEN_BOOK) { + itemStack = mc.player.getOffhandItem(); + hand = InteractionHand.OFF_HAND; + } + if (itemStack.getItem() != Items.WRITTEN_BOOK) return; + + ItemStack book = itemStack; // Fuck you Java + InteractionHand hand2 = hand; // Honestly + + addRenderableWidget( + new Button.Builder(Component.literal("Edit title & author"), button -> { + mc.setScreen(new EditBookTitleAndAuthorScreen(GuiThemes.get(), book, hand2)); + }) + .pos(4, 4 + 20 + 2) + .size(120, 20) + .build() + ); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BossBarHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BossHealthOverlayMixin.java similarity index 50% rename from src/main/java/meteordevelopment/meteorclient/mixin/BossBarHudMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/BossHealthOverlayMixin.java index 4535bdc5eb..8fb6b09847 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BossBarHudMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BossHealthOverlayMixin.java @@ -11,9 +11,9 @@ import meteordevelopment.meteorclient.events.render.RenderBossBarEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.gui.hud.BossBarHud; -import net.minecraft.client.gui.hud.ClientBossBar; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.BossHealthOverlay; +import net.minecraft.client.gui.components.LerpingBossEvent; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Constant; @@ -23,26 +23,26 @@ import java.util.Iterator; -@Mixin(BossBarHud.class) -public abstract class BossBarHudMixin { - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRender(CallbackInfo info) { - if (Modules.get().get(NoRender.class).noBossBar()) info.cancel(); +@Mixin(BossHealthOverlay.class) +public abstract class BossHealthOverlayMixin { + @Inject(method = "extractRenderState", at = @At("HEAD"), cancellable = true) + private void onRender(CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noBossBar()) ci.cancel(); } - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Ljava/util/Collection;iterator()Ljava/util/Iterator;")) - public Iterator modifyBossBarIterator(Iterator original) { + @ModifyExpressionValue(method = "extractRenderState", at = @At(value = "INVOKE", target = "Ljava/util/Collection;iterator()Ljava/util/Iterator;")) + public Iterator modifyBossBarIterator(Iterator original) { RenderBossBarEvent.BossIterator event = MeteorClient.EVENT_BUS.post(RenderBossBarEvent.BossIterator.get(original)); return event.iterator; } - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ClientBossBar;getName()Lnet/minecraft/text/Text;")) - public Text modifyBossBarName(Text original, @Local ClientBossBar clientBossBar) { - RenderBossBarEvent.BossText event = MeteorClient.EVENT_BUS.post(RenderBossBarEvent.BossText.get(clientBossBar, original)); - return event.name; + @ModifyExpressionValue(method = "extractRenderState", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/LerpingBossEvent;getName()Lnet/minecraft/network/chat/Component;")) + public Component modifyBossBarName(Component original, @Local(name = "event") LerpingBossEvent event) { + RenderBossBarEvent.BossText bossTextEvent = MeteorClient.EVENT_BUS.post(RenderBossBarEvent.BossText.get(event, original)); + return bossTextEvent.name; } - @ModifyConstant(method = "render", constant = @Constant(intValue = 9, ordinal = 1)) + @ModifyConstant(method = "extractRenderState", constant = @Constant(intValue = 9, ordinal = 1)) public int modifySpacingConstant(int j) { RenderBossBarEvent.BossSpacing event = MeteorClient.EVENT_BUS.post(RenderBossBarEvent.BossSpacing.get(j)); return event.spacing; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BrewingStandScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BrewingStandScreenMixin.java index d055b97e8c..8977c3e924 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BrewingStandScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BrewingStandScreenMixin.java @@ -7,30 +7,30 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.AutoBrewer; -import net.minecraft.client.gui.screen.ingame.BrewingStandScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.BrewingStandScreenHandler; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.BrewingStandScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.BrewingStandMenu; import org.spongepowered.asm.mixin.Mixin; @Mixin(BrewingStandScreen.class) -public abstract class BrewingStandScreenMixin extends HandledScreen { - public BrewingStandScreenMixin(BrewingStandScreenHandler container, PlayerInventory playerInventory, Text name) { +public abstract class BrewingStandScreenMixin extends AbstractContainerScreen { + public BrewingStandScreenMixin(BrewingStandMenu container, Inventory playerInventory, Component name) { super(container, playerInventory, name); } @Override - public void handledScreenTick() { - super.handledScreenTick(); + public void containerTick() { + super.containerTick(); - if (Modules.get().isActive(AutoBrewer.class)) Modules.get().get(AutoBrewer.class).tick(handler); + if (Modules.get().isActive(AutoBrewer.class)) Modules.get().get(AutoBrewer.class).tick(menu); } @Override - public void close() { + public void onClose() { if (Modules.get().isActive(AutoBrewer.class)) Modules.get().get(AutoBrewer.class).onBrewingStandClose(); - super.close(); + super.onClose(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BrightnessGetterMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BrightnessGetterMixin.java index 403a846e00..7dcb693f3f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BrightnessGetterMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BrightnessGetterMixin.java @@ -7,22 +7,21 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Fullbright; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.world.LightType; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.world.level.LightLayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; -@Mixin(WorldRenderer.BrightnessGetter.class) +@Mixin(LevelRenderer.BrightnessGetter.class) public interface BrightnessGetterMixin { - - @ModifyVariable(method = "method_68890", at = @At(value = "STORE"), ordinal = 0) + @ModifyVariable(method = "lambda$static$0", at = @At(value = "STORE"), name = "sky") private static int getLightmapCoordinatesModifySkyLight(int sky) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.SKY), sky); + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightLayer.SKY), sky); } - @ModifyVariable(method = "method_68890", at = @At(value = "STORE"), ordinal = 1) - private static int getLightmapCoordinatesModifyBlockLight(int sky) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.BLOCK), sky); + @ModifyVariable(method = "lambda$static$0", at = @At(value = "STORE"), name = "block") + private static int getLightmapCoordinatesModifyBlockLight(int block) { + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightLayer.BLOCK), block); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BuiltInRegistriesMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BuiltInRegistriesMixin.java new file mode 100644 index 0000000000..158815e745 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BuiltInRegistriesMixin.java @@ -0,0 +1,21 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.core.registries.BuiltInRegistries; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.function.Supplier; + +@Mixin(BuiltInRegistries.class) +public abstract class BuiltInRegistriesMixin { + @Redirect(method = "internalRegister(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/WritableRegistry;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/WritableRegistry;", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/Bootstrap;checkBootstrapCalled(Ljava/util/function/Supplier;)V")) + private static void ignoreBootstrap(Supplier location) { + // nothing + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java index 15fa22b4f2..9893a9a27f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BundleItemMixin.java @@ -7,9 +7,9 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.TooltipDataEvent; -import net.minecraft.item.BundleItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.tooltip.TooltipData; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.BundleItem; +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; @@ -18,10 +18,10 @@ import java.util.Optional; @Mixin(BundleItem.class) -public class BundleItemMixin { - @Inject(method = "getTooltipData", at = @At("HEAD"), cancellable = true) - private void onTooltipData(ItemStack stack, CallbackInfoReturnable> cir) { - TooltipDataEvent event = MeteorClient.EVENT_BUS.post(TooltipDataEvent.get(stack)); +public abstract class BundleItemMixin { + @Inject(method = "getTooltipImage", at = @At("HEAD"), cancellable = true) + private void onGetTooltipImage(ItemStack bundle, CallbackInfoReturnable> cir) { + TooltipDataEvent event = MeteorClient.EVENT_BUS.post(TooltipDataEvent.get(bundle)); if (event.tooltipData != null) { cir.setReturnValue(Optional.of(event.tooltipData)); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BundleMouseActionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BundleMouseActionsMixin.java new file mode 100644 index 0000000000..856d22e1ad --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/BundleMouseActionsMixin.java @@ -0,0 +1,33 @@ +/* + * 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.misc.InventoryTweaks; +import net.minecraft.client.gui.BundleMouseActions; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.BundleContents; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(BundleMouseActions.class) +public abstract class BundleMouseActionsMixin { + @ModifyExpressionValue(method = "toggleSelectedBundleItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/BundleItem;getNumberOfItemsToShow(Lnet/minecraft/world/item/ItemStack;)I")) + private int uncapBundleScrolling1(int original, ItemStack bundleItem, int slotIndex, int selectedItem) { + if (Modules.get().get(InventoryTweaks.class).uncapBundleScrolling()) + return bundleItem.getOrDefault(DataComponents.BUNDLE_CONTENTS, BundleContents.EMPTY).size(); + return original; + } + + @ModifyExpressionValue(method = "onMouseScrolled", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/BundleItem;getNumberOfItemsToShow(Lnet/minecraft/world/item/ItemStack;)I")) + private int uncapBundleScrolling2(int original, double scrollX, double scrollY, int slotIndex, ItemStack itemStack) { + if (Modules.get().get(InventoryTweaks.class).uncapBundleScrolling()) + return itemStack.getOrDefault(DataComponents.BUNDLE_CONTENTS, BundleContents.EMPTY).size(); + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/BundleTooltipSubmenuHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/BundleTooltipSubmenuHandlerMixin.java deleted file mode 100644 index 8c3a7183f6..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/BundleTooltipSubmenuHandlerMixin.java +++ /dev/null @@ -1,31 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; -import net.minecraft.client.gui.tooltip.BundleTooltipSubmenuHandler; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.BundleContentsComponent; -import net.minecraft.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(BundleTooltipSubmenuHandler.class) -public class BundleTooltipSubmenuHandlerMixin { - @ModifyExpressionValue(method = "sendPacket", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BundleItem;getNumberOfStacksShown(Lnet/minecraft/item/ItemStack;)I")) - private int uncapBundleScrolling1(int original, ItemStack item, int slotId, int selectedItemIndex) { - if (Modules.get().get(InventoryTweaks.class).uncapBundleScrolling()) return item.getOrDefault(DataComponentTypes.BUNDLE_CONTENTS, BundleContentsComponent.DEFAULT).size(); - return original; - } - - @ModifyExpressionValue(method = "onScroll", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BundleItem;getNumberOfStacksShown(Lnet/minecraft/item/ItemStack;)I")) - private int uncapBundleScrolling2(int original, double horizontal, double vertical, int slotId, ItemStack item) { - if (Modules.get().get(InventoryTweaks.class).uncapBundleScrolling()) return item.getOrDefault(DataComponentTypes.BUNDLE_CONTENTS, BundleContentsComponent.DEFAULT).size(); - return original; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java index 6a7a278f51..6709bb5c88 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CameraMixin.java @@ -5,7 +5,10 @@ package meteordevelopment.meteorclient.mixin; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.render.GetFovEvent; import meteordevelopment.meteorclient.mixininterface.ICamera; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.CameraTweaks; @@ -13,11 +16,9 @@ import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; -import net.minecraft.block.enums.CameraSubmersionType; -import net.minecraft.client.render.Camera; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; +import net.minecraft.client.Camera; +import net.minecraft.util.Mth; +import net.minecraft.world.level.material.FogType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -30,65 +31,67 @@ @Mixin(Camera.class) public abstract class CameraMixin implements ICamera { - @Shadow private boolean thirdPerson; + @Shadow + private boolean detached; - @Shadow private float yaw; - @Shadow private float pitch; + @Shadow + private float yRot; + @Shadow + private float xRot; - @Shadow protected abstract void setRotation(float yaw, float pitch); + @Shadow + protected abstract void setRotation(float yRot, float xRot); - @Inject(method = "getSubmersionType", at = @At("HEAD"), cancellable = true) - private void getSubmergedFluidState(CallbackInfoReturnable ci) { - if (Modules.get().get(NoRender.class).noLiquidOverlay()) ci.setReturnValue(CameraSubmersionType.NONE); + @Inject(method = "getFluidInCamera", at = @At("HEAD"), cancellable = true) + private void getSubmergedFluidState(CallbackInfoReturnable cir) { + if (Modules.get().get(NoRender.class).noLiquidOverlay()) cir.setReturnValue(FogType.NONE); } - @ModifyVariable(method = "clipToSpace", at = @At("HEAD"), ordinal = 0, argsOnly = true) - private float modifyClipToSpace(float d) { + @ModifyVariable(method = "getMaxZoom", at = @At("HEAD"), argsOnly = true, name = "cameraDist") + private float modifyGetMaxZoom(float cameraDist) { if (Modules.get().get(Freecam.class).isActive()) return 0; CameraTweaks cameraTweaks = Modules.get().get(CameraTweaks.class); - return cameraTweaks.isActive() ? (float) cameraTweaks.distance : d; + return cameraTweaks.isActive() ? (float) cameraTweaks.distance : cameraDist; } - @Inject(method = "clipToSpace", at = @At("HEAD"), cancellable = true) - private void onClipToSpace(float desiredCameraDistance, CallbackInfoReturnable info) { + @Inject(method = "getMaxZoom", at = @At("HEAD"), cancellable = true) + private void onGetMaxZoom(float cameraDist, CallbackInfoReturnable cir) { if (Modules.get().get(CameraTweaks.class).clip()) { - info.setReturnValue(desiredCameraDistance); + cir.setReturnValue(cameraDist); } } - @Inject(method = "update", at = @At("TAIL")) - private void onUpdateTail(World area, Entity focusedEntity, boolean thirdPerson, boolean inverseView, float tickProgress, CallbackInfo ci) { + @Inject(method = "alignWithEntity", at = @At("TAIL")) + private void onAlignWithEntityTail(float partialTicks, CallbackInfo ci) { if (Modules.get().isActive(Freecam.class)) { - this.thirdPerson = true; + this.detached = true; } } - @ModifyArgs(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;setPos(DDD)V")) - private void onUpdateSetPosArgs(Args args, @Local(argsOnly = true) float tickDelta) { + @ModifyArgs(method = "alignWithEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setPosition(DDD)V")) + private void onAlignSetPosArgs(Args args, @Local(argsOnly = true, name = "partialTicks") float partialTicks) { Freecam freecam = Modules.get().get(Freecam.class); if (freecam.isActive()) { - args.set(0, freecam.getX(tickDelta)); - args.set(1, freecam.getY(tickDelta)); - args.set(2, freecam.getZ(tickDelta)); + args.set(0, freecam.getX(partialTicks)); + args.set(1, freecam.getY(partialTicks)); + args.set(2, freecam.getZ(partialTicks)); } } - @ModifyArgs(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;setRotation(FF)V")) - private void onUpdateSetRotationArgs(Args args, @Local(argsOnly = true) float tickDelta) { + @ModifyArgs(method = "alignWithEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setRotation(FF)V")) + private void onAlignSetRotationArgs(Args args, @Local(argsOnly = true, name = "partialTicks") float partialTicks) { Freecam freecam = Modules.get().get(Freecam.class); FreeLook freeLook = Modules.get().get(FreeLook.class); if (freecam.isActive()) { - args.set(0, (float) freecam.getYaw(tickDelta)); - args.set(1, (float) freecam.getPitch(tickDelta)); - } - else if (Modules.get().isActive(HighwayBuilder.class)) { - args.set(0, yaw); - args.set(1, pitch); - } - else if (freeLook.isActive()) { + args.set(0, (float) freecam.getYaw(partialTicks)); + args.set(1, (float) freecam.getPitch(partialTicks)); + } else if (Modules.get().isActive(HighwayBuilder.class)) { + args.set(0, yRot); + args.set(1, xRot); + } else if (freeLook.isActive()) { args.set(0, freeLook.cameraYaw); args.set(1, freeLook.cameraPitch); } @@ -96,6 +99,11 @@ else if (freeLook.isActive()) { @Override public void meteor$setRot(double yaw, double pitch) { - setRotation((float) yaw, (float) MathHelper.clamp(pitch, -90, 90)); + setRotation((float) yaw, (float) Mth.clamp(pitch, -90, 90)); + } + + @ModifyReturnValue(method = "getFov", at = @At("RETURN")) + private float modifyFov(float original) { + return MeteorClient.EVENT_BUS.post(GetFovEvent.get(original)).fov; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapabilityTrackerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapabilityTrackerMixin.java index f6645a76b5..363a94c5b8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CapabilityTrackerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapabilityTrackerMixin.java @@ -10,21 +10,21 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -@Mixin(GlStateManager.CapabilityTracker.class) +@Mixin(GlStateManager.BooleanState.class) public abstract class CapabilityTrackerMixin implements ICapabilityTracker { @Shadow - private boolean state; + private boolean enabled; @Shadow - public abstract void setState(boolean state); + public abstract void setEnabled(boolean enabled); @Override public boolean meteor$get() { - return state; + return enabled; } @Override public void meteor$set(boolean state) { - setState(state); + setEnabled(state); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java deleted file mode 100644 index 7d3b482c15..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CapeFeatureRendererMixin.java +++ /dev/null @@ -1,32 +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 meteordevelopment.meteorclient.mixininterface.IEntityRenderState; -import meteordevelopment.meteorclient.utils.network.Capes; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.feature.CapeFeatureRenderer; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.AssetInfo; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(CapeFeatureRenderer.class) -public abstract class CapeFeatureRendererMixin { - @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;ILnet/minecraft/client/render/entity/state/PlayerEntityRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/SkinTextures;cape()Lnet/minecraft/util/AssetInfo$TextureAsset;")) - private AssetInfo.TextureAsset modifyCapeTexture(AssetInfo.TextureAsset original, MatrixStack matrices, OrderedRenderCommandQueue entityRenderCommandQueue, int i, PlayerEntityRenderState state, float f, float g) { - if (((IEntityRenderState) state).meteor$getEntity() instanceof PlayerEntity player) { - Identifier id = Capes.get(player); - return id == null ? original : new AssetInfo.TextureAssetInfo(id, id); - } - - return original; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CapeLayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CapeLayerMixin.java new file mode 100644 index 0000000000..ec25edcd47 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CapeLayerMixin.java @@ -0,0 +1,32 @@ +/* + * 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.mixininterface.IEntityRenderState; +import meteordevelopment.meteorclient.utils.network.Capes; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.layers.CapeLayer; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; +import net.minecraft.core.ClientAsset; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.player.Player; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(CapeLayer.class) +public abstract class CapeLayerMixin { + @ModifyExpressionValue(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/AvatarRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/PlayerSkin;cape()Lnet/minecraft/core/ClientAsset$Texture;")) + private ClientAsset.Texture modifyCapeTexture(ClientAsset.Texture original, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, AvatarRenderState state, float yRot, float xRot) { + if (((IEntityRenderState) state).meteor$getEntity() instanceof Player player) { + Identifier id = Capes.get(player); + return id == null ? original : new ClientAsset.ResourceTexture(id, id); + } + + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentAccessor.java new file mode 100644 index 0000000000..a171c06aa4 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentAccessor.java @@ -0,0 +1,22 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.gui.components.ChatComponent; +import net.minecraft.client.multiplayer.chat.GuiMessage; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(ChatComponent.class) +public interface ChatComponentAccessor { + @Accessor("trimmedMessages") + List meteor$getTrimmedMessages(); + + @Accessor("allMessages") + List meteor$getAllMessages(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java new file mode 100644 index 0000000000..c5cfa1bf81 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatComponentMixin.java @@ -0,0 +1,183 @@ +/* + * 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.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; +import meteordevelopment.meteorclient.mixininterface.IChatHud; +import meteordevelopment.meteorclient.mixininterface.IChatListener; +import meteordevelopment.meteorclient.mixininterface.IGuiMessage; +import meteordevelopment.meteorclient.mixininterface.IGuiMessageVisible; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.ChatComponent; +import net.minecraft.client.multiplayer.chat.GuiMessage; +import net.minecraft.client.multiplayer.chat.GuiMessageSource; +import net.minecraft.client.multiplayer.chat.GuiMessageTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MessageSignature; +import net.minecraft.util.FormattedCharSequence; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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; + +import java.util.List; + +@Mixin(ChatComponent.class) +public abstract class ChatComponentMixin implements IChatHud { + @Shadow + @Final + private Minecraft minecraft; + + @Shadow + @Final + private List trimmedMessages; + @Shadow + @Final + private List allMessages; + + @Unique + private BetterChat betterChat; + @Unique + private int nextId; + + @Shadow + public abstract void addClientSystemMessage(Component message); + + @Override + public void meteor$add(Component message, int id) { + nextId = id; + addClientSystemMessage(message); + nextId = 0; + } + + @Inject(method = "addMessageToDisplayQueue", at = @At(value = "INVOKE", target = "Ljava/util/List;addFirst(Ljava/lang/Object;)V", shift = At.Shift.AFTER)) + private void onAddMessageAfterNewGuiMessageVisible(GuiMessage message, CallbackInfo ci) { + ((IGuiMessage) (Object) trimmedMessages.getFirst()).meteor$setId(nextId); + } + + @Inject(method = "addMessageToQueue", at = @At(value = "INVOKE", target = "Ljava/util/List;addFirst(Ljava/lang/Object;)V", shift = At.Shift.AFTER)) + private void onAddMessageAfterNewGuiMessage(GuiMessage message, CallbackInfo ci) { + ((IGuiMessage) (Object) allMessages.getFirst()).meteor$setId(nextId); + } + + @SuppressWarnings("DataFlowIssue") + @ModifyExpressionValue(method = "addMessageToDisplayQueue", at = @At(value = "NEW", target = "(Lnet/minecraft/client/multiplayer/chat/GuiMessage;Lnet/minecraft/util/FormattedCharSequence;Z)Lnet/minecraft/client/multiplayer/chat/GuiMessage$Line;")) + private GuiMessage.Line onAddMessage_modifyGuiMessageLine(GuiMessage.Line line, @Local(name = "i") int i) { + IChatListener handler = (IChatListener) minecraft.getChatListener(); + if (handler == null) return line; + + IGuiMessageVisible meteorLine = (IGuiMessageVisible) (Object) line; + + meteorLine.meteor$setSender(handler.meteor$getSender()); + meteorLine.meteor$setStartOfEntry(i == 0); + + return line; + } + + @ModifyExpressionValue(method = "addMessage", at = @At(value = "NEW", target = "(ILnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/MessageSignature;Lnet/minecraft/client/multiplayer/chat/GuiMessageSource;Lnet/minecraft/client/multiplayer/chat/GuiMessageTag;)Lnet/minecraft/client/multiplayer/chat/GuiMessage;")) + private GuiMessage onAddMessage_modifyGuiMessage(GuiMessage line) { + IChatListener handler = (IChatListener) minecraft.getChatListener(); + if (handler == null) return line; + + ((IGuiMessage) (Object) line).meteor$setSender(handler.meteor$getSender()); + return 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) { + ReceiveMessageEvent event = MeteorClient.EVENT_BUS.post(ReceiveMessageEvent.get(message, indicator, nextId)); + + if (event.isCancelled()) ci.cancel(); + else { + trimmedMessages.removeIf(msg -> ((IGuiMessage) (Object) msg).meteor$getId() == nextId && nextId != 0); + + for (int i = allMessages.size() - 1; i > -1; i--) { + if (((IGuiMessage) (Object) allMessages.get(i)).meteor$getId() == nextId && nextId != 0) { + allMessages.remove(i); + getBetterChat().removeLine(i); + } + } + + if (event.isModified()) { + contents.set(event.getMessage()); + tag.set(event.getIndicator()); + } + } + } + + //modify max lengths for messages and visible messages + @ModifyExpressionValue(method = "addMessageToQueue", at = @At(value = "CONSTANT", args = "intValue=100")) + private int maxLength(int size) { + if (Modules.get() == null || !getBetterChat().isLongerChat()) return size; + + return size + betterChat.getExtraChatLines(); + } + + @ModifyExpressionValue(method = "addMessageToDisplayQueue", at = @At(value = "CONSTANT", args = "intValue=100")) + private int maxLengthVisible(int size) { + if (Modules.get() == null || !getBetterChat().isLongerChat()) return size; + + return size + betterChat.getExtraChatLines(); + } + + // Player Heads + + @ModifyExpressionValue(method = "extractRenderState(Lnet/minecraft/client/gui/components/ChatComponent$ChatGraphicsAccess;IILnet/minecraft/client/gui/components/ChatComponent$DisplayMode;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;ceil(F)I")) + private int onRender_modifyWidth(int width) { + return getBetterChat().modifyChatWidth(width); + } + + // Anti spam + + @Inject(method = "addMessageToDisplayQueue", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/ChatComponent;isChatFocused()Z")) + private void onBreakChatMessageLines(GuiMessage message, CallbackInfo ci, @Local(name = "lines") List lines) { + if (Modules.get() == null) return; // baritone calls addMessage before we initialise + + getBetterChat().lines.addFirst(lines.size()); + } + + @Inject(method = "addMessageToQueue", at = @At(value = "INVOKE", target = "Ljava/util/List;removeLast()Ljava/lang/Object;")) + private void onRemoveMessage(GuiMessage message, CallbackInfo ci) { + if (Modules.get() == null) return; + + int extra = getBetterChat().isLongerChat() ? getBetterChat().getExtraChatLines() : 0; + int size = betterChat.lines.size(); + + while (size > 100 + extra) { + betterChat.lines.removeLast(); + size--; + } + } + + @Inject(method = "clearMessages", at = @At("HEAD")) + private void onClearMessages(boolean history, CallbackInfo ci) { + getBetterChat().lines.clear(); + } + + @Inject(method = "refreshTrimmedMessages", at = @At("HEAD")) + private void onRefreshTrimmedMessages(CallbackInfo ci) { + getBetterChat().lines.clear(); + } + + // Other + @Unique + private BetterChat getBetterChat() { + if (betterChat == null) { + betterChat = Modules.get().get(BetterChat.class); + } + + return betterChat; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudAccessor.java deleted file mode 100644 index 5361dc6782..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudAccessor.java +++ /dev/null @@ -1,22 +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 net.minecraft.client.gui.hud.ChatHud; -import net.minecraft.client.gui.hud.ChatHudLine; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(ChatHud.class) -public interface ChatHudAccessor { - @Accessor("visibleMessages") - List meteor$getVisibleMessages(); - - @Accessor("messages") - List meteor$getMessages(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudInteractableMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudInteractableMixin.java index fbb740ef4b..9dec8aa174 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudInteractableMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudInteractableMixin.java @@ -8,11 +8,11 @@ import com.llamalad7.mixinextras.injector.ModifyReceiver; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; -import net.minecraft.client.font.Alignment; -import net.minecraft.client.font.DrawnTextConsumer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.OrderedText; -import net.minecraft.util.math.ColorHelper; +import net.minecraft.client.gui.ActiveTextCollector; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.TextAlignment; +import net.minecraft.util.ARGB; +import net.minecraft.util.FormattedCharSequence; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -22,28 +22,28 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(targets = "net.minecraft.client.gui.hud.ChatHud$Interactable", remap = false) -public class ChatHudInteractableMixin { +@Mixin(targets = "net.minecraft.client.gui.components.ChatComponent$DrawingFocusedGraphicsAccess", remap = false) +public abstract class ChatHudInteractableMixin { @Unique private static BetterChat betterChat; @Shadow @Final - private DrawContext context; + private GuiGraphicsExtractor graphics; - @ModifyReceiver(method = "text", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/font/DrawnTextConsumer;text(Lnet/minecraft/client/font/Alignment;IILnet/minecraft/client/font/DrawnTextConsumer$Transformation;Lnet/minecraft/text/OrderedText;)V")) - private DrawnTextConsumer onRender_beforeDrawTextWithShadow(DrawnTextConsumer instance, Alignment alignment, int x, int y, DrawnTextConsumer.Transformation transformation, OrderedText orderedText) { - getBetterChat().beforeDrawMessage(context, y, ColorHelper.getWhite(transformation.opacity())); + @ModifyReceiver(method = "handleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ActiveTextCollector;accept(Lnet/minecraft/client/gui/TextAlignment;IILnet/minecraft/client/gui/ActiveTextCollector$Parameters;Lnet/minecraft/util/FormattedCharSequence;)V")) + private ActiveTextCollector onRender_beforeDrawTextWithShadow(ActiveTextCollector instance, TextAlignment alignment, int x, int y, ActiveTextCollector.Parameters transformation, FormattedCharSequence orderedText) { + getBetterChat().beforeDrawMessage(graphics, y, ARGB.white(transformation.opacity())); return instance; } - @ModifyArg(method = "text", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/font/DrawnTextConsumer;text(Lnet/minecraft/client/font/Alignment;IILnet/minecraft/client/font/DrawnTextConsumer$Transformation;Lnet/minecraft/text/OrderedText;)V"), index = 1) + @ModifyArg(method = "handleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ActiveTextCollector;accept(Lnet/minecraft/client/gui/TextAlignment;IILnet/minecraft/client/gui/ActiveTextCollector$Parameters;Lnet/minecraft/util/FormattedCharSequence;)V"), index = 1) private int modifyX(int x) { return getBetterChat().modifyChatWidth(x); } - @Inject(method = "text", at = @At("TAIL")) - private void onRender_afterDrawTextWithShadow(int y, float f, OrderedText text, CallbackInfoReturnable cir) { + @Inject(method = "handleMessage", at = @At("TAIL")) + private void onRender_afterDrawTextWithShadow(int textTop, float opacity, FormattedCharSequence message, CallbackInfoReturnable cir) { getBetterChat().afterDrawMessage(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineConsumerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineConsumerMixin.java index 05def0ce96..4dd8d70a7e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineConsumerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineConsumerMixin.java @@ -9,24 +9,24 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.gui.hud.ChatHudLine; -import net.minecraft.client.gui.hud.MessageIndicator; +import net.minecraft.client.multiplayer.chat.GuiMessage; +import net.minecraft.client.multiplayer.chat.GuiMessageTag; 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(targets = "net.minecraft.client.gui.hud.ChatHud$1", remap = false) -public class ChatHudLineConsumerMixin { +@Mixin(targets = "net.minecraft.client.gui.components.ChatComponent$1", remap = false) +public abstract class ChatHudLineConsumerMixin { // Player Heads, also draw immediately when line is set @Inject(method = "accept", at = @At("HEAD")) - private void setLine(ChatHudLine.Visible visible, int i, float f, CallbackInfo ci) { - Modules.get().get(BetterChat.class).line = visible; + private void setLine(GuiMessage.Line line, int lineIndex, float alpha, CallbackInfo ci) { + Modules.get().get(BetterChat.class).line = line; } // No Message Signature Indicator - @ModifyExpressionValue(method = "accept", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHudLine$Visible;indicator()Lnet/minecraft/client/gui/hud/MessageIndicator;")) - private MessageIndicator onRender_modifyIndicator(MessageIndicator indicator) { + @ModifyExpressionValue(method = "accept", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/chat/GuiMessage$Line;tag()Lnet/minecraft/client/multiplayer/chat/GuiMessageTag;")) + private GuiMessageTag onRender_modifyIndicator(GuiMessageTag indicator) { return Modules.get().get(NoRender.class).noMessageSignatureIndicator() ? null : indicator; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java deleted file mode 100644 index 764a39ef9b..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudMixin.java +++ /dev/null @@ -1,181 +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.sugar.Local; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.game.ReceiveMessageEvent; -import meteordevelopment.meteorclient.mixininterface.IChatHud; -import meteordevelopment.meteorclient.mixininterface.IChatHudLine; -import meteordevelopment.meteorclient.mixininterface.IChatHudLineVisible; -import meteordevelopment.meteorclient.mixininterface.IMessageHandler; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.hud.ChatHud; -import net.minecraft.client.gui.hud.ChatHudLine; -import net.minecraft.client.gui.hud.MessageIndicator; -import net.minecraft.network.message.MessageSignatureData; -import net.minecraft.text.OrderedText; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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; - -import java.util.List; - -@Mixin(ChatHud.class) -public abstract class ChatHudMixin implements IChatHud { - @Shadow - @Final - MinecraftClient client; - @Shadow - @Final - private List visibleMessages; - @Shadow - @Final - private List messages; - - @Unique - private BetterChat betterChat; - @Unique - private int nextId; - - @Shadow - public abstract void addMessage(Text message); - - @Override - public void meteor$add(Text message, int id) { - nextId = id; - addMessage(message); - nextId = 0; - } - - @Inject(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Ljava/util/List;addFirst(Ljava/lang/Object;)V", shift = At.Shift.AFTER)) - private void onAddMessageAfterNewChatHudLineVisible(ChatHudLine message, CallbackInfo ci) { - ((IChatHudLine) (Object) visibleMessages.getFirst()).meteor$setId(nextId); - } - - @Inject(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "INVOKE", target = "Ljava/util/List;addFirst(Ljava/lang/Object;)V", shift = At.Shift.AFTER)) - private void onAddMessageAfterNewChatHudLine(ChatHudLine message, CallbackInfo ci) { - ((IChatHudLine) (Object) messages.getFirst()).meteor$setId(nextId); - } - - @SuppressWarnings("DataFlowIssue") - @ModifyExpressionValue(method = "addVisibleMessage", at = @At(value = "NEW", target = "(ILnet/minecraft/text/OrderedText;Lnet/minecraft/client/gui/hud/MessageIndicator;Z)Lnet/minecraft/client/gui/hud/ChatHudLine$Visible;")) - private ChatHudLine.Visible onAddMessage_modifyChatHudLineVisible(ChatHudLine.Visible line, @SuppressWarnings("LocalMayBeArgsOnly") @Local(ordinal = 1) int j) { - IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); - if (handler == null) return line; - - IChatHudLineVisible meteorLine = (IChatHudLineVisible) (Object) line; - - meteorLine.meteor$setSender(handler.meteor$getSender()); - meteorLine.meteor$setStartOfEntry(j == 0); - - return line; - } - - @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", at = @At(value = "NEW", target = "(ILnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)Lnet/minecraft/client/gui/hud/ChatHudLine;")) - private ChatHudLine onAddMessage_modifyChatHudLine(ChatHudLine line) { - IMessageHandler handler = (IMessageHandler) client.getMessageHandler(); - if (handler == null) return line; - - ((IChatHudLine) (Object) line).meteor$setSender(handler.meteor$getSender()); - return line; - } - - @Inject(at = @At("HEAD"), method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", cancellable = true) - private void onAddMessage(Text message, MessageSignatureData signatureData, MessageIndicator indicator, CallbackInfo ci, @Local(argsOnly = true) LocalRef messageRef, @Local(argsOnly = true) LocalRef indicatorRef) { - ReceiveMessageEvent event = MeteorClient.EVENT_BUS.post(ReceiveMessageEvent.get(message, indicator, nextId)); - - if (event.isCancelled()) ci.cancel(); - else { - visibleMessages.removeIf(msg -> ((IChatHudLine) (Object) msg).meteor$getId() == nextId && nextId != 0); - - for (int i = messages.size() - 1; i > -1; i--) { - if (((IChatHudLine) (Object) messages.get(i)).meteor$getId() == nextId && nextId != 0) { - messages.remove(i); - getBetterChat().removeLine(i); - } - } - - if (event.isModified()) { - messageRef.set(event.getMessage()); - indicatorRef.set(event.getIndicator()); - } - } - } - - //modify max lengths for messages and visible messages - @ModifyExpressionValue(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "CONSTANT", args = "intValue=100")) - private int maxLength(int size) { - if (Modules.get() == null || !getBetterChat().isLongerChat()) return size; - - return size + betterChat.getExtraChatLines(); - } - - @ModifyExpressionValue(method = "addVisibleMessage", at = @At(value = "CONSTANT", args = "intValue=100")) - private int maxLengthVisible(int size) { - if (Modules.get() == null || !getBetterChat().isLongerChat()) return size; - - return size + betterChat.getExtraChatLines(); - } - - // Player Heads - - @ModifyExpressionValue(method = "render(Lnet/minecraft/client/gui/hud/ChatHud$Backend;IIZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;ceil(F)I")) - private int onRender_modifyWidth(int width) { - return getBetterChat().modifyChatWidth(width); - } - - // Anti spam - - @Inject(method = "addVisibleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;isChatFocused()Z")) - private void onBreakChatMessageLines(ChatHudLine message, CallbackInfo ci, @Local List list) { - if (Modules.get() == null) return; // baritone calls addMessage before we initialise - - getBetterChat().lines.addFirst(list.size()); - } - - @Inject(method = "addMessage(Lnet/minecraft/client/gui/hud/ChatHudLine;)V", at = @At(value = "INVOKE", target = "Ljava/util/List;removeLast()Ljava/lang/Object;")) - private void onRemoveMessage(ChatHudLine message, CallbackInfo ci) { - if (Modules.get() == null) return; - - int extra = getBetterChat().isLongerChat() ? getBetterChat().getExtraChatLines() : 0; - int size = betterChat.lines.size(); - - while (size > 100 + extra) { - betterChat.lines.removeLast(); - size--; - } - } - - @Inject(method = "clear", at = @At("HEAD")) - private void onClear(boolean clearHistory, CallbackInfo ci) { - getBetterChat().lines.clear(); - } - - @Inject(method = "refresh", at = @At("HEAD")) - private void onRefresh(CallbackInfo ci) { - getBetterChat().lines.clear(); - } - - // Other - @Unique - private BetterChat getBetterChat() { - if (betterChat == null) { - betterChat = Modules.get().get(BetterChat.class); - } - - return betterChat; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudUnfocusedMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudUnfocusedMixin.java index 59877b3ad9..cf7f7171b5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudUnfocusedMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudUnfocusedMixin.java @@ -8,12 +8,12 @@ import com.llamalad7.mixinextras.injector.ModifyReceiver; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; -import net.minecraft.client.font.Alignment; -import net.minecraft.client.font.DrawnTextConsumer; -import net.minecraft.client.font.DrawnTextConsumer.Transformation; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.OrderedText; -import net.minecraft.util.math.ColorHelper; +import net.minecraft.client.gui.ActiveTextCollector; +import net.minecraft.client.gui.ActiveTextCollector.Parameters; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.TextAlignment; +import net.minecraft.util.ARGB; +import net.minecraft.util.FormattedCharSequence; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -23,31 +23,31 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(targets = "net.minecraft.client.gui.hud.ChatHud$Hud", remap = false) -public class ChatHudUnfocusedMixin { +@Mixin(targets = "net.minecraft.client.gui.components.ChatComponent$DrawingBackgroundGraphicsAccess", remap = false) +public abstract class ChatHudUnfocusedMixin { @Unique private static BetterChat betterChat; @Final @Shadow - private DrawContext context; + private GuiGraphicsExtractor graphics; // Offset text to make room for player heads - @ModifyArg(method = "text", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/font/DrawnTextConsumer;text(Lnet/minecraft/client/font/Alignment;IILnet/minecraft/client/font/DrawnTextConsumer$Transformation;Lnet/minecraft/text/OrderedText;)V"), index = 1) + @ModifyArg(method = "handleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ActiveTextCollector;accept(Lnet/minecraft/client/gui/TextAlignment;IILnet/minecraft/client/gui/ActiveTextCollector$Parameters;Lnet/minecraft/util/FormattedCharSequence;)V"), index = 1) private int modifyX(int x) { return getBetterChat().modifyChatWidth(x); } // Player Heads for unfocused chat - draw before text - @ModifyReceiver(method = "text", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/font/DrawnTextConsumer;text(Lnet/minecraft/client/font/Alignment;IILnet/minecraft/client/font/DrawnTextConsumer$Transformation;Lnet/minecraft/text/OrderedText;)V")) - private DrawnTextConsumer onRender_beforeDrawText(DrawnTextConsumer instance, Alignment alignment, int x, int y, Transformation transformation, OrderedText orderedText) { - getBetterChat().beforeDrawMessage(context, y, ColorHelper.getWhite(transformation.opacity())); + @ModifyReceiver(method = "handleMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ActiveTextCollector;accept(Lnet/minecraft/client/gui/TextAlignment;IILnet/minecraft/client/gui/ActiveTextCollector$Parameters;Lnet/minecraft/util/FormattedCharSequence;)V")) + private ActiveTextCollector onRender_beforeDrawText(ActiveTextCollector instance, TextAlignment alignment, int x, int y, Parameters transformation, FormattedCharSequence orderedText) { + getBetterChat().beforeDrawMessage(graphics, y, ARGB.white(transformation.opacity())); return instance; } // Clean up after drawing - @Inject(method = "text", at = @At("TAIL")) - private void onRender_afterDrawText(int y, float f, OrderedText orderedText, CallbackInfoReturnable cir) { + @Inject(method = "handleMessage", at = @At("TAIL")) + private void onRender_afterDrawText(int textTop, float opacity, FormattedCharSequence message, CallbackInfoReturnable cir) { getBetterChat().afterDrawMessage(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatListenerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatListenerMixin.java new file mode 100644 index 0000000000..487ad90464 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatListenerMixin.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.authlib.GameProfile; +import meteordevelopment.meteorclient.mixininterface.IChatListener; +import net.minecraft.client.multiplayer.chat.ChatListener; +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.PlayerChatMessage; +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.CallbackInfoReturnable; + +import java.time.Instant; + +@Mixin(ChatListener.class) +public abstract class ChatListenerMixin implements IChatListener { + @Unique + private GameProfile sender; + + @Inject(method = "showMessageToPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/ChatComponent;addPlayerMessage(Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/MessageSignature;Lnet/minecraft/client/multiplayer/chat/GuiMessageTag;)V", shift = At.Shift.BEFORE)) + private void onShowMessageToPlayer_beforeAddMessage(ChatType.Bound boundChatType, PlayerChatMessage message, Component decoratedMessage, GameProfile sender, boolean onlyShowSecure, Instant received, CallbackInfoReturnable cir) { + this.sender = sender; + } + + @Inject(method = "showMessageToPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/ChatComponent;addPlayerMessage(Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/MessageSignature;Lnet/minecraft/client/multiplayer/chat/GuiMessageTag;)V", shift = At.Shift.AFTER)) + private void onShowMessageToPlayer_afterAddMessage(ChatType.Bound boundChatType, PlayerChatMessage message, Component decoratedMessage, GameProfile sender, boolean onlyShowSecure, Instant received, CallbackInfoReturnable cir) { + this.sender = null; + } + + @Override + public GameProfile meteor$getSender() { + return sender; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java index 379cfb8868..b0301867a2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChatScreenMixin.java @@ -7,8 +7,8 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.ChatScreen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -17,10 +17,11 @@ @Mixin(value = ChatScreen.class, priority = 1001) public abstract class ChatScreenMixin { - @Shadow protected TextFieldWidget chatField; + @Shadow + protected EditBox input; @Inject(method = "init", at = @At(value = "RETURN")) - private void onInit(CallbackInfo info) { - if (Modules.get().get(BetterChat.class).isInfiniteChatBox()) chatField.setMaxLength(Integer.MAX_VALUE); + private void onInit(CallbackInfo ci) { + if (Modules.get().get(BetterChat.class).isInfiniteChatBox()) input.setMaxLength(Integer.MAX_VALUE); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkAccessAccessor.java similarity index 65% rename from src/main/java/meteordevelopment/meteorclient/mixin/ChunkAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ChunkAccessAccessor.java index b342187b13..293f8595cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkAccessAccessor.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.chunk.ChunkAccess; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import java.util.Map; -@Mixin(Chunk.class) -public interface ChunkAccessor { +@Mixin(ChunkAccess.class) +public interface ChunkAccessAccessor { @Accessor("blockEntities") Map getBlockEntities(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java deleted file mode 100644 index ac5ece18cf..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderDebugRendererMixin.java +++ /dev/null @@ -1,39 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Freecam; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.debug.ChunkBorderDebugRenderer; -import net.minecraft.util.math.ChunkSectionPos; -import net.minecraft.util.math.MathHelper; -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; - -@Mixin(ChunkBorderDebugRenderer.class) -public abstract class ChunkBorderDebugRendererMixin { - @Shadow - @Final - private MinecraftClient client; - - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/ChunkSectionPos;from(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/util/math/ChunkSectionPos;")) - private ChunkSectionPos render$getChunkPos(ChunkSectionPos original) { - Freecam freecam = Modules.get().get(Freecam.class); - if (!freecam.isActive()) return original; - - float delta = client.getRenderTickCounter().getTickProgress(true); - - return ChunkSectionPos.from( - ChunkSectionPos.getSectionCoord(MathHelper.floor(freecam.getX(delta))), - ChunkSectionPos.getSectionCoord(MathHelper.floor(freecam.getY(delta))), - ChunkSectionPos.getSectionCoord(MathHelper.floor(freecam.getZ(delta))) - ); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderRendererMixin.java new file mode 100644 index 0000000000..d31a51d5ce --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ChunkBorderRendererMixin.java @@ -0,0 +1,39 @@ +/* + * 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.Freecam; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.debug.ChunkBorderRenderer; +import net.minecraft.core.SectionPos; +import net.minecraft.util.Mth; +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; + +@Mixin(ChunkBorderRenderer.class) +public abstract class ChunkBorderRendererMixin { + @Shadow + @Final + private Minecraft minecraft; + + @ModifyExpressionValue(method = "emitGizmos", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/SectionPos;of(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/core/SectionPos;")) + private SectionPos emitGizmos$getChunkPos(SectionPos original) { + Freecam freecam = Modules.get().get(Freecam.class); + if (!freecam.isActive()) return original; + + float delta = minecraft.getDeltaTracker().getGameTimeDeltaPartialTick(true); + + return SectionPos.of( + SectionPos.posToSectionCoord(Mth.floor(freecam.getX(delta))), + SectionPos.posToSectionCoord(Mth.floor(freecam.getY(delta))), + SectionPos.posToSectionCoord(Mth.floor(freecam.getZ(delta))) + ); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkCacheAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkCacheAccessor.java new file mode 100644 index 0000000000..74e61bb10a --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkCacheAccessor.java @@ -0,0 +1,16 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.multiplayer.ClientChunkCache; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ClientChunkCache.class) +public interface ClientChunkCacheAccessor { + @Accessor("storage") + ClientChunkCache.Storage meteor$getStorage(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkMapAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkMapAccessor.java index 5051de03d3..89c41bbff8 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkMapAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkMapAccessor.java @@ -5,15 +5,15 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.world.ClientChunkManager; -import net.minecraft.world.chunk.WorldChunk; +import net.minecraft.client.multiplayer.ClientChunkCache; +import net.minecraft.world.level.chunk.LevelChunk; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import java.util.concurrent.atomic.AtomicReferenceArray; -@Mixin(ClientChunkManager.ClientChunkMap.class) +@Mixin(ClientChunkCache.Storage.class) public interface ClientChunkMapAccessor { @Accessor("chunks") - AtomicReferenceArray meteor$getChunks(); + AtomicReferenceArray meteor$getChunks(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java deleted file mode 100644 index c435faab0b..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionMixin.java +++ /dev/null @@ -1,104 +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 io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import io.netty.handler.proxy.Socks4ProxyHandler; -import io.netty.handler.proxy.Socks5ProxyHandler; -import io.netty.handler.timeout.TimeoutException; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.packets.PacketEvent; -import meteordevelopment.meteorclient.events.world.ServerConnectEndEvent; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; -import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; -import meteordevelopment.meteorclient.systems.proxies.Proxies; -import meteordevelopment.meteorclient.systems.proxies.Proxy; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.NetworkSide; -import net.minecraft.network.NetworkingBackend; -import net.minecraft.network.handler.PacketEncoderException; -import net.minecraft.network.handler.PacketSizeLogger; -import net.minecraft.network.listener.ClientPlayPacketListener; -import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.s2c.play.BundleS2CPacket; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import org.jetbrains.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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.net.InetSocketAddress; -import java.util.Iterator; - -@Mixin(ClientConnection.class) -public abstract class ClientConnectionMixin { - @Inject(method = "channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/packet/Packet;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ClientConnection;handlePacket(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/listener/PacketListener;)V", shift = At.Shift.BEFORE), cancellable = true) - private void onHandlePacket(ChannelHandlerContext channelHandlerContext, Packet packet, CallbackInfo ci) { - if (packet instanceof BundleS2CPacket bundle) { - for (Iterator> it = bundle.getPackets().iterator(); it.hasNext(); ) { - if (MeteorClient.EVENT_BUS.post(new PacketEvent.Receive(it.next(), (ClientConnection) (Object) this)).isCancelled()) it.remove(); - } - } else if (MeteorClient.EVENT_BUS.post(new PacketEvent.Receive(packet, (ClientConnection) (Object) this)).isCancelled()) ci.cancel(); - } - - @Inject(method = "disconnect(Lnet/minecraft/text/Text;)V", at = @At("HEAD")) - private void disconnect(Text disconnectReason, CallbackInfo ci) { - if (Modules.get().get(HighwayBuilder.class).isActive()) { - MutableText text = Text.literal("%n%n%s[%sHighway Builder%s] Statistics:%n".formatted(Formatting.GRAY, Formatting.BLUE, Formatting.GRAY)); - text.append(Modules.get().get(HighwayBuilder.class).getStatsText()); - - ((MutableText) disconnectReason).append(text); - } - } - - @Inject(method = "connect(Ljava/net/InetSocketAddress;Lnet/minecraft/network/NetworkingBackend;Lnet/minecraft/network/ClientConnection;)Lio/netty/channel/ChannelFuture;", at = @At("HEAD")) - private static void onConnect(InetSocketAddress address, NetworkingBackend backend, ClientConnection connection, CallbackInfoReturnable cir) { - MeteorClient.EVENT_BUS.post(ServerConnectEndEvent.get(address)); - } - - @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/packet/Packet;Lio/netty/channel/ChannelFutureListener;)V", cancellable = true) - private void onSendPacketHead(Packet packet, @Nullable ChannelFutureListener channelFutureListener, CallbackInfo ci) { - if (MeteorClient.EVENT_BUS.post(new PacketEvent.Send(packet, (ClientConnection) (Object) this)).isCancelled()) { - ci.cancel(); - } - } - - @Inject(method = "send(Lnet/minecraft/network/packet/Packet;Lio/netty/channel/ChannelFutureListener;)V", at = @At("TAIL")) - private void onSendPacketTail(Packet packet, @Nullable ChannelFutureListener channelFutureListener, CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(new PacketEvent.Sent(packet, (ClientConnection) (Object) this)); - } - - @Inject(method = "exceptionCaught", at = @At("HEAD"), cancellable = true) - private void exceptionCaught(ChannelHandlerContext context, Throwable throwable, CallbackInfo ci) { - AntiPacketKick apk = Modules.get().get(AntiPacketKick.class); - if (!(throwable instanceof TimeoutException) && !(throwable instanceof PacketEncoderException) && apk.catchExceptions()) { - if (apk.logExceptions.get()) apk.warning("Caught exception: %s", throwable); - ci.cancel(); - } - } - - @Inject(method = "addHandlers", at = @At("RETURN")) - private static void onAddHandlers(ChannelPipeline pipeline, NetworkSide side, boolean local, PacketSizeLogger packetSizeLogger, CallbackInfo ci) { - if (side != NetworkSide.CLIENTBOUND || local) return; - - Proxy proxy = Proxies.get().getEnabled(); - if (proxy == null) return; - - switch (proxy.type.get()) { - case Socks4 -> pipeline.addFirst(new Socks4ProxyHandler(new InetSocketAddress(proxy.address.get(), proxy.port.get()), proxy.username.get())); - case Socks5 -> pipeline.addFirst(new Socks5ProxyHandler(new InetSocketAddress(proxy.address.get(), proxy.port.get()), proxy.username.get(), proxy.password.get())); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientWorldMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientLevelMixin.java similarity index 52% rename from src/main/java/meteordevelopment/meteorclient/mixin/ClientWorldMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ClientLevelMixin.java index 0b958b055c..30e72b2c2b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientWorldMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientLevelMixin.java @@ -10,12 +10,12 @@ import meteordevelopment.meteorclient.events.entity.EntityRemovedEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,34 +25,37 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.invoke.arg.Args; -@Mixin(ClientWorld.class) -public abstract class ClientWorldMixin { - @Shadow @Nullable public abstract Entity getEntityById(int id); +@Mixin(ClientLevel.class) +public abstract class ClientLevelMixin { + @Shadow + @Nullable + public abstract Entity getEntity(int id); @Inject(method = "addEntity", at = @At("TAIL")) - private void onAddEntity(Entity entity, CallbackInfo info) { + private void onAddEntity(Entity entity, CallbackInfo ci) { if (entity != null) MeteorClient.EVENT_BUS.post(EntityAddedEvent.get(entity)); } @Inject(method = "removeEntity", at = @At("HEAD")) - private void onRemoveEntity(int entityId, Entity.RemovalReason removalReason, CallbackInfo info) { - if (getEntityById(entityId) != null) MeteorClient.EVENT_BUS.post(EntityRemovedEvent.get(getEntityById(entityId))); + private void onRemoveEntity(int id, Entity.RemovalReason reason, CallbackInfo ci) { + if (getEntity(id) != null) + MeteorClient.EVENT_BUS.post(EntityRemovedEvent.get(getEntity(id))); } - @ModifyArgs(method = "doRandomBlockDisplayTicks", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;randomBlockDisplayTick(IIIILnet/minecraft/util/math/random/Random;Lnet/minecraft/block/Block;Lnet/minecraft/util/math/BlockPos$Mutable;)V")) + @ModifyArgs(method = "animateTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientLevel;doAnimateTick(IIIILnet/minecraft/util/RandomSource;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/core/BlockPos$MutableBlockPos;)V")) private void doRandomBlockDisplayTicks(Args args) { if (Modules.get().get(NoRender.class).noBarrierInvis()) { args.set(5, Blocks.BARRIER); } } - @Inject(method = "addBlockBreakParticles", at = @At("HEAD"), cancellable = true) - private void onAddBlockBreakParticles(BlockPos blockPos, BlockState state, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noBlockBreakParticles()) info.cancel(); + @Inject(method = "addDestroyBlockEffect", at = @At("HEAD"), cancellable = true) + private void onAddDestroyBlockEffect(BlockPos pos, BlockState blockState, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noBlockBreakParticles()) ci.cancel(); } - @Inject(method = "spawnBlockBreakingParticle", at = @At("HEAD"), cancellable = true) - private void onAddBlockBreakingParticles(BlockPos blockPos, Direction direction, CallbackInfo info) { - if (Modules.get().get(NoRender.class).noBlockBreakParticles()) info.cancel(); + @Inject(method = "addBreakingBlockEffect", at = @At("HEAD"), cancellable = true) + private void onAddBlockBreakingParticles(BlockPos pos, Direction direction, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noBlockBreakParticles()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerAccessor.java new file mode 100644 index 0000000000..c8fbb4be2d --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerAccessor.java @@ -0,0 +1,39 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.multiplayer.ClientSuggestionProvider; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.chat.LastSeenMessagesTracker; +import net.minecraft.network.chat.SignedMessageChain; +import net.minecraft.network.protocol.game.ClientboundCommandsPacket; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.flag.FeatureFlagSet; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ClientPacketListener.class) +public interface ClientPacketListenerAccessor { + @Accessor("serverChunkRadius") + int meteor$getServerChunkRadius(); + + @Accessor("signedMessageEncoder") + SignedMessageChain.Encoder meteor$getSignedMessageEncoder(); + + @Accessor("lastSeenMessages") + LastSeenMessagesTracker meteor$getLastSeenMessages(); + + @Accessor("registryAccess") + RegistryAccess.Frozen meteor$getRegistryAccess(); + + @Accessor("enabledFeatures") + FeatureFlagSet meteor$getEnabledFeatures(); + + @Accessor("COMMAND_NODE_BUILDER") + static ClientboundCommandsPacket.NodeBuilder meteor$getCommandNodeFactory() { + return null; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java new file mode 100644 index 0000000000..828128acfb --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPacketListenerMixin.java @@ -0,0 +1,186 @@ +/* + * 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.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; +import com.llamalad7.mixinextras.sugar.ref.LocalFloatRef; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.commands.Commands; +import meteordevelopment.meteorclient.events.entity.EntityDestroyEvent; +import meteordevelopment.meteorclient.events.entity.player.PickItemsEvent; +import meteordevelopment.meteorclient.events.game.GameJoinedEvent; +import meteordevelopment.meteorclient.events.game.GameLeftEvent; +import meteordevelopment.meteorclient.events.game.SendMessageEvent; +import meteordevelopment.meteorclient.events.packets.ContainerSlotUpdateEvent; +import meteordevelopment.meteorclient.events.packets.InventoryEvent; +import meteordevelopment.meteorclient.events.packets.PlaySoundPacketEvent; +import meteordevelopment.meteorclient.events.world.ChunkDataEvent; +import meteordevelopment.meteorclient.mixininterface.IClientboundExplodePacket; +import meteordevelopment.meteorclient.pathing.BaritoneUtils; +import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.movement.Velocity; +import meteordevelopment.meteorclient.systems.modules.player.NoRotate; +import meteordevelopment.meteorclient.systems.modules.render.NoRender; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientCommonPacketListenerImpl; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.multiplayer.CommonListenerCookie; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.game.*; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.phys.Vec3; +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; + +@Mixin(ClientPacketListener.class) +public abstract class ClientPacketListenerMixin extends ClientCommonPacketListenerImpl { + @Shadow + private ClientLevel level; + + protected ClientPacketListenerMixin(Minecraft client, Connection connection, CommonListenerCookie connectionState) { + super(client, connection, connectionState); + } + + @Inject(method = "handleAddEntity", at = @At("HEAD"), cancellable = true) + private void onHandleAddEntity(ClientboundAddEntityPacket packet, CallbackInfo ci) { + if (packet != null && packet.getType() != null) { + if (Modules.get().get(NoRender.class).noEntity(packet.getType()) && Modules.get().get(NoRender.class).getDropSpawnPacket()) { + ci.cancel(); + } + } + } + + @Inject(method = "handleLogin", at = @At("HEAD")) + private void onHandleLoginHead(ClientboundLoginPacket packet, CallbackInfo ci, @Share("worldNotNull") LocalBooleanRef worldNotNull) { + worldNotNull.set(level != null); + } + + @Inject(method = "handleLogin", at = @At("TAIL")) + private void onHandleLoginTail(ClientboundLoginPacket packet, CallbackInfo ci, @Share("worldNotNull") LocalBooleanRef worldNotNull) { + if (worldNotNull.get()) { + MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); + } + + MeteorClient.EVENT_BUS.post(GameJoinedEvent.get()); + } + + // the server sends a GameJoin packet after the reconfiguration phase + @Inject(method = "handleConfigurationStart", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/PacketUtils;ensureRunningOnSameThread(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketListener;Lnet/minecraft/network/PacketProcessor;)V", shift = At.Shift.AFTER)) + private void onHandleConfigurationStart(ClientboundStartConfigurationPacket packet, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); + } + + @Inject(method = "handleSoundEvent", at = @At("HEAD")) + private void onHandleSoundEvent(ClientboundSoundPacket packet, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(PlaySoundPacketEvent.get(packet)); + } + + @Inject(method = "handleLevelChunkWithLight", at = @At("TAIL")) + private void onHandleLevelChunkWithLight(ClientboundLevelChunkWithLightPacket packet, CallbackInfo ci) { + LevelChunk chunk = minecraft.level.getChunk(packet.getX(), packet.getZ()); + MeteorClient.EVENT_BUS.post(new ChunkDataEvent(chunk)); + } + + @Inject(method = "handleContainerSetSlot", at = @At("TAIL")) + private void onHandleContainerSetSlot(ClientboundContainerSetSlotPacket packet, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(ContainerSlotUpdateEvent.get(packet)); + } + + @Inject(method = "handleContainerContent", at = @At("TAIL")) + private void onHandleContainerContent(ClientboundContainerSetContentPacket packet, CallbackInfo ci) { + 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;")) + private void onHandleRemoveEntities(ClientboundRemoveEntitiesPacket packet, CallbackInfo ci) { + for (int id : packet.getEntityIds()) { + MeteorClient.EVENT_BUS.post(EntityDestroyEvent.get(minecraft.level.getEntity(id))); + } + } + + @Inject(method = "handleExplosion", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/PacketUtils;ensureRunningOnSameThread(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketListener;Lnet/minecraft/network/PacketProcessor;)V", shift = At.Shift.AFTER)) + private void onHandleExplosionVelocity(ClientboundExplodePacket packet, CallbackInfo ci) { + Velocity velocity = Modules.get().get(Velocity.class); + if (!velocity.explosions.get()) return; + + IClientboundExplodePacket explosionPacket = (IClientboundExplodePacket) (Object) packet; + explosionPacket.meteor$setVelocityX((float) (packet.playerKnockback().orElse(Vec3.ZERO).x * velocity.getHorizontal(velocity.explosionsHorizontal))); + explosionPacket.meteor$setVelocityY((float) (packet.playerKnockback().orElse(Vec3.ZERO).y * velocity.getVertical(velocity.explosionsVertical))); + explosionPacket.meteor$setVelocityZ((float) (packet.playerKnockback().orElse(Vec3.ZERO).z * velocity.getHorizontal(velocity.explosionsHorizontal))); + } + + @Inject(method = "handleTakeItemEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientLevel;getEntity(I)Lnet/minecraft/world/entity/Entity;", ordinal = 0)) + private void onHandleTakeItemEntity(ClientboundTakeItemEntityPacket packet, CallbackInfo ci) { + Entity itemEntity = minecraft.level.getEntity(packet.getItemId()); + Entity entity = minecraft.level.getEntity(packet.getPlayerId()); + + if (itemEntity instanceof ItemEntity && entity == minecraft.player) { + MeteorClient.EVENT_BUS.post(PickItemsEvent.get(((ItemEntity) itemEntity).getItem(), packet.getAmount())); + } + } + + @Inject(method = "handleMovePlayer", at = @At("HEAD")) + private void onHandleMovePlayerHead(ClientboundPlayerPositionPacket packet, CallbackInfo ci, @Share("noRotateYaw") LocalFloatRef yawRef, @Share("noRotatePitch") LocalFloatRef pitchRef) { + NoRotate noRotate = Modules.get().get(NoRotate.class); + if (!noRotate.isActive() || minecraft.player == null) return; + + yawRef.set(minecraft.player.getYRot()); + pitchRef.set(minecraft.player.getXRot()); + } + + @Inject(method = "handleMovePlayer", at = @At("RETURN")) + private void onHandleMovePlayerReturn(ClientboundPlayerPositionPacket packet, CallbackInfo ci, @Share("noRotateYaw") LocalFloatRef yawRef, @Share("noRotatePitch") LocalFloatRef pitchRef) { + NoRotate noRotate = Modules.get().get(NoRotate.class); + if (!noRotate.isActive() || minecraft.player == null) return; + + float savedYaw = yawRef.get(); + float savedPitch = pitchRef.get(); + + //not noticeable by player but forces a server update + minecraft.player.setYRot(savedYaw + 0.000001f); + minecraft.player.setXRot(savedPitch + 0.000001f); + minecraft.player.yHeadRot = savedYaw; + minecraft.player.yBodyRot = savedYaw; + } + + @Inject(method = "sendChat", at = @At("HEAD"), cancellable = true) + 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)); + + if (!event.isCancelled()) { + messageRef.set(event.message); + } else { + ci.cancel(); + } + + return; + } + + if (message.startsWith(Config.get().prefix.get())) { + try { + Commands.dispatch(message.substring(Config.get().prefix.get().length())); + } catch (CommandSyntaxException e) { + ChatUtils.error(e.getMessage()); + } + + minecraft.gui.getChat().addRecentChat(message); + ci.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerAccessor.java deleted file mode 100644 index 688c432a5f..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerAccessor.java +++ /dev/null @@ -1,39 +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 net.minecraft.client.network.ClientCommandSource; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.network.message.LastSeenMessagesCollector; -import net.minecraft.network.message.MessageChain; -import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.resource.featuretoggle.FeatureSet; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ClientPlayNetworkHandler.class) -public interface ClientPlayNetworkHandlerAccessor { - @Accessor("chunkLoadDistance") - int meteor$getChunkLoadDistance(); - - @Accessor("messagePacker") - MessageChain.Packer meteor$getMessagePacker(); - - @Accessor("lastSeenMessagesCollector") - LastSeenMessagesCollector meteor$getLastSeenMessagesCollector(); - - @Accessor("combinedDynamicRegistries") - DynamicRegistryManager.Immutable meteor$getCombinedDynamicRegistries(); - - @Accessor("enabledFeatures") - FeatureSet meteor$getEnabledFeatures(); - - @Accessor("COMMAND_NODE_FACTORY") - static CommandTreeS2CPacket.NodeFactory meteor$getCommandNodeFactory() { - return null; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java deleted file mode 100644 index e11fde6217..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayNetworkHandlerMixin.java +++ /dev/null @@ -1,191 +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.sugar.Local; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; -import com.llamalad7.mixinextras.sugar.ref.LocalFloatRef; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.commands.Commands; -import meteordevelopment.meteorclient.events.entity.EntityDestroyEvent; -import meteordevelopment.meteorclient.events.entity.player.PickItemsEvent; -import meteordevelopment.meteorclient.events.game.GameJoinedEvent; -import meteordevelopment.meteorclient.events.game.GameLeftEvent; -import meteordevelopment.meteorclient.events.game.SendMessageEvent; -import meteordevelopment.meteorclient.events.packets.ContainerSlotUpdateEvent; -import meteordevelopment.meteorclient.events.packets.InventoryEvent; -import meteordevelopment.meteorclient.events.packets.PlaySoundPacketEvent; -import meteordevelopment.meteorclient.events.world.ChunkDataEvent; -import meteordevelopment.meteorclient.mixininterface.IExplosionS2CPacket; -import meteordevelopment.meteorclient.pathing.BaritoneUtils; -import meteordevelopment.meteorclient.systems.config.Config; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.movement.Velocity; -import meteordevelopment.meteorclient.systems.modules.player.NoRotate; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientCommonNetworkHandler; -import net.minecraft.client.network.ClientConnectionState; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.packet.s2c.play.*; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.chunk.WorldChunk; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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(ClientPlayNetworkHandler.class) -public abstract class ClientPlayNetworkHandlerMixin extends ClientCommonNetworkHandler { - @Shadow - private ClientWorld world; - - protected ClientPlayNetworkHandlerMixin(MinecraftClient client, ClientConnection connection, ClientConnectionState connectionState) { - super(client, connection, connectionState); - } - - @Inject(method = "onEntitySpawn", at = @At("HEAD"), cancellable = true) - private void onEntitySpawn(EntitySpawnS2CPacket packet, CallbackInfo info) { - if (packet != null && packet.getEntityType() != null) { - if (Modules.get().get(NoRender.class).noEntity(packet.getEntityType()) && Modules.get().get(NoRender.class).getDropSpawnPacket()) { - info.cancel(); - } - } - } - - @Inject(method = "onGameJoin", at = @At("HEAD")) - private void onGameJoinHead(GameJoinS2CPacket packet, CallbackInfo info, @Share("worldNotNull") LocalBooleanRef worldNotNull) { - worldNotNull.set(world != null); - } - - @Inject(method = "onGameJoin", at = @At("TAIL")) - private void onGameJoinTail(GameJoinS2CPacket packet, CallbackInfo info, @Share("worldNotNull") LocalBooleanRef worldNotNull) { - if (worldNotNull.get()) { - MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); - } - - MeteorClient.EVENT_BUS.post(GameJoinedEvent.get()); - } - - // the server sends a GameJoin packet after the reconfiguration phase - @Inject(method = "onEnterReconfiguration", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkThreadUtils;forceMainThread(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/listener/PacketListener;Lnet/minecraft/network/PacketApplyBatcher;)V", shift = At.Shift.AFTER)) - private void onEnterReconfiguration(EnterReconfigurationS2CPacket packet, CallbackInfo info) { - MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); - } - - @Inject(method = "onPlaySound", at = @At("HEAD")) - private void onPlaySound(PlaySoundS2CPacket packet, CallbackInfo info) { - MeteorClient.EVENT_BUS.post(PlaySoundPacketEvent.get(packet)); - } - - @Inject(method = "onChunkData", at = @At("TAIL")) - private void onChunkData(ChunkDataS2CPacket packet, CallbackInfo info) { - WorldChunk chunk = client.world.getChunk(packet.getChunkX(), packet.getChunkZ()); - MeteorClient.EVENT_BUS.post(new ChunkDataEvent(chunk)); - } - - @Inject(method = "onScreenHandlerSlotUpdate", at = @At("TAIL")) - private void onContainerSlotUpdate(ScreenHandlerSlotUpdateS2CPacket packet, CallbackInfo info) { - MeteorClient.EVENT_BUS.post(ContainerSlotUpdateEvent.get(packet)); - } - - @Inject(method = "onInventory", at = @At("TAIL")) - private void onInventory(InventoryS2CPacket packet, CallbackInfo info) { - MeteorClient.EVENT_BUS.post(InventoryEvent.get(packet)); - } - - @Inject(method = "onEntitiesDestroy", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/EntitiesDestroyS2CPacket;getEntityIds()Lit/unimi/dsi/fastutil/ints/IntList;")) - private void onEntitiesDestroy(EntitiesDestroyS2CPacket packet, CallbackInfo ci) { - for (int id : packet.getEntityIds()) { - MeteorClient.EVENT_BUS.post(EntityDestroyEvent.get(client.world.getEntityById(id))); - } - } - - @Inject(method = "onExplosion", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkThreadUtils;forceMainThread(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/listener/PacketListener;Lnet/minecraft/network/PacketApplyBatcher;)V", shift = At.Shift.AFTER)) - private void onExplosionVelocity(ExplosionS2CPacket packet, CallbackInfo ci) { - Velocity velocity = Modules.get().get(Velocity.class); - if (!velocity.explosions.get()) return; - - IExplosionS2CPacket explosionPacket = (IExplosionS2CPacket) (Object) packet; - explosionPacket.meteor$setVelocityX((float) (packet.playerKnockback().orElse(Vec3d.ZERO).x * velocity.getHorizontal(velocity.explosionsHorizontal))); - explosionPacket.meteor$setVelocityY((float) (packet.playerKnockback().orElse(Vec3d.ZERO).y * velocity.getVertical(velocity.explosionsVertical))); - explosionPacket.meteor$setVelocityZ((float) (packet.playerKnockback().orElse(Vec3d.ZERO).z * velocity.getHorizontal(velocity.explosionsHorizontal))); - } - - @Inject(method = "onItemPickupAnimation", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;getEntityById(I)Lnet/minecraft/entity/Entity;", ordinal = 0)) - private void onItemPickupAnimation(ItemPickupAnimationS2CPacket packet, CallbackInfo info) { - Entity itemEntity = client.world.getEntityById(packet.getEntityId()); - Entity entity = client.world.getEntityById(packet.getCollectorEntityId()); - - if (itemEntity instanceof ItemEntity && entity == client.player) { - MeteorClient.EVENT_BUS.post(PickItemsEvent.get(((ItemEntity) itemEntity).getStack(), packet.getStackAmount())); - } - } - - @Inject(method = "onPlayerPositionLook", at = @At("HEAD")) - private void onPlayerPositionLookHead(PlayerPositionLookS2CPacket packet, CallbackInfo ci, - @Share("noRotateYaw") LocalFloatRef yawRef, - @Share("noRotatePitch") LocalFloatRef pitchRef) { - NoRotate noRotate = Modules.get().get(NoRotate.class); - if (!noRotate.isActive() || client.player == null) return; - - yawRef.set(client.player.getYaw()); - pitchRef.set(client.player.getPitch()); - } - - @Inject(method = "onPlayerPositionLook", at = @At("RETURN")) - private void onPlayerPositionLookReturn(PlayerPositionLookS2CPacket packet, CallbackInfo ci, - @Share("noRotateYaw") LocalFloatRef yawRef, - @Share("noRotatePitch") LocalFloatRef pitchRef) { - NoRotate noRotate = Modules.get().get(NoRotate.class); - if (!noRotate.isActive() || client.player == null) return; - - float savedYaw = yawRef.get(); - float savedPitch = pitchRef.get(); - - //not noticeable by player but forces a server update - client.player.setYaw(savedYaw + 0.000001f); - client.player.setPitch(savedPitch + 0.000001f); - client.player.headYaw = savedYaw; - client.player.bodyYaw = savedYaw; - } - - @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) - 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)); - - if (!event.isCancelled()) { - messageRef.set(event.message); - } else { - ci.cancel(); - } - - return; - } - - if (message.startsWith(Config.get().prefix.get())) { - try { - Commands.dispatch(message.substring(Config.get().prefix.get().length())); - } catch (CommandSyntaxException e) { - ChatUtils.error(e.getMessage()); - } - - client.inGameHud.getChatHud().addToMessageHistory(message); - ci.cancel(); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java deleted file mode 100644 index 6770d78bba..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityMixin.java +++ /dev/null @@ -1,189 +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.llamalad7.mixinextras.injector.v2.WrapWithCondition; -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; -import meteordevelopment.meteorclient.systems.modules.movement.*; -import meteordevelopment.meteorclient.systems.modules.player.LiquidInteract; -import meteordevelopment.meteorclient.systems.modules.player.NoMiningTrace; -import meteordevelopment.meteorclient.systems.modules.player.Portals; -import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.input.Input; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.JumpingMount; -import net.minecraft.util.PlayerInput; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import org.objectweb.asm.Opcodes; -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; - -@Mixin(ClientPlayerEntity.class) -public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { - @Shadow - public Input input; - - public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { - super(world, profile); - } - - @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) - private void onDropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable info) { - if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(getMainHandStack())).isCancelled()) info.setReturnValue(false); - } - - @ModifyExpressionValue(method = "tickNausea", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;", opcode = Opcodes.GETFIELD)) - private Screen modifyNauseaCurrentScreen(Screen original) { - if (Modules.get().isActive(Portals.class)) return null; - return original; - } - - @ModifyExpressionValue(method = "applyMovementSpeedFactors", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z")) - private boolean redirectUsingItem(boolean isUsingItem) { - if (Modules.get().get(NoSlow.class).items()) return false; - return isUsingItem; - } - - @Inject(method = "isSneaking", at = @At("HEAD"), cancellable = true) - private void onIsSneaking(CallbackInfoReturnable info) { - if (Modules.get().get(Scaffold.class).scaffolding()) info.setReturnValue(false); - if (Modules.get().get(Flight.class).noSneak()) info.setReturnValue(false); - } - - @Inject(method = "shouldSlowDown", at = @At("HEAD"), cancellable = true) - private void onShouldSlowDown(CallbackInfoReturnable info) { - if (Modules.get().get(NoSlow.class).sneaking()) { - info.setReturnValue(isCrawling()); - } - } - - @Inject(method = "pushOutOfBlocks", at = @At("HEAD"), cancellable = true) - private void onPushOutOfBlocks(double x, double d, CallbackInfo info) { - Velocity velocity = Modules.get().get(Velocity.class); - if (velocity.isActive() && velocity.blocks.get()) { - info.cancel(); - } - } - - @ModifyExpressionValue(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/client/input/Input;playerInput:Lnet/minecraft/util/PlayerInput;", opcode = Opcodes.GETFIELD)) - private PlayerInput isSneaking(PlayerInput original) { - if (Modules.get().get(Sneak.class).doPacket() || Modules.get().get(NoSlow.class).airStrict()) { - return new PlayerInput( - original.forward(), - original.backward(), - original.left(), - original.right(), - original.jump(), - true, - original.sprint() - ); - } - return original; - } - - @Inject(method = "tickMovement", at = @At("HEAD")) - private void preTickMovement(CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(PlayerTickMovementEvent.get()); - } - - @ModifyReturnValue(method = "getMountJumpStrength", at = @At("RETURN")) - private float modifyMountJumpStrength(float original) { - if (Modules.get().get(EntityControl.class).maxJump()) return 1f; - return original; - } - - @Inject(method = "getJumpingMount", at = @At("RETURN"), cancellable = true) - private void changeJumpingMount(CallbackInfoReturnable info) { - if (Modules.get().get(EntityControl.class).cancelJump()) info.setReturnValue(null); - } - - @ModifyReturnValue(method = "getCrosshairTarget(Lnet/minecraft/entity/Entity;DDF)Lnet/minecraft/util/hit/HitResult;", at = @At("RETURN")) - private static HitResult onUpdateTargetedEntity(HitResult original, @Local HitResult hitResult) { - if (original instanceof EntityHitResult ehr) { - if (Modules.get().get(NoMiningTrace.class).canWork(ehr.getEntity()) && hitResult.getType() == HitResult.Type.BLOCK) { - return hitResult; - } - else if (ehr.getEntity() instanceof FakePlayerEntity fakePlayer && fakePlayer.noHit) { - return hitResult; - } - } - - return original; - } - - @ModifyExpressionValue(method = "getCrosshairTarget(Lnet/minecraft/entity/Entity;DDF)Lnet/minecraft/util/hit/HitResult;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;raycast(DFZ)Lnet/minecraft/util/hit/HitResult;")) - private static HitResult modifyRaycastResult(HitResult original, Entity entity, double blockInteractionRange, double entityInteractionRange, float tickProgress, @Local(ordinal = 0, argsOnly = true) double maxDistance) { - if (!Modules.get().isActive(LiquidInteract.class)) return original; - if (original.getType() != HitResult.Type.MISS) return original; - - return entity.raycast(maxDistance, tickProgress, true); - } - - // Sprint - - @ModifyExpressionValue(method = "canStartSprinting", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;hasForwardMovement()Z")) - private boolean modifyIsWalking(boolean original) { - if (!Modules.get().get(Sprint.class).rageSprint()) return original; - - float forwards = Math.abs(forwardSpeed); - float sideways = Math.abs(sidewaysSpeed); - - return (isSubmergedInWater() ? (forwards > 1.0E-5F || sideways > 1.0E-5F) : (forwards > 0.8 || sideways > 0.8)); - } - - @ModifyExpressionValue(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/Input;hasForwardMovement()Z")) - private boolean modifyMovement(boolean original) { - if (!Modules.get().get(Sprint.class).rageSprint()) return original; - - return Math.abs(sidewaysSpeed) > 1.0E-5F || Math.abs(forwardSpeed) > 1.0E-5F; - } - - @WrapWithCondition(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;setSprinting(Z)V", ordinal = 3)) - private boolean wrapSetSprinting(ClientPlayerEntity instance, boolean b) { - Sprint s = Modules.get().get(Sprint.class); - - return !s.rageSprint() || s.unsprintInWater() && isTouchingWater(); - } - - // Rotations - - @Inject(method = "sendMovementPackets", at = @At("HEAD")) - private void onSendMovementPacketsHead(CallbackInfo info) { - MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Pre.get()); - } - - @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V", ordinal = 1)) - private void onTickHasVehicleBeforeSendPackets(CallbackInfo info) { - MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Pre.get()); - } - - @Inject(method = "sendMovementPackets", at = @At("TAIL")) - private void onSendMovementPacketsTail(CallbackInfo info) { - MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Post.get()); - } - - @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V", ordinal = 1, shift = At.Shift.AFTER)) - private void onTickHasVehicleAfterSendPackets(CallbackInfo info) { - MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Post.get()); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerAccessor.java deleted file mode 100644 index b02b676860..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerAccessor.java +++ /dev/null @@ -1,23 +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 net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.util.math.BlockPos; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ClientPlayerInteractionManager.class) -public interface ClientPlayerInteractionManagerAccessor { - @Accessor("currentBreakingProgress") - float meteor$getBreakingProgress(); - - @Accessor("currentBreakingProgress") - void meteor$setCurrentBreakingProgress(float progress); - - @Accessor("currentBreakingPos") - BlockPos meteor$getCurrentBreakingBlockPos(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java deleted file mode 100644 index ac45c37498..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerInteractionManagerMixin.java +++ /dev/null @@ -1,152 +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 meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.entity.DropItemsEvent; -import meteordevelopment.meteorclient.events.entity.player.*; -import meteordevelopment.meteorclient.mixininterface.IClientPlayerInteractionManager; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.player.BreakDelay; -import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; -import meteordevelopment.meteorclient.utils.world.BlockUtils; -import net.minecraft.block.BlockState; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.client.network.SequencedPacketCreator; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import org.objectweb.asm.Opcodes; -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.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(ClientPlayerInteractionManager.class) -public abstract class ClientPlayerInteractionManagerMixin implements IClientPlayerInteractionManager { - @Shadow private int blockBreakingCooldown; - - @Shadow protected abstract void syncSelectedSlot(); - - @Shadow - public abstract boolean breakBlock(BlockPos pos); - - @Shadow - public abstract void sendSequencedPacket(ClientWorld world, SequencedPacketCreator packetCreator); - - @Inject(method = "clickSlot", at = @At("HEAD"), cancellable = true) - private void onClickSlot(int syncId, int slotId, int button, SlotActionType actionType, PlayerEntity player, CallbackInfo info) { - if (actionType == SlotActionType.THROW && slotId >= 0 && slotId < player.currentScreenHandler.slots.size()) { - if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(player.currentScreenHandler.slots.get(slotId).getStack())).isCancelled()) info.cancel(); - } - else if (slotId == -999) { - // Clicking outside of inventory - if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(player.currentScreenHandler.getCursorStack())).isCancelled()) info.cancel(); - } - } - - @Inject(method = "attackBlock", at = @At("HEAD"), cancellable = true) - private void onAttackBlock(BlockPos blockPos, Direction direction, CallbackInfoReturnable info) { - if (MeteorClient.EVENT_BUS.post(StartBreakingBlockEvent.get(blockPos, direction)).isCancelled()) info.cancel(); - else { - SpeedMine sm = Modules.get().get(SpeedMine.class); - BlockState state = mc.world.getBlockState(blockPos); - - if (!sm.instamine() || !sm.filter(state.getBlock())) return; - - if (state.calcBlockBreakingDelta(mc.player, mc.world, blockPos) > 0.5f) { - breakBlock(blockPos); - sendSequencedPacket(mc.world, (sequence) -> new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, blockPos, direction, sequence)); - sendSequencedPacket(mc.world, (sequence) -> new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.STOP_DESTROY_BLOCK, blockPos, direction, sequence)); - info.setReturnValue(true); - } - } - } - - @Inject(method = "interactBlock", at = @At("HEAD"), cancellable = true) - public void interactBlock(ClientPlayerEntity player, Hand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { - if (MeteorClient.EVENT_BUS.post(InteractBlockEvent.get(player.getMainHandStack().isEmpty() ? Hand.OFF_HAND : hand, hitResult)).isCancelled()) cir.setReturnValue(ActionResult.FAIL); - } - - @Inject(method = "attackEntity", at = @At("HEAD"), cancellable = true) - private void onAttackEntity(PlayerEntity player, Entity target, CallbackInfo info) { - if (MeteorClient.EVENT_BUS.post(AttackEntityEvent.get(target)).isCancelled()) info.cancel(); - } - - @Inject(method = "interactEntity", at = @At("HEAD"), cancellable = true) - private void onInteractEntity(PlayerEntity player, Entity entity, Hand hand, CallbackInfoReturnable info) { - if (MeteorClient.EVENT_BUS.post(InteractEntityEvent.get(entity, hand)).isCancelled()) info.setReturnValue(ActionResult.FAIL); - } - - @Inject(method = "dropCreativeStack", at = @At("HEAD"), cancellable = true) - private void onDropCreativeStack(ItemStack stack, CallbackInfo info) { - if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(stack)).isCancelled()) info.cancel(); - } - - @Redirect(method = "updateBlockBreakingProgress", at = @At(value = "FIELD", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;blockBreakingCooldown:I", opcode = Opcodes.PUTFIELD, ordinal = 1)) - private void creativeBreakDelayChange(ClientPlayerInteractionManager interactionManager, int value) { - BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(value)); - blockBreakingCooldown = event.cooldown; - } - - @Redirect(method = "updateBlockBreakingProgress", at = @At(value = "FIELD", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;blockBreakingCooldown:I", opcode = Opcodes.PUTFIELD, ordinal = 2)) - private void survivalBreakDelayChange(ClientPlayerInteractionManager interactionManager, int value) { - BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(value)); - blockBreakingCooldown = event.cooldown; - } - - @Redirect(method = "attackBlock", at = @At(value = "FIELD", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;blockBreakingCooldown:I", opcode = Opcodes.PUTFIELD)) - private void creativeBreakDelayChange2(ClientPlayerInteractionManager interactionManager, int value) { - BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(value)); - blockBreakingCooldown = event.cooldown; - } - - @ModifyExpressionValue(method = "method_41930", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;calcBlockBreakingDelta(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)F")) - private float modifyBlockBreakingDelta(float original) { - if (Modules.get().get(BreakDelay.class).preventInstaBreak() && original >= 1) { - BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(blockBreakingCooldown)); - blockBreakingCooldown = event.cooldown; - return 0; - } - return original; - } - - @Inject(method = "breakBlock", at = @At("HEAD"), cancellable = true) - private void onBreakBlock(BlockPos blockPos, CallbackInfoReturnable info) { - if (MeteorClient.EVENT_BUS.post(BreakBlockEvent.get(blockPos)).isCancelled()) info.setReturnValue(false); - } - - @Inject(method = "interactItem", at = @At("HEAD"), cancellable = true) - private void onInteractItem(PlayerEntity player, Hand hand, CallbackInfoReturnable info) { - InteractItemEvent event = MeteorClient.EVENT_BUS.post(InteractItemEvent.get(hand)); - if (event.toReturn != null) info.setReturnValue(event.toReturn); - } - - @Inject(method = "cancelBlockBreaking", at = @At("HEAD"), cancellable = true) - private void onCancelBlockBreaking(CallbackInfo info) { - if (BlockUtils.breaking) info.cancel(); - } - - @Override - public void meteor$syncSelected() { - syncSelectedSlot(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientTooltipComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientTooltipComponentMixin.java new file mode 100644 index 0000000000..9d9414d1da --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientTooltipComponentMixin.java @@ -0,0 +1,22 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.utils.tooltip.MeteorTooltipData; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +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; + +@Mixin(ClientTooltipComponent.class) +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); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientboundExplodePacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientboundExplodePacketMixin.java new file mode 100644 index 0000000000..08720b6d6c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientboundExplodePacketMixin.java @@ -0,0 +1,54 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.mixininterface.IClientboundExplodePacket; +import net.minecraft.network.protocol.game.ClientboundExplodePacket; +import net.minecraft.world.phys.Vec3; +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 java.util.Optional; + +@Mixin(ClientboundExplodePacket.class) +public abstract class ClientboundExplodePacketMixin implements IClientboundExplodePacket { + @Shadow + @Final + @Mutable + private Optional playerKnockback; + + @Override + public void meteor$setVelocityX(float velocity) { + if (playerKnockback.isPresent()) { + Vec3 kb = playerKnockback.get(); + playerKnockback = Optional.of(new Vec3(velocity, kb.y, kb.z)); + } else { + playerKnockback = Optional.of(new Vec3(velocity, 0, 0)); + } + } + + @Override + public void meteor$setVelocityY(float velocity) { + if (playerKnockback.isPresent()) { + Vec3 kb = playerKnockback.get(); + playerKnockback = Optional.of(new Vec3(kb.x, velocity, kb.z)); + } else { + playerKnockback = Optional.of(new Vec3(0, velocity, 0)); + } + } + + @Override + public void meteor$setVelocityZ(float velocity) { + if (playerKnockback.isPresent()) { + Vec3 kb = playerKnockback.get(); + playerKnockback = Optional.of(new Vec3(kb.x, kb.y, velocity)); + } else { + playerKnockback = Optional.of(new Vec3(0, 0, velocity)); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityVelocityUpdateS2CPacketAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClientboundSetEntityMotionPacketAccessor.java similarity index 54% rename from src/main/java/meteordevelopment/meteorclient/mixin/EntityVelocityUpdateS2CPacketAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ClientboundSetEntityMotionPacketAccessor.java index e4993afe5f..93115a6872 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityVelocityUpdateS2CPacketAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClientboundSetEntityMotionPacketAccessor.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket; -import net.minecraft.util.math.Vec3d; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(EntityVelocityUpdateS2CPacket.class) -public interface EntityVelocityUpdateS2CPacketAccessor { +@Mixin(ClientboundSetEntityMotionPacket.class) +public interface ClientboundSetEntityMotionPacketAccessor { @Mutable - @Accessor("velocity") - void meteor$setVelocity(Vec3d velocity); + @Accessor("movement") + void meteor$setMovement(Vec3 velocity); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClipContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ClipContextMixin.java new file mode 100644 index 0000000000..d534f1e09b --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ClipContextMixin.java @@ -0,0 +1,49 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.mixininterface.IClipContext; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ClipContext.class) +public abstract class ClipContextMixin implements IClipContext { + @Shadow + @Final + @Mutable + private Vec3 from; + @Shadow + @Final + @Mutable + private Vec3 to; + @Shadow + @Final + @Mutable + private ClipContext.Block block; + @Shadow + @Final + @Mutable + private ClipContext.Fluid fluid; + @Shadow + @Final + @Mutable + private CollisionContext collisionContext; + + @Override + public void meteor$set(Vec3 start, Vec3 end, ClipContext.Block shapeType, ClipContext.Fluid fluidHandling, Entity entity) { + this.from = start; + this.to = end; + this.block = shapeType; + this.fluid = fluidHandling; + this.collisionContext = CollisionContext.of(entity); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CobwebBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CobwebBlockMixin.java deleted file mode 100644 index 1c4319eaac..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CobwebBlockMixin.java +++ /dev/null @@ -1,32 +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.sugar.Local; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import net.minecraft.block.CobwebBlock; -import net.minecraft.entity.Entity; -import org.spongepowered.asm.mixin.Dynamic; -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 static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(CobwebBlock.class) -public abstract class CobwebBlockMixin { - @Dynamic("Explicit 1.21.9 Support") - @Inject(method = { - "onEntityCollision", // 1.21.10 - "onEntityCollision(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/entity/Entity;Lnet/minecraft/entity/EntityCollisionHandler;)V", // 1.21.9 yarn - "method_9548(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;Lnet/minecraft/class_10774;)V" // 1.21.9 intermediary - }, at = @At("HEAD"), cancellable = true) - private void onEntityCollision(CallbackInfo ci, @Local(argsOnly = true) Entity entity) { - if (entity == mc.player && Modules.get().get(NoSlow.class).cobweb()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CommandSuggestionsMixin.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/CommandSuggestionsMixin.java index 79d245b1e7..d9b1d9b183 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatInputSuggestorMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CommandSuggestionsMixin.java @@ -11,9 +11,10 @@ import com.mojang.brigadier.suggestion.Suggestions; import meteordevelopment.meteorclient.commands.Commands; import meteordevelopment.meteorclient.systems.config.Config; -import net.minecraft.client.gui.screen.ChatInputSuggestor; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.command.CommandSource; +import net.minecraft.client.gui.components.CommandSuggestions; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.multiplayer.ClientSuggestionProvider; +import net.minecraft.commands.SharedSuggestionProvider; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,38 +26,44 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -@Mixin(ChatInputSuggestor.class) -public abstract class ChatInputSuggestorMixin { - @Shadow private ParseResults parse; - @Shadow @Final TextFieldWidget textField; - @Shadow boolean completingSuggestions; - @Shadow private CompletableFuture pendingSuggestions; - @Shadow private ChatInputSuggestor.SuggestionWindow window; +@Mixin(CommandSuggestions.class) +public abstract class CommandSuggestionsMixin { + @Shadow + private ParseResults currentParse; + @Shadow + @Final + private EditBox input; + @Shadow + private boolean keepSuggestions; + @Shadow + private CompletableFuture pendingSuggestions; + @Shadow + private CommandSuggestions.SuggestionsList suggestions; @Shadow - protected abstract void showCommandSuggestions(); + protected abstract void updateUsageInfo(final ParseResults currentParse, final Suggestions suggestions); - @Inject(method = "refresh", + @Inject(method = "updateCommandInfo", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/StringReader;canRead()Z", remap = false), cancellable = true ) - public void onRefresh(CallbackInfo ci, @Local StringReader reader) { + public void onRefresh(CallbackInfo ci, @Local(name = "reader") StringReader reader) { String prefix = Config.get().prefix.get(); int length = prefix.length(); if (reader.canRead(length) && reader.getString().startsWith(prefix, reader.getCursor())) { reader.setCursor(reader.getCursor() + length); - if (this.parse == null) { - this.parse = Commands.DISPATCHER.parse(reader, mc.getNetworkHandler().getCommandSource()); + if (this.currentParse == null) { + this.currentParse = Commands.DISPATCHER.parse(reader, mc.getConnection().getSuggestionsProvider()); } - int cursor = textField.getCursor(); - if (cursor >= length && (this.window == null || !this.completingSuggestions)) { - this.pendingSuggestions = Commands.DISPATCHER.getCompletionSuggestions(this.parse, cursor); + int cursor = input.getCursorPosition(); + if (cursor >= length && (this.suggestions == null || !this.keepSuggestions)) { + this.pendingSuggestions = Commands.DISPATCHER.getCompletionSuggestions(this.currentParse, cursor); this.pendingSuggestions.thenRun(() -> { if (this.pendingSuggestions.isDone()) { - this.showCommandSuggestions(); + /*this.updateUsageInfo();*/ } }); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CompassAngleStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CompassAngleStateMixin.java new file mode 100644 index 0000000000..ae6b70823c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CompassAngleStateMixin.java @@ -0,0 +1,40 @@ +/* + * 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 meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Freecam; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.item.properties.numeric.CompassAngleState; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.ItemOwner; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(CompassAngleState.class) +public abstract class CompassAngleStateMixin { + @ModifyExpressionValue(method = "getWrappedVisualRotationY", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/ItemOwner;getVisualRotationYInDegrees()F")) + private static float callLivingEntityGetYaw(float original) { + if (Modules.get().isActive(Freecam.class)) return mc.gameRenderer.getMainCamera().yRot(); + return original; + } + + @ModifyReturnValue(method = "getAngleFromEntityToPos(Lnet/minecraft/world/entity/ItemOwner;Lnet/minecraft/core/BlockPos;)D", at = @At("RETURN")) + private static double modifyGetAngleTo(double original, ItemOwner owner, BlockPos position) { + if (Modules.get().isActive(Freecam.class)) { + Vec3 vec3d = Vec3.atCenterOf(position); + Camera camera = mc.gameRenderer.getMainCamera(); + return Math.atan2(vec3d.z() - camera.position().z, vec3d.x() - camera.position().x) / (float) (Math.PI * 2); + } + + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CompassStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CompassStateMixin.java deleted file mode 100644 index 89a3a612a6..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CompassStateMixin.java +++ /dev/null @@ -1,40 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Freecam; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.item.property.numeric.CompassState; -import net.minecraft.util.HeldItemContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(CompassState.class) -public abstract class CompassStateMixin { - @ModifyExpressionValue(method = "getBodyYaw", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/HeldItemContext;getBodyYaw()F")) - private static float callLivingEntityGetYaw(float original) { - if (Modules.get().isActive(Freecam.class)) return mc.gameRenderer.getCamera().getYaw(); - return original; - } - - @ModifyReturnValue(method = "getAngleTo(Lnet/minecraft/util/HeldItemContext;Lnet/minecraft/util/math/BlockPos;)D", at = @At("RETURN")) - private static double modifyGetAngleTo(double original, HeldItemContext from, BlockPos to) { - if (Modules.get().isActive(Freecam.class)) { - Vec3d vec3d = Vec3d.ofCenter(to); - Camera camera = mc.gameRenderer.getCamera(); - return Math.atan2(vec3d.getZ() - camera.getCameraPos().z, vec3d.getX() - camera.getCameraPos().x) / (float) (Math.PI * 2); - } - - return original; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ComponentMixin.java similarity index 52% rename from src/main/java/meteordevelopment/meteorclient/mixin/TextMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ComponentMixin.java index 26403c1ecb..dc9209555b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ComponentMixin.java @@ -5,12 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import meteordevelopment.meteorclient.mixininterface.IText; -import net.minecraft.text.Text; +import meteordevelopment.meteorclient.mixininterface.IComponent; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; -@Mixin(Text.class) -public interface TextMixin extends IText { +@Mixin(Component.class) +public interface ComponentMixin extends IComponent { @Override - default void meteor$invalidateCache() {} + default void meteor$invalidateCache() { + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java index 6d2e056e5d..4d8e6edb95 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectScreenMixin.java @@ -7,11 +7,11 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.ServerConnectBeginEvent; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; -import net.minecraft.client.network.CookieStorage; -import net.minecraft.client.network.ServerAddress; -import net.minecraft.client.network.ServerInfo; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.ConnectScreen; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.TransferState; +import net.minecraft.client.multiplayer.resolver.ServerAddress; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -19,8 +19,8 @@ @Mixin(ConnectScreen.class) public abstract class ConnectScreenMixin { - @Inject(method = "connect(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/network/ServerAddress;Lnet/minecraft/client/network/ServerInfo;Lnet/minecraft/client/network/CookieStorage;)V", at = @At("HEAD")) - private void tryConnectEvent(MinecraftClient client, ServerAddress address, ServerInfo info, CookieStorage cookieStorage, CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(ServerConnectBeginEvent.get(address, info)); + @Inject(method = "connect(Lnet/minecraft/client/Minecraft;Lnet/minecraft/client/multiplayer/resolver/ServerAddress;Lnet/minecraft/client/multiplayer/ServerData;Lnet/minecraft/client/multiplayer/TransferState;)V", at = @At("HEAD")) + private void tryConnectEvent(Minecraft minecraft, ServerAddress hostAndPort, ServerData server, TransferState transferState, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(ServerConnectBeginEvent.get(hostAndPort, server)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectionAccessor.java similarity index 75% rename from src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ConnectionAccessor.java index c05cb1e73e..dd53440c6c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientConnectionAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectionAccessor.java @@ -6,12 +6,12 @@ package meteordevelopment.meteorclient.mixin; import io.netty.channel.Channel; -import net.minecraft.network.ClientConnection; +import net.minecraft.network.Connection; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ClientConnection.class) -public interface ClientConnectionAccessor { +@Mixin(Connection.class) +public interface ConnectionAccessor { @Accessor("channel") Channel meteor$getChannel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ConnectionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectionMixin.java new file mode 100644 index 0000000000..3b4f09150f --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ConnectionMixin.java @@ -0,0 +1,108 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPipeline; +import io.netty.handler.proxy.Socks4ProxyHandler; +import io.netty.handler.proxy.Socks5ProxyHandler; +import io.netty.handler.timeout.TimeoutException; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.events.world.ServerConnectEndEvent; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; +import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; +import meteordevelopment.meteorclient.systems.proxies.Proxies; +import meteordevelopment.meteorclient.systems.proxies.Proxy; +import net.minecraft.ChatFormatting; +import net.minecraft.network.BandwidthDebugMonitor; +import net.minecraft.network.Connection; +import net.minecraft.network.SkipPacketEncoderException; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBundlePacket; +import net.minecraft.server.network.EventLoopGroupHolder; +import org.jetbrains.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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.net.InetSocketAddress; +import java.util.Iterator; + +@Mixin(Connection.class) +public abstract class ConnectionMixin { + @Inject(method = "channelRead0(Lio/netty/channel/ChannelHandlerContext;Lnet/minecraft/network/protocol/Packet;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;genericsFtw(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketListener;)V", shift = At.Shift.BEFORE), cancellable = true) + private void onHandlePacket(ChannelHandlerContext ctx, Packet packet, CallbackInfo ci) { + if (packet instanceof ClientboundBundlePacket bundle) { + for (Iterator> it = bundle.subPackets().iterator(); it.hasNext(); ) { + if (MeteorClient.EVENT_BUS.post(new PacketEvent.Receive(it.next(), (Connection) (Object) this)).isCancelled()) + it.remove(); + } + } else if (MeteorClient.EVENT_BUS.post(new PacketEvent.Receive(packet, (Connection) (Object) this)).isCancelled()) + ci.cancel(); + } + + @Inject(method = "disconnect(Lnet/minecraft/network/chat/Component;)V", at = @At("HEAD")) + private void disconnect(Component reason, CallbackInfo ci) { + if (Modules.get().get(HighwayBuilder.class).isActive()) { + MutableComponent text = Component.literal("%n%n%s[%sHighway Builder%s] Statistics:%n".formatted(ChatFormatting.GRAY, ChatFormatting.BLUE, ChatFormatting.GRAY)); + text.append(Modules.get().get(HighwayBuilder.class).getStatsText()); + + ((MutableComponent) reason).append(text); + } + } + + @Inject(method = "connect(Ljava/net/InetSocketAddress;Lnet/minecraft/server/network/EventLoopGroupHolder;Lnet/minecraft/network/Connection;)Lio/netty/channel/ChannelFuture;", at = @At("HEAD")) + private static void onConnect(InetSocketAddress address, EventLoopGroupHolder eventLoopGroupHolder, Connection connection, CallbackInfoReturnable cir) { + MeteorClient.EVENT_BUS.post(ServerConnectEndEvent.get(address)); + } + + @Inject(at = @At("HEAD"), method = "send(Lnet/minecraft/network/protocol/Packet;Lio/netty/channel/ChannelFutureListener;)V", cancellable = true) + private void onSendPacketHead(Packet packet, @Nullable ChannelFutureListener listener, CallbackInfo ci) { + if (MeteorClient.EVENT_BUS.post(new PacketEvent.Send(packet, (Connection) (Object) this)).isCancelled()) { + ci.cancel(); + } + } + + @Inject(method = "send(Lnet/minecraft/network/protocol/Packet;Lio/netty/channel/ChannelFutureListener;)V", at = @At("TAIL")) + private void onSendPacketTail(Packet packet, @Nullable ChannelFutureListener listener, CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(new PacketEvent.Sent(packet, (Connection) (Object) this)); + } + + @Inject(method = "exceptionCaught", at = @At("HEAD"), cancellable = true) + private void exceptionCaught(ChannelHandlerContext ctx, Throwable cause, CallbackInfo ci) { + AntiPacketKick apk = Modules.get().get(AntiPacketKick.class); + if (!(cause instanceof TimeoutException) && !(cause instanceof SkipPacketEncoderException) && apk.catchExceptions()) { + if (apk.logExceptions.get()) apk.warning("Caught exception: %s", cause); + ci.cancel(); + } + } + + @Inject(method = "configureSerialization", at = @At("RETURN")) + private static void onAddHandlers(ChannelPipeline pipeline, PacketFlow inboundDirection, boolean local, BandwidthDebugMonitor monitor, CallbackInfo ci) { + if (inboundDirection != PacketFlow.CLIENTBOUND || local) return; + + Proxy proxy = Proxies.get().getEnabled(); + if (proxy == null) return; + + switch (proxy.type.get()) { + case Socks4 -> + pipeline.addFirst(new Socks4ProxyHandler(new InetSocketAddress(proxy.address.get(), proxy.port.get()), proxy.username.get())); + case Socks5 -> + pipeline.addFirst(new Socks5ProxyHandler(new InetSocketAddress(proxy.address.get(), proxy.port.get()), proxy.username.get(), proxy.password.get())); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentAccessor.java deleted file mode 100644 index 0e77788cfc..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentAccessor.java +++ /dev/null @@ -1,18 +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 net.minecraft.component.type.ContainerComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.util.collection.DefaultedList; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ContainerComponent.class) -public interface ContainerComponentAccessor { - @Accessor("stacks") - DefaultedList meteor$getStacks(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentMixin.java deleted file mode 100644 index bb53dcc50b..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ContainerComponentMixin.java +++ /dev/null @@ -1,45 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; -import net.minecraft.component.ComponentsAccess; -import net.minecraft.component.type.ContainerComponent; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.tooltip.TooltipType; -import net.minecraft.text.Text; -import net.minecraft.util.collection.DefaultedList; -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 java.util.function.Consumer; - -@Mixin(ContainerComponent.class) -public abstract class ContainerComponentMixin { - @Shadow - @Final - private DefaultedList stacks; - - @Inject(method = "appendTooltip", at = @At("HEAD"), cancellable = true) - private void onAppendTooltip(Item.TooltipContext context, Consumer textConsumer, TooltipType type, ComponentsAccess components, CallbackInfo ci) { - if (Modules.get() == null) return; - - BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); - if (tooltips.isActive()) { - if (tooltips.previewShulkers()) ci.cancel(); - else if (tooltips.shulkerCompactTooltip()) { - ci.cancel(); - tooltips.applyCompactShulkerTooltip(stacks, textConsumer); - } - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java index 8b7f4a264b..5b683a6abd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CrashReportMixin.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.systems.modules.Category; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.CrashReport; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -22,12 +22,12 @@ @Mixin(CrashReport.class) public abstract class CrashReportMixin { - @Inject(method = "addDetails", at = @At("TAIL")) - private void onAddDetails(StringBuilder sb, CallbackInfo info) { - sb.append("\n\n-- Meteor Client --\n\n"); - sb.append("Version: ").append(MeteorClient.VERSION).append("\n"); + @Inject(method = "getDetails(Ljava/lang/StringBuilder;)V", at = @At("TAIL")) + private void onAddDetails(StringBuilder builder, CallbackInfo ci) { + builder.append("\n\n-- Meteor Client --\n\n"); + builder.append("Version: ").append(MeteorClient.VERSION).append("\n"); if (!MeteorClient.BUILD_NUMBER.isEmpty()) { - sb.append("Build: ").append(MeteorClient.BUILD_NUMBER).append("\n"); + builder.append("Build: ").append(MeteorClient.BUILD_NUMBER).append("\n"); } if (Modules.get() != null) { @@ -41,17 +41,17 @@ private void onAddDetails(StringBuilder sb, CallbackInfo info) { if (!modulesActive) { modulesActive = true; - sb.append("\n[[ Active Modules ]]\n"); + builder.append("\n[[ Active Modules ]]\n"); } if (!categoryActive) { categoryActive = true; - sb.append("\n[") - .append(category) - .append("]:\n"); + builder.append("\n[") + .append(category) + .append("]:\n"); } - sb.append(module.name).append("\n"); + builder.append(module.name).append("\n"); } } @@ -65,19 +65,19 @@ private void onAddDetails(StringBuilder sb, CallbackInfo info) { if (!hudActive) { hudActive = true; - sb.append("\n[[ Active Hud Elements ]]\n"); + builder.append("\n[[ Active Hud Elements ]]\n"); } - if (!(element instanceof TextHud textHud)) sb.append(element.info.name).append("\n"); + if (!(element instanceof TextHud textHud)) builder.append(element.info.name).append("\n"); else { - sb.append("Text\n{") - .append(textHud.text.get()) - .append("}\n"); + builder.append("Text\n{") + .append(textHud.text.get()) + .append("}\n"); if (textHud.shown.get() != TextHud.Shown.Always) { - sb.append("(") - .append(textHud.shown.get()) - .append(textHud.condition.get()) - .append(")\n"); + builder.append("(") + .append(textHud.shown.get()) + .append(textHud.condition.get()) + .append(")\n"); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CreativeInventoryScreenAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeInventoryScreenAccessor.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/mixin/CreativeInventoryScreenAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeInventoryScreenAccessor.java index b67a4445e5..ee2e26010a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CreativeInventoryScreenAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeInventoryScreenAccessor.java @@ -5,15 +5,15 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; -import net.minecraft.item.ItemGroup; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.world.item.CreativeModeTab; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(CreativeInventoryScreen.class) -public interface CreativeInventoryScreenAccessor { +@Mixin(CreativeModeInventoryScreen.class) +public interface CreativeModeInventoryScreenAccessor { @Accessor("selectedTab") - static ItemGroup meteor$getSelectedTab() { + static CreativeModeTab meteor$getSelectedTab() { return null; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeTabsAccessor.java similarity index 56% rename from src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeTabsAccessor.java index 71d7941e43..c76bd2840d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeTabsAccessor.java @@ -5,16 +5,16 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemGroups; -import net.minecraft.registry.RegistryKey; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.resources.ResourceKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ItemGroups.class) -public interface ItemGroupsAccessor { +@Mixin(CreativeModeTabs.class) +public interface CreativeModeTabsAccessor { @Accessor("INVENTORY") - static RegistryKey meteor$getInventory() { + static ResourceKey meteor$getInventory() { throw new AssertionError(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeTabsMixin.java similarity index 76% rename from src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeTabsMixin.java index 0842200b8c..64159a597e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemGroupsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeModeTabsMixin.java @@ -8,13 +8,13 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; -import net.minecraft.item.ItemGroups; +import net.minecraft.world.item.CreativeModeTabs; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(ItemGroups.class) -public abstract class ItemGroupsMixin { - @ModifyReturnValue(method = "updateDisplayContext", at = @At("RETURN")) +@Mixin(CreativeModeTabs.class) +public abstract class CreativeModeTabsMixin { + @ModifyReturnValue(method = "tryRebuildTabContents", at = @At("RETURN")) private static boolean modifyReturn(boolean original) { return original || Modules.get().get(BetterTooltips.class).updateTooltips(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java index cc65e2f631..c7413c03f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CreativeSlotMixin.java @@ -6,22 +6,24 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.mixininterface.ISlot; -import net.minecraft.screen.slot.Slot; +import net.minecraft.world.inventory.Slot; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -@Mixin(targets = "net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen$CreativeSlot") +@Mixin(targets = "net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen$SlotWrapper") public abstract class CreativeSlotMixin implements ISlot { - @Shadow @Final Slot slot; + @Shadow + @Final + private Slot target; @Override - public int meteor$getId() { - return slot.id; + public int meteor$getIndex() { + return target.index; } @Override - public int meteor$getIndex() { - return slot.getIndex(); + public int meteor$getSlot() { + return target.getContainerSlot(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java index 1e4c0d4d4a..641a171bed 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CrossbowItemAccessor.java @@ -5,13 +5,15 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.component.type.ChargedProjectilesComponent; -import net.minecraft.item.CrossbowItem; +import net.minecraft.world.item.component.ChargedProjectiles; +import net.minecraft.world.item.CrossbowItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(CrossbowItem.class) public interface CrossbowItemAccessor { - @Invoker("getSpeed") - static float meteor$getSpeed(ChargedProjectilesComponent itemStack) { return 0; } + @Invoker("getShootingPower") + static float meteor$getSpeed(ChargedProjectiles itemStack) { + return 0; + } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/CustomHeadLayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/CustomHeadLayerMixin.java new file mode 100644 index 0000000000..2cb6cd478a --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/CustomHeadLayerMixin.java @@ -0,0 +1,29 @@ +/* + * 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.vertex.PoseStack; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.NoRender; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HeadedModel; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.layers.CustomHeadLayer; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +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(CustomHeadLayer.class) +public abstract class CustomHeadLayerMixin & HeadedModel> { + @Inject(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;FF)V", at = @At("HEAD"), cancellable = true) + private void onRender(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, S state, float yRot, float xRot, CallbackInfo ci) { + if (state instanceof AvatarRenderState && Modules.get().get(NoRender.class).noArmor()) + ci.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DirectionAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/DirectionAccessor.java index e808da0c2c..f8977e950c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DirectionAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DirectionAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(Direction.class) public interface DirectionAccessor { - @Accessor("HORIZONTAL") + @Accessor("BY_2D_DATA") static Direction[] meteor$getHorizontal() { throw new AssertionError(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java index 4a8bab9ae1..1f93a6f3ec 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DisconnectedScreenMixin.java @@ -7,13 +7,13 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.AutoReconnect; -import net.minecraft.client.gui.screen.DisconnectedScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.DirectionalLayoutWidget; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.layouts.LinearLayout; +import net.minecraft.client.gui.screens.ConnectScreen; +import net.minecraft.client.gui.screens.DisconnectedScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -28,26 +28,28 @@ public abstract class DisconnectedScreenMixin extends Screen { @Shadow @Final - private DirectionalLayoutWidget grid; - @Unique private ButtonWidget reconnectBtn; - @Unique private double time = Modules.get().get(AutoReconnect.class).time.get() * 20; + private LinearLayout layout; + @Unique + private Button reconnectBtn; + @Unique + private double time = Modules.get().get(AutoReconnect.class).time.get() * 20; - protected DisconnectedScreenMixin(Text title) { + protected DisconnectedScreenMixin(Component title) { super(title); } - @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/DirectionalLayoutWidget;refreshPositions()V", shift = At.Shift.BEFORE)) + @Inject(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/layouts/LinearLayout;arrangeElements()V", shift = At.Shift.BEFORE)) private void addButtons(CallbackInfo ci) { AutoReconnect autoReconnect = Modules.get().get(AutoReconnect.class); if (autoReconnect.lastServerConnection != null && !autoReconnect.button.get()) { - reconnectBtn = new ButtonWidget.Builder(Text.literal(getText()), button -> tryConnecting()).build(); - grid.add(reconnectBtn); + reconnectBtn = new Button.Builder(Component.literal(getText()), button -> tryConnecting()).build(); + layout.addChild(reconnectBtn); - grid.add( - new ButtonWidget.Builder(Text.literal("Toggle Auto Reconnect"), button -> { + layout.addChild( + new Button.Builder(Component.literal("Toggle Auto Reconnect"), button -> { autoReconnect.toggle(); - reconnectBtn.setMessage(Text.literal(getText())); + reconnectBtn.setMessage(Component.literal(getText())); time = autoReconnect.time.get() * 20; }).build() ); @@ -62,8 +64,8 @@ public void tick() { if (time <= 0) { tryConnecting(); } else { - time--; - if (reconnectBtn != null) reconnectBtn.setMessage(Text.literal(getText())); + time -= 1; + if (reconnectBtn != null) reconnectBtn.setMessage(Component.literal(getText())); } } @@ -77,6 +79,6 @@ private String getText() { @Unique private void tryConnecting() { var lastServer = Modules.get().get(AutoReconnect.class).lastServerConnection; - ConnectScreen.connect(new TitleScreen(), mc, lastServer.left(), lastServer.right(), false, null); + ConnectScreen.startConnecting(new TitleScreen(), mc, lastServer.left(), lastServer.right(), false, null); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DownloaderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DownloadQueueMixin.java similarity index 73% rename from src/main/java/meteordevelopment/meteorclient/mixin/DownloaderMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/DownloadQueueMixin.java index 85362f4815..95a8fcfcf9 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DownloaderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DownloadQueueMixin.java @@ -8,7 +8,7 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import meteordevelopment.meteorclient.MeteorClient; -import net.minecraft.util.Downloader; +import net.minecraft.server.packs.DownloadQueue; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -27,20 +27,20 @@ * @author Izuna * @see MixinDownloader.java */ -@Mixin(Downloader.class) -public class DownloaderMixin { +@Mixin(DownloadQueue.class) +public abstract class DownloadQueueMixin { @Shadow @Final - private Path directory; + private Path cacheDir; - @ModifyExpressionValue(method = "method_55485", at = @At(value = "INVOKE", target = "Ljava/nio/file/Path;resolve(Ljava/lang/String;)Ljava/nio/file/Path;")) - private Path hookResolve(Path original, @Local(argsOnly = true) UUID id) { - UUID accountId = mc.getSession().getUuidOrNull(); + @ModifyExpressionValue(method = "lambda$runDownload$0", at = @At(value = "INVOKE", target = "Ljava/nio/file/Path;resolve(Ljava/lang/String;)Ljava/nio/file/Path;")) + private Path hookResolve(Path original, @Local(argsOnly = true, name = "id") UUID id) { + UUID accountId = mc.getUser().getProfileId(); if (accountId == null) { MeteorClient.LOG.warn("Failed to change resource pack download directory because the account id is null."); return original; } - return directory.resolve(accountId.toString()).resolve(id.toString()); + return cacheDir.resolve(accountId.toString()).resolve(id.toString()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ServerResourcePackLoaderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DownloadedPackSourceMixin.java similarity index 82% rename from src/main/java/meteordevelopment/meteorclient/mixin/ServerResourcePackLoaderMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/DownloadedPackSourceMixin.java index 72ad4779c7..e9f33761d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ServerResourcePackLoaderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/DownloadedPackSourceMixin.java @@ -7,14 +7,14 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.ServerSpoof; -import net.minecraft.client.resource.server.ServerResourcePackLoader; +import net.minecraft.client.resources.server.DownloadedPackSource; 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(ServerResourcePackLoader.class) -public abstract class ServerResourcePackLoaderMixin { +@Mixin(DownloadedPackSource.class) +public abstract class DownloadedPackSourceMixin { @Inject(method = "onReloadSuccess", at = @At("TAIL")) private void removeInactivePacksTail(CallbackInfo ci) { Modules.get().get(ServerSpoof.class).silentAcceptResourcePack = false; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextAccessor.java deleted file mode 100644 index e71a64a6b7..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextAccessor.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 net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.render.state.GuiRenderState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(DrawContext.class) -public interface DrawContextAccessor { - @Accessor("state") - GuiRenderState getState(); - - @Accessor("scissorStack") - DrawContext.ScissorStack getScissorStack(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java deleted file mode 100644 index aad3bc1784..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/DrawContextMixin.java +++ /dev/null @@ -1,40 +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.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.item.tooltip.TooltipData; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import org.jetbrains.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 = DrawContext.class) -public abstract class DrawContextMixin { - @Inject(method = "drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;IILnet/minecraft/util/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V", shift = At.Shift.BEFORE)) - private void onDrawTooltip(TextRenderer textRenderer, List text, Optional data, int x, int y, @Nullable Identifier texture, CallbackInfo info, @Local(ordinal = 1) List list) { - if (data.isPresent() && data.get() instanceof MeteorTooltipData meteorTooltipData) - list.add(meteorTooltipData.getComponent()); - } - - @ModifyReceiver(method = "drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;IILnet/minecraft/util/Identifier;)V", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V")) - private Optional onDrawTooltip_modifyIfPresentReceiver(Optional data, Consumer consumer) { - if (data.isPresent() && data.get() instanceof MeteorTooltipData) return Optional.empty(); - return data; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java deleted file mode 100644 index 91aa29b3ff..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ElytraFeatureRendererMixin.java +++ /dev/null @@ -1,38 +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 meteordevelopment.meteorclient.mixininterface.IEntityRenderState; -import meteordevelopment.meteorclient.utils.network.Capes; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.feature.ElytraFeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.entity.state.BipedEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(ElytraFeatureRenderer.class) -public abstract class ElytraFeatureRendererMixin> extends FeatureRenderer { - public ElytraFeatureRendererMixin(FeatureRendererContext context) { - super(context); - } - - @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;ILnet/minecraft/client/render/entity/state/BipedEntityRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/feature/ElytraFeatureRenderer;getTexture(Lnet/minecraft/client/render/entity/state/BipedEntityRenderState;)Lnet/minecraft/util/Identifier;")) - private Identifier modifyCapeTexture(Identifier original, MatrixStack matrices, OrderedRenderCommandQueue entityRenderCommandQueue, int i, S state, float f, float g) { - if (((IEntityRenderState) state).meteor$getEntity() instanceof PlayerEntity player) { - Identifier id = Capes.get(player); - return id == null ? original : id; - } - - return original; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantTableRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantTableRendererMixin.java new file mode 100644 index 0000000000..9f32188879 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantTableRendererMixin.java @@ -0,0 +1,27 @@ +/* + * 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.v2.WrapWithCondition; +import com.mojang.blaze3d.vertex.PoseStack; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.NoRender; +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; +import org.spongepowered.asm.mixin.injection.At; + +@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) { + return !Modules.get().get(NoRender.class).noEnchTableBook(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java deleted file mode 100644 index dd09a45147..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EnchantingTableBlockEntityRendererMixin.java +++ /dev/null @@ -1,27 +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.v2.WrapWithCondition; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.model.Model; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.block.entity.EnchantingTableBlockEntityRenderer; -import net.minecraft.client.render.command.ModelCommandRenderer; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.math.MatrixStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(EnchantingTableBlockEntityRenderer.class) -public abstract class EnchantingTableBlockEntityRendererMixin { - @WrapWithCondition(method = "render(Lnet/minecraft/client/render/block/entity/state/EnchantingTableBlockEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/RenderLayer;IIILnet/minecraft/client/texture/Sprite;ILnet/minecraft/client/render/command/ModelCommandRenderer$CrumblingOverlayCommand;)V")) - private boolean onRenderBookModelRenderProxy(OrderedRenderCommandQueue instance, Model model, S state, MatrixStack matrixStack, RenderLayer renderLayer, int i, int j, int k, Sprite sprite, int l, ModelCommandRenderer.CrumblingOverlayCommand crumblingOverlayCommand) { - return !Modules.get().get(NoRender.class).noEnchTableBook(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityRendererMixin.java deleted file mode 100644 index 9880909d4f..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityRendererMixin.java +++ /dev/null @@ -1,87 +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.v2.WrapWithCondition; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Chams; -import net.minecraft.client.model.Model; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.command.ModelCommandRenderer; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.EndCrystalEntityRenderer; -import net.minecraft.client.render.entity.state.EndCrystalEntityRenderState; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -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; - -@Mixin(EndCrystalEntityRenderer.class) -public abstract class EndCrystalEntityRendererMixin { - // Chams - - @Unique - private Chams chams; - - @Inject(method = "", at = @At("RETURN")) - private void onInit(CallbackInfo info) { - chams = Modules.get().get(Chams.class); - } - - // Chams - Texture - - @Shadow - @Final - @Mutable - private static RenderLayer END_CRYSTAL; - - @Shadow - @Final - private static Identifier TEXTURE; - - @Inject(method = "render(Lnet/minecraft/client/render/entity/state/EndCrystalEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At("HEAD")) - private void render$renderLayer(EndCrystalEntityRenderState endCrystalEntityRenderState, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState arg, CallbackInfo ci) { - END_CRYSTAL = RenderLayers.entityTranslucent((chams.isActive() && chams.crystals.get() && !chams.crystalsTexture.get()) ? Chams.BLANK : TEXTURE); - } - - // Chams - Scale - - @Inject(method = "render(Lnet/minecraft/client/render/entity/state/EndCrystalEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;scale(FFF)V")) - private void render$scale(EndCrystalEntityRenderState endCrystalEntityRenderState, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState arg, CallbackInfo ci) { - if (!chams.isActive() || !chams.crystals.get()) return; - - float v = chams.crystalsScale.get().floatValue(); - matrixStack.scale(v, v, v); - } - - // Chams - Color - - @WrapWithCondition(method = "render(Lnet/minecraft/client/render/entity/state/EndCrystalEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/RenderLayer;IIILnet/minecraft/client/render/command/ModelCommandRenderer$CrumblingOverlayCommand;)V")) - private boolean render$color(OrderedRenderCommandQueue instance, Model model, S state, MatrixStack matrixStack, RenderLayer renderLayer, int light, int uv, int outlineColor, ModelCommandRenderer.CrumblingOverlayCommand crumblingOverlayCommand) { - if (chams.isActive() && chams.crystals.get()) { - instance.submitModel( - model, - state, - matrixStack, - END_CRYSTAL, - light, - uv, - chams.crystalsColor.get().getPacked(), - null, - outlineColor, - null - ); - - return false; - } - - return true; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityModelMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalModelMixin.java similarity index 53% rename from src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityModelMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalModelMixin.java index 8222090ad1..58b991ced0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalEntityModelMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalModelMixin.java @@ -8,29 +8,29 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Chams; -import net.minecraft.client.render.entity.model.EndCrystalEntityModel; -import net.minecraft.client.render.entity.state.EndCrystalEntityRenderState; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.model.object.crystal.EndCrystalModel; +import net.minecraft.client.renderer.entity.state.EndCrystalRenderState; +import net.minecraft.util.Mth; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(EndCrystalEntityModel.class) -public abstract class EndCrystalEntityModelMixin { +@Mixin(EndCrystalModel.class) +public abstract class EndCrystalModelMixin { // Chams - Bounce - @ModifyExpressionValue(method = "setAngles(Lnet/minecraft/client/render/entity/state/EndCrystalEntityRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/EndCrystalEntityRenderer;getYOffset(F)F")) - private float setAngles$bounce(float original, EndCrystalEntityRenderState state) { + @ModifyExpressionValue(method = "setupAnim(Lnet/minecraft/client/renderer/entity/state/EndCrystalRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EndCrystalRenderer;getY(F)F")) + private float setAngles$bounce(float original, EndCrystalRenderState state) { Chams module = Modules.get().get(Chams.class); if (!module.isActive() || !module.crystals.get()) return original; - float g = MathHelper.sin(state.age * 0.2F) / 2.0F + 0.5F; + float g = Mth.sin(state.ageInTicks * 0.2F) / 2.0F + 0.5F; g = (g * g + g) * 0.4F * module.crystalsBounce.get().floatValue(); return g - 1.4F; } // Chams - Rotation speed - @ModifyExpressionValue(method = "setAngles(Lnet/minecraft/client/render/entity/state/EndCrystalEntityRenderState;)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/EndCrystalEntityRenderState;age:F", ordinal = 0)) + @ModifyExpressionValue(method = "setupAnim(Lnet/minecraft/client/renderer/entity/state/EndCrystalRenderState;)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/EndCrystalRenderState;ageInTicks:F", ordinal = 0)) private float modifySpeed(float original) { Chams module = Modules.get().get(Chams.class); if (!module.isActive() || !module.crystals.get()) return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalRendererMixin.java new file mode 100644 index 0000000000..36e586b9da --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EndCrystalRendererMixin.java @@ -0,0 +1,81 @@ +/* + * 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.v2.WrapWithCondition; +import com.mojang.blaze3d.vertex.PoseStack; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Chams; +import net.minecraft.client.model.Model; +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; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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(EndCrystalRenderer.class) +public abstract class EndCrystalRendererMixin { + // Chams + + @Unique + private Chams chams; + + @Inject(method = "", at = @At("RETURN")) + private void onInit(CallbackInfo ci) { + chams = Modules.get().get(Chams.class); + } + + // Chams - Texture + + @Shadow + @Final + private static Identifier END_CRYSTAL_LOCATION; + + // Chams - Scale + + @Inject(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 = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V")) + private void render$scale(EndCrystalRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + if (!chams.isActive() || !chams.crystals.get()) return; + + float v = chams.crystalsScale.get().floatValue(); + poseStack.scale(v, v, v); + } + + // 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) { + if (chams.isActive() && chams.crystals.get()) { + var renderType = RenderTypes.entityTranslucent((chams.isActive() && chams.crystals.get() && !chams.crystalsTexture.get()) ? Chams.BLANK : END_CRYSTAL_LOCATION); + + instance.submitModel( + model, + state, + poseStack, + renderType, + lightCoords, + overlayCoords, + chams.crystalsColor.get().getPacked(), + null, + outlineColor, + null + ); + + return false; + } + + return true; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityAccessor.java index 76260d8fcc..dc5905f90d 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityAccessor.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.Entity; +import net.minecraft.world.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(Entity.class) public interface EntityAccessor { - @Accessor("touchingWater") + @Accessor("wasTouchingWater") void meteor$setInWater(boolean touchingWater); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityHitboxDebugRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityHitboxDebugRendererMixin.java index a07ba6a41b..30dc56badd 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityHitboxDebugRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityHitboxDebugRendererMixin.java @@ -8,19 +8,19 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.Hitboxes; -import net.minecraft.client.render.debug.EntityHitboxDebugRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Box; +import net.minecraft.client.renderer.debug.EntityHitboxDebugRenderer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(EntityHitboxDebugRenderer.class) -public class EntityHitboxDebugRendererMixin { - @ModifyExpressionValue(method = "drawHitbox", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getBoundingBox()Lnet/minecraft/util/math/Box;", ordinal = 0)) - private Box meteor$createHitbox(Box original, Entity entity, float tickProgress, boolean inLocalServer) { +public abstract class EntityHitboxDebugRendererMixin { + @ModifyExpressionValue(method = "showHitboxes", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;getBoundingBox()Lnet/minecraft/world/phys/AABB;", ordinal = 0)) + private AABB meteor$createHitbox(AABB original, Entity entity, float partialTicks, boolean isServerEntity) { double v = Modules.get().get(Hitboxes.class).getEntityValue(entity); if (v == 0) return original; - return original.expand(v); + return original.inflate(v); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java index de2341e2ce..16afa26252 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java @@ -23,14 +23,14 @@ import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.client.render.Camera; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.MovementType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.Vec3d; +import net.minecraft.client.Camera; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +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; @@ -43,36 +43,24 @@ @Mixin(Entity.class) public abstract class EntityMixin { - @ModifyExpressionValue(method = "updateMovementInFluid", at = @At(value = "INVOKE", target = "Lnet/minecraft/fluid/FluidState;getVelocity(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/util/math/Vec3d;")) - private Vec3d updateMovementInFluidFluidStateGetVelocity(Vec3d vec) { - if ((Object) this != mc.player) return vec; - - Velocity velocity = Modules.get().get(Velocity.class); - if (velocity.isActive() && velocity.liquids.get()) { - vec = vec.multiply(velocity.getHorizontal(velocity.liquidsHorizontal), velocity.getVertical(velocity.liquidsVertical), velocity.getHorizontal(velocity.liquidsHorizontal)); - } - - return vec; - } - - @Inject(method = "isTouchingWater", at = @At(value = "HEAD"), cancellable = true) - private void isTouchingWater(CallbackInfoReturnable info) { + @Inject(method = "isInWater", at = @At(value = "HEAD"), cancellable = true) + private void isInWater(CallbackInfoReturnable cir) { if ((Object) this != mc.player) return; - if (Modules.get().get(Flight.class).isActive()) info.setReturnValue(false); - if (Modules.get().get(NoSlow.class).fluidDrag()) info.setReturnValue(false); + if (Modules.get().get(Flight.class).isActive()) cir.setReturnValue(false); + if (Modules.get().get(NoSlow.class).fluidDrag()) cir.setReturnValue(false); } @Inject(method = "isInLava", at = @At(value = "HEAD"), cancellable = true) - private void isInLava(CallbackInfoReturnable info) { + private void isInLava(CallbackInfoReturnable cir) { if ((Object) this != mc.player) return; - if (Modules.get().get(Flight.class).isActive()) info.setReturnValue(false); - if (Modules.get().get(NoSlow.class).fluidDrag()) info.setReturnValue(false); + if (Modules.get().get(Flight.class).isActive()) cir.setReturnValue(false); + if (Modules.get().get(NoSlow.class).fluidDrag()) cir.setReturnValue(false); } - @Inject(method = "onBubbleColumnSurfaceCollision", at = @At("HEAD")) - private void onBubbleColumnSurfaceCollision(CallbackInfo info) { + @Inject(method = "onAboveBubbleColumn", at = @At("HEAD")) + private void onAboveBubbleColumn(CallbackInfo ci) { if ((Object) this != mc.player) return; Jesus jesus = Modules.get().get(Jesus.class); @@ -81,8 +69,8 @@ private void onBubbleColumnSurfaceCollision(CallbackInfo info) { } } - @Inject(method = "onBubbleColumnCollision", at = @At("HEAD")) - private void onBubbleColumnCollision(CallbackInfo info) { + @Inject(method = "onInsideBubbleColumn", at = @At("HEAD")) + private void onInsideBubbleColumn(CallbackInfo ci) { if ((Object) this != mc.player) return; Jesus jesus = Modules.get().get(Jesus.class); @@ -91,7 +79,7 @@ private void onBubbleColumnCollision(CallbackInfo info) { } } - @ModifyExpressionValue(method = "updateSwimming", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isSubmergedInWater()Z")) + @ModifyExpressionValue(method = "updateSwimming", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;isUnderWater()Z")) private boolean isSubmergedInWater(boolean submerged) { if ((Object) this != mc.player) return submerged; @@ -100,7 +88,7 @@ private boolean isSubmergedInWater(boolean submerged) { return submerged; } - @ModifyArgs(method = "pushAwayFrom(Lnet/minecraft/entity/Entity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;addVelocity(DDD)V")) + @ModifyArgs(method = "push(Lnet/minecraft/world/entity/Entity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;push(DDD)V")) private void onPushAwayFrom(Args args, Entity entity) { Velocity velocity = Modules.get().get(Velocity.class); @@ -117,8 +105,8 @@ else if (entity instanceof FakePlayerEntity player && player.doNotPush) { } } - @ModifyReturnValue(method = "getJumpVelocityMultiplier", at = @At("RETURN")) - private float onGetJumpVelocityMultiplier(float original) { + @ModifyReturnValue(method = "getBlockJumpFactor", at = @At("RETURN")) + private float onGetBlockJumpFactor(float original) { if ((Object) this == mc.player) { JumpVelocityMultiplierEvent event = MeteorClient.EVENT_BUS.post(JumpVelocityMultiplierEvent.get()); return (original * event.multiplier); @@ -128,17 +116,16 @@ private float onGetJumpVelocityMultiplier(float original) { } @Inject(method = "move", at = @At("HEAD")) - private void onMove(MovementType type, Vec3d movement, CallbackInfo info) { + private void onMove(MoverType moverType, Vec3 delta, CallbackInfo ci) { if ((Object) this == mc.player) { - MeteorClient.EVENT_BUS.post(PlayerMoveEvent.get(type, movement)); - } - else { - MeteorClient.EVENT_BUS.post(EntityMoveEvent.get((Entity) (Object) this, movement)); + MeteorClient.EVENT_BUS.post(PlayerMoveEvent.get(moverType, delta)); + } else { + MeteorClient.EVENT_BUS.post(EntityMoveEvent.get((Entity) (Object) this, delta)); } } - @ModifyExpressionValue(method = "getVelocityMultiplier", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getBlock()Lnet/minecraft/block/Block;")) - private Block modifyVelocityMultiplierBlock(Block original) { + @ModifyExpressionValue(method = "getBlockSpeedFactor", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;getBlock()Lnet/minecraft/world/level/block/Block;")) + private Block modifyBlockSpeedFactor(Block original) { if ((Object) this != mc.player) return original; if (original == Blocks.SOUL_SAND && Modules.get().get(NoSlow.class).soulSand()) return Blocks.STONE; @@ -146,73 +133,74 @@ private Block modifyVelocityMultiplierBlock(Block original) { return original; } - @ModifyReturnValue(method = "isInvisibleTo(Lnet/minecraft/entity/player/PlayerEntity;)Z", at = @At("RETURN")) + @ModifyReturnValue(method = "isInvisibleTo", at = @At("RETURN")) private boolean isInvisibleToCanceller(boolean original) { if (!Utils.canUpdate()) return original; ESP esp = Modules.get().get(ESP.class); - if (Modules.get().get(NoRender.class).noInvisibility() || esp.isActive() && !esp.shouldSkip((Entity) (Object) this)) return false; + if (Modules.get().get(NoRender.class).noInvisibility() || esp.isActive() && !esp.shouldSkip((Entity) (Object) this)) + return false; return original; } - @Inject(method = "isGlowing", at = @At("HEAD"), cancellable = true) - private void isGlowing(CallbackInfoReturnable info) { - if (Modules.get().get(NoRender.class).noGlowing()) info.setReturnValue(false); + @Inject(method = "isCurrentlyGlowing", at = @At("HEAD"), cancellable = true) + private void isCurrentlyGlowing(CallbackInfoReturnable cir) { + if (Modules.get().get(NoRender.class).noGlowing()) cir.setReturnValue(false); } - @Inject(method = "getTargetingMargin", at = @At("HEAD"), cancellable = true) - private void onGetTargetingMargin(CallbackInfoReturnable info) { + @Inject(method = "getPickRadius", at = @At("HEAD"), cancellable = true) + private void onGetPickRadius(CallbackInfoReturnable cir) { double v = Modules.get().get(Hitboxes.class).getEntityValue((Entity) (Object) this); - if (v != 0) info.setReturnValue((float) v); + if (v != 0) cir.setReturnValue((float) v); } @Inject(method = "isInvisibleTo", at = @At("HEAD"), cancellable = true) - private void onIsInvisibleTo(PlayerEntity player, CallbackInfoReturnable info) { - if (player == null) info.setReturnValue(false); + private void onIsInvisibleTo(Player player, CallbackInfoReturnable cir) { + if (player == null) cir.setReturnValue(false); } @Inject(method = "getPose", at = @At("HEAD"), cancellable = true) - private void getPoseHook(CallbackInfoReturnable info) { + private void getPoseHook(CallbackInfoReturnable cir) { if ((Object) this != mc.player) return; if (Modules.get().get(ElytraFly.class).canPacketEfly()) { - info.setReturnValue(EntityPose.GLIDING); + cir.setReturnValue(Pose.FALL_FLYING); } } @ModifyReturnValue(method = "getPose", at = @At("RETURN")) - private EntityPose modifyGetPose(EntityPose original) { + private Pose modifyGetPose(Pose original) { if ((Object) this != mc.player) return original; - if (original == EntityPose.CROUCHING && !mc.player.isSneaking() && ((PlayerEntityAccessor) mc.player).meteor$canChangeIntoPose(EntityPose.STANDING)) return EntityPose.STANDING; + if (original == Pose.CROUCHING && !mc.player.isShiftKeyDown() && ((PlayerAccessor) mc.player).meteor$canChangeIntoPose(Pose.STANDING)) + return Pose.STANDING; return original; } - @ModifyReturnValue(method = "bypassesLandingEffects", at = @At("RETURN")) + @ModifyReturnValue(method = "isSuppressingBounce", at = @At("RETURN")) private boolean cancelBounce(boolean original) { return Modules.get().get(NoFall.class).cancelBounce() || original; } - @Inject(method = "changeLookDirection", at = @At("HEAD"), cancellable = true) - private void updateChangeLookDirection(double cursorDeltaX, double cursorDeltaY, CallbackInfo ci) { + @Inject(method = "turn", at = @At("HEAD"), cancellable = true) + private void updateTurn(double xo, double yo, CallbackInfo ci) { if ((Object) this != mc.player) return; Freecam freecam = Modules.get().get(Freecam.class); FreeLook freeLook = Modules.get().get(FreeLook.class); if (freecam.isActive()) { - freecam.changeLookDirection(cursorDeltaX * 0.15, cursorDeltaY * 0.15); + freecam.changeLookDirection(xo * 0.15, yo * 0.15); ci.cancel(); - } - else if (Modules.get().isActive(HighwayBuilder.class)) { - Camera camera = mc.gameRenderer.getCamera(); - ((ICamera) camera).meteor$setRot(camera.getYaw() + cursorDeltaX * 0.15, camera.getPitch() + cursorDeltaY * 0.15); + } else if (Modules.get().isActive(HighwayBuilder.class)) { + Camera camera = mc.gameRenderer.getMainCamera(); + ((ICamera) camera).meteor$setRot(camera.yRot() + xo * 0.15, camera.xRot() + yo * 0.15); ci.cancel(); - } - else if (freeLook.cameraMode()) { - freeLook.cameraYaw += (float) (cursorDeltaX / freeLook.sensitivity.get().floatValue()); - freeLook.cameraPitch += (float) (cursorDeltaY / freeLook.sensitivity.get().floatValue()); + } else if (freeLook.cameraMode()) { + freeLook.cameraYaw += (float) (xo / freeLook.sensitivity.get().floatValue()); + freeLook.cameraPitch += (float) (yo / freeLook.sensitivity.get().floatValue()); - if (Math.abs(freeLook.cameraPitch) > 90.0F) freeLook.cameraPitch = freeLook.cameraPitch > 0.0F ? 90.0F : -90.0F; + if (Math.abs(freeLook.cameraPitch) > 90.0F) + freeLook.cameraPitch = freeLook.cameraPitch > 0.0F ? 90.0F : -90.0F; ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderDispatcherMixin.java similarity index 50% rename from src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderManagerMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderDispatcherMixin.java index 4f3b176d36..c4d95ab23a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderDispatcherMixin.java @@ -6,47 +6,48 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.EntityRenderManager; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; 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; -@Mixin(EntityRenderManager.class) -public abstract class EntityRenderManagerMixin { +@Mixin(EntityRenderDispatcher.class) +public abstract class EntityRenderDispatcherMixin { @Shadow public Camera camera; - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void render(S renderState, CameraRenderState cameraRenderState, double d, double e, double f, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CallbackInfo info) { + @Inject(method = "submit", at = @At("HEAD"), cancellable = true) + private void render(S renderState, CameraRenderState camera, double x, double y, double z, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CallbackInfo ci) { var entity = ((IEntityRenderState) renderState).meteor$getEntity(); if (entity instanceof FakePlayerEntity player && player.hideWhenInsideCamera) { - int cX = MathHelper.floor(this.camera.getCameraPos().x); - int cY = MathHelper.floor(this.camera.getCameraPos().y); - int cZ = MathHelper.floor(this.camera.getCameraPos().z); + int cX = Mth.floor(this.camera.position().x); + int cY = Mth.floor(this.camera.position().y); + int cZ = Mth.floor(this.camera.position().z); - if (cX == entity.getBlockX() && cZ == entity.getBlockZ() && (cY == entity.getBlockY() || cY == entity.getBlockY() + 1)) info.cancel(); + if (cX == entity.getBlockX() && cZ == entity.getBlockZ() && (cY == entity.getBlockY() || cY == entity.getBlockY() + 1)) + ci.cancel(); } } // IEntityRenderState @ModifyExpressionValue( - method = "getAndUpdateRenderState(Lnet/minecraft/entity/Entity;F)Lnet/minecraft/client/render/entity/state/EntityRenderState;", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/EntityRenderer;getAndUpdateRenderState(Lnet/minecraft/entity/Entity;F)Lnet/minecraft/client/render/entity/state/EntityRenderState;") + method = "extractEntity(Lnet/minecraft/world/entity/Entity;F)Lnet/minecraft/client/renderer/entity/state/EntityRenderState;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;createRenderState(Lnet/minecraft/world/entity/Entity;F)Lnet/minecraft/client/renderer/entity/state/EntityRenderState;") ) - private EntityRenderState getAndUpdateRenderState$setEntity(EntityRenderState state, E entity, float tickProgress) { + private EntityRenderState getAndUpdateRenderState$setEntity(EntityRenderState state, E entity, float partialTicks) { ((IEntityRenderState) state).meteor$setEntity(entity); return state; } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderStateMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderStateMixin.java index 106e1006d7..08829e017b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderStateMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRenderStateMixin.java @@ -6,8 +6,8 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java index 9a0d38244c..66978871b6 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java @@ -14,17 +14,17 @@ import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.client.render.entity.state.LivingEntityRenderState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.FallingBlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.world.LightType; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.LightLayer; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -36,52 +36,54 @@ @Mixin(EntityRenderer.class) public abstract class EntityRendererMixin { - @Unique private ESP esp; - @Unique private NoRender noRender; + @Unique + private ESP esp; + @Unique + private NoRender noRender; // meteor is already initialised at this point @Inject(method = "", at = @At("TAIL")) - private void onInit(EntityRendererFactory.Context context, CallbackInfo ci) { + private void onInit(EntityRendererProvider.Context context, CallbackInfo ci) { esp = Modules.get().get(ESP.class); noRender = Modules.get().get(NoRender.class); } - @Inject(method = "getDisplayName", at = @At("HEAD"), cancellable = true) - private void onRenderLabel(T entity, CallbackInfoReturnable cir) { + @Inject(method = "getNameTag", at = @At("HEAD"), cancellable = true) + private void onRenderLabel(T entity, CallbackInfoReturnable cir) { if (noRender.noNametags()) cir.setReturnValue(null); - if (!(entity instanceof PlayerEntity player)) return; + if (!(entity instanceof Player player)) return; if (Modules.get().get(Nametags.class).playerNametags() && !(EntityUtils.getGameMode(player) == null && Modules.get().get(Nametags.class).excludeBots())) cir.setReturnValue(null); } @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) - private void shouldRender(T entity, Frustum frustum, double x, double y, double z, CallbackInfoReturnable cir) { + private void shouldRender(T entity, Frustum culler, double camX, double camY, double camZ, CallbackInfoReturnable cir) { if (noRender.noEntity(entity)) cir.setReturnValue(false); if (noRender.noFallingBlocks() && entity instanceof FallingBlockEntity) cir.setReturnValue(false); } - @Inject(method = "canBeCulled", at = @At("HEAD"), cancellable = true) + @Inject(method = "affectedByCulling", at = @At("HEAD"), cancellable = true) void canBeCulled(T entity, CallbackInfoReturnable cir) { if (esp.forceRender()) cir.setReturnValue(false); } - @ModifyReturnValue(method = "getSkyLight", at = @At("RETURN")) + @ModifyReturnValue(method = "getSkyLightLevel", at = @At("RETURN")) private int onGetSkyLight(int original) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.SKY), original); + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightLayer.SKY), original); } - @ModifyReturnValue(method = "getBlockLight", at = @At("RETURN")) + @ModifyReturnValue(method = "getBlockLightLevel", at = @At("RETURN")) private int onGetBlockLight(int original) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.BLOCK), original); + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightLayer.BLOCK), original); } - @ModifyExpressionValue(method = "updateRenderState", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getLightLevel(Lnet/minecraft/world/LightType;Lnet/minecraft/util/math/BlockPos;)I")) + @ModifyExpressionValue(method = "extractRenderState", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getBrightness(Lnet/minecraft/world/level/LightLayer;Lnet/minecraft/core/BlockPos;)I")) private int onGetLightLevel(int original) { - return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightType.BLOCK), original); + return Math.max(Modules.get().get(Fullbright.class).getLuminance(LightLayer.BLOCK), original); } - @Inject(method = "updateRenderState", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/EntityRenderState;outlineColor:I", shift = At.Shift.AFTER, opcode = Opcodes.PUTFIELD)) - private void onGetOutlineColor(T entity, S state, float tickProgress, CallbackInfo ci) { + @Inject(method = "extractRenderState", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/state/EntityRenderState;outlineColor:I", shift = At.Shift.AFTER, opcode = Opcodes.PUTFIELD)) + private void onGetOutlineColor(T entity, S state, float partialTicks, CallbackInfo ci) { if (esp.isGlow() && !esp.shouldSkip(entity)) { Color color = esp.getColor(entity); @@ -90,11 +92,11 @@ private void onGetOutlineColor(T entity, S state, float tickProgress, CallbackIn } } - @Inject(method = "updateShadow(Lnet/minecraft/entity/Entity;Lnet/minecraft/client/render/entity/state/EntityRenderState;)V", at = @At("HEAD"), cancellable = true) - private void updateShadow(Entity entity, EntityRenderState renderState, CallbackInfo ci) { + @Inject(method = "finalizeRenderState(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/client/renderer/entity/state/EntityRenderState;)V", at = @At("HEAD"), cancellable = true) + private void updateShadow(Entity entity, EntityRenderState state, CallbackInfo ci) { if (noRender.noDeadEntities() && entity instanceof LivingEntity && - renderState instanceof LivingEntityRenderState livingEntityRenderState && + state instanceof LivingEntityRenderState livingEntityRenderState && livingEntityRenderState.deathTime > 0) { ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntitySectionAccessor.java similarity index 53% rename from src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/EntitySectionAccessor.java index 3420f41503..9a7078a5cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientPlayerEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntitySectionAccessor.java @@ -5,12 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.util.ClassInstanceMultiMap; +import net.minecraft.world.level.entity.EntitySection; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ClientPlayerEntity.class) -public interface ClientPlayerEntityAccessor { - @Accessor("ticksSinceLastPositionPacketSent") - void meteor$setTicksSinceLastPositionPacketSent(int ticks); +@Mixin(EntitySection.class) +public interface EntitySectionAccessor { + @Accessor("storage") + ClassInstanceMultiMap meteor$getStorage(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntitySectionStorageAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntitySectionStorageAccessor.java new file mode 100644 index 0000000000..9885694c7d --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/EntitySectionStorageAccessor.java @@ -0,0 +1,23 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.LongSortedSet; +import net.minecraft.world.level.entity.EntityAccess; +import net.minecraft.world.level.entity.EntitySection; +import net.minecraft.world.level.entity.EntitySectionStorage; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EntitySectionStorage.class) +public interface EntitySectionStorageAccessor { + @Accessor("sectionIds") + LongSortedSet meteor$getSectionIds(); + + @Accessor("sections") + Long2ObjectMap> meteor$getSections(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityTrackingSectionAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/EntityTrackingSectionAccessor.java deleted file mode 100644 index 4edfe67779..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityTrackingSectionAccessor.java +++ /dev/null @@ -1,17 +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 net.minecraft.util.collection.TypeFilterableList; -import net.minecraft.world.entity.EntityTrackingSection; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(EntityTrackingSection.class) -public interface EntityTrackingSectionAccessor { - @Accessor("collection") - TypeFilterableList meteor$getCollection(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionS2CPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionS2CPacketMixin.java deleted file mode 100644 index aa42ee439f..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ExplosionS2CPacketMixin.java +++ /dev/null @@ -1,54 +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 meteordevelopment.meteorclient.mixininterface.IExplosionS2CPacket; -import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket; -import net.minecraft.util.math.Vec3d; -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 java.util.Optional; - -@Mixin(ExplosionS2CPacket.class) -public abstract class ExplosionS2CPacketMixin implements IExplosionS2CPacket { - @Shadow - @Final - @Mutable - private Optional playerKnockback; - - @Override - public void meteor$setVelocityX(float velocity) { - if (playerKnockback.isPresent()) { - Vec3d kb = playerKnockback.get(); - playerKnockback = Optional.of(new Vec3d(velocity, kb.y, kb.z)); - } else { - playerKnockback = Optional.of(new Vec3d(velocity, 0, 0)); - } - } - - @Override - public void meteor$setVelocityY(float velocity) { - if (playerKnockback.isPresent()) { - Vec3d kb = playerKnockback.get(); - playerKnockback = Optional.of(new Vec3d(kb.x, velocity, kb.z)); - } else { - playerKnockback = Optional.of(new Vec3d(0, velocity, 0)); - } - } - - @Override - public void meteor$setVelocityZ(float velocity) { - if (playerKnockback.isPresent()) { - Vec3d kb = playerKnockback.get(); - playerKnockback = Optional.of(new Vec3d(kb.x, kb.y, velocity)); - } else { - playerKnockback = Optional.of(new Vec3d(0, 0, velocity)); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.java index 56090613a8..a7484362da 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FileCacheAccessor.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.texture.PlayerSkinProvider; +import net.minecraft.client.resources.SkinManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import java.nio.file.Path; -@Mixin(PlayerSkinProvider.FileCache.class) +@Mixin(SkinManager.TextureCache.class) public interface FileCacheAccessor { - @Accessor("directory") - Path meteor$getDirectory(); + @Accessor("root") + Path meteor$getRoot(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FireworkRocketEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FireworkRocketEntityMixin.java index 4e78fcef34..7edab1947c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FireworkRocketEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FireworkRocketEntityMixin.java @@ -7,9 +7,9 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.ElytraBoost; -import net.minecraft.entity.projectile.FireworkRocketEntity; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.EntityHitResult; +import net.minecraft.world.entity.projectile.FireworkRocketEntity; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -22,34 +22,34 @@ public abstract class FireworkRocketEntityMixin { private int life; @Shadow - private int lifeTime; + private int lifetime; @Inject(method = "tick", at = @At("TAIL")) - private void onTick(CallbackInfo info) { + private void onTick(CallbackInfo ci) { FireworkRocketEntity firework = ((FireworkRocketEntity) (Object) this); - if (Modules.get().get(ElytraBoost.class).isFirework(firework) && this.life > this.lifeTime) { + if (Modules.get().get(ElytraBoost.class).isFirework(firework) && this.life > this.lifetime) { firework.discard(); } } - @Inject(method = "onEntityHit", at = @At("HEAD"), cancellable = true) - private void onEntityHit(EntityHitResult entityHitResult, CallbackInfo info) { + @Inject(method = "onHitEntity", at = @At("HEAD"), cancellable = true) + private void onHitEntity(EntityHitResult hitResult, CallbackInfo ci) { FireworkRocketEntity firework = ((FireworkRocketEntity) (Object) this); if (Modules.get().get(ElytraBoost.class).isFirework(firework)) { firework.discard(); - info.cancel(); + ci.cancel(); } } - @Inject(method = "onBlockHit", at = @At("HEAD"), cancellable = true) - private void onBlockHit(BlockHitResult blockHitResult, CallbackInfo info) { + @Inject(method = "onHitBlock", at = @At("HEAD"), cancellable = true) + private void onHitBlock(BlockHitResult hitResult, CallbackInfo ci) { FireworkRocketEntity firework = ((FireworkRocketEntity) (Object) this); if (Modules.get().get(ElytraBoost.class).isFirework(firework)) { firework.discard(); - info.cancel(); + ci.cancel(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java index 5491d82d29..5eb4eda000 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleMixin.java @@ -7,16 +7,16 @@ import com.llamalad7.mixinextras.sugar.Local; import it.unimi.dsi.fastutil.ints.IntList; -import net.minecraft.client.particle.FireworksSparkParticle; +import net.minecraft.client.particle.FireworkParticles; 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(FireworksSparkParticle.FireworkParticle.class) +@Mixin(FireworkParticles.Starter.class) public abstract class FireworksSparkParticleMixin { - @Inject(method = "addExplosionParticle", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/FireworksSparkParticle$Explosion;setTrail(Z)V"), cancellable = true) - private void onAddExplosion(double x, double y, double z, double velocityX, double velocityY, double velocityZ, IntList colors, IntList targetColors, boolean trail, boolean flicker, CallbackInfo info, @Local FireworksSparkParticle.Explosion explosion) { - if (explosion == null) info.cancel(); + @Inject(method = "createParticle", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/FireworkParticles$SparkParticle;setTrail(Z)V"), cancellable = true) + private void onAddExplosion(double x, double y, double z, double xa, double ya, double za, IntList rgbColors, IntList fadeColors, boolean trail, boolean twinkle, CallbackInfo ci, @Local(name = "sparkParticle") FireworkParticles.SparkParticle sparkParticle) { + if (sparkParticle == null) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java index 225501c517..55a14a076a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FireworksSparkParticleSubMixin.java @@ -7,18 +7,18 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.particle.BillboardParticleSubmittable; -import net.minecraft.client.particle.FireworksSparkParticle; -import net.minecraft.client.render.Camera; +import net.minecraft.client.Camera; +import net.minecraft.client.particle.FireworkParticles; +import net.minecraft.client.renderer.state.level.QuadParticleRenderState; 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(value = {FireworksSparkParticle.Explosion.class, FireworksSparkParticle.Flash.class}) +@Mixin(value = {FireworkParticles.SparkParticle.class, FireworkParticles.OverlayParticle.class}) public abstract class FireworksSparkParticleSubMixin { - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void buildExplosionGeometry(BillboardParticleSubmittable arg, Camera camera, float f, CallbackInfo ci) { + @Inject(method = "extract", at = @At("HEAD"), cancellable = true) + private void buildExplosionGeometry(QuadParticleRenderState particleTypeRenderState, Camera camera, float partialTickTime, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noFireworkExplosions()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/FishingHookAccessor.java similarity index 66% rename from src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/FishingHookAccessor.java index ee624853f3..bdcabca959 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FishingHookAccessor.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.projectile.FishingBobberEntity; +import net.minecraft.world.entity.projectile.FishingHook; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(FishingBobberEntity.class) -public interface FishingBobberEntityAccessor { - @Accessor("caughtFish") +@Mixin(FishingHook.class) +public interface FishingHookAccessor { + @Accessor("biting") boolean meteor$hasCaughtFish(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FishingHookMixin.java similarity index 57% rename from src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/FishingHookMixin.java index e9b8fd287d..586504cb97 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FishingBobberEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FishingHookMixin.java @@ -9,18 +9,18 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.Velocity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.projectile.FishingBobberEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.projectile.FishingHook; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import static meteordevelopment.meteorclient.MeteorClient.mc; -@Mixin(FishingBobberEntity.class) -public abstract class FishingBobberEntityMixin { - @WrapOperation(method = "handleStatus", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/FishingBobberEntity;pullHookedEntity(Lnet/minecraft/entity/Entity;)V")) - private void preventFishingRodPull(FishingBobberEntity instance, Entity entity, Operation original) { - if (!instance.getEntityWorld().isClient() || entity != mc.player) original.call(instance, entity); +@Mixin(FishingHook.class) +public abstract class FishingHookMixin { + @WrapOperation(method = "handleEntityEvent", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/FishingHook;pullEntity(Lnet/minecraft/world/entity/Entity;)V")) + private void preventFishingRodPull(FishingHook instance, Entity entity, Operation original) { + if (!instance.level().isClientSide() || entity != mc.player) original.call(instance, entity); Velocity velocity = Modules.get().get(Velocity.class); if (!velocity.isActive() || !velocity.fishing.get()) original.call(instance, entity); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java index 69fd8ea88f..77cc24b116 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FluidRendererMixin.java @@ -5,17 +5,18 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.blaze3d.vertex.VertexConsumer; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Xray; import meteordevelopment.meteorclient.systems.modules.world.Ambience; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.block.FluidRenderer; -import net.minecraft.fluid.FluidState; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockRenderView; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.FluidRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.ARGB; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -24,38 +25,43 @@ @Mixin(FluidRenderer.class) public abstract class FluidRendererMixin { - @Unique private final ThreadLocal alphas = new ThreadLocal<>(); - @Unique private final ThreadLocal ambient = ThreadLocal.withInitial(() -> false); + @Unique + private static final ThreadLocal ALPHAS = ThreadLocal.withInitial(() -> -1); + @Unique + private static final ThreadLocal AMBIENT = ThreadLocal.withInitial(() -> false); - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRender(BlockRenderView world, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState, CallbackInfo info) { + @Inject(method = "tesselate", at = @At("HEAD"), cancellable = true) + private void onTesselate(BlockAndTintGetter level, BlockPos pos, FluidRenderer.Output output, BlockState blockState, FluidState fluidState, CallbackInfo ci) { Ambience ambience = Modules.get().get(Ambience.class); - ambient.set(ambience.isActive() && ambience.customLavaColor.get() && fluidState.isIn(FluidTags.LAVA)); + AMBIENT.set(ambience.isActive() && ambience.customLavaColor.get() && fluidState.is(FluidTags.LAVA)); // Xray and Wallhack - int alpha = Xray.getAlpha(fluidState.getBlockState(), pos); + int alpha = Xray.getAlpha(fluidState.createLegacyBlock(), pos); - if (alpha == 0) info.cancel(); - else alphas.set(alpha); + if (alpha == 0) ci.cancel(); + else ALPHAS.set(alpha); } @Inject(method = "vertex", at = @At("HEAD"), cancellable = true) - private void onVertex(VertexConsumer vertexConsumer, float x, float y, float z, float red, float green, float blue, float u, float v, int light, CallbackInfo info) { - int alpha = alphas.get(); + private void onVertex(VertexConsumer builder, float x, float y, float z, int color, float u, float v, int lightCoords, CallbackInfo ci) { + int alpha = ALPHAS.get(); - if (ambient.get()) { - Color color = Modules.get().get(Ambience.class).lavaColor.get(); - vertex(vertexConsumer, x, y, z, color.r, color.g, color.b, (alpha != -1 ? alpha : color.a), u, v, light); - info.cancel(); - } - else if (alpha != -1) { - vertex(vertexConsumer, x, y, z, (int) (red * 255), (int) (green * 255), (int) (blue * 255), alpha, u, v, light); - info.cancel(); + if (AMBIENT.get()) { + Color c = Modules.get().get(Ambience.class).lavaColor.get(); + vertex(builder, x, y, z, c.r, c.g, c.b, (alpha != -1 ? alpha : c.a), u, v, lightCoords); + ci.cancel(); + } else if (alpha != -1) { + int red = ARGB.red(color); + int green = ARGB.green(color); + int blue = ARGB.blue(color); + + vertex(builder, x, y, z, red * 255, green * 255, blue * 255, alpha, u, v, lightCoords); + ci.cancel(); } } @Unique private void vertex(VertexConsumer vertexConsumer, float x, float y, float z, int red, int green, int blue, int alpha, float u, float v, int light) { - vertexConsumer.vertex(x, y, z).color(red, green, blue, alpha).texture(u, v).light(light).normal(0.0f, 1.0f, 0.0f); + vertexConsumer.addVertex(x, y, z).setColor(red, green, blue, alpha).setUv(u, v).setLight(light).setNormal(0.0f, 1.0f, 0.0f); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/FogRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FogRendererMixin.java index e117e5ea30..d409807587 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/FogRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FogRendererMixin.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import net.minecraft.client.render.fog.FogRenderer; +import net.minecraft.client.renderer.fog.FogRenderer; import org.joml.Vector4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,19 +17,19 @@ @Mixin(FogRenderer.class) public abstract class FogRendererMixin { - @ModifyVariable(method = "applyFog(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V", at = @At("HEAD"), argsOnly = true) - private Vector4f modifyFogDistance(Vector4f original) { - if (Modules.get() == null) return original; + @ModifyVariable(method = "updateBuffer(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V", at = @At("HEAD"), argsOnly = true, name = "fogColor") + private Vector4f modifyFogDistance(Vector4f fogColor) { + if (Modules.get() == null) return fogColor; Ambience ambience = Modules.get().get(Ambience.class); if (ambience.isActive() && ambience.customFogColor.get()) { return ambience.fogColor.get().getVec4f(); } - return original; + return fogColor; } - @ModifyExpressionValue(method = "getFogBuffer", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/fog/FogRenderer;fogEnabled:Z")) + @ModifyExpressionValue(method = "getBuffer", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/fog/FogRenderer;fogEnabled:Z")) private boolean modifyFogEnabled(boolean original) { if (Modules.get() == null) return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FontMixin.java similarity index 81% rename from src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/FontMixin.java index 35e2b80f9e..ec24f2335e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TextRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FontMixin.java @@ -8,13 +8,13 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Font; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(TextRenderer.class) -public abstract class TextRendererMixin { - @ModifyExpressionValue(method = "getGlyph", at = @At(value = "INVOKE", target = "Lnet/minecraft/text/Style;isObfuscated()Z")) +@Mixin(Font.class) +public abstract class FontMixin { + @ModifyExpressionValue(method = "getGlyph", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Style;isObfuscated()Z")) private boolean onRenderObfuscatedStyle(boolean original) { if (Modules.get() == null || Modules.get().get(NoRender.class) == null) { return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HungerManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FoodDataMixin.java similarity index 74% rename from src/main/java/meteordevelopment/meteorclient/mixin/HungerManagerMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/FoodDataMixin.java index 41aa7961e2..dc35f8fced 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HungerManagerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FoodDataMixin.java @@ -8,13 +8,13 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import net.minecraft.entity.player.HungerManager; +import net.minecraft.world.food.FoodData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(HungerManager.class) -public class HungerManagerMixin { - @ModifyExpressionValue(method = "canSprint()Z", at = @At(value = "CONSTANT", args = "floatValue=6.0f")) +@Mixin(FoodData.class) +public abstract class FoodDataMixin { + @ModifyExpressionValue(method = "hasEnoughFood()Z", at = @At(value = "CONSTANT", args = "floatValue=6.0f")) private float onHunger(float constant) { if (Modules.get().get(NoSlow.class).hunger()) return -1; return constant; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/FriendlyByteBufMixin.java similarity index 56% rename from src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/FriendlyByteBufMixin.java index b0007ab418..454e1c7434 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PacketByteBufMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/FriendlyByteBufMixin.java @@ -7,16 +7,16 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.AntiPacketKick; -import net.minecraft.nbt.NbtSizeTracker; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.nbt.NbtAccounter; +import net.minecraft.network.FriendlyByteBuf; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; -@Mixin(PacketByteBuf.class) -public abstract class PacketByteBufMixin { - @ModifyArg(method = "readNbt(Lio/netty/buffer/ByteBuf;)Lnet/minecraft/nbt/NbtCompound;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;readNbt(Lio/netty/buffer/ByteBuf;Lnet/minecraft/nbt/NbtSizeTracker;)Lnet/minecraft/nbt/NbtElement;")) - private static NbtSizeTracker xlPackets(NbtSizeTracker sizeTracker) { - return Modules.get().isActive(AntiPacketKick.class) ? NbtSizeTracker.ofUnlimitedBytes() : sizeTracker; +@Mixin(FriendlyByteBuf.class) +public abstract class FriendlyByteBufMixin { + @ModifyArg(method = "readNbt(Lio/netty/buffer/ByteBuf;)Lnet/minecraft/nbt/CompoundTag;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/FriendlyByteBuf;readNbt(Lio/netty/buffer/ByteBuf;Lnet/minecraft/nbt/NbtAccounter;)Lnet/minecraft/nbt/Tag;")) + private static NbtAccounter xlPackets(NbtAccounter sizeTracker) { + return Modules.get().isActive(AntiPacketKick.class) ? NbtAccounter.unlimitedHeap() : sizeTracker; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererAccessor.java new file mode 100644 index 0000000000..26d4f398ca --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererAccessor.java @@ -0,0 +1,21 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.fog.FogRenderer; +import net.minecraft.client.gui.render.GuiRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GameRenderer.class) +public interface GameRendererAccessor { + @Accessor("guiRenderer") + GuiRenderer meteor$getGuiRenderer(); + + @Accessor("fogRenderer") + FogRenderer meteor$getFogRenderer(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java index 4d5315632e..b0ca02e6de 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererMixin.java @@ -6,17 +6,16 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; -import meteordevelopment.meteorclient.MixinPlugin; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.render.GetFovEvent; +import meteordevelopment.meteorclient.MixinPlugin; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.render.RenderAfterWorldEvent; import meteordevelopment.meteorclient.gui.WidgetScreen; import meteordevelopment.meteorclient.mixininterface.IGameRenderer; -import meteordevelopment.meteorclient.mixininterface.IVec3d; +import meteordevelopment.meteorclient.mixininterface.IVec3; import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines; import meteordevelopment.meteorclient.renderer.Renderer3D; import meteordevelopment.meteorclient.systems.modules.Modules; @@ -28,22 +27,24 @@ import meteordevelopment.meteorclient.utils.render.CustomBannerGuiElementRenderer; import meteordevelopment.meteorclient.utils.render.NametagUtils; import meteordevelopment.meteorclient.utils.render.RenderUtils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.render.GuiRenderer; -import net.minecraft.client.gui.render.SpecialGuiElementRenderer; -import net.minecraft.client.gui.render.state.GuiRenderState; -import net.minecraft.client.render.BufferBuilderStorage; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.RenderTickCounter; -import net.minecraft.client.render.fog.FogRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.profiler.Profilers; +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.fog.FogRenderer; +import net.minecraft.client.renderer.state.GameRenderState; +import net.minecraft.client.renderer.state.gui.GuiRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.util.profiling.Profiler; +import net.minecraft.world.entity.Entity; +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; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -60,17 +61,14 @@ public abstract class GameRendererMixin implements IGameRenderer { @Shadow @Final - private MinecraftClient client; - - @Shadow - public abstract void updateCrosshairTarget(float tickDelta); + private Minecraft minecraft; @Shadow - public abstract void reset(); + public abstract void resetData(); @Shadow @Final - private Camera camera; + private Camera mainCamera; @Unique private Renderer3D renderer; @@ -79,17 +77,17 @@ public abstract class GameRendererMixin implements IGameRenderer { private Renderer3D depthRenderer; @Unique - private final MatrixStack matrices = new MatrixStack(); + private final PoseStack matrices = new PoseStack(); @Shadow - protected abstract void bobView(MatrixStack matrices, float tickDelta); + protected abstract void bobView(final CameraRenderState cameraState, final PoseStack poseStack); @Shadow - protected abstract void tiltViewWhenHurt(MatrixStack matrices, float tickDelta); + protected abstract void bobHurt(final CameraRenderState cameraState, final PoseStack poseStack); @Shadow @Final - private BufferBuilderStorage buffers; + private RenderBuffers renderBuffers; @Shadow @Final @@ -101,40 +99,39 @@ public abstract class GameRendererMixin implements IGameRenderer { @Shadow @Final - GuiRenderState guiState; + private GameRenderState gameRenderState; - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/render/GuiRenderer;(Lnet/minecraft/client/gui/render/state/GuiRenderState;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/command/RenderDispatcher;Ljava/util/List;)V")) - private List> meteor$addSpecialRenderers(List> list) { + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/render/GuiRenderer;(Lnet/minecraft/client/renderer/state/gui/GuiRenderState;Lnet/minecraft/client/renderer/MultiBufferSource$BufferSource;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher;Ljava/util/List;)V")) + private List> meteor$addSpecialRenderers(List> list) { list = new ArrayList<>(list); - list.add(new CustomBannerGuiElementRenderer(buffers.getEntityVertexConsumers(), client.getAtlasManager())); + list.add(new CustomBannerGuiElementRenderer(renderBuffers.bufferSource(), minecraft.getAtlasManager())); - return List.of(list.toArray(new SpecialGuiElementRenderer[0])); + return List.of(list.toArray(new PictureInPictureRenderer[0])); } - @Inject(method = "renderWorld", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = {"ldc=hand"})) - private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Local(ordinal = 0) Matrix4f projection, @Local(ordinal = 1) Matrix4f position, @Local(ordinal = 0) float tickDelta, @Local MatrixStack matrixStack) { + @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 tickCounter, CallbackInfo ci, @Local(name = "projectionMatrix") Matrix4f projection, @Local(ordinal = 1) Matrix4f position, @Local(name = "worldPartialTicks") float tickDelta, @Local(name = "bobStack") PoseStack matrixStack) { if (!Utils.canUpdate()) return; - Profilers.get().push(MeteorClient.MOD_ID + "_render"); + Profiler.get().push(MeteorClient.MOD_ID + "_render"); // Create renderer and event - if (renderer == null) renderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES, MeteorRenderPipelines.WORLD_COLORED); - if (depthRenderer == null) depthRenderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES_DEPTH, MeteorRenderPipelines.WORLD_COLORED_DEPTH); - Render3DEvent event = Render3DEvent.get(matrixStack, renderer, depthRenderer, tickDelta, camera.getCameraPos().x, camera.getCameraPos().y, camera.getCameraPos().z); + if (renderer == null) + renderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES, MeteorRenderPipelines.WORLD_COLORED); + if (depthRenderer == null) + depthRenderer = new Renderer3D(MeteorRenderPipelines.WORLD_COLORED_LINES_DEPTH, MeteorRenderPipelines.WORLD_COLORED_DEPTH); + Render3DEvent event = Render3DEvent.get(matrixStack, renderer, depthRenderer, tickDelta, mainCamera.position().x, mainCamera.position().y, mainCamera.position().z); // Update model view matrix RenderSystem.getModelViewStack().pushMatrix().mul(position); - matrices.push(); - tiltViewWhenHurt(matrices, camera.getLastTickProgress()); - if (client.options.getBobView().getValue()) - bobView(matrices, camera.getLastTickProgress()); + matrices.pushPose(); - Matrix4f inverseBob = new Matrix4f(matrices.peek().getPositionMatrix()).invert(); + Matrix4f inverseBob = new Matrix4f(matrices.last().pose()).invert(); RenderSystem.getModelViewStack().mul(inverseBob); - matrices.pop(); + matrices.popPose(); // Call utility classes (apply bob correction when Iris shaders are active) @@ -154,111 +151,53 @@ private void onRenderWorld(RenderTickCounter tickCounter, CallbackInfo ci, @Loca RenderSystem.getModelViewStack().popMatrix(); - Profilers.get().pop(); + Profiler.get().pop(); } - @Inject(method = "renderWorld", at = @At("TAIL")) - private void onRenderWorldTail(CallbackInfo info) { + @Inject(method = "renderLevel", at = @At("TAIL")) + private void onRenderLevelTail(CallbackInfo ci) { MeteorClient.EVENT_BUS.post(RenderAfterWorldEvent.get()); } @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/render/GuiRenderer;render(Lcom/mojang/blaze3d/buffers/GpuBufferSlice;)V", shift = At.Shift.AFTER)) - private void onRenderGui(RenderTickCounter tickCounter, boolean tick, CallbackInfo info) { - if (client.currentScreen instanceof WidgetScreen widgetScreen) { - guiState.clear(); - var mouseX = (int) client.mouse.getScaledX(client.getWindow()); - var mouseY = (int) client.mouse.getScaledY(client.getWindow()); + private void onRenderGui(DeltaTracker deltaTracker, boolean advanceGameTime, CallbackInfo ci) { + if (minecraft.screen instanceof WidgetScreen widgetScreen) { + GuiRenderState guiRenderState = gameRenderState.guiRenderState; + guiRenderState.reset(); + var mouseX = (int) minecraft.mouseHandler.getScaledXPos(minecraft.getWindow()); + var mouseY = (int) minecraft.mouseHandler.getScaledYPos(minecraft.getWindow()); - var context = new DrawContext(client, guiState, mouseX, mouseY); + var context = new GuiGraphicsExtractor(minecraft, guiRenderState, mouseX, mouseY); - widgetScreen.renderCustom(context, mouseX, mouseY, tickCounter.getDynamicDeltaTicks()); + widgetScreen.renderCustom(context, mouseX, mouseY, deltaTracker.getGameTimeDeltaTicks()); - RenderSystem.getDevice().createCommandEncoder().clearDepthTexture(client.getFramebuffer().getDepthAttachment(), 1.0); + RenderSystem.getDevice().createCommandEncoder().clearDepthTexture(minecraft.getMainRenderTarget().getDepthTexture(), 1.0); meteor$flushGuiState(); } } - @Inject(method = "showFloatingItem", at = @At("HEAD"), cancellable = true) - private void onShowFloatingItem(ItemStack floatingItem, CallbackInfo info) { - if (floatingItem.getItem() == Items.TOTEM_OF_UNDYING && Modules.get().get(NoRender.class).noTotemAnimation()) { - info.cancel(); + @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 = "renderWorld", at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(FF)F", ordinal = 0)) + @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; } - @ModifyReturnValue(method = "getFov", at = @At("RETURN")) - private float modifyFov(float original) { - return MeteorClient.EVENT_BUS.post(GetFovEvent.get(original)).fov; - } - - // Freecam - - @Unique - private boolean freecamSet = false; - - @Inject(method = "updateCrosshairTarget", at = @At("HEAD"), cancellable = true) - private void updateTargetedEntityInvoke(float tickDelta, CallbackInfo info) { - Freecam freecam = Modules.get().get(Freecam.class); - boolean highwayBuilder = Modules.get().isActive(HighwayBuilder.class); - - if ((freecam.isActive() || highwayBuilder) && client.getCameraEntity() != null && !freecamSet) { - info.cancel(); - Entity cameraE = client.getCameraEntity(); - - double x = cameraE.getX(); - double y = cameraE.getY(); - double z = cameraE.getZ(); - double lastX = cameraE.lastX; - double lastY = cameraE.lastY; - double lastZ = cameraE.lastZ; - float yaw = cameraE.getYaw(); - float pitch = cameraE.getPitch(); - float lastYaw = cameraE.lastYaw; - float lastPitch = cameraE.lastPitch; - - if (highwayBuilder) { - cameraE.setYaw(camera.getYaw()); - cameraE.setPitch(camera.getPitch()); - } else { - ((IVec3d) cameraE.getEntityPos()).meteor$set(freecam.pos.x, freecam.pos.y - cameraE.getEyeHeight(cameraE.getPose()), freecam.pos.z); - cameraE.lastX = freecam.prevPos.x; - cameraE.lastY = freecam.prevPos.y - cameraE.getEyeHeight(cameraE.getPose()); - cameraE.lastZ = freecam.prevPos.z; - cameraE.setYaw(freecam.yaw); - cameraE.setPitch(freecam.pitch); - cameraE.lastYaw = freecam.lastYaw; - cameraE.lastPitch = freecam.lastPitch; - } - - freecamSet = true; - updateCrosshairTarget(tickDelta); - freecamSet = false; - - ((IVec3d) cameraE.getEntityPos()).meteor$set(x, y, z); - cameraE.lastX = lastX; - cameraE.lastY = lastY; - cameraE.lastZ = lastZ; - cameraE.setYaw(yaw); - cameraE.setPitch(pitch); - cameraE.lastYaw = lastYaw; - cameraE.lastPitch = lastPitch; - } - } - - @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) - private void renderHand(float tickProgress, boolean sleeping, Matrix4f positionMatrix, CallbackInfo ci) { - if (!Modules.get().get(Freecam.class).renderHands() || - !Modules.get().get(Zoom.class).renderHands()) + @Inject(method = "renderItemInHand", at = @At("HEAD"), cancellable = true) + private void renderItemInHand(CameraRenderState cameraState, float deltaPartialTick, Matrix4fc modelViewMatrix, CallbackInfo ci) { + if (!Modules.get().get(Freecam.class).renderHands() || !Modules.get().get(Zoom.class).renderHands()) { ci.cancel(); + } } @Override public void meteor$flushGuiState() { - guiRenderer.render(fogRenderer.getFogBuffer(FogRenderer.FogType.NONE)); - guiRenderer.incrementFrame(); + guiRenderer.render(fogRenderer.getBuffer(FogRenderer.FogMode.NONE)); + guiRenderer.endFrame(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererWidgetMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererWidgetMixin.java new file mode 100644 index 0000000000..aba661a7ad --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GameRendererWidgetMixin.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.mojang.blaze3d.systems.RenderSystem; +import meteordevelopment.meteorclient.gui.WidgetScreen; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.render.GuiRenderer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.fog.FogRenderer; +import net.minecraft.client.renderer.state.GameRenderState; +import net.minecraft.client.renderer.state.gui.GuiRenderState; +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; + +@Mixin(GameRenderer.class) +public abstract class GameRendererWidgetMixin { + @Shadow + @Final + private Minecraft minecraft; + + @Shadow + @Final + private GuiRenderer guiRenderer; + + @Shadow + @Final + private FogRenderer fogRenderer; + + @Shadow + @Final + private GameRenderState gameRenderState; + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/render/GuiRenderer;render(Lcom/mojang/blaze3d/buffers/GpuBufferSlice;)V", shift = At.Shift.AFTER)) + private void meteor$renderWidgetScreens(DeltaTracker deltaTracker, boolean advanceGameTime, CallbackInfo ci) { + if (!(minecraft.screen instanceof WidgetScreen widgetScreen)) return; + + GuiRenderState guiRenderState = gameRenderState.guiRenderState; + guiRenderState.reset(); + + int mouseX = (int) minecraft.mouseHandler.getScaledXPos(minecraft.getWindow()); + int mouseY = (int) minecraft.mouseHandler.getScaledYPos(minecraft.getWindow()); + + GuiGraphicsExtractor graphics = new GuiGraphicsExtractor(minecraft, guiRenderState, mouseX, mouseY); + widgetScreen.renderCustom(graphics, mouseX, mouseY, deltaTracker.getGameTimeDeltaTicks()); + + RenderSystem.getDevice().createCommandEncoder().clearDepthTexture(minecraft.getMainRenderTarget().getDepthTexture(), 1.0); + guiRenderer.render(fogRenderer.getBuffer(FogRenderer.FogMode.NONE)); + guiRenderer.endFrame(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java index b81810b736..8d3f753cf0 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GlCommandEncoderMixin.java @@ -5,12 +5,12 @@ 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.RenderPass; import meteordevelopment.meteorclient.mixininterface.IGpuDevice; import meteordevelopment.meteorclient.mixininterface.IRenderPipeline; -import net.minecraft.client.gl.GlBackend; -import net.minecraft.client.gl.GlCommandEncoder; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,21 +25,22 @@ public abstract class GlCommandEncoderMixin { @Shadow @Final - private GlBackend backend; + private GlDevice device; @SuppressWarnings("deprecation") - @Inject(method = "createRenderPass(Ljava/util/function/Supplier;Lcom/mojang/blaze3d/textures/GpuTextureView;Ljava/util/OptionalInt;Lcom/mojang/blaze3d/textures/GpuTextureView;Ljava/util/OptionalDouble;)Lcom/mojang/blaze3d/systems/RenderPass;", at = @At("RETURN")) - private void createRenderPass$iGpuDevice(CallbackInfoReturnable info) { - ((IGpuDevice) backend).meteor$onCreateRenderPass(info.getReturnValue()); + @Inject(method = "createRenderPass(Ljava/util/function/Supplier;Lcom/mojang/blaze3d/textures/GpuTextureView;Ljava/util/OptionalInt;)Lcom/mojang/blaze3d/systems/RenderPassBackend;", at = @At("RETURN")) + private void createRenderPass$iGpuDevice(CallbackInfoReturnable cir) { + if (device instanceof IGpuDevice gpuDevice) { + gpuDevice.meteor$onCreateRenderPass(cir.getReturnValue()); + } } - @Inject(method = "setPipelineAndApplyState", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlStateManager;_polygonMode(II)V")) - private void setPipelineAndApplyState$lineSmooth(RenderPipeline pipeline, CallbackInfo info) { + @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 { + } else { glDisable(GL_LINE_SMOOTH); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GlBackendMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GlDeviceMixin.java similarity index 90% rename from src/main/java/meteordevelopment/meteorclient/mixin/GlBackendMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/GlDeviceMixin.java index 0317498a2b..bb53553d90 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GlBackendMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GlDeviceMixin.java @@ -7,12 +7,12 @@ import com.mojang.blaze3d.systems.RenderPass; import meteordevelopment.meteorclient.mixininterface.IGpuDevice; -import net.minecraft.client.gl.GlBackend; +import com.mojang.blaze3d.opengl.GlDevice; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; -@Mixin(GlBackend.class) -public abstract class GlBackendMixin implements IGpuDevice { +@Mixin(GlDevice.class) +public abstract class GlDeviceMixin implements IGpuDevice { @Unique private int x, y, width, height; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorAccessor.java new file mode 100644 index 0000000000..ea470b55bd --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsExtractorAccessor.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 net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.state.gui.GuiRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GuiGraphicsExtractor.class) +public interface GuiGraphicsExtractorAccessor { + @Accessor("guiRenderState") + GuiRenderState getGuiRenderState(); + + @Accessor("scissorStack") + GuiGraphicsExtractor.ScissorStack getScissorStack(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsMixin.java new file mode 100644 index 0000000000..a13c6ffae9 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GuiGraphicsMixin.java @@ -0,0 +1,40 @@ +/* + * 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.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import org.jetbrains.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 GuiGraphicsMixin { + @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) + 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")) + 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/ChatHudLineMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GuiMessageMixin.java similarity index 68% rename from src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/GuiMessageMixin.java index 60b9b5fff6..49d5d2760b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GuiMessageMixin.java @@ -6,19 +6,23 @@ package meteordevelopment.meteorclient.mixin; import com.mojang.authlib.GameProfile; -import meteordevelopment.meteorclient.mixininterface.IChatHudLine; -import net.minecraft.client.gui.hud.ChatHudLine; -import net.minecraft.text.Text; +import meteordevelopment.meteorclient.mixininterface.IGuiMessage; +import net.minecraft.client.multiplayer.chat.GuiMessage; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -@Mixin(value = ChatHudLine.class) -public abstract class ChatHudLineMixin implements IChatHudLine { - @Shadow @Final private Text content; - @Unique private int id; - @Unique private GameProfile sender; +@Mixin(GuiMessage.class) +public abstract class GuiMessageMixin implements IGuiMessage { + @Shadow + @Final + private Component content; + @Unique + private int id; + @Unique + private GameProfile sender; @Override public String meteor$getText() { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GuiMessageVisibleMixin.java similarity index 72% rename from src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/GuiMessageVisibleMixin.java index c616b282ec..a8af23e3da 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChatHudLineVisibleMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GuiMessageVisibleMixin.java @@ -6,20 +6,25 @@ package meteordevelopment.meteorclient.mixin; import com.mojang.authlib.GameProfile; -import meteordevelopment.meteorclient.mixininterface.IChatHudLineVisible; -import net.minecraft.client.gui.hud.ChatHudLine; -import net.minecraft.text.OrderedText; +import meteordevelopment.meteorclient.mixininterface.IGuiMessageVisible; +import net.minecraft.client.multiplayer.chat.GuiMessage; +import net.minecraft.util.FormattedCharSequence; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -@Mixin(ChatHudLine.Visible.class) -public abstract class ChatHudLineVisibleMixin implements IChatHudLineVisible { - @Shadow @Final private OrderedText content; - @Unique private int id; - @Unique private GameProfile sender; - @Unique private boolean startOfEntry; +@Mixin(GuiMessage.Line.class) +public abstract class GuiMessageVisibleMixin implements IGuiMessageVisible { + @Shadow + @Final + private FormattedCharSequence content; + @Unique + private int id; + @Unique + private GameProfile sender; + @Unique + private boolean startOfEntry; @Override public String meteor$getText() { diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GuiMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/GuiMixin.java new file mode 100644 index 0000000000..5c6080d0f6 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/GuiMixin.java @@ -0,0 +1,124 @@ +/* + * 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.MeteorClient; +import meteordevelopment.meteorclient.events.render.Render2DEvent; +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.utils.Utils; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.util.profiling.Profiler; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.scores.Objective; +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.ModifyArgs; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.invoke.arg.Args; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(Gui.class) +public abstract class GuiMixin { + @Shadow + public abstract void onDisconnected(); + + @Inject(method = "extractRenderState", at = @At("TAIL")) + private void onExtractRenderState(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { + graphics.nextStratum(); + + Profiler.get().push(MeteorClient.MOD_ID + "_render_2d"); + + Utils.unscaledProjection(); + + MeteorClient.EVENT_BUS.post(Render2DEvent.get(graphics, graphics.guiWidth(), graphics.guiHeight(), deltaTracker.getGameTimeDeltaPartialTick(true))); + + graphics.nextStratum(); + Utils.scaledProjection(); + + Profiler.get().pop(); + } + + @Inject(method = "extractEffects", at = @At("HEAD"), cancellable = true) + private void onExtractStatusEffectOverlay(CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noPotionIcons()) ci.cancel(); + } + + @Inject(method = "extractPortalOverlay", at = @At("HEAD"), cancellable = true) + private void onExtractPortalOverlay(GuiGraphicsExtractor graphics, float alpha, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noPortalOverlay()) ci.cancel(); + } + + @ModifyArgs(method = "extractCameraOverlays", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;extractTextureOverlay(Lnet/minecraft/client/gui/GuiGraphicsExtractor;Lnet/minecraft/resources/Identifier;F)V", ordinal = 0)) + private void onExtractPumpkinOverlay(Args args) { + if (Modules.get().get(NoRender.class).noPumpkinOverlay()) args.set(2, 0f); + } + + @ModifyArgs(method = "extractCameraOverlays", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;extractTextureOverlay(Lnet/minecraft/client/gui/GuiGraphicsExtractor;Lnet/minecraft/resources/Identifier;F)V", ordinal = 1)) + private void onExtractPowderedSnowOverlay(Args args) { + if (Modules.get().get(NoRender.class).noPowderedSnowOverlay()) args.set(2, 0f); + } + + @Inject(method = "extractVignette", at = @At("HEAD"), cancellable = true) + private void onExtractVignetteOverlay(GuiGraphicsExtractor graphics, Entity camera, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noVignette()) ci.cancel(); + } + + @Inject(method = "displayScoreboardSidebar", at = @At("HEAD"), cancellable = true) + private void onExtractScoreboardSidebar(GuiGraphicsExtractor graphics, Objective objective, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noScoreboard()) ci.cancel(); + } + + @Inject(method = "extractScoreboardSidebar", at = @At("HEAD"), cancellable = true) + private void onExtractScoreboardSidebar(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noScoreboard()) ci.cancel(); + } + + @Inject(method = "extractSpyglassOverlay", at = @At("HEAD"), cancellable = true) + private void onExtractSpyglassOverlay(GuiGraphicsExtractor graphics, float scale, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noSpyglassOverlay()) ci.cancel(); + } + + @ModifyExpressionValue(method = "extractCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/CameraType;isFirstPerson()Z")) + private boolean alwaysRenderCrosshairInFreecam(boolean firstPerson) { + return Modules.get().isActive(Freecam.class) || firstPerson; + } + + @Inject(method = "extractCrosshair", at = @At("HEAD"), cancellable = true) + private void onExtractCrosshair(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noCrosshair()) ci.cancel(); + } + + @Inject(method = "extractTitle", at = @At("HEAD"), cancellable = true) + private void onExtractTitle(GuiGraphicsExtractor graphics, DeltaTracker deltaTracker, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noTitle()) ci.cancel(); + } + + @Inject(method = "extractSelectedItemName", at = @At("HEAD"), cancellable = true) + private void onExtractHeldItemTooltip(GuiGraphicsExtractor graphics, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noHeldItemName()) ci.cancel(); + } + + @Inject(method = "onDisconnected", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/ChatComponent;clearMessages(Z)V"), cancellable = true) + private void onClear(CallbackInfo ci) { + if (Modules.get().get(BetterChat.class).keepHistory()) { + ci.cancel(); + } + } + + @Inject(method = "extractConfusionOverlay", at = @At("HEAD"), cancellable = true) + private void onExtractNausea(GuiGraphicsExtractor graphics, float strength, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noNausea()) ci.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenAccessor.java deleted file mode 100644 index f2e1c6e378..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenAccessor.java +++ /dev/null @@ -1,17 +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 net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.screen.slot.Slot; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(HandledScreen.class) -public interface HandledScreenAccessor { - @Accessor("focusedSlot") - Slot meteor$getFocusedSlot(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java deleted file mode 100644 index abfc0ae13d..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HandledScreenMixin.java +++ /dev/null @@ -1,136 +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.ModifyReturnValue; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; -import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; -import meteordevelopment.meteorclient.systems.modules.render.ItemHighlight; -import net.minecraft.client.gui.Click; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.input.KeyInput; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.slot.Slot; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.Text; -import org.jetbrains.annotations.Nullable; -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 meteordevelopment.meteorclient.MeteorClient.mc; -import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; - -@Mixin(HandledScreen.class) -public abstract class HandledScreenMixin extends Screen implements ScreenHandlerProvider { - @Shadow - protected Slot focusedSlot; - - @Shadow - protected int x; - @Shadow - protected int y; - - @Shadow - @Nullable - protected abstract Slot getSlotAt(double xPosition, double yPosition); - - @Shadow - public abstract T getScreenHandler(); - - @Shadow - private boolean doubleClicking; - - @Shadow - protected abstract void onMouseClick(Slot slot, int invSlot, int clickData, SlotActionType actionType); - - @Shadow - public abstract void close(); - - public HandledScreenMixin(Text title) { - super(title); - } - - @Inject(method = "init", at = @At("TAIL")) - private void onInit(CallbackInfo info) { - InventoryTweaks invTweaks = Modules.get().get(InventoryTweaks.class); - - if (invTweaks.isActive() && invTweaks.showButtons() && invTweaks.canSteal(getScreenHandler())) { - addDrawableChild( - new ButtonWidget.Builder(Text.literal("Steal"), button -> invTweaks.steal(getScreenHandler())) - .position(x, y - 22) - .size(40, 20) - .build() - ); - - addDrawableChild( - new ButtonWidget.Builder(Text.literal("Dump"), button -> invTweaks.dump(getScreenHandler())) - .position(x + 42, y - 22) - .size(40, 20) - .build() - ); - } - } - - // Inventory Tweaks - @Inject(method = "mouseDragged", at = @At("TAIL")) - private void onMouseDragged(Click click, double offsetX, double offsetY, CallbackInfoReturnable cir) { - if (click.button() != GLFW_MOUSE_BUTTON_LEFT || doubleClicking || !Modules.get().get(InventoryTweaks.class).mouseDragItemMove()) return; - - Slot slot = getSlotAt(click.x(), click.y()); - if (slot != null && slot.hasStack() && mc.isShiftPressed()) onMouseClick(slot, slot.id, click.button(), SlotActionType.QUICK_MOVE); - } - - // Middle click open - @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) - private void mouseClicked(Click click, boolean doubled, CallbackInfoReturnable cir) { - BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); - - if (tooltips.shouldOpenContents(click) && focusedSlot != null && !focusedSlot.getStack().isEmpty() && getScreenHandler().getCursorStack().isEmpty()) { - if (tooltips.openContent(focusedSlot.getStack())) { - cir.setReturnValue(true); - } - } - } - - // Keyboard input for middle click open - @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) - private void keyPressed(KeyInput input, CallbackInfoReturnable cir) { - BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); - - if (tooltips.shouldOpenContents(input) && focusedSlot != null && !focusedSlot.getStack().isEmpty() && getScreenHandler().getCursorStack().isEmpty()) { - if (tooltips.openContent(focusedSlot.getStack())) { - cir.setReturnValue(true); - } - } - } - - // Item Highlight - @Inject(method = "drawSlot", at = @At("HEAD")) - private void onDrawSlot(DrawContext context, Slot slot, int mouseX, int mouseY, CallbackInfo ci) { - int color = Modules.get().get(ItemHighlight.class).getColor(slot.getStack()); - if (color != -1) context.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, color); - } - - @ModifyReturnValue(method = "isItemTooltipSticky", at = @At("RETURN")) - private boolean isTooltipSticky(boolean original, ItemStack item) { - if (item.getTooltipData().orElse(null) instanceof TooltipComponent component) { - return original || component.isSticky(); - } - - return original; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HeadFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HeadFeatureRendererMixin.java deleted file mode 100644 index fb0c4badd7..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HeadFeatureRendererMixin.java +++ /dev/null @@ -1,28 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.entity.model.ModelWithHead; -import net.minecraft.client.render.entity.state.LivingEntityRenderState; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -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(HeadFeatureRenderer.class) -public abstract class HeadFeatureRendererMixin & ModelWithHead> { - @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;ILnet/minecraft/client/render/entity/state/LivingEntityRenderState;FF)V", at = @At("HEAD"), cancellable = true) - private void onRender(MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, int i, S livingEntityRenderState, float f, float g, CallbackInfo ci) { - if (livingEntityRenderState instanceof PlayerEntityRenderState && Modules.get().get(NoRender.class).noArmor()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java deleted file mode 100644 index 094cf3033d..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/HeldItemRendererMixin.java +++ /dev/null @@ -1,99 +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.google.common.base.MoreObjects; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -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.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.item.HeldItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Arm; -import net.minecraft.util.Hand; -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.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(HeldItemRenderer.class) -public abstract class HeldItemRendererMixin { - @Shadow - private float equipProgressMainHand; - - @Shadow - private float equipProgressOffHand; - - @Shadow - private ItemStack mainHand; - - @Shadow - private ItemStack offHand; - - @Shadow - protected abstract boolean shouldSkipHandAnimationOnSwap(ItemStack from, ItemStack to); - - @ModifyVariable(method = "renderItem(FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/network/ClientPlayerEntity;I)V", at = @At(value = "STORE", ordinal = 0), index = 6) - private float modifySwing(float swingProgress) { - HandView module = Modules.get().get(HandView.class); - Hand hand = MoreObjects.firstNonNull(mc.player.preferredHand, Hand.MAIN_HAND); - - if (module.isActive()) { - if (hand == Hand.OFF_HAND && !mc.player.getOffHandStack().isEmpty()) { - return swingProgress + module.offSwing.get().floatValue(); - } - if (hand == Hand.MAIN_HAND && !mc.player.getMainHandStack().isEmpty()) { - return swingProgress + module.mainSwing.get().floatValue(); - } - } - - return swingProgress; - } - - @ModifyReturnValue(method = "shouldSkipHandAnimationOnSwap", at = @At("RETURN")) - private boolean modifySkipSwapAnimation(boolean original) { - return original || Modules.get().get(HandView.class).skipSwapping(); - } - - @ModifyArg(method = "updateHeldItems", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;clamp(FFF)F", ordinal = 2), index = 0) - private float modifyEquipProgressMainhand(float value) { - float f = mc.player.getHandEquippingProgress(1f); - float modified = Modules.get().get(HandView.class).oldAnimations() ? 1 : f * f * f; - - return (shouldSkipHandAnimationOnSwap(mainHand, mc.player.getMainHandStack()) ? modified : 0) - equipProgressMainHand; - } - - @ModifyArg(method = "updateHeldItems", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;clamp(FFF)F", ordinal = 3), index = 0) - private float modifyEquipProgressOffhand(float value) { - return (shouldSkipHandAnimationOnSwap(offHand, mc.player.getOffHandStack()) ? 1 : 0) - equipProgressOffHand; - } - - @Inject(method = "renderFirstPersonItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemDisplayContext;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;I)V", shift = At.Shift.BEFORE)) - private void onRenderItem(AbstractClientPlayerEntity player, float tickProgress, float pitch, Hand hand, float swingProgress, ItemStack item, float equipProgress, MatrixStack matrices, OrderedRenderCommandQueue orderedRenderCommandQueue, int light, CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(HeldItemRendererEvent.get(hand, matrices)); - } - - @Inject(method = "renderFirstPersonItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderArmHoldingItem(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;IFFLnet/minecraft/util/Arm;)V")) - private void onRenderArm(AbstractClientPlayerEntity player, float tickProgress, float pitch, Hand hand, float swingProgress, ItemStack item, float equipProgress, MatrixStack matrices, OrderedRenderCommandQueue orderedRenderCommandQueue, int light, CallbackInfo ci) { - MeteorClient.EVENT_BUS.post(ArmRenderEvent.get(hand, matrices)); - } - - @Inject(method = "applyEatOrDrinkTransformation", at = @At(value = "INVOKE", target = "Ljava/lang/Math;pow(DD)D", shift = At.Shift.BEFORE), cancellable = true) - private void cancelTransformations(MatrixStack matrices, float tickDelta, Arm arm, ItemStack stack, PlayerEntity player, CallbackInfo ci) { - if (Modules.get().get(HandView.class).disableFoodAnimation()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/HumanoidArmorLayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/HumanoidArmorLayerMixin.java new file mode 100644 index 0000000000..f8df4f8320 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/HumanoidArmorLayerMixin.java @@ -0,0 +1,28 @@ +/* + * 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.vertex.PoseStack; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.NoRender; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; +import net.minecraft.client.renderer.entity.state.HumanoidRenderState; +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(HumanoidArmorLayer.class) +public abstract class HumanoidArmorLayerMixin, A extends HumanoidModel> { + @Inject(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/HumanoidRenderState;FF)V", at = @At("HEAD"), cancellable = true) + private void onRender(PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, S state, float yRot, float xRot, CallbackInfo ci) { + if (state instanceof AvatarRenderState && Modules.get().get(NoRender.class).noArmor()) + ci.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java deleted file mode 100644 index ed64733477..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameHudMixin.java +++ /dev/null @@ -1,125 +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 meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.render.Render2DEvent; -import meteordevelopment.meteorclient.mixininterface.IGameRenderer; -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.utils.Utils; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.render.RenderTickCounter; -import net.minecraft.entity.Entity; -import net.minecraft.scoreboard.ScoreboardObjective; -import net.minecraft.util.profiler.Profilers; -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.ModifyArgs; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(InGameHud.class) -public abstract class InGameHudMixin { - @Shadow public abstract void clear(); - - @Inject(method = "render", at = @At("TAIL")) - private void onRender(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { - ((IGameRenderer) mc.gameRenderer).meteor$flushGuiState(); - context.createNewRootLayer(); - - Profilers.get().push(MeteorClient.MOD_ID + "_render_2d"); - - Utils.unscaledProjection(); - - MeteorClient.EVENT_BUS.post(Render2DEvent.get(context, context.getScaledWindowWidth(), context.getScaledWindowWidth(), tickCounter.getTickProgress(true))); - - context.createNewRootLayer(); - Utils.scaledProjection(); - - Profilers.get().pop(); - } - - @Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"), cancellable = true) - private void onRenderStatusEffectOverlay(CallbackInfo info) { - if (Modules.get().get(NoRender.class).noPotionIcons()) info.cancel(); - } - - @Inject(method = "renderPortalOverlay", at = @At("HEAD"), cancellable = true) - private void onRenderPortalOverlay(DrawContext context, float nauseaStrength, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noPortalOverlay()) ci.cancel(); - } - - @ModifyArgs(method = "renderMiscOverlays", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderOverlay(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/util/Identifier;F)V", ordinal = 0)) - private void onRenderPumpkinOverlay(Args args) { - if (Modules.get().get(NoRender.class).noPumpkinOverlay()) args.set(2, 0f); - } - - @ModifyArgs(method = "renderMiscOverlays", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderOverlay(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/util/Identifier;F)V", ordinal = 1)) - private void onRenderPowderedSnowOverlay(Args args) { - if (Modules.get().get(NoRender.class).noPowderedSnowOverlay()) args.set(2, 0f); - } - - @Inject(method = "renderVignetteOverlay", at = @At("HEAD"), cancellable = true) - private void onRenderVignetteOverlay(DrawContext context, Entity entity, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noVignette()) ci.cancel(); - } - - @Inject(method = "renderScoreboardSidebar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", at = @At("HEAD"), cancellable = true) - private void onRenderScoreboardSidebar(DrawContext context, ScoreboardObjective objective, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noScoreboard()) ci.cancel(); - } - - @Inject(method = "renderScoreboardSidebar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V", at = @At("HEAD"), cancellable = true) - private void onRenderScoreboardSidebar(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noScoreboard()) ci.cancel(); - } - - @Inject(method = "renderSpyglassOverlay", at = @At("HEAD"), cancellable = true) - private void onRenderSpyglassOverlay(DrawContext context, float scale, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noSpyglassOverlay()) ci.cancel(); - } - - @ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/Perspective;isFirstPerson()Z")) - private boolean alwaysRenderCrosshairInFreecam(boolean firstPerson) { - return Modules.get().isActive(Freecam.class) || firstPerson; - } - - @Inject(method = "renderCrosshair", at = @At("HEAD"), cancellable = true) - private void onRenderCrosshair(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noCrosshair()) ci.cancel(); - } - - @Inject(method = "renderTitleAndSubtitle", at = @At("HEAD"), cancellable = true) - private void onRenderTitle(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noTitle()) ci.cancel(); - } - - @Inject(method = "renderHeldItemTooltip", at = @At("HEAD"), cancellable = true) - private void onRenderHeldItemTooltip(DrawContext context, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noHeldItemName()) ci.cancel(); - } - - @Inject(method = "clear", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;clear(Z)V"), cancellable = true) - private void onClear(CallbackInfo info) { - if (Modules.get().get(BetterChat.class).keepHistory()) { - info.cancel(); - } - } - - @Inject(method = "renderNauseaOverlay", at = @At("HEAD"), cancellable = true) - private void onRenderNausea(DrawContext context, float distortionStrength, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noNausea()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/InGameOverlayRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/InGameOverlayRendererMixin.java deleted file mode 100644 index 9b9bb7eed1..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/InGameOverlayRendererMixin.java +++ /dev/null @@ -1,36 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.hud.InGameOverlayRenderer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.math.MatrixStack; -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(InGameOverlayRenderer.class) -public abstract class InGameOverlayRendererMixin { - @Inject(method = "renderFireOverlay", at = @At("HEAD"), cancellable = true) - private static void onRenderFireOverlay(MatrixStack matrices, VertexConsumerProvider vertexConsumers, Sprite sprite, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noFireOverlay()) ci.cancel(); - } - - @Inject(method = "renderUnderwaterOverlay", at = @At("HEAD"), cancellable = true) - private static void onRenderUnderwaterOverlay(MinecraftClient client, MatrixStack matrices, VertexConsumerProvider vertexConsumers, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noLiquidOverlay()) ci.cancel(); - } - - @Inject(method = "renderInWallOverlay", at = @At("HEAD"), cancellable = true) - private static void render(Sprite sprite, MatrixStack matrices, VertexConsumerProvider vertexConsumers, CallbackInfo ci) { - if (Modules.get().get(NoRender.class).noInWallOverlay()) ci.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemContainerContentsAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemContainerContentsAccessor.java new file mode 100644 index 0000000000..2c8bd294a8 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemContainerContentsAccessor.java @@ -0,0 +1,19 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.world.item.component.ItemContainerContents; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(ItemContainerContents.class) +public interface ItemContainerContentsAccessor { + @Accessor("items") + List meteor$getItems(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemContainerContentsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemContainerContentsMixin.java new file mode 100644 index 0000000000..fed4b54433 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemContainerContentsMixin.java @@ -0,0 +1,34 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; +import net.minecraft.core.component.DataComponentGetter; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.ItemContainerContents; +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.function.Consumer; + +@Mixin(ItemContainerContents.class) +public abstract class ItemContainerContentsMixin { + @Inject(method = "addToTooltip", at = @At("HEAD"), cancellable = true) + private void onAddToTooltip(Item.TooltipContext context, Consumer consumer, TooltipFlag flag, DataComponentGetter components, CallbackInfo ci) { + if (Modules.get() == null) return; + + BetterTooltips tooltips = Modules.get().get(BetterTooltips.class); + if (tooltips.isActive()) { + if (tooltips.previewShulkers()) ci.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityRendererMixin.java index 871a091668..feb465d9f4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemEntityRendererMixin.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.RenderItemEntityEvent; -import net.minecraft.client.item.ItemModelManager; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.ItemEntityRenderer; -import net.minecraft.client.render.entity.state.ItemEntityRenderState; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.ItemEntityRenderer; +import net.minecraft.client.renderer.entity.state.ItemEntityRenderState; +import net.minecraft.client.renderer.item.ItemModelResolver; +import net.minecraft.client.renderer.state.level.CameraRenderState; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -26,11 +26,11 @@ public abstract class ItemEntityRendererMixin { @Shadow @Final - private ItemModelManager itemModelManager; + private ItemModelResolver itemModelResolver; - @Inject(method = "render(Lnet/minecraft/client/render/entity/state/ItemEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At("HEAD"), cancellable = true) - private void renderStack(ItemEntityRenderState itemEntityRenderState, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState arg, CallbackInfo ci) { - RenderItemEntityEvent event = MeteorClient.EVENT_BUS.post(RenderItemEntityEvent.get(itemEntityRenderState, mc.getRenderTickCounter().getTickProgress(true), matrixStack, null, itemEntityRenderState.light, this.itemModelManager, orderedRenderCommandQueue)); + @Inject(method = "submit(Lnet/minecraft/client/renderer/entity/state/ItemEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V", at = @At("HEAD"), cancellable = true) + private void renderStack(ItemEntityRenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { + RenderItemEntityEvent event = MeteorClient.EVENT_BUS.post(RenderItemEntityEvent.get(state, mc.getDeltaTracker().getGameTimeDeltaPartialTick(true), poseStack, null, state.lightCoords, this.itemModelResolver, submitNodeCollector)); if (event.isCancelled()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemInHandRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemInHandRendererMixin.java new file mode 100644 index 0000000000..00919d4df1 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemInHandRendererMixin.java @@ -0,0 +1,99 @@ +/* + * 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.google.common.base.MoreObjects; +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.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.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +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); + + @ModifyVariable(method = "renderHandsWithItems(FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/player/LocalPlayer;I)V", at = @At(value = "STORE", ordinal = 0), name = "attackValue") + private float modifySwing(float attackValue) { + HandView module = Modules.get().get(HandView.class); + InteractionHand hand = MoreObjects.firstNonNull(mc.player.swingingArm, InteractionHand.MAIN_HAND); + + if (module.isActive()) { + if (hand == InteractionHand.OFF_HAND && !mc.player.getOffhandItem().isEmpty()) { + return attackValue + module.offSwing.get().floatValue(); + } + if (hand == InteractionHand.MAIN_HAND && !mc.player.getMainHandItem().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) { + float f = mc.player.getItemSwapScale(1f); + float modified = Modules.get().get(HandView.class).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 = "renderArmWithItem", 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 = "renderArmWithItem", 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/ItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java index 058adad1e4..31f4598005 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemMixin.java @@ -7,9 +7,9 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.TooltipDataEvent; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.tooltip.TooltipData; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; +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; @@ -19,9 +19,9 @@ @Mixin(Item.class) public abstract class ItemMixin { - @Inject(method = "getTooltipData", at = @At("HEAD"), cancellable = true) - private void onTooltipData(ItemStack stack, CallbackInfoReturnable> cir) { - TooltipDataEvent event = MeteorClient.EVENT_BUS.post(TooltipDataEvent.get(stack)); + @Inject(method = "getTooltipImage", at = @At("HEAD"), cancellable = true) + private void onTooltipData(ItemStack itemStack, CallbackInfoReturnable> cir) { + TooltipDataEvent event = MeteorClient.EVENT_BUS.post(TooltipDataEvent.get(itemStack)); if (event.tooltipData != null) { cir.setReturnValue(Optional.of(event.tooltipData)); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java index 132e6140de..6b5701165f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemRendererMixin.java @@ -7,21 +7,24 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.render.item.ItemRenderState; -import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.renderer.feature.ItemFeatureRenderer; +import net.minecraft.client.renderer.item.ItemStackRenderState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; -@Mixin(ItemRenderer.class) +@Mixin(ItemFeatureRenderer.class) public abstract class ItemRendererMixin { @ModifyVariable( - method = "renderItem(Lnet/minecraft/item/ItemDisplayContext;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;II[ILjava/util/List;Lnet/minecraft/client/render/RenderLayer;Lnet/minecraft/client/render/item/ItemRenderState$Glint;)V", - at = @At("HEAD"), - argsOnly = true + method = "renderItem", + at = @At("STORE"), + name = "foilType" ) - private static ItemRenderState.Glint modifyEnchant(ItemRenderState.Glint glint) { - if (Modules.get().get(NoRender.class).noEnchantGlint()) return ItemRenderState.Glint.NONE; - return glint; + private ItemStackRenderState.FoilType modifyEnchant(ItemStackRenderState.FoilType foilType) { + if (Modules.get().get(NoRender.class).noEnchantGlint()) { + return ItemStackRenderState.FoilType.NONE; + } + + return foilType; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java index 21b7729b39..17656a104e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackMixin.java @@ -11,10 +11,10 @@ import meteordevelopment.meteorclient.events.entity.player.StoppedUsingItemEvent; import meteordevelopment.meteorclient.events.game.ItemStackTooltipEvent; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.world.World; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -27,8 +27,8 @@ @Mixin(ItemStack.class) public abstract class ItemStackMixin { - @ModifyReturnValue(method = "getTooltip", at = @At("RETURN")) - private List onGetTooltip(List original) { + @ModifyReturnValue(method = "getTooltipLines", at = @At("RETURN")) + private List onGetTooltipLines(List original) { if (Utils.canUpdate()) { ItemStackTooltipEvent event = MeteorClient.EVENT_BUS.post(new ItemStackTooltipEvent((ItemStack) (Object) this, original)); return event.list(); @@ -37,16 +37,16 @@ private List onGetTooltip(List original) { return original; } - @Inject(method = "finishUsing", at = @At("HEAD")) - private void onFinishUsing(World world, LivingEntity user, CallbackInfoReturnable info) { - if (user == mc.player) { + @Inject(method = "finishUsingItem", at = @At("HEAD")) + private void onFinishUsingItem(Level level, LivingEntity livingEntity, CallbackInfoReturnable cir) { + if (livingEntity == mc.player) { MeteorClient.EVENT_BUS.post(FinishUsingItemEvent.get((ItemStack) (Object) this)); } } - @Inject(method = "onStoppedUsing", at = @At("HEAD")) - private void onStoppedUsing(World world, LivingEntity user, int remainingUseTicks, CallbackInfo info) { - if (user == mc.player) { + @Inject(method = "releaseUsing", at = @At("HEAD")) + private void onReleaseUsing(Level level, LivingEntity entity, int remainingTime, CallbackInfo ci) { + if (entity == mc.player) { MeteorClient.EVENT_BUS.post(StoppedUsingItemEvent.get((ItemStack) (Object) this)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRenderStateAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackRenderStateAccessor.java similarity index 53% rename from src/main/java/meteordevelopment/meteorclient/mixin/ItemRenderStateAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ItemStackRenderStateAccessor.java index 57e324f26d..9001b514d3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ItemRenderStateAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemStackRenderStateAccessor.java @@ -5,15 +5,15 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.render.item.ItemRenderState; +import net.minecraft.client.renderer.item.ItemStackRenderState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ItemRenderState.class) -public interface ItemRenderStateAccessor { - @Accessor("layerCount") - int meteor$getLayerCount(); +@Mixin(ItemStackRenderState.class) +public interface ItemStackRenderStateAccessor { + @Accessor("activeLayerCount") + int meteor$getActiveLayerCount(); @Accessor("layers") - ItemRenderState.LayerRenderState[] meteor$getLayers(); + ItemStackRenderState.LayerRenderState[] meteor$getLayers(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ItemTransformMixin.java similarity index 62% rename from src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ItemTransformMixin.java index ed6f3a4477..590d47385b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TransformationMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ItemTransformMixin.java @@ -5,20 +5,20 @@ package meteordevelopment.meteorclient.mixin; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.render.ApplyTransformationEvent; -import net.minecraft.client.render.model.json.Transformation; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.resources.model.cuboid.ItemTransform; 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(Transformation.class) -public abstract class TransformationMixin { +@Mixin(ItemTransform.class) +public abstract class ItemTransformMixin { @Inject(method = "apply", at = @At("HEAD"), cancellable = true) - private void onApply(boolean leftHanded, MatrixStack.Entry entry, CallbackInfo info) { - ApplyTransformationEvent event = MeteorClient.EVENT_BUS.post(ApplyTransformationEvent.get((Transformation) (Object) this, leftHanded)); - if (event.isCancelled()) info.cancel(); + private void onApply(boolean applyLeftHandFix, PoseStack.Pose pose, CallbackInfo ci) { + ApplyTransformationEvent event = MeteorClient.EVENT_BUS.post(ApplyTransformationEvent.get((ItemTransform) (Object) this, applyLeftHandFix)); + if (event.isCancelled()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/JoinMultiplayerScreenMixin.java similarity index 54% rename from src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/JoinMultiplayerScreenMixin.java index ba74b38a4e..94bc274d49 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MultiplayerScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/JoinMultiplayerScreenMixin.java @@ -11,11 +11,11 @@ import meteordevelopment.meteorclient.systems.proxies.Proxies; import meteordevelopment.meteorclient.systems.proxies.Proxy; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.text.Text; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -24,8 +24,8 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; -@Mixin(MultiplayerScreen.class) -public abstract class MultiplayerScreenMixin extends Screen { +@Mixin(JoinMultiplayerScreen.class) +public abstract class JoinMultiplayerScreenMixin extends Screen { @Unique private int textColor1; @Unique @@ -37,26 +37,26 @@ public abstract class MultiplayerScreenMixin extends Screen { private int loggedInAsLength; @Unique - private ButtonWidget accounts; + private Button accounts; @Unique - private ButtonWidget proxies; + private Button proxies; - public MultiplayerScreenMixin(Text title) { + public JoinMultiplayerScreenMixin(Component title) { super(title); } - @Inject(method = "refreshWidgetPositions", at = @At("TAIL")) - private void onInit(CallbackInfo info) { + @Inject(method = "repositionElements", at = @At("TAIL")) + private void onInit(CallbackInfo ci) { textColor1 = Color.fromRGBA(255, 255, 255, 255); textColor2 = Color.fromRGBA(175, 175, 175, 255); loggedInAs = "Logged in as "; - loggedInAsLength = textRenderer.getWidth(loggedInAs); + loggedInAsLength = font.width(loggedInAs); if (accounts == null) { - accounts = addDrawableChild( - new ButtonWidget.Builder(Text.literal("Accounts"), button -> client.setScreen(GuiThemes.get().accountsScreen())) + accounts = addRenderableWidget( + new Button.Builder(Component.literal("Accounts"), button -> minecraft.setScreen(GuiThemes.get().accountsScreen())) .size(75, 20) .build() ); @@ -64,27 +64,27 @@ private void onInit(CallbackInfo info) { accounts.setPosition(this.width - 75 - 3, 3); if (proxies == null) { - proxies = addDrawableChild( - new ButtonWidget.Builder(Text.literal("Proxies"), button -> client.setScreen(GuiThemes.get().proxiesScreen())) - .size(75, 20) - .build() - ); + proxies = addRenderableWidget( + new Button.Builder(Component.literal("Proxies"), button -> minecraft.setScreen(GuiThemes.get().proxiesScreen())) + .size(75, 20) + .build() + ); } proxies.setPosition(this.width - 75 - 3 - 75 - 2, 3); } @Override - public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks) { - super.render(context, mouseX, mouseY, deltaTicks); + public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float deltaTicks) { + super.extractRenderState(graphics, mouseX, mouseY, deltaTicks); int x = 3; int y = 3; // Logged in as - context.drawTextWithShadow(mc.textRenderer, loggedInAs, x, y, textColor1); - context.drawTextWithShadow(mc.textRenderer, Modules.get().get(NameProtect.class).getName(client.getSession().getUsername()), x + loggedInAsLength, y, textColor2); + graphics.text(mc.font, loggedInAs, x, y, textColor1); + graphics.text(mc.font, Modules.get().get(NameProtect.class).getName(minecraft.getUser().getName()), x + loggedInAsLength, y, textColor2); - y += textRenderer.fontHeight + 2; + y += font.lineHeight + 2; // Proxy Proxy proxy = Proxies.get().getEnabled(); @@ -92,8 +92,8 @@ public void render(DrawContext context, int mouseX, int mouseY, float deltaTicks String left = proxy != null ? "Using proxy " : "Not using a proxy"; String right = proxy != null ? (proxy.name.get() != null && !proxy.name.get().isEmpty() ? "(" + proxy.name.get() + ") " : "") + proxy.address.get() + ":" + proxy.port.get() : null; - context.drawTextWithShadow(mc.textRenderer, left, x, y, textColor1); + graphics.text(mc.font, left, x, y, textColor1); if (right != null) - context.drawTextWithShadow(mc.textRenderer, right, x + textRenderer.getWidth(left), y, textColor2); + graphics.text(mc.font, right, x + font.width(left), y, textColor2); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingAccessor.java deleted file mode 100644 index 86feac3b16..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyBindingAccessor.java +++ /dev/null @@ -1,32 +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 net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.Map; - -@Mixin(KeyBinding.class) -public interface KeyBindingAccessor { - @Accessor("KEYS_BY_ID") - static Map getKeysById() { return null; } - - @Accessor("boundKey") - InputUtil.Key meteor$getKey(); - - @Accessor("timesPressed") - int meteor$getTimesPressed(); - - @Accessor("timesPressed") - void meteor$setTimesPressed(int timesPressed); - - @Invoker("reset") - void meteor$invokeReset(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyMappingAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyMappingAccessor.java new file mode 100644 index 0000000000..c9efce5a37 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyMappingAccessor.java @@ -0,0 +1,34 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.KeyMapping; +import com.mojang.blaze3d.platform.InputConstants; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.Map; + +@Mixin(KeyMapping.class) +public interface KeyMappingAccessor { + @Accessor("ALL") + static Map getKeysById() { + return null; + } + + @Accessor("key") + InputConstants.Key meteor$getKey(); + + @Accessor("clickCount") + int meteor$getClickCount(); + + @Accessor("clickCount") + void meteor$setClickCount(int timesPressed); + + @Invoker("release") + void meteor$invokeRelease(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardHandlerMixin.java new file mode 100644 index 0000000000..3f79adf5d4 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardHandlerMixin.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 meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.meteor.CharTypedEvent; +import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; +import meteordevelopment.meteorclient.gui.GuiKeyEvents; +import meteordevelopment.meteorclient.gui.WidgetScreen; +import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.input.Input; +import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import net.minecraft.client.KeyboardHandler; +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; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(KeyboardHandler.class) +public abstract class KeyboardHandlerMixin { + @Shadow + @Final + private Minecraft minecraft; + + @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) { + // 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) { + modifiers |= Input.getModifier(event.key()); + } else if (action == GLFW.GLFW_RELEASE) { + modifiers &= ~Input.getModifier(event.key()); + } + + if (minecraft.screen instanceof WidgetScreen && action == GLFW.GLFW_REPEAT) { + ((WidgetScreen) minecraft.screen).keyRepeated(new KeyEvent(event.key(), event.scancode(), 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()) + ci.cancel(); + } + } + } + + @Inject(method = "charTyped", at = @At("HEAD"), cancellable = true) + private void onChar(long handle, CharacterEvent event, CallbackInfo ci) { + if (Utils.canUpdate() && !minecraft.isPaused() && (minecraft.screen == null || minecraft.screen instanceof WidgetScreen)) { + if (MeteorClient.EVENT_BUS.post(CharTypedEvent.get((char) event.codepoint())).isCancelled()) ci.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java index 10bd979049..98cc95bc26 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardInputMixin.java @@ -8,26 +8,27 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.Sneak; import meteordevelopment.meteorclient.systems.modules.render.Freecam; -import net.minecraft.client.input.Input; -import net.minecraft.client.input.KeyboardInput; -import net.minecraft.util.PlayerInput; +import net.minecraft.client.player.ClientInput; +import net.minecraft.client.player.KeyboardInput; +import net.minecraft.world.entity.player.Input; 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(KeyboardInput.class) -public abstract class KeyboardInputMixin extends Input { +public abstract class KeyboardInputMixin extends ClientInput { @Inject(method = "tick", at = @At("TAIL")) private void isPressed(CallbackInfo ci) { - if (Modules.get().get(Sneak.class).doVanilla() || Modules.get().get(Freecam.class).staySneaking()) playerInput = new PlayerInput( - playerInput.forward(), - playerInput.backward(), - playerInput.left(), - playerInput.right(), - playerInput.jump(), - true, - playerInput.sprint() - ); + if (Modules.get().get(Sneak.class).doVanilla() || Modules.get().get(Freecam.class).staySneaking()) + keyPresses = new Input( + keyPresses.forward(), + keyPresses.backward(), + keyPresses.left(), + keyPresses.right(), + keyPresses.jump(), + true, + keyPresses.sprint() + ); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardMixin.java deleted file mode 100644 index ae69aa53ba..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/KeyboardMixin.java +++ /dev/null @@ -1,61 +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 meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.meteor.CharTypedEvent; -import meteordevelopment.meteorclient.events.meteor.KeyEvent; -import meteordevelopment.meteorclient.gui.GuiKeyEvents; -import meteordevelopment.meteorclient.gui.WidgetScreen; -import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.input.Input; -import meteordevelopment.meteorclient.utils.misc.input.KeyAction; -import net.minecraft.client.Keyboard; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.input.CharInput; -import net.minecraft.client.input.KeyInput; -import org.lwjgl.glfw.GLFW; -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; - -@Mixin(Keyboard.class) -public abstract class KeyboardMixin { - @Shadow @Final private MinecraftClient client; - - @Inject(method = "onKey", at = @At("HEAD"), cancellable = true) - public void onKey(long window, int action, KeyInput input, CallbackInfo ci) { - int modifiers = input.modifiers(); - if (input.key() != GLFW.GLFW_KEY_UNKNOWN) { - // 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) { - modifiers |= Input.getModifier(input.key()); - } else if (action == GLFW.GLFW_RELEASE) { - modifiers &= ~Input.getModifier(input.key()); - } - - if (client.currentScreen instanceof WidgetScreen && action == GLFW.GLFW_REPEAT) { - ((WidgetScreen) client.currentScreen).keyRepeated(new KeyInput(input.key(), input.scancode(), modifiers)); - } - - if (GuiKeyEvents.canUseKeys) { - Input.setKeyState(input.key(), action != GLFW.GLFW_RELEASE); - if (MeteorClient.EVENT_BUS.post(KeyEvent.get(new KeyInput(input.key(), input.scancode(), modifiers), KeyAction.get(action))).isCancelled()) ci.cancel(); - } - } - } - - @Inject(method = "onChar", at = @At("HEAD"), cancellable = true) - private void onChar(long window, CharInput input, CallbackInfo ci) { - if (Utils.canUpdate() && !client.isPaused() && (client.currentScreen == null || client.currentScreen instanceof WidgetScreen)) { - if (MeteorClient.EVENT_BUS.post(CharTypedEvent.get((char) input.codepoint())).isCancelled()) ci.cancel(); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LayerRenderStateAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LayerRenderStateAccessor.java index 59b4ee2d47..eaeaed4363 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LayerRenderStateAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LayerRenderStateAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.render.item.ItemRenderState; -import net.minecraft.client.render.model.json.Transformation; +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.resources.model.cuboid.ItemTransform; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ItemRenderState.LayerRenderState.class) +@Mixin(ItemStackRenderState.LayerRenderState.class) public interface LayerRenderStateAccessor { - @Accessor("transform") - Transformation meteor$getTransform(); + @Accessor("itemTransform") + ItemTransform meteor$getTransform(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectionMatrix2Accessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelAccessor.java similarity index 51% rename from src/main/java/meteordevelopment/meteorclient/mixin/ProjectionMatrix2Accessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/LevelAccessor.java index 325bf337bc..9780fd202b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectionMatrix2Accessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelAccessor.java @@ -5,13 +5,14 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.render.ProjectionMatrix2; -import org.joml.Matrix4f; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.entity.LevelEntityGetter; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(ProjectionMatrix2.class) -public interface ProjectionMatrix2Accessor { - @Invoker("getMatrix") - Matrix4f meteor$callGetMatrix(float width, float height); +@Mixin(Level.class) +public interface LevelAccessor { + @Invoker("getEntities") + LevelEntityGetter meteor$getEntityLookup(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldChunkMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelChunkMixin.java similarity index 61% rename from src/main/java/meteordevelopment/meteorclient/mixin/WorldChunkMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/LevelChunkMixin.java index 9b4b036233..15bba26f3e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldChunkMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelChunkMixin.java @@ -7,10 +7,10 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.BlockUpdateEvent; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.chunk.WorldChunk; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -18,12 +18,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(WorldChunk.class) -public abstract class WorldChunkMixin { - @Shadow @Final World world; +@Mixin(LevelChunk.class) +public abstract class LevelChunkMixin { + @Shadow + @Final + private Level level; @Inject(method = "setBlockState", at = @At("TAIL")) - private void onSetBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable info) { - if (world.isClient()) MeteorClient.EVENT_BUS.post(BlockUpdateEvent.get(pos, info.getReturnValue(), state)); + private void onSetBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable cir) { + if (level.isClientSide()) MeteorClient.EVENT_BUS.post(BlockUpdateEvent.get(pos, cir.getReturnValue(), state)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LevelEntityGetterAdapterAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelEntityGetterAdapterAccessor.java new file mode 100644 index 0000000000..4581e60947 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelEntityGetterAdapterAccessor.java @@ -0,0 +1,18 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.world.level.entity.EntityAccess; +import net.minecraft.world.level.entity.EntitySectionStorage; +import net.minecraft.world.level.entity.LevelEntityGetterAdapter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(LevelEntityGetterAdapter.class) +public interface LevelEntityGetterAdapterAccessor { + @Accessor("sectionStorage") + EntitySectionStorage meteor$getSectionStorage(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererAccessor.java similarity index 54% rename from src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererAccessor.java index f60acead4b..4abb10c581 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererAccessor.java @@ -7,13 +7,13 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.entity.player.BlockBreakingInfo; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.server.level.BlockDestructionProgress; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(WorldRenderer.class) -public interface WorldRendererAccessor { - @Accessor("blockBreakingInfos") - Int2ObjectMap meteor$getBlockBreakingInfos(); +@Mixin(LevelRenderer.class) +public interface LevelRendererAccessor { + @Accessor("destroyingBlocks") + Int2ObjectMap meteor$getDestroyingBlocks(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererMixin.java new file mode 100644 index 0000000000..9be85d7d65 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LevelRendererMixin.java @@ -0,0 +1,265 @@ +/* + * 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.v2.WrapWithCondition; +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.blaze3d.vertex.VertexConsumer; +import it.unimi.dsi.fastutil.Stack; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; +import meteordevelopment.meteorclient.mixininterface.ILevelRenderer; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.*; +import meteordevelopment.meteorclient.systems.modules.world.Ambience; +import meteordevelopment.meteorclient.utils.OutlineRenderCommandQueue; +import meteordevelopment.meteorclient.utils.render.NoopImmediateVertexConsumerProvider; +import meteordevelopment.meteorclient.utils.render.NoopOutlineVertexConsumerProvider; +import meteordevelopment.meteorclient.utils.render.WrapperImmediateVertexConsumerProvider; +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.Camera; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.feature.FeatureRenderDispatcher; +import net.minecraft.client.renderer.state.level.*; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.border.WorldBorder; +import net.minecraft.world.phys.Vec3; +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.Shadow; +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.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.function.Function; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(LevelRenderer.class) +public abstract class LevelRendererMixin implements ILevelRenderer { + + @Unique + private NoRender noRender; + @Unique + private ESP esp; + + // if a world exists, meteor is initialised + @Inject(method = "setLevel", at = @At("TAIL")) + private void onSetLevel(ClientLevel level, CallbackInfo ci) { + esp = Modules.get().get(ESP.class); + noRender = Modules.get().get(NoRender.class); + } + + @Inject(method = "checkPoseStack", at = @At("HEAD"), cancellable = true) + private void onCheckPoseStack(PoseStack poseStack, CallbackInfo ci) { + ci.cancel(); + } + + @Inject(method = "renderHitOutline", at = @At("HEAD"), cancellable = true) + private void onDrawHighlightedHitOutline(PoseStack poseStack, VertexConsumer builder, double camX, double camY, double camZ, BlockOutlineRenderState state, int color, float width, CallbackInfo ci) { + if (Modules.get().isActive(BlockSelection.class)) ci.cancel(); + } + + @ModifyArg(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;cullTerrain(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/culling/Frustum;Z)V")) + private boolean update$cullTerraion$modifySpectator(boolean spectator) { + return Modules.get().isActive(Freecam.class) || spectator; + } + + // No Render + + @WrapWithCondition(method = "extractLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WeatherEffectRenderer;extractRenderState(Lnet/minecraft/world/level/Level;IFLnet/minecraft/world/phys/Vec3;Lnet/minecraft/client/renderer/state/level/WeatherRenderState;)V")) + private boolean extractLevel$noWeather(WeatherEffectRenderer instance, Level level, int ticks, float partialTicks, Vec3 cameraPos, WeatherRenderState renderState) { + if (noRender.noWeather()) { + renderState.intensity = 0; + return false; + } + + return true; + } + + @WrapWithCondition(method = "extractLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldBorderRenderer;extract(Lnet/minecraft/world/level/border/WorldBorder;FLnet/minecraft/world/phys/Vec3;DLnet/minecraft/client/renderer/state/level/WorldBorderRenderState;)V")) + private boolean extractLevel$noWorldBorder(WorldBorderRenderer instance, WorldBorder border, float deltaPartialTick, Vec3 cameraPos, double renderDistance, WorldBorderRenderState state) { + if (noRender.noWorldBorder()) { + state.alpha = 0; + return false; + } + + return true; + } + + @ModifyExpressionValue(method = "addSkyPass", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/state/level/CameraEntityRenderState;doesMobEffectBlockSky:Z")) + private boolean modifyMobEffectBlocksSky(boolean original) { + if (noRender.noBlindness() || noRender.noDarkness()) return false; + return original; + } + + // Entity Shaders + + @Inject(method = "renderLevel", at = @At("HEAD")) + private void onRenderLevelHead(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { + PostProcessShaders.beginRender(); + } + + @Unique + private final OutlineRenderCommandQueue outlineRenderCommandQueue = new OutlineRenderCommandQueue(); + + @Unique + private MultiBufferSource provider; + + @Unique + private FeatureRenderDispatcher renderDispatcher; + + @Inject(method = "submitEntities", at = @At("TAIL")) + private void onSubmitEntities(PoseStack poseStack, LevelRenderState levelRenderState, SubmitNodeCollector output, CallbackInfo ci) { + if (renderDispatcher == null) { + renderDispatcher = new FeatureRenderDispatcher( + outlineRenderCommandQueue, + mc.getModelManager(), + new WrapperImmediateVertexConsumerProvider(() -> provider), + mc.getAtlasManager(), + NoopOutlineVertexConsumerProvider.INSTANCE, + NoopImmediateVertexConsumerProvider.INSTANCE, + mc.font, + mc.gameRenderer.getGameRenderState() + ); + } + + draw(levelRenderState, poseStack, PostProcessShaders.CHAMS, _ -> Color.WHITE); + draw(levelRenderState, poseStack, PostProcessShaders.ENTITY_OUTLINE, entity -> esp.getColor(entity)); + } + + @Unique + private void draw(LevelRenderState worldState, PoseStack matrices, EntityShader shader, Function colorGetter) { + var camera = worldState.cameraRenderState.pos; + var empty = true; + + for (var state : worldState.entityRenderStates) { + Entity entity = ((IEntityRenderState) state).meteor$getEntity(); + if (entity == null) continue; + + if (!shader.shouldDraw(entity)) continue; + + var color = colorGetter.apply(entity); + if (color == null) continue; + outlineRenderCommandQueue.setColor(color); + + var renderer = entityRenderDispatcher.getRenderer(state); + var offset = renderer.getRenderOffset(state); + + matrices.pushPose(); + matrices.translate(state.x - camera.x + offset.x, state.y - camera.y + offset.y, state.z - camera.z + offset.z); + renderer.submit(state, matrices, outlineRenderCommandQueue, worldState.cameraRenderState); + matrices.popPose(); + + empty = false; + } + + if (empty) + return; + + meteor$pushEntityOutlineFramebuffer(shader.framebuffer); + provider = shader.vertexConsumerProvider; + + renderDispatcher.renderAllFeatures(); + outlineRenderCommandQueue.endFrame(); + + provider = null; + meteor$popEntityOutlineFramebuffer(); + } + + @ModifyExpressionValue(method = "extractVisibleEntities", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;isSectionCompiledAndVisible(Lnet/minecraft/core/BlockPos;)Z")) + boolean fillEntityRenderStatesIsRenderingReady(boolean original) { + if (esp.forceRender()) return true; + return original; + } + + @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/OutlineBufferSource;endOutlineBatch()V", shift = At.Shift.AFTER)) + private void addMainPass$submitEntityVertices(CallbackInfo ci) { + PostProcessShaders.submitEntityVertices(); + } + + @Inject(method = "resize", at = @At("HEAD")) + private void onResize(int width, int height, CallbackInfo ci) { + PostProcessShaders.onResized(width, height); + } + + @Inject(method = "extractLevel", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/state/level/LevelRenderState;cloudColor:I", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER)) + private void extractLevel$cloudColor(DeltaTracker deltaTracker, Camera camera, float deltaPartialTick, CallbackInfo ci) { + Ambience ambience = Modules.get().get(Ambience.class); + + if (ambience.isActive() && ambience.customCloudColor.get()) { + levelRenderState.cloudColor = ambience.cloudColor.get().getPacked(); + } + } + + // BreakIndicators + + @Inject(method = "extractBlockDestroyAnimation", at = @At("HEAD"), cancellable = true) + private void onExtractBlockDestroyAnimation(CallbackInfo ci) { + if (Modules.get().isActive(BreakIndicators.class) || Modules.get().get(NoRender.class).noBlockBreakOverlay()) { + ci.cancel(); + } + } + + // ILevelRenderer + + @Shadow + private RenderTarget entityOutlineTarget; + + @Shadow + @Final + private LevelTargetBundle targets; + + @Shadow + @Final + private EntityRenderDispatcher entityRenderDispatcher; + @Shadow + @Final + private LevelRenderState levelRenderState; + @Unique + private Stack framebufferStack; + + @Unique + private Stack> framebufferHandleStack; + + @Inject(method = "", at = @At("TAIL")) + private void init$IWorldRenderer(CallbackInfo ci) { + framebufferStack = new ObjectArrayList<>(); + framebufferHandleStack = new ObjectArrayList<>(); + } + + @Override + public void meteor$pushEntityOutlineFramebuffer(RenderTarget framebuffer) { + framebufferStack.push(this.entityOutlineTarget); + this.entityOutlineTarget = framebuffer; + + framebufferHandleStack.push(this.targets.entityOutline); + this.targets.entityOutline = () -> framebuffer; + } + + @Override + public void meteor$popEntityOutlineFramebuffer() { + this.entityOutlineTarget = framebufferStack.pop(); + this.targets.entityOutline = framebufferHandleStack.pop(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightmapMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightmapMixin.java new file mode 100644 index 0000000000..23ffbdc72d --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LightmapMixin.java @@ -0,0 +1,42 @@ +/* + * 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.systems.RenderSystem; +import com.mojang.blaze3d.textures.GpuTexture; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Fullbright; +import meteordevelopment.meteorclient.systems.modules.render.Xray; +import net.minecraft.client.renderer.Lightmap; +import net.minecraft.client.renderer.state.LightmapRenderState; +import net.minecraft.util.ARGB; +import net.minecraft.util.profiling.Profiler; +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; + +@Mixin(Lightmap.class) +public abstract class LightmapMixin { + @Shadow + @Final + private GpuTexture texture; + + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + private void render$fullbright(LightmapRenderState renderState, CallbackInfo ci) { + if (Modules.get().get(Fullbright.class).getGamma() || Modules.get().isActive(Xray.class)) { + var profile = Profiler.get(); + profile.push("lightmap"); + + RenderSystem.getDevice().createCommandEncoder().clearColorTexture(texture, ARGB.color(255, 255, 255, 255)); + + profile.pop(); + ci.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightmapTextureManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightmapTextureManagerMixin.java deleted file mode 100644 index b2ece57ea1..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LightmapTextureManagerMixin.java +++ /dev/null @@ -1,46 +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.sugar.Local; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.GpuTexture; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Fullbright; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import meteordevelopment.meteorclient.systems.modules.render.Xray; -import net.minecraft.client.render.LightmapTextureManager; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.math.ColorHelper; -import net.minecraft.util.profiler.Profiler; -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; - -@Mixin(LightmapTextureManager.class) -public abstract class LightmapTextureManagerMixin { - @Shadow - @Final - private GpuTexture glTexture; - - @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;push(Ljava/lang/String;)V", shift = At.Shift.AFTER), cancellable = true) - private void update$skip(float tickProgress, CallbackInfo ci, @Local Profiler profiler) { - if (Modules.get().get(Fullbright.class).getGamma() || Modules.get().isActive(Xray.class)) { - RenderSystem.getDevice().createCommandEncoder().clearColorTexture(glTexture, ColorHelper.getArgb(255, 255, 255, 255)); - profiler.pop(); - ci.cancel(); - } - } - - @Inject(method = "getDarkness", at = @At("HEAD"), cancellable = true) - private void getDarknessFactor(LivingEntity entity, float factor, float tickProgress, CallbackInfoReturnable info) { - if (Modules.get().get(NoRender.class).noDarkness()) info.setReturnValue(0.0f); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightningBoltRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightningBoltRendererMixin.java new file mode 100644 index 0000000000..eddb5ed1c4 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LightningBoltRendererMixin.java @@ -0,0 +1,39 @@ +/* + * 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.vertex.VertexConsumer; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.world.Ambience; +import meteordevelopment.meteorclient.utils.render.color.Color; +import net.minecraft.client.renderer.entity.LightningBoltRenderer; +import org.joml.Matrix4fc; +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(LightningBoltRenderer.class) +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) { + 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); + + ci.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java deleted file mode 100644 index 6db8399a10..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LightningEntityRendererMixin.java +++ /dev/null @@ -1,39 +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 meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.entity.LightningEntityRenderer; -import org.joml.Matrix4f; -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(LightningEntityRenderer.class) -public abstract class LightningEntityRendererMixin { - /** - * @author Walaryne - */ - @Inject(method = "drawBranch", at = @At(value = "HEAD"), cancellable = true) - private static void onSetLightningVertex(Matrix4f matrix4f, VertexConsumer vertexConsumer, float f, float g, int i, float h, float j, float k, float l, float m, float n, float o, boolean bl, boolean bl2, boolean bl3, boolean bl4, CallbackInfo ci) { - Ambience ambience = Modules.get().get(Ambience.class); - - if (ambience.isActive() && ambience.changeLightningColor.get()) { - Color color = ambience.lightningColor.get(); - - vertexConsumer.vertex(matrix4f, f + (bl ? o : -o), (float)(i * 16), g + (bl2 ? o : -o)).color(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); - vertexConsumer.vertex(matrix4f, h + (bl ? n : -n), (float)((i + 1) * 16), j + (bl2 ? n : -n)).color(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); - vertexConsumer.vertex(matrix4f, h + (bl3 ? n : -n), (float)((i + 1) * 16), j + (bl4 ? n : -n)).color(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); - vertexConsumer.vertex(matrix4f, f + (bl3 ? o : -o), (float)(i * 16), g + (bl4 ? o : -o)).color(color.r / 255f, color.g / 255f, color.b / 255f, 0.3F); - - ci.cancel(); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java index f3ae3a59a2..67cfa19475 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityAccessor.java @@ -5,24 +5,24 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.LivingEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.registry.tag.TagKey; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.tags.TagKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(LivingEntity.class) public interface LivingEntityAccessor { - @Invoker("swimUpward") + @Invoker("jumpInLiquid") void meteor$swimUpwards(TagKey fluid); @Accessor("jumping") boolean meteor$isJumping(); - @Accessor("jumpingCooldown") + @Accessor("noJumpDelay") int meteor$getJumpCooldown(); - @Accessor("jumpingCooldown") + @Accessor("noJumpDelay") void meteor$setJumpCooldown(int cooldown); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java index 892a8f9924..8e7883e620 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityMixin.java @@ -19,17 +19,17 @@ import meteordevelopment.meteorclient.systems.modules.player.OffhandCrash; import meteordevelopment.meteorclient.systems.modules.render.HandView; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.fluid.FluidState; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.util.Hand; -import net.minecraft.world.World; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; +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.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.FluidState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.*; @@ -40,53 +40,53 @@ @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends Entity { - public LivingEntityMixin(EntityType type, World world) { + public LivingEntityMixin(EntityType type, Level world) { super(type, world); } - @ModifyReturnValue(method = "canWalkOnFluid", at = @At("RETURN")) - private boolean onCanWalkOnFluid(boolean original, FluidState fluidState) { + @ModifyReturnValue(method = "canStandOnFluid", at = @At("RETURN")) + private boolean onCanWalkOnFluid(boolean original, FluidState fluid) { if ((Object) this != mc.player) return original; - CanWalkOnFluidEvent event = MeteorClient.EVENT_BUS.post(CanWalkOnFluidEvent.get(fluidState)); + CanWalkOnFluidEvent event = MeteorClient.EVENT_BUS.post(CanWalkOnFluidEvent.get(fluid)); return event.walkOnFluid; } @Inject(method = "spawnItemParticles", at = @At("HEAD"), cancellable = true) - private void spawnItemParticles(ItemStack stack, int count, CallbackInfo info) { + private void spawnItemParticles(ItemStack itemStack, int count, CallbackInfo ci) { NoRender noRender = Modules.get().get(NoRender.class); - if (noRender.noEatParticles() && stack.getComponents().contains(DataComponentTypes.FOOD)) info.cancel(); + if (noRender.noEatParticles() && itemStack.getComponents().has(DataComponents.FOOD)) ci.cancel(); } - @Inject(method = "onEquipStack", at = @At("HEAD"), cancellable = true) - private void onEquipStack(EquipmentSlot slot, ItemStack oldStack, ItemStack newStack, CallbackInfo info) { + @Inject(method = "onEquipItem", at = @At("HEAD"), cancellable = true) + private void onEquipStack(EquipmentSlot slot, ItemStack oldStack, ItemStack stack, CallbackInfo ci) { if ((Object) this != mc.player) return; if (Modules.get().get(OffhandCrash.class).isAntiCrash()) { - info.cancel(); + ci.cancel(); } } - @ModifyArg(method = "swingHand(Lnet/minecraft/util/Hand;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;swingHand(Lnet/minecraft/util/Hand;Z)V")) - private Hand setHand(Hand hand) { + @ModifyArg(method = "swing(Lnet/minecraft/world/InteractionHand;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;swing(Lnet/minecraft/world/InteractionHand;Z)V")) + private InteractionHand setHand(InteractionHand hand) { if ((Object) this != mc.player) return hand; HandView handView = Modules.get().get(HandView.class); if (handView.isActive()) { if (handView.swingMode.get() == HandView.SwingMode.None) return hand; - return handView.swingMode.get() == HandView.SwingMode.Offhand ? Hand.OFF_HAND : Hand.MAIN_HAND; + return handView.swingMode.get() == HandView.SwingMode.Offhand ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND; } return hand; } - @ModifyExpressionValue(method = "getHandSwingDuration", at = @At(value = "INVOKE", target = "Lnet/minecraft/component/type/SwingAnimationComponent;duration()I")) + @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.getPerspective().isFirstPerson() ? Modules.get().get(HandView.class).swingSpeed.get() : original; + return Modules.get().get(HandView.class).isActive() && mc.options.getCameraType().isFirstPerson() ? Modules.get().get(HandView.class).swingSpeed.get() : original; } - @ModifyReturnValue(method = "isGliding", at = @At("RETURN")) + @ModifyReturnValue(method = "isFallFlying", at = @At("RETURN")) private boolean isGlidingHook(boolean original) { if ((Object) this != mc.player) return original; @@ -100,7 +100,7 @@ private boolean isGlidingHook(boolean original) { @Unique private boolean previousElytra = false; - @Inject(method = "isGliding", at = @At("TAIL"), cancellable = true) + @Inject(method = "isFallFlying", at = @At("TAIL"), cancellable = true) public void recastOnLand(CallbackInfoReturnable cir) { boolean elytra = cir.getReturnValue(); ElytraFly elytraFly = Modules.get().get(ElytraFly.class); @@ -110,21 +110,21 @@ public void recastOnLand(CallbackInfoReturnable cir) { previousElytra = elytra; } - @ModifyReturnValue(method = "hasStatusEffect", at = @At("RETURN")) - private boolean hasStatusEffect(boolean original, RegistryEntry effect) { + @ModifyReturnValue(method = "hasEffect", at = @At("RETURN")) + private boolean hasEffect(boolean original, Holder effect) { if (effect == null || effect.value() == null) return original; if (Modules.get().get(NoStatusEffects.class).shouldBlock(effect.value())) return false; return original; } - @ModifyExpressionValue(method = "jump", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getYaw()F")) + @ModifyExpressionValue(method = "jumpFromGround", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;getYRot()F")) private float modifyGetYaw(float original) { if ((Object) this != mc.player) return original; if (!Modules.get().get(Sprint.class).rageSprint()) return original; - float forward = Math.signum(mc.player.forwardSpeed); - float strafe = 90 * Math.signum(mc.player.sidewaysSpeed); + float forward = Math.signum(mc.player.zza); + float strafe = 90 * Math.signum(mc.player.xxa); if (forward != 0) strafe *= (forward * 0.5f); original -= strafe; @@ -133,19 +133,19 @@ private float modifyGetYaw(float original) { return original; } - @ModifyConstant(method = "jump", constant = @Constant(floatValue = 1.0E-5F)) + @ModifyConstant(method = "jumpFromGround", constant = @Constant(floatValue = 1.0E-5F)) private float modifyJumpConstant(float original) { if ((Object) this != mc.player) return original; if (!Modules.get().isActive(HighJump.class)) return original; return -1; } - @ModifyExpressionValue(method = "jump", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;isSprinting()Z")) + @ModifyExpressionValue(method = "jumpFromGround", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;isSprinting()Z")) private boolean modifyIsSprinting(boolean original) { if ((Object) this != mc.player) return original; if (!Modules.get().get(Sprint.class).rageSprint()) return 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.forwardSpeed) > 1.0E-5F || Math.abs(mc.player.sidewaysSpeed) > 1.0E-5F); + return original && (Math.abs(mc.player.zza) > 1.0E-5F || Math.abs(mc.player.xxa) > 1.0E-5F); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java index 8c96fa2926..60a6236b70 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LivingEntityRendererMixin.java @@ -8,27 +8,27 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Chams; import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.meteorclient.systems.modules.render.NoRender; import meteordevelopment.meteorclient.utils.player.PlayerUtils; +import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.Model; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.command.ModelCommandRenderer; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.entity.state.LivingEntityRenderState; -import net.minecraft.client.render.state.CameraRenderState; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.scoreboard.Team; +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.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.scores.PlayerTeam; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -42,15 +42,15 @@ public abstract class LivingEntityRendererMixin> { // Freecam - @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;D)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;getCameraEntity()Lnet/minecraft/entity/Entity;")) + @ModifyExpressionValue(method = "shouldShowName(Lnet/minecraft/world/entity/LivingEntity;D)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getCameraEntity()Lnet/minecraft/world/entity/Entity;")) private Entity hasLabelGetCameraEntityProxy(Entity cameraEntity) { return Modules.get().isActive(Freecam.class) ? null : cameraEntity; } // Player model rendering in main menu - @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;D)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getScoreboardTeam()Lnet/minecraft/scoreboard/Team;")) - private Team hasLabelClientPlayerEntityGetScoreboardTeamProxy(Team team) { + @ModifyExpressionValue(method = "shouldShowName(Lnet/minecraft/world/entity/LivingEntity;D)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;getTeam()Lnet/minecraft/world/scores/PlayerTeam;")) + private PlayerTeam hasLabelClientPlayerEntityGetScoreboardTeamProxy(PlayerTeam team) { return (mc.player == null) ? null : team; } @@ -60,15 +60,16 @@ private Team hasLabelClientPlayerEntityGetScoreboardTeamProxy(Team team) { private Chams chams; @Inject(method = "", at = @At("RETURN")) - private void init$chams(CallbackInfo info) { + private void init$chams(CallbackInfo ci) { chams = Modules.get().get(Chams.class); } // Chams - player color - @WrapWithCondition(method = "render(Lnet/minecraft/client/render/entity/state/LivingEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;submitModel(Lnet/minecraft/client/model/Model;Ljava/lang/Object;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/RenderLayer;IIILnet/minecraft/client/texture/Sprite;ILnet/minecraft/client/render/command/ModelCommandRenderer$CrumblingOverlayCommand;)V")) - private boolean render$render(OrderedRenderCommandQueue instance, Model model, TState state, MatrixStack matrixStack, RenderLayer renderLayer, int light, int overlay, int mixColor, Sprite sprite, int outlineColor, ModelCommandRenderer.CrumblingOverlayCommand crumblingOverlayCommand) { - if (!chams.isActive() || !chams.players.get() || !(((IEntityRenderState) state).meteor$getEntity() instanceof PlayerEntity player)) return true; + @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) { + 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); @@ -77,9 +78,9 @@ private Team hasLabelClientPlayerEntityGetScoreboardTeamProxy(Team team) { // Chams - Player texture - @ModifyReturnValue(method = "getRenderLayer", at = @At("RETURN")) - private RenderLayer getRenderPlayer(RenderLayer original, S state, boolean showBody, boolean translucent, boolean showOutline) { - if (!chams.isActive() || !(((IEntityRenderState) state).meteor$getEntity() instanceof PlayerEntity player)) + @ModifyReturnValue(method = "getRenderType", at = @At("RETURN")) + private RenderType getRenderPlayer(RenderType original, S state, boolean isBodyVisible, boolean forceTransparent, boolean appearGlowing) { + if (!chams.isActive() || !(((IEntityRenderState) state).meteor$getEntity() instanceof Player player)) return original; if (!chams.players.get() || chams.playersTexture.get()) @@ -87,17 +88,17 @@ private RenderLayer getRenderPlayer(RenderLayer original, S state, boolean showB if (chams.ignoreSelf.get() && player == mc.player) return original; - return RenderLayers.itemEntityTranslucentCull(Chams.BLANK); + return RenderTypes.itemTranslucent(Chams.BLANK); } // Chams - Through walls - @Inject(method = "render(Lnet/minecraft/client/render/entity/state/LivingEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At("HEAD"), cancellable = true) - private void render$Head(S state, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState arg, CallbackInfo ci) { + @Inject(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("HEAD"), cancellable = true) + private void render$Head(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { Entity entity = ((IEntityRenderState) state).meteor$getEntity(); if (!(entity instanceof LivingEntity livingEntity)) return; - if (Modules.get().get(NoRender.class).noDeadEntities() && livingEntity.isDead()) ci.cancel(); + if (Modules.get().get(NoRender.class).noDeadEntities() && livingEntity.isDeadOrDying()) ci.cancel(); if (chams.shouldRender(entity)) { glEnable(GL_POLYGON_OFFSET_FILL); @@ -105,8 +106,8 @@ private RenderLayer getRenderPlayer(RenderLayer original, S state, boolean showB } } - @Inject(method = "render(Lnet/minecraft/client/render/entity/state/LivingEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V", at = @At("TAIL")) - private void render$Tail(S state, MatrixStack matrixStack, OrderedRenderCommandQueue orderedRenderCommandQueue, CameraRenderState arg, CallbackInfo ci) { + @Inject(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("TAIL")) + private void render$Tail(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera, CallbackInfo ci) { Entity entity = ((IEntityRenderState) state).meteor$getEntity(); if (!(entity instanceof LivingEntity livingEntity)) return; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerAccessor.java similarity index 60% rename from src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerAccessor.java index fb58bbdd60..65767c1ff5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/AbstractBlockAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerAccessor.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.block.AbstractBlock; +import net.minecraft.client.player.LocalPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(AbstractBlock.class) -public interface AbstractBlockAccessor { - @Accessor("collidable") - boolean meteor$isCollidable(); +@Mixin(LocalPlayer.class) +public interface LocalPlayerAccessor { + @Accessor("positionReminder") + void meteor$setPositionReminder(int ticks); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java new file mode 100644 index 0000000000..63f61adf73 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/LocalPlayerMixin.java @@ -0,0 +1,189 @@ +/* + * 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.llamalad7.mixinextras.injector.v2.WrapWithCondition; +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; +import meteordevelopment.meteorclient.systems.modules.movement.*; +import meteordevelopment.meteorclient.systems.modules.player.LiquidInteract; +import meteordevelopment.meteorclient.systems.modules.player.NoMiningTrace; +import meteordevelopment.meteorclient.systems.modules.player.Portals; +import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.player.ClientInput; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.PlayerRideableJumping; +import net.minecraft.world.entity.player.Input; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import org.objectweb.asm.Opcodes; +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; + +@Mixin(LocalPlayer.class) +public abstract class LocalPlayerMixin extends AbstractClientPlayer { + @Shadow + public ClientInput input; + + public LocalPlayerMixin(ClientLevel world, GameProfile profile) { + super(world, profile); + } + + @Inject(method = "drop", at = @At("HEAD"), cancellable = true) + private void onDrop(boolean all, CallbackInfoReturnable cir) { + if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(getMainHandItem())).isCancelled()) + cir.setReturnValue(false); + } + + @ModifyExpressionValue(method = "handlePortalTransitionEffect", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Minecraft;screen:Lnet/minecraft/client/gui/screens/Screen;", opcode = Opcodes.GETFIELD)) + private Screen modifyPortalTransitionEffect(Screen original) { + if (Modules.get().isActive(Portals.class)) return null; + return original; + } + + @ModifyExpressionValue(method = "modifyInput", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;isUsingItem()Z")) + private boolean redirectUsingItem(boolean isUsingItem) { + if (Modules.get().get(NoSlow.class).items()) return false; + return isUsingItem; + } + + @Inject(method = "isShiftKeyDown", at = @At("HEAD"), cancellable = true) + private void onIsShiftKeyDown(CallbackInfoReturnable cir) { + if (Modules.get().get(Scaffold.class).scaffolding()) cir.setReturnValue(false); + if (Modules.get().get(Flight.class).noSneak()) cir.setReturnValue(false); + } + + @Inject(method = "isMovingSlowly", at = @At("HEAD"), cancellable = true) + private void onIsMovingSlowly(CallbackInfoReturnable cir) { + if (Modules.get().get(NoSlow.class).sneaking()) { + cir.setReturnValue(isVisuallyCrawling()); + } + } + + @Inject(method = "moveTowardsClosestSpace", at = @At("HEAD"), cancellable = true) + private void onMoveTowardsClosestSpace(double x, double z, CallbackInfo ci) { + Velocity velocity = Modules.get().get(Velocity.class); + if (velocity.isActive() && velocity.blocks.get()) { + ci.cancel(); + } + } + + @ModifyExpressionValue(method = "tick", 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( + original.forward(), + original.backward(), + original.left(), + original.right(), + original.jump(), + true, + original.sprint() + ); + } + return original; + } + + @Inject(method = "aiStep", at = @At("HEAD")) + private void preAiStep(CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(PlayerTickMovementEvent.get()); + } + + @ModifyReturnValue(method = "getJumpRidingScale", at = @At("RETURN")) + private float modifyJumpRidingScale(float original) { + if (Modules.get().get(EntityControl.class).maxJump()) return 1f; + return original; + } + + @Inject(method = "jumpableVehicle", at = @At("RETURN"), cancellable = true) + private void changeJumpableVehicle(CallbackInfoReturnable cir) { + if (Modules.get().get(EntityControl.class).cancelJump()) cir.setReturnValue(null); + } + + @ModifyReturnValue(method = "pick", at = @At("RETURN")) + private static HitResult onUpdateTargetedEntity(HitResult original, @Local(name = "blockHitResult") HitResult blockHitResult) { + if (original instanceof EntityHitResult ehr) { + if (Modules.get().get(NoMiningTrace.class).canWork(ehr.getEntity()) && blockHitResult.getType() == HitResult.Type.BLOCK) { + return blockHitResult; + } else if (ehr.getEntity() instanceof FakePlayerEntity fakePlayer && fakePlayer.noHit) { + return blockHitResult; + } + } + + return original; + } + + @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) { + if (!Modules.get().isActive(LiquidInteract.class)) return original; + if (original.getType() != HitResult.Type.MISS) return original; + + return cameraEntity.pick(maxDistance, partialTicks, true); + } + + // Sprint + + @ModifyExpressionValue(method = "canStartSprinting", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;hasForwardImpulse()Z")) + private boolean modifyIsWalking(boolean original) { + if (!Modules.get().get(Sprint.class).rageSprint()) return original; + + float forwards = Math.abs(zza); + float sideways = Math.abs(xxa); + + return (isUnderWater() ? (forwards > 1.0E-5F || sideways > 1.0E-5F) : (forwards > 0.8 || sideways > 0.8)); + } + + @ModifyExpressionValue(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;hasForwardImpulse()Z")) + private boolean modifyAiStep(boolean original) { + if (!Modules.get().get(Sprint.class).rageSprint()) return original; + + return Math.abs(xxa) > 1.0E-5F || Math.abs(zza) > 1.0E-5F; + } + + @WrapWithCondition(method = "aiStep", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;setSprinting(Z)V", ordinal = 3)) + private boolean wrapSetSprinting(LocalPlayer instance, boolean b) { + Sprint s = Modules.get().get(Sprint.class); + + return !s.rageSprint() || s.unsprintInWater() && isInWater(); + } + + // Rotations + + @Inject(method = "sendPosition", at = @At("HEAD")) + 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)) + private void onTickHasVehicleBeforeSendPackets(CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Pre.get()); + } + + @Inject(method = "sendPosition", at = @At("TAIL")) + 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)) + private void onTickHasVehicleAfterSendPackets(CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(SendMovementPacketsEvent.Post.get()); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java index 9a50e5e51b..cd417bfd4c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MapRendererMixin.java @@ -6,13 +6,13 @@ package meteordevelopment.meteorclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.render.MapRenderState; -import net.minecraft.client.render.MapRenderer; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.map.MapDecoration; +import net.minecraft.client.renderer.MapRenderer; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.state.MapRenderState; +import net.minecraft.world.level.saveddata.maps.MapDecoration; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -22,13 +22,13 @@ @Mixin(MapRenderer.class) public abstract class MapRendererMixin { - @ModifyExpressionValue(method = "draw", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/MapRenderState;decorations:Ljava/util/List;")) + @ModifyExpressionValue(method = "render", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/state/MapRenderState;decorations:Ljava/util/List;")) private List getIconsProxy(List original) { return (Modules.get().get(NoRender.class).noMapMarkers()) ? List.of() : original; } - @Inject(method = "draw", at = @At("HEAD"), cancellable = true) - private void onDraw(MapRenderState state, MatrixStack matrices, OrderedRenderCommandQueue queue, boolean skipRenderingDecorations, int light, CallbackInfo ci) { + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + private void onDraw(MapRenderState mapRenderState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, boolean showOnlyFrame, int lightCoords, CallbackInfo ci) { if (Modules.get().get(NoRender.class).noMapContents()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MapTextureManagerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MapTextureManagerAccessor.java index ff2bf4924f..04863b5a49 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MapTextureManagerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MapTextureManagerAccessor.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.texture.MapTextureManager; -import net.minecraft.component.type.MapIdComponent; -import net.minecraft.item.map.MapState; +import net.minecraft.client.resources.MapTextureManager; +import net.minecraft.world.level.saveddata.maps.MapId; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(MapTextureManager.class) public interface MapTextureManagerAccessor { - @Invoker("getMapTexture") - MapTextureManager.MapTexture meteor$invokeGetMapTexture(MapIdComponent id, MapState state); + @Invoker("getOrCreateMapInstance") + MapTextureManager.MapInstance meteor$invokeGetOrCreateMapInstance(MapId id, MapItemSavedData state); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.java deleted file mode 100644 index 6643158efc..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MessageHandlerMixin.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.mojang.authlib.GameProfile; -import meteordevelopment.meteorclient.mixininterface.IMessageHandler; -import net.minecraft.client.network.message.MessageHandler; -import net.minecraft.network.message.MessageType; -import net.minecraft.network.message.SignedMessage; -import net.minecraft.text.Text; -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.CallbackInfoReturnable; - -import java.time.Instant; - -@Mixin(MessageHandler.class) -public abstract class MessageHandlerMixin implements IMessageHandler { - @Unique - private GameProfile sender; - - @Inject(method = "processChatMessageInternal", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", shift = At.Shift.BEFORE)) - private void onProcessChatMessageInternal_beforeAddMessage(MessageType.Parameters params, SignedMessage message, Text decorated, GameProfile sender, boolean onlyShowSecureChat, Instant receptionTimestamp, CallbackInfoReturnable info) { - this.sender = sender; - } - - @Inject(method = "processChatMessageInternal", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/ChatHud;addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", shift = At.Shift.AFTER)) - private void onProcessChatMessageInternal_afterAddMessage(MessageType.Parameters params, SignedMessage message, Text decorated, GameProfile sender, boolean onlyShowSecureChat, Instant receptionTimestamp, CallbackInfoReturnable info) { - this.sender = null; - } - - @Override - public GameProfile meteor$getSender() { - return sender; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftAccessor.java new file mode 100644 index 0000000000..95a5a4b644 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftAccessor.java @@ -0,0 +1,78 @@ +/* + * 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.authlib.minecraft.UserApiService; +import com.mojang.authlib.yggdrasil.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.multiplayer.chat.report.ReportingContext; +import net.minecraft.client.resources.SkinManager; +import net.minecraft.server.Services; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.concurrent.CompletableFuture; + +@Mixin(Minecraft.class) +public interface MinecraftAccessor { + @Accessor("fps") + static int meteor$getFps() { + return 0; + } + + @Mutable + @Accessor("user") + void meteor$setUser(User session); + + @Accessor("reloadStateTracker") + ResourceLoadStateTracker meteor$getReloadStateTracker(); + + @Accessor("missTime") + int meteor$getMissTime(); + + @Accessor("missTime") + void meteor$setMissTime(int attackCooldown); + + @Invoker("startAttack") + boolean meteor$leftClick(); + + @Mutable + @Accessor("profileKeyPairManager") + void meteor$setProfileKeyPairManager(ProfileKeyPairManager keys); + + @Mutable + @Accessor("userApiService") + void meteor$setUserApiService(UserApiService apiService); + + @Mutable + @Accessor("skinManager") + void meteor$setSkinManager(SkinManager skinProvider); + + @Mutable + @Accessor("playerSocialManager") + void meteor$setPlayerSocialManager(PlayerSocialManager socialInteractionsManager); + + @Mutable + @Accessor("reportingContext") + void meteor$setReportingContext(ReportingContext abuseReportContext); + + @Mutable + @Accessor("profileFuture") + void meteor$setProfileFuture(CompletableFuture future); + + @Mutable + @Accessor("services") + void meteor$setServices(Services apiServices); + + @Invoker("handleKeybinds") + void meteor$handleInputEvents(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java deleted file mode 100644 index 3be4d25c83..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientAccessor.java +++ /dev/null @@ -1,78 +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.authlib.minecraft.UserApiService; -import com.mojang.authlib.yggdrasil.ProfileResult; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.SocialInteractionsManager; -import net.minecraft.client.resource.ResourceReloadLogger; -import net.minecraft.client.session.ProfileKeys; -import net.minecraft.client.session.Session; -import net.minecraft.client.session.report.AbuseReportContext; -import net.minecraft.client.texture.PlayerSkinProvider; -import net.minecraft.util.ApiServices; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.concurrent.CompletableFuture; - -@Mixin(MinecraftClient.class) -public interface MinecraftClientAccessor { - @Accessor("currentFps") - static int meteor$getFps() { - return 0; - } - - @Mutable - @Accessor("session") - void meteor$setSession(Session session); - - @Accessor("resourceReloadLogger") - ResourceReloadLogger meteor$getResourceReloadLogger(); - - @Accessor("attackCooldown") - int meteor$getAttackCooldown(); - - @Accessor("attackCooldown") - void meteor$setAttackCooldown(int attackCooldown); - - @Invoker("doAttack") - boolean meteor$leftClick(); - - @Mutable - @Accessor("profileKeys") - void meteor$setProfileKeys(ProfileKeys keys); - - @Mutable - @Accessor("userApiService") - void meteor$setUserApiService(UserApiService apiService); - - @Mutable - @Accessor("skinProvider") - void meteor$setSkinProvider(PlayerSkinProvider skinProvider); - - @Mutable - @Accessor("socialInteractionsManager") - void meteor$setSocialInteractionsManager(SocialInteractionsManager socialInteractionsManager); - - @Mutable - @Accessor("abuseReportContext") - void meteor$setAbuseReportContext(AbuseReportContext abuseReportContext); - - @Mutable - @Accessor("gameProfileFuture") - void meteor$setGameProfileFuture(CompletableFuture future); - - @Mutable - @Accessor("apiServices") - void meteor$setApiServices(ApiServices apiServices); - - @Invoker("handleInputEvents") - void meteor$handleInputEvents(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java deleted file mode 100644 index 56ee42ed5e..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftClientMixin.java +++ /dev/null @@ -1,322 +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.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.llamalad7.mixinextras.sugar.Local; -import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.entity.player.DoAttackEvent; -import meteordevelopment.meteorclient.events.entity.player.DoItemUseEvent; -import meteordevelopment.meteorclient.events.entity.player.ItemUseCrosshairTargetEvent; -import meteordevelopment.meteorclient.events.game.GameLeftEvent; -import meteordevelopment.meteorclient.events.game.OpenScreenEvent; -import meteordevelopment.meteorclient.events.game.ResolutionChangedEvent; -import meteordevelopment.meteorclient.events.game.ResourcePacksReloadedEvent; -import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.gui.WidgetScreen; -import meteordevelopment.meteorclient.mixininterface.IMinecraftClient; -import meteordevelopment.meteorclient.systems.config.Config; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; -import meteordevelopment.meteorclient.systems.modules.movement.GUIMove; -import meteordevelopment.meteorclient.systems.modules.player.FastUse; -import meteordevelopment.meteorclient.systems.modules.player.Multitask; -import meteordevelopment.meteorclient.systems.modules.render.ESP; -import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; -import meteordevelopment.meteorclient.utils.Utils; -import meteordevelopment.meteorclient.utils.misc.CPSUtils; -import meteordevelopment.meteorclient.utils.misc.MeteorStarscript; -import meteordevelopment.meteorclient.utils.network.OnlinePlayers; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.Mouse; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.Window; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.profiler.Profilers; -import org.jetbrains.annotations.Nullable; -import org.meteordev.starscript.Script; -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.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.concurrent.CompletableFuture; - -@Mixin(value = MinecraftClient.class, priority = 1001) -public abstract class MinecraftClientMixin implements IMinecraftClient { - @Unique private boolean doItemUseCalled; - @Unique private boolean rightClick; - @Unique private long lastTime; - @Unique private boolean firstFrame; - - @Shadow public ClientWorld world; - @Shadow @Final public Mouse mouse; - @Shadow @Final private Window window; - @Shadow public Screen currentScreen; - @Shadow @Final public GameOptions options; - - @Shadow protected abstract void doItemUse(); - - @Shadow - @Nullable - public ClientPlayerInteractionManager interactionManager; - - @Shadow - private int itemUseCooldown; - - @Shadow - @Nullable - public ClientPlayerEntity player; - - @Shadow - @Final - @Mutable - private Framebuffer framebuffer; - - @Shadow - protected abstract void handleBlockBreaking(boolean breaking); - - @Inject(method = "", at = @At("TAIL")) - private void onInit(CallbackInfo info) { - MeteorClient.INSTANCE.onInitializeClient(); - firstFrame = true; - } - - @Inject(at = @At("HEAD"), method = "tick") - private void onPreTick(CallbackInfo info) { - OnlinePlayers.update(); - - doItemUseCalled = false; - - Profilers.get().push(MeteorClient.MOD_ID + "_pre_update"); - MeteorClient.EVENT_BUS.post(TickEvent.Pre.get()); - Profilers.get().pop(); - - if (rightClick && !doItemUseCalled && interactionManager != null) doItemUse(); - rightClick = false; - } - - @Inject(at = @At("TAIL"), method = "tick") - private void onTick(CallbackInfo info) { - Profilers.get().push(MeteorClient.MOD_ID + "_post_update"); - MeteorClient.EVENT_BUS.post(TickEvent.Post.get()); - Profilers.get().pop(); - } - - @Inject(method = "doAttack", at = @At("HEAD"), cancellable = true) - private void onAttack(CallbackInfoReturnable cir) { - CPSUtils.onAttack(); - if (MeteorClient.EVENT_BUS.post(DoAttackEvent.get()).isCancelled()) cir.cancel(); - } - - @Inject(method = "doItemUse", at = @At("HEAD")) - private void onDoItemUse(CallbackInfo info) { - doItemUseCalled = true; - } - - @Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;ZZ)V", at = @At("HEAD")) - private void onDisconnect(Screen screen, boolean transferring, boolean stopSound, CallbackInfo info) { - if (world != null) { - MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); - } - } - - @Inject(method = "setScreen", at = @At("HEAD"), cancellable = true) - private void onSetScreen(Screen screen, CallbackInfo info) { - if (screen instanceof WidgetScreen) screen.mouseMoved(mouse.getX() * window.getScaleFactor(), mouse.getY() * window.getScaleFactor()); - - OpenScreenEvent event = OpenScreenEvent.get(screen); - MeteorClient.EVENT_BUS.post(event); - - if (event.isCancelled()) info.cancel(); - } - - @WrapOperation(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/KeyBinding;unpressAll()V")) - private void onSetScreenKeyBindingUnpressAll(Operation op) { - Modules modules = Modules.get(); - if (modules == null) { - op.call(); - return; - } - - GUIMove guimove = modules.get(GUIMove.class); - if (guimove == null || !guimove.isActive() || guimove.skip()) { - op.call(); - return; - } - - GameOptions options = MeteorClient.mc.options; - for (KeyBinding kb : KeyBindingAccessor.getKeysById().values()) { - if (kb == options.forwardKey) continue; - if (kb == options.leftKey) continue; - if (kb == options.rightKey) continue; - if (kb == options.backKey) continue; - if (guimove.sneak.get() && kb == options.sneakKey) continue; - if (guimove.sprint.get() && kb == options.sprintKey) continue; - if (guimove.jump.get() && kb == options.jumpKey) continue; - ((KeyBindingAccessor) kb).meteor$invokeReset(); - } - } - - @Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isItemEnabled(Lnet/minecraft/resource/featuretoggle/FeatureSet;)Z")) - private void onDoItemUseHand(CallbackInfo ci, @Local ItemStack itemStack) { - FastUse fastUse = Modules.get().get(FastUse.class); - if (fastUse.isActive()) { - itemUseCooldown = fastUse.getItemUseCooldown(itemStack); - } - } - - @Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Hand;values()[Lnet/minecraft/util/Hand;"), cancellable = true) - private void onDoItemUseBeforeHands(CallbackInfo ci) { - if (MeteorClient.EVENT_BUS.post(DoItemUseEvent.get()).isCancelled()) ci.cancel(); - } - - @ModifyExpressionValue(method = "doItemUse", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;crosshairTarget:Lnet/minecraft/util/hit/HitResult;", ordinal = 1)) - private HitResult doItemUseMinecraftClientCrosshairTargetProxy(HitResult original) { - return MeteorClient.EVENT_BUS.post(ItemUseCrosshairTargetEvent.get(original)).target; - } - - @ModifyReturnValue(method = "reloadResources(ZLnet/minecraft/client/MinecraftClient$LoadingContext;)Ljava/util/concurrent/CompletableFuture;", at = @At("RETURN")) - private CompletableFuture onReloadResourcesNewCompletableFuture(CompletableFuture original) { - return original.thenRun(() -> MeteorClient.EVENT_BUS.post(ResourcePacksReloadedEvent.get())); - } - - @ModifyArg(method = "updateWindowTitle", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/Window;setTitle(Ljava/lang/String;)V")) - private String setTitle(String original) { - if (Config.get() == null || !Config.get().customWindowTitle.get()) return original; - - String customTitle = Config.get().customWindowTitleText.get(); - Script script = MeteorStarscript.compile(customTitle); - - if (script != null) { - String title = MeteorStarscript.run(script); - if (title != null) customTitle = title; - } - - return customTitle; - } - - // Have to add this condition if we want to draw back a bow using packets, without it getting cancelled by vanilla code - @WrapWithCondition(method = "handleInputEvents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;stopUsingItem(Lnet/minecraft/entity/player/PlayerEntity;)V")) - private boolean wrapStopUsing(ClientPlayerInteractionManager instance, PlayerEntity player) { - return HB$stopUsingItem(); - } - - @Unique - private boolean HB$stopUsingItem() { - HighwayBuilder b = Modules.get().get(HighwayBuilder.class); - return !b.isActive() || !b.drawingBow; - } - - @Inject(method = "onResolutionChanged", at = @At("TAIL")) - private void onResolutionChanged(CallbackInfo info) { - MeteorClient.EVENT_BUS.post(ResolutionChangedEvent.get()); - } - - // Time delta - - @Inject(method = "render", at = @At("HEAD")) - private void onRender(CallbackInfo info) { - long time = System.currentTimeMillis(); - - if (firstFrame) { - lastTime = time; - firstFrame = false; - } - - Utils.frameTime = (time - lastTime) / 1000.0; - lastTime = time; - } - - // Multitask - - @ModifyExpressionValue(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;isBreakingBlock()Z")) - private boolean doItemUseModifyIsBreakingBlock(boolean original) { - return !Modules.get().isActive(Multitask.class) && original; - } - - @ModifyExpressionValue(method = "handleBlockBreaking", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z")) - private boolean handleBlockBreakingModifyIsUsingItem(boolean original) { - return !Modules.get().isActive(Multitask.class) && original; - } - - @ModifyExpressionValue(method = "handleInputEvents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z", ordinal = 0)) - private boolean handleInputEventsModifyIsUsingItem(boolean original) { - return !Modules.get().get(Multitask.class).attackingEntities() && original; - } - - @Inject(method = "handleInputEvents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isUsingItem()Z", ordinal = 0, shift = At.Shift.BEFORE)) - private void handleInputEventsInjectStopUsingItem(CallbackInfo info) { - if (Modules.get().get(Multitask.class).attackingEntities() && player.isUsingItem()) { - if (!options.useKey.isPressed() && HB$stopUsingItem()) interactionManager.stopUsingItem(player); - //noinspection StatementWithEmptyBody - while (options.useKey.wasPressed()); - } - } - - // Glow esp - - @ModifyReturnValue(method = "hasOutline", at = @At("RETURN")) - private boolean hasOutlineModifyIsOutline(boolean original, Entity entity) { - ESP esp = Modules.get().get(ESP.class); - if (esp == null) return original; - if (!esp.isGlow() || esp.shouldSkip(entity)) return original; - - return esp.getColor(entity) != null || original; - } - - - // faster inputs - - @Unique - private boolean isBreaking = false; - - @WrapWithCondition(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;handleInputEvents()V")) - private boolean wrapHandleInputEvents(MinecraftClient instance) { - return !Modules.get().get(InventoryTweaks.class).frameInput(); - } - - @WrapWithCondition(method = "handleInputEvents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;handleBlockBreaking(Z)V")) - private boolean wrapHandleBlockBreaking(MinecraftClient instance, boolean breaking) { - isBreaking = breaking; - return !Modules.get().get(InventoryTweaks.class).frameInput(); - } - - @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;handleInputEvents()V", shift = At.Shift.AFTER)) - private void afterHandleInputEvents(CallbackInfo ci) { - if (!Modules.get().get(InventoryTweaks.class).frameInput()) return; - - handleBlockBreaking(isBreaking); - isBreaking = false; - } - - // Interface - - @Override - public void meteor$rightClick() { - rightClick = true; - } - - @Override - public void meteor$setFramebuffer(Framebuffer framebuffer) { - this.framebuffer = framebuffer; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftMixin.java new file mode 100644 index 0000000000..bed2584a40 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftMixin.java @@ -0,0 +1,336 @@ +/* + * 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.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.pipeline.RenderTarget; +import com.mojang.blaze3d.platform.Window; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.entity.player.DoAttackEvent; +import meteordevelopment.meteorclient.events.entity.player.DoItemUseEvent; +import meteordevelopment.meteorclient.events.entity.player.ItemUseCrosshairTargetEvent; +import meteordevelopment.meteorclient.events.game.GameLeftEvent; +import meteordevelopment.meteorclient.events.game.OpenScreenEvent; +import meteordevelopment.meteorclient.events.game.ResolutionChangedEvent; +import meteordevelopment.meteorclient.events.game.ResourcePacksReloadedEvent; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.gui.WidgetScreen; +import meteordevelopment.meteorclient.mixininterface.IMinecraft; +import meteordevelopment.meteorclient.systems.config.Config; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.misc.InventoryTweaks; +import meteordevelopment.meteorclient.systems.modules.movement.GUIMove; +import meteordevelopment.meteorclient.systems.modules.player.FastUse; +import meteordevelopment.meteorclient.systems.modules.player.Multitask; +import meteordevelopment.meteorclient.systems.modules.render.ESP; +import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder; +import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.misc.CPSUtils; +import meteordevelopment.meteorclient.utils.misc.MeteorStarscript; +import meteordevelopment.meteorclient.utils.network.OnlinePlayers; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.MouseHandler; +import net.minecraft.client.Options; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.MultiPlayerGameMode; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.util.profiling.Profiler; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; +import org.meteordev.starscript.Script; +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.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.CompletableFuture; + +@Mixin(value = Minecraft.class, priority = 1001) +public abstract class MinecraftMixin implements IMinecraft { + @Unique + private boolean startUseItemCalled; + @Unique + private boolean rightClick; + @Unique + private long lastTime; + @Unique + private boolean firstFrame; + + @Shadow + public ClientLevel level; + @Shadow + @Final + public MouseHandler mouseHandler; + @Shadow + @Final + private Window window; + @Shadow + public Screen screen; + @Shadow + @Final + public Options options; + + @Shadow + protected abstract void startUseItem(); + + @Shadow + @Nullable + public MultiPlayerGameMode gameMode; + + @Shadow + private int rightClickDelay; + + @Shadow + @Nullable + public LocalPlayer player; + + @Shadow + @Final + @Mutable + private RenderTarget mainRenderTarget; + + @Shadow + protected abstract void continueAttack(boolean down); + + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo ci) { + MeteorClient.INSTANCE.onInitializeClient(); + firstFrame = true; + } + + @Inject(at = @At("HEAD"), method = "tick") + private void onPreTick(CallbackInfo ci) { + OnlinePlayers.update(); + + startUseItemCalled = false; + + Profiler.get().push(MeteorClient.MOD_ID + "_pre_update"); + MeteorClient.EVENT_BUS.post(TickEvent.Pre.get()); + Profiler.get().pop(); + + if (rightClick && !startUseItemCalled && gameMode != null) startUseItem(); + rightClick = false; + } + + @Inject(at = @At("TAIL"), method = "tick") + private void onTick(CallbackInfo ci) { + Profiler.get().push(MeteorClient.MOD_ID + "_post_update"); + MeteorClient.EVENT_BUS.post(TickEvent.Post.get()); + Profiler.get().pop(); + } + + @Inject(method = "startAttack", at = @At("HEAD"), cancellable = true) + private void onStartAttack(CallbackInfoReturnable cir) { + CPSUtils.onAttack(); + if (MeteorClient.EVENT_BUS.post(DoAttackEvent.get()).isCancelled()) cir.cancel(); + } + + @Inject(method = "startUseItem", at = @At("HEAD")) + private void onStartUseItem(CallbackInfo ci) { + startUseItemCalled = true; + } + + @Inject(method = "disconnect(Lnet/minecraft/client/gui/screens/Screen;ZZ)V", at = @At("HEAD")) + private void onDisconnect(Screen screen, boolean keepResourcePacks, boolean stopSound, CallbackInfo ci) { + if (level != null) { + MeteorClient.EVENT_BUS.post(GameLeftEvent.get()); + } + } + + @Inject(method = "setScreen", at = @At("HEAD"), cancellable = true) + private void onSetScreen(Screen screen, CallbackInfo ci) { + if (screen instanceof WidgetScreen) + screen.mouseMoved(mouseHandler.xpos() * window.getGuiScale(), mouseHandler.ypos() * window.getGuiScale()); + + OpenScreenEvent event = OpenScreenEvent.get(screen); + MeteorClient.EVENT_BUS.post(event); + + if (event.isCancelled()) ci.cancel(); + } + + @WrapOperation(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/KeyMapping;releaseAll()V")) + private void onSetScreenKeyBindingUnpressAll(Operation op) { + Modules modules = Modules.get(); + if (modules == null) { + op.call(); + return; + } + + GUIMove guimove = modules.get(GUIMove.class); + if (guimove == null || !guimove.isActive() || guimove.skip()) { + op.call(); + return; + } + + Options options = MeteorClient.mc.options; + for (KeyMapping kb : KeyMappingAccessor.getKeysById().values()) { + if (kb == options.keyUp) continue; + if (kb == options.keyLeft) continue; + if (kb == options.keyRight) continue; + if (kb == options.keyDown) continue; + if (guimove.sneak.get() && kb == options.keyShift) continue; + if (guimove.sprint.get() && kb == options.keySprint) continue; + if (guimove.jump.get() && kb == options.keyJump) continue; + ((KeyMappingAccessor) kb).meteor$invokeRelease(); + } + } + + @Inject(method = "startUseItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;isItemEnabled(Lnet/minecraft/world/flag/FeatureFlagSet;)Z")) + private void onStartUseItemHand(CallbackInfo ci, @Local(name = "heldItem") ItemStack heldItem) { + FastUse fastUse = Modules.get().get(FastUse.class); + if (fastUse.isActive()) { + rightClickDelay = fastUse.getItemUseCooldown(heldItem); + } + } + + @Inject(method = "startUseItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/InteractionHand;values()[Lnet/minecraft/world/InteractionHand;"), cancellable = true) + private void onStartUseItemBeforeHands(CallbackInfo ci) { + if (MeteorClient.EVENT_BUS.post(DoItemUseEvent.get()).isCancelled()) ci.cancel(); + } + + @ModifyExpressionValue(method = "startUseItem", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Minecraft;hitResult:Lnet/minecraft/world/phys/HitResult;", ordinal = 1)) + private HitResult startUseItemMinecraftClientCrosshairTargetProxy(HitResult original) { + return MeteorClient.EVENT_BUS.post(ItemUseCrosshairTargetEvent.get(original)).target; + } + + @ModifyReturnValue(method = "reloadResourcePacks(ZLnet/minecraft/client/Minecraft$GameLoadCookie;)Ljava/util/concurrent/CompletableFuture;", at = @At("RETURN")) + private CompletableFuture onReloadResourcePacksNewCompletableFuture(CompletableFuture original) { + return original.thenRun(() -> MeteorClient.EVENT_BUS.post(ResourcePacksReloadedEvent.get())); + } + + @ModifyArg(method = "updateTitle", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/Window;setTitle(Ljava/lang/String;)V")) + private String setTitle(String original) { + if (Config.get() == null || !Config.get().customWindowTitle.get()) return original; + + String customTitle = Config.get().customWindowTitleText.get(); + Script script = MeteorStarscript.compile(customTitle); + + if (script != null) { + String title = MeteorStarscript.run(script); + if (title != null) customTitle = title; + } + + return customTitle; + } + + // Have to add this condition if we want to draw back a bow using packets, without it getting cancelled by vanilla code + @WrapWithCondition(method = "handleKeybinds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;releaseUsingItem(Lnet/minecraft/world/entity/player/Player;)V")) + private boolean wrapStopUsing(MultiPlayerGameMode instance, Player player) { + return HB$stopUsingItem(); + } + + @Unique + private boolean HB$stopUsingItem() { + HighwayBuilder b = Modules.get().get(HighwayBuilder.class); + return !b.isActive() || !b.drawingBow; + } + + @Inject(method = "resizeGui", at = @At("TAIL")) + private void onResizeGui(CallbackInfo ci) { + MeteorClient.EVENT_BUS.post(ResolutionChangedEvent.get()); + } + + // Time delta + + @Inject(method = "runTick", at = @At("HEAD")) + private void onRunTick(CallbackInfo ci) { + long time = System.currentTimeMillis(); + + if (firstFrame) { + lastTime = time; + firstFrame = false; + } + + Utils.frameTime = (time - lastTime) / 1000.0; + lastTime = time; + } + + // Multitask + + @ModifyExpressionValue(method = "startUseItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;isDestroying()Z")) + private boolean startUseItemModifyIsBreakingBlock(boolean original) { + return !Modules.get().isActive(Multitask.class) && original; + } + + @ModifyExpressionValue(method = "continueAttack", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;isUsingItem()Z")) + private boolean continueAttackModifyIsUsingItem(boolean original) { + return !Modules.get().isActive(Multitask.class) && original; + } + + @ModifyExpressionValue(method = "handleKeybinds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;isUsingItem()Z", ordinal = 0)) + private boolean handleKeybindsModifyIsUsingItem(boolean original) { + return !Modules.get().get(Multitask.class).attackingEntities() && original; + } + + @Inject(method = "handleKeybinds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;isUsingItem()Z", ordinal = 0, shift = At.Shift.BEFORE)) + private void handleKeybindsInjectStopUsingItem(CallbackInfo ci) { + if (Modules.get().get(Multitask.class).attackingEntities() && player.isUsingItem()) { + if (!options.keyUse.isDown() && HB$stopUsingItem()) gameMode.releaseUsingItem(player); + //noinspection StatementWithEmptyBody + while (options.keyUse.consumeClick()) ; + } + } + + // Glow esp + + @ModifyReturnValue(method = "shouldEntityAppearGlowing", at = @At("RETURN")) + private boolean shouldEntityAppearGlowingModifyIsOutline(boolean original, Entity entity) { + ESP esp = Modules.get().get(ESP.class); + if (esp == null) return original; + if (!esp.isGlow() || esp.shouldSkip(entity)) return original; + + return esp.getColor(entity) != null || original; + } + + + // faster inputs + + @Unique + private boolean isBreaking = false; + + @WrapWithCondition(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;handleKeybinds()V")) + private boolean wrapHandleInputEvents(Minecraft instance) { + return !Modules.get().get(InventoryTweaks.class).frameInput(); + } + + @WrapWithCondition(method = "handleKeybinds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;continueAttack(Z)V")) + private boolean wrapHandleBlockBreaking(Minecraft instance, boolean down) { + isBreaking = down; + return !Modules.get().get(InventoryTweaks.class).frameInput(); + } + + @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;handleKeybinds()V", shift = At.Shift.AFTER)) + private void afterHandleInputEvents(CallbackInfo ci) { + if (!Modules.get().get(InventoryTweaks.class).frameInput()) return; + + continueAttack(isBreaking); + isBreaking = false; + } + + // Interface + + @Override + public void meteor$rightClick() { + rightClick = true; + } + + @Override + public void meteor$setFramebuffer(RenderTarget framebuffer) { + this.mainRenderTarget = framebuffer; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftServerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftServerAccessor.java index bda17fad9e..c3aa40ef71 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftServerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MinecraftServerAccessor.java @@ -6,12 +6,12 @@ package meteordevelopment.meteorclient.mixin; import net.minecraft.server.MinecraftServer; -import net.minecraft.world.level.storage.LevelStorage; +import net.minecraft.world.level.storage.LevelStorageSource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(MinecraftServer.class) public interface MinecraftServerAccessor { - @Accessor("session") - LevelStorage.Session meteor$getSession(); + @Accessor("storageSource") + LevelStorageSource.LevelStorageAccess meteor$getStorageSource(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkManagerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MobBucketItemAccessor.java similarity index 57% rename from src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkManagerAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/MobBucketItemAccessor.java index f110d1f4fa..a51ca2cb06 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ClientChunkManagerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MobBucketItemAccessor.java @@ -5,12 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.world.ClientChunkManager; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.MobBucketItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ClientChunkManager.class) -public interface ClientChunkManagerAccessor { - @Accessor("chunks") - ClientChunkManager.ClientChunkMap meteor$getChunks(); +@Mixin(MobBucketItem.class) +public interface MobBucketItemAccessor { + @Accessor("type") + EntityType meteor$getType(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectFogModifierMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MobEffectFogEnvironmentMixin.java similarity index 52% rename from src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectFogModifierMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/MobEffectFogEnvironmentMixin.java index d70015a613..6d87643349 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectFogModifierMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MobEffectFogEnvironmentMixin.java @@ -8,24 +8,24 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.client.render.fog.StatusEffectFogModifier; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.client.renderer.fog.environment.MobEffectFogEnvironment; +import net.minecraft.core.Holder; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffects; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -@Mixin(StatusEffectFogModifier.class) -public abstract class StatusEffectFogModifierMixin { +@Mixin(MobEffectFogEnvironment.class) +public abstract class MobEffectFogEnvironmentMixin { @Shadow - public abstract RegistryEntry getStatusEffect(); + public abstract Holder getMobEffect(); - @ModifyReturnValue(method = "shouldApply", at = @At("RETURN")) + @ModifyReturnValue(method = "isApplicable", at = @At("RETURN")) private boolean modifyShouldApply(boolean original) { NoRender noRender = Modules.get().get(NoRender.class); - if (getStatusEffect() == StatusEffects.BLINDNESS) return original && !noRender.noBlindness(); - if (getStatusEffect() == StatusEffects.DARKNESS) return original && !noRender.noDarkness(); + if (getMobEffect() == MobEffects.BLINDNESS) return original && !noRender.noBlindness(); + if (getMobEffect() == MobEffects.DARKNESS) return original && !noRender.noDarkness(); return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MobEffectInstanceAccessor.java similarity index 72% rename from src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/MobEffectInstanceAccessor.java index 98f26237e0..71a0857408 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MobEffectInstanceAccessor.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.world.effect.MobEffectInstance; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(StatusEffectInstance.class) -public interface StatusEffectInstanceAccessor { +@Mixin(MobEffectInstance.class) +public interface MobEffectInstanceAccessor { @Accessor("duration") void meteor$setDuration(int duration); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MobEffectInstanceMixin.java similarity index 67% rename from src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/MobEffectInstanceMixin.java index dd78eaed28..e4d99b2ccc 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/StatusEffectInstanceMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MobEffectInstanceMixin.java @@ -8,20 +8,20 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.PotionSaver; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.world.effect.MobEffectInstance; 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(StatusEffectInstance.class) -public abstract class StatusEffectInstanceMixin { - @Inject(method = "updateDuration", at = @At("HEAD"), cancellable = true) - private void tick(CallbackInfo info) { +@Mixin(MobEffectInstance.class) +public abstract class MobEffectInstanceMixin { + @Inject(method = "tickDownDuration", at = @At("HEAD"), cancellable = true) + private void tick(CallbackInfo ci) { if (!Utils.canUpdate()) return; - if (Modules.get().get(PotionSaver.class).shouldFreeze(((StatusEffectInstance) (Object) this).getEffectType().value())) { - info.cancel(); + if (Modules.get().get(PotionSaver.class).shouldFreeze(((MobEffectInstance) (Object) this).getEffect().value())) { + ci.cancel(); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MobEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MobMixin.java similarity index 71% rename from src/main/java/meteordevelopment/meteorclient/mixin/MobEntityMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/MobMixin.java index 46ef50abaa..ec38b4fe73 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MobEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MobMixin.java @@ -8,14 +8,14 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.EntityControl; -import net.minecraft.entity.mob.MobEntity; +import net.minecraft.world.entity.Mob; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(MobEntity.class) -public abstract class MobEntityMixin { - @ModifyReturnValue(method = "hasSaddleEquipped", at = @At("RETURN")) - private boolean hasSaddleEquipped(boolean original) { +@Mixin(Mob.class) +public abstract class MobMixin { + @ModifyReturnValue(method = "isSaddled", at = @At("RETURN")) + private boolean isSaddled(boolean original) { return Modules.get().get(EntityControl.class).spoofSaddle() || original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ModelBlockRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ModelBlockRendererMixin.java new file mode 100644 index 0000000000..eaf614e2d4 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ModelBlockRendererMixin.java @@ -0,0 +1,67 @@ +/* + * 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.mojang.blaze3d.vertex.QuadInstance; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Xray; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.BlockQuadOutput; +import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; +import net.minecraft.client.resources.model.geometry.BakedQuad; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.ARGB; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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; + +import java.util.List; + +@Mixin(ModelBlockRenderer.class) +public abstract class ModelBlockRendererMixin { + @Shadow + @Final + private QuadInstance quadInstance; + + @Unique + private static final ThreadLocal ALPHAS = ThreadLocal.withInitial(() -> -1); + + @Inject(method = {"tesselateFlat", "tesselateAmbientOcclusion"}, at = @At("HEAD"), cancellable = true) + private void tesselate$xray(BlockQuadOutput output, float x, float y, float z, List parts, BlockAndTintGetter level, BlockState state, BlockPos pos, CallbackInfo ci) { + int alpha = Xray.getAlpha(state, pos); + + if (alpha == 0) ci.cancel(); + else ALPHAS.set(alpha); + } + + @Inject(method = "putQuadWithTint", at = @At("HEAD")) + private void putQuadWithTint$xray(BlockQuadOutput output, float x, float y, float z, BlockAndTintGetter level, BlockState state, BlockPos pos, BakedQuad quad, CallbackInfo ci) { + int alpha = ALPHAS.get(); + + if (alpha != -1) { + quadInstance.multiplyColor(ARGB.color(alpha, 255, 255, 255)); + } + } + + @ModifyReturnValue(method = "shouldRenderFace", at = @At("RETURN")) + private static boolean shouldRenderFace$xray(boolean original, BlockAndTintGetter level, BlockState state, Direction direction, BlockPos neighborPos) { + Xray xray = Modules.get().get(Xray.class); + + if (xray.isActive()) { + return xray.modifyDrawSide(state, level, neighborPos.relative(direction.getOpposite()), direction, original); + } + + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MouseHandlerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MouseHandlerMixin.java new file mode 100644 index 0000000000..12c36a8ccf --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MouseHandlerMixin.java @@ -0,0 +1,51 @@ +/* + * 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.platform.Window; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; +import meteordevelopment.meteorclient.events.meteor.MouseScrollEvent; +import meteordevelopment.meteorclient.utils.misc.input.Input; +import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import net.minecraft.client.Minecraft; +import net.minecraft.client.MouseHandler; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.client.input.MouseButtonInfo; +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 static org.lwjgl.glfw.GLFW.GLFW_RELEASE; + +@Mixin(MouseHandler.class) +public abstract class MouseHandlerMixin { + @Shadow + public abstract double getScaledXPos(Window window); + + @Shadow + public abstract double getScaledYPos(Window window); + + @Shadow + @Final + private Minecraft minecraft; + + @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); + + 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(); + } + + @Inject(method = "onScroll", at = @At("HEAD"), cancellable = true) + private void onMouseScroll(long handle, double xoffset, double yoffset, CallbackInfo ci) { + if (MeteorClient.EVENT_BUS.post(MouseScrollEvent.get(yoffset)).isCancelled()) ci.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java deleted file mode 100644 index 692a21f29a..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MouseMixin.java +++ /dev/null @@ -1,51 +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 meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; -import meteordevelopment.meteorclient.events.meteor.MouseScrollEvent; -import meteordevelopment.meteorclient.utils.misc.input.Input; -import meteordevelopment.meteorclient.utils.misc.input.KeyAction; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.Mouse; -import net.minecraft.client.gui.Click; -import net.minecraft.client.input.MouseInput; -import net.minecraft.client.util.Window; -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 static org.lwjgl.glfw.GLFW.GLFW_RELEASE; - -@Mixin(Mouse.class) -public abstract class MouseMixin { - @Shadow - public abstract double getScaledX(Window window); - - @Shadow - public abstract double getScaledY(Window window); - - @Shadow - @Final - private MinecraftClient client; - - @Inject(method = "onMouseButton", at = @At("HEAD"), cancellable = true) - private void onMouseButton(long window, MouseInput mouseInput, int action, CallbackInfo ci) { - Input.setButtonState(mouseInput.button(), action != GLFW_RELEASE); - - Click click = new Click(getScaledX(client.getWindow()), getScaledY(client.getWindow()), mouseInput); - if (MeteorClient.EVENT_BUS.post(MouseClickEvent.get(click, KeyAction.get(action))).isCancelled()) ci.cancel(); - } - - @Inject(method = "onMouseScroll", at = @At("HEAD"), cancellable = true) - private void onMouseScroll(long window, double horizontal, double vertical, CallbackInfo info) { - if (MeteorClient.EVENT_BUS.post(MouseScrollEvent.get(vertical)).isCancelled()) info.cancel(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeAccessor.java new file mode 100644 index 0000000000..5459504d5d --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeAccessor.java @@ -0,0 +1,23 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.multiplayer.MultiPlayerGameMode; +import net.minecraft.core.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MultiPlayerGameMode.class) +public interface MultiPlayerGameModeAccessor { + @Accessor("destroyProgress") + float meteor$getBreakingProgress(); + + @Accessor("destroyProgress") + void meteor$setDestroyProgress(float progress); + + @Accessor("destroyBlockPos") + BlockPos meteor$getCurrentBreakingBlockPos(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeMixin.java new file mode 100644 index 0000000000..3bee1f8cc6 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MultiPlayerGameModeMixin.java @@ -0,0 +1,158 @@ +/* + * 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.MeteorClient; +import meteordevelopment.meteorclient.events.entity.DropItemsEvent; +import meteordevelopment.meteorclient.events.entity.player.*; +import meteordevelopment.meteorclient.mixininterface.IMultiPlayerGameMode; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.player.BreakDelay; +import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; +import meteordevelopment.meteorclient.utils.world.BlockUtils; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.MultiPlayerGameMode; +import net.minecraft.client.multiplayer.prediction.PredictiveAction; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerInput; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import org.objectweb.asm.Opcodes; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(MultiPlayerGameMode.class) +public abstract class MultiPlayerGameModeMixin implements IMultiPlayerGameMode { + @Shadow + private int destroyDelay; + + @Shadow + protected abstract void ensureHasSentCarriedItem(); + + @Shadow + public abstract boolean destroyBlock(BlockPos pos); + + @Shadow + public abstract void startPrediction(ClientLevel level, PredictiveAction predictiveAction); + + @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()) { + if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(player.containerMenu.slots.get(slotNum).getItem())).isCancelled()) + ci.cancel(); + } else if (slotNum == -999) { + // Clicking outside of inventory + if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(player.containerMenu.getCarried())).isCancelled()) + ci.cancel(); + } + } + + @Inject(method = "startDestroyBlock", at = @At("HEAD"), cancellable = true) + private void onStartDestroyBlock(BlockPos pos, Direction direction, CallbackInfoReturnable cir) { + if (MeteorClient.EVENT_BUS.post(StartBreakingBlockEvent.get(pos, direction)).isCancelled()) cir.cancel(); + else { + SpeedMine sm = Modules.get().get(SpeedMine.class); + BlockState state = mc.level.getBlockState(pos); + + if (!sm.instamine() || !sm.filter(state.getBlock())) return; + + if (state.getDestroyProgress(mc.player, mc.level, pos) > 0.5f) { + destroyBlock(pos); + startPrediction(mc.level, (sequence) -> new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, pos, direction, sequence)); + startPrediction(mc.level, (sequence) -> new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.STOP_DESTROY_BLOCK, pos, direction, sequence)); + cir.setReturnValue(true); + } + } + } + + @Inject(method = "useItemOn", at = @At("HEAD"), cancellable = true) + public void useItemOn(LocalPlayer player, InteractionHand hand, BlockHitResult blockHit, CallbackInfoReturnable cir) { + if (MeteorClient.EVENT_BUS.post(InteractBlockEvent.get(player.getMainHandItem().isEmpty() ? InteractionHand.OFF_HAND : hand, blockHit)).isCancelled()) + cir.setReturnValue(InteractionResult.FAIL); + } + + @Inject(method = "attack", at = @At("HEAD"), cancellable = true) + private void onAttack(Player player, Entity entity, CallbackInfo ci) { + if (MeteorClient.EVENT_BUS.post(AttackEntityEvent.get(entity)).isCancelled()) ci.cancel(); + } + + @Inject(method = "interact", at = @At("HEAD"), cancellable = true) + private void onInteract(Player player, Entity entity, EntityHitResult hitResult, InteractionHand hand, CallbackInfoReturnable cir) { + if (MeteorClient.EVENT_BUS.post(InteractEntityEvent.get(entity, hand)).isCancelled()) + cir.setReturnValue(InteractionResult.FAIL); + } + + @Inject(method = "handleCreativeModeItemDrop", at = @At("HEAD"), cancellable = true) + private void onHandleCreativeModeItemDrop(ItemStack clicked, CallbackInfo ci) { + if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(clicked)).isCancelled()) ci.cancel(); + } + + @Redirect(method = "continueDestroyBlock", at = @At(value = "FIELD", target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;destroyDelay:I", opcode = Opcodes.PUTFIELD, ordinal = 1)) + private void creativeBreakDelayChange(MultiPlayerGameMode interactionManager, int value) { + BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(value)); + destroyDelay = event.cooldown; + } + + @Redirect(method = "continueDestroyBlock", at = @At(value = "FIELD", target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;destroyDelay:I", opcode = Opcodes.PUTFIELD, ordinal = 2)) + private void survivalBreakDelayChange(MultiPlayerGameMode interactionManager, int value) { + BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(value)); + destroyDelay = event.cooldown; + } + + @Redirect(method = "startDestroyBlock", at = @At(value = "FIELD", target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;destroyDelay:I", opcode = Opcodes.PUTFIELD)) + private void creativeBreakDelayChange2(MultiPlayerGameMode interactionManager, int value) { + BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(value)); + destroyDelay = event.cooldown; + } + + @ModifyExpressionValue(method = "continueDestroyBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;getDestroyProgress(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)F")) + private float modifyBlockBreakingDelta(float original) { + if (Modules.get().get(BreakDelay.class).preventInstaBreak() && original >= 1) { + BlockBreakingCooldownEvent event = MeteorClient.EVENT_BUS.post(BlockBreakingCooldownEvent.get(destroyDelay)); + destroyDelay = event.cooldown; + return 0; + } + return original; + } + + @Inject(method = "destroyBlock", at = @At("HEAD"), cancellable = true) + private void onDestroyBlock(BlockPos pos, CallbackInfoReturnable cir) { + if (MeteorClient.EVENT_BUS.post(BreakBlockEvent.get(pos)).isCancelled()) cir.setReturnValue(false); + } + + @Inject(method = "useItem", at = @At("HEAD"), cancellable = true) + private void onUseItem(Player player, InteractionHand hand, CallbackInfoReturnable cir) { + InteractItemEvent event = MeteorClient.EVENT_BUS.post(InteractItemEvent.get(hand)); + if (event.toReturn != null) cir.setReturnValue(event.toReturn); + } + + @Inject(method = "stopDestroyBlock", at = @At("HEAD"), cancellable = true) + private void onStopDestroyBlock(CallbackInfo ci) { + if (BlockUtils.breaking) ci.cancel(); + } + + @Override + public void meteor$syncSelected() { + ensureHasSentCarriedItem(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/MutableComponentMixin.java similarity index 54% rename from src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/MutableComponentMixin.java index e5a84e3e70..7a3ce1f0b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MutableTextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/MutableComponentMixin.java @@ -5,20 +5,20 @@ package meteordevelopment.meteorclient.mixin; -import meteordevelopment.meteorclient.mixininterface.IText; -import net.minecraft.text.MutableText; -import net.minecraft.util.Language; +import meteordevelopment.meteorclient.mixininterface.IComponent; +import net.minecraft.locale.Language; +import net.minecraft.network.chat.MutableComponent; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -@Mixin(MutableText.class) -public abstract class MutableTextMixin implements IText { +@Mixin(MutableComponent.class) +public abstract class MutableComponentMixin implements IComponent { @Shadow - private @Nullable Language language; + private @Nullable Language decomposedWith; @Override public void meteor$invalidateCache() { - this.language = null; + this.decomposedWith = null; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleOptionMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/OptionInstanceMixin.java similarity index 57% rename from src/main/java/meteordevelopment/meteorclient/mixin/SimpleOptionMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/OptionInstanceMixin.java index 0b841a1026..195f991ebb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleOptionMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/OptionInstanceMixin.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.mixin; -import meteordevelopment.meteorclient.mixininterface.ISimpleOption; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.SimpleOption; +import meteordevelopment.meteorclient.mixininterface.IOptionInstance; +import net.minecraft.client.Minecraft; +import net.minecraft.client.OptionInstance; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -15,19 +15,22 @@ import java.util.Objects; import java.util.function.Consumer; -@Mixin(SimpleOption.class) -public abstract class SimpleOptionMixin implements ISimpleOption { - @Shadow Object value; - @Shadow @Final private Consumer changeCallback; +@Mixin(OptionInstance.class) +public abstract class OptionInstanceMixin implements IOptionInstance { + @Shadow + private Object value; + @Shadow + @Final + private Consumer onValueUpdate; @Override public void meteor$set(Object value) { - if (!MinecraftClient.getInstance().isRunning()) { + if (!Minecraft.getInstance().isRunning()) { this.value = value; } else { if (!Objects.equals(this.value, value)) { this.value = value; - this.changeCallback.accept(this.value); + this.onValueUpdate.accept(this.value); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/OptionsMixin.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/OptionsMixin.java index 1b98414e94..5f5311bc48 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/GameOptionsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/OptionsMixin.java @@ -10,10 +10,10 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Freecam; import meteordevelopment.meteorclient.utils.misc.input.KeyBinds; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.option.Perspective; +import net.minecraft.client.CameraType; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -25,23 +25,26 @@ import java.io.File; -@Mixin(GameOptions.class) -public abstract class GameOptionsMixin { - @Shadow @Final @Mutable public KeyBinding[] allKeys; +@Mixin(Options.class) +public abstract class OptionsMixin { + @Shadow + @Final + @Mutable + public KeyMapping[] keyMappings; - @Inject(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/client/option/GameOptions;allKeys:[Lnet/minecraft/client/option/KeyBinding;", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER)) - private void onInitAfterKeysAll(MinecraftClient client, File optionsFile, CallbackInfo info) { - allKeys = KeyBinds.apply(allKeys); + @Inject(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER)) + private void onInitAfterKeysAll(Minecraft minecraft, File workingDirectory, CallbackInfo ci) { + keyMappings = KeyBinds.apply(keyMappings); } - @Inject(method = "setPerspective", at = @At("HEAD"), cancellable = true) - private void setPerspective(Perspective perspective, CallbackInfo info) { + @Inject(method = "setCameraType", at = @At("HEAD"), cancellable = true) + private void setPerspective(CameraType cameraType, CallbackInfo ci) { if (Modules.get() == null) return; // nothing is loaded yet, shouldersurfing compat - ChangePerspectiveEvent event = MeteorClient.EVENT_BUS.post(ChangePerspectiveEvent.get(perspective)); + ChangePerspectiveEvent event = MeteorClient.EVENT_BUS.post(ChangePerspectiveEvent.get(cameraType)); - if (event.isCancelled()) info.cancel(); + if (event.isCancelled()) ci.cancel(); - if (Modules.get().isActive(Freecam.class)) info.cancel(); + if (Modules.get().isActive(Freecam.class)) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ParticleEngineMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ParticleEngineMixin.java new file mode 100644 index 0000000000..868fd9af3c --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ParticleEngineMixin.java @@ -0,0 +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; + +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.events.world.ParticleEvent; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleEngine; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import org.jetbrains.annotations.Nullable; +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(ParticleEngine.class) +public abstract class ParticleEngineMixin { + @Shadow + @Nullable + protected abstract Particle makeParticle(T options, double x, double y, double z, double xa, double ya, double za); + + @Inject(method = "createParticle(Lnet/minecraft/core/particles/ParticleOptions;DDDDDD)Lnet/minecraft/client/particle/Particle;", at = @At("HEAD"), cancellable = true) + private void onCreateParticle(ParticleOptions options, double x, double y, double z, double xa, double ya, double za, CallbackInfoReturnable cir) { + ParticleEvent event = MeteorClient.EVENT_BUS.post(ParticleEvent.get(options)); + + if (event.isCancelled()) { + if (options.getType() == ParticleTypes.FLASH) + cir.setReturnValue(makeParticle(options, x, y, z, xa, ya, za)); + else cir.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ParticleManagerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ParticleManagerMixin.java deleted file mode 100644 index 2167e68517..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ParticleManagerMixin.java +++ /dev/null @@ -1,36 +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 meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.world.ParticleEvent; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleManager; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleTypes; -import org.jetbrains.annotations.Nullable; -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(ParticleManager.class) -public abstract class ParticleManagerMixin { - @Shadow - @Nullable - protected abstract Particle createParticle(T parameters, double x, double y, double z, double velocityX, double velocityY, double velocityZ); - - @Inject(method = "addParticle(Lnet/minecraft/particle/ParticleEffect;DDDDDD)Lnet/minecraft/client/particle/Particle;", at = @At("HEAD"), cancellable = true) - private void onAddParticle(ParticleEffect parameters, double x, double y, double z, double velocityX, double velocityY, double velocityZ, CallbackInfoReturnable info) { - ParticleEvent event = MeteorClient.EVENT_BUS.post(ParticleEvent.get(parameters)); - - if (event.isCancelled()) { - if (parameters.getType() == ParticleTypes.FLASH) info.setReturnValue(createParticle(parameters, x, y, z, velocityX, velocityY, velocityZ)); - else info.cancel(); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerAccessor.java similarity index 54% rename from src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/PlayerAccessor.java index e63281531e..62f7bfeeea 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(PlayerEntity.class) -public interface PlayerEntityAccessor { - @Invoker("canChangeIntoPose") - boolean meteor$canChangeIntoPose(EntityPose pose); +@Mixin(Player.class) +public interface PlayerAccessor { + @Invoker("canPlayerFitWithinBlocksAndEntitiesWhen") + boolean meteor$canChangeIntoPose(Pose pose); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java deleted file mode 100644 index 745ced14c4..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityMixin.java +++ /dev/null @@ -1,136 +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.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; -import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import meteordevelopment.meteorclient.systems.modules.movement.Sprint; -import meteordevelopment.meteorclient.systems.modules.player.Reach; -import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; -import meteordevelopment.meteorclient.utils.world.BlockUtils; -import net.minecraft.block.BlockState; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerAbilities; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -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; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(PlayerEntity.class) -public abstract class PlayerEntityMixin extends LivingEntity { - @Shadow - public abstract PlayerAbilities getAbilities(); - - protected PlayerEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - @Inject(method = "clipAtLedge", at = @At("HEAD"), cancellable = true) - protected void clipAtLedge(CallbackInfoReturnable info) { - if (!getEntityWorld().isClient()) return; - - ClipAtLedgeEvent event = MeteorClient.EVENT_BUS.post(ClipAtLedgeEvent.get()); - if (event.isSet()) info.setReturnValue(event.isClip()); - } - - @Inject(method = "dropItem", at = @At("HEAD"), cancellable = true) - private void onDropItem(ItemStack stack, boolean retainOwnership, CallbackInfoReturnable cir) { - if (getEntityWorld().isClient() && !stack.isEmpty()) { - if (MeteorClient.EVENT_BUS.post(DropItemsEvent.get(stack)).isCancelled()) cir.setReturnValue(null); - } - } - - @Inject(method = "isSpectator", at = @At("HEAD"), cancellable = true) - private void onIsSpectator(CallbackInfoReturnable info) { - if (mc.getNetworkHandler() == null) info.setReturnValue(false); - } - - @Inject(method = "isCreative", at = @At("HEAD"), cancellable = true) - private void onIsCreative(CallbackInfoReturnable info) { - if (mc.getNetworkHandler() == null) info.setReturnValue(false); - } - - @ModifyReturnValue(method = "getBlockBreakingSpeed", at = @At(value = "RETURN")) - public float onGetBlockBreakingSpeed(float breakSpeed, BlockState block) { - if (!getEntityWorld().isClient()) return breakSpeed; - - SpeedMine speedMine = Modules.get().get(SpeedMine.class); - if (!speedMine.isActive() || speedMine.mode.get() != SpeedMine.Mode.Normal || !speedMine.filter(block.getBlock())) return breakSpeed; - - float breakSpeedMod = (float) (breakSpeed * speedMine.modifier.get()); - - if (mc.crosshairTarget instanceof BlockHitResult bhr) { - BlockPos pos = bhr.getBlockPos(); - if (speedMine.modifier.get() < 1 || (BlockUtils.canInstaBreak(pos, breakSpeed) == BlockUtils.canInstaBreak(pos, breakSpeedMod))) { - return breakSpeedMod; - } else { - return 0.9f / BlockUtils.calcBlockBreakingDelta2(pos, 1); - } - } - - return breakSpeed; - } - - @ModifyReturnValue(method = "getMovementSpeed", at = @At("RETURN")) - private float onGetMovementSpeed(float original) { - if (!getEntityWorld().isClient()) return original; - if (!Modules.get().get(NoSlow.class).slowness()) return original; - - float walkSpeed = getAbilities().getWalkSpeed(); - - if (original < walkSpeed) { - if (isSprinting()) return (float) (walkSpeed * 1.30000001192092896); - else return walkSpeed; - } - - return original; - } - - @Inject(method = "getOffGroundSpeed", at = @At("HEAD"), cancellable = true) - private void onGetOffGroundSpeed(CallbackInfoReturnable info) { - if (!getEntityWorld().isClient()) return; - - float speed = Modules.get().get(Flight.class).getOffGroundSpeed(); - if (speed != -1) info.setReturnValue(speed); - } - - @WrapWithCondition(method = "knockbackTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;setVelocity(Lnet/minecraft/util/math/Vec3d;)V")) - private boolean keepSprint$setVelocity(PlayerEntity instance, Vec3d vec3d) { - return Modules.get().get(Sprint.class).stopSprinting(); - } - - @WrapWithCondition(method = "knockbackTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;setSprinting(Z)V")) - private boolean keepSprint$setSprinting(PlayerEntity instance, boolean b) { - return Modules.get().get(Sprint.class).stopSprinting(); - } - - @ModifyReturnValue(method = "getBlockInteractionRange", at = @At("RETURN")) - private double modifyBlockInteractionRange(double original) { - return Math.max(0, original + Modules.get().get(Reach.class).blockReach()); - } - - @ModifyReturnValue(method = "getEntityInteractionRange", at = @At("RETURN")) - private double modifyEntityInteractionRange(double original) { - return Math.max(0, original + Modules.get().get(Reach.class).entityReach()); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java deleted file mode 100644 index 3045ad7d39..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerEntityRendererMixin.java +++ /dev/null @@ -1,101 +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.v2.WrapWithCondition; -import meteordevelopment.meteorclient.mixininterface.IVec3d; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Chams; -import meteordevelopment.meteorclient.utils.player.Rotations; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.network.ClientPlayerLikeEntity; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.PlayerEntityRenderer; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.PlayerLikeEntity; -import net.minecraft.util.Identifier; -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; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(PlayerEntityRenderer.class) -public abstract class PlayerEntityRendererMixin - extends LivingEntityRenderer { - // Chams - - @Unique - private Chams chams; - - public PlayerEntityRendererMixin(EntityRendererFactory.Context ctx, PlayerEntityModel model, float shadowRadius) { - super(ctx, model, shadowRadius); - } - - @Inject(method = "", at = @At("RETURN")) - private void init$chams(CallbackInfo info) { - chams = Modules.get().get(Chams.class); - } - - // Chams - Player scale - - @Inject(method = "updateRenderState(Lnet/minecraft/entity/PlayerLikeEntity;Lnet/minecraft/client/render/entity/state/PlayerEntityRenderState;F)V", at = @At("RETURN")) - private void updateRenderState$scale(AvatarlikeEntity player, PlayerEntityRenderState state, float f, CallbackInfo ci) { - if (!chams.isActive() || !chams.players.get()) return; - if (chams.ignoreSelf.get() && player == mc.player) return; - - float v = chams.playersScale.get().floatValue(); - state.baseScale *= v; - - if (state.nameLabelPos != null) - ((IVec3d) state.nameLabelPos).meteor$setY(state.nameLabelPos.y + (player.getHeight() * v - player.getHeight())); - } - - // Chams - Hand Texture - - @ModifyExpressionValue(method = "renderArm", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderLayers;entityTranslucent(Lnet/minecraft/util/Identifier;)Lnet/minecraft/client/render/RenderLayer;")) - private RenderLayer renderArm$texture(RenderLayer original, MatrixStack matrixStack, OrderedRenderCommandQueue entityRenderCommandQueue, int light, Identifier skinTexture, ModelPart modelPart, boolean sleeveVisible) { - if (chams.isActive() && chams.hand.get()) { - Identifier texture = chams.handTexture.get() ? skinTexture : Chams.BLANK; - return RenderLayers.entityTranslucent(texture); - } - - return original; - } - - // Chams - Hand Color - - @WrapWithCondition(method = "renderArm", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;submitModelPart(Lnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/RenderLayer;IILnet/minecraft/client/texture/Sprite;)V")) - private boolean renderArm$color(OrderedRenderCommandQueue instance, ModelPart modelPart, MatrixStack matrixStack, RenderLayer renderLayer, int light, int uv, Sprite sprite) { - if (chams.isActive() && chams.hand.get()) { - instance.submitModelPart(modelPart, matrixStack, renderLayer, light, uv, null, chams.handColor.get().getPacked(), null); - return false; - } - - return true; - } - - // Rotations - - @Inject(method = "updateRenderState(Lnet/minecraft/entity/PlayerLikeEntity;Lnet/minecraft/client/render/entity/state/PlayerEntityRenderState;F)V", at = @At("RETURN")) - private void updateRenderState$rotations(AvatarlikeEntity player, PlayerEntityRenderState state, float f, CallbackInfo info) { - if (Rotations.rotating && player == mc.player) { - state.relativeHeadYaw = 0; - state.bodyYaw = Rotations.serverYaw; - state.pitch = Rotations.serverPitch; - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListEntryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInfoMixin.java similarity index 56% rename from src/main/java/meteordevelopment/meteorclient/mixin/PlayerListEntryMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/PlayerInfoMixin.java index 6b330236b2..405e60c869 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListEntryMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInfoMixin.java @@ -8,26 +8,26 @@ import com.mojang.authlib.GameProfile; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.NameProtect; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.client.util.DefaultSkinHelper; -import net.minecraft.entity.player.SkinTextures; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.client.resources.DefaultPlayerSkin; +import net.minecraft.world.entity.player.PlayerSkin; 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(PlayerListEntry.class) -public abstract class PlayerListEntryMixin { +@Mixin(PlayerInfo.class) +public abstract class PlayerInfoMixin { @Shadow public abstract GameProfile getProfile(); - @Inject(method = "getSkinTextures", at = @At("HEAD"), cancellable = true) - private void onGetTexture(CallbackInfoReturnable info) { - if (getProfile().name().equals(MinecraftClient.getInstance().getSession().getUsername())) { + @Inject(method = "getSkin", at = @At("HEAD"), cancellable = true) + private void onGetTexture(CallbackInfoReturnable cir) { + if (getProfile().name().equals(Minecraft.getInstance().getUser().getName())) { if (Modules.get().get(NameProtect.class).skinProtect()) { - info.setReturnValue(DefaultSkinHelper.getSkinTextures(getProfile())); + cir.setReturnValue(DefaultPlayerSkin.get(getProfile())); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInteractEntityC2SPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInteractEntityC2SPacketMixin.java deleted file mode 100644 index 458e49a6e5..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerInteractEntityC2SPacketMixin.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 meteordevelopment.meteorclient.mixininterface.IPlayerInteractEntityC2SPacket; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import meteordevelopment.meteorclient.systems.modules.movement.Sneak; -import net.minecraft.entity.Entity; -import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; -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.ModifyVariable; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(PlayerInteractEntityC2SPacket.class) -public abstract class PlayerInteractEntityC2SPacketMixin implements IPlayerInteractEntityC2SPacket { - @Shadow @Final private PlayerInteractEntityC2SPacket.InteractTypeHandler type; - @Shadow @Final private int entityId; - - @Override - public PlayerInteractEntityC2SPacket.InteractType meteor$getType() { - return type.getType(); - } - - @Override - public Entity meteor$getEntity() { - return mc.world.getEntityById(entityId); - } - - @ModifyVariable(method = "(IZLnet/minecraft/network/packet/c2s/play/PlayerInteractEntityC2SPacket$InteractTypeHandler;)V", at = @At("HEAD"), ordinal = 0, argsOnly = true) - private static boolean setSneaking(boolean sneaking) { - return Modules.get().get(Sneak.class).doPacket() || Modules.get().get(NoSlow.class).airStrict() || sneaking; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java deleted file mode 100644 index 2337643251..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerListHudMixin.java +++ /dev/null @@ -1,85 +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.sugar.Local; -import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.BetterTab; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.hud.PlayerListHud; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.text.Text; -import net.minecraft.util.math.MathHelper; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.List; - -@Mixin(PlayerListHud.class) -public abstract class PlayerListHudMixin { - @Shadow - protected abstract List collectPlayerEntries(); - - @ModifyConstant(constant = @Constant(longValue = 80L), method = "collectPlayerEntries") - private long modifyCount(long count) { - BetterTab module = Modules.get().get(BetterTab.class); - - return module.isActive() ? module.tabSize.get() : count; - } - - @Inject(method = "getPlayerName", at = @At("HEAD"), cancellable = true) - public void getPlayerName(PlayerListEntry playerListEntry, CallbackInfoReturnable info) { - BetterTab betterTab = Modules.get().get(BetterTab.class); - - if (betterTab.isActive()) info.setReturnValue(betterTab.getPlayerName(playerListEntry)); - } - - @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I"), index = 0) - private int modifyWidth(int width) { - BetterTab module = Modules.get().get(BetterTab.class); - - return module.isActive() && module.accurateLatency.get() ? width + 30 : width; - } - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I", shift = At.Shift.BEFORE)) - private void modifyHeight(CallbackInfo ci, @Local(ordinal = 5)LocalIntRef o, @Local(ordinal = 6)LocalIntRef p) { - BetterTab module = Modules.get().get(BetterTab.class); - if (!module.isActive()) return; - - int newO; - int newP = 1; - int totalPlayers = newO = this.collectPlayerEntries().size(); - while (newO > module.tabHeight.get()) { - newO = (totalPlayers + ++newP - 1) / newP; - } - - o.set(newO); - p.set(newP); - } - - @Inject(method = "renderLatencyIcon", at = @At("HEAD"), cancellable = true) - private void onRenderLatencyIcon(DrawContext context, int width, int x, int y, PlayerListEntry entry, CallbackInfo ci) { - BetterTab betterTab = Modules.get().get(BetterTab.class); - - if (betterTab.isActive() && betterTab.accurateLatency.get()) { - MinecraftClient mc = MinecraftClient.getInstance(); - TextRenderer textRenderer = mc.textRenderer; - - int latency = MathHelper.clamp(entry.getLatency(), 0, 9999); - int color = latency < 150 ? 0xFF00E970 : - latency < 300 ? 0xFFE7D020 : 0xFFD74238; - String text = latency + "ms"; - context.drawTextWithShadow(textRenderer, text, x + width - textRenderer.getWidth(text), y, color); - ci.cancel(); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMixin.java new file mode 100644 index 0000000000..bd239ef916 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMixin.java @@ -0,0 +1,137 @@ +/* + * 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.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; +import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; +import meteordevelopment.meteorclient.systems.modules.movement.Sprint; +import meteordevelopment.meteorclient.systems.modules.player.Reach; +import meteordevelopment.meteorclient.systems.modules.player.SpeedMine; +import meteordevelopment.meteorclient.utils.world.BlockUtils; +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; +import net.minecraft.world.phys.Vec3; +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; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(Player.class) +public abstract class PlayerMixin extends LivingEntity { + @Shadow + public abstract Abilities getAbilities(); + + protected PlayerMixin(EntityType entityType, Level world) { + super(entityType, world); + } + + @Inject(method = "isStayingOnGroundSurface", at = @At("HEAD"), cancellable = true) + protected void clipAtLedge(CallbackInfoReturnable cir) { + if (!level().isClientSide()) return; + + ClipAtLedgeEvent event = MeteorClient.EVENT_BUS.post(ClipAtLedgeEvent.get()); + 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); + } + + @Inject(method = "isCreative", at = @At("HEAD"), cancellable = true) + private void onIsCreative(CallbackInfoReturnable cir) { + if (mc.getConnection() == null) cir.setReturnValue(false); + } + + @ModifyReturnValue(method = "getDestroySpeed", at = @At(value = "RETURN")) + public float onGetBlockBreakingSpeed(float breakSpeed, BlockState state) { + if (!level().isClientSide()) return breakSpeed; + + SpeedMine speedMine = Modules.get().get(SpeedMine.class); + if (!speedMine.isActive() || speedMine.mode.get() != SpeedMine.Mode.Normal || !speedMine.filter(state.getBlock())) + return breakSpeed; + + float breakSpeedMod = (float) (breakSpeed * speedMine.modifier.get()); + + if (mc.hitResult instanceof BlockHitResult bhr) { + BlockPos pos = bhr.getBlockPos(); + if (speedMine.modifier.get() < 1 || (BlockUtils.canInstaBreak(pos, breakSpeed) == BlockUtils.canInstaBreak(pos, breakSpeedMod))) { + return breakSpeedMod; + } else { + return 0.9f / BlockUtils.calcBlockBreakingDelta2(pos, 1); + } + } + + return breakSpeed; + } + + @ModifyReturnValue(method = "getSpeed", at = @At("RETURN")) + private float onGetSpeed(float original) { + if (!level().isClientSide()) return original; + if (!Modules.get().get(NoSlow.class).slowness()) return original; + + float walkSpeed = getAbilities().getWalkingSpeed(); + + if (original < walkSpeed) { + if (isSprinting()) return (float) (walkSpeed * 1.30000001192092896); + else return walkSpeed; + } + + return original; + } + + @Inject(method = "getFlyingSpeed", at = @At("HEAD"), cancellable = true) + private void onGetFlyingSpeed(CallbackInfoReturnable cir) { + if (!level().isClientSide()) return; + + float speed = Modules.get().get(Flight.class).getFlyingSpeed(); + if (speed != -1) cir.setReturnValue(speed); + } + + @WrapWithCondition(method = "causeExtraKnockback", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V")) + private boolean keepSprint$setDeltaMovement(Player instance, Vec3 vec3d) { + return Modules.get().get(Sprint.class).stopSprinting(); + } + + @WrapWithCondition(method = "causeExtraKnockback", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;setSprinting(Z)V")) + private boolean keepSprint$setSprinting(Player instance, boolean b) { + return Modules.get().get(Sprint.class).stopSprinting(); + } + + @ModifyReturnValue(method = "blockInteractionRange", at = @At("RETURN")) + private double modifyBlockInteractionRange(double original) { + return Math.max(0, original + Modules.get().get(Reach.class).blockReach()); + } + + @ModifyReturnValue(method = "entityInteractionRange", at = @At("RETURN")) + private double modifyEntityInteractionRange(double original) { + return Math.max(0, original + Modules.get().get(Reach.class).entityReach()); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketMixin.java deleted file mode 100644 index e056bdf71d..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketMixin.java +++ /dev/null @@ -1,22 +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 meteordevelopment.meteorclient.mixininterface.IPlayerMoveC2SPacket; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; - -@Mixin(PlayerMoveC2SPacket.class) -public abstract class PlayerMoveC2SPacketMixin implements IPlayerMoveC2SPacket { - @Unique private int tag; - - @Override - public void meteor$setTag(int tag) { this.tag = tag; } - - @Override - public int meteor$getTag() { return this.tag; } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerSkinProviderAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerSkinProviderAccessor.java deleted file mode 100644 index c6343ce791..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerSkinProviderAccessor.java +++ /dev/null @@ -1,16 +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 net.minecraft.client.texture.PlayerSkinProvider; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(PlayerSkinProvider.class) -public interface PlayerSkinProviderAccessor { - @Accessor("skinCache") - PlayerSkinProvider.FileCache meteor$getSkinCache(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerTabOverlayMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerTabOverlayMixin.java new file mode 100644 index 0000000000..bea341069b --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PlayerTabOverlayMixin.java @@ -0,0 +1,85 @@ +/* + * 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.llamalad7.mixinextras.sugar.ref.LocalIntRef; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.BetterTab; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.PlayerTabOverlay; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + +@Mixin(PlayerTabOverlay.class) +public abstract class PlayerTabOverlayMixin { + @Shadow + protected abstract List getPlayerInfos(); + + @ModifyConstant(constant = @Constant(longValue = 80L), method = "getPlayerInfos") + private long modifyCount(long count) { + BetterTab module = Modules.get().get(BetterTab.class); + + return module.isActive() ? module.tabSize.get() : count; + } + + @Inject(method = "getNameForDisplay", at = @At("HEAD"), cancellable = true) + public void getNameForDisplay(PlayerInfo info, CallbackInfoReturnable cir) { + BetterTab betterTab = Modules.get().get(BetterTab.class); + + if (betterTab.isActive()) cir.setReturnValue(betterTab.getPlayerName(info)); + } + + @ModifyArg(method = "extractRenderState", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I"), index = 0) + private int modifyWidth(int width) { + BetterTab module = Modules.get().get(BetterTab.class); + + return module.isActive() && module.accurateLatency.get() ? width + 30 : width; + } + + @Inject(method = "extractRenderState", at = @At(value = "INVOKE", target = "Ljava/lang/Math;min(II)I", shift = At.Shift.BEFORE)) + private void modifyHeight(CallbackInfo ci, @Local(name = "rows") LocalIntRef rows, @Local(name = "cols") LocalIntRef cols) { + BetterTab module = Modules.get().get(BetterTab.class); + if (!module.isActive()) return; + + int newRows; + int newCols = 1; + int totalPlayers = newRows = this.getPlayerInfos().size(); + while (newRows > module.tabHeight.get()) { + newRows = (totalPlayers + ++newCols - 1) / newCols; + } + + rows.set(newRows); + cols.set(newCols); + } + + @Inject(method = "extractPingIcon", at = @At("HEAD"), cancellable = true) + private void onExtractPingIcon(GuiGraphicsExtractor graphics, int slotWidth, int xo, int yo, PlayerInfo info, CallbackInfo ci) { + BetterTab betterTab = Modules.get().get(BetterTab.class); + + if (betterTab.isActive() && betterTab.accurateLatency.get()) { + Minecraft mc = Minecraft.getInstance(); + Font font = mc.font; + + int latency = Mth.clamp(info.getLatency(), 0, 9999); + int color = latency < 150 ? 0xFF00E970 : + latency < 300 ? 0xFFE7D020 : 0xFFD74238; + String text = latency + "ms"; + graphics.text(font, text, xo + slotWidth - font.width(text), yo, color); + ci.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java index 4b879762f5..5621edefb2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/PowderSnowBlockMixin.java @@ -8,8 +8,8 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.Jesus; -import net.minecraft.block.PowderSnowBlock; -import net.minecraft.entity.Entity; +import net.minecraft.world.level.block.PowderSnowBlock; +import net.minecraft.world.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,7 +17,7 @@ @Mixin(PowderSnowBlock.class) public abstract class PowderSnowBlockMixin { - @ModifyReturnValue(method = "canWalkOnPowderSnow", at = @At("RETURN")) + @ModifyReturnValue(method = "canEntityWalkOnPowderSnow", at = @At("RETURN")) private static boolean onCanWalkOnPowderSnow(boolean original, Entity entity) { if (entity == mc.player && Modules.get().get(Jesus.class).canWalkOnPowderSnow()) return true; return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileInGroundAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileInGroundAccessor.java index 43c78b1657..93d5e1accb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileInGroundAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileInGroundAccessor.java @@ -5,11 +5,11 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.projectile.PersistentProjectileEntity; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -@Mixin(PersistentProjectileEntity.class) +@Mixin(AbstractArrow.class) public interface ProjectileInGroundAccessor { @Invoker("isInGround") boolean meteor$invokeIsInGround(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java index 9aaef988e6..41cf9b0c89 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ProjectileUtilMixin.java @@ -9,22 +9,22 @@ import com.llamalad7.mixinextras.sugar.Local; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.Hitboxes; -import net.minecraft.entity.Entity; -import net.minecraft.entity.projectile.ProjectileUtil; -import net.minecraft.util.math.Box; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.projectile.ProjectileUtil; +import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(ProjectileUtil.class) -public class ProjectileUtilMixin { +public abstract class ProjectileUtilMixin { @ModifyExpressionValue( - method = "collectPiercingCollisions(Lnet/minecraft/world/World;Lnet/minecraft/entity/Entity;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/util/math/Box;Ljava/util/function/Predicate;FLnet/minecraft/world/RaycastContext$ShapeType;Z)Ljava/util/Collection;", - at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getBoundingBox()Lnet/minecraft/util/math/Box;") + 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;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;getBoundingBox()Lnet/minecraft/world/phys/AABB;") ) - private static Box modifyHitboxMargin(Box original, @Local(ordinal = 1) Entity entity2) { - double v = Modules.get().get(Hitboxes.class).getEntityValue(entity2); + private static AABB modifyHitboxMargin(AABB original, @Local(name = "entity") Entity entity) { + double v = Modules.get().get(Hitboxes.class).getEntityValue(entity); if (v == 0) return original; - return original.expand(v); + return original.inflate(v); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java deleted file mode 100644 index 8a549798bd..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RaycastContextMixin.java +++ /dev/null @@ -1,34 +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 meteordevelopment.meteorclient.mixininterface.IRaycastContext; -import net.minecraft.block.ShapeContext; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.RaycastContext; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(RaycastContext.class) -public abstract class RaycastContextMixin implements IRaycastContext { - @Shadow @Final @Mutable private Vec3d start; - @Shadow @Final @Mutable private Vec3d end; - @Shadow @Final @Mutable private RaycastContext.ShapeType shapeType; - @Shadow @Final @Mutable private RaycastContext.FluidHandling fluid; - @Shadow @Final @Mutable private ShapeContext shapeContext; - - @Override - public void meteor$set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, RaycastContext.FluidHandling fluidHandling, Entity entity) { - this.start = start; - this.end = end; - this.shapeType = shapeType; - this.fluid = fluidHandling; - this.shapeContext = ShapeContext.of(entity); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.java deleted file mode 100644 index 090c49ad6c..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RegistriesMixin.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; - -import net.minecraft.registry.Registries; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.function.Supplier; - -@Mixin(Registries.class) -public abstract class RegistriesMixin { - @Redirect(method = "create(Lnet/minecraft/registry/RegistryKey;Lnet/minecraft/registry/MutableRegistry;Lnet/minecraft/registry/Registries$Initializer;)Lnet/minecraft/registry/MutableRegistry;", at = @At(value = "INVOKE", target = "Lnet/minecraft/Bootstrap;ensureBootstrapped(Ljava/util/function/Supplier;)V")) - private static void ignoreBootstrap(Supplier callerGetter) { - // nothing - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ReloadStateAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ReloadStateAccessor.java index ac006c184f..17047c5443 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ReloadStateAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ReloadStateAccessor.java @@ -5,11 +5,11 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.resource.ResourceReloadLogger; +import net.minecraft.client.ResourceLoadStateTracker; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ResourceReloadLogger.ReloadState.class) +@Mixin(ResourceLoadStateTracker.ReloadState.class) public interface ReloadStateAccessor { @Accessor("finished") boolean meteor$isFinished(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RenderLayerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderLayerAccessor.java deleted file mode 100644 index 0c5c065f78..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RenderLayerAccessor.java +++ /dev/null @@ -1,17 +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 net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderSetup; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(RenderLayer.class) -public interface RenderLayerAccessor { - @Accessor("renderSetup") - RenderSetup getRenderSetup(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RenderSystemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderSystemMixin.java index 2d03bac19b..b7d98088ba 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RenderSystemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RenderSystemMixin.java @@ -22,13 +22,13 @@ @Mixin(RenderSystem.class) public abstract class RenderSystemMixin { @Inject(method = "flipFrame", at = @At("TAIL")) - private static void meteor$flipFrame(CallbackInfo info) { + private static void meteor$flipFrame(CallbackInfo ci) { MeshUniforms.flipFrame(); PostProcessShader.flipFrame(); ChamsShader.flipFrame(); OutlineUniforms.flipFrame(); if (Modules.get() == null || mc.player == null) return; - if (Modules.get().get(InventoryTweaks.class).frameInput()) ((MinecraftClientAccessor) mc).meteor$handleInputEvents(); + if (Modules.get().get(InventoryTweaks.class).frameInput()) ((MinecraftAccessor) mc).meteor$handleInputEvents(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterDynamicMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterDynamicMixin.java index fe0facdf3e..5618e48452 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterDynamicMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTickCounterDynamicMixin.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Timer; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.DeltaTracker; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -15,13 +15,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(RenderTickCounter.Dynamic.class) +@Mixin(DeltaTracker.Timer.class) public abstract class RenderTickCounterDynamicMixin { @Shadow - private float dynamicDeltaTicks; + private float deltaTicks; - @Inject(method = "beginRenderTick(J)I", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderTickCounter$Dynamic;lastTimeMillis:J", opcode = Opcodes.PUTFIELD)) - private void onBeingRenderTick(long a, CallbackInfoReturnable info) { - dynamicDeltaTicks *= (float) Modules.get().get(Timer.class).getMultiplier(); + @Inject(method = "advanceGameTime(J)I", at = @At(value = "FIELD", target = "Lnet/minecraft/client/DeltaTracker$Timer;lastMs:J", opcode = Opcodes.PUTFIELD)) + private void onBeingRenderTick(long currentMs, CallbackInfoReturnable cir) { + deltaTicks *= (float) Modules.get().get(Timer.class).getMultiplier(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/EntityBucketItemAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTypeAccessor.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/mixin/EntityBucketItemAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/RenderTypeAccessor.java index 3b7dc0c93f..6af66443c5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/EntityBucketItemAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/RenderTypeAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.entity.EntityType; -import net.minecraft.item.EntityBucketItem; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.rendertype.RenderSetup; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(EntityBucketItem.class) -public interface EntityBucketItemAccessor { - @Accessor("entityType") - EntityType meteor$getEntityType(); +@Mixin(RenderType.class) +public interface RenderTypeAccessor { + @Accessor("state") + RenderSetup getState(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ResourceReloadLoggerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ResourceLoadStateTrackerAccessor.java similarity index 60% rename from src/main/java/meteordevelopment/meteorclient/mixin/ResourceReloadLoggerAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ResourceLoadStateTrackerAccessor.java index d3a8936845..e3f7c0bc5a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ResourceReloadLoggerAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ResourceLoadStateTrackerAccessor.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.client.resource.ResourceReloadLogger; +import net.minecraft.client.ResourceLoadStateTracker; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ResourceReloadLogger.class) -public interface ResourceReloadLoggerAccessor { +@Mixin(ResourceLoadStateTracker.class) +public interface ResourceLoadStateTrackerAccessor { @Accessor("reloadState") - ResourceReloadLogger.ReloadState meteor$getReloadState(); + ResourceLoadStateTracker.ReloadState meteor$getReloadState(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenEffectRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenEffectRendererMixin.java new file mode 100644 index 0000000000..c0760ff3a7 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenEffectRendererMixin.java @@ -0,0 +1,36 @@ +/* + * 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.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.MultiBufferSource; +import net.minecraft.client.renderer.ScreenEffectRenderer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +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(ScreenEffectRenderer.class) +public abstract class ScreenEffectRendererMixin { + @Inject(method = "renderFire", at = @At("HEAD"), cancellable = true) + private static void onRenderFireOverlay(PoseStack poseStack, MultiBufferSource bufferSource, TextureAtlasSprite sprite, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noFireOverlay()) ci.cancel(); + } + + @Inject(method = "renderWater", at = @At("HEAD"), cancellable = true) + private static void onRenderUnderwaterOverlay(Minecraft minecraft, PoseStack poseStack, MultiBufferSource bufferSource, CallbackInfo ci) { + if (Modules.get().get(NoRender.class).noLiquidOverlay()) ci.cancel(); + } + + @Inject(method = "renderTex", at = @At("HEAD"), cancellable = true) + private static void render(TextureAtlasSprite sprite, PoseStack poseStack, MultiBufferSource bufferSource, 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 c11686f611..c675bf43c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ScreenMixin.java @@ -15,11 +15,11 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.text.MeteorClickEvent; import meteordevelopment.meteorclient.utils.misc.text.RunnableClickEvent; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.input.KeyInput; -import net.minecraft.text.ClickEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.ChatScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.ClickEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -28,23 +28,22 @@ import java.util.List; -import static net.minecraft.client.util.InputUtil.*; +import static org.lwjgl.glfw.GLFW.*; @Mixin(value = Screen.class, priority = 500) // needs to be before baritone public abstract class ScreenMixin { - @Inject(method = "renderInGameBackground", at = @At("HEAD"), cancellable = true) - private void onRenderInGameBackground(CallbackInfo info) { + @Inject(method = "extractTransparentBackground", at = @At("HEAD"), cancellable = true) + private void onExtractTransparentBackground(CallbackInfo ci) { if (Utils.canUpdate() && Modules.get().get(NoRender.class).noGuiBackground()) - info.cancel(); + ci.cancel(); } - @Inject(method = "handleBasicClickEvent", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;)V", remap = false), cancellable = true) - private static void onHandleBasicClickEvent(ClickEvent clickEvent, MinecraftClient client, Screen screen, CallbackInfo ci) { - if (clickEvent instanceof RunnableClickEvent runnableClickEvent) { + @Inject(method = "defaultHandleClickEvent", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;)V", remap = false), cancellable = true) + private static void onDefaultHandleClickEvent(ClickEvent event, Minecraft minecraft, Screen activeScreen, CallbackInfo ci) { + if (event instanceof RunnableClickEvent runnableClickEvent) { runnableClickEvent.runnable.run(); ci.cancel(); - } - else if (clickEvent instanceof MeteorClickEvent meteorClickEvent && meteorClickEvent.value.startsWith(Config.get().prefix.get())) { + } else if (event instanceof MeteorClickEvent meteorClickEvent && meteorClickEvent.value.startsWith(Config.get().prefix.get())) { try { Commands.dispatch(meteorClickEvent.value.substring(Config.get().prefix.get().length())); } catch (CommandSyntaxException e) { @@ -56,11 +55,11 @@ else if (clickEvent instanceof MeteorClickEvent meteorClickEvent && meteorClickE } @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) - private void onKeyPressed(KeyInput input, CallbackInfoReturnable cir) { + private void onKeyPressed(KeyEvent event, CallbackInfoReturnable cir) { if ((Object) (this) instanceof ChatScreen) return; GUIMove guiMove = Modules.get().get(GUIMove.class); - List arrows = List.of(GLFW_KEY_RIGHT, GLFW_KEY_LEFT, GLFW_KEY_DOWN, GLFW_KEY_UP); - if ((guiMove.disableArrows() && arrows.contains(input.key())) || (guiMove.disableSpace() && input.key() == GLFW_KEY_SPACE)) { + List arrows = List.of(GLFW_KEY_RIGHT, GLFW_KEY_LEFT, GLFW_KEY_DOWN, GLFW_KEY_UP); + if ((guiMove.disableArrows() && arrows.contains(event.key())) || (guiMove.disableSpace() && event.key() == GLFW_KEY_SPACE)) { cir.setReturnValue(true); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SectionedEntityCacheAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/SectionedEntityCacheAccessor.java deleted file mode 100644 index 6b699102cb..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SectionedEntityCacheAccessor.java +++ /dev/null @@ -1,23 +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 it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import it.unimi.dsi.fastutil.longs.LongSortedSet; -import net.minecraft.world.entity.EntityLike; -import net.minecraft.world.entity.EntityTrackingSection; -import net.minecraft.world.entity.SectionedEntityCache; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(SectionedEntityCache.class) -public interface SectionedEntityCacheAccessor { - @Accessor("trackedPositions") - LongSortedSet meteor$getTrackedPositions(); - - @Accessor("trackingSections") - Long2ObjectMap> meteor$getTrackingSections(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ServerPlayerEntityMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ServerPlayerMixin.java similarity index 65% rename from src/main/java/meteordevelopment/meteorclient/mixin/ServerPlayerEntityMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ServerPlayerMixin.java index be0bf950b3..8a367bc752 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ServerPlayerEntityMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ServerPlayerMixin.java @@ -8,24 +8,24 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.Anchor; import meteordevelopment.meteorclient.systems.modules.movement.Scaffold; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; 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(ServerPlayerEntity.class) -public abstract class ServerPlayerEntityMixin extends LivingEntity { - protected ServerPlayerEntityMixin(EntityType entityType, World world) { +@Mixin(ServerPlayer.class) +public abstract class ServerPlayerMixin extends LivingEntity { + protected ServerPlayerMixin(EntityType entityType, Level world) { super(entityType, world); } - @Inject(method = "jump", at = @At("HEAD"), cancellable = true) + @Inject(method = "jumpFromGround", at = @At("HEAD"), cancellable = true) public void dontJump(CallbackInfo ci) { - if (!getEntityWorld().isClient()) return; + if (!level().isClientSide()) return; Anchor module = Modules.get().get(Anchor.class); if (module.isActive() && module.cancelJump) ci.cancel(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ServerboundMovePlayerPacketAccessor.java similarity index 74% rename from src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketAccessor.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ServerboundMovePlayerPacketAccessor.java index afcce5e406..696f001bf4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/PlayerMoveC2SPacketAccessor.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ServerboundMovePlayerPacketAccessor.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.mixin; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(PlayerMoveC2SPacket.class) -public interface PlayerMoveC2SPacketAccessor { +@Mixin(ServerboundMovePlayerPacket.class) +public interface ServerboundMovePlayerPacketAccessor { @Mutable @Accessor("y") void meteor$setY(double y); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ServerboundMovePlayerPacketMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ServerboundMovePlayerPacketMixin.java new file mode 100644 index 0000000000..7b2ee3c56e --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ServerboundMovePlayerPacketMixin.java @@ -0,0 +1,27 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.mixininterface.IServerboundMovePlayerPacket; +import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(ServerboundMovePlayerPacket.class) +public abstract class ServerboundMovePlayerPacketMixin implements IServerboundMovePlayerPacket { + @Unique + private int tag; + + @Override + public void meteor$setTag(int tag) { + this.tag = tag; + } + + @Override + public int meteor$getTag() { + return this.tag; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderLoaderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java similarity index 58% rename from src/main/java/meteordevelopment/meteorclient/mixin/ShaderLoaderMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java index a04a6d280c..bad493d0d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShaderLoaderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShaderManagerMixin.java @@ -6,16 +6,16 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines; -import net.minecraft.client.gl.ShaderLoader; +import net.minecraft.client.renderer.ShaderManager; 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(ShaderLoader.class) -public abstract class ShaderLoaderMixin { - @Inject(method = "apply(Lnet/minecraft/client/gl/ShaderLoader$Definitions;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/util/profiler/Profiler;)V", at = @At("TAIL")) - private void meteor$reloadPipelines(CallbackInfo info) { +@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(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShadowFeatureRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShadowFeatureRendererMixin.java new file mode 100644 index 0000000000..d04e28e4c3 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShadowFeatureRendererMixin.java @@ -0,0 +1,24 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollection; +import net.minecraft.client.renderer.feature.ShadowFeatureRenderer; +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(ShadowFeatureRenderer.class) +public abstract class ShadowFeatureRendererMixin { + @Inject(method = "renderTranslucent", at = @At("HEAD"), cancellable = true) + private void meteor$onRenderTranslucent(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource, CallbackInfo ci) { + if (nodeCollection.getShadowSubmits().isEmpty()) { + ci.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShadowPiecesCommandRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShadowPiecesCommandRendererMixin.java deleted file mode 100644 index 05fb3826e2..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShadowPiecesCommandRendererMixin.java +++ /dev/null @@ -1,24 +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 net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.command.BatchingRenderCommandQueue; -import net.minecraft.client.render.command.ShadowPiecesCommandRenderer; -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(ShadowPiecesCommandRenderer.class) -public abstract class ShadowPiecesCommandRendererMixin { - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void meteor$onRender(BatchingRenderCommandQueue queue, VertexConsumerProvider.Immediate vertexConsumers, CallbackInfo info) { - if (queue.getShadowPiecesCommands().isEmpty()) { - info.cancel(); - } - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxMenuAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxMenuAccessor.java new file mode 100644 index 0000000000..1194bf58b2 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxMenuAccessor.java @@ -0,0 +1,17 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.world.Container; +import net.minecraft.world.inventory.ShulkerBoxMenu; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ShulkerBoxMenu.class) +public interface ShulkerBoxMenuAccessor { + @Accessor("container") + Container meteor$getContainer(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxScreenHandlerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxScreenHandlerAccessor.java deleted file mode 100644 index 2b6975f82b..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ShulkerBoxScreenHandlerAccessor.java +++ /dev/null @@ -1,17 +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 net.minecraft.inventory.Inventory; -import net.minecraft.screen.ShulkerBoxScreenHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ShulkerBoxScreenHandler.class) -public interface ShulkerBoxScreenHandlerAccessor { - @Accessor("inventory") - Inventory meteor$getInventory(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleEntityLookupAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/SimpleEntityLookupAccessor.java deleted file mode 100644 index d8d440f2e0..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SimpleEntityLookupAccessor.java +++ /dev/null @@ -1,18 +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 net.minecraft.world.entity.EntityLike; -import net.minecraft.world.entity.SectionedEntityCache; -import net.minecraft.world.entity.SimpleEntityLookup; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(SimpleEntityLookup.class) -public interface SimpleEntityLookupAccessor { - @Accessor("cache") - SectionedEntityCache meteor$getCache(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SkinManagerAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/SkinManagerAccessor.java new file mode 100644 index 0000000000..9e760c1bca --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SkinManagerAccessor.java @@ -0,0 +1,16 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.resources.SkinManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(SkinManager.class) +public interface SkinManagerAccessor { + @Accessor("skinTextures") + SkinManager.TextureCache meteor$getSkinTextures(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SkyRenderingMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java similarity index 60% rename from src/main/java/meteordevelopment/meteorclient/mixin/SkyRenderingMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java index 1bc454569b..7cc2a2a432 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SkyRenderingMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SkyRendererMixin.java @@ -7,11 +7,11 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.SkyRendering; -import net.minecraft.client.render.state.SkyRenderState; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.SkyRenderer; +import net.minecraft.client.renderer.state.level.SkyRenderState; +import net.minecraft.world.level.dimension.DimensionType; import org.joml.Vector4fc; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -19,10 +19,10 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(SkyRendering.class) -public class SkyRenderingMixin { - @Inject(method = "updateRenderState", at = @At("TAIL")) - private void updateRenderState(ClientWorld world, float tickProgress, Camera camera, SkyRenderState state, CallbackInfo ci) { +@Mixin(SkyRenderer.class) +public abstract class SkyRendererMixin { + @Inject(method = "extractRenderState", at = @At("TAIL")) + private void updateRenderState(ClientLevel level, float partialTicks, Camera camera, SkyRenderState state, CallbackInfo ci) { Ambience ambience = Modules.get().get(Ambience.class); if (!ambience.isActive()) return; @@ -30,11 +30,12 @@ private void updateRenderState(ClientWorld world, float tickProgress, Camera cam if (ambience.customSkyColor.get()) state.skyColor = ambience.skyColor().getPacked(); } - @ModifyArg(method = "renderEndSky", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/DynamicUniforms;write(Lorg/joml/Matrix4fc;Lorg/joml/Vector4fc;Lorg/joml/Vector3fc;Lorg/joml/Matrix4fc;)Lcom/mojang/blaze3d/buffers/GpuBufferSlice;")) + @ModifyArg(method = "renderEndSky", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/DynamicUniforms;writeTransform(Lorg/joml/Matrix4fc;Lorg/joml/Vector4fc;Lorg/joml/Vector3fc;Lorg/joml/Matrix4fc;)Lcom/mojang/blaze3d/buffers/GpuBufferSlice;")) private Vector4fc modifyEndSkyColor(Vector4fc original) { Ambience ambience = Modules.get().get(Ambience.class); - if (ambience.isActive() && ambience.endSky.get() && ambience.customSkyColor.get()) return ambience.skyColor().getVec4f(); + if (ambience.isActive() && ambience.endSky.get() && ambience.customSkyColor.get()) + return ambience.skyColor().getVec4f(); else return original; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java index 6bbadb9476..63350ab4ef 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SlimeBlockMixin.java @@ -7,11 +7,11 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import net.minecraft.block.BlockState; -import net.minecraft.block.SlimeBlock; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SlimeBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -21,8 +21,8 @@ @Mixin(SlimeBlock.class) public abstract class SlimeBlockMixin { - @Inject(method = "onSteppedOn", at = @At("HEAD"), cancellable = true) - private void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity, CallbackInfo info) { - if (Modules.get().get(NoSlow.class).slimeBlock() && entity == mc.player) info.cancel(); + @Inject(method = "stepOn", at = @At("HEAD"), cancellable = true) + private void onStepOn(Level level, BlockPos pos, BlockState onState, Entity entity, CallbackInfo ci) { + if (Modules.get().get(NoSlow.class).slimeBlock() && entity == mc.player) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java index 7289bf0fbf..edf1bcc06b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SlotMixin.java @@ -6,23 +6,26 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.mixininterface.ISlot; -import net.minecraft.screen.slot.Slot; +import net.minecraft.world.inventory.Slot; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(Slot.class) public abstract class SlotMixin implements ISlot { - @Shadow public int id; - @Shadow @Final private int index; + @Shadow + public int index; + @Shadow + @Final + private int slot; @Override - public int meteor$getId() { - return id; + public int meteor$getIndex() { + return index; } @Override - public int meteor$getIndex() { - return index; + public int meteor$getSlot() { + return slot; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SoundSystemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SoundEngineMixin.java similarity index 50% rename from src/main/java/meteordevelopment/meteorclient/mixin/SoundSystemMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/SoundEngineMixin.java index 9f5ea249d0..33e3cec741 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SoundSystemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SoundEngineMixin.java @@ -10,9 +10,9 @@ import meteordevelopment.meteorclient.events.world.PlaySoundEvent; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.SoundBlocker; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.client.sound.SoundSystem; -import net.minecraft.client.sound.TickableSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.resources.sounds.TickableSoundInstance; +import net.minecraft.client.sounds.SoundEngine; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -20,20 +20,20 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(SoundSystem.class) -public abstract class SoundSystemMixin { +@Mixin(SoundEngine.class) +public abstract class SoundEngineMixin { @Shadow - public abstract void stop(SoundInstance sound); + public abstract void stop(SoundInstance soundInstance); - @Inject(method = "play(Lnet/minecraft/client/sound/SoundInstance;)Lnet/minecraft/client/sound/SoundSystem$PlayResult;", at = @At("HEAD"), cancellable = true) - private void onPlay(SoundInstance soundInstance, CallbackInfoReturnable cir) { - PlaySoundEvent event = MeteorClient.EVENT_BUS.post(PlaySoundEvent.get(soundInstance)); + @Inject(method = "play(Lnet/minecraft/client/resources/sounds/SoundInstance;)Lnet/minecraft/client/sounds/SoundEngine$PlayResult;", at = @At("HEAD"), cancellable = true) + private void onPlay(SoundInstance instance, CallbackInfoReturnable cir) { + PlaySoundEvent event = MeteorClient.EVENT_BUS.post(PlaySoundEvent.get(instance)); if (event.isCancelled()) cir.cancel(); } - @Inject(method = "tick()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/sound/TickableSoundInstance;tick()V", ordinal = 0)) - private void onTick(CallbackInfo ci, @Local TickableSoundInstance tickableSoundInstance) { - if (Modules.get().get(SoundBlocker.class).shouldBlock(tickableSoundInstance)) stop(tickableSoundInstance); + @Inject(method = "tickInGameSound()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/sounds/TickableSoundInstance;tick()V", ordinal = 0)) + private void onTick(CallbackInfo ci, @Local(name = "instance") TickableSoundInstance instance) { + if (Modules.get().get(SoundBlocker.class).shouldBlock(instance)) stop(instance); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/MobSpawnerBlockEntityRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SpawnerRendererMixin.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/mixin/MobSpawnerBlockEntityRendererMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/SpawnerRendererMixin.java index ef841ae845..d9d6f45ac7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/MobSpawnerBlockEntityRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SpawnerRendererMixin.java @@ -7,18 +7,18 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import net.minecraft.block.entity.MobSpawnerBlockEntity; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.MobSpawnerBlockEntityRenderer; -import net.minecraft.client.render.block.entity.state.MobSpawnerBlockEntityRenderState; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.SpawnerRenderer; +import net.minecraft.client.renderer.blockentity.state.SpawnerRenderState; 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(MobSpawnerBlockEntityRenderer.class) -public abstract class MobSpawnerBlockEntityRendererMixin implements BlockEntityRenderer { - @Inject(method = "renderDisplayEntity", at = @At("HEAD"), cancellable = true) +@Mixin(SpawnerRenderer.class) +public abstract class SpawnerRendererMixin implements BlockEntityRenderer { + @Inject(method = "submitEntityInSpawner", at = @At("HEAD"), cancellable = true) private static void onRenderDisplayEntity(CallbackInfo ci) { if (Modules.get().get(NoRender.class).noMobInSpawner()) ci.cancel(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SplashManagerMixin.java similarity index 55% rename from src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/SplashManagerMixin.java index ccb6ea4c11..5b761df2c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SplashTextResourceSupplierMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SplashManagerMixin.java @@ -6,9 +6,9 @@ package meteordevelopment.meteorclient.mixin; import meteordevelopment.meteorclient.systems.config.Config; -import net.minecraft.client.gui.screen.SplashTextRenderer; -import net.minecraft.client.resource.SplashTextResourceSupplier; -import net.minecraft.text.Text; +import net.minecraft.client.gui.components.SplashRenderer; +import net.minecraft.client.resources.SplashManager; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -18,8 +18,8 @@ import java.util.List; import java.util.Random; -@Mixin(SplashTextResourceSupplier.class) -public abstract class SplashTextResourceSupplierMixin { +@Mixin(SplashManager.class) +public abstract class SplashManagerMixin { @Unique private boolean override = true; @Unique @@ -27,24 +27,25 @@ public abstract class SplashTextResourceSupplierMixin { @Unique private final List meteorSplashes = getMeteorSplashes(); - @Inject(method = "get", at = @At("HEAD"), cancellable = true) - private void onApply(CallbackInfoReturnable cir) { + @Inject(method = "getSplash", at = @At("HEAD"), cancellable = true) + private void onApply(CallbackInfoReturnable cir) { if (Config.get() == null || !Config.get().titleScreenSplashes.get()) return; - if (override) cir.setReturnValue(new SplashTextRenderer(Text.literal(meteorSplashes.get(random.nextInt(meteorSplashes.size()))))); + if (override) + cir.setReturnValue(new SplashRenderer(Component.literal(meteorSplashes.get(random.nextInt(meteorSplashes.size()))))); override = !override; } @Unique private static List getMeteorSplashes() { return List.of( - "Meteor on Crack!", - "Star Meteor Client on GitHub!", - "Based utility mod.", - "§6MineGame159 §fbased god", - "§4meteorclient.com", - "§4Meteor on Crack!", - "§6Meteor on Crack!" + "Meteor on Crack!", + "Star Meteor Client on GitHub!", + "Based utility mod.", + "§6MineGame159 §fbased god", + "§4meteorclient.com", + "§4Meteor on Crack!", + "§6Meteor on Crack!" ); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TextVisitFactoryMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/StringDecomposerMixin.java similarity index 58% rename from src/main/java/meteordevelopment/meteorclient/mixin/TextVisitFactoryMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/StringDecomposerMixin.java index d0dd876a27..a5ff1588cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TextVisitFactoryMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/StringDecomposerMixin.java @@ -7,19 +7,19 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.player.NameProtect; -import net.minecraft.text.TextVisitFactory; +import net.minecraft.util.StringDecomposer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; -@Mixin(TextVisitFactory.class) -public abstract class TextVisitFactoryMixin { +@Mixin(StringDecomposer.class) +public abstract class StringDecomposerMixin { @ModifyArg(at = @At(value = "INVOKE", - target = "Lnet/minecraft/text/TextVisitFactory;visitFormatted(Ljava/lang/String;ILnet/minecraft/text/Style;Lnet/minecraft/text/Style;Lnet/minecraft/text/CharacterVisitor;)Z", - ordinal = 0), - method = { - "visitFormatted(Ljava/lang/String;ILnet/minecraft/text/Style;Lnet/minecraft/text/CharacterVisitor;)Z"}, - index = 0) + target = "Lnet/minecraft/util/StringDecomposer;iterateFormatted(Ljava/lang/String;ILnet/minecraft/network/chat/Style;Lnet/minecraft/network/chat/Style;Lnet/minecraft/util/FormattedCharSink;)Z", + ordinal = 0), + method = { + "iterateFormatted(Ljava/lang/String;ILnet/minecraft/network/chat/Style;Lnet/minecraft/util/FormattedCharSink;)Z"}, + index = 0) private static String adjustText(String text) { if (Modules.get() != null) return Modules.get().get(NameProtect.class).replaceName(text); else return text; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StringSplitterAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/StringSplitterAccessor.java new file mode 100644 index 0000000000..7e4e9a1e27 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/StringSplitterAccessor.java @@ -0,0 +1,16 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import net.minecraft.client.StringSplitter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(StringSplitter.class) +public interface StringSplitterAccessor { + @Accessor("widthProvider") + StringSplitter.WidthProvider meteor$getWidthProvider(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/StringHelperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/StringUtilMixin.java similarity index 71% rename from src/main/java/meteordevelopment/meteorclient/mixin/StringHelperMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/StringUtilMixin.java index 4d525d5c0c..f4c8b0df89 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/StringHelperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/StringUtilMixin.java @@ -7,14 +7,14 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.misc.BetterChat; -import net.minecraft.util.StringHelper; +import net.minecraft.util.StringUtil; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; -@Mixin(StringHelper.class) -public abstract class StringHelperMixin { - @ModifyArg(method = "truncateChat", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/StringHelper;truncate(Ljava/lang/String;IZ)Ljava/lang/String;"), index = 1) +@Mixin(StringUtil.class) +public abstract class StringUtilMixin { + @ModifyArg(method = "trimChatMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/StringUtil;truncateStringIfNecessary(Ljava/lang/String;IZ)Ljava/lang/String;"), index = 1) private static int injected(int maxLength) { // this method is only used in one place, to truncate chat messages, so it's fine to do this return (Modules.get().get(BetterChat.class).isInfiniteChatBox() ? Integer.MAX_VALUE : maxLength); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/SweetBerryBushBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/SweetBerryBushBlockMixin.java index 13afbd9413..ca62838a3b 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/SweetBerryBushBlockMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/SweetBerryBushBlockMixin.java @@ -5,12 +5,14 @@ package meteordevelopment.meteorclient.mixin; -import com.llamalad7.mixinextras.sugar.Local; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; -import net.minecraft.block.SweetBerryBushBlock; -import net.minecraft.entity.Entity; -import org.spongepowered.asm.mixin.Dynamic; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.InsideBlockEffectApplier; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SweetBerryBushBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -20,13 +22,8 @@ @Mixin(SweetBerryBushBlock.class) public abstract class SweetBerryBushBlockMixin { - @Dynamic("Explicit 1.21.9 Support") - @Inject(method = { - "onEntityCollision", // 1.21.10 - "onEntityCollision(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/entity/Entity;Lnet/minecraft/entity/EntityCollisionHandler;)V", // 1.21.9 yarn - "method_9548(Lnet/minecraft/class_2680;Lnet/minecraft/class_1937;Lnet/minecraft/class_2338;Lnet/minecraft/class_1297;Lnet/minecraft/class_10774;)V" // 1.21.9 intermediary - }, at = @At("HEAD"), cancellable = true) - private void onEntityCollision(CallbackInfo ci, @Local(argsOnly = true) Entity entity) { + @Inject(method = "entityInside", at = @At("HEAD"), cancellable = true) + private void onEntityCollision(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean isPrecise, CallbackInfo ci) { if (entity == mc.player && Modules.get().get(NoSlow.class).berryBush()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java index eabc7b3268..09f5e976df 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TitleScreenMixin.java @@ -7,11 +7,11 @@ import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.utils.player.TitleScreenCredits; -import net.minecraft.client.gui.Click; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.text.Text; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; +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; @@ -21,19 +21,19 @@ @Mixin(TitleScreen.class) public abstract class TitleScreenMixin extends Screen { - public TitleScreenMixin(Text title) { + public TitleScreenMixin(Component title) { super(title); } - @Inject(method = "render", at = @At("TAIL")) - private void onRender(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (Config.get().titleScreenCredits.get()) TitleScreenCredits.render(context); + @Inject(method = "extractRenderState", at = @At("TAIL")) + private void onExtractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a, CallbackInfo ci) { + if (Config.get().titleScreenCredits.get()) TitleScreenCredits.render(graphics); } @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) - private void onMouseClicked(Click click, boolean doubled, CallbackInfoReturnable cir) { - if (Config.get().titleScreenCredits.get() && click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) { - if (TitleScreenCredits.onClicked(click.x(), click.y())) cir.setReturnValue(true); + private void onMouseClicked(MouseButtonEvent event, boolean doubleClick, CallbackInfoReturnable cir) { + if (Config.get().titleScreenCredits.get() && event.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT) { + if (TitleScreenCredits.onClicked(event.x(), event.y())) cir.setReturnValue(true); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TooltipComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TooltipComponentMixin.java deleted file mode 100644 index dc4379d0ca..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TooltipComponentMixin.java +++ /dev/null @@ -1,22 +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 meteordevelopment.meteorclient.utils.tooltip.MeteorTooltipData; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.item.tooltip.TooltipData; -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; - -@Mixin(TooltipComponent.class) -public interface TooltipComponentMixin { - @Inject(method = "of(Lnet/minecraft/item/tooltip/TooltipData;)Lnet/minecraft/client/gui/tooltip/TooltipComponent;", at = @At("HEAD"), cancellable = true) - private static void shortcutMeteorTooltipData(TooltipData tooltipData, CallbackInfoReturnable cir) { - if (tooltipData instanceof MeteorTooltipData) cir.setReturnValue(null); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TooltipDisplayComponentMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TooltipDisplayMixin.java similarity index 63% rename from src/main/java/meteordevelopment/meteorclient/mixin/TooltipDisplayComponentMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/TooltipDisplayMixin.java index ac674316ba..a2e51fd563 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TooltipDisplayComponentMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TooltipDisplayMixin.java @@ -8,18 +8,18 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.BetterTooltips; -import net.minecraft.component.type.TooltipDisplayComponent; +import net.minecraft.world.item.component.TooltipDisplay; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(TooltipDisplayComponent.class) -public abstract class TooltipDisplayComponentMixin { - @ModifyExpressionValue(method = "shouldDisplay", at = @At(value = "FIELD", target = "Lnet/minecraft/component/type/TooltipDisplayComponent;hideTooltip:Z")) +@Mixin(TooltipDisplay.class) +public abstract class TooltipDisplayMixin { + @ModifyExpressionValue(method = "shows", at = @At(value = "FIELD", target = "Lnet/minecraft/world/item/component/TooltipDisplay;hideTooltip:Z")) private boolean modifyHideTooltip(boolean original) { return original && !Modules.get().get(BetterTooltips.class).tooltip.get(); } - @ModifyExpressionValue(method = "shouldDisplay", at = @At(value = "INVOKE", target = "Ljava/util/SequencedSet;contains(Ljava/lang/Object;)Z")) + @ModifyExpressionValue(method = "shows", at = @At(value = "INVOKE", target = "Ljava/util/SequencedSet;contains(Ljava/lang/Object;)Z")) private boolean modifyHiddenComponents(boolean original) { return original && !Modules.get().get(BetterTooltips.class).additional.get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java index 0d3e1a9e71..08bb10c25c 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/TridentItemMixin.java @@ -9,10 +9,10 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.movement.TridentBoost; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.TridentItem; -import net.minecraft.world.World; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TridentItem; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -24,17 +24,17 @@ @Mixin(TridentItem.class) public abstract class TridentItemMixin { - @Inject(method = "onStoppedUsing", at = @At("HEAD")) - private void onStoppedUsingHead(ItemStack stack, World world, LivingEntity user, int remainingUseTicks, CallbackInfoReturnable info) { - if (user == mc.player) Utils.isReleasingTrident = true; + @Inject(method = "releaseUsing", at = @At("HEAD")) + private void onReleaseUsingHead(ItemStack itemStack, Level level, LivingEntity entity, int remainingTime, CallbackInfoReturnable cir) { + if (entity == mc.player) Utils.isReleasingTrident = true; } - @Inject(method = "onStoppedUsing", at = @At("TAIL")) - private void onStoppedUsingTail(ItemStack stack, World world, LivingEntity user, int remainingUseTicks, CallbackInfoReturnable info) { - if (user == mc.player) Utils.isReleasingTrident = false; + @Inject(method = "releaseUsing", at = @At("TAIL")) + private void onReleaseUsingTail(ItemStack itemStack, Level level, LivingEntity entity, int remainingTime, CallbackInfoReturnable cir) { + if (entity == mc.player) Utils.isReleasingTrident = false; } - @ModifyArgs(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;addVelocity(DDD)V")) + @ModifyArgs(method = "releaseUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;push(DDD)V")) private void modifyVelocity(Args args) { TridentBoost tridentBoost = Modules.get().get(TridentBoost.class); @@ -43,14 +43,14 @@ private void modifyVelocity(Args args) { args.set(2, (double) args.get(2) * tridentBoost.getMultiplier()); } - @ModifyExpressionValue(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isTouchingWaterOrRain()Z")) + @ModifyExpressionValue(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isInWaterOrRain()Z")) private boolean isInWaterUse(boolean original) { TridentBoost tridentBoost = Modules.get().get(TridentBoost.class); return tridentBoost.allowOutOfWater() || original; } - @ModifyExpressionValue(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isTouchingWaterOrRain()Z")) + @ModifyExpressionValue(method = "releaseUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isInWaterOrRain()Z")) private boolean isInWaterPostUse(boolean original) { TridentBoost tridentBoost = Modules.get().get(TridentBoost.class); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/Vec3Mixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/Vec3Mixin.java new file mode 100644 index 0000000000..cf6615aec6 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/Vec3Mixin.java @@ -0,0 +1,53 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.mixininterface.IVec3; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(Vec3.class) +public abstract class Vec3Mixin implements IVec3 { + @Shadow + @Final + @Mutable + public double x; + @Shadow + @Final + @Mutable + public double y; + @Shadow + @Final + @Mutable + public double z; + + @Override + public Vec3 meteor$set(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + + return (Vec3) (Object) this; + } + + @Override + public Vec3 meteor$setXZ(double x, double z) { + this.x = x; + this.z = z; + + return (Vec3) (Object) this; + } + + @Override + public Vec3 meteor$setY(double y) { + this.y = y; + + return (Vec3) (Object) this; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/Vec3dMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/Vec3dMixin.java deleted file mode 100644 index 2349e8f786..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/Vec3dMixin.java +++ /dev/null @@ -1,44 +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 meteordevelopment.meteorclient.mixininterface.IVec3d; -import net.minecraft.util.math.Vec3d; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(Vec3d.class) -public abstract class Vec3dMixin implements IVec3d { - @Shadow @Final @Mutable public double x; - @Shadow @Final @Mutable public double y; - @Shadow @Final @Mutable public double z; - - @Override - public Vec3d meteor$set(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - - return (Vec3d) (Object) this; - } - - @Override - public Vec3d meteor$setXZ(double x, double z) { - this.x = x; - this.z = z; - - return (Vec3d) (Object) this; - } - - @Override - public Vec3d meteor$setY(double y) { - this.y = y; - - return (Vec3d) (Object) this; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkOcclusionDataBuilderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/VisGraphMixin.java similarity index 62% rename from src/main/java/meteordevelopment/meteorclient/mixin/ChunkOcclusionDataBuilderMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/VisGraphMixin.java index 6d53a458a9..433bdd37b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/ChunkOcclusionDataBuilderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/VisGraphMixin.java @@ -7,18 +7,18 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.world.ChunkOcclusionEvent; -import net.minecraft.client.render.chunk.ChunkOcclusionDataBuilder; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.renderer.chunk.VisGraph; +import net.minecraft.core.BlockPos; 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(ChunkOcclusionDataBuilder.class) -public abstract class ChunkOcclusionDataBuilderMixin { - @Inject(method = "markClosed", at = @At("HEAD"), cancellable = true) - private void onMarkClosed(BlockPos pos, CallbackInfo info) { +@Mixin(VisGraph.class) +public abstract class VisGraphMixin { + @Inject(method = "setOpaque", at = @At("HEAD"), cancellable = true) + private void onMarkClosed(BlockPos pos, CallbackInfo ci) { ChunkOcclusionEvent event = MeteorClient.EVENT_BUS.post(ChunkOcclusionEvent.get()); - if (event.isCancelled()) info.cancel(); + if (event.isCancelled()) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WebBlockMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WebBlockMixin.java new file mode 100644 index 0000000000..343680108f --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WebBlockMixin.java @@ -0,0 +1,29 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin; + +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.movement.NoSlow; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.InsideBlockEffectApplier; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.WebBlock; +import net.minecraft.world.level.block.state.BlockState; +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 static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(WebBlock.class) +public abstract class WebBlockMixin { + @Inject(method = "entityInside", at = @At("HEAD"), cancellable = true) + private void onEntityCollision(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean isPrecise, CallbackInfo ci) { + if (entity == mc.player && Modules.get().get(NoSlow.class).cobweb()) ci.cancel(); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WingsLayerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WingsLayerMixin.java new file mode 100644 index 0000000000..a5958ab9bb --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WingsLayerMixin.java @@ -0,0 +1,38 @@ +/* + * 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.mixininterface.IEntityRenderState; +import meteordevelopment.meteorclient.utils.network.Capes; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.entity.layers.WingsLayer; +import net.minecraft.client.renderer.entity.state.HumanoidRenderState; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.player.Player; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(WingsLayer.class) +public abstract class WingsLayerMixin> extends RenderLayer { + public WingsLayerMixin(RenderLayerParent context) { + super(context); + } + + @ModifyExpressionValue(method = "submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;ILnet/minecraft/client/renderer/entity/state/HumanoidRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/WingsLayer;getPlayerElytraTexture(Lnet/minecraft/client/renderer/entity/state/HumanoidRenderState;)Lnet/minecraft/resources/Identifier;")) + private Identifier modifyCapeTexture(Identifier original, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords, S state, float yRot, float xRot) { + if (((IEntityRenderState) state).meteor$getEntity() instanceof Player player) { + Identifier id = Capes.get(player); + return id == null ? original : id; + } + + return original; + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldAccessor.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldAccessor.java deleted file mode 100644 index 94773488d7..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldAccessor.java +++ /dev/null @@ -1,18 +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 net.minecraft.entity.Entity; -import net.minecraft.world.World; -import net.minecraft.world.entity.EntityLookup; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(World.class) -public interface WorldAccessor { - @Invoker("getEntityLookup") - EntityLookup meteor$getEntityLookup(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldBorderMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldBorderMixin.java index e92c975fcd..fd1328f552 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldBorderMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/WorldBorderMixin.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Collisions; -import net.minecraft.world.border.WorldBorder; +import net.minecraft.world.level.border.WorldBorder; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -15,13 +15,13 @@ @Mixin(WorldBorder.class) public abstract class WorldBorderMixin { - @Inject(method = "canCollide", at = @At("HEAD"), cancellable = true) - private void canCollide(CallbackInfoReturnable info) { - if (Modules.get().get(Collisions.class).ignoreBorder()) info.setReturnValue(false); + @Inject(method = "isInsideCloseToBorder", at = @At("HEAD"), cancellable = true) + private void canCollide(CallbackInfoReturnable cir) { + if (Modules.get().get(Collisions.class).ignoreBorder()) cir.setReturnValue(false); } - @Inject(method = "contains(Lnet/minecraft/util/math/BlockPos;)Z", at = @At("HEAD"), cancellable = true) - private void contains(CallbackInfoReturnable info) { - if (Modules.get().get(Collisions.class).ignoreBorder()) info.setReturnValue(true); + @Inject(method = "isWithinBounds(Lnet/minecraft/core/BlockPos;)Z", at = @At("HEAD"), cancellable = true) + private void contains(CallbackInfoReturnable cir) { + if (Modules.get().get(Collisions.class).ignoreBorder()) cir.setReturnValue(true); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java deleted file mode 100644 index a520989d80..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java +++ /dev/null @@ -1,251 +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.v2.WrapWithCondition; -import com.mojang.blaze3d.buffers.GpuBufferSlice; -import it.unimi.dsi.fastutil.Stack; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import meteordevelopment.meteorclient.mixininterface.IEntityRenderState; -import meteordevelopment.meteorclient.mixininterface.IWorldRenderer; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.BlockSelection; -import meteordevelopment.meteorclient.systems.modules.render.ESP; -import meteordevelopment.meteorclient.systems.modules.render.Freecam; -import meteordevelopment.meteorclient.systems.modules.render.NoRender; -import meteordevelopment.meteorclient.systems.modules.world.Ambience; -import meteordevelopment.meteorclient.utils.OutlineRenderCommandQueue; -import meteordevelopment.meteorclient.utils.render.NoopImmediateVertexConsumerProvider; -import meteordevelopment.meteorclient.utils.render.NoopOutlineVertexConsumerProvider; -import meteordevelopment.meteorclient.utils.render.WrapperImmediateVertexConsumerProvider; -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.gl.Framebuffer; -import net.minecraft.client.render.*; -import net.minecraft.client.render.command.OrderedRenderCommandQueue; -import net.minecraft.client.render.command.RenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderManager; -import net.minecraft.client.render.state.OutlineRenderState; -import net.minecraft.client.render.state.WeatherRenderState; -import net.minecraft.client.render.state.WorldBorderRenderState; -import net.minecraft.client.render.state.WorldRenderState; -import net.minecraft.client.util.Handle; -import net.minecraft.client.util.ObjectAllocator; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Vec3d; -import org.joml.Matrix4f; -import org.joml.Vector4f; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.function.Function; - -import static meteordevelopment.meteorclient.MeteorClient.mc; - -@Mixin(WorldRenderer.class) -public abstract class WorldRendererMixin implements IWorldRenderer { - - @Unique private NoRender noRender; - @Unique private ESP esp; - - // if a world exists, meteor is initialised - @Inject(method = "setWorld", at = @At("TAIL")) - private void onSetWorld(ClientWorld world, CallbackInfo ci) { - esp = Modules.get().get(ESP.class); - noRender = Modules.get().get(NoRender.class); - } - - @Inject(method = "checkEmpty", at = @At("HEAD"), cancellable = true) - private void onCheckEmpty(MatrixStack matrixStack, CallbackInfo info) { - info.cancel(); - } - - @Inject(method = "drawBlockOutline", at = @At("HEAD"), cancellable = true) - private void onDrawHighlightedBlockOutline(MatrixStack matrices, VertexConsumer vertexConsumer, double x, double y, double z, OutlineRenderState state, int i, float f, CallbackInfo ci) { - if (Modules.get().isActive(BlockSelection.class)) ci.cancel(); - } - - @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;updateCamera(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;Z)V"), index = 2) - private boolean renderSetupTerrainModifyArg(boolean spectator) { - return Modules.get().isActive(Freecam.class) || spectator; - } - - // No Render - - @WrapWithCondition(method = "method_62216", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WeatherRendering;renderPrecipitation(Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/util/math/Vec3d;Lnet/minecraft/client/render/state/WeatherRenderState;)V")) - private boolean shouldRenderPrecipitation(WeatherRendering instance, VertexConsumerProvider vertexConsumers, Vec3d pos, WeatherRenderState weatherRenderState) { - return !noRender.noWeather(); - } - - @WrapWithCondition(method = "method_62216", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldBorderRendering;render(Lnet/minecraft/client/render/state/WorldBorderRenderState;Lnet/minecraft/util/math/Vec3d;DD)V")) - private boolean shouldRenderWorldBorder(WorldBorderRendering instance, WorldBorderRenderState state, Vec3d cameraPos, double viewDistanceBlocks, double farPlaneDistance) { - return !noRender.noWorldBorder(); - } - - @Inject(method = "hasBlindnessOrDarkness(Lnet/minecraft/client/render/Camera;)Z", at = @At("HEAD"), cancellable = true) - private void hasBlindnessOrDarkness(Camera camera, CallbackInfoReturnable info) { - if (noRender.noBlindness() || noRender.noDarkness()) info.setReturnValue(null); - } - - // Entity Shaders - - @Inject(method = "render", at = @At("HEAD")) - private void onRenderHead(ObjectAllocator allocator, - RenderTickCounter tickCounter, - boolean renderBlockOutline, - Camera camera, - Matrix4f positionMatrix, - Matrix4f projectionMatrix, - Matrix4f matrix4f2, - GpuBufferSlice fog, - Vector4f fogColor, - boolean shouldRenderSky, - CallbackInfo ci) { - PostProcessShaders.beginRender(); - } - - @Unique - private final OutlineRenderCommandQueue outlineRenderCommandQueue = new OutlineRenderCommandQueue(); - - @Unique - private VertexConsumerProvider provider; - - @Unique - private RenderDispatcher renderDispatcher; - - @Inject(method = "pushEntityRenders", at = @At("TAIL")) - private void onPushEntityRenders(MatrixStack matrices, WorldRenderState worldState, OrderedRenderCommandQueue queue, CallbackInfo info) { - if (renderDispatcher == null) { - renderDispatcher = new RenderDispatcher( - outlineRenderCommandQueue, - mc.getBlockRenderManager(), - new WrapperImmediateVertexConsumerProvider(() -> provider), - mc.getAtlasManager(), - NoopOutlineVertexConsumerProvider.INSTANCE, - NoopImmediateVertexConsumerProvider.INSTANCE, - mc.textRenderer - ); - } - - draw(worldState, matrices, PostProcessShaders.CHAMS, entity -> Color.WHITE); - draw(worldState, matrices, PostProcessShaders.ENTITY_OUTLINE, entity -> esp.getColor(entity)); - } - - @Unique - private void draw(WorldRenderState worldState, MatrixStack matrices, EntityShader shader, Function colorGetter) { - var camera = worldState.cameraRenderState.pos; - var empty = true; - - for (var state : worldState.entityRenderStates) { - Entity entity = ((IEntityRenderState) state).meteor$getEntity(); - if (entity == null) continue; - - if (!shader.shouldDraw(entity)) continue; - - var color = colorGetter.apply(entity); - if (color == null) continue; - outlineRenderCommandQueue.setColor(color); - - var renderer = entityRenderManager.getRenderer(state); - var offset = renderer.getPositionOffset(state); - - matrices.push(); - matrices.translate(state.x - camera.x + offset.x, state.y - camera.y + offset.y, state.z - camera.z + offset.z); - renderer.render(state, matrices, outlineRenderCommandQueue, worldState.cameraRenderState); - matrices.pop(); - - empty = false; - } - - if (empty) - return; - - meteor$pushEntityOutlineFramebuffer(shader.framebuffer); - provider = shader.vertexConsumerProvider; - - renderDispatcher.render(); - outlineRenderCommandQueue.onNextFrame(); - - provider = null; - meteor$popEntityOutlineFramebuffer(); - } - - @ModifyExpressionValue(method = "fillEntityRenderStates", at = @At(value= "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;isRenderingReady(Lnet/minecraft/util/math/BlockPos;)Z")) - boolean fillEntityRenderStatesIsRenderingReady(boolean original) { - if (esp.forceRender()) return true; - return original; - } - - @Inject(method = "method_62214", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;draw()V")) - private void onRender(CallbackInfo ci) { - PostProcessShaders.submitEntityVertices(); - } - - @Inject(method = "onResized", at = @At("HEAD")) - private void onResized(int width, int height, CallbackInfo info) { - PostProcessShaders.onResized(width, height); - } - - @ModifyArg(method = "method_62205", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/CloudRenderer;renderClouds(ILnet/minecraft/client/option/CloudRenderMode;FLnet/minecraft/util/math/Vec3d;JF)V")) - private int modifyColor(int original) { - Ambience ambience = Modules.get().get(Ambience.class); - if (ambience.isActive() && ambience.customCloudColor.get()) { - return ambience.cloudColor.get().getPacked(); - } - - return original; - } - - // IWorldRenderer - - @Shadow - private Framebuffer entityOutlineFramebuffer; - - @Shadow - @Final - private DefaultFramebufferSet framebufferSet; - - @Shadow - @Final - private EntityRenderManager entityRenderManager; - @Unique - private Stack framebufferStack; - - @Unique - private Stack> framebufferHandleStack; - - @Inject(method = "", at = @At("TAIL")) - private void init$IWorldRenderer(CallbackInfo info) { - framebufferStack = new ObjectArrayList<>(); - framebufferHandleStack = new ObjectArrayList<>(); - } - - @Override - public void meteor$pushEntityOutlineFramebuffer(Framebuffer framebuffer) { - framebufferStack.push(this.entityOutlineFramebuffer); - this.entityOutlineFramebuffer = framebuffer; - - framebufferHandleStack.push(this.framebufferSet.entityOutlineFramebuffer); - this.framebufferSet.entityOutlineFramebuffer = () -> framebuffer; - } - - @Override - public void meteor$popEntityOutlineFramebuffer() { - this.entityOutlineFramebuffer = framebufferStack.pop(); - this.framebufferSet.entityOutlineFramebuffer = framebufferHandleStack.pop(); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/baritone/ComeCommandMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/baritone/ComeCommandMixin.java index 3701c95c10..06cab8d066 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/baritone/ComeCommandMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/baritone/ComeCommandMixin.java @@ -22,7 +22,7 @@ public abstract class ComeCommandMixin { private void getComeCommandTarget(Args args) { Freecam freecam = Modules.get().get(Freecam.class); if (freecam.isActive()) { - float tickDelta = mc.getRenderTickCounter().getTickProgress(true); + float tickDelta = mc.getDeltaTracker().getGameTimeDeltaPartialTick(true); args.set(0, new GoalBlock((int) freecam.getX(tickDelta), (int) freecam.getY(tickDelta), (int) freecam.getZ(tickDelta))); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractTerrainRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractTerrainRenderContextMixin.java deleted file mode 100644 index 10ef47bf82..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AbstractTerrainRenderContextMixin.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.indigo; - -import meteordevelopment.meteorclient.systems.modules.render.Xray; -import net.fabricmc.fabric.impl.client.indigo.renderer.mesh.MutableQuadViewImpl; -import net.fabricmc.fabric.impl.client.indigo.renderer.render.AbstractTerrainRenderContext; -import net.fabricmc.fabric.impl.client.indigo.renderer.render.BlockRenderInfo; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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(AbstractTerrainRenderContext.class) -public abstract class AbstractTerrainRenderContextMixin { - @Final @Shadow(remap = false) - protected BlockRenderInfo blockInfo; - - @Inject(method = "bufferQuad", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/impl/client/indigo/renderer/render/AbstractTerrainRenderContext;bufferQuad(Lnet/fabricmc/fabric/impl/client/indigo/renderer/mesh/MutableQuadViewImpl;Lnet/minecraft/client/render/VertexConsumer;)V"), cancellable = true) - private void onBufferQuad(MutableQuadViewImpl quad, CallbackInfo ci) { - int alpha = Xray.getAlpha(blockInfo.blockState, blockInfo.blockPos); - - if (alpha == 0) ci.cancel(); - else if (alpha != -1) { - for (int i = 0; i < 4; i++) { - quad.color(i, rewriteQuadAlpha(quad.color(i), alpha)); - } - } - } - - @Unique - private int rewriteQuadAlpha(int color, int alpha) { - return ((alpha & 0xFF) << 24) | (color & 0x00FFFFFF); - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AltModelBlockRendererImplMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AltModelBlockRendererImplMixin.java new file mode 100644 index 0000000000..7ef273d2a0 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/AltModelBlockRendererImplMixin.java @@ -0,0 +1,67 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixin.indigo; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.render.Xray; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.impl.client.indigo.renderer.render.AltModelBlockRendererImpl; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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.CallbackInfoReturnable; + +@SuppressWarnings("UnstableApiUsage") +@Mixin(AltModelBlockRendererImpl.class) +public abstract class AltModelBlockRendererImplMixin { + @Shadow + private BlockState blockState; + + @Shadow + private BlockPos pos; + + @Shadow + private BlockAndTintGetter level; + + @ModifyReturnValue(method = "shouldCullFace", at = @At("RETURN")) + private boolean shouldCullFace$xray(boolean original, Direction direction) { + if (direction == null) return original; + + Xray xray = Modules.get().get(Xray.class); + + if (xray.isActive()) { + return xray.modifyDrawSide(blockState, level, pos, direction, original); + } + + return original; + } + + @Inject(method = "transform", at = @At("RETURN"), cancellable = true) + private void transform$xray(MutableQuadView quad, CallbackInfoReturnable cir) { + int alpha = Xray.getAlpha(blockState, pos); + + if (alpha == 0) { + cir.setReturnValue(false); + } + else if (alpha != -1) { + for (int i = 0; i < 4; i++) { + quad.color(i, rewriteQuadAlpha(quad.color(i), alpha)); + } + } + } + + @Unique + private static int rewriteQuadAlpha(int color, int alpha) { + return ((alpha & 0xFF) << 24) | (color & 0x00FFFFFF); + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/BlockRenderInfoMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/indigo/BlockRenderInfoMixin.java deleted file mode 100644 index db2c459473..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixin/indigo/BlockRenderInfoMixin.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.indigo; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.systems.modules.render.Xray; -import net.fabricmc.fabric.impl.client.indigo.renderer.render.BlockRenderInfo; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockRenderView; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(BlockRenderInfo.class) -public abstract class BlockRenderInfoMixin { - @Shadow - public BlockState blockState; - - @Shadow - public BlockRenderView blockView; - - @Shadow - public BlockPos blockPos; - - @ModifyReturnValue(method = "shouldDrawSide", at = @At("RETURN")) - private boolean modifyShouldDrawSide(boolean original, Direction side) { - Xray xray = Modules.get().get(Xray.class); - - if (xray.isActive()) { - return xray.modifyDrawSide(blockState, blockView, blockPos, side, original); - } - - return original; - } -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java index 4fee2f4f8e..e0a3ecdd9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/ChunkAwareBlockCollisionSweeperMixin.java @@ -11,28 +11,28 @@ import meteordevelopment.meteorclient.events.world.CollisionShapeEvent; import net.caffeinemc.mods.lithium.common.entity.movement.ChunkAwareBlockCollisionSweeper; import net.caffeinemc.mods.lithium.common.entity.movement.ChunkAwareBlockCollisionSweeperVoxelShape; -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Box; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(value = ChunkAwareBlockCollisionSweeperVoxelShape.class) public abstract class ChunkAwareBlockCollisionSweeperMixin extends ChunkAwareBlockCollisionSweeper { - public ChunkAwareBlockCollisionSweeperMixin(World world, @Nullable Entity entity, Box box, boolean hideLastCollision) { + public ChunkAwareBlockCollisionSweeperMixin(Level world, @Nullable Entity entity, AABB box, boolean hideLastCollision) { super(world, entity, box, hideLastCollision); } - @ModifyExpressionValue(method = "computeNext()Lnet/minecraft/util/shape/VoxelShape;", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/ShapeContext;getCollisionShape(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/CollisionView;Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/util/shape/VoxelShape;")) + @ModifyExpressionValue(method = "computeNext()Lnet/minecraft/world/phys/shapes/VoxelShape;", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/shapes/CollisionContext;getCollisionShape(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/CollisionGetter;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/phys/shapes/VoxelShape;")) private VoxelShape modifyCollisionShape(VoxelShape original, @Local(name = "state") BlockState state) { - if (world != MinecraftClient.getInstance().world) return original; + if (world != Minecraft.getInstance().level) return original; CollisionShapeEvent event = MeteorClient.EVENT_BUS.post(CollisionShapeEvent.get(state, pos, original)); - return event.isCancelled() ? VoxelShapes.empty() : event.shape; + return event.isCancelled() ? Shapes.empty() : event.shape; } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java index 2cacb89ee5..b3ab201fcf 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/lithium/LithiumEntityCollisionsMixin.java @@ -8,8 +8,8 @@ import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.world.Collisions; import net.caffeinemc.mods.lithium.common.entity.LithiumEntityCollisions; -import net.minecraft.util.math.Box; -import net.minecraft.world.border.WorldBorder; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.level.border.WorldBorder; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -18,7 +18,7 @@ @Mixin(value = LithiumEntityCollisions.class) public abstract class LithiumEntityCollisionsMixin { @Inject(method = "isWithinWorldBorder", at = @At("HEAD"), cancellable = true) - private static void onIsWithinWorldBorder(WorldBorder border, Box box, CallbackInfoReturnable cir) { + private static void onIsWithinWorldBorder(WorldBorder border, AABB box, CallbackInfoReturnable cir) { if (Modules.get().get(Collisions.class).ignoreBorder()) { cir.setReturnValue(true); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/AbstractBlockRenderContextMixin.java similarity index 61% rename from src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java rename to src/main/java/meteordevelopment/meteorclient/mixin/sodium/AbstractBlockRenderContextMixin.java index 7151983142..5a7f60e3d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockOcclusionCacheMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/AbstractBlockRenderContextMixin.java @@ -8,41 +8,47 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.render.Xray; -import net.caffeinemc.mods.sodium.client.render.chunk.compile.pipeline.BlockOcclusionCache; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.BlockView; +import net.caffeinemc.mods.sodium.client.render.model.AbstractBlockRenderContext; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(value = BlockOcclusionCache.class, remap = false) -public abstract class SodiumBlockOcclusionCacheMixin { +@Mixin(value = AbstractBlockRenderContext.class, remap = false) +public abstract class AbstractBlockRenderContextMixin { + @Shadow + protected BlockState state; + @Shadow + protected BlockAndTintGetter level; + @Shadow + protected BlockPos pos; @Unique private Xray xray; @Inject(method = "", at = @At("TAIL")) - private void onInit(CallbackInfo info) { + private void onInit(CallbackInfo ci) { xray = Modules.get().get(Xray.class); } // For More Culling compatibility - runs before More Culling's inject to force-render whitelisted Xray blocks @Inject(method = "shouldDrawSide", at = @At("HEAD"), cancellable = true) - private void meteor$forceXrayFace(BlockState state, BlockView view, BlockPos pos, Direction facing, - CallbackInfoReturnable cir) { + private void meteor$forceXrayFace(Direction facing, CallbackInfoReturnable cir) { if (xray != null && xray.isActive() && !xray.isBlocked(state.getBlock(), null)) { cir.setReturnValue(true); } } @ModifyReturnValue(method = "shouldDrawSide", at = @At("RETURN")) - private boolean shouldDrawSide(boolean original, BlockState state, BlockView view, BlockPos pos, Direction facing) { + private boolean shouldDrawSide(boolean original, Direction facing) { if (xray.isActive()) { - return xray.modifyDrawSide(state, view, pos, facing, original); + return xray.modifyDrawSide(state, level, pos, facing, original); } return original; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java index d5739a2e91..3272e283d3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/MeshVertexConsumerMixin.java @@ -5,11 +5,11 @@ package meteordevelopment.meteorclient.mixin.sodium; +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 net.minecraft.client.render.VertexConsumer; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; import org.spongepowered.asm.mixin.Mixin; @@ -29,7 +29,7 @@ public void push(MemoryStack stack, long ptr, int count, VertexFormat format) { float y = MemoryUtil.memGetFloat(positionPtr + 4); float z = MemoryUtil.memGetFloat(positionPtr + 8); - vertex(x, y, z); + addVertex(x, y, z); } } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java index 499bfc1597..79bb9a2350 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumBlockRendererMixin.java @@ -10,9 +10,9 @@ import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.model.BlockStateModel; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -21,22 +21,22 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = BlockRenderer.class, remap = false) -public class SodiumBlockRendererMixin { +public abstract class SodiumBlockRendererMixin { @Unique private int xrayAlpha; @Inject(method = "renderModel", at = @At("HEAD"), cancellable = true) - private void onRenderModel(BlockStateModel model, BlockState state, BlockPos pos, BlockPos origin, CallbackInfo info) { + private void onRenderModel(BlockStateModel model, BlockState state, BlockPos pos, BlockPos origin, CallbackInfo ci) { xrayAlpha = Xray.getAlpha(state, pos); // Cancel block rendering when alpha is 0, required for Iris support but unnecessary to check for shaders, we already force be disabled when Xray is enabled if (xrayAlpha == 0) { - info.cancel(); + ci.cancel(); } } @Inject(method = "bufferQuad", at = @At("HEAD")) - private void onBufferQuad(MutableQuadViewImpl quad, float[] brightnesses, Material material, CallbackInfo info) { + private void onBufferQuad(MutableQuadViewImpl quad, float[] brightnesses, Material material, CallbackInfo ci) { if (xrayAlpha != -1) { for (int i = 0; i < 4; i++) { int color = quad.baseColor(i); diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumDefaultFluidRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumDefaultFluidRendererMixin.java index f4c1d78e38..9c86a71bc5 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumDefaultFluidRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumDefaultFluidRendererMixin.java @@ -16,10 +16,11 @@ import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector; import net.caffeinemc.mods.sodium.client.world.LevelSlice; -import net.minecraft.client.texture.Sprite; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; +import net.minecraft.client.renderer.block.FluidModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -39,8 +40,8 @@ public abstract class SodiumDefaultFluidRendererMixin { private int xrayAlpha; @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRender(LevelSlice level, net.minecraft.block.BlockState blockState, FluidState fluidState, BlockPos blockPos, BlockPos offset, TranslucentGeometryCollector collector, ChunkModelBuilder meshBuilder, Material material, ColorProvider colorProvider, Sprite[] sprites, CallbackInfo ci) { - xrayAlpha = Xray.getAlpha(fluidState.getBlockState(), blockPos); + private void onRender(LevelSlice level, BlockState blockState, FluidState fluidState, BlockPos blockPos, BlockPos offset, TranslucentGeometryCollector collector, ChunkModelBuilder meshBuilder, Material material, ColorProvider colorProvider, FluidModel sprites, CallbackInfo ci) { + xrayAlpha = Xray.getAlpha(fluidState.createLegacyBlock(), blockPos); // Cancel block rendering when alpha is 0, required for Iris support but unnecessary to check for shaders, we already force be disabled when Xray is enabled if (xrayAlpha == 0) { @@ -57,7 +58,7 @@ private void onUpdateQuad(ModelQuadViewMutable quad, LevelSlice level, BlockPos } } - @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/DefaultFluidRenderer;writeQuad(Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/TranslucentGeometryCollector;Lnet/caffeinemc/mods/sodium/client/render/chunk/terrain/material/Material;Lnet/minecraft/util/math/BlockPos;Lnet/caffeinemc/mods/sodium/client/model/quad/ModelQuadView;Lnet/caffeinemc/mods/sodium/client/model/quad/properties/ModelQuadFacing;Z)V"), index = 2) + @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/DefaultFluidRenderer;writeQuad(Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/ChunkModelBuilder;Lnet/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/TranslucentGeometryCollector;Lnet/caffeinemc/mods/sodium/client/render/chunk/terrain/material/Material;Lnet/minecraft/core/BlockPos;Lnet/caffeinemc/mods/sodium/client/model/quad/ModelQuadView;Lnet/caffeinemc/mods/sodium/client/model/quad/properties/ModelQuadFacing;Z)V"), index = 2) private Material modifyMaterial(Material material) { if (xrayAlpha != -1) { return DefaultMaterials.TRANSLUCENT; diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java index 93f0fbde01..8c74ed27f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplDefaultRenderContextMixin.java @@ -12,10 +12,12 @@ import net.caffeinemc.mods.sodium.client.model.color.ColorProvider; import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView; import net.caffeinemc.mods.sodium.client.world.LevelSlice; -import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.FluidState; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.color.block.BlockTintSource; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -31,19 +33,19 @@ public abstract class SodiumFluidRendererImplDefaultRenderContextMixin { private Ambience ambience; @Inject(method = "", at = @At("TAIL")) - private void onInit(CallbackInfo info) { + private void onInit(CallbackInfo ci) { ambience = Modules.get().get(Ambience.class); } @Inject(method = "getColorProvider", at = @At("HEAD"), cancellable = true) - private void onGetColorProvider(Fluid fluid, CallbackInfoReturnable> info) { - if (ambience.isActive() && ambience.customLavaColor.get() && fluid.getDefaultState().isIn(FluidTags.LAVA)) { - info.setReturnValue(this::lavaColorProvider); + private void onGetColorProvider(Fluid fluid, @Nullable BlockTintSource blockTintSource, CallbackInfoReturnable> cir) { + if (ambience.isActive() && ambience.customLavaColor.get() && fluid.defaultFluidState().is(FluidTags.LAVA)) { + cir.setReturnValue(this::lavaColorProvider); } } @Unique - private void lavaColorProvider(LevelSlice slice, BlockPos pos, BlockPos.Mutable scratchPos, FluidState state, ModelQuadView quad, int[] output, boolean smooth) { + private void lavaColorProvider(LevelSlice slice, BlockPos pos, BlockPos.MutableBlockPos scratchPos, FluidState state, ModelQuadView quad, int[] output, boolean smooth) { Color c = ambience.lavaColor.get(); Arrays.fill(output, ColorABGR.pack(c.r, c.g, c.b, c.a)); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplMixin.java index 0cdc0e4945..094309e9d7 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumFluidRendererImplMixin.java @@ -10,9 +10,9 @@ import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector; import net.caffeinemc.mods.sodium.client.world.LevelSlice; import net.caffeinemc.mods.sodium.fabric.render.FluidRendererImpl; -import net.minecraft.block.BlockState; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -21,9 +21,9 @@ @Mixin(value = FluidRendererImpl.class, remap = false) public abstract class SodiumFluidRendererImplMixin { @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void onRender(LevelSlice level, BlockState blockState, FluidState fluidState, BlockPos blockPos, BlockPos offset, TranslucentGeometryCollector collector, ChunkBuildBuffers buffers, CallbackInfo info) { - int alpha = Xray.getAlpha(fluidState.getBlockState(), blockPos); + private void onRender(LevelSlice level, BlockState blockState, FluidState fluidState, BlockPos blockPos, BlockPos offset, TranslucentGeometryCollector collector, ChunkBuildBuffers buffers, CallbackInfo ci) { + int alpha = Xray.getAlpha(fluidState.createLegacyBlock(), blockPos); - if (alpha == 0) info.cancel(); + if (alpha == 0) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumInnerPartitionBSPNodeMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumInnerPartitionBSPNodeMixin.java index 12da8431d3..beed25aa68 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumInnerPartitionBSPNodeMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumInnerPartitionBSPNodeMixin.java @@ -16,16 +16,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(targets = "net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.bsp_tree.InnerPartitionBSPNode", remap = false) -public class SodiumInnerPartitionBSPNodeMixin { +public abstract class SodiumInnerPartitionBSPNodeMixin { // https://github.com/LlamaLad7/MixinExtras/wiki/Expressions#things-to-watch-out-for // 'Be particularly careful when using == 0 or != 0' @Definition(id = "splitPlaneEdgeDot", local = @Local(type = float.class, name = "splitPlaneEdgeDot")) @Expression("splitPlaneEdgeDot == 0.0") @Inject(method = "interpolateAttributes(FLorg/joml/Vector3fc;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexEncoder$Vertex;)V", at = @At("MIXINEXTRAS:EXPRESSION"), cancellable = true) private static void onInterpolateAttributes(float splitDistance, Vector3fc splitPlane, - ChunkVertexEncoder.Vertex inside, ChunkVertexEncoder.Vertex outside, ChunkVertexEncoder.Vertex targetA, - ChunkVertexEncoder.Vertex targetB, ChunkVertexEncoder.Vertex targetC, CallbackInfo ci, - @Local(name = "splitPlaneEdgeDot") float splitPlaneEdgeDot) { + ChunkVertexEncoder.Vertex inside, ChunkVertexEncoder.Vertex outside, ChunkVertexEncoder.Vertex targetA, + ChunkVertexEncoder.Vertex targetB, ChunkVertexEncoder.Vertex targetC, CallbackInfo ci, + @Local(name = "splitPlaneEdgeDot") float splitPlaneEdgeDot) { if (splitPlaneEdgeDot == 0.0f) ci.cancel(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java index ef8b67befe..25da160eff 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumLightDataAccessMixin.java @@ -9,10 +9,10 @@ import meteordevelopment.meteorclient.systems.modules.render.Fullbright; import meteordevelopment.meteorclient.systems.modules.render.Xray; import net.caffeinemc.mods.sodium.client.model.light.data.LightDataAccess; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockRenderView; -import net.minecraft.world.LightType; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -28,9 +28,10 @@ public abstract class SodiumLightDataAccessMixin { private static final int FULL_LIGHT = 15 | 15 << 4 | 15 << 8; @Shadow - protected BlockRenderView level; - @Shadow @Final - private BlockPos.Mutable pos; + protected BlockAndTintGetter level; + @Shadow + @Final + private BlockPos.MutableBlockPos pos; @Unique private Xray xray; @@ -39,30 +40,30 @@ public abstract class SodiumLightDataAccessMixin { private Fullbright fb; @Inject(method = "", at = @At("TAIL")) - private void onInit(CallbackInfo info) { + private void onInit(CallbackInfo ci) { xray = Modules.get().get(Xray.class); fb = Modules.get().get(Fullbright.class); } @ModifyVariable(method = "compute", at = @At(value = "TAIL"), name = "bl") - private int compute_modifyBL(int light) { + private int compute_modifyBL(int bl) { if (xray.isActive()) { BlockState state = level.getBlockState(pos); if (!xray.isBlocked(state.getBlock(), pos)) return FULL_LIGHT; } - return light; + return bl; } // fullbright @ModifyVariable(method = "compute", at = @At(value = "STORE"), name = "sl") private int compute_assignSL(int sl) { - return Math.max(fb.getLuminance(LightType.SKY), sl); + return Math.max(fb.getLuminance(LightLayer.SKY), sl); } @ModifyVariable(method = "compute", at = @At(value = "STORE"), name = "bl") private int compute_assignBL(int bl) { - return Math.max(fb.getLuminance(LightType.BLOCK), bl); + return Math.max(fb.getLuminance(LightLayer.BLOCK), bl); } } diff --git a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumWorldRendererMixin.java b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumWorldRendererMixin.java index 94a9471768..eb4f507172 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumWorldRendererMixin.java +++ b/src/main/java/meteordevelopment/meteorclient/mixin/sodium/SodiumWorldRendererMixin.java @@ -15,11 +15,11 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(SodiumWorldRenderer.class) -public class SodiumWorldRendererMixin { +public abstract class SodiumWorldRendererMixin { @Unique private static final FogParameters DISABLED_FOG = new FogParameters(0, 0, 0, 0, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE); - @ModifyVariable(method = "setupTerrain", at = @At("HEAD"), argsOnly = true) + @ModifyVariable(method = "setupTerrain", at = @At("HEAD"), argsOnly = true, name = "fogParameters") private FogParameters modifyFogParameters(FogParameters fogParameters) { if (Modules.get() == null) return fogParameters; diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IBox.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IAABB.java similarity index 88% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IBox.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IAABB.java index 1deebf68a1..63a8153567 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IBox.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IAABB.java @@ -5,9 +5,9 @@ package meteordevelopment.meteorclient.mixininterface; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; -public interface IBox { +public interface IAABB { void meteor$expand(double v); void meteor$set(double x1, double y1, double z1, double x2, double y2, double z2); diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IAbstractFurnaceMenu.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IAbstractFurnaceMenu.java new file mode 100644 index 0000000000..e17e851896 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IAbstractFurnaceMenu.java @@ -0,0 +1,12 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixininterface; + +import net.minecraft.world.item.ItemStack; + +public interface IAbstractFurnaceMenu { + boolean meteor$canSmelt(ItemStack itemStack); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IAbstractFurnaceScreenHandler.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IAbstractFurnaceScreenHandler.java deleted file mode 100644 index 50d3c53e8b..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IAbstractFurnaceScreenHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixininterface; - -import net.minecraft.item.ItemStack; - -public interface IAbstractFurnaceScreenHandler { - boolean meteor$isItemSmeltable(ItemStack itemStack); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHud.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHud.java index 548489286c..a2b4267975 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHud.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.mixininterface; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; public interface IChatHud { - void meteor$add(Text message, int id); + void meteor$add(Component message, int id); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatListener.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatListener.java new file mode 100644 index 0000000000..9fc165b2ec --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatListener.java @@ -0,0 +1,19 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixininterface; + +import com.mojang.authlib.GameProfile; +import net.minecraft.client.multiplayer.chat.GuiMessageSource; +import net.minecraft.client.multiplayer.chat.GuiMessageTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MessageSignature; + +public interface IChatListener { + /** + * Only valid inside of {@link net.minecraft.client.gui.components.ChatComponent#addMessage(Component, MessageSignature, GuiMessageSource, GuiMessageTag)} call + */ + GameProfile meteor$getSender(); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IExplosionS2CPacket.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientboundExplodePacket.java similarity index 88% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IExplosionS2CPacket.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IClientboundExplodePacket.java index 7cbec1a09e..6c4560ff40 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IExplosionS2CPacket.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientboundExplodePacket.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.mixininterface; -public interface IExplosionS2CPacket { +public interface IClientboundExplodePacket { void meteor$setVelocityX(float velocity); void meteor$setVelocityY(float velocity); diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IClipContext.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IClipContext.java new file mode 100644 index 0000000000..658743a6ec --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IClipContext.java @@ -0,0 +1,14 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.mixininterface; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.phys.Vec3; + +public interface IClipContext { + void meteor$set(Vec3 start, Vec3 end, ClipContext.Block shapeType, ClipContext.Fluid fluidHandling, Entity entity); +} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IText.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IComponent.java similarity index 89% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IText.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IComponent.java index dd867af2bd..4f6ac1bdf3 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IText.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IComponent.java @@ -5,6 +5,6 @@ package meteordevelopment.meteorclient.mixininterface; -public interface IText { +public interface IComponent { void meteor$invalidateCache(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityRenderState.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityRenderState.java index 3139c74fff..9d86e748cb 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityRenderState.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IEntityRenderState.java @@ -5,23 +5,22 @@ package meteordevelopment.meteorclient.mixininterface; -import meteordevelopment.meteorclient.mixin.EntityRenderManagerMixin; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.entity.Entity; +import meteordevelopment.meteorclient.mixin.EntityRenderDispatcherMixin; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; public interface IEntityRenderState { /** * Returns the entity that the render state refers to; necessary in scenarios when you want to perform an entity * rendering task with data that isn't present in the render state.

- * + *

* The entity is only set after the render state is retrieved in EntityRenderDispatcher#render, so make sure not * to call this before that point (e.g. mixing into an updateRenderState method), otherwise the entity returned will * not be the same one that the render state is referring to. * * @return The entity that the render state refers to - * - * @see EntityRenderManagerMixin#getAndUpdateRenderState$setEntity(EntityRenderState, Entity, float) + * @see EntityRenderDispatcherMixin#getAndUpdateRenderState$setEntity(EntityRenderState, Entity, float) */ @Nullable(value = "EntityCulling mod can prevent the code that sets the entity from running") Entity meteor$getEntity(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLine.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IGuiMessage.java similarity index 92% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLine.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IGuiMessage.java index 96c25fe22e..86dd06b0b2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLine.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IGuiMessage.java @@ -7,7 +7,7 @@ import com.mojang.authlib.GameProfile; -public interface IChatHudLine { +public interface IGuiMessage { String meteor$getText(); int meteor$getId(); diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLineVisible.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IGuiMessageVisible.java similarity index 83% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLineVisible.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IGuiMessageVisible.java index 74a908e96e..113b23985a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IChatHudLineVisible.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IGuiMessageVisible.java @@ -5,7 +5,8 @@ package meteordevelopment.meteorclient.mixininterface; -public interface IChatHudLineVisible extends IChatHudLine { +public interface IGuiMessageVisible extends IGuiMessage { boolean meteor$isStartOfEntry(); + void meteor$setStartOfEntry(boolean start); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IWorldRenderer.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/ILevelRenderer.java similarity index 62% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IWorldRenderer.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/ILevelRenderer.java index d114806144..970701d581 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IWorldRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/ILevelRenderer.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.mixininterface; -import net.minecraft.client.gl.Framebuffer; +import com.mojang.blaze3d.pipeline.RenderTarget; -public interface IWorldRenderer { - void meteor$pushEntityOutlineFramebuffer(Framebuffer framebuffer); +public interface ILevelRenderer { + void meteor$pushEntityOutlineFramebuffer(RenderTarget framebuffer); void meteor$popEntityOutlineFramebuffer(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IMessageHandler.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IMessageHandler.java deleted file mode 100644 index 57a5793337..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IMessageHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixininterface; - -import com.mojang.authlib.GameProfile; -import net.minecraft.client.gui.hud.MessageIndicator; -import net.minecraft.network.message.MessageSignatureData; -import net.minecraft.text.Text; - -public interface IMessageHandler { - /** Only valid inside of {@link net.minecraft.client.gui.hud.ChatHud#addMessage(Text, MessageSignatureData, MessageIndicator)} call */ - GameProfile meteor$getSender(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IMinecraftClient.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IMinecraft.java similarity index 64% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IMinecraftClient.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IMinecraft.java index 8b36ef95af..783d9d1478 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IMinecraftClient.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IMinecraft.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.mixininterface; -import net.minecraft.client.gl.Framebuffer; +import com.mojang.blaze3d.pipeline.RenderTarget; -public interface IMinecraftClient { +public interface IMinecraft { void meteor$rightClick(); - void meteor$setFramebuffer(Framebuffer framebuffer); + void meteor$setFramebuffer(RenderTarget framebuffer); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientPlayerInteractionManager.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IMultiPlayerGameMode.java similarity index 82% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IClientPlayerInteractionManager.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IMultiPlayerGameMode.java index 7ee8ac3944..c3314ee9e1 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IClientPlayerInteractionManager.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IMultiPlayerGameMode.java @@ -5,6 +5,6 @@ package meteordevelopment.meteorclient.mixininterface; -public interface IClientPlayerInteractionManager { +public interface IMultiPlayerGameMode { void meteor$syncSelected(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/ISimpleOption.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IOptionInstance.java similarity index 87% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/ISimpleOption.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IOptionInstance.java index 5873e435e8..31c0f01df2 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/ISimpleOption.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IOptionInstance.java @@ -5,6 +5,6 @@ package meteordevelopment.meteorclient.mixininterface; -public interface ISimpleOption { +public interface IOptionInstance { void meteor$set(Object value); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerInteractEntityC2SPacket.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerInteractEntityC2SPacket.java deleted file mode 100644 index 70bfc1dbee..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerInteractEntityC2SPacket.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixininterface; - -import net.minecraft.entity.Entity; -import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; - -public interface IPlayerInteractEntityC2SPacket { - PlayerInteractEntityC2SPacket.InteractType meteor$getType(); - - Entity meteor$getEntity(); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IRaycastContext.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IRaycastContext.java deleted file mode 100644 index e32816f66d..0000000000 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IRaycastContext.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). - * Copyright (c) Meteor Development. - */ - -package meteordevelopment.meteorclient.mixininterface; - -import net.minecraft.entity.Entity; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.RaycastContext; - -public interface IRaycastContext { - void meteor$set(Vec3d start, Vec3d end, RaycastContext.ShapeType shapeType, RaycastContext.FluidHandling fluidHandling, Entity entity); -} diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerMoveC2SPacket.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IServerboundMovePlayerPacket.java similarity index 84% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerMoveC2SPacket.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IServerboundMovePlayerPacket.java index a56eaaf29f..0c76734c30 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IPlayerMoveC2SPacket.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IServerboundMovePlayerPacket.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.mixininterface; -public interface IPlayerMoveC2SPacket { +public interface IServerboundMovePlayerPacket { int meteor$getTag(); void meteor$setTag(int tag); diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/ISlot.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/ISlot.java index 11fd2db540..54cba8976a 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/ISlot.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/ISlot.java @@ -6,7 +6,7 @@ package meteordevelopment.meteorclient.mixininterface; public interface ISlot { - int meteor$getId(); - int meteor$getIndex(); + + int meteor$getSlot(); } diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3d.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3.java similarity index 56% rename from src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3d.java rename to src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3.java index 2cbb4c97da..e5b4074c5e 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3d.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IVec3.java @@ -5,27 +5,27 @@ package meteordevelopment.meteorclient.mixininterface; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; +import net.minecraft.core.Vec3i; +import net.minecraft.world.phys.Vec3; import org.joml.Vector3d; @SuppressWarnings("UnusedReturnValue") -public interface IVec3d { - Vec3d meteor$set(double x, double y, double z); +public interface IVec3 { + Vec3 meteor$set(double x, double y, double z); - default Vec3d meteor$set(Vec3i vec) { + default Vec3 meteor$set(Vec3i vec) { return meteor$set(vec.getX(), vec.getY(), vec.getZ()); } - default Vec3d meteor$set(Vector3d vec) { + default Vec3 meteor$set(Vector3d vec) { return meteor$set(vec.x, vec.y, vec.z); } - default Vec3d meteor$set(Vec3d pos) { + default Vec3 meteor$set(Vec3 pos) { return meteor$set(pos.x, pos.y, pos.z); } - Vec3d meteor$setXZ(double x, double z); + Vec3 meteor$setXZ(double x, double z); - Vec3d meteor$setY(double y); + Vec3 meteor$setY(double y); } diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java index 5a7ce7d4d1..0ba47e93a8 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritonePathManager.java @@ -7,7 +7,6 @@ import baritone.api.BaritoneAPI; import baritone.api.pathing.goals.Goal; -import baritone.api.pathing.goals.GoalGetToBlock; import baritone.api.pathing.goals.GoalXZ; import baritone.api.process.IBaritoneProcess; import baritone.api.process.PathingCommand; @@ -17,11 +16,11 @@ import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.phys.Vec3; import java.util.function.Predicate; @@ -76,7 +75,8 @@ public void moveTo(BlockPos pos, boolean ignoreY) { return; } - BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalGetToBlock(pos)); + /*BaritoneAPI.getProvider().getPrimaryBaritone().getCustomGoalProcess().setGoalAndPath(new GoalGetToBlock(pos));*/ + // TODO(Baritone) } @Override @@ -87,12 +87,14 @@ public void moveInDirection(float yaw) { @Override public void mine(Block... blocks) { - BaritoneAPI.getProvider().getPrimaryBaritone().getMineProcess().mine(blocks); + /*BaritoneAPI.getProvider().getPrimaryBaritone().getMineProcess().mine(blocks);*/ + // TODO(Baritone) } @Override public void follow(Predicate entity) { - BaritoneAPI.getProvider().getPrimaryBaritone().getFollowProcess().follow(entity); + /*BaritoneAPI.getProvider().getPrimaryBaritone().getFollowProcess().follow(entity);*/ + // TODO(Baritone) } @Override @@ -157,11 +159,11 @@ public void tick() { if (timer <= 0) { timer = 20; - Vec3d pos = mc.player.getEntityPos(); + Vec3 pos = mc.player.position(); float theta = (float) Math.toRadians(yaw); - x = (int) Math.floor(pos.x - (double) MathHelper.sin(theta) * 100); - z = (int) Math.floor(pos.z + (double) MathHelper.cos(theta) * 100); + x = (int) Math.floor(pos.x - (double) Mth.sin(theta) * 100); + z = (int) Math.floor(pos.z + (double) Mth.cos(theta) * 100); } timer--; diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java index 8294edaa12..49234e307c 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/BaritoneSettings.java @@ -9,8 +9,8 @@ import baritone.api.utils.SettingsUtil; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.block.Block; -import net.minecraft.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.item.Item; import java.awt.*; import java.lang.reflect.*; @@ -103,8 +103,7 @@ private void createWrappers() { case "assumeWalkOnLava" -> walkOnLava = wrapper; case "assumeStep" -> step = wrapper; } - } - else if (value instanceof Double) { + } else if (value instanceof Double) { sgDouble.add(new DoubleSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -115,8 +114,7 @@ else if (value instanceof Double) { .onModuleActivated(doubleSetting -> doubleSetting.set((Double) setting.value)) .build() ); - } - else if (value instanceof Float) { + } else if (value instanceof Float) { sgDouble.add(new DoubleSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -127,8 +125,7 @@ else if (value instanceof Float) { .onModuleActivated(doubleSetting -> doubleSetting.set(((Float) setting.value).doubleValue())) .build() ); - } - else if (value instanceof Integer) { + } else if (value instanceof Integer) { Setting wrapper = sgInt.add(new IntSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -147,8 +144,7 @@ else if (value instanceof Integer) { .onModuleActivated(booleanSetting -> booleanSetting.set(wrapper.get() >= 255)) .build(); } - } - else if (value instanceof Long) { + } else if (value instanceof Long) { sgInt.add(new IntSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -157,8 +153,7 @@ else if (value instanceof Long) { .onModuleActivated(integerSetting -> integerSetting.set(((Long) setting.value).intValue())) .build() ); - } - else if (value instanceof String) { + } else if (value instanceof String) { sgString.add(new StringSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -167,8 +162,7 @@ else if (value instanceof String) { .onModuleActivated(stringSetting -> stringSetting.set((String) setting.value)) .build() ); - } - else if (value instanceof Color) { + } else if (value instanceof Color) { Color c = (Color) setting.value; sgColor.add(new ColorSetting.Builder() @@ -179,8 +173,7 @@ else if (value instanceof Color) { .onModuleActivated(colorSetting -> colorSetting.set(new SettingColor(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()))) .build() ); - } - else if (value instanceof List) { + } else if (value instanceof List) { Type listType = ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; Type type = ((ParameterizedType) listType).getActualTypeArguments()[0]; @@ -193,8 +186,7 @@ else if (value instanceof List) { .onModuleActivated(blockListSetting -> blockListSetting.set((List) setting.value)) .build() ); - } - else if (type == Item.class) { + } else if (type == Item.class) { sgItemLists.add(new ItemListSetting.Builder() .name(setting.getName()) .description(getDescription(setting.getName())) @@ -206,8 +198,7 @@ else if (type == Item.class) { } } } - } - catch (IllegalAccessException e) { + } catch (IllegalAccessException e) { throw new RuntimeException(e); } } @@ -231,14 +222,14 @@ private static void loadDescriptions() { addDescription("acceptableThrowawayItems", "Blocks that Baritone is allowed to place (as throwaway, for sneak bridging, pillaring, etc.)"); addDescription("allowBreak", "Allow Baritone to break blocks"); addDescription("allowBreakAnyway", "Blocks that baritone will be allowed to break even with allowBreak set to false"); - addDescription("allowDiagonalAscend","Allow diagonal ascending"); + addDescription("allowDiagonalAscend", "Allow diagonal ascending"); addDescription("allowDiagonalDescend", "Allow descending diagonally"); addDescription("allowDownward", "Allow mining the block directly beneath its feet"); addDescription("allowInventory", "Allow Baritone to move items in your inventory to your hotbar"); addDescription("allowJumpAt256", "If true, parkour is allowed to make jumps when standing on blocks at the maximum height, so player feet is y=256"); addDescription("allowOnlyExposedOres", "This will only allow baritone to mine exposed ores, can be used to stop ore obfuscators on servers that use them."); addDescription("allowOnlyExposedOresDistance", "When allowOnlyExposedOres is enabled this is the distance around to search."); - addDescription("allowOvershootDiagonalDescend","Is it okay to sprint through a descend followed by a diagonal? The player overshoots the landing, but not enough to fall off."); + addDescription("allowOvershootDiagonalDescend", "Is it okay to sprint through a descend followed by a diagonal? The player overshoots the landing, but not enough to fall off."); addDescription("allowParkour", "You know what it is"); addDescription("allowParkourAscend", "This should be monetized it's so good"); addDescription("allowParkourPlace", "Actually pretty reliable."); diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java index 77e5344612..fe17057bf7 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/IPathManager.java @@ -7,9 +7,9 @@ import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.Settings; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.entity.Entity; +import net.minecraft.core.BlockPos; import java.util.function.Predicate; @@ -19,11 +19,17 @@ public interface IPathManager { boolean isPathing(); void pause(); + void resume(); + void stop(); - default void moveTo(BlockPos pos) { moveTo(pos, false); } + default void moveTo(BlockPos pos) { + moveTo(pos, false); + } + void moveTo(BlockPos pos, boolean ignoreY); + void moveInDirection(float yaw); void mine(Block... blocks); @@ -31,6 +37,7 @@ public interface IPathManager { void follow(Predicate entity); float getTargetYaw(); + float getTargetPitch(); ISettings getSettings(); @@ -39,9 +46,11 @@ interface ISettings { Settings get(); Setting getWalkOnWater(); + Setting getWalkOnLava(); Setting getStep(); + Setting getNoFall(); void save(); diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java b/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java index dc2ab84d21..bafecd2137 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/NopPathManager.java @@ -8,9 +8,9 @@ import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.Settings; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.entity.Entity; +import net.minecraft.core.BlockPos; import java.util.function.Predicate; @@ -28,25 +28,32 @@ public boolean isPathing() { } @Override - public void pause() {} + public void pause() { + } @Override - public void resume() {} + public void resume() { + } @Override - public void stop() {} + public void stop() { + } @Override - public void moveTo(BlockPos pos, boolean ignoreY) {} + public void moveTo(BlockPos pos, boolean ignoreY) { + } @Override - public void moveInDirection(float yaw) {} + public void moveInDirection(float yaw) { + } @Override - public void mine(Block... blocks) {} + public void mine(Block... blocks) { + } @Override - public void follow(Predicate entity) {} + public void follow(Predicate entity) { + } @Override public float getTargetYaw() { @@ -97,6 +104,7 @@ public Setting getNoFall() { } @Override - public void save() {} + public void save() { + } } } diff --git a/src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.java b/src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.java index d7f9ebf45d..15a02a1992 100644 --- a/src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.java +++ b/src/main/java/meteordevelopment/meteorclient/pathing/PathManagers.java @@ -42,7 +42,7 @@ private static boolean exists(String name) { try { Class.forName(name); return true; - } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException _) { return false; } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java b/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java index 11dc24c1cb..dffcc9d1f5 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/FixedUniformStorage.java @@ -9,19 +9,19 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.gl.DynamicUniformStorage; -import net.minecraft.client.gl.MappableRingBuffer; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.renderer.DynamicUniformStorage; +import net.minecraft.client.renderer.MappableRingBuffer; +import net.minecraft.util.Mth; import java.nio.ByteBuffer; /** * UBO storage with a constant size. Exceeding this size causes an {@link IndexOutOfBoundsException} to be thrown. * - * @see DynamicUniformStorage * @author Crosby + * @see DynamicUniformStorage */ -public class FixedUniformStorage { +public class FixedUniformStorage { private final MappableRingBuffer buffer; private final int blockSize; private final int capacity; @@ -29,9 +29,9 @@ public class FixedUniformStorage { public FixedUniformStorage(String name, int blockSize, int capacity) { GpuDevice gpuDevice = RenderSystem.getDevice(); - this.blockSize = MathHelper.roundUpToMultiple(blockSize, gpuDevice.getUniformOffsetAlignment()); + this.blockSize = Mth.roundToward(blockSize, gpuDevice.getUniformOffsetAlignment()); this.capacity = capacity; - int alignedCapacity = MathHelper.smallestEncompassingPowerOfTwo(capacity); + int alignedCapacity = Mth.smallestEncompassingPowerOfTwo(capacity); this.size = 0; this.buffer = new MappableRingBuffer(() -> name + " x" + this.blockSize, 130, this.blockSize * alignedCapacity); } @@ -41,7 +41,7 @@ public GpuBufferSlice write(T value) { throw new IndexOutOfBoundsException(String.format("Index %s out of bounds for length %s", this.size, this.capacity)); } else { int i = this.size * this.blockSize; - GpuBufferSlice slice = this.buffer.getBlocking().slice(i, this.blockSize); + GpuBufferSlice slice = this.buffer.currentBuffer().slice(i, this.blockSize); try (GpuBuffer.MappedView mappedView = RenderSystem.getDevice() .createCommandEncoder() @@ -62,7 +62,7 @@ public GpuBufferSlice[] writeAll(T[] values) { } else { int i = this.size * this.blockSize; GpuBufferSlice[] gpuBufferSlices = new GpuBufferSlice[values.length]; - GpuBuffer ubo = this.buffer.getBlocking(); + GpuBuffer ubo = this.buffer.currentBuffer(); try (GpuBuffer.MappedView mappedView = RenderSystem.getDevice() .createCommandEncoder() diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java b/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java index cc2257115d..93682cf471 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Fonts.java @@ -24,7 +24,7 @@ import static meteordevelopment.meteorclient.MeteorClient.mc; public class Fonts { - public static final String[] BUILTIN_FONTS = { "JetBrains Mono", "Comfortaa", "Tw Cen MT", "Pixelation" }; + public static final String[] BUILTIN_FONTS = {"JetBrains Mono", "Comfortaa", "Tw Cen MT", "Pixelation"}; public static String DEFAULT_FONT_FAMILY; public static FontFace DEFAULT_FONT; @@ -67,8 +67,7 @@ public static void load(FontFace fontFace) { try { RENDERER = new CustomTextRenderer(fontFace); MeteorClient.EVENT_BUS.post(CustomFontChangedEvent.get()); - } - catch (Exception e) { + } catch (Exception e) { if (fontFace.equals(DEFAULT_FONT)) { throw new RuntimeException("Failed to load default font: " + fontFace, e); } @@ -77,8 +76,8 @@ public static void load(FontFace fontFace) { load(Fonts.DEFAULT_FONT); } - if (mc.currentScreen instanceof WidgetScreen && Config.get().customFont.get()) { - ((WidgetScreen) mc.currentScreen).invalidate(); + if (mc.screen instanceof WidgetScreen && Config.get().customFont.get()) { + ((WidgetScreen) mc.screen).invalidate(); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java index 0657b05fc1..f62a27be67 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/FullScreenRenderer.java @@ -20,11 +20,12 @@ public class FullScreenRenderer { @Deprecated(forRemoval = true) public static MeshBuilder mesh; - private FullScreenRenderer() {} + private FullScreenRenderer() { + } @PreInit public static void init() { - mesh = new MeshBuilder(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES, 4, 6); + mesh = new MeshBuilder(MeteorVertexFormats.POS2, VertexFormat.Mode.TRIANGLES, 4, 6); mesh.begin(); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java index 216a475f02..1619c1cd41 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshBuilder.java @@ -11,7 +11,7 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.phys.Vec3; import org.lwjgl.BufferUtils; import java.nio.ByteBuffer; @@ -43,13 +43,13 @@ public MeshBuilder(RenderPipeline pipeline) { this(pipeline.getVertexFormat(), pipeline.getVertexFormatMode()); } - public MeshBuilder(VertexFormat format, VertexFormat.DrawMode drawMode) { + public MeshBuilder(VertexFormat format, VertexFormat.Mode drawMode) { this.format = format; primitiveVerticesSize = format.getVertexSize(); - primitiveIndicesCount = drawMode.firstVertexCount; + primitiveIndicesCount = drawMode.primitiveLength; } - public MeshBuilder(VertexFormat format, VertexFormat.DrawMode drawMode, int vertexCount, int indexCount) { + public MeshBuilder(VertexFormat format, VertexFormat.Mode drawMode, int vertexCount, int indexCount) { this(format, drawMode); allocateBuffers(vertexCount, indexCount); } @@ -64,12 +64,11 @@ public void begin() { building = true; if (Utils.rendering3D) { - Vec3d camera = mc.gameRenderer.getCamera().getCameraPos(); + Vec3 camera = mc.gameRenderer.getMainCamera().position(); cameraX = camera.x; cameraZ = camera.z; - } - else { + } else { cameraX = 0; cameraZ = 0; } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java index 738e623776..e67b53322a 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshRenderer.java @@ -8,19 +8,19 @@ import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.pipeline.RenderTarget; 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.blaze3d.vertex.VertexFormat; import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.GpuSampler; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Pair; -import net.minecraft.util.math.ColorHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.ARGB; +import net.minecraft.util.Tuple; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; @@ -44,9 +44,10 @@ public class MeshRenderer { private @Nullable GpuBuffer indexBuffer; private Matrix4f matrix; private final HashMap uniforms = new HashMap<>(); - private final HashMap> samplers = new HashMap<>(); + private final HashMap> samplers = new HashMap<>(); - private MeshRenderer() {} + private MeshRenderer() { + } public static MeshRenderer begin() { if (taken) @@ -62,9 +63,9 @@ public MeshRenderer attachments(GpuTextureView color, GpuTextureView depth) { return this; } - public MeshRenderer attachments(Framebuffer framebuffer) { - colorAttachment = framebuffer.getColorAttachmentView(); - depthAttachment = framebuffer.getDepthAttachmentView(); + public MeshRenderer attachments(RenderTarget framebuffer) { + colorAttachment = framebuffer.getColorTextureView(); + depthAttachment = framebuffer.getDepthTextureView(); return this; } @@ -94,7 +95,7 @@ public MeshRenderer mesh(MeshBuilder mesh, Matrix4f matrix) { return this.transform(matrix); } - public MeshRenderer mesh(MeshBuilder mesh, MatrixStack matrices) { + public MeshRenderer mesh(MeshBuilder mesh, PoseStack matrices) { this.mesh = mesh; return this.transform(matrices); } @@ -104,8 +105,8 @@ public MeshRenderer transform(Matrix4f matrix) { return this; } - public MeshRenderer transform(MatrixStack matrices) { - this.matrix = matrices.peek().getPositionMatrix(); + public MeshRenderer transform(PoseStack matrices) { + this.matrix = matrices.last().pose(); return this; } @@ -120,7 +121,7 @@ public MeshRenderer uniform(String name, GpuBufferSlice slice) { public MeshRenderer sampler(String name, GpuTextureView view, GpuSampler sampler) { if (name != null && view != null && sampler != null) { - samplers.put(name, new Pair<>(view, sampler)); + samplers.put(name, new Tuple<>(view, sampler)); } return this; @@ -154,7 +155,7 @@ public void end() { { OptionalInt clearColor = this.clearColor != null ? - OptionalInt.of(ColorHelper.getArgb(this.clearColor.a, this.clearColor.r, this.clearColor.g, this.clearColor.b)) : + OptionalInt.of(ARGB.color(this.clearColor.a, this.clearColor.r, this.clearColor.g, this.clearColor.b)) : OptionalInt.empty(); GpuBufferSlice meshData = MeshUniforms.write(RenderUtils.projection, RenderSystem.getModelViewStack()); @@ -171,7 +172,7 @@ public void end() { } for (var name : samplers.keySet()) { - pass.bindTexture(name, samplers.get(name).getLeft(), samplers.get(name).getRight()); + pass.bindTexture(name, samplers.get(name).getA(), samplers.get(name).getB()); } pass.setVertexBuffer(0, vertexBuffer); @@ -201,7 +202,7 @@ public void end() { } private static void applyCameraPos() { - Vec3d cameraPos = mc.gameRenderer.getCamera().getCameraPos(); + Vec3 cameraPos = mc.gameRenderer.getMainCamera().position(); RenderSystem.getModelViewStack().translate(0, (float) -cameraPos.y, 0); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java index f1906fef54..0b1bed7e11 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeshUniforms.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; -import net.minecraft.client.gl.DynamicUniformStorage; +import net.minecraft.client.renderer.DynamicUniformStorage; import org.joml.Matrix4f; import java.nio.ByteBuffer; @@ -24,17 +24,17 @@ public class MeshUniforms { private static final DynamicUniformStorage STORAGE = new DynamicUniformStorage<>("Meteor - Mesh UBO", SIZE, 16); public static void flipFrame() { - STORAGE.clear(); + STORAGE.endFrame(); } public static GpuBufferSlice write(Matrix4f proj, Matrix4f modelView) { DATA.proj = proj; DATA.modelView = modelView; - return STORAGE.write(DATA); + return STORAGE.writeUniform(DATA); } - private static final class Data implements DynamicUniformStorage.Uploadable { + private static final class Data implements DynamicUniformStorage.DynamicUniform { 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 933f4c039d..3d2d87c869 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorRenderPipelines.java @@ -6,16 +6,18 @@ package meteordevelopment.meteorclient.renderer; import com.mojang.blaze3d.pipeline.BlendFunction; +import com.mojang.blaze3d.pipeline.ColorTargetState; +import com.mojang.blaze3d.pipeline.DepthStencilState; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; +import com.mojang.blaze3d.platform.CompareOp; +import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import meteordevelopment.meteorclient.MeteorClient; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.UniformType; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.resource.ResourceManager; +import net.minecraft.client.Minecraft; +import net.minecraft.server.packs.resources.ResourceManager; import org.apache.commons.io.IOUtils; import java.io.IOException; @@ -36,12 +38,11 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/world_colored")) - .withVertexFormat(VertexFormats.POSITION_COLOR, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); @@ -49,24 +50,22 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline WORLD_COLORED_LINES = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLineSmooth() .withLocation(MeteorClient.identifier("pipeline/world_colored_lines")) - .withVertexFormat(VertexFormats.POSITION_COLOR, VertexFormat.DrawMode.DEBUG_LINES) + .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.DEBUG_LINES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); public static final RenderPipeline WORLD_COLORED_DEPTH = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/world_colored_depth")) - .withVertexFormat(VertexFormats.POSITION_COLOR, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) - .withDepthTestFunction(DepthTestFunction.LEQUAL_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.LESS_THAN_OR_EQUAL, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); @@ -74,12 +73,11 @@ 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")) - .withVertexFormat(VertexFormats.POSITION_COLOR, VertexFormat.DrawMode.DEBUG_LINES) + .withVertexFormat(DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.DEBUG_LINES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) - .withDepthTestFunction(DepthTestFunction.LEQUAL_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.LESS_THAN_OR_EQUAL, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); @@ -88,50 +86,46 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline UI_COLORED = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_colored")) - .withVertexFormat(MeteorVertexFormats.POS2_COLOR, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2_COLOR, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) .build() ); public static final RenderPipeline UI_COLORED_LINES = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_colored_lines")) - .withVertexFormat(MeteorVertexFormats.POS2_COLOR, VertexFormat.DrawMode.DEBUG_LINES) + .withVertexFormat(MeteorVertexFormats.POS2_COLOR, VertexFormat.Mode.DEBUG_LINES) .withVertexShader(MeteorClient.identifier("shaders/pos_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_color.frag")) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) .build() ); public static final RenderPipeline UI_TEXTURED = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_textured")) - .withVertexFormat(MeteorVertexFormats.POS2_TEXTURE_COLOR, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2_TEXTURE_COLOR, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/pos_tex_color.vert")) .withFragmentShader(MeteorClient.identifier("shaders/pos_tex_color.frag")) .withSampler("u_Texture") - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) .build() ); public static final RenderPipeline UI_TEXT = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/ui_text")) - .withVertexFormat(MeteorVertexFormats.POS2_TEXTURE_COLOR, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2_TEXTURE_COLOR, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/text.vert")) .withFragmentShader(MeteorClient.identifier("shaders/text.frag")) .withSampler("u_Texture") - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(true) .build() ); @@ -140,31 +134,29 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline POST_OUTLINE = add(new ExtendedRenderPipelineBuilder() .withLocation(MeteorClient.identifier("pipeline/post/outline")) - .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vert")) .withFragmentShader(MeteorClient.identifier("shaders/post-process/outline.frag")) .withSampler("u_Texture") .withUniform("PostData", UniformType.UNIFORM_BUFFER) .withUniform("OutlineData", UniformType.UNIFORM_BUFFER) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); public static final RenderPipeline POST_IMAGE = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/post/image")) - .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/post-process/base.vert")) .withFragmentShader(MeteorClient.identifier("shaders/post-process/image.frag")) .withSampler("u_Texture") .withSampler("u_TextureI") .withUniform("PostData", UniformType.UNIFORM_BUFFER) .withUniform("ImageData", UniformType.UNIFORM_BUFFER) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); @@ -173,41 +165,38 @@ public abstract class MeteorRenderPipelines { public static final RenderPipeline BLUR_DOWN = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/blur/down")) - .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/blur.vert")) .withFragmentShader(MeteorClient.identifier("shaders/blur_down.frag")) .withSampler("u_Texture") .withUniform("BlurData", UniformType.UNIFORM_BUFFER) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); public static final RenderPipeline BLUR_UP = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/blur/up")) - .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/blur.vert")) .withFragmentShader(MeteorClient.identifier("shaders/blur_up.frag")) .withSampler("u_Texture") .withUniform("BlurData", UniformType.UNIFORM_BUFFER) - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); public static final RenderPipeline BLUR_PASSTHROUGH = add(new ExtendedRenderPipelineBuilder(MESH_UNIFORMS) .withLocation(MeteorClient.identifier("pipeline/blur/up")) - .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.DrawMode.TRIANGLES) + .withVertexFormat(MeteorVertexFormats.POS2, VertexFormat.Mode.TRIANGLES) .withVertexShader(MeteorClient.identifier("shaders/passthrough.vert")) .withFragmentShader(MeteorClient.identifier("shaders/passthrough.frag")) .withSampler("u_Texture") - .withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST) - .withDepthWrite(false) - .withBlend(BlendFunction.TRANSLUCENT) + .withDepthStencilState(new DepthStencilState(CompareOp.ALWAYS_PASS, false)) + .withColorTargetState(new ColorTargetState(BlendFunction.TRANSLUCENT)) .withCull(false) .build() ); @@ -219,13 +208,13 @@ private static RenderPipeline add(RenderPipeline pipeline) { public static void precompile() { GpuDevice device = RenderSystem.getDevice(); - ResourceManager resources = MinecraftClient.getInstance().getResourceManager(); + ResourceManager resources = Minecraft.getInstance().getResourceManager(); for (RenderPipeline pipeline : PIPELINES) { device.precompilePipeline(pipeline, (identifier, shaderType) -> { var resource = resources.getResource(identifier).get(); - try (var in = resource.getInputStream()) { + try (var in = resource.open()) { return IOUtils.toString(in, StandardCharsets.UTF_8); } catch (IOException e) { throw new RuntimeException(e); @@ -234,5 +223,6 @@ public static void precompile() { } } - private MeteorRenderPipelines() {} + private MeteorRenderPipelines() { + } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormatElements.java b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormatElements.java index bc644bc771..025cd5219f 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormatElements.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/MeteorVertexFormatElements.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.vertex.VertexFormatElement; public abstract class MeteorVertexFormatElements { - public static final VertexFormatElement POS2 = VertexFormatElement.register(getNextVertexFormatElementId(), 0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, 2); + public static final VertexFormatElement POS2 = VertexFormatElement.register(getNextVertexFormatElementId(), 0, VertexFormatElement.Type.FLOAT, false, 2); private MeteorVertexFormatElements() {} diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java index 444a6db3b2..2c94396574 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer2D.java @@ -5,12 +5,12 @@ package meteordevelopment.meteorclient.renderer; +import com.mojang.blaze3d.textures.GpuSampler; import com.mojang.blaze3d.textures.GpuTextureView; import meteordevelopment.meteorclient.gui.renderer.packer.TextureRegion; import meteordevelopment.meteorclient.utils.PreInit; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.GpuSampler; +import net.minecraft.client.Minecraft; public class Renderer2D { public static Renderer2D COLOR; @@ -64,13 +64,13 @@ public void render(String samplerName, GpuTextureView samplerView, GpuSampler sa if (triangles.isBuilding()) triangles.end(); MeshRenderer.begin() - .attachments(MinecraftClient.getInstance().getFramebuffer()) + .attachments(Minecraft.getInstance().getMainRenderTarget()) .pipeline(MeteorRenderPipelines.UI_COLORED_LINES) .mesh(lines) .end(); MeshRenderer.begin() - .attachments(MinecraftClient.getInstance().getFramebuffer()) + .attachments(Minecraft.getInstance().getMainRenderTarget()) .pipeline(textured ? MeteorRenderPipelines.UI_TEXTURED : MeteorRenderPipelines.UI_COLORED) .mesh(triangles) .sampler(samplerName, samplerView, sampler) diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java index 84ac6b162a..773e8f66c1 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Renderer3D.java @@ -6,12 +6,12 @@ package meteordevelopment.meteorclient.renderer; import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.world.Dir; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.AABB; public class Renderer3D { public final MeshBuilder lines; @@ -31,15 +31,15 @@ public void begin() { triangles.begin(); } - public void render(MatrixStack matrices) { + public void render(PoseStack matrices) { MeshRenderer.begin() - .attachments(MinecraftClient.getInstance().getFramebuffer()) + .attachments(Minecraft.getInstance().getMainRenderTarget()) .pipeline(linesPipeline) .mesh(lines, matrices) .end(); MeshRenderer.begin() - .attachments(MinecraftClient.getInstance().getFramebuffer()) + .attachments(Minecraft.getInstance().getMainRenderTarget()) .pipeline(trianglesPipeline) .mesh(triangles, matrices) .end(); @@ -91,8 +91,7 @@ public void boxLines(double x1, double y1, double z1, double x2, double y2, doub lines.line(trb, trf); lines.line(tlb, trb); lines.line(tlf, trf); - } - else { + } else { // Bottom to top if (Dir.isNot(excludeDir, Dir.WEST) && Dir.isNot(excludeDir, Dir.NORTH)) lines.line(blb, tlb); if (Dir.isNot(excludeDir, Dir.WEST) && Dir.isNot(excludeDir, Dir.SOUTH)) lines.line(blf, tlf); @@ -204,8 +203,7 @@ public void boxSides(double x1, double y1, double z1, double x2, double y2, doub // Top triangles.quad(tlb, tlf, trf, trb); - } - else { + } else { // Bottom to top if (Dir.isNot(excludeDir, Dir.WEST)) triangles.quad(blb, blf, tlf, tlb); if (Dir.isNot(excludeDir, Dir.EAST)) triangles.quad(brb, trb, trf, brf); @@ -230,11 +228,13 @@ public void box(double x1, double y1, double z1, double x2, double y2, double z2 } public void box(BlockPos pos, Color sideColor, Color lineColor, ShapeMode mode, int excludeDir) { - if (mode.lines()) boxLines(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1, lineColor, excludeDir); - if (mode.sides()) boxSides(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1, sideColor, excludeDir); + if (mode.lines()) + boxLines(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1, lineColor, excludeDir); + if (mode.sides()) + boxSides(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1, sideColor, excludeDir); } - public void box(Box box, Color sideColor, Color lineColor, ShapeMode mode, int excludeDir) { + public void box(AABB box, Color sideColor, Color lineColor, ShapeMode mode, int excludeDir) { if (mode.lines()) boxLines(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ, lineColor, excludeDir); if (mode.sides()) boxSides(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ, sideColor, excludeDir); } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java b/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java index a45082ff7c..c2b31a0647 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/Texture.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.renderer; +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.blaze3d.textures.TextureFormat; -import net.minecraft.client.texture.AbstractTexture; -import net.minecraft.client.texture.NativeImage; +import net.minecraft.client.renderer.texture.AbstractTexture; import org.jetbrains.annotations.NotNull; import org.lwjgl.BufferUtils; import org.lwjgl.stb.STBImage; @@ -24,18 +24,18 @@ public class Texture extends AbstractTexture { public Texture(int width, int height, TextureFormat format, FilterMode min, FilterMode mag) { - glTexture = RenderSystem.getDevice().createTexture("", 15, format, width, height, 1, 1); - sampler = RenderSystem.getSamplerCache().get(AddressMode.REPEAT, AddressMode.REPEAT, min, mag, false); + texture = RenderSystem.getDevice().createTexture("", 15, format, width, height, 1, 1); + sampler = RenderSystem.getSamplerCache().getSampler(AddressMode.REPEAT, AddressMode.REPEAT, min, mag, false); - glTextureView = RenderSystem.getDevice().createTextureView(glTexture); + textureView = RenderSystem.getDevice().createTextureView(texture); } public int getWidth() { - return getGlTexture().getWidth(0); + return getTexture().getWidth(0); } public int getHeight() { - return getGlTexture().getHeight(0); + return getTexture().getHeight(0); } public void upload(byte[] bytes) { @@ -46,15 +46,15 @@ public void upload(ByteBuffer buffer) { var image = getImage(); buffer.rewind(); - MemoryUtil.memCopy(MemoryUtil.memAddress(buffer), image.imageId(), buffer.remaining()); + MemoryUtil.memCopy(MemoryUtil.memAddress(buffer), image.getPointer(), buffer.remaining()); - RenderSystem.getDevice().createCommandEncoder().writeToTexture(glTexture, image); + RenderSystem.getDevice().createCommandEncoder().writeToTexture(texture, image); image.close(); } private @NotNull NativeImage getImage() { - NativeImage.Format imageFormat = switch (glTexture.getFormat()) { + NativeImage.Format imageFormat = switch (texture.getFormat()) { case RGBA8 -> NativeImage.Format.RGBA; case RED8 -> NativeImage.Format.LUMINANCE; default -> throw new IllegalArgumentException(); diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java index 02ffe511db..c2e3d307ba 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/CustomTextRenderer.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.renderer.MeshRenderer; import meteordevelopment.meteorclient.renderer.MeteorRenderPipelines; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import java.io.IOException; import java.nio.ByteBuffer; @@ -53,8 +53,7 @@ public void begin(double scale, boolean scaleOnly, boolean big) { if (big) { this.font = fonts[fonts.length - 1]; - } - else { + } else { double scaleA = Math.floor(scale * 10) / 10; int scaleI; @@ -102,8 +101,7 @@ public double render(String text, double x, double y, Color color, boolean shado font.render(mesh, text, x, y, color, scale / 1.5); SHADOW_COLOR.a = preShadowA; - } - else { + } else { width = font.render(mesh, text, x, y, color, scale / 1.5); } @@ -124,10 +122,10 @@ public void end() { mesh.end(); MeshRenderer.begin() - .attachments(MinecraftClient.getInstance().getFramebuffer()) + .attachments(Minecraft.getInstance().getMainRenderTarget()) .pipeline(MeteorRenderPipelines.UI_TEXT) .mesh(mesh) - .sampler("u_Texture", font.texture.getGlTextureView(), font.texture.getSampler()) + .sampler("u_Texture", font.texture.getTextureView(), font.texture.getSampler()) .end(); } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/SystemFontFace.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/SystemFontFace.java index fc8c3868dd..6b2f0644e2 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/SystemFontFace.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/SystemFontFace.java @@ -25,6 +25,6 @@ public ReadableByteChannel byteChannelForRead() throws IOException { @Override public String toString() { - return super.toString() + " (" + path.toString() + ")"; + return "%s (%s)".formatted(super.toString(), path); } } diff --git a/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java b/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java index 05ebe6dce5..8e1f4e14f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/renderer/text/VanillaTextRenderer.java @@ -6,12 +6,12 @@ package meteordevelopment.meteorclient.renderer.text; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.ByteBufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.font.TextRenderer.TextLayerType; -import net.minecraft.client.render.LightmapTextureManager; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.BufferAllocator; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.gui.Font.DisplayMode; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.util.LightCoordsUtil; import org.joml.Matrix4f; import org.joml.Matrix4fStack; @@ -20,10 +20,10 @@ public class VanillaTextRenderer implements TextRenderer { public static final VanillaTextRenderer INSTANCE = new VanillaTextRenderer(); - private final BufferAllocator buffer = new BufferAllocator(2048); - private final VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(buffer); + private final ByteBufferBuilder buffer = new ByteBufferBuilder(2048); + private final MultiBufferSource.BufferSource immediate = MultiBufferSource.immediate(buffer); - private final MatrixStack matrices = new MatrixStack(); + private final PoseStack matrices = new PoseStack(); private final Matrix4f emptyMatrix = new Matrix4f(); public double scale = 2; @@ -46,12 +46,12 @@ public double getWidth(String text, int length, boolean shadow) { if (text.isEmpty()) return 0; if (length != text.length()) text = text.substring(0, length); - return (mc.textRenderer.getWidth(text) + (shadow ? 1 : 0)) * scale; + return (mc.font.width(text) + (shadow ? 1 : 0)) * scale; } @Override public double getHeight(boolean shadow) { - return (mc.textRenderer.fontHeight + (shadow ? 1 : 0)) * scale; + return (mc.font.lineHeight + (shadow ? 1 : 0)) * scale; } @Override @@ -75,15 +75,15 @@ public double render(String text, double x, double y, Color color, boolean shado Matrix4f matrix = emptyMatrix; if (scaleIndividually) { - matrices.push(); + matrices.pushPose(); matrices.scale((float) scale, (float) scale, 1); - matrix = matrices.peek().getPositionMatrix(); + matrix = matrices.last().pose(); } - mc.textRenderer.draw(text, (float) (x / scale), (float) (y / scale), color.getPacked(), shadow, matrix, immediate, TextLayerType.NORMAL, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); - double x2 = (x / scale) + mc.textRenderer.getWidth(text); + mc.font.drawInBatch(text, (float) (x / scale), (float) (y / scale), color.getPacked(), shadow, matrix, immediate, DisplayMode.NORMAL, 0, LightCoordsUtil.FULL_BRIGHT); + double x2 = (x / scale) + mc.font.width(text); - if (scaleIndividually) matrices.pop(); + if (scaleIndividually) matrices.popPose(); color.a = preA; @@ -105,7 +105,7 @@ public void end() { matrixStack.pushMatrix(); if (!scaleIndividually) matrixStack.scale((float) scale, (float) scale, 1); - immediate.draw(); + immediate.endBatch(); matrixStack.popMatrix(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockDataSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockDataSetting.java index 2fed41a45f..63850490cc 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockDataSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockDataSetting.java @@ -9,10 +9,10 @@ import meteordevelopment.meteorclient.utils.misc.ICopyable; import meteordevelopment.meteorclient.utils.misc.IGetter; import meteordevelopment.meteorclient.utils.misc.ISerializable; -import net.minecraft.block.Block; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; import java.util.HashMap; import java.util.Map; @@ -43,10 +43,10 @@ protected boolean isValueValid(Map value) { } @Override - protected NbtCompound save(NbtCompound tag) { - NbtCompound valueTag = new NbtCompound(); + protected CompoundTag save(CompoundTag tag) { + CompoundTag valueTag = new CompoundTag(); for (Block block : get().keySet()) { - valueTag.put(Registries.BLOCK.getId(block).toString(), get().get(block).toTag()); + valueTag.put(BuiltInRegistries.BLOCK.getKey(block).toString(), get().get(block).toTag()); } tag.put("value", valueTag); @@ -54,12 +54,12 @@ protected NbtCompound save(NbtCompound tag) { } @Override - protected Map load(NbtCompound tag) { + protected Map load(CompoundTag tag) { get().clear(); - NbtCompound valueTag = tag.getCompoundOrEmpty("value"); - for (String key : valueTag.getKeys()) { - get().put(Registries.BLOCK.get(Identifier.of(key)), defaultData.get().copy().fromTag(valueTag.getCompoundOrEmpty(key))); + CompoundTag valueTag = tag.getCompoundOrEmpty("value"); + for (String key : valueTag.keySet()) { + get().put(BuiltInRegistries.BLOCK.getValue(Identifier.parse(key)), defaultData.get().copy().fromTag(valueTag.getCompoundOrEmpty(key))); } return get(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java index 5d49ac76dd..abf7ef47c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockListSetting.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.block.Block; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; import java.util.ArrayList; import java.util.Arrays; @@ -40,10 +40,11 @@ protected List parseImpl(String str) { try { for (String value : values) { - Block block = parseId(Registries.BLOCK, value); + Block block = parseId(BuiltInRegistries.BLOCK, value); if (block != null && (filter == null || filter.test(block))) blocks.add(block); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return blocks; } @@ -55,14 +56,14 @@ protected boolean isValueValid(List value) { @Override public Iterable getIdentifierSuggestions() { - return Registries.BLOCK.getIds(); + return BuiltInRegistries.BLOCK.keySet(); } @Override - protected NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + protected CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (Block block : get()) { - valueTag.add(NbtString.of(Registries.BLOCK.getId(block).toString())); + valueTag.add(StringTag.valueOf(BuiltInRegistries.BLOCK.getKey(block).toString())); } tag.put("value", valueTag); @@ -70,12 +71,12 @@ protected NbtCompound save(NbtCompound tag) { } @Override - protected List load(NbtCompound tag) { + protected List load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - Block block = Registries.BLOCK.get(Identifier.of(tagI.asString().orElse(""))); + ListTag valueTag = tag.getListOrEmpty("value"); + for (Tag tagI : valueTag) { + Block block = BuiltInRegistries.BLOCK.getValue(Identifier.parse(tagI.asString().orElse(""))); if (filter == null || filter.test(block)) get().add(block); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockPosSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockPosSetting.java index 1e82f01928..86814567d0 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockPosSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockPosSetting.java @@ -5,8 +5,8 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; import java.util.List; import java.util.function.Consumer; @@ -24,8 +24,8 @@ protected BlockPos parseImpl(String str) { BlockPos bp = null; try { bp = new BlockPos(Integer.parseInt(values.get(0)), Integer.parseInt(values.get(1)), Integer.parseInt(values.get(2))); + } catch (NumberFormatException _) { } - catch (NumberFormatException ignored) {} return bp; } @@ -35,14 +35,14 @@ protected boolean isValueValid(BlockPos value) { } @Override - protected NbtCompound save(NbtCompound tag) { - tag.putIntArray("value", new int[] {value.getX(), value.getY(), value.getZ()}); + protected CompoundTag save(CompoundTag tag) { + tag.putIntArray("value", new int[]{value.getX(), value.getY(), value.getZ()}); return tag; } @Override - protected BlockPos load(NbtCompound tag) { + protected BlockPos load(CompoundTag tag) { if (tag.getIntArray("value").isPresent()) { int[] value = tag.getIntArray("value").get(); set(new BlockPos(value[0], value[1], value[2])); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java index 0700964b72..2daf0a1c45 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BlockSetting.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.block.Block; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; import java.util.function.Consumer; import java.util.function.Predicate; @@ -24,7 +24,7 @@ public BlockSetting(String name, String description, Block defaultValue, Consume @Override protected Block parseImpl(String str) { - return parseId(Registries.BLOCK, str); + return parseId(BuiltInRegistries.BLOCK, str); } @Override @@ -34,22 +34,22 @@ protected boolean isValueValid(Block value) { @Override public Iterable getIdentifierSuggestions() { - return Registries.BLOCK.getIds(); + return BuiltInRegistries.BLOCK.keySet(); } @Override - protected NbtCompound save(NbtCompound tag) { - tag.putString("value", Registries.BLOCK.getId(get()).toString()); + protected CompoundTag save(CompoundTag tag) { + tag.putString("value", BuiltInRegistries.BLOCK.getKey(get()).toString()); return tag; } @Override - protected Block load(NbtCompound tag) { - value = Registries.BLOCK.get(Identifier.of(tag.getString("value", ""))); + protected Block load(CompoundTag tag) { + value = BuiltInRegistries.BLOCK.getValue(Identifier.parse(tag.getStringOr("value", ""))); if (filter != null && !filter.test(value)) { - for (Block block : Registries.BLOCK) { + for (Block block : BuiltInRegistries.BLOCK) { if (filter.test(block)) { value = block; break; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java index b554923443..334343b71e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/BoolSetting.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.List; import java.util.function.Consumer; @@ -36,15 +36,15 @@ public List getSuggestions() { } @Override - public NbtCompound save(NbtCompound tag) { + public CompoundTag save(CompoundTag tag) { tag.putBoolean("value", get()); return tag; } @Override - public Boolean load(NbtCompound tag) { - set(tag.getBoolean("value", false)); + public Boolean load(CompoundTag tag) { + set(tag.getBooleanOr("value", false)); return get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java index 1726463c57..3294e47aff 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ColorListSetting.java @@ -7,8 +7,8 @@ import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import java.util.ArrayList; import java.util.List; @@ -28,7 +28,7 @@ protected List parseImpl(String str) { String[] strs = colorStr.split(","); colors.add(new SettingColor(Integer.parseInt(strs[0]), Integer.parseInt(strs[1]), Integer.parseInt(strs[2]), Integer.parseInt(strs[3]))); } - } catch (IndexOutOfBoundsException | NumberFormatException ignored) { + } catch (IndexOutOfBoundsException | NumberFormatException _) { } return colors; } @@ -48,18 +48,18 @@ protected void resetImpl() { } @Override - protected NbtCompound save(NbtCompound tag) { + protected CompoundTag save(CompoundTag tag) { tag.put("value", NbtUtils.listToTag(get())); return tag; } @Override - protected List load(NbtCompound tag) { + protected List load(CompoundTag tag) { get().clear(); - for (NbtElement e : tag.getListOrEmpty("value")) { - get().add(new SettingColor().fromTag((NbtCompound) e)); + for (Tag e : tag.getListOrEmpty("value")) { + get().add(new SettingColor().fromTag((CompoundTag) e)); } return get(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java index 930124b3ea..17c9f71411 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ColorSetting.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.List; import java.util.function.Consumer; @@ -24,7 +24,7 @@ protected SettingColor parseImpl(String str) { try { String[] strs = str.split(" "); return new SettingColor(Integer.parseInt(strs[0]), Integer.parseInt(strs[1]), Integer.parseInt(strs[2]), Integer.parseInt(strs[3])); - } catch (IndexOutOfBoundsException | NumberFormatException ignored) { + } catch (IndexOutOfBoundsException | NumberFormatException _) { return null; } } @@ -48,14 +48,14 @@ public List getSuggestions() { } @Override - protected NbtCompound save(NbtCompound tag) { + protected CompoundTag save(CompoundTag tag) { tag.put("value", get().toTag()); return tag; } @Override - public SettingColor load(NbtCompound tag) { + public SettingColor load(CompoundTag tag) { get().fromTag(tag.getCompoundOrEmpty("value")); return get(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/DoubleSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/DoubleSetting.java index 64b1e1705d..ed17a0a567 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/DoubleSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/DoubleSetting.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.function.Consumer; @@ -32,7 +32,7 @@ private DoubleSetting(String name, String description, double defaultValue, Cons protected Double parseImpl(String str) { try { return Double.parseDouble(str.trim()); - } catch (NumberFormatException ignored) { + } catch (NumberFormatException _) { return null; } } @@ -43,15 +43,15 @@ protected boolean isValueValid(Double value) { } @Override - protected NbtCompound save(NbtCompound tag) { + protected CompoundTag save(CompoundTag tag) { tag.putDouble("value", get()); return tag; } @Override - public Double load(NbtCompound tag) { - set(tag.getDouble("value", 0.0)); + public Double load(CompoundTag tag) { + set(tag.getDoubleOr("value", 0.0)); return get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java index e56565df17..9a0990cb39 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EnchantmentListSetting.java @@ -6,25 +6,25 @@ package meteordevelopment.meteorclient.settings; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import net.minecraft.client.MinecraftClient; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; import java.lang.reflect.AccessFlag; import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; -public class EnchantmentListSetting extends Setting>> { - public EnchantmentListSetting(String name, String description, Set> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible) { +public class EnchantmentListSetting extends Setting>> { + public EnchantmentListSetting(String name, String description, Set> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } @@ -34,40 +34,40 @@ public void resetImpl() { } @Override - protected Set> parseImpl(String str) { + protected Set> parseImpl(String str) { String[] values = str.split(","); - Set> enchs = new ObjectOpenHashSet<>(values.length); + Set> enchs = new ObjectOpenHashSet<>(values.length); for (String value : values) { String name = value.trim(); Identifier id; - if (name.contains(":")) id = Identifier.of(name); - else id = Identifier.ofVanilla(name); + if (name.contains(":")) id = Identifier.parse(name); + else id = Identifier.withDefaultNamespace(name); - enchs.add(RegistryKey.of(RegistryKeys.ENCHANTMENT, id)); + enchs.add(ResourceKey.create(Registries.ENCHANTMENT, id)); } return enchs; } @Override - protected boolean isValueValid(Set> value) { + protected boolean isValueValid(Set> value) { return true; } @Override public Iterable getIdentifierSuggestions() { - return Optional.ofNullable(MinecraftClient.getInstance().getNetworkHandler()) - .flatMap(networkHandler -> networkHandler.getRegistryManager().getOptional(RegistryKeys.ENCHANTMENT)) - .map(Registry::getIds).orElse(Set.of()); + return Optional.ofNullable(Minecraft.getInstance().getConnection()) + .flatMap(networkHandler -> networkHandler.registryAccess().lookup(Registries.ENCHANTMENT)) + .map(Registry::keySet).orElse(Set.of()); } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); - for (RegistryKey ench : get()) { - valueTag.add(NbtString.of(ench.getValue().toString())); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); + for (ResourceKey ench : get()) { + valueTag.add(StringTag.valueOf(ench.identifier().toString())); } tag.put("value", valueTag); @@ -75,19 +75,19 @@ public NbtCompound save(NbtCompound tag) { } @Override - public Set> load(NbtCompound tag) { + public Set> load(CompoundTag tag) { get().clear(); - for (NbtElement tagI : tag.getListOrEmpty("value")) { - get().add(RegistryKey.of(RegistryKeys.ENCHANTMENT, Identifier.of(tagI.asString().orElse("")))); + for (Tag tagI : tag.getListOrEmpty("value")) { + get().add(ResourceKey.create(Registries.ENCHANTMENT, Identifier.parse(tagI.asString().orElse("")))); } return get(); } @SuppressWarnings({"unchecked", "rawtypes"}) - public static class Builder extends SettingBuilder>, EnchantmentListSetting> { - private static final Set> VANILLA_DEFAULTS; + public static class Builder extends SettingBuilder>, EnchantmentListSetting> { + private static final Set> VANILLA_DEFAULTS; public Builder() { super(new ObjectOpenHashSet<>()); @@ -98,7 +98,7 @@ public Builder vanillaDefaults() { } @SafeVarargs - public final Builder defaultValue(RegistryKey... defaults) { + public final Builder defaultValue(ResourceKey... defaults) { return defaultValue(defaults != null ? new ObjectOpenHashSet<>(defaults) : new ObjectOpenHashSet<>()); } @@ -110,7 +110,7 @@ public EnchantmentListSetting build() { static { VANILLA_DEFAULTS = (Set) Arrays.stream(Enchantments.class.getDeclaredFields()) .filter(field -> field.accessFlags().containsAll(List.of(AccessFlag.PUBLIC, AccessFlag.STATIC, AccessFlag.FINAL))) - .filter(field -> field.getType() == RegistryKey.class) + .filter(field -> field.getType() == ResourceKey.class) .map(field -> { try { return field.get(null); @@ -118,8 +118,8 @@ public EnchantmentListSetting build() { return null; } }).filter(Objects::nonNull) - .map(RegistryKey.class::cast) - .filter(registryKey -> registryKey.getRegistryRef() == RegistryKeys.ENCHANTMENT) + .map(ResourceKey.class::cast) + .filter(registryKey -> registryKey.registryKey() == Registries.ENCHANTMENT) .collect(Collectors.toSet()); } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java index b716b4c219..64de041f23 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EntityTypeListSetting.java @@ -7,14 +7,14 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import meteordevelopment.meteorclient.utils.entity.EntityUtils; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; import java.util.ArrayList; import java.util.List; @@ -45,39 +45,40 @@ protected Set> parseImpl(String str) { try { for (String value : values) { - EntityType entity = parseId(Registries.ENTITY_TYPE, value); + EntityType entity = parseId(BuiltInRegistries.ENTITY_TYPE, value); if (entity != null) entities.add(entity); else { String lowerValue = value.trim().toLowerCase(); if (!groups.contains(lowerValue)) continue; - for (EntityType entityType : Registries.ENTITY_TYPE) { + for (EntityType entityType : BuiltInRegistries.ENTITY_TYPE) { if (filter != null && !filter.test(entityType)) continue; switch (lowerValue) { case "animal" -> { - if (entityType.getSpawnGroup() == SpawnGroup.CREATURE) entities.add(entityType); + if (entityType.getCategory() == MobCategory.CREATURE) entities.add(entityType); } case "wateranimal" -> { - if (entityType.getSpawnGroup() == SpawnGroup.WATER_AMBIENT - || entityType.getSpawnGroup() == SpawnGroup.WATER_CREATURE - || entityType.getSpawnGroup() == SpawnGroup.UNDERGROUND_WATER_CREATURE - || entityType.getSpawnGroup() == SpawnGroup.AXOLOTLS) entities.add(entityType); + if (entityType.getCategory() == MobCategory.WATER_AMBIENT + || entityType.getCategory() == MobCategory.WATER_CREATURE + || entityType.getCategory() == MobCategory.UNDERGROUND_WATER_CREATURE + || entityType.getCategory() == MobCategory.AXOLOTLS) entities.add(entityType); } case "monster" -> { - if (entityType.getSpawnGroup() == SpawnGroup.MONSTER) entities.add(entityType); + if (entityType.getCategory() == MobCategory.MONSTER) entities.add(entityType); } case "ambient" -> { - if (entityType.getSpawnGroup() == SpawnGroup.AMBIENT) entities.add(entityType); + if (entityType.getCategory() == MobCategory.AMBIENT) entities.add(entityType); } case "misc" -> { - if (entityType.getSpawnGroup() == SpawnGroup.MISC) entities.add(entityType); + if (entityType.getCategory() == MobCategory.MISC) entities.add(entityType); } } } } } - } catch (Exception ignored) {} + } catch (Exception _) { + } return entities; } @@ -91,8 +92,9 @@ protected boolean isValueValid(Set> value) { public List getSuggestions() { if (suggestions == null) { suggestions = new ArrayList<>(groups); - for (EntityType entityType : Registries.ENTITY_TYPE) { - if (filter == null || filter.test(entityType)) suggestions.add(Registries.ENTITY_TYPE.getId(entityType).toString()); + for (EntityType entityType : BuiltInRegistries.ENTITY_TYPE) { + if (filter == null || filter.test(entityType)) + suggestions.add(BuiltInRegistries.ENTITY_TYPE.getKey(entityType).toString()); } } @@ -100,10 +102,10 @@ public List getSuggestions() { } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (EntityType entityType : get()) { - valueTag.add(NbtString.of(Registries.ENTITY_TYPE.getId(entityType).toString())); + valueTag.add(StringTag.valueOf(BuiltInRegistries.ENTITY_TYPE.getKey(entityType).toString())); } tag.put("value", valueTag); @@ -111,12 +113,12 @@ public NbtCompound save(NbtCompound tag) { } @Override - public Set> load(NbtCompound tag) { + public Set> load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - EntityType type = Registries.ENTITY_TYPE.get(Identifier.of(tagI.asString().orElse(""))); + ListTag valueTag = tag.getListOrEmpty("value"); + for (Tag tagI : valueTag) { + EntityType type = BuiltInRegistries.ENTITY_TYPE.getValue(Identifier.parse(tagI.asString().orElse(""))); if (filter == null || filter.test(type)) get().add(type); } @@ -139,7 +141,7 @@ public Builder onlyAttackable() { return this; } - public Builder filter(Predicate> filter){ + public Builder filter(Predicate> filter) { this.filter = filter; return this; } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java index fae07d2770..297024adc9 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/EnumSetting.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.ArrayList; import java.util.List; @@ -45,15 +45,15 @@ public List getSuggestions() { } @Override - public NbtCompound save(NbtCompound tag) { + public CompoundTag save(CompoundTag tag) { tag.putString("value", get().toString()); return tag; } @Override - public T load(NbtCompound tag) { - parse(tag.getString("value", "")); + public T load(CompoundTag tag) { + parse(tag.getStringOr("value", "")); return get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/FontFaceSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/FontFaceSetting.java index 3ed272c878..161ea9f926 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/FontFaceSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/FontFaceSetting.java @@ -9,7 +9,7 @@ import meteordevelopment.meteorclient.renderer.text.FontFace; import meteordevelopment.meteorclient.renderer.text.FontFamily; import meteordevelopment.meteorclient.renderer.text.FontInfo; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.List; import java.util.function.Consumer; @@ -28,8 +28,7 @@ protected FontFace parseImpl(String str) { if (family.getName().replace(" ", "").equals(split[0])) { try { return family.get(FontInfo.Type.valueOf(split[1])); - } - catch (IllegalArgumentException ignored) { + } catch (IllegalArgumentException _) { return null; } } @@ -56,21 +55,20 @@ protected boolean isValueValid(FontFace value) { } @Override - protected NbtCompound save(NbtCompound tag) { + protected CompoundTag save(CompoundTag tag) { tag.putString("family", get().info.family()); tag.putString("type", get().info.type().toString()); return tag; } @Override - protected FontFace load(NbtCompound tag) { - String family = tag.getString("family", ""); + protected FontFace load(CompoundTag tag) { + String family = tag.getStringOr("family", ""); FontInfo.Type type; try { - type = FontInfo.Type.valueOf(tag.getString("type", "")); - } - catch (IllegalArgumentException ignored) { + type = FontInfo.Type.valueOf(tag.getStringOr("type", "")); + } catch (IllegalArgumentException _) { set(Fonts.DEFAULT_FONT); return get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/GenericSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/GenericSetting.java index e36f819e15..8ee57b912e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/GenericSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/GenericSetting.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WidgetScreen; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.function.Consumer; @@ -37,14 +37,14 @@ protected boolean isValueValid(T value) { } @Override - public NbtCompound save(NbtCompound tag) { + public CompoundTag save(CompoundTag tag) { tag.put("value", get().toTag()); return tag; } @Override - public T load(NbtCompound tag) { + public T load(CompoundTag tag) { get().fromTag(tag.getCompoundOrEmpty("value")); return get(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/IBlockData.java b/src/main/java/meteordevelopment/meteorclient/settings/IBlockData.java index 6f752c0752..0925dca6ff 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/IBlockData.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/IBlockData.java @@ -10,7 +10,7 @@ import meteordevelopment.meteorclient.utils.misc.IChangeable; import meteordevelopment.meteorclient.utils.misc.ICopyable; import meteordevelopment.meteorclient.utils.misc.ISerializable; -import net.minecraft.block.Block; +import net.minecraft.world.level.block.Block; public interface IBlockData & ISerializable & IChangeable & IBlockData> { WidgetScreen createScreen(GuiTheme theme, Block block, BlockDataSetting setting); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/IntSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/IntSetting.java index ecef86d064..d0e8b5e5c2 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/IntSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/IntSetting.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.function.Consumer; @@ -28,7 +28,7 @@ private IntSetting(String name, String description, int defaultValue, Consumer parseImpl(String str) { try { for (String value : values) { - Item item = parseId(Registries.ITEM, value); + Item item = parseId(BuiltInRegistries.ITEM, value); if (item != null && (filter == null || filter.test(item))) items.add(item); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return items; } @@ -57,14 +58,15 @@ protected boolean isValueValid(List value) { @Override public Iterable getIdentifierSuggestions() { - return Registries.ITEM.getIds(); + return BuiltInRegistries.ITEM.keySet(); } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (Item item : get()) { - if (bypassFilterWhenSavingAndLoading || (filter == null || filter.test(item))) valueTag.add(NbtString.of(Registries.ITEM.getId(item).toString())); + if (bypassFilterWhenSavingAndLoading || (filter == null || filter.test(item))) + valueTag.add(StringTag.valueOf(BuiltInRegistries.ITEM.getKey(item).toString())); } tag.put("value", valueTag); @@ -72,12 +74,12 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List load(NbtCompound tag) { + public List load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - Item item = Registries.ITEM.get(Identifier.of(tagI.asString().orElse(""))); + ListTag valueTag = tag.getListOrEmpty("value"); + for (Tag tagI : valueTag) { + Item item = BuiltInRegistries.ITEM.getValue(Identifier.parse(tagI.asString().orElse(""))); if (bypassFilterWhenSavingAndLoading || (filter == null || filter.test(item))) get().add(item); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ItemSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ItemSetting.java index 05e65c66a2..a40fcc727f 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ItemSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ItemSetting.java @@ -5,10 +5,10 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.item.Item; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.Item; import java.util.function.Consumer; import java.util.function.Predicate; @@ -24,7 +24,7 @@ public ItemSetting(String name, String description, Item defaultValue, Consumer< @Override protected Item parseImpl(String str) { - return parseId(Registries.ITEM, str); + return parseId(BuiltInRegistries.ITEM, str); } @Override @@ -34,22 +34,22 @@ protected boolean isValueValid(Item value) { @Override public Iterable getIdentifierSuggestions() { - return Registries.ITEM.getIds(); + return BuiltInRegistries.ITEM.keySet(); } @Override - public NbtCompound save(NbtCompound tag) { - tag.putString("value", Registries.ITEM.getId(get()).toString()); + public CompoundTag save(CompoundTag tag) { + tag.putString("value", BuiltInRegistries.ITEM.getKey(get()).toString()); return tag; } @Override - public Item load(NbtCompound tag) { - value = Registries.ITEM.get(Identifier.of(tag.getString("value",""))); + public Item load(CompoundTag tag) { + value = BuiltInRegistries.ITEM.getValue(Identifier.parse(tag.getStringOr("value", ""))); if (filter != null && !filter.test(value)) { - for (Item item : Registries.ITEM) { + for (Item item : BuiltInRegistries.ITEM) { if (filter.test(item)) { value = item; break; diff --git a/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java index f0493cddfe..2f84997edc 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/KeybindSetting.java @@ -6,14 +6,14 @@ package meteordevelopment.meteorclient.settings; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.meteor.KeyEvent; +import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; import meteordevelopment.meteorclient.gui.widgets.WKeybind; import meteordevelopment.meteorclient.utils.misc.Keybind; import meteordevelopment.meteorclient.utils.misc.input.KeyAction; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import org.lwjgl.glfw.GLFW; import java.util.function.Consumer; @@ -30,19 +30,21 @@ public KeybindSetting(String name, String description, Keybind defaultValue, Con } @EventHandler(priority = EventPriority.HIGHEST) - private void onKeyBinding(KeyEvent event) { + private void onKeyBinding(KeyInputEvent event) { if (widget == null) return; if (event.action == KeyAction.Press && event.key() == GLFW.GLFW_KEY_ESCAPE && widget.onClear()) event.cancel(); - else if (event.action == KeyAction.Release && widget.onAction(true, event.key(), event.modifiers())) event.cancel(); + else if (event.action == KeyAction.Release && widget.onAction(true, event.key(), event.modifiers())) + event.cancel(); } @EventHandler(priority = EventPriority.HIGHEST) private void onMouseClickBinding(MouseClickEvent event) { - if (event.action == KeyAction.Press && widget != null && widget.onAction(false, event.button(), 0)) event.cancel(); + if (event.action == KeyAction.Press && widget != null && widget.onAction(false, event.button(), 0)) + event.cancel(); } @EventHandler(priority = EventPriority.HIGH) - private void onKey(KeyEvent event) { + private void onKey(KeyInputEvent event) { if (event.action == KeyAction.Release && get().matches(event.input) && (module == null || module.isActive()) && action != null) { action.run(); } @@ -67,7 +69,7 @@ public void resetImpl() { protected Keybind parseImpl(String str) { try { return Keybind.fromKey(Integer.parseInt(str.trim())); - } catch (NumberFormatException ignored) { + } catch (NumberFormatException _) { return null; } } @@ -78,14 +80,14 @@ protected boolean isValueValid(Keybind value) { } @Override - public NbtCompound save(NbtCompound tag) { + public CompoundTag save(CompoundTag tag) { tag.put("value", get().toTag()); return tag; } @Override - public Keybind load(NbtCompound tag) { + public Keybind load(CompoundTag tag) { get().fromTag(tag.getCompoundOrEmpty("value")); return get(); diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java index 6000407ca4..574eb65d9e 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ModuleListSetting.java @@ -7,10 +7,10 @@ import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; import java.util.ArrayList; import java.util.List; @@ -38,7 +38,8 @@ protected List parseImpl(String str) { Module module = Modules.get().get(value.trim()); if (module != null) modules.add(module); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return modules; } @@ -59,20 +60,20 @@ public List getSuggestions() { } @Override - public NbtCompound save(NbtCompound tag) { - NbtList modulesTag = new NbtList(); - for (Module module : get()) modulesTag.add(NbtString.of(module.name)); + public CompoundTag save(CompoundTag tag) { + ListTag modulesTag = new ListTag(); + for (Module module : get()) modulesTag.add(StringTag.valueOf(module.name)); tag.put("modules", modulesTag); return tag; } @Override - public List load(NbtCompound tag) { + public List load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("modules"); - for (NbtElement tagI : valueTag) { + ListTag valueTag = tag.getListOrEmpty("modules"); + for (Tag tagI : valueTag) { Module module = Modules.get().get(tagI.asString().orElse("")); if (module != null) get().add(module); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java index a0197e0f4f..18bf38b81b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/PacketListSetting.java @@ -7,11 +7,11 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import meteordevelopment.meteorclient.utils.network.PacketUtils; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.network.packet.Packet; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.protocol.Packet; import java.util.ArrayList; import java.util.List; @@ -44,7 +44,8 @@ protected Set>> parseImpl(String str) { Class> packet = PacketUtils.getPacket(value.trim()); if (packet != null && (filter == null || filter.test(packet))) packets.add(packet); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return packets; } @@ -72,10 +73,10 @@ public List getSuggestions() { } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (Class> packet : get()) { - valueTag.add(NbtString.of(PacketUtils.getName(packet))); + valueTag.add(StringTag.valueOf(PacketUtils.getName(packet))); } tag.put("value", valueTag); @@ -83,12 +84,12 @@ public NbtCompound save(NbtCompound tag) { } @Override - public Set>> load(NbtCompound tag) { + public Set>> load(CompoundTag tag) { get().clear(); - NbtElement valueTag = tag.get("value"); - if (valueTag instanceof NbtList) { - for (NbtElement t : (NbtList) valueTag) { + Tag valueTag = tag.get("value"); + if (valueTag instanceof ListTag) { + for (Tag t : (ListTag) valueTag) { Class> packet = PacketUtils.getPacket(t.asString().orElse("")); if (packet != null && (filter == null || filter.test(packet))) get().add(packet); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java index 6767344ede..329ccde8f2 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ParticleTypeListSetting.java @@ -5,14 +5,14 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.particle.ParticleType; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; import java.util.ArrayList; import java.util.Arrays; @@ -36,10 +36,11 @@ protected List> parseImpl(String str) { try { for (String value : values) { - ParticleType particleType = parseId(Registries.PARTICLE_TYPE, value); - if (particleType instanceof ParticleEffect) particleTypes.add(particleType); + ParticleType particleType = parseId(BuiltInRegistries.PARTICLE_TYPE, value); + if (particleType instanceof ParticleOptions) particleTypes.add(particleType); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return particleTypes; } @@ -51,15 +52,15 @@ protected boolean isValueValid(List> value) { @Override public Iterable getIdentifierSuggestions() { - return Registries.PARTICLE_TYPE.getIds(); + return BuiltInRegistries.PARTICLE_TYPE.keySet(); } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (ParticleType particleType : get()) { - Identifier id = Registries.PARTICLE_TYPE.getId(particleType); - if (id != null) valueTag.add(NbtString.of(id.toString())); + Identifier id = BuiltInRegistries.PARTICLE_TYPE.getKey(particleType); + if (id != null) valueTag.add(StringTag.valueOf(id.toString())); } tag.put("value", valueTag); @@ -67,12 +68,12 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List> load(NbtCompound tag) { + public List> load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - ParticleType particleType = Registries.PARTICLE_TYPE.get(Identifier.of(tagI.asString().orElse(""))); + ListTag valueTag = tag.getListOrEmpty("value"); + for (Tag tagI : valueTag) { + ParticleType particleType = BuiltInRegistries.PARTICLE_TYPE.getValue(Identifier.parse(tagI.asString().orElse(""))); if (particleType != null) get().add(particleType); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java index 1d597c604f..d82fedb988 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/ScreenHandlerListSetting.java @@ -5,21 +5,21 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.registry.Registries; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.inventory.MenuType; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; -public class ScreenHandlerListSetting extends Setting>> { - public ScreenHandlerListSetting(String name, String description, List> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible) { +public class ScreenHandlerListSetting extends Setting>> { + public ScreenHandlerListSetting(String name, String description, List> defaultValue, Consumer>> onChanged, Consumer>>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } @@ -29,37 +29,37 @@ public void resetImpl() { } @Override - protected List> parseImpl(String str) { + protected List> parseImpl(String str) { String[] values = str.split(","); - List> handlers = new ArrayList<>(values.length); + List> handlers = new ArrayList<>(values.length); try { for (String value : values) { - ScreenHandlerType handler = parseId(Registries.SCREEN_HANDLER, value); + MenuType handler = parseId(BuiltInRegistries.MENU, value); if (handler != null) handlers.add(handler); } - } catch (Exception ignored) { + } catch (Exception _) { } return handlers; } @Override - protected boolean isValueValid(List> value) { + protected boolean isValueValid(List> value) { return true; } @Override public Iterable getIdentifierSuggestions() { - return Registries.SCREEN_HANDLER.getIds(); + return BuiltInRegistries.MENU.keySet(); } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); - for (ScreenHandlerType type : get()) { - Identifier id = Registries.SCREEN_HANDLER.getId(type); - if (id != null) valueTag.add(NbtString.of(id.toString())); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); + for (MenuType type : get()) { + Identifier id = BuiltInRegistries.MENU.getKey(type); + if (id != null) valueTag.add(StringTag.valueOf(id.toString())); } tag.put("value", valueTag); @@ -67,24 +67,24 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List> load(NbtCompound tag) { + public List> load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - ScreenHandlerType type = Registries.SCREEN_HANDLER.get(Identifier.of(tagI.asString().orElse(""))); + ListTag valueTag = tag.getListOrEmpty("value"); + for (Tag tagI : valueTag) { + MenuType type = BuiltInRegistries.MENU.getValue(Identifier.parse(tagI.asString().orElse(""))); if (type != null) get().add(type); } return get(); } - public static class Builder extends SettingBuilder>, ScreenHandlerListSetting> { + public static class Builder extends SettingBuilder>, ScreenHandlerListSetting> { public Builder() { super(new ArrayList<>(0)); } - public Builder defaultValue(ScreenHandlerType... defaults) { + public Builder defaultValue(MenuType... defaults) { return defaultValue(defaults != null ? Arrays.asList(defaults) : new ArrayList<>()); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Setting.java b/src/main/java/meteordevelopment/meteorclient/settings/Setting.java index 443fe390fe..e1fa52c2be 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Setting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Setting.java @@ -9,9 +9,9 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.IGetter; import meteordevelopment.meteorclient.utils.misc.ISerializable; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registry; -import net.minecraft.util.Identifier; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.Identifier; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -112,11 +112,11 @@ public List getSuggestions() { return NO_SUGGESTIONS; } - protected abstract NbtCompound save(NbtCompound tag); + protected abstract CompoundTag save(CompoundTag tag); @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("name", name); save(tag); @@ -124,10 +124,10 @@ public NbtCompound toTag() { return tag; } - protected abstract T load(NbtCompound tag); + protected abstract T load(CompoundTag tag); @Override - public T fromTag(NbtCompound tag) { + public T fromTag(CompoundTag tag) { T value = load(tag); onChanged(); @@ -157,9 +157,9 @@ public static T parseId(Registry registry, String name) { name = name.trim(); Identifier id; - if (name.contains(":")) id = Identifier.of(name); - else id = Identifier.of("minecraft", name); - if (registry.containsId(id)) return registry.get(id); + if (name.contains(":")) id = Identifier.parse(name); + else id = Identifier.withDefaultNamespace(name); + if (registry.containsKey(id)) return registry.getValue(id); return null; } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java index 49b4d121c9..f6bf734619 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SettingGroup.java @@ -6,9 +6,9 @@ package meteordevelopment.meteorclient.settings; import meteordevelopment.meteorclient.utils.misc.ISerializable; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -57,13 +57,13 @@ public boolean wasChanged() { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("name", name); tag.putBoolean("sectionExpanded", sectionExpanded); - NbtList settingsTag = new NbtList(); + ListTag settingsTag = new ListTag(); for (Setting setting : this) { if (setting.wasChanged()) settingsTag.add(setting.toTag()); } @@ -73,14 +73,14 @@ public NbtCompound toTag() { } @Override - public SettingGroup fromTag(NbtCompound tag) { - sectionExpanded = tag.getBoolean("sectionExpanded", false); + public SettingGroup fromTag(CompoundTag tag) { + sectionExpanded = tag.getBooleanOr("sectionExpanded", false); - NbtList settingsTag = tag.getListOrEmpty("settings"); - for (NbtElement t : settingsTag) { - NbtCompound settingTag = (NbtCompound) t; + ListTag settingsTag = tag.getListOrEmpty("settings"); + for (Tag t : settingsTag) { + CompoundTag settingTag = (CompoundTag) t; - Setting setting = get(settingTag.getString("name", "")); + Setting setting = get(settingTag.getStringOr("name", "")); if (setting != null) setting.fromTag(settingTag); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java index 948a42d1ec..3d85dffba6 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Settings.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Settings.java @@ -11,9 +11,9 @@ import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.render.color.RainbowColors; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -93,6 +93,7 @@ public SettingGroup createGroup(String name, boolean expanded) { groups.add(group); return group; } + public SettingGroup createGroup(String name) { return createGroup(name, true); } @@ -105,8 +106,7 @@ public void registerColorSettings(Module module) { if (setting instanceof ColorSetting) { RainbowColors.addSetting((Setting) setting); - } - else if (setting instanceof ColorListSetting) { + } else if (setting instanceof ColorListSetting) { RainbowColors.addSettingList((Setting>) setting); } } @@ -119,8 +119,7 @@ public void unregisterColorSettings() { for (Setting setting : group) { if (setting instanceof ColorSetting) { RainbowColors.removeSetting((Setting) setting); - } - else if (setting instanceof ColorListSetting) { + } else if (setting instanceof ColorListSetting) { RainbowColors.removeSettingList((Setting>) setting); } } @@ -155,10 +154,10 @@ public void tick(WContainer settings, GuiTheme theme) { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); - NbtList groupsTag = new NbtList(); + ListTag groupsTag = new ListTag(); for (SettingGroup group : groups) { if (group.wasChanged()) groupsTag.add(group.toTag()); } @@ -168,15 +167,15 @@ public NbtCompound toTag() { } @Override - public Settings fromTag(NbtCompound tag) { + public Settings fromTag(CompoundTag tag) { reset(); - NbtList groupsTag = tag.getListOrEmpty("groups"); + ListTag groupsTag = tag.getListOrEmpty("groups"); - for (NbtElement t : groupsTag) { - NbtCompound groupTag = (NbtCompound) t; + for (Tag t : groupsTag) { + CompoundTag groupTag = (CompoundTag) t; - SettingGroup sg = getGroup(groupTag.getString("name", "")); + SettingGroup sg = getGroup(groupTag.getStringOr("name", "")); if (sg != null) sg.fromTag(groupTag); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java index f516843a4c..9b61da4400 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/SoundEventListSetting.java @@ -5,13 +5,13 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.registry.Registries; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvent; import java.util.ArrayList; import java.util.Arrays; @@ -35,10 +35,11 @@ protected List parseImpl(String str) { try { for (String value : values) { - SoundEvent sound = parseId(Registries.SOUND_EVENT, value); + SoundEvent sound = parseId(BuiltInRegistries.SOUND_EVENT, value); if (sound != null) sounds.add(sound); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return sounds; } @@ -50,15 +51,15 @@ protected boolean isValueValid(List value) { @Override public Iterable getIdentifierSuggestions() { - return Registries.SOUND_EVENT.getIds(); + return BuiltInRegistries.SOUND_EVENT.keySet(); } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (SoundEvent sound : get()) { - Identifier id = Registries.SOUND_EVENT.getId(sound); - if (id != null) valueTag.add(NbtString.of(id.toString())); + Identifier id = BuiltInRegistries.SOUND_EVENT.getKey(sound); + if (id != null) valueTag.add(StringTag.valueOf(id.toString())); } tag.put("value", valueTag); @@ -66,11 +67,11 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List load(NbtCompound tag) { + public List load(CompoundTag tag) { get().clear(); - for (NbtElement tagI : tag.getListOrEmpty("value")) { - SoundEvent soundEvent = Registries.SOUND_EVENT.get(Identifier.of(tagI.asString().orElse(""))); + for (Tag tagI : tag.getListOrEmpty("value")) { + SoundEvent soundEvent = BuiltInRegistries.SOUND_EVENT.getValue(Identifier.parse(tagI.asString().orElse(""))); if (soundEvent != null) get().add(soundEvent); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java index bfb06f5ea8..a839547189 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectAmplifierMapSetting.java @@ -8,17 +8,17 @@ import it.unimi.dsi.fastutil.objects.Reference2IntArrayMap; import it.unimi.dsi.fastutil.objects.Reference2IntMap; import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.effect.MobEffect; import java.util.function.Consumer; -public class StatusEffectAmplifierMapSetting extends Setting> { - public static final Reference2IntMap EMPTY_STATUS_EFFECT_MAP = createStatusEffectMap(); +public class StatusEffectAmplifierMapSetting extends Setting> { + public static final Reference2IntMap EMPTY_STATUS_EFFECT_MAP = createStatusEffectMap(); - public StatusEffectAmplifierMapSetting(String name, String description, Reference2IntMap defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { + public StatusEffectAmplifierMapSetting(String name, String description, Reference2IntMap defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } @@ -28,34 +28,35 @@ public void resetImpl() { } @Override - protected Reference2IntMap parseImpl(String str) { + protected Reference2IntMap parseImpl(String str) { String[] values = str.split(","); - Reference2IntMap effects = new Reference2IntOpenHashMap<>(EMPTY_STATUS_EFFECT_MAP); + Reference2IntMap effects = new Reference2IntOpenHashMap<>(EMPTY_STATUS_EFFECT_MAP); try { for (String value : values) { String[] split = value.split(" "); - StatusEffect effect = parseId(Registries.STATUS_EFFECT, split[0]); + MobEffect effect = parseId(BuiltInRegistries.MOB_EFFECT, split[0]); int level = Integer.parseInt(split[1]); effects.put(effect, level); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return effects; } @Override - protected boolean isValueValid(Reference2IntMap value) { + protected boolean isValueValid(Reference2IntMap value) { return true; } @Override - public NbtCompound save(NbtCompound tag) { - NbtCompound valueTag = new NbtCompound(); - for (StatusEffect statusEffect : get().keySet()) { - Identifier id = Registries.STATUS_EFFECT.getId(statusEffect); + public CompoundTag save(CompoundTag tag) { + CompoundTag valueTag = new CompoundTag(); + for (MobEffect statusEffect : get().keySet()) { + Identifier id = BuiltInRegistries.MOB_EFFECT.getKey(statusEffect); if (id != null) valueTag.putInt(id.toString(), get().getInt(statusEffect)); } tag.put("value", valueTag); @@ -63,28 +64,28 @@ public NbtCompound save(NbtCompound tag) { return tag; } - private static Reference2IntMap createStatusEffectMap() { - Reference2IntMap map = new Reference2IntArrayMap<>(Registries.STATUS_EFFECT.getIds().size()); + private static Reference2IntMap createStatusEffectMap() { + Reference2IntMap map = new Reference2IntArrayMap<>(BuiltInRegistries.MOB_EFFECT.keySet().size()); - Registries.STATUS_EFFECT.forEach(potion -> map.put(potion, 0)); + BuiltInRegistries.MOB_EFFECT.forEach(potion -> map.put(potion, 0)); return map; } @Override - public Reference2IntMap load(NbtCompound tag) { + public Reference2IntMap load(CompoundTag tag) { get().clear(); - NbtCompound valueTag = tag.getCompoundOrEmpty("value"); - for (String key : valueTag.getKeys()) { - StatusEffect statusEffect = Registries.STATUS_EFFECT.get(Identifier.of(key)); - if (statusEffect != null) get().put(statusEffect, valueTag.getInt(key, 0)); + CompoundTag valueTag = tag.getCompoundOrEmpty("value"); + for (String key : valueTag.keySet()) { + MobEffect statusEffect = BuiltInRegistries.MOB_EFFECT.getValue(Identifier.parse(key)); + if (statusEffect != null) get().put(statusEffect, valueTag.getIntOr(key, 0)); } return get(); } - public static class Builder extends SettingBuilder, StatusEffectAmplifierMapSetting> { + public static class Builder extends SettingBuilder, StatusEffectAmplifierMapSetting> { public Builder() { super(new Reference2IntOpenHashMap<>(0)); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java index e4335ca2d8..d781dbcf41 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StatusEffectListSetting.java @@ -5,21 +5,21 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; +import net.minecraft.world.effect.MobEffect; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; -public class StatusEffectListSetting extends Setting> { - public StatusEffectListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { +public class StatusEffectListSetting extends Setting> { + public StatusEffectListSetting(String name, String description, List defaultValue, Consumer> onChanged, Consumer>> onModuleActivated, IVisible visible) { super(name, description, defaultValue, onChanged, onModuleActivated, visible); } @@ -29,37 +29,38 @@ public void resetImpl() { } @Override - protected List parseImpl(String str) { + protected List parseImpl(String str) { String[] values = str.split(","); - List effects = new ArrayList<>(values.length); + List effects = new ArrayList<>(values.length); try { for (String value : values) { - StatusEffect effect = parseId(Registries.STATUS_EFFECT, value); + MobEffect effect = parseId(BuiltInRegistries.MOB_EFFECT, value); if (effect != null) effects.add(effect); } - } catch (Exception ignored) {} + } catch (Exception _) { + } return effects; } @Override - protected boolean isValueValid(List value) { + protected boolean isValueValid(List value) { return true; } @Override public Iterable getIdentifierSuggestions() { - return Registries.STATUS_EFFECT.getIds(); + return BuiltInRegistries.MOB_EFFECT.keySet(); } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); - for (StatusEffect effect : get()) { - Identifier id = Registries.STATUS_EFFECT.getId(effect); - if (id != null) valueTag.add(NbtString.of(id.toString())); + for (MobEffect effect : get()) { + Identifier id = BuiltInRegistries.MOB_EFFECT.getKey(effect); + if (id != null) valueTag.add(StringTag.valueOf(id.toString())); } tag.put("value", valueTag); @@ -67,23 +68,23 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List load(NbtCompound tag) { + public List load(CompoundTag tag) { get().clear(); - for (NbtElement tagI : tag.getListOrEmpty("value")) { - StatusEffect effect = Registries.STATUS_EFFECT.get(Identifier.of(tagI.asString().orElse(""))); + for (Tag tagI : tag.getListOrEmpty("value")) { + MobEffect effect = BuiltInRegistries.MOB_EFFECT.getValue(Identifier.parse(tagI.asString().orElse(""))); if (effect != null) get().add(effect); } return get(); } - public static class Builder extends SettingBuilder, StatusEffectListSetting> { + public static class Builder extends SettingBuilder, StatusEffectListSetting> { public Builder() { super(new ArrayList<>(0)); } - public Builder defaultValue(StatusEffect... defaults) { + public Builder defaultValue(MobEffect... defaults) { return defaultValue(defaults != null ? Arrays.asList(defaults) : new ArrayList<>()); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java index 8b35872aae..35e6d5efba 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StorageBlockListSetting.java @@ -8,18 +8,19 @@ import com.mojang.serialization.Lifecycle; import it.unimi.dsi.fastutil.objects.ObjectIterators; import meteordevelopment.meteorclient.MeteorClient; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.SimpleRegistry; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.registry.entry.RegistryEntryList; -import net.minecraft.util.Identifier; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,10 +66,10 @@ protected List> parseImpl(String str) { try { for (String value : values) { - BlockEntityType block = parseId(Registries.BLOCK_ENTITY_TYPE, value); + BlockEntityType block = parseId(BuiltInRegistries.BLOCK_ENTITY_TYPE, value); if (block != null) blocks.add(block); } - } catch (Exception ignored) { + } catch (Exception _) { } return blocks; @@ -81,15 +82,15 @@ protected boolean isValueValid(List> value) { @Override public Iterable getIdentifierSuggestions() { - return Registries.BLOCK_ENTITY_TYPE.getIds(); + return BuiltInRegistries.BLOCK_ENTITY_TYPE.keySet(); } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (BlockEntityType type : get()) { - Identifier id = Registries.BLOCK_ENTITY_TYPE.getId(type); - if (id != null) valueTag.add(NbtString.of(id.toString())); + Identifier id = BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(type); + if (id != null) valueTag.add(StringTag.valueOf(id.toString())); } tag.put("value", valueTag); @@ -97,12 +98,12 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List> load(NbtCompound tag) { + public List> load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { - BlockEntityType type = Registries.BLOCK_ENTITY_TYPE.get(Identifier.of(tagI.asString().orElse(""))); + ListTag valueTag = tag.getListOrEmpty("value"); + for (Tag tagI : valueTag) { + BlockEntityType type = BuiltInRegistries.BLOCK_ENTITY_TYPE.getValue(Identifier.parse(tagI.asString().orElse(""))); if (type != null) get().add(type); } @@ -124,9 +125,9 @@ public StorageBlockListSetting build() { } } - private static class SRegistry extends SimpleRegistry> { + private static class SRegistry extends MappedRegistry> { public SRegistry() { - super(RegistryKey.ofRegistry(MeteorClient.identifier("storage-blocks")), Lifecycle.stable()); + super(ResourceKey.createRegistryKey(MeteorClient.identifier("storage-blocks")), Lifecycle.stable()); } @Override @@ -136,55 +137,55 @@ public int size() { @Nullable @Override - public Identifier getId(BlockEntityType entry) { + public Identifier getKey(BlockEntityType entry) { return null; } @Override - public Optional>> getKey(BlockEntityType entry) { + public Optional>> getResourceKey(BlockEntityType entry) { return Optional.empty(); } @Override - public int getRawId(@Nullable BlockEntityType entry) { + public int getId(@Nullable BlockEntityType entry) { return 0; } @Nullable @Override - public BlockEntityType get(@Nullable RegistryKey> key) { + public BlockEntityType getValue(@Nullable ResourceKey> key) { return null; } @Nullable @Override - public BlockEntityType get(@Nullable Identifier id) { + public BlockEntityType getValue(@Nullable Identifier id) { return null; } @Override - public Lifecycle getLifecycle() { + public Lifecycle registryLifecycle() { return null; } @Override - public Set getIds() { + public Set keySet() { return null; } @Override - public BlockEntityType getOrThrow(int index) { - return super.getOrThrow(index); + public BlockEntityType byIdOrThrow(int index) { + return super.byIdOrThrow(index); } @Override - public boolean containsId(Identifier id) { + public boolean containsKey(Identifier id) { return false; } @Nullable @Override - public BlockEntityType get(int index) { + public BlockEntityType byId(int index) { return null; } @@ -195,17 +196,17 @@ public Iterator> iterator() { } @Override - public boolean contains(RegistryKey> key) { + public boolean containsKey(ResourceKey> key) { return false; } @Override - public Set>, BlockEntityType>> getEntrySet() { + public Set>, BlockEntityType>> entrySet() { return null; } @Override - public Optional>> getRandom(net.minecraft.util.math.random.Random random) { + public Optional>> getRandom(RandomSource random) { return Optional.empty(); } @@ -215,32 +216,32 @@ public Registry> freeze() { } @Override - public RegistryEntry.Reference> createEntry(BlockEntityType value) { + public Holder.Reference> createIntrusiveHolder(BlockEntityType value) { return null; } @Override - public Optional>> getEntry(int rawId) { + public Optional>> get(int rawId) { return Optional.empty(); } @Override - public Optional>> getEntry(Identifier id) { + public Optional>> get(Identifier id) { return Optional.empty(); } @Override - public Stream>> streamEntries() { + public Stream>> listElements() { return null; } @Override - public Stream>> streamTags() { + public Stream>> getTags() { return null; } @Override - public Set>> getKeys() { + public Set>> registryKeySet() { return null; } } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java index d5f03502cb..2886b8938b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StringListSetting.java @@ -12,17 +12,17 @@ import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; -public class StringListSetting extends Setting>{ +public class StringListSetting extends Setting> { public final Class renderer; public final CharFilter filter; @@ -44,10 +44,10 @@ protected boolean isValueValid(List value) { } @Override - public NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + public CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (int i = 0; i < this.value.size(); i++) { - valueTag.add(i, NbtString.of(get().get(i))); + valueTag.add(i, StringTag.valueOf(get().get(i))); } tag.put("value", valueTag); @@ -55,11 +55,11 @@ public NbtCompound save(NbtCompound tag) { } @Override - public List load(NbtCompound tag) { + public List load(CompoundTag tag) { get().clear(); - NbtList valueTag = tag.getListOrEmpty("value"); - for (NbtElement tagI : valueTag) { + ListTag valueTag = tag.getListOrEmpty("value"); + for (Tag tagI : valueTag) { get().add(tagI.asString().orElse("")); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java index e1d1777427..e6cae286d6 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/StringSetting.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.gui.utils.CharFilter; import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import java.util.function.Consumer; @@ -37,15 +37,15 @@ protected boolean isValueValid(String value) { } @Override - public NbtCompound save(NbtCompound tag) { + public CompoundTag save(CompoundTag tag) { tag.putString("value", get()); return tag; } @Override - public String load(NbtCompound tag) { - set(tag.getString("value", "")); + public String load(CompoundTag tag) { + set(tag.getStringOr("value", "")); return get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/settings/Vector3dSetting.java b/src/main/java/meteordevelopment/meteorclient/settings/Vector3dSetting.java index 4acb02c795..6b494fd25b 100644 --- a/src/main/java/meteordevelopment/meteorclient/settings/Vector3dSetting.java +++ b/src/main/java/meteordevelopment/meteorclient/settings/Vector3dSetting.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.settings; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import org.joml.Vector3d; import java.util.function.Consumer; @@ -45,7 +45,7 @@ protected Vector3d parseImpl(String str) { try { String[] strs = str.split(" "); return new Vector3d(Double.parseDouble(strs[0]), Double.parseDouble(strs[1]), Double.parseDouble(strs[2])); - } catch (IndexOutOfBoundsException | NumberFormatException ignored) { + } catch (IndexOutOfBoundsException | NumberFormatException _) { return null; } } @@ -56,8 +56,8 @@ protected boolean isValueValid(Vector3d value) { } @Override - protected NbtCompound save(NbtCompound tag) { - NbtCompound valueTag = new NbtCompound(); + protected CompoundTag save(CompoundTag tag) { + CompoundTag valueTag = new CompoundTag(); valueTag.putDouble("x", get().x); valueTag.putDouble("y", get().y); valueTag.putDouble("z", get().z); @@ -68,12 +68,12 @@ protected NbtCompound save(NbtCompound tag) { } @Override - protected Vector3d load(NbtCompound tag) { + protected Vector3d load(CompoundTag tag) { if (tag.getCompound("value").isEmpty()) return get(); - NbtCompound valueTag = tag.getCompound("value").get(); + CompoundTag valueTag = tag.getCompound("value").get(); - set(valueTag.getDouble("x", 0.0), valueTag.getDouble("y", 0.0), valueTag.getDouble("z", 0.0)); + set(valueTag.getDoubleOr("x", 0.0), valueTag.getDoubleOr("y", 0.0), valueTag.getDoubleOr("z", 0.0)); return get(); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/System.java b/src/main/java/meteordevelopment/meteorclient/systems/System.java index bdfd86255c..24c350c335 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/System.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/System.java @@ -8,9 +8,9 @@ import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.files.StreamUtils; import meteordevelopment.meteorclient.utils.misc.ISerializable; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.ReportedException; +import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; -import net.minecraft.util.crash.CrashException; import org.apache.commons.io.FilenameUtils; import java.io.File; @@ -38,13 +38,14 @@ public System(String name) { } } - public void init() {} + public void init() { + } public void save(File folder) { File file = getFile(); if (file == null) return; - NbtCompound tag = toTag(); + CompoundTag tag = toTag(); if (tag == null) return; try { @@ -57,7 +58,7 @@ public void save(File folder) { try { Files.move(tempFile.toPath(), file.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); - } catch (AtomicMoveNotSupportedException e) { + } catch (AtomicMoveNotSupportedException _) { StreamUtils.copy(tempFile, file); } @@ -81,13 +82,13 @@ public void load(File folder) { if (file.exists()) { try { fromTag(NbtIo.read(file.toPath())); - } catch (CrashException e) { + } catch (ReportedException e) { String backupName = FilenameUtils.removeExtension(file.getName()) + "-" + ZonedDateTime.now().format(DATE_TIME_FORMATTER) + ".backup.nbt"; File backup = new File(file.getParentFile(), backupName); try { Files.move(file.toPath(), backup.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); - } catch (AtomicMoveNotSupportedException ex) { + } catch (AtomicMoveNotSupportedException _) { StreamUtils.copy(file, backup); } @@ -113,12 +114,12 @@ public String getName() { } @Override - public NbtCompound toTag() { + public CompoundTag toTag() { return null; } @Override - public T fromTag(NbtCompound tag) { + public T fromTag(CompoundTag tag) { return null; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java index 30c4734ce9..6ccd49a0ff 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Account.java @@ -9,20 +9,20 @@ import com.mojang.authlib.yggdrasil.ServicesKeyType; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import meteordevelopment.meteorclient.mixin.FileCacheAccessor; -import meteordevelopment.meteorclient.mixin.MinecraftClientAccessor; -import meteordevelopment.meteorclient.mixin.PlayerSkinProviderAccessor; +import meteordevelopment.meteorclient.mixin.MinecraftAccessor; +import meteordevelopment.meteorclient.mixin.SkinManagerAccessor; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.NbtException; -import net.minecraft.client.network.SocialInteractionsManager; -import net.minecraft.client.session.ProfileKeys; -import net.minecraft.client.session.Session; -import net.minecraft.client.session.report.AbuseReportContext; -import net.minecraft.client.session.report.ReporterEnvironment; -import net.minecraft.client.texture.PlayerSkinProvider; -import net.minecraft.client.texture.PlayerSkinTextureDownloader; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.encryption.SignatureVerifier; -import net.minecraft.util.ApiServices; +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.ReportEnvironment; +import net.minecraft.client.multiplayer.chat.report.ReportingContext; +import net.minecraft.client.renderer.texture.SkinTextureDownloader; +import net.minecraft.client.resources.SkinManager; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.Services; +import net.minecraft.util.SignatureValidator; import net.minecraft.util.Util; import java.nio.file.Path; @@ -45,7 +45,7 @@ protected Account(AccountType type, String name) { public abstract boolean fetchInfo(); public boolean login() { - YggdrasilAuthenticationService authenticationService = new YggdrasilAuthenticationService(mc.getNetworkProxy()); + YggdrasilAuthenticationService authenticationService = new YggdrasilAuthenticationService(mc.getProxy()); applyLoginEnvironment(authenticationService); return true; @@ -64,32 +64,32 @@ public AccountCache getCache() { return cache; } - public static void setSession(Session session) { - MinecraftClientAccessor mca = (MinecraftClientAccessor) mc; - mca.meteor$setSession(session); + public static void setSession(User session) { + MinecraftAccessor mca = (MinecraftAccessor) mc; + mca.meteor$setUser(session); - YggdrasilAuthenticationService yggdrasilAuthenticationService = new YggdrasilAuthenticationService(mc.getNetworkProxy()); + YggdrasilAuthenticationService yggdrasilAuthenticationService = new YggdrasilAuthenticationService(mc.getProxy()); UserApiService apiService = yggdrasilAuthenticationService.createUserApiService(session.getAccessToken()); mca.meteor$setUserApiService(apiService); - mca.meteor$setSocialInteractionsManager(new SocialInteractionsManager(mc, apiService)); - mca.meteor$setProfileKeys(ProfileKeys.create(apiService, session, mc.runDirectory.toPath())); - mca.meteor$setAbuseReportContext(AbuseReportContext.create(ReporterEnvironment.ofIntegratedServer(), apiService)); - mca.meteor$setGameProfileFuture(CompletableFuture.supplyAsync(() -> mc.getApiServices().sessionService().fetchProfile(mc.getSession().getUuidOrNull(), true), Util.getIoWorkerExecutor())); + mca.meteor$setPlayerSocialManager(new PlayerSocialManager(mc, apiService)); + mca.meteor$setProfileKeyPairManager(ProfileKeyPairManager.create(apiService, session, mc.gameDirectory.toPath())); + mca.meteor$setReportingContext(ReportingContext.create(ReportEnvironment.local(), apiService)); + mca.meteor$setProfileFuture(CompletableFuture.supplyAsync(() -> mc.services().sessionService().fetchProfile(mc.getUser().getProfileId(), true), Util.ioPool())); } public static void applyLoginEnvironment(YggdrasilAuthenticationService authService) { - MinecraftClientAccessor mca = (MinecraftClientAccessor) mc; - SignatureVerifier.create(authService.getServicesKeySet(), ServicesKeyType.PROFILE_KEY); - PlayerSkinProvider.FileCache skinCache = ((PlayerSkinProviderAccessor) mc.getSkinProvider()).meteor$getSkinCache(); - Path skinCachePath = ((FileCacheAccessor) skinCache).meteor$getDirectory(); - mca.meteor$setApiServices(ApiServices.create(authService, mc.runDirectory)); - mca.meteor$setSkinProvider(new PlayerSkinProvider(skinCachePath, mc.getApiServices(), new PlayerSkinTextureDownloader(mc.getNetworkProxy(), mc.getTextureManager(), mc), mc)); + MinecraftAccessor mca = (MinecraftAccessor) mc; + SignatureValidator.from(authService.getServicesKeySet(), ServicesKeyType.PROFILE_KEY); + SkinManager.TextureCache skinCache = ((SkinManagerAccessor) mc.getSkinManager()).meteor$getSkinTextures(); + Path skinCachePath = ((FileCacheAccessor) skinCache).meteor$getRoot(); + mca.meteor$setServices(Services.create(authService, mc.gameDirectory)); + mca.meteor$setSkinManager(new SkinManager(skinCachePath, mc.services(), new SkinTextureDownloader(mc.getProxy(), mc.getTextureManager(), mc), mc)); } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("type", type.name()); tag.putString("name", name); @@ -100,7 +100,7 @@ public NbtCompound toTag() { @SuppressWarnings("unchecked") @Override - public T fromTag(NbtCompound tag) { + public T fromTag(CompoundTag tag) { if (tag.getString("name").isEmpty() || tag.getCompound("cache").isEmpty()) throw new NbtException(); name = tag.getString("name").get(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java index 66deaecd0f..8b98a390f6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountCache.java @@ -6,12 +6,12 @@ package meteordevelopment.meteorclient.systems.accounts; import com.mojang.util.UndashedUuid; -import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.misc.NbtException; +import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import meteordevelopment.meteorclient.utils.render.PlayerHeadTexture; import meteordevelopment.meteorclient.utils.render.PlayerHeadUtils; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -51,8 +51,8 @@ public void loadHead(Runnable callback) { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("username", username); tag.putString("uuid", uuid); @@ -61,7 +61,7 @@ public NbtCompound toTag() { } @Override - public AccountCache fromTag(NbtCompound tag) { + public AccountCache fromTag(CompoundTag tag) { if (tag.getString("username").isEmpty() || tag.getString("uuid").isEmpty()) throw new NbtException(); username = tag.getString("username").get(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java index eebb847db8..900bb90f0b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java @@ -14,7 +14,7 @@ import meteordevelopment.meteorclient.utils.misc.NbtException; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -57,8 +57,8 @@ public int size() { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.put("accounts", NbtUtils.listToTag(accounts)); @@ -66,19 +66,19 @@ public NbtCompound toTag() { } @Override - public Accounts fromTag(NbtCompound tag) { + public Accounts fromTag(CompoundTag tag) { MeteorExecutor.execute(() -> accounts = NbtUtils.listFromTag(tag.getListOrEmpty("accounts"), tag1 -> { - NbtCompound t = (NbtCompound) tag1; + CompoundTag t = (CompoundTag) tag1; if (!t.contains("type")) return null; - AccountType type = AccountType.valueOf(t.getString("type", "")); + AccountType type = AccountType.valueOf(t.getStringOr("type", "")); try { return switch (type) { - case Cracked -> new CrackedAccount(null).fromTag(t); - case Microsoft -> new MicrosoftAccount(null).fromTag(t); + case Cracked -> new CrackedAccount(null).fromTag(t); + case Microsoft -> new MicrosoftAccount(null).fromTag(t); case TheAltening -> new TheAlteningAccount(null).fromTag(t); - case Session -> new SessionAccount(null).fromTag(t); + case Session -> new SessionAccount(null).fromTag(t); }; } catch (NbtException e) { return null; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java index 364ff246cb..9c4780fc68 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/MicrosoftLogin.java @@ -9,7 +9,7 @@ import com.sun.net.httpserver.HttpServer; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.network.Http; -import net.minecraft.util.Pair; +import net.minecraft.util.Tuple; import net.minecraft.util.Util; import java.io.IOException; @@ -32,7 +32,8 @@ public static class LoginData { public String newRefreshToken; public String uuid, username; - public LoginData() {} + public LoginData() { + } public LoginData(String mcToken, String newRefreshToken, String uuid, String username) { this.mcToken = mcToken; @@ -57,7 +58,7 @@ public static String getRefreshToken(Consumer callback) { startServer(); String url = "https://login.live.com/oauth20_authorize.srf?client_id=" + CLIENT_ID + "&response_type=code&redirect_uri=http://127.0.0.1:" + PORT + "&scope=XboxLive.signin%20offline_access&prompt=select_account"; - Util.getOperatingSystem().open(url); + Util.getPlatform().openUri(url); return url; } @@ -138,12 +139,12 @@ public static void stopServer() { private static void handleRequest(HttpExchange req) throws IOException { if (req.getRequestMethod().equals("GET")) { // Login - List> query = parseURL(req.getRequestURI().getRawQuery()); + List> query = parseURL(req.getRequestURI().getRawQuery()); boolean ok = false; - for (Pair pair : query) { - if (pair.getLeft().equals("code")) { - handleCode(pair.getRight()); + for (Tuple pair : query) { + if (pair.getA().equals("code")) { + handleCode(pair.getB()); ok = true; break; @@ -154,8 +155,7 @@ private static void handleRequest(HttpExchange req) throws IOException { if (!ok) { writeText(req, "Cannot authenticate."); callback.accept(null); - } - else writeText(req, "You may now close this page."); + } else writeText(req, "You may now close this page."); } stopServer(); @@ -179,8 +179,8 @@ private static void writeText(HttpExchange req, String text) throws IOException } // reimplementation of apache https URLEncodedUtils#parse - private static List> parseURL(String string) { - List> query = new ArrayList<>(); + private static List> parseURL(String string) { + List> query = new ArrayList<>(); char[] buf = string.toCharArray(); int i = 0; while (i < buf.length) { @@ -207,7 +207,7 @@ private static List> parseURL(String string) { } if (!name.isEmpty()) { - query.add(new Pair<>(urlDecode(name.toString()), urlDecode(value.toString()))); + query.add(new Tuple<>(urlDecode(name.toString()), urlDecode(value.toString()))); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/CrackedAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/CrackedAccount.java index cb810bb8f4..8ba6c155d5 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/CrackedAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/CrackedAccount.java @@ -7,8 +7,8 @@ import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; -import net.minecraft.client.session.Session; -import net.minecraft.util.Uuids; +import net.minecraft.client.User; +import net.minecraft.core.UUIDUtil; import java.util.Optional; @@ -27,7 +27,7 @@ public boolean fetchInfo() { public boolean login() { super.login(); - setSession(new Session(name, Uuids.getOfflinePlayerUuid(name), "", Optional.empty(), Optional.empty())); + setSession(new User(name, UUIDUtil.createOfflinePlayerUUID(name), "", Optional.empty(), Optional.empty())); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/MicrosoftAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/MicrosoftAccount.java index 4f6a308a43..e5d32670ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/MicrosoftAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/MicrosoftAccount.java @@ -9,13 +9,14 @@ import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; import meteordevelopment.meteorclient.systems.accounts.MicrosoftLogin; -import net.minecraft.client.session.Session; +import net.minecraft.client.User; import org.jetbrains.annotations.Nullable; import java.util.Optional; public class MicrosoftAccount extends Account { private @Nullable String token; + public MicrosoftAccount(String refreshToken) { super(AccountType.Microsoft, refreshToken); } @@ -32,7 +33,7 @@ public boolean login() { super.login(); - setSession(new Session(cache.username, UndashedUuid.fromStringLenient(cache.uuid), token, Optional.empty(), Optional.empty())); + setSession(new User(cache.username, UndashedUuid.fromStringLenient(cache.uuid), token, Optional.empty(), Optional.empty())); return true; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/SessionAccount.java b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/SessionAccount.java index e5917c7ce6..086087d651 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/SessionAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/SessionAccount.java @@ -11,8 +11,8 @@ import meteordevelopment.meteorclient.systems.accounts.AccountType; import meteordevelopment.meteorclient.systems.accounts.TokenAccount; import meteordevelopment.meteorclient.utils.network.Http; -import net.minecraft.client.session.Session; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.client.User; +import net.minecraft.nbt.CompoundTag; import java.util.Optional; @@ -25,16 +25,16 @@ public SessionAccount(String label) { } @Override - public SessionAccount fromTag(NbtCompound tag) { + public SessionAccount fromTag(CompoundTag tag) { super.fromTag(tag); - accessToken = tag.getString("token", ""); + accessToken = tag.getStringOr("token", ""); return this; } @Override - public NbtCompound toTag() { - NbtCompound tag = super.toTag(); + public CompoundTag toTag() { + CompoundTag tag = super.toTag(); tag.putString("token", accessToken); return tag; } @@ -67,7 +67,7 @@ public boolean login() { super.login(); - setSession(new Session(cache.username, UndashedUuid.fromStringLenient(cache.uuid), accessToken, Optional.empty(), Optional.empty())); + setSession(new User(cache.username, UndashedUuid.fromStringLenient(cache.uuid), accessToken, Optional.empty(), Optional.empty())); return true; } 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 663f63ff15..767745e162 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/accounts/types/TheAlteningAccount.java @@ -7,15 +7,15 @@ import com.mojang.authlib.Environment; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; -import de.florianmichael.waybackauthlib.InvalidCredentialsException; -import de.florianmichael.waybackauthlib.WaybackAuthLib; +import de.florianreuth.waybackauthlib.InvalidCredentialsException; +import de.florianreuth.waybackauthlib.WaybackAuthLib; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.accounts.Account; import meteordevelopment.meteorclient.systems.accounts.AccountType; import meteordevelopment.meteorclient.systems.accounts.TokenAccount; import meteordevelopment.meteorclient.utils.misc.NbtException; -import net.minecraft.client.session.Session; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.client.User; +import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.Nullable; import java.util.Optional; @@ -24,7 +24,7 @@ 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.getNetworkProxy(), ENVIRONMENT); + private static final YggdrasilAuthenticationService SERVICE = new YggdrasilAuthenticationService(mc.getProxy(), ENVIRONMENT); private String token; private @Nullable WaybackAuthLib auth; @@ -60,7 +60,7 @@ public boolean login() { applyLoginEnvironment(SERVICE); try { - setSession(new Session(auth.getCurrentProfile().name(), auth.getCurrentProfile().id(), auth.getAccessToken(), Optional.empty(), Optional.empty())); + setSession(new User(auth.getCurrentProfile().name(), auth.getCurrentProfile().id(), auth.getAccessToken(), Optional.empty(), Optional.empty())); return true; } catch (Exception e) { MeteorClient.LOG.error("Failed to login with TheAltening."); @@ -83,8 +83,8 @@ public String getToken() { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("type", type.name()); tag.putString("name", name); @@ -95,8 +95,9 @@ public NbtCompound toTag() { } @Override - public TheAlteningAccount fromTag(NbtCompound tag) { - if (tag.getString("name").isEmpty() || tag.getCompound("cache").isEmpty() || tag.getString("token").isEmpty()) throw new NbtException(); + public TheAlteningAccount fromTag(CompoundTag tag) { + if (tag.getString("name").isEmpty() || tag.getCompound("cache").isEmpty() || tag.getString("token").isEmpty()) + throw new NbtException(); name = tag.getString("name").get(); token = tag.getString("token").get(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java index f8deb6eff2..1686f82b31 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/config/Config.java @@ -13,10 +13,10 @@ import meteordevelopment.meteorclient.systems.Systems; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; import java.util.ArrayList; import java.util.List; @@ -75,8 +75,8 @@ public class Config extends System { .name("custom-window-title") .description("Show custom text in the window title.") .defaultValue(false) - .onModuleActivated(setting -> mc.updateWindowTitle()) - .onChanged(value -> mc.updateWindowTitle()) + .onModuleActivated(setting -> mc.updateTitle()) + .onChanged(value -> mc.updateTitle()) .build() ); @@ -85,7 +85,7 @@ public class Config extends System { .description("The text it displays in the window title.") .visible(customWindowTitle::get) .defaultValue("Minecraft {mc_version} - {meteor.name} {meteor.version}") - .onChanged(value -> mc.updateWindowTitle()) + .onChanged(value -> mc.updateTitle()) .build() ); @@ -177,8 +177,8 @@ public static Config get() { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("version", MeteorClient.VERSION.toString()); tag.put("settings", settings.toTag()); @@ -188,22 +188,22 @@ public NbtCompound toTag() { } @Override - public Config fromTag(NbtCompound tag) { + public Config fromTag(CompoundTag tag) { if (tag.contains("settings")) settings.fromTag(tag.getCompoundOrEmpty("settings")); if (tag.contains("dontShowAgainPrompts")) dontShowAgainPrompts = listFromTag(tag, "dontShowAgainPrompts"); return this; } - private NbtList listToTag(List list) { - NbtList nbt = new NbtList(); - for (String item : list) nbt.add(NbtString.of(item)); + private ListTag listToTag(List list) { + ListTag nbt = new ListTag(); + for (String item : list) nbt.add(StringTag.valueOf(item)); return nbt; } - private List listFromTag(NbtCompound tag, String key) { + private List listFromTag(CompoundTag tag, String key) { List list = new ArrayList<>(); - for (NbtElement item : tag.getListOrEmpty(key)) list.add(item.asString().orElse("")); + for (Tag item : tag.getListOrEmpty(key)) list.add(item.asString().orElse("")); return list; } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java index 12dea12812..38ccc6b305 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java @@ -12,8 +12,8 @@ import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.render.PlayerHeadTexture; import meteordevelopment.meteorclient.utils.render.PlayerHeadUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -35,9 +35,10 @@ public Friend(String name, @Nullable UUID id) { this.headTexture = null; } - public Friend(PlayerEntity player) { - this(player.getName().getString(), player.getUuid()); + public Friend(Player player) { + this(player.getName().getString(), player.getUUID()); } + public Friend(String name) { this(name, null); } @@ -90,8 +91,8 @@ public boolean headTextureNeedsUpdate() { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("name", name); if (id != null) tag.putString("id", UndashedUuid.toString(id)); @@ -100,7 +101,7 @@ public NbtCompound toTag() { } @Override - public Friend fromTag(NbtCompound tag) { + public Friend fromTag(CompoundTag tag) { return this; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java index 36f363ab70..bd5dc66122 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friends.java @@ -10,10 +10,10 @@ import meteordevelopment.meteorclient.systems.Systems; import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.network.MeteorExecutor; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -61,23 +61,23 @@ public Friend get(String name) { return null; } - public Friend get(PlayerEntity player) { + public Friend get(Player player) { return get(player.getName().getString()); } - public Friend get(PlayerListEntry player) { + public Friend get(PlayerInfo player) { return get(player.getProfile().name()); } - public boolean isFriend(PlayerEntity player) { + public boolean isFriend(Player player) { return player != null && get(player) != null; } - public boolean isFriend(PlayerListEntry player) { + public boolean isFriend(PlayerInfo player) { return get(player) != null; } - public boolean shouldAttack(PlayerEntity player) { + public boolean shouldAttack(Player player) { return !isFriend(player); } @@ -95,8 +95,8 @@ public boolean isEmpty() { } @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.put("friends", NbtUtils.listToTag(friends)); @@ -104,17 +104,17 @@ public NbtCompound toTag() { } @Override - public Friends fromTag(NbtCompound tag) { + public Friends fromTag(CompoundTag tag) { friends.clear(); - for (NbtElement itemTag : tag.getListOrEmpty("friends")) { - NbtCompound friendTag = (NbtCompound) itemTag; + for (Tag itemTag : tag.getListOrEmpty("friends")) { + CompoundTag friendTag = (CompoundTag) itemTag; if (!friendTag.contains("name")) continue; - String name = friendTag.getString("name", ""); + String name = friendTag.getStringOr("name", ""); if (get(name) != null) continue; - String uuid = friendTag.getString("id", ""); + String uuid = friendTag.getStringOr("id", ""); Friend friend = !uuid.isBlank() ? new Friend(name, UndashedUuid.fromStringLenient(uuid)) : new Friend(name); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java index c55e943fe2..f4c3b4b5fa 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/Hud.java @@ -20,8 +20,8 @@ import meteordevelopment.meteorclient.utils.misc.NbtUtils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -231,9 +231,9 @@ private void onRender(Render2DEvent event) { if (Utils.isLoading()) return; if (!active || shouldHideHud()) return; - if ((mc.options.hudHidden || mc.debugHudEntryList.isF3Enabled()) && !HudEditorScreen.isOpen()) return; + if ((mc.options.hideGui || mc.debugEntries.isOverlayVisible()) && !HudEditorScreen.isOpen()) return; - HudRenderer.INSTANCE.begin(event.drawContext); + HudRenderer.INSTANCE.begin(event.graphics); for (HudElement element : elements) { element.updatePos(); @@ -247,7 +247,7 @@ private void onRender(Render2DEvent event) { } private boolean shouldHideHud() { - return hideInMenus.get() && mc.currentScreen != null && !(mc.currentScreen instanceof WidgetScreen); + return hideInMenus.get() && mc.screen != null && !(mc.screen instanceof WidgetScreen); } @EventHandler @@ -274,8 +274,8 @@ public Iterator iterator() { // Serialization @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putInt("__version__", 1); @@ -287,7 +287,7 @@ public NbtCompound toTag() { } @Override - public Hud fromTag(NbtCompound tag) { + public Hud fromTag(CompoundTag tag) { if (!tag.contains("__version__")) { resetToDefaultElements(); return this; @@ -299,8 +299,8 @@ public Hud fromTag(NbtCompound tag) { // Elements elements.clear(); - for (NbtElement e : tag.getListOrEmpty("elements")) { - NbtCompound c = (NbtCompound) e; + for (Tag e : tag.getListOrEmpty("elements")) { + CompoundTag c = (CompoundTag) e; if (c.getString("name").isEmpty()) continue; HudElementInfo info = infos.get(c.getString("name").get()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudBox.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudBox.java index f91e9f6d89..5e837f4535 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudBox.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudBox.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.ISerializable; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; public class HudBox implements ISerializable { private final HudElement element; @@ -137,8 +137,8 @@ public double alignX(double selfWidth, double width, Alignment alignment) { // Serialization @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("x-anchor", xAnchor.name()); tag.putString("y-anchor", yAnchor.name()); @@ -149,7 +149,7 @@ public NbtCompound toTag() { } @Override - public HudBox fromTag(NbtCompound tag) { + public HudBox fromTag(CompoundTag tag) { if (tag.getString("x-anchor").isPresent()) xAnchor = XAnchor.valueOf(tag.getString("x-anchor").get()); if (tag.getString("y-anchor").isPresent()) yAnchor = YAnchor.valueOf(tag.getString("y-anchor").get()); if (tag.getInt("x").isPresent()) x = tag.getInt("x").get(); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java index 1868e9c1d2..c51a46b83a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudElement.java @@ -12,7 +12,7 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.misc.ISerializable; import meteordevelopment.meteorclient.utils.other.Snapper; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.CompoundTag; public abstract class HudElement implements Snapper.Element, ISerializable { public final HudElementInfo info; @@ -48,8 +48,7 @@ public void setPos(int x, int y) { box.xAnchor = XAnchor.Left; box.yAnchor = YAnchor.Top; box.updateAnchors(); - } - else { + } else { box.setPos(box.x + (x - this.x), box.y + (y - this.y)); } @@ -99,11 +98,14 @@ public void remove() { Hud.get().remove(this); } - public void tick(HudRenderer renderer) {} + public void tick(HudRenderer renderer) { + } - public void render(HudRenderer renderer) {} + public void render(HudRenderer renderer) { + } - public void onFontChanged() {} + public void onFontChanged() { + } public WWidget getWidget(GuiTheme theme) { return null; @@ -112,8 +114,8 @@ public WWidget getWidget(GuiTheme theme) { // Serialization @Override - public NbtCompound toTag() { - NbtCompound tag = new NbtCompound(); + public CompoundTag toTag() { + CompoundTag tag = new CompoundTag(); tag.putString("name", info.name); tag.putBoolean("active", active); @@ -127,7 +129,7 @@ public NbtCompound toTag() { } @Override - public HudElement fromTag(NbtCompound tag) { + public HudElement fromTag(CompoundTag tag) { settings.reset(); tag.getBoolean("active").ifPresent(active1 -> active = active1); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java index ec8ea8a48d..4f13c5bcba 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/HudRenderer.java @@ -12,7 +12,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.events.meteor.CustomFontChangedEvent; -import meteordevelopment.meteorclient.mixininterface.IGameRenderer; import meteordevelopment.meteorclient.renderer.*; import meteordevelopment.meteorclient.renderer.text.CustomTextRenderer; import meteordevelopment.meteorclient.renderer.text.Font; @@ -21,11 +20,11 @@ import meteordevelopment.meteorclient.utils.render.RenderUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.orbit.EventHandler; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.entity.state.LivingEntityRenderState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -56,20 +55,20 @@ public class HudRenderer { }) .build(CacheLoader.from(HudRenderer::loadFont)); - public DrawContext drawContext; + public GuiGraphicsExtractor graphics; public double delta; private HudRenderer() { MeteorClient.EVENT_BUS.subscribe(this); } - public void begin(DrawContext drawContext) { + public void begin(GuiGraphicsExtractor graphics) { Renderer2D.COLOR.begin(); - this.drawContext = drawContext; + this.graphics = graphics; this.delta = Utils.frameTime; - drawContext.createNewRootLayer(); + graphics.nextStratum(); if (!hud.hasCustomFont()) { VanillaTextRenderer.INSTANCE.scaleIndividually = true; @@ -87,21 +86,19 @@ public void end() { if (fontHolder.visited) { MeshRenderer.begin() - .attachments(mc.getFramebuffer()) + .attachments(mc.getMainRenderTarget()) .pipeline(MeteorRenderPipelines.UI_TEXT) .mesh(fontHolder.getMesh()) - .sampler("u_Texture", fontHolder.font.texture.getGlTextureView(), fontHolder.font.texture.getSampler()) + .sampler("u_Texture", fontHolder.font.texture.getTextureView(), fontHolder.font.texture.getSampler()) .end(); - } - else { + } else { it.remove(); fontCache.put(fontHolder.font.getHeight(), fontHolder); } fontHolder.visited = false; } - } - else { + } else { VanillaTextRenderer.INSTANCE.end(); VanillaTextRenderer.INSTANCE.scaleIndividually = false; } @@ -109,9 +106,9 @@ public void end() { for (Runnable task : postTasks) task.run(); postTasks.clear(); - drawContext.createNewRootLayer(); + graphics.nextStratum(); - drawContext = null; + graphics = null; } public void line(double x1, double y1, double x2, double y2, Color color) { @@ -133,7 +130,7 @@ public void triangle(double x1, double y1, double x2, double y2, double x3, doub public void texture(Identifier id, double x, double y, double width, double height, Color color) { Renderer2D.TEXTURE.begin(); Renderer2D.TEXTURE.texQuad(x, y, width, height, color); - Renderer2D.TEXTURE.render(mc.getTextureManager().getTexture(id).getGlTextureView(), mc.getTextureManager().getTexture(id).getSampler()); + Renderer2D.TEXTURE.render(mc.getTextureManager().getTexture(id).getTextureView(), mc.getTextureManager().getTexture(id).getSampler()); } public double text(String text, double x, double y, Color color, boolean shadow, double scale) { @@ -159,13 +156,13 @@ public double text(String text, double x, double y, Color color, boolean shadow, font.render(mesh, text, x, y, color, scale); CustomTextRenderer.SHADOW_COLOR.a = preShadowA; - } - else { + } else { width = font.render(mesh, text, x, y, color, scale); } return width; } + public double text(String text, double x, double y, Color color, boolean shadow) { return text(text, x, y, color, shadow, -1); } @@ -181,12 +178,15 @@ public double textWidth(String text, boolean shadow, double scale) { VanillaTextRenderer.INSTANCE.scale = (scale == -1 ? hud.getTextScale() : scale) * 2; return VanillaTextRenderer.INSTANCE.getWidth(text, shadow); } + public double textWidth(String text, boolean shadow) { return textWidth(text, shadow, -1); } + public double textWidth(String text, double scale) { return textWidth(text, false, scale); } + public double textWidth(String text) { return textWidth(text, false, -1); } @@ -200,9 +200,11 @@ public double textHeight(boolean shadow, double scale) { VanillaTextRenderer.INSTANCE.scale = (scale == -1 ? hud.getTextScale() : scale) * 2; return VanillaTextRenderer.INSTANCE.getHeight(shadow); } + public double textHeight(boolean shadow) { return textHeight(shadow, -1); } + public double textHeight() { return textHeight(false, -1); } @@ -212,37 +214,37 @@ public void post(Runnable task) { } public void item(ItemStack itemStack, int x, int y, float scale, boolean overlay, String countOverlay) { - RenderUtils.drawItem(drawContext, itemStack, x, y, scale, overlay, countOverlay, true); + RenderUtils.drawItem(graphics, itemStack, x, y, scale, overlay, countOverlay, true); } public void item(ItemStack itemStack, int x, int y, float scale, boolean overlay) { - RenderUtils.drawItem(drawContext, itemStack, x, y, scale, overlay); + RenderUtils.drawItem(graphics, itemStack, x, y, scale, overlay); } - public void entity(LivingEntity entity, int x, int y, int width, int height, float yaw, float pitch) { - float previousBodyYaw = entity.bodyYaw; - float previousYaw = entity.getYaw(); - float previousPitch = entity.getPitch(); - float lastLastHeadYaw = entity.lastHeadYaw; - float lastHeadYaw = entity.headYaw; + public void entity(LivingEntity entity, int x, int y, int width, int height, float yaw, float pitch) { + float previousBodyYaw = entity.yBodyRot; + float previousYaw = entity.getYRot(); + float previousPitch = entity.getXRot(); + float lastLastHeadYaw = entity.yHeadRotO; + float lastHeadYaw = entity.yHeadRot; float tanYaw = (float) Math.atan((yaw) / 40.0f); float tanPitch = (float) Math.atan((pitch) / 40.0f); - entity.bodyYaw = 180.0f + tanYaw * 20.0f; - entity.setYaw(180.0f + tanYaw * 40.0f); - entity.setPitch(-tanPitch * 20.0f); - entity.headYaw = entity.getYaw(); - entity.lastHeadYaw = entity.getYaw(); + entity.yBodyRot = 180.0f + tanYaw * 20.0f; + entity.setYRot(180.0f + tanYaw * 40.0f); + entity.setXRot(-tanPitch * 20.0f); + entity.yHeadRot = entity.getYRot(); + entity.yHeadRotO = entity.getYRot(); - var state = (LivingEntityRenderState) mc.getEntityRenderDispatcher().getRenderer(entity).getAndUpdateRenderState(entity, 1); + var state = (LivingEntityRenderState) mc.getEntityRenderDispatcher().getRenderer(entity).createRenderState(entity, 1); - entity.bodyYaw = previousBodyYaw; - entity.setYaw(previousYaw); - entity.setPitch(previousPitch); - entity.lastHeadYaw = lastLastHeadYaw; - entity.headYaw = lastHeadYaw; + entity.yBodyRot = previousBodyYaw; + entity.setYRot(previousYaw); + entity.setXRot(previousPitch); + entity.yHeadRot = lastLastHeadYaw; + entity.yHeadRotO = lastHeadYaw; - float s = 1.0f / mc.getWindow().getScaleFactor(); + float s = 1.0f / mc.getWindow().getGuiScale(); int x1 = (int) (x * s); int y1 = (int) (y * s); int x2 = (int) ((x + width) * s); @@ -252,7 +254,7 @@ public void entity(LivingEntity entity, int x, int y, int width, int height, fl Vector3f translation = new Vector3f(0, 1f, 0); Quaternionf rotation = new Quaternionf().rotateZ((float) Math.PI); - drawContext.addEntity(state, scale, translation, rotation, null, x1, y1, x2, y2); + graphics.entity(state, scale, translation, rotation, null, x1, y1, x2, y2); } private FontHolder getFontHolder(double scale, boolean render) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java index a3bd7f6f01..6fb4e0b87c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ArmorHud.java @@ -12,9 +12,9 @@ import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -162,12 +162,13 @@ public void render(HudRenderer renderer) { armorY = y; } - renderer.item(itemStack, (int) armorX, (int) armorY, getScale(), (itemStack.isDamageable() && durability.get() == Durability.Bar)); + renderer.item(itemStack, (int) armorX, (int) armorY, getScale(), (itemStack.isDamageableItem() && durability.get() == Durability.Bar)); - if (itemStack.isDamageable() && durability.get() != Durability.Bar && durability.get() != Durability.None) { + if (itemStack.isDamageableItem() && durability.get() != Durability.Bar && durability.get() != Durability.None) { String message = switch (durability.get()) { - case Total -> Integer.toString(itemStack.getMaxDamage() - itemStack.getDamage()); - case Percentage -> Integer.toString(Math.round(((itemStack.getMaxDamage() - itemStack.getDamage()) * 100f) / (float) itemStack.getMaxDamage())); + case Total -> Integer.toString(itemStack.getMaxDamage() - itemStack.getDamageValue()); + case Percentage -> + Integer.toString(Math.round(((itemStack.getMaxDamage() - itemStack.getDamageValue()) * 100f) / (float) itemStack.getMaxDamage())); default -> "err"; }; @@ -189,16 +190,16 @@ public void render(HudRenderer renderer) { private ItemStack getItem(EquipmentSlot slot) { if (isInEditor()) { - return switch (slot.getEntitySlotId()) { - case 3 -> Items.NETHERITE_HELMET.getDefaultStack(); - case 2 -> Items.NETHERITE_CHESTPLATE.getDefaultStack(); - case 1 -> Items.NETHERITE_LEGGINGS.getDefaultStack(); - default -> Items.NETHERITE_BOOTS.getDefaultStack(); + return switch (slot.getIndex()) { + case 3 -> Items.NETHERITE_HELMET.getDefaultInstance(); + case 2 -> Items.NETHERITE_CHESTPLATE.getDefaultInstance(); + case 1 -> Items.NETHERITE_LEGGINGS.getDefaultInstance(); + default -> Items.NETHERITE_BOOTS.getDefaultInstance(); }; } - ItemStack stack = mc.player.getEquippedStack(slot); - return stack.isEmpty() && showEmpty.get() ? Items.BARRIER.getDefaultStack() : stack; + ItemStack stack = mc.player.getItemBySlot(slot); + return stack.isEmpty() && showEmpty.get() ? Items.BARRIER.getDefaultInstance() : stack; } private float getScale() { 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 2e2ffd1a42..756deeb51b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CombatHud.java @@ -25,19 +25,19 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.component.type.ItemEnchantmentsComponent; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BedItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.registry.tag.EnchantmentTags; -import net.minecraft.registry.tag.ItemTags; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.EnchantmentTags; +import net.minecraft.tags.ItemTags; +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; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.ItemEnchantments; import org.joml.Matrix4fStack; import java.util.ArrayList; @@ -96,7 +96,7 @@ public class CombatHud extends HudElement { // Enchantments - private final Setting>> displayedEnchantments = sgEnchantments.add(new EnchantmentListSetting.Builder() + private final Setting>> displayedEnchantments = sgEnchantments.add(new EnchantmentListSetting.Builder() .name("displayed-enchantments") .description("The enchantments that are shown on nametags.") .vanillaDefaults() @@ -214,7 +214,7 @@ public class CombatHud extends HudElement { .build() ); - private PlayerEntity playerEntity; + private Player playerEntity; public CombatHud() { super(INFO); @@ -263,8 +263,8 @@ public void render(HudRenderer renderer) { (int) (y + 10 * getScale()), (int) (50 * getScale()), (int) (60 * getScale()), - -MathHelper.wrapDegrees(playerEntity.lastYaw + (playerEntity.getYaw() - playerEntity.lastYaw) * mc.getRenderTickCounter().getTickProgress(true)), - -playerEntity.getPitch() + -Mth.wrapDegrees(playerEntity.yRotO + (playerEntity.getYRot() - playerEntity.yRotO) * mc.getDeltaTracker().getGameTimeDeltaPartialTick(true)), + -playerEntity.getXRot() ); // Moving pos to past player model @@ -323,7 +323,7 @@ public void render(HudRenderer renderer) { for (int position = 5; position >= 0; position--) { ItemStack itemStack = getItem(position); - if (itemStack.isIn(ItemTags.SWORDS) + if (itemStack.is(ItemTags.SWORDS) || itemStack.getItem() == Items.END_CRYSTAL || itemStack.getItem() == Items.RESPAWN_ANCHOR || itemStack.getItem() instanceof BedItem) threat = true; @@ -388,20 +388,20 @@ public void render(HudRenderer renderer) { armorY = (y / getScale()) + 18; - ItemEnchantmentsComponent enchantments = EnchantmentHelper.getEnchantments(itemStack); - List>> enchantmentsToShow = new ArrayList<>(); + ItemEnchantments enchantments = EnchantmentHelper.getEnchantmentsForCrafting(itemStack); + List>> enchantmentsToShow = new ArrayList<>(); - for (Object2IntMap.Entry> entry : enchantments.getEnchantmentEntries()) { - if (entry.getKey().matches(displayedEnchantments.get()::contains)) { + for (Object2IntMap.Entry> entry : enchantments.entrySet()) { + if (entry.getKey().is(displayedEnchantments.get()::contains)) { enchantmentsToShow.add(new ObjectIntImmutablePair<>(entry.getKey(), entry.getIntValue())); } } - for (ObjectIntPair> entry : enchantmentsToShow) { + for (ObjectIntPair> entry : enchantmentsToShow) { String enchantName = Utils.getEnchantSimpleName(entry.left(), 3) + " " + entry.rightInt(); double enchX = (((x / getScale()) + position * 20) + 8) - (TextRenderer.get().getWidth(enchantName) / 2); - TextRenderer.get().render(enchantName, enchX, armorY, entry.left().isIn(EnchantmentTags.CURSE) ? RED : enchantmentTextColor.get()); + TextRenderer.get().render(enchantName, enchX, armorY, entry.left().is(EnchantmentTags.CURSE) ? RED : enchantmentTextColor.get()); armorY += TextRenderer.get().getHeight(); } slot--; @@ -455,12 +455,12 @@ public void render(HudRenderer renderer) { private ItemStack getItem(int i) { if (isInEditor()) { return switch (i) { - case 0 -> Items.NETHERITE_BOOTS.getDefaultStack(); - case 1 -> Items.NETHERITE_LEGGINGS.getDefaultStack(); - case 2 -> Items.NETHERITE_CHESTPLATE.getDefaultStack(); - case 3 -> Items.NETHERITE_HELMET.getDefaultStack(); - case 4 -> Items.TOTEM_OF_UNDYING.getDefaultStack(); - case 5 -> Items.END_CRYSTAL.getDefaultStack(); + case 0 -> Items.NETHERITE_BOOTS.getDefaultInstance(); + case 1 -> Items.NETHERITE_LEGGINGS.getDefaultInstance(); + case 2 -> Items.NETHERITE_CHESTPLATE.getDefaultInstance(); + case 3 -> Items.NETHERITE_HELMET.getDefaultInstance(); + case 4 -> Items.TOTEM_OF_UNDYING.getDefaultInstance(); + case 5 -> Items.END_CRYSTAL.getDefaultInstance(); default -> ItemStack.EMPTY; }; } @@ -468,12 +468,12 @@ private ItemStack getItem(int i) { if (playerEntity == null) return ItemStack.EMPTY; return switch (i) { - case 5 -> playerEntity.getMainHandStack(); - case 4 -> playerEntity.getOffHandStack(); - case 3 -> playerEntity.getEquippedStack(EquipmentSlot.HEAD); - case 2 -> playerEntity.getEquippedStack(EquipmentSlot.CHEST); - case 1 -> playerEntity.getEquippedStack(EquipmentSlot.LEGS); - case 0 -> playerEntity.getEquippedStack(EquipmentSlot.FEET); + case 5 -> playerEntity.getMainHandItem(); + case 4 -> playerEntity.getOffhandItem(); + case 3 -> playerEntity.getItemBySlot(EquipmentSlot.HEAD); + case 2 -> playerEntity.getItemBySlot(EquipmentSlot.CHEST); + case 1 -> playerEntity.getItemBySlot(EquipmentSlot.LEGS); + case 0 -> playerEntity.getItemBySlot(EquipmentSlot.FEET); default -> ItemStack.EMPTY; }; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java index 684847d67c..f49c494228 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/CompassHud.java @@ -11,7 +11,7 @@ import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -115,10 +115,10 @@ public void render(HudRenderer renderer) { double x = this.x + (getWidth() / 2.0); double y = this.y + (getHeight() / 2.0); - double pitch = isInEditor() ? 120 : MathHelper.clamp(mc.player.getPitch() + 30, -90, 90); + double pitch = isInEditor() ? 120 : Mth.clamp(mc.player.getXRot() + 30, -90, 90); pitch = Math.toRadians(pitch); - double yaw = isInEditor() ? 180 : MathHelper.wrapDegrees(mc.player.getYaw()); + double yaw = isInEditor() ? 180 : Mth.wrapDegrees(mc.player.getYRot()); yaw = Math.toRadians(yaw); for (Direction direction : Direction.values()) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java index da963f4230..5460a67357 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/HoleHud.java @@ -5,7 +5,7 @@ package meteordevelopment.meteorclient.systems.hud.elements; -import meteordevelopment.meteorclient.mixin.WorldRendererAccessor; +import meteordevelopment.meteorclient.mixin.LevelRendererAccessor; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElement; @@ -13,10 +13,10 @@ import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import java.util.List; @@ -105,20 +105,20 @@ public void render(HudRenderer renderer) { private Direction get(Facing dir) { if (isInEditor()) return Direction.DOWN; - return Direction.fromHorizontalDegrees(MathHelper.wrapDegrees(mc.player.getYaw() + dir.offset)); + return Direction.fromYRot(Mth.wrapDegrees(mc.player.getYRot() + dir.offset)); } private void drawBlock(HudRenderer renderer, Direction dir, double x, double y) { - Block block = dir == Direction.DOWN ? Blocks.OBSIDIAN : mc.world.getBlockState(mc.player.getBlockPos().offset(dir)).getBlock(); + Block block = dir == Direction.DOWN ? Blocks.OBSIDIAN : mc.level.getBlockState(mc.player.blockPosition().relative(dir)).getBlock(); if (!safe.get().contains(block)) return; - renderer.item(block.asItem().getDefaultStack(), (int) x, (int) y, getScale(), false); + renderer.item(block.asItem().getDefaultInstance(), (int) x, (int) y, getScale(), false); if (dir == Direction.DOWN) return; - ((WorldRendererAccessor) mc.worldRenderer).meteor$getBlockBreakingInfos().values().forEach(info -> { - if (info.getPos().equals(mc.player.getBlockPos().offset(dir))) { - renderBreaking(renderer, x, y, info.getStage() / 9f); + ((LevelRendererAccessor) mc.levelRenderer).meteor$getDestroyingBlocks().values().forEach(info -> { + if (info.getPos().equals(mc.player.blockPosition().relative(dir))) { + renderBreaking(renderer, x, y, info.getProgress() / 9f); } }); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java index c3fa452e10..6a06c04b64 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/InventoryHud.java @@ -14,9 +14,9 @@ import meteordevelopment.meteorclient.utils.Utils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -103,7 +103,7 @@ public void render(HudRenderer renderer) { for (int row = 0; row < 3; row++) { for (int i = 0; i < 9; i++) { int index = row * 9 + i; - ItemStack stack = hasContainer ? containerItems[index] : mc.player.getInventory().getStack(index + 9); + ItemStack stack = hasContainer ? containerItems[index] : mc.player.getInventory().getItem(index + 9); if (stack == null) continue; int itemX = background.get() == Background.Texture ? (int) (x + (8 + i * 18) * getScale()) : (int) (x + (1 + i * 18) * getScale()); @@ -124,7 +124,8 @@ private void drawBackground(HudRenderer renderer, int x, int y, Color color) { int h = getHeight(); switch (background.get()) { - case Texture, Outline -> renderer.texture(background.get() == Background.Texture ? TEXTURE : TEXTURE_TRANSPARENT, x, y, w, h, color); + case Texture, Outline -> + renderer.texture(background.get() == Background.Texture ? TEXTURE : TEXTURE_TRANSPARENT, x, y, w, h, color); case Flat -> renderer.quad(x, y, w, h, color); } } @@ -132,10 +133,10 @@ private void drawBackground(HudRenderer renderer, int x, int y, Color color) { private ItemStack getContainer() { if (isInEditor() || mc.player == null) return null; - ItemStack stack = mc.player.getOffHandStack(); + ItemStack stack = mc.player.getOffhandItem(); if (Utils.hasItems(stack) || stack.getItem() == Items.ENDER_CHEST) return stack; - stack = mc.player.getMainHandStack(); + stack = mc.player.getMainHandItem(); if (Utils.hasItems(stack) || stack.getItem() == Items.ENDER_CHEST) return stack; return null; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java index 975d8da941..88e146ae57 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/ItemHud.java @@ -13,9 +13,9 @@ import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; public class ItemHud extends HudElement { public static final HudElementInfo INFO = new HudElementInfo<>(Hud.GROUP, "item", "Displays the item count.", ItemHud::new); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java index 8c997a2f6c..c37189e6ea 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/MapHud.java @@ -15,12 +15,12 @@ import meteordevelopment.meteorclient.utils.player.FindItemResult; import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.render.MapRenderState; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.MapIdComponent; -import net.minecraft.item.FilledMapItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.map.MapState; +import net.minecraft.client.renderer.state.MapRenderState; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.level.saveddata.maps.MapId; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.jetbrains.annotations.Nullable; import org.joml.Matrix3x2fStack; @@ -86,8 +86,8 @@ public class MapHud extends HudElement { ); private final MapRenderState renderState = new MapRenderState(); - private @Nullable MapIdComponent mapComponent; - private @Nullable MapState mapState; + private @Nullable MapId mapComponent; + private @Nullable MapItemSavedData mapState; public MapHud() { super(INFO); @@ -104,29 +104,29 @@ public void tick(HudRenderer renderer) { ItemStack mapStack = ItemStack.EMPTY; switch (mode.get()) { - case SlotIndex -> mapStack = mc.player.getInventory().getStack(slotIndex.get()); + case SlotIndex -> mapStack = mc.player.getInventory().getItem(slotIndex.get()); case MapId -> { FindItemResult mapResult = InvUtils.find(stack -> { - MapIdComponent mapIdComponent = stack.get(DataComponentTypes.MAP_ID); + MapId mapIdComponent = stack.get(DataComponents.MAP_ID); return mapIdComponent != null && mapIdComponent.id() == mapId.get(); }); - if (mapResult.found()) mapStack = mc.player.getInventory().getStack(mapResult.slot()); + if (mapResult.found()) mapStack = mc.player.getInventory().getItem(mapResult.slot()); } case Simple -> { FindItemResult mapResult = InvUtils.find(stack -> { - MapIdComponent mapIdComponent = stack.get(DataComponentTypes.MAP_ID); + MapId mapIdComponent = stack.get(DataComponents.MAP_ID); return mapIdComponent != null; }); - if (mapResult.found()) mapStack = mc.player.getInventory().getStack(mapResult.slot()); + if (mapResult.found()) mapStack = mc.player.getInventory().getItem(mapResult.slot()); } } - if (mapStack.isEmpty() || !mapStack.contains(DataComponentTypes.MAP_ID)) { + if (mapStack.isEmpty() || !mapStack.has(DataComponents.MAP_ID)) { mapComponent = null; mapState = null; } else { - mapComponent = mapStack.get(DataComponentTypes.MAP_ID); - mapState = FilledMapItem.getMapState(mapComponent, mc.world); + mapComponent = mapStack.get(DataComponents.MAP_ID); + mapState = MapItem.getSavedData(mapComponent, mc.level); } } @@ -147,14 +147,14 @@ public void render(HudRenderer renderer) { } renderer.post(() -> { - mc.getMapRenderer().update(mapComponent, mapState, renderState); + mc.getMapRenderer().extractRenderState(mapComponent, mapState, renderState); - Matrix3x2fStack matrices = renderer.drawContext.getMatrices(); + Matrix3x2fStack matrices = renderer.graphics.pose(); matrices.pushMatrix(); - matrices.scale(1f / mc.getWindow().getScaleFactor()); + matrices.scale(1f / mc.getWindow().getGuiScale()); matrices.translate(this.x, this.y); matrices.scale(scale.get().floatValue()); - renderer.drawContext.drawMap(renderState); + renderer.graphics.map(renderState); matrices.popMatrix(); }); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java index 73814d21d9..fcbe3dbfa9 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerModelHud.java @@ -12,8 +12,8 @@ import meteordevelopment.meteorclient.systems.hud.HudRenderer; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -113,20 +113,19 @@ public PlayerModelHud() { @Override public void render(HudRenderer renderer) { renderer.post(() -> { - PlayerEntity player = mc.player; + Player player = mc.player; if (player == null) return; float offsetYaw = centerOrientation.get() == CenterOrientation.North ? 180 : 0; - float yaw = copyYaw.get() ? MathHelper.wrapDegrees(player.lastYaw + (player.getYaw() - player.lastYaw) * mc.getRenderTickCounter().getTickProgress(true) + offsetYaw) : (float) customYaw.get(); - float pitch = copyPitch.get() ? player.getPitch() : (float) customPitch.get(); + float yaw = copyYaw.get() ? Mth.wrapDegrees(player.yRotO + (player.getYRot() - player.yRotO) * mc.getDeltaTracker().getGameTimeDeltaPartialTick(true) + offsetYaw) : (float) customYaw.get(); + float pitch = copyPitch.get() ? player.getXRot() : (float) customPitch.get(); renderer.entity(player, x, y, getWidth(), getHeight(), -yaw, -pitch); }); if (background.get()) { renderer.quad(x, y, getWidth(), getHeight(), backgroundColor.get()); - } - else if (mc.player == null) { + } else if (mc.player == null) { renderer.quad(x, y, getWidth(), getHeight(), backgroundColor.get()); renderer.line(x, y, x + getWidth(), y + getHeight(), Color.GRAY); renderer.line(x + getWidth(), y, x, y + getHeight(), Color.GRAY); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java index c2908620f3..06d791dbc6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PlayerRadarHud.java @@ -11,8 +11,7 @@ import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.player.AbstractClientPlayer; import java.util.ArrayList; import java.util.Comparator; @@ -123,7 +122,7 @@ public class PlayerRadarHud extends HudElement { .build() ); - private final List players = new ArrayList<>(); + private final List players = new ArrayList<>(); public PlayerRadarHud() { super(INFO); @@ -144,12 +143,12 @@ public void tick(HudRenderer renderer) { double width = renderer.textWidth("Players:", shadow.get(), getScale()); double height = renderer.textHeight(shadow.get(), getScale()); - if (mc.world == null) { + if (mc.level == null) { setSize(width, height); return; } - for (PlayerEntity entity : getPlayers()) { + for (AbstractClientPlayer entity : getPlayers()) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; @@ -173,10 +172,10 @@ public void render(HudRenderer renderer) { renderer.text("Players:", x + border.get() + alignX(renderer.textWidth("Players:", shadow.get(), getScale()), alignment.get()), y, secondaryColor.get(), shadow.get(), getScale()); - if (mc.world == null) return; + if (mc.level == null) return; double spaceWidth = renderer.textWidth(" ", shadow.get(), getScale()); - for (PlayerEntity entity : getPlayers()) { + for (AbstractClientPlayer entity : getPlayers()) { if (entity.equals(mc.player)) continue; if (!friends.get() && Friends.get().isFriend(entity)) continue; @@ -196,15 +195,16 @@ public void render(HudRenderer renderer) { y += renderer.textHeight(shadow.get(), getScale()) + 2; x = renderer.text(text, x, y, color, shadow.get()); - if (distance.get()) renderer.text(distanceText, x + spaceWidth, y, secondaryColor.get(), shadow.get(), getScale()); + if (distance.get()) + renderer.text(distanceText, x + spaceWidth, y, secondaryColor.get(), shadow.get(), getScale()); } } - private List getPlayers() { + private List getPlayers() { players.clear(); - players.addAll(mc.world.getPlayers()); + players.addAll(mc.level.players()); if (players.size() > limit.get()) players.subList(limit.get() - 1, players.size() - 1).clear(); - players.sort(Comparator.comparingDouble(e -> e.squaredDistanceTo(mc.getCameraEntity()))); + players.sort(Comparator.comparingDouble(e -> e.distanceToSqr(mc.getCameraEntity()))); return players; } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java index 33101ee694..47d5d320f8 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/PotionTimersHud.java @@ -12,9 +12,9 @@ import meteordevelopment.meteorclient.utils.misc.Names; import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffectUtil; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffectUtil; import java.util.ArrayList; import java.util.List; @@ -30,7 +30,7 @@ public class PotionTimersHud extends HudElement { // General - private final Setting> hiddenEffects = sgGeneral.add(new StatusEffectListSetting.Builder() + private final Setting> hiddenEffects = sgGeneral.add(new StatusEffectListSetting.Builder() .name("hidden-effects") .description("Which effects not to show in the list.") .build() @@ -155,7 +155,7 @@ public class PotionTimersHud extends HudElement { .build() ); - private final List> texts = new ArrayList<>(); + private final List> texts = new ArrayList<>(); private double rainbowHue; public PotionTimersHud() { @@ -184,8 +184,8 @@ public void tick(HudRenderer renderer) { texts.clear(); - for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { - if (hiddenEffects.get().contains(statusEffectInstance.getEffectType().value())) continue; + for (MobEffectInstance statusEffectInstance : mc.player.getActiveEffects()) { + if (hiddenEffects.get().contains(statusEffectInstance.getEffect().value())) continue; if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; String text = getString(statusEffectInstance); texts.add(new ObjectObjectImmutablePair<>(statusEffectInstance, text)); @@ -216,10 +216,10 @@ public void render(HudRenderer renderer) { double localRainbowHue = rainbowHue; - for (Pair potionEffectEntry : texts) { + for (Pair potionEffectEntry : texts) { Color color = switch (colorMode.get()) { case Effect -> { - int c = potionEffectEntry.left().getEffectType().value().getColor(); + int c = potionEffectEntry.left().getEffect().value().getColor(); yield new Color(c).a(255); } case Flat -> { @@ -240,8 +240,8 @@ public void render(HudRenderer renderer) { } } - private String getString(StatusEffectInstance statusEffectInstance) { - return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffectType().value()), statusEffectInstance.getAmplifier() + 1, StatusEffectUtil.getDurationText(statusEffectInstance, 1, mc.world.getTickManager().getTickRate()).getString()); + private String getString(MobEffectInstance statusEffectInstance) { + return String.format("%s %d (%s)", Names.get(statusEffectInstance.getEffect().value()), statusEffectInstance.getAmplifier() + 1, MobEffectUtil.formatDuration(statusEffectInstance, 1, mc.level.tickRateManager().tickrate()).getString()); } private double getScale() { @@ -249,8 +249,8 @@ private double getScale() { } private boolean hasNoVisibleEffects() { - for (StatusEffectInstance statusEffectInstance : mc.player.getStatusEffects()) { - if (hiddenEffects.get().contains(statusEffectInstance.getEffectType().value())) continue; + for (MobEffectInstance statusEffectInstance : mc.player.getActiveEffects()) { + if (hiddenEffects.get().contains(statusEffectInstance.getEffect().value())) continue; if (!showAmbient.get() && statusEffectInstance.isAmbient()) continue; return false; } 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 ce411d72ab..38f0b884a2 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 @@ -5,11 +5,12 @@ package meteordevelopment.meteorclient.systems.hud.elements.keyboard; +import com.mojang.blaze3d.platform.InputConstants; import it.unimi.dsi.fastutil.longs.LongArrayList; import it.unimi.dsi.fastutil.longs.LongList; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import meteordevelopment.meteorclient.MeteorClient; -import meteordevelopment.meteorclient.events.meteor.KeyEvent; +import meteordevelopment.meteorclient.events.meteor.KeyInputEvent; import meteordevelopment.meteorclient.events.meteor.MouseClickEvent; import meteordevelopment.meteorclient.gui.GuiTheme; import meteordevelopment.meteorclient.gui.WidgetScreen; @@ -18,7 +19,7 @@ import meteordevelopment.meteorclient.gui.widgets.containers.WTable; import meteordevelopment.meteorclient.gui.widgets.pressable.WButton; import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; -import meteordevelopment.meteorclient.mixin.KeyBindingAccessor; +import meteordevelopment.meteorclient.mixin.KeyMappingAccessor; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElement; @@ -31,13 +32,12 @@ import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.util.Mth; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; @@ -222,7 +222,7 @@ private Color getKeyColor(Key key, SettingColor out) { boolean pressed = key.isPressed; float target = pressed ? 1 : 0; - float tickDelta = MinecraftClient.getInstance().getRenderTickCounter().getDynamicDeltaTicks(); + float tickDelta = Minecraft.getInstance().getDeltaTracker().getGameTimeDeltaTicks(); float frameDelta = (float) (tickDelta / 20 / fadeTime.get()) * (pressed ? 1 : -1); key.delta = Math.clamp(key.delta + frameDelta, 0, 1); @@ -239,15 +239,15 @@ private Color getKeyColor(Key key, SettingColor out) { java.awt.Color.RGBtoHSB(c2.r, c2.g, c2.b, hsb1); int rgb = java.awt.Color.HSBtoRGB( - MathHelper.lerp(key.delta, hsb1[0], hsb2[0]), - MathHelper.lerp(key.delta, hsb1[1], hsb2[1]), - MathHelper.lerp(key.delta, hsb1[2], hsb2[2]) + Mth.lerp(key.delta, hsb1[0], hsb2[0]), + Mth.lerp(key.delta, hsb1[1], hsb2[1]), + Mth.lerp(key.delta, hsb1[2], hsb2[2]) ); out.r = Color.toRGBAR(rgb); out.g = Color.toRGBAG(rgb); out.b = Color.toRGBAB(rgb); - out.a = MathHelper.lerp(key.delta, pressedColor.get().a, unpressedColor.get().a); + out.a = Mth.lerpInt(key.delta, pressedColor.get().a, unpressedColor.get().a); } } else { out.set(key.isPressed ? pressedColor.get() : unpressedColor.get()); @@ -258,7 +258,7 @@ private Color getKeyColor(Key key, SettingColor out) { } @EventHandler(priority = EventPriority.HIGH) - private void onKey(KeyEvent event) { + private void onKey(KeyInputEvent event) { for (Key key : keys) { if (key.matches(event.input.key(), event.input.scancode(), true)) { key.update(event.action); @@ -293,25 +293,25 @@ private void onPresetChanged(Preset preset) { switch (preset) { case Movement -> { - keys.add(l.key(mc.options.forwardKey, l.ux(1), 0).setShowCps(showCps.get())); - keys.add(l.key(mc.options.leftKey, 0, l.y(1)).setShowCps(showCps.get())); - keys.add(l.key(mc.options.backKey, l.ux(1), l.y(1)).setShowCps(showCps.get())); - keys.add(l.key(mc.options.rightKey, l.ux(2), l.y(1)).setShowCps(showCps.get())); - keys.add(l.key(mc.options.sneakKey, 0, l.y(2)).setShowCps(showCps.get())); - keys.add(l.key(mc.options.jumpKey, l.ux(1), l.y(2), KeyDimensions.UNIT_2U).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyUp, l.ux(1), 0).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyLeft, 0, l.y(1)).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyDown, l.ux(1), l.y(1)).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyRight, l.ux(2), l.y(1)).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyShift, 0, l.y(2)).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyJump, l.ux(1), l.y(2), KeyDimensions.UNIT_2U).setShowCps(showCps.get())); } case Clicks -> { - keys.add(l.key(mc.options.attackKey, "LMB", 0, 0).setShowCps(showCps.get())); - keys.add(l.key(mc.options.useKey, "RMB", l.ux(1), 0).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyAttack, "LMB", 0, 0).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyUse, "RMB", l.ux(1), 0).setShowCps(showCps.get())); } case Actions -> { - keys.add(l.key(mc.options.dropKey, 0, 0).setShowCps(showCps.get())); - keys.add(l.key(mc.options.swapHandsKey, l.ux(1), 0).setShowCps(showCps.get())); - keys.add(l.key(mc.options.inventoryKey, l.ux(2), 0).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyDrop, 0, 0).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keySwapOffhand, l.ux(1), 0).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyInventory, l.ux(2), 0).setShowCps(showCps.get())); } case Hotbar -> { for (int i = 0; i < 9; i++) { - keys.add(l.key(mc.options.hotbarKeys[i], l.ux(i), 0).setShowCps(showCps.get())); + keys.add(l.key(mc.options.keyHotbarSlots[i], l.ux(i), 0).setShowCps(showCps.get())); } } case Keyboard -> { @@ -566,10 +566,10 @@ public void render(HudRenderer renderer) { double s = scale.get(); // because of a meteor bug, the modules search field swallows inputs - InputUtil.Key guiKey = ((KeyBindingAccessor) KeyBinds.OPEN_GUI).meteor$getKey(); + InputConstants.Key guiKey = ((KeyMappingAccessor) KeyBinds.OPEN_GUI).meteor$getKey(); for (Key key : keys) { - if (key.matches(guiKey.getCode(), guiKey.getCode(), guiKey.getCategory() != InputUtil.Type.MOUSE)) { + if (key.matches(guiKey.getValue(), guiKey.getValue(), guiKey.getType() != InputConstants.Type.MOUSE)) { if (key.isPressed != key.isNativelyPressed()) { key.update(key.isPressed ? KeyAction.Release : KeyAction.Press); } @@ -657,7 +657,7 @@ public enum KeyboardLayout { public static class Key { public String name = ""; - public KeyBinding binding; + public KeyMapping binding; public Keybind keybind; public double x, y, width, height; public boolean showCps = false; @@ -672,17 +672,17 @@ public Key() { this.height = 40; } - public Key(NbtCompound compound) { + public Key(CompoundTag compound) { this.keybind = Keybind.none().fromTag(compound.getCompoundOrEmpty("key")); - this.name = compound.getString("name", ""); - this.x = compound.getDouble("x", 0); - this.y = compound.getDouble("y", 0); - this.width = compound.getDouble("width", 60); - this.height = compound.getDouble("height", 60); - this.showCps = compound.getBoolean("showCps", false); + this.name = compound.getStringOr("name", ""); + this.x = compound.getDoubleOr("x", 0); + this.y = compound.getDoubleOr("y", 0); + this.width = compound.getDoubleOr("width", 60); + this.height = compound.getDoubleOr("height", 60); + this.showCps = compound.getBooleanOr("showCps", false); } - Key(KeyBinding binding, String name, double x, double y, double width, double height) { + Key(KeyMapping binding, String name, double x, double y, double width, double height) { this.binding = binding; this.name = name; this.x = x; @@ -708,7 +708,7 @@ public Key setShowCps(boolean show) { public String getName() { if (name != null && !name.isEmpty()) return name; if (keybind != null) return getShortName(keybind.toString()); - if (binding != null) return getShortName(binding.getBoundKeyLocalizedText().getString()); + if (binding != null) return getShortName(binding.getTranslatedKeyMessage().getString()); return "?"; } @@ -716,11 +716,11 @@ public boolean matches(int input, int scancode, boolean key) { if (keybind != null) { return keybind.isKey() == key && keybind.getValue() == input; } else { - InputUtil.Key inputKey = ((KeyBindingAccessor) binding).meteor$getKey(); - boolean isKey = inputKey.getCategory() != InputUtil.Type.MOUSE; - return isKey == key && inputKey.getCategory() == InputUtil.Type.SCANCODE - ? scancode == inputKey.getCode() - : input == inputKey.getCode(); + 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() + : input == inputKey.getValue(); } } @@ -736,14 +736,14 @@ public void update(KeyAction action) { } public boolean isNativelyPressed() { - long window = mc.getWindow().getHandle(); + 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; } else { - int key = ((KeyBindingAccessor) binding).meteor$getKey().getCode(); + 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; @@ -754,8 +754,8 @@ public int getCps() { return rollingCps.get(); } - public NbtCompound serialize() { - NbtCompound compound = new NbtCompound(); + public CompoundTag serialize() { + CompoundTag compound = new CompoundTag(); compound.put("key", keybind.toTag()); compound.putString("name", name); compound.putDouble("x", x); @@ -873,8 +873,8 @@ protected boolean isValueValid(List value) { } @Override - protected NbtCompound save(NbtCompound tag) { - NbtList valueTag = new NbtList(); + protected CompoundTag save(CompoundTag tag) { + ListTag valueTag = new ListTag(); for (Key key : get()) { valueTag.add(key.serialize()); } @@ -884,11 +884,11 @@ protected NbtCompound save(NbtCompound tag) { } @Override - protected List load(NbtCompound tag) { + protected List load(CompoundTag tag) { get().clear(); - for (NbtElement tagI : tag.getListOrEmpty("value")) { - tagI.asCompound().ifPresent(nbtCompound -> get().add(new Key(nbtCompound))); + for (Tag tagI : tag.getListOrEmpty("value")) { + tagI.asCompound().ifPresent(CompoundTag -> get().add(new Key(CompoundTag))); } return get(); @@ -1017,7 +1017,7 @@ public static void fillTable(GuiTheme theme, WTable table, CustomKeyListSetting WButton edit = table.add(theme.button(GuiRenderer.EDIT)).expandCellX().widget(); edit.action = () -> { - WidgetScreen screen = (WidgetScreen) mc.currentScreen; + WidgetScreen screen = (WidgetScreen) mc.screen; mc.setScreen(new CustomKeySettingScreen(theme, setting, key, screen)); }; diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/LayoutContext.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/LayoutContext.java index 256388f06a..719d6380ca 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/LayoutContext.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/elements/keyboard/LayoutContext.java @@ -7,7 +7,7 @@ import meteordevelopment.meteorclient.systems.hud.elements.keyboard.KeyboardHud.Key; import meteordevelopment.meteorclient.utils.misc.Keybind; -import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.KeyMapping; final class LayoutContext { final double keyUnit; @@ -96,21 +96,21 @@ Key keyNamed(Keybind kb, String name, double x, double y, KeyDimensions w) { /** * Creates a standard 1u*1u key at the given position. */ - Key key(KeyBinding kb, double x, double y) { + Key key(KeyMapping kb, double x, double y) { return new Key(kb, null, x, y, px(KeyDimensions.STANDARD), px(KeyDimensions.STANDARD)); } /** * Creates a key with the given width and standard height. */ - Key key(KeyBinding kb, double x, double y, KeyDimensions w) { + Key key(KeyMapping kb, double x, double y, KeyDimensions w) { return new Key(kb, null, x, y, px(w), px(KeyDimensions.STANDARD)); } /** * Creates a named key with the given width and standard height. */ - Key key(KeyBinding kb, String name, double x, double y) { + Key key(KeyMapping kb, String name, double x, double y) { return new Key(kb, name, x, y, px(KeyDimensions.STANDARD), px(KeyDimensions.STANDARD)); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java index a837b8d9fd..92d4e2c5c7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/AddHudElementScreen.java @@ -17,7 +17,7 @@ import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.systems.hud.HudGroup; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.GuiGraphicsExtractor; import java.util.ArrayList; import java.util.HashMap; @@ -63,10 +63,11 @@ public void initWidgets() { if (info.hasPresets() && !searchBar.get().isEmpty()) { for (HudElementInfo.Preset preset : info.presets) { String title = info.title + " - " + preset.title; - if (Utils.searchTextDefault(title, searchBar.get(), false)) grouped.computeIfAbsent(info.group, hudGroup -> new ArrayList<>()).add(new Item(title, info.description, preset)); + if (Utils.searchTextDefault(title, searchBar.get(), false)) + grouped.computeIfAbsent(info.group, hudGroup -> new ArrayList<>()).add(new Item(title, info.description, preset)); } - } - else if (Utils.searchTextDefault(info.title, searchBar.get(), false)) grouped.computeIfAbsent(info.group, hudGroup -> new ArrayList<>()).add(new Item(info.title, info.description, info)); + } else if (Utils.searchTextDefault(info.title, searchBar.get(), false)) + grouped.computeIfAbsent(info.group, hudGroup -> new ArrayList<>()).add(new Item(info.title, info.description, info)); } // Create widgets @@ -84,15 +85,13 @@ public void initWidgets() { add.action = () -> runObject(preset); if (firstObject == null) firstObject = preset; - } - else { + } else { HudElementInfo info = (HudElementInfo) item.object; if (info.hasPresets()) { WButton open = l.add(theme.button(" > ")).expandCellX().right().widget(); open.action = () -> runObject(info); - } - else { + } else { WPlus add = l.add(theme.plus()).expandCellX().right().widget(); add.action = () -> runObject(info); } @@ -107,9 +106,8 @@ private void runObject(Object object) { if (object == null) return; if (object instanceof HudElementInfo.Preset preset) { Hud.get().add(preset, x, y); - close(); - } - else { + onClose(); + } else { HudElementInfo info = (HudElementInfo) object; if (info.hasPresets()) { @@ -117,18 +115,18 @@ private void runObject(Object object) { screen.parent = parent; mc.setScreen(screen); - } - else { + } else { Hud.get().add(info, x, y); - close(); + onClose(); } } } @Override - protected void onRenderBefore(DrawContext drawContext, float delta) { - HudEditorScreen.renderElements(drawContext); + protected void onRenderBefore(GuiGraphicsExtractor graphics, float delta) { + HudEditorScreen.renderElements(graphics); } - private record Item(String title, String description, Object object) {} + private record Item(String title, String description, Object object) { + } } 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 d43f09fab3..06eb834dc6 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudEditorScreen.java @@ -16,11 +16,11 @@ import meteordevelopment.meteorclient.utils.misc.input.Input; import meteordevelopment.meteorclient.utils.other.Snapper; import meteordevelopment.meteorclient.utils.render.color.Color; -import net.minecraft.client.gui.Click; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.input.KeyInput; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.util.Mth; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; @@ -64,11 +64,12 @@ public HudEditorScreen(GuiTheme theme) { } @Override - public void initWidgets() {} + public void initWidgets() { + } @Override - public boolean mouseClicked(Click click, boolean doubled) { - double s = mc.getWindow().getScaleFactor(); + public boolean mouseClicked(MouseButtonEvent click, boolean doubled) { + double s = mc.getWindow().getGuiScale(); double mouseX = click.x(); double mouseY = click.y(); @@ -88,8 +89,7 @@ public boolean mouseClicked(Click click, boolean doubled) { selection.add(hovered); addedHoveredToSelectionWhenClickedElement = hovered; } - } - else selection.clear(); + } else selection.clear(); clickX = (int) mouseX; clickY = (int) mouseY; @@ -100,7 +100,7 @@ public boolean mouseClicked(Click click, boolean doubled) { @Override public void mouseMoved(double mouseX, double mouseY) { - double s = mc.getWindow().getScaleFactor(); + double s = mc.getWindow().getGuiScale(); mouseX *= s; mouseY *= s; @@ -117,8 +117,8 @@ public void mouseMoved(double mouseX, double mouseY) { } @Override - public boolean mouseReleased(Click click) { - double s = mc.getWindow().getScaleFactor(); + public boolean mouseReleased(MouseButtonEvent click) { + double s = mc.getWindow().getGuiScale(); double mouseX = click.x(); double mouseY = click.y(); @@ -134,14 +134,12 @@ public boolean mouseReleased(Click click) { } if (moved) { - if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT && !dragging) fillSelection((int) mouseX, (int)mouseY); - } - else { + if (click.button() == GLFW.GLFW_MOUSE_BUTTON_LEFT && !dragging) fillSelection((int) mouseX, (int) mouseY); + } else { if (click.button() == GLFW.GLFW_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() == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { HudElement hovered = getHovered((int) mouseX, (int) mouseY); if (hovered != null) mc.setScreen(new HudElementScreen(theme, hovered)); @@ -158,13 +156,12 @@ else if (click.button() == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { } @Override - public boolean keyPressed(KeyInput input) { + public boolean keyPressed(KeyEvent input) { if (!pressed) { if (input.key() == GLFW.GLFW_KEY_ENTER || input.key() == GLFW.GLFW_KEY_KP_ENTER) { HudElement hovered = getHovered(lastMouseX, lastMouseY); if (hovered != null) hovered.toggle(); - } - else if (input.key() == GLFW.GLFW_KEY_DELETE) { + } else if (input.key() == GLFW.GLFW_KEY_DELETE) { HudElement hovered = getHovered(lastMouseX, lastMouseY); if (hovered != null) hovered.remove(); @@ -263,7 +260,8 @@ private void onRender(int mouseX, int mouseY) { private HudElement getHovered(int mouseX, int mouseY) { for (HudElement element : hud) { - if (mouseX >= element.x && mouseX <= element.x + element.getWidth() && mouseY >= element.y && mouseY <= element.y + element.getHeight()) return element; + if (mouseX >= element.x && mouseX <= element.x + element.getWidth() && mouseY >= element.y && mouseY <= element.y + element.getHeight()) + return element; } return null; @@ -283,8 +281,8 @@ private void renderElement(HudElement element, Color bgColor, Color olColor) { } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - int s = mc.getWindow().getScaleFactor(); + public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { + int s = mc.getWindow().getGuiScale(); mouseX *= s; mouseY *= s; @@ -293,7 +291,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { boolean renderSplitLines = pressed && !selection.isEmpty() && moved; if (renderSplitLines || splitLinesAnimation > 0) renderSplitLines(renderSplitLines, delta / 20); - renderElements(context); + renderElements(graphics); Renderer2D.COLOR.begin(); onRender(mouseX, mouseY); @@ -303,19 +301,18 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { runAfterRenderTasks(); } - public static void renderElements(DrawContext drawContext) { + public static void renderElements(GuiGraphicsExtractor graphics) { Hud hud = Hud.get(); boolean inactiveOnly = Utils.canUpdate() && hud.active; - HudRenderer.INSTANCE.begin(drawContext); + HudRenderer.INSTANCE.begin(graphics); for (HudElement element : hud) { element.updatePos(); if (inactiveOnly) { if (!element.isActive()) element.render(HudRenderer.INSTANCE); - } - else element.render(HudRenderer.INSTANCE); + } else element.render(HudRenderer.INSTANCE); } HudRenderer.INSTANCE.end(); @@ -324,7 +321,7 @@ public static void renderElements(DrawContext drawContext) { private void renderSplitLines(boolean increment, double delta) { if (increment) splitLinesAnimation += delta * 6; else splitLinesAnimation -= delta * 6; - splitLinesAnimation = MathHelper.clamp(splitLinesAnimation, 0, 1); + splitLinesAnimation = Mth.clamp(splitLinesAnimation, 0, 1); Renderer2D renderer = Renderer2D.COLOR; renderer.begin(); @@ -365,7 +362,7 @@ private void renderSplitLine(Renderer2D renderer, double x, double y, double des } public static boolean isOpen() { - Screen s = mc.currentScreen; + Screen s = mc.screen; return s instanceof HudEditorScreen || s instanceof AddHudElementScreen || s instanceof HudElementPresetsScreen || s instanceof HudElementScreen || s instanceof HudTab.HudScreen; } @@ -434,8 +431,8 @@ public void move(int deltaX, int deltaY) { int lastY = y; int border = Hud.get().border.get(); - x = MathHelper.clamp(x + deltaX, border, Utils.getWindowWidth() - width - border); - y = MathHelper.clamp(y + deltaY, border, Utils.getWindowHeight() - height - border); + x = Mth.clamp(x + deltaX, border, Utils.getWindowWidth() - width - border); + y = Mth.clamp(y + deltaY, border, Utils.getWindowHeight() - height - border); for (HudElement element : selection) element.move(x - lastX, y - lastY); } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementPresetsScreen.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementPresetsScreen.java index b963e699ac..50dacd5ad2 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementPresetsScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementPresetsScreen.java @@ -13,7 +13,7 @@ import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudElementInfo; import meteordevelopment.meteorclient.utils.Utils; -import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.GuiGraphicsExtractor; import org.jetbrains.annotations.Nullable; public class HudElementPresetsScreen extends WindowScreen { @@ -40,7 +40,7 @@ public HudElementPresetsScreen(GuiTheme theme, HudElementInfo info, int x, in enterAction = () -> { if (firstPreset == null) return; Hud.get().add(firstPreset, x, y); - close(); + onClose(); }; } @@ -63,7 +63,7 @@ public void initWidgets() { WPlus add = l.add(theme.plus()).expandCellX().right().widget(); add.action = () -> { Hud.get().add(preset, x, y); - close(); + onClose(); }; if (firstPreset == null) firstPreset = preset; @@ -71,7 +71,7 @@ public void initWidgets() { } @Override - protected void onRenderBefore(DrawContext drawContext, float delta) { - HudEditorScreen.renderElements(drawContext); + protected void onRenderBefore(GuiGraphicsExtractor graphics, float delta) { + HudEditorScreen.renderElements(graphics); } } diff --git a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java index 387b729678..18034d84a0 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/hud/screens/HudElementScreen.java @@ -21,7 +21,7 @@ import meteordevelopment.meteorclient.systems.hud.XAnchor; import meteordevelopment.meteorclient.systems.hud.YAnchor; import meteordevelopment.meteorclient.utils.misc.NbtUtils; -import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.GuiGraphicsExtractor; import static meteordevelopment.meteorclient.utils.Utils.getWindowWidth; @@ -113,7 +113,7 @@ public void initWidgets() { WMinus remove = bottomList.add(theme.minus()).expandCellX().right().widget(); remove.action = () -> { element.remove(); - close(); + onClose(); }; } @@ -129,8 +129,8 @@ public void tick() { } @Override - protected void onRenderBefore(DrawContext drawContext, float delta) { - HudEditorScreen.renderElements(drawContext); + protected void onRenderBefore(GuiGraphicsExtractor graphics, float delta) { + HudEditorScreen.renderElements(graphics); } @Override diff --git a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java index d1e04fca43..fe610378ae 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/macros/Macro.java @@ -11,8 +11,8 @@ import meteordevelopment.meteorclient.utils.misc.Keybind; import meteordevelopment.meteorclient.utils.misc.MeteorStarscript; import meteordevelopment.meteorclient.utils.player.ChatUtils; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import org.meteordev.starscript.Script; import java.util.ArrayList; @@ -49,13 +49,15 @@ public class Macro implements ISerializable { private final List